# Signing keys (NEVER commit private keys)
AitherOS/config/keys/*.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

# 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
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

# 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/**
*.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
*.onnx
*.pt
*.pth
AitherOS/Library/Models/

# Runtime data directories - NEVER commit these
AitherOS/runtime/
data/
!data/.gitkeep
# 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/

# 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/*
!/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
/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__/

# 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/**

# 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/
/.wt-develop/
/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
