# Signing keys (NEVER commit private keys)
AitherOS/config/keys/*.key
# TLS private keys -- provisioned at runtime, never tracked (w1b-19-01)
AitherOS/config/certs/*.key

# Build artifacts / scratch dumps (do not commit)
deep-research-agent.zip
all_routine_endpoints.json

# Temporary files created for debugging/fixes
TEMP_*
/_*
/_archive/
*.bak
.tmp-compose-resolved.yaml
compose.yaml.disabled

# Temporary files and debugging scripts
temp-*
*-temp.*
# ANCHORED (leading /): these were written for throwaway scripts at the repo
# root (Fix-Something.ps1, Demo-Thing.ps1). Unanchored they match at EVERY
# depth and case-insensitively on Windows — `Demo-*` silently swallowed
# AitherOS/dev/demo-assets/, real tracked source. Same class as D-975.
/Fix-*
/Demo-*
/AitherMuse/
!AitherOS/apps/AitherVeil/src/app/demo/
!AitherOS/apps/AitherVeil/src/app/demo/**
!AitherOS/apps/AitherVeil/src/app/demo-2/
!AitherOS/apps/AitherVeil/src/app/demo-2/**
!AitherOS/apps/AitherVeil/src/app/api/auth/demo-key/
!AitherOS/apps/AitherVeil/src/app/api/auth/demo-key/**
!AitherOS/apps/AitherVeil/src/app/admin/demo-keys/
!AitherOS/apps/AitherVeil/src/app/admin/demo-keys/**
!AitherOS/apps/AitherVeil/src/app/api/admin/demo-keys/
!AitherOS/apps/AitherVeil/src/app/api/admin/demo-keys/**
!AitherOS/apps/AitherVeil/src/lib/demo-keys.ts
!cloudflare/demo-fallback/
!cloudflare/demo-fallback/**
Test-*
# Exception: Critical CI test files
!tests/Test-LauncherFunctionality.ps1
!tests/Test-WindowsFeatures.ps1
!tests/Test-LinuxFeatures.ps1
!tests/Test-MacOSFeatures.ps1
# SOURCE TREES ARE NOT TEST OUTPUT (D-1342, 2026-07-26).
# `Test-` is a standard PowerShell VERB (Test-Path, Test-Connection), and
# `test-` is an ordinary source prefix — with core.ignorecase on Windows the
# broad rule above matched BOTH. It was silently untracking shipped code:
# AitherZero public functions (Test-AitherContainer, Test-InfrastructureIntent),
# a live Veil admin route (api/admin/setup/test-stripe) and two Veil components.
# They existed locally, so builds and tests passed here and the files were simply
# absent from every clone — the D-975 class, arriving via the ignore file.
# Scoped to src/ and hooks ONLY, so build artifacts (.next/, test-results/)
# stay ignored.
!.PRODUCTS/.AITHERZERO/src/**/Test-*
!.PRODUCTS/.AITHERZERO/src/**/test-*
!AitherOS/apps/AitherVeil/src/**/Test-*
!AitherOS/apps/AitherVeil/src/**/test-*
!.claude/hooks/Test-*
!.claude/hooks/test-*
# Test SUITES under a tests/ dir are source too, same D-1342 class: the
# unanchored `Test-*` above applies at EVERY depth, so a new self-test file
# is silently never tracked. A rule, not a fifth hand-listed exception.
!**/tests/Test-*.ps1
!**/tests/**/Test-*.ps1
*test.ps1
# AitherZero automation test-runner is real source, not an ad-hoc test script (owner 2026-07-08)
!.PRODUCTS/.AITHERZERO/library/automation-scripts/80-testing/0405_Run-PythonTest.ps1
*debug.ps1
cleanup-*
# Remove-* scratch files (but not AitherZero cmdlet source files)
Remove-*.sh
Remove-*.bat
Remove-*.cmd
Remove-*.txt

# Prevent duplicate nested directories
AitherOS/AitherOS/

# Log files
*.log
logs/
!docs/data/logs/


# Python cache
__pycache__/
*.pyc
*.pyo

# PowerShell cache
*.psm1_cache

# Backup files
*.bak
*.backup
backups/

# Test artifacts
test-output/
test-results/
AitherOS/MagicMock/

# Generated test reports
library/reports/*.json
!library/reports/dashboard.json
!library/reports/psscriptanalyzer-fast-results.json
library/reports/dashboard/*.html
tests/reports/*.json

# IDE files
# Allow workspace VS Code settings for Copilot integration
# .vscode/settings.json - Now tracked for team collaboration

# Private
*_private.py
*_private.txt
*_private.yaml
*_private.json
*.local.yaml
lockbox_policy.yaml
private_models.yaml

# Secrets — NEVER commit plaintext keys/tokens
secrets/
!AitherOS/apps/AitherVeil/src/app/api/secrets/
!AitherOS/apps/AitherVeil/src/app/api/secrets/**
!AitherOS/apps/AitherVeil/src/app/settings/secrets/
!AitherOS/apps/AitherVeil/src/app/settings/secrets/**
**/secrets.yaml
# ...but the ADDON MANIFEST named secrets.yaml is config, not a secret.
# `**/secrets.yaml` is unanchored, so it matches at every depth — the class
# check_ignored_source.py exists for (gate 1e): a rule written for secret
# VALUES silently swallowing source. This file describes how to RUN the vault
# and deliberately carries no AITHER_MASTER_KEY default, precisely so a key is
# never shared between installs. Without this negation the manifest that makes
# AitherSecrets self-hostable would exist in one working tree and no clone.
!AitherOS/config/addon_manifests/secrets.yaml
**/safety_state.json
deploy/rocky-linux/keys/
cosign.key
*.key.enc
secrets.env
.env.secrets
.env.local

# DarkMatters — private game project (contains mature content)
_DARKMATTERS/
_KODOKEVO/
AitherOS/agents/NarrativeAgent/

# Private content directory - only track README and .gitkeep
config/private/*
!config/private/README.md
!config/private/.gitkeep
!config/private/wills/
config/private/wills/*
!config/private/wills/.gitkeep

# AitherOS specific private config
AitherOS/config/private/*
!AitherOS/config/private/
!AitherOS/config/private/README.md
!AitherOS/config/private/.gitkeep
!AitherOS/config/private/wills/
AitherOS/config/private/wills/*
!AitherOS/config/private/wills/.gitkeep

# Per-tenant model configs (private models, lockbox policies — never commit)
AitherOS/config/tenants/*/private_models.yaml
AitherOS/config/tenants/*/lockbox_policy.yaml
AitherOS/config/tenants/*/model_paths.yaml
AitherOS/config/tenants/*/safety_profile.yaml
# Per-tenant persona configs (private personas, wills — never commit)
AitherOS/config/tenants/*/personas_private.yaml
AitherOS/config/tenants/*/wills/*.yaml
# Per-tenant model preferences (contain personal model names — never commit)
AitherOS/config/tenants/*/models.yaml
# Keep example tenant and README
!AitherOS/config/tenants/_example/
!AitherOS/config/tenants/README.md

secrets/
!AitherOS/apps/AitherVeil/src/app/api/secrets/
!AitherOS/apps/AitherVeil/src/app/api/secrets/**
!AitherOS/apps/AitherVeil/src/app/settings/secrets/
!AitherOS/apps/AitherVeil/src/app/settings/secrets/**

# Generated Content
generated_diagrams/
opentofu_output/
*.png
*.jpg
*.jpeg
*.gif
*.webp
generated_images/

# Allow AitherVeil public assets (needed for GitHub Pages deployment)
!AitherOS/apps/AitherVeil/public/**/*.png
!AitherOS/apps/AitherVeil/public/**/*.jpg
!AitherOS/apps/AitherVeil/public/**/*.jpeg
!AitherOS/apps/AitherVeil/public/**/*.gif
!AitherOS/apps/AitherVeil/public/**/*.webp

# Allow AitherShell avatar portrait art — the terminal talking-avatar frames ARE the
# deliverable (built by .PRODUCTS/.SPRITE/roster/tools/wire_avatar.py from the media-forge
# motion library). Without this they'd be caught by *.png above and lost on any other machine.
# git dedupes the per-emotion talk-frame copies to one blob, so the pack stays small.
!.PRODUCTS/.AITHERSHELL/cli/assets/**/*.png

# The desk's space pane draws with bead-space's Kenney sprites (CC0), vendored by
# AitherOS/dev/tools/vendor_bead_space.py (VBS005 fails while this negation is missing).
!.DEPLOYMENT/awdesk/public/bead-space/kenney-simple-space/*.png

# Exclude user-specific VS Code files
.vscode/*.code-workspace
.vscode/launch.local.json
.idea/

# OS files
.DS_Store
Thumbs.db

# Environment files (Docker and local configs)
.env
.env.local
.env.*.local
.env.linkedin
.env.bluesky
.env.discord
.env.secrets
.env.gargbot
# The tenant's PRIVATE gargbot backend staged into the bootc build context
# (build-garg-appliance.sh locally, the build-awnix-iso.yml garg lane in CI).
# Never commit -- the tenant repo ships it and the stage is a copy of their
# property, and the COPY in Containerfile.garg-appliance dies loudly if absent.
/.DEPLOYMENT/standalone/bootc/.gargbot-backend/
aitheros.env
**/aitheros.env
# Sovereign-spoke federation harness credential env (minted ACTA key lives here)
.DEPLOYMENT/compose/spoke.env
# Generated CA chain bundle the spoke mounts (rebuilt by aithernet_spoke_up.py)
.DEPLOYMENT/compose/spoke-ca-chain.crt

# Wallet/key files — NEVER commit private keys
**/solana-master-wallet.json
**/*-keypair.json
**/.jwt_secret
# AitherNet WireGuard runtime state. services/mesh/AitherNet.py writes wg0.conf
# (PrivateKey inside, chmod 600) into AITHERNET_DIR = <repo>/AitherOS/aithernet.
# One was tracked from 2026-02-05 until a05359fe90 (key rotated). Asserted by
# dev/tests/test_wireguard_config_never_tracked.py.
/AitherOS/aithernet/
**/wg[0-9]*.conf

# Build artifacts
dist/
build/
build-output/
# .AITHERIUM/BUILD is vault SOURCE, not a build artifact — the unanchored `build/`
# above matches it case-insensitively (check_ignored_source class, same as D-975)
!.AITHERIUM/BUILD/
!.AITHERIUM/BUILD/**
# The appliance console bundle is COMMITTED on purpose: Containerfile.awnix COPYs it, so
# an image build needs no node and no npm-published awkit (check_awnix_surfaces AWS007
# re-derives its BUILD-STAMP.json). Built by `npm run build` in AitherOS/apps/awnix-web.
!.DEPLOYMENT/standalone/bootc/awnix-web/dist/
!.DEPLOYMENT/standalone/bootc/awnix-web/dist/**
# The aitheros launcher packaging scripts are SOURCE, not artifacts. The unanchored
# `build/` above hides them from every clone while they sit happily on disk (D-975 /
# gate 1e IGN001). Negated here so `git add` can see them at all.
!/.DEPLOYMENT/standalone/aitheros/build/
!/.DEPLOYMENT/standalone/aitheros/build/**
*.egg-info/
kicker-git-backup.ps1

# CI/CD artifacts
AitherZero-v*.zip
AitherZero-v*.tar.gz
AitherZero-*.zip
AitherZero-*.tar.gz
build-info.json
pr-analysis.json
release-notes.md

# Legacy files
*.old
*-legacy.*

# Claude Requirements System

# PowerShell Security Scripts (Private - Never Commit)
powershellsec/
tests/results/*
!tests/results/index.md

# Quality reports (generated artifacts - linting results, analysis output)
library/reports/quality/

# Linting tools (downloaded binaries)
actionlint

# Jekyll build artifacts
_site/
.jekyll-cache/
.jekyll-metadata
.sass-cache/
Gemfile.lock

# Index cache
.aitherzero-index-cache.json
.aitherzero-index-report.json
actionlint*
tests/coverage/*.xml
# Analysis results
tests/analysis/*.csv
tests/analysis/*.json

# Configuration consolidation - PSScriptAnalyzer settings now in config.psd1
PSScriptAnalyzerSettings.psd1
.psscriptanalyzer-fast.psd1

# Infrastructure submodules (managed via Git submodules)
# Keep only documentation files, actual infrastructure repos are submodules
infrastructure/*/
!infrastructure/SUBMODULES.md
!infrastructure/README.md
!infrastructure/index.md
!infrastructure/.gitkeep

# Dashboard and documentation deployment artifacts
library/docs-deploy/
reports/metrics/

# Python
.venv/
output/

# Large binary files - DO NOT COMMIT
*.exe
*.msi
*.deb
*.rpm
*.dmg
*.pkg
*.vsix
*.cab

# Structured generated outputs and scratch space
_scratch/*
!_scratch/README.md
Library/Data/videos/*
!Library/Data/videos/README.md
!Library/Data/videos/.gitkeep
AitherOS/Library/Output/*
!AitherOS/Library/Output/README.md
!AitherOS/Library/Output/.gitkeep
Deliveries/Generated/*
!Deliveries/Generated/README.md
!Deliveries/Generated/.gitkeep
artifacts/public-release/*

# Terraform providers (huge binaries)
**/.terraform/
**/terraform.tfstate*

# Archive/tools folders with binaries
archive/
powershellsec/

# Large test results
library/tests/results/*.json
tmp/

# Model files (use Git LFS or download separately)
*.gguf
*.bin
*.safetensors
# ...EXCEPT the captured numerical references under dev/tools/image_numerics_refs/,
# which are SOURCE, not model weights: small fixtures that make a differential test
# runnable without a 1.4 GB checkpoint. The rule above is UNANCHORED, so it matches
# them at depth, and they only ever landed via `git add -f` -- which works, is
# invisible, and is forgotten by the next person (the D-975 / IGN001 class: a file is
# tracked when `git ls-files` says so, not because you wrote it). Without this line
# the fixture is absent from every clone and its test SKIPS everywhere, which reads
# exactly like a pass.
!AitherOS/dev/tools/image_numerics_refs/*.safetensors
*.onnx
*.pt
*.pth
AitherOS/Library/Models/

# Runtime data directories - NEVER commit these
AitherOS/runtime/
data/
!data/.gitkeep

# A Python package's own data/ directory is SOURCE -- it rides the wheel and is
# read at RUNTIME by the installed package. The `data/` rule above is UNANCHORED,
# so it matches at every depth and was silently excluding it. The three files
# already tracked under awrtifact/awrtifact/data/ reached git only via
# `git add -f`: that works on the machine that typed it and in NO clone, so the
# build passes here and the published package raises FileNotFoundError on first
# use somewhere else -- and nothing local can see it, because the files are on
# disk and git status is clean.
!AitherOS/packages/*/*/data/
!AitherOS/packages/*/*/data/**
# Veil's public factory-receipts.json is SOURCE (served verbatim by the site,
# regenerated by the factory-receipts workflow) — un-exclude the dir (git does
# not descend into an excluded directory to apply a file negation), re-exclude
# its other contents (blog-posts.json / services.json are BUILD artifacts),
# then un-exclude the one tracked file.
!AitherOS/apps/AitherVeil/public/data/
AitherOS/apps/AitherVeil/public/data/*
!AitherOS/apps/AitherVeil/public/data/factory-receipts.json
# `data/` above is UNANCHORED, so it matches at EVERY depth — including
# app/package SOURCE trees that happen to name a folder `data`. That is gate
# 1e's class (check_ignored_source.py): the file sits on disk, so builds and
# tests pass locally while it is absent from every clone.
#
# Measured 2026-08-02: all 19 files under AitherVeil/src/data/ ARE tracked
# (a tracked path ignores .gitignore), so this is a LOADED TRAP rather than a
# live hole — it fires on the NEXT file added there. Concretely, the fix for
# D-1790 is to add desktop-core/src/data/apps-manifest.ts, which this rule
# would have silently kept out of the repo. Re-include the source trees now:
# the directory itself must be un-ignored or git never descends into it.
!AitherOS/apps/*/src/data/
!AitherOS/apps/packages/*/src/data/
# …and one level deeper, because an app can nest its Next project (AitherDesktop
# lives at apps/AitherDesktop/web/src/). Caught 2026-08-02 the same day the two
# patterns above were added: a NEW generated source file landed at
# apps/AitherDesktop/web/src/data/architecture-stats.ts and `git status` showed
# nothing at all. That is the D-975 signature — the file is on disk so the build
# passes, and it never reaches a clone.
!AitherOS/apps/*/*/src/data/
# Portal/runtime shared state (chat DBs, generated media) — runtime, not source
.data/
!.data/.gitkeep
# Training datasets (large, regenerable/downloaded)
training-data/
!training-data/.gitkeep
!AitherOS/apps/AitherVeil/src/app/**/data/
!AitherOS/apps/AitherVeil/src/data/
!awdk/adk/data/
AitherOS/data/
!AitherOS/data/.gitkeep
AitherOS/Library/Data/
AitherOS/Library/Logs/
AitherOS/Library/Output/
AitherOS/Library/Training/
AitherOS/logs/
AitherOS/output/
AitherOS/training-data/
AitherOS/live_news_cache/
AitherOS/demos/outputs/
AitherOS/test_deliverables/
AitherOS/test_sandbox/
AitherOS/artifacts/
AitherOS/warm/
AitherOS/C*tempdocker_status.txt

# Twilio local config
twilio.env
*.env.local
Excluded nul

nul

# Credential/data files that must never be committed
**/agent_credentials.json
**/active_tokens.json
**/reset_tokens.json
**/email_verification_tokens.json

AitherOS/data/models/animatediff_models/*.ckpt
*.ckpt

# Benchmark results (generated per-run, large JSON payloads)
AitherOS/humaneval_hybrid_*.json
AitherOS/humaneval_hybrid_*.md
AitherOS/checkpoint_*.jsonl
AitherOS/Library/phonehome/offline_queue.jsonl

# Nested git repositories (not submodules)
aitheros-alpha/
simulator-temp/
AitherOS/Library/Deliveries/Ent-KG-*/
AitherOS/Library/Deliveries/creation-image-*/
AitherOS/Library/Deliveries/creation-mixed-*/
AitherOS/Library/Deliveries/creative-delivery-*/
AitherOS/Library/Deliveries/demo-trace-*/
AitherOS/**/Deliveries/*/
AitherOS/**/demo-trace-*/

# Claude Code - machine-specific MCP config (generated by scripts/setup-claude.py)
AitherOS/.mcp.json
.mcp.json
/.mcp.json

# Model stack runtime state (active selection, not config)
AitherOS/config/.active-model-stack

# Claude local settings (machine-specific)
.claude/settings.local.json

# AitherOS Temporary Cleanup Artefacts
_archive/
_cleanup_script.ps1
*routines_tmp.json
temp_*.json

# Root-level scratch/debug files (underscore-prefixed)
/_*.py
/_*.txt
/_*.json
/_*.gd
/_*.js
/_*.ps1
/_*.sh
/_*.cmd
/_*.md
/_*.glb
/_Modelfile*
/_config.yml

# Ephemeral build/lint logs
veil-lint-output*.txt
veil-lint-fix-output.txt
veil-build-log*.txt
veil-build-check.txt
veil-build-creative.txt
veil-build-skip-prebuild.txt

# Dev environment files (use .env.dev.example as template)
.env.dev

# Admin tokens — NEVER commit
_admin_token.txt

AitherOS/Library/Worktrees/

node_modules/
gateway/node_modules/
temp_compose.yml

# Temp debug/diagnostic files
_compose_debug.txt
_compose2.txt
_check_*.py
_probe_*.txt
_verify_*.ps1
_verify_*.json
_scaffold_*.py

# Cloudflare tunnel config backups (auto-generated by sync script)
AitherOS/config/tunnel-backups/

# Tanium API keys
*.env.tanium
data/tanium/

.env.smtp

# Runtime data artifacts (generated at runtime, should not be committed)
runtime/Data/
AitherOS/apm.db
AitherOS/dev/AitherOS/Library/Data/
AitherOS/dev/AitherOS/Library/Training/
AitherOS/dev/Library/Data/
AitherOS/dev/Library/Training/
AitherOS/dev/tests/_test_bastion_data/
AitherOS/test_artifacts/

# Training data (large files on HuggingFace)
kaggle-training-data/*.jsonl
kaggle-training-data/adapters/
kaggle-training-data/external_reasoning/
kaggle-training-data/opus_reasoning/
kaggle-training-data/qwen_reasoning/
kaggle-training-data/gemini_opus/
kaggle-training-data/coder_reasoning/
runtime_tests.xml
turboquant/
# The bare `turboquant/` above ALSO matched the in-repo source package
# AitherOS/lib/gpu/turboquant/, silently dropping every new source file there
# (git can't re-include a file whose parent dir is excluded, so the whole dir
# must be re-included). Existing files survived only by already being tracked.
!AitherOS/lib/gpu/turboquant/
# ...but keep these pre-existing, unreviewed untracked files ignored until they
# are reviewed on their own — this program only adds strata_shadow_lifecycle.py.
AitherOS/lib/gpu/turboquant/_autoload.py
AitherOS/lib/gpu/turboquant/_sitecustomize_hooks.py
AitherOS/lib/gpu/turboquant/gb10_fp8_rescue.py

tq4-vllm-patch/
# Vendored external clones only (fetched by AitherOS/external/fetch-omninode-stack.sh);
# our own integration code under AitherOS/external/omninode-integration/ IS tracked.
AitherOS/external/omninode/
AitherOS/external/sum-chain/
apm.db
# SQLite WAL/SHM sidecars are transient runtime state — never track them.
*.db-wal
*.db-shm
tmp_check.py
tmp_health.json
tmp_tls_check.py
tmp_check2.py
health_check.json
svc_list.txt

AitherOS/apps/AitherWorkspace/.next/
AitherOS/apps/AitherPortal/.next/
AitherOS/apps/ForgeIDE/.next/
AitherOS/apps/ForgeIDE/tsconfig.tsbuildinfo

# Next.js static export build artifacts (accidental repo-root dump)
# Real site is served via Cloudflare tunnel to local Veil container
/_next/
/CNAME
/.nojekyll
/404.html
/404/
/index.html
/index.txt
/fallback.html
/maintenance.html
/robots.txt
/sw.js
/favicon.ico
/*.svg
/__next.*/
/_not-found/
# AitherConnect/ is the browser-extension SOURCE (uppercase = real project dir,
# per the convention below). Track the source; ignore only its build artifacts.
/AitherConnect/web-ext-artifacts/
/AitherConnect/*.zip
/AitherConnect/*.crx
/AitherConnect/*.pem
# Static export route directories — lowercase/hyphenated names are all export junk
# Real project dirs are uppercase (AitherOS/, ZealOS-AI/) or known (docs/, packages/, etc.)
/about/
/actions/
/action-builder/
/action-inbox/
/activity/
/admin/
/agent-bus/
/agent-framework/
/agent-lifecycle/
/agent-notebooks/
/agents/
/agents-hub/
/aitherflow/
/apps/
/atlas/
/audio/
/audit/
/auth/
/bang/
/benchmark/
/billing/
/blog/
/business/
/calendar/
/canvas/
/certificates/
/changelog/
/chaos/
/chat/
/civics/
/clipboard/
/cloud-deploy/
/coding-activity/
/cognition/
/cognition-deep/
/communications/
/community-apps/
/configure/
/connect/
/console/
/constellation/
/contacts/
/content/
/context/
/contribute/
/council/
/creative/
/creative-studio/
/crm/
/crowdfund/
/dark-factory/
/dashboard/
/data-sources/
/demi/
/demi-2/
/demiurge/
/demo/
/deploy/
/deployments/
/desktop/
/dev-console/
/developers/
/directory/
/downloads/
/email-login/
/embed/
/eval-lab/
/evolution-core/
# /.PRODUCTS/.EXPEDITIONS/  — tracked (product deployments)
/experience/
/files/
/fleet/
/forge/
/forgot-password/
/fortress/
/forum/
/galaxy/
/gallery/
/gate/
/github-ops/
/gpu/
/gpu-dashboard/
/groups/
/help/
/hera/
/icons/
/ide/
/infra-inspector/
/infrastructure/
/inner-life/
/iris/
/issues/
/join/
/kernel-forge/
/kimi/
/knowledge/
/kodokevo/
/labs/
/launch/
/lyra/
/magic-link/
/mail/
/mcp/
/media/
/media-library/
/media-player/
/members/
/mission-control/
/model-lab/
/monitor-hub/
/network-inspector/
/neural/
/neuron-lab/
/node-console/
/notebook/
/notebooks/
/notifications/
/observe/
/onboarding/
/operations/
/organism/
/pain-dashboard/
/pillars/
/pitch/
/playground/
/portal/
/pricing/
/privacy/
/product/
/profile/
/project-request/
/projects/
/prometheus/
/pull-requests/
/radiant/
/register/
/registry/
/relay/
/releases/
/research/
/reset-password/
/roboflow/
/routine-builder/
/routine-observability/
/routines/
/saga/
/saga-agent/
/sandbox/
/scope/
/search/
/sessions/
/settings/
/setup/
/six-pillars/
/social/
/space/
/splash/
/status/
/steward/
/support/
/system/
/task-observatory/
/telephony/
/tenant-admin/
/terms/
/themis/
/tickets/
/toolkit/
# /tools/ — selectively tracked (diff_check_router, validators, tests)
/tools/*
# gen_demo_hall.py is the Demo Hall generator check_demo_hall.py (DMH002) and run_gates.py
# invoke at THIS path; /tools/* hid it from every clone (measured 2026-09-13, DMH002 exit 2).
!/tools/gen_demo_hall.py
!/tools/diff_check_router.py
!/tools/check-routing-rules.yaml
!/tools/__init__.py
!/tools/validators/
!/tools/tests/
!/tools/secret_scan.py
!/tools/publish_gate.py
!/tools/sanitize_publish_payload.py
!/tools/check_readme_truth.py
!/tools/gen_public_pages.py
!/tools/guide_pages.py
!/tools/check_pages_truth.py
!/tools/gen_design_tokens.py
!/tools/check_public_paths.py
# The static family kit every Pages generator inlines; hidden, every sync lane would
# fail loudly on a missing kit (family_kit.KitError) in a clean clone.
!/tools/family_kit.py
!/tools/family-kit/
/tour/
/trading/
/training/
/tunnel/
/unsubscribe/
/usage/
/vera/
/verify-email/
/video-hosting/
/video-player/
/watch/
/wiki/
/workflow-builder/
/workspaces/
/writer/
# Static export __next artifacts in project subdirs
docs/__next.*/
docs/index.html
docs/index.txt
packages/__next.*/
packages/index.html
packages/index.txt
.PRODUCTS/.EXPEDITIONS/__next.*/
.PRODUCTS/.EXPEDITIONS/index.html
.PRODUCTS/.EXPEDITIONS/index.txt
.PRODUCTS/.EXPEDITIONS/**/node_modules/
.PRODUCTS/.EXPEDITIONS/**/.next/
.PRODUCTS/.EXPEDITIONS/**/dist/
.PRODUCTS/.EXPEDITIONS/**/__pycache__/

# Monorepo navigation junctions (Windows mklink /J)
# /business, /content, /portal, /research already covered in static export section above
/architecture
/integrations
/sdks

# Runtime locks (scheduler heartbeat, etc.) — never source
.claude/*.lock

# Office temp/lock files (e.g. ~$Workbook.xlsx)
~$*

# Scratch / auto-generated notebooks in the runtime data dir
AitherOS/Library/notebooks/nb_*.ipynb
# Notebook replay/run OUTPUT dirs (cell results, runtime-generated — never commit)
AitherOS/Library/notebooks/*.anb.out/

# Ring adk-pin staging — ignore staged wheels/archives, keep the dir + .gitkeep
.adk-pin/*
!.adk-pin/.gitkeep
docker/dev-tunnel/aither-shell-linux-x64

# Auth/session tokens dropped in scratchpad during manual testing — never source,
# and secret-scan's PEM/API-key regex doesn't catch opaque bearer tokens.
scratchpad/*token*.txt
scratchpad/*_token.json

# extracted external archive (contains secrets — never commit)
.RESEARCH/DAOEV/dao-company-brain-main/
.RESEARCH/DAOEV/*.zip

# Third-party reference repos extracted for study (2026-07-25, ~87MB). Reference
# material, not our source — and this repo has concurrent sessions that stage
# broadly, so leaving them untracked would let them be swept into a commit.
.RESEARCH/12-factor-agents-main/
.RESEARCH/humanlayer-main/
.RESEARCH/agentcontrolplane-main/

# temporal-neuron: TNRL v1.0 (non-commercial, share-alike) — owner decision
# 2026-08-01: research sandbox ONLY, never distributed with this repo, never
# imported by shipped code (enforced by dev/tools/check_research_boundary.py).
.RESEARCH/temporal-neuron/

# vendored SEAL (MIT) is source, not artifacts — un-shadow it from the
# unanchored `data/` rule (caught by check_ignored_source 2026-08-01)
!AitherOS/lib/training/seal/few-shot/data/
!AitherOS/lib/training/seal/few-shot/data/**

# dao-company-brain extracted archive — contains REAL Supabase secrets (push-protection blocked it). NEVER commit.
.DAOEVTECH/analysis/original/
**/dao-company-brain-main/
**/dao-company-brain-main.zip
.tmp/
test_paths_edit.py
test_innerlife_import.py
AitherOS/Library/repos/

# Runtime embedding/cache artifacts (regenerated on demand — never commit)
AitherOS/Library/Cache/
# Stray pytest stdout dump
AitherOS/test_output.txt

# Godot editor cache (regenerated on every launch, ~310 files)
AitherOS/godot/.godot/
# Godot imported asset metadata (.import sidecars are regenerated by the editor)
*.import

# Sovereign ISO build artifacts (large; not source)
.iso-out/
.iso-registry/

# Minted game/API keys — never commit
.aither-game-key.json
AitherOS/Library/moika_lora_out/

# AitherOne runtime document store (user-generated, not source)
AitherOS/Library/aitherone/docs/

.aither-gateway-key.json

# Transient/broken env backups — never commit (may contain secrets)
.env.tmp
.env.lock
.env.broken-*

# Local caches / scratch — never commit
.hf-cache/
/scratchpad/

# Python tool caches
.pytest_cache/
.ruff_cache/

# Generated appliance app quadlets (per-customer; produced by render-appliance-app.py at build time)
AitherOS/apps/AitherDesktop/atomic/systemd/apps/*.container
AitherOS/apps/AitherDesktop/atomic/images/.appliance-images.tsv
AitherOS/apps/AitherDesktop/atomic/systemd/apps-secrets.d/*.spec

# Node TLS material — never commit private keys/certs
.aither-node-tls/

# fleet-autosync per-host runtime state (CD marker, lock, logs, opt-in flag)
.DEPLOYMENT/.last-synced-commit
.DEPLOYMENT/.autosync.lock/
.DEPLOYMENT/.autosync-enabled
.DEPLOYMENT/logs/
.DEPLOYMENT/.autosync-node-pending
.DEPLOYMENT/.autosync-node-state

# safe-build.sh image tarballs (local, never committed)
.build-tars/

# HF/tool caches accidentally created at repo root
.cache/

# Embedded vendored clone (git repo) — must not be tracked as a gitlink
AitherOS/external/wizzense-src/
docker/rigify/.cache/
.DEPLOYMENT/headscale/.mesh-psk.local

# Host-local canonical deploy root marker (D-967) — never tracked
.DEPLOYMENT/.canonical-deploy-root

# Debt-id reservations (local mutex for concurrent sessions; never committed)
.tech-debt-ids/
!/tools/check_metrics_truth.py

# ============================================================================
# SOURCE TREES ARE NOT BUILD OUTPUT (D-1352, 2026-07-26)
# ----------------------------------------------------------------------------
# Bare directory-name rules above — logs/, secrets/, build/, backups/, data/,
# dist/ — are aimed at ARTIFACTS, but git applies them at EVERY depth, so they
# also matched identically-named SOURCE directories and silently kept real code
# out of every clone. Measured on 2026-07-26: Veil lost its whole secrets
# feature (admin + workspace pages, 2 API routes, SecretsManager), 3 logs API
# routes, the build page and the admin backups route. Everything still built
# and ran HERE, because the files exist on disk — they were simply absent from
# the repo. Same class as D-975 and D-1342.
# Nothing under a src/ tree is generated; re-include it wholesale.
# Generalised across ALL apps, not just the one that surfaced first: the same
# rules were eating AitherAdmin (security/backups page + route, monitoring/logs
# page) and AitherWorkspace (secrets page + api/secrets/me route), which ship
# 59 and 232 tracked files respectively — so those apps were partially absent
# from every clone too.
!AitherOS/apps/*/src/
!AitherOS/apps/*/src/**
# ...except genuine artifacts that do live under src/: compiled caches and
# per-machine local settings. Listing them here keeps the src/ negation above
# from sweeping in things a clone must never receive.
AitherOS/apps/*/src/**/__pycache__/
AitherOS/apps/*/src/**/.claude/settings.local.json
AitherOS/apps/*/src/**/*.bundle.js

# `data/` (line ~341) is another unanchored artifact rule that matches source.
# awdk SHIPS a package data directory: tracked deployer.py does
# `(_data_dir() / "image_map.yaml").read_text()` at runtime, and image_map.yaml
# plus the package's own __init__.py were being ignored — so a clone or a pip
# install of the published package raises FileNotFoundError on first deploy.
# Its sibling deploy_profiles.yaml was already tracked, which is exactly how
# this stays invisible: the directory looks populated.
!awdk/adk/**/data/
!awdk/adk/**/data/**
awdk/adk/**/data/**/__pycache__/
# awnode ships the generated family index (awnode/data/family.json, written by
# gen_ecosystem.py --emit, EC018) -- the aw hub reads its children from it.
!awnode/awnode/data/
!awnode/awnode/data/**

# Playbooks and scripts are source, whatever their filename happens to start
# with. `library/playbooks/` ships 114 files and `AitherOS/scripts/` 355 —
# including demo_continual_learning.py and bootstrap_smoke_test.py — so the
# only thing excluding demo-formbridge.ps1 and run_gpu_pipeline_test.ps1 was a
# HYPHEN where their tracked siblings use an underscore.
!.PRODUCTS/.AITHERZERO/library/playbooks/*.psd1
!.PRODUCTS/.AITHERZERO/library/playbooks/*.ps1
!AitherOS/scripts/*.ps1
!AitherOS/scripts/*.py

# Test scratch dir for the internal-CA guard tests (anchored on purpose:
# an unanchored `_ca_guard_tmp` would match at every depth -- see D-1518).
/AitherOS/dev/tests/_ca_guard_tmp/

# `.claude/hooks/tests/` holds real SOURCE (hook test suites). The unanchored
# `Test-*` rule above matches them at EVERY depth, so a clone would silently
# lack them -- the exact D-1518 defect class.
!.claude/hooks/tests/**

# Local hook scratch, declared rather than committed (2026-09-20). HYG013 flags any
# untracked file under .claude/ because an agent-context file that exists on one disk
# is invisible to every clone -- but it could not tell a DECISION from an oversight,
# so these three sat undischargeable: committing someone's scratch pollutes history,
# deleting it destroys their local state. `*.keep` is a hand-made backup (_mine.ps1
# is itself on no ref); `_t_*` are hook-test temp fixtures referenced by nothing, and
# they need an explicit rule because the line above deliberately un-ignores that dir.
.claude/hooks/*.keep
.claude/hooks/tests/fixtures/_t_*

# GENERATED per-host by 7004_Register-DeployRootSelfHeal.ps1 and embeds absolute
# paths for THIS machine (repo root, temp dir, pwsh location). Tracking it would
# ship one host's paths to every clone; 7004 regenerates it on registration.
# Fully anchored on purpose -- an unanchored rule here would match at every depth
# (gate 1e / check_ignored_source.py).
/.PRODUCTS/.AITHERZERO/library/automation-scripts/70-maintenance/.deploy-root-selfheal-run.ps1

# Portal gauntlet wave outputs (screenshots, local-only)
/.GAUNTLET-PORTAL/wave-*/

# gauntlet.py run artifacts (captures, ab pairs, gates, state) — local-only.
# ANCHORED with a leading slash on purpose: an unanchored `.gauntlet/` would match at
# EVERY depth and could silently keep real source out of every clone (the class
# check_ignored_source.py exists for). Wave SPECS live in AitherOS/dev/gauntlet/ and
# ARE tracked — only the run outputs below are ignored.
/.gauntlet/

# Generated per-host fleet name->IP map that dnsmasq serves via hostsdir=.
# Regenerated every few minutes from live `docker inspect`, so it is machine
# state, not source. ANCHORED with a leading slash on purpose: an unanchored
# `hosts/` would match at every depth and silently hide real source elsewhere
# (that class cost 31 files on 2026-07-26).
/.DEPLOYMENT/dns/hosts/fleet.hosts
/.DEPLOYMENT/dns/refresh.log

# 25 MB Rust binary, built by AitherOS/dev/tools/pool/build-omni-node.sh — not source
.DEPLOYMENT/bin/omni-node

# npm pack output left in a package root. ANCHORED and one level deep on purpose:
# the vendored tarballs under .PRODUCTS/*/.awkit-pkg/ and packages/*/*/vendor/
# are load-bearing `file:` dependencies (chelle + gargbot frontends install from them),
# so a broad `*.tgz` would silently ignore a RE-VENDOR and build against a stale copy.
/AitherOS/apps/packages/*/aitheros-*.tgz

# Nested git worktrees. Each is a FULL checkout of another branch living inside the
# repo root, so a recursive crawl (rg/grep/Glob, or any agent's code search) walks the
# tree ~13 times and returns 13 hits per symbol from 13 DIFFERENT branches — including
# 13 rival copies of CLAUDE.md, the root context file. That is not merely slow: there
# is no way to tell which hit is HEAD, so an agent reads another branch's version and
# believes it is current. Same class as the "more than one .mcp.json, nearest wins"
# trap, at 13x. Measured 2026-08-14: `git ls-files` enumerates all 28,963 TRACKED
# files in 0.1s, while `grep -r` from the root did not finish in 120s.
#
# ANCHORED (leading /) on purpose — gate 1e / check_ignored_source.py: an unanchored
# `worktrees/` would match a directory of that name at EVERY depth and could silently
# keep real source out of every clone (that class cost 31 files on 2026-07-26).
# These entries change nothing for git itself (it already refuses to track a nested
# worktree); they exist so that ripgrep and every gitignore-respecting search tool
# skip them. Delete a worktree with `git worktree remove`, not by untracking it.
/.worktrees/
# The .wt-<name> spelling is the manual `git worktree add` convention used in
# this tree (was only the one-off /.wt-develop/ until 2026-08-26, which let
# .wt-adkver/.wt-ci-*/.wt-studio-deploy/ slip back into `git add -A` after
# their .git markers were lost with the destroyed .git — 183k files staged).
# Same anchored rule as /.worktrees/ above: never unanchored.
/.wt-*/
/devcheck/
# A VENDORED tree is source, not artefact. The unanchored `*.png` above applies
# at EVERY depth, so it silently excluded SEAL's `few-shot/assets/SEAL.png` from
# every clone — while `VENDOR_MANIFEST.sha256` pins that file by hash, so the
# integrity check could only ever report it MISSING. Exactly the class
# check_ignored_source exists for (D-975): the file is on disk, builds pass,
# git status is clean, and no clone has it.
!AitherOS/lib/training/seal/**

# The ds4-rpc backend RECIPE is tracked (Containerfile, quadlet, patches) so the
# image can be rebuilt from the tree -- that is the whole reason those files
# exist. The vendored llama.cpp source ARCHIVE is not: it is 201 MB of
# re-fetchable upstream source, and git history is permanent, so every clone
# would pay for it forever and a re-vendor would ADD a copy rather than replace
# one. The Containerfile fetches the pinned commit from upstream instead.
.DEPLOYMENT/ds4-rpc/llamacpp-src.tgz

# wrangler per-machine state (cache/state/tmp) created by any "wrangler deploy" --
# tooling, never source. 
.wrangler/
# `wrangler deploy --dry-run --outdir .dryrun` bundle output (w1b-18-24).
gateway/.dryrun/

# GargBot build output (vite outDir=frontend-dist) — content-hashed, regenerated by
# the tenant frontend build; tracked copies get deleted by the next build.
.PRODUCTS/.GARGBOT/frontend-dist/

# A stray 2.5 GB / 34,178-file duplicate tree that accumulated at the repo root
# (measured 2026-09-10): a second copy of AitherOS/ plus files whose NAMES are
# flattened Windows temp paths, e.g.
# 'C:UserswznsAppDataLocalTempclaude...scratchpadverify.md' -- the output of a
# redirect whose target path lost its separators. It is untracked and was NOT
# ignored, so any session running `git add -A` commits 34k files. Ignored rather
# than deleted: removing 2.5 GB of someone else's working copy is not a side
# effect anyone should take on.
/list/

# The WSL deploy lane's staged compose copy (3050_Deploy-FromGHCR.ps1): one
# GUID-named translation of the compose file per deploy, written at the repo root
# so relative binds resolve from inside the distro. Measured 2026-09-11: 91 of
# them (89 MB) had accumulated since 2026-08-28, untracked AND unignored, so
# `git status` counted them and fd/rg handed them to awgraph as source -- they
# competed with real answers in retrieval. The producer deletes its own copy
# now; this is the belt for any other stager.
.compose-wsl-*.yml
# BRAND/ is the owner-facing brand mirror (marks, social kit, app icons, fonts) and
# ships WHOLE. Its PNGs are canonical brand assets, not generated screenshots — the
# unanchored `*.png` above was hiding 61 of its 132 files from every clone (gate 1e
# IGN001, the D-975 class). Re-included last so it wins over every earlier match.
!BRAND/
!BRAND/**
