Context
blockedPaths was fully retired from the FocusManifest TypeScript type (commit f13d95c01, #2974, 2026-07-04) — packages/gittensory-engine/src/focus-manifest.ts's FocusManifest type (lines 886-906) has no blockedPaths field, parseFocusManifest never reads it, and there's no manifest_blocked_path finding code at all. Real path-based enforcement now lives entirely in settings.hardGuardrailGlobs. Despite this:
- Live drift — all 3 production repo configs still carry
blockedPaths: [] (jsonbored__gittensory.gittensory.yml:118, jsonbored__metagraphed.gittensory.yml:148, jsonbored__awesome-claude.gittensory.yml:107).
- Root cause — the 2026-07-04 retirement commit updated ~20 files but missed two checked-in, self-host-operator-facing bootstrap templates —
.gittensory.yml.example and config/examples/gittensory.full.yml (byte-synced per test/unit/config-templates.test.ts) — which still document blockedPaths: with non-empty example values (vendor/**, .github/workflows/**) and false claims that it "feed[s] advisory-only guidance findings" (.gittensory.yml.example:51), "surfaces in onboarding guidance and gittensory's own risk-reason commentary" (lines 61-68), and becomes "an enforceable blocker" under gate.manifestPolicy: block (lines 271-273) — all three claims are false, contradicted by test/unit/predicted-gate.test.ts:348-370 and test/unit/focus-manifest.test.ts:583-588. This is very likely why operators keep copy-pasting the dead key into live configs.
- Self-contradicting docs page —
docs.self-hosting-configuration.tsx:594-604 claims live guidance behavior in one sentence and correctly notes retirement in the very next one.
- Structural CI gap —
test/unit/config-templates.test.ts's zero-warnings test calls the lenient parseFocusManifestContent (never warns on unrecognized fields by design), not lintManifestText (the only function with the retired-field check, src/selfhost/config-lint.ts:67-69, reachable only via the manual npm run selfhost:config-lint CLI with zero production callers). So the one test that already parses this exact stale template structurally cannot flag it.
Note: an unrelated, fully-live blockedPaths field exists on the separate MinerGoalSpec schema (.gittensory-miner.yml) — keep any fix scoped to the top-level .gittensory.yml/FocusManifest field only.
Requirements
- Two parts: a PR fixing the root cause (templates + CI regression test), and a separate direct VPS edit (strip the dead key from live configs) — do not conflate them into one change.
Deliverables
PR (JSONbored/gittensory):
Direct VPS edit (edge-nl-01, separate from the PR):
Expected Outcome
The templates no longer document a dead feature with false behavioral claims; CI automatically catches this class of "retirement commit missed a template" bug going forward; the live configs no longer carry the dead key.
Links & Resources
- Evidence:
packages/gittensory-engine/src/focus-manifest.ts:886-906,3071-3090 (zero blockedPaths references); src/selfhost/config-lint.ts:65-88; .gittensory.yml.example:51,61-68,271-273; config/examples/gittensory.full.yml:64-67,74-81,284-286; apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx:585,594-604; src/services/decision-pack.ts:1024-1056; src/queue/processors.ts:7320
Part of #5270 (roadmap epic).
Context
blockedPathswas fully retired from theFocusManifestTypeScript type (commitf13d95c01, #2974, 2026-07-04) —packages/gittensory-engine/src/focus-manifest.ts'sFocusManifesttype (lines 886-906) has noblockedPathsfield,parseFocusManifestnever reads it, and there's nomanifest_blocked_pathfinding code at all. Real path-based enforcement now lives entirely insettings.hardGuardrailGlobs. Despite this:blockedPaths: [](jsonbored__gittensory.gittensory.yml:118,jsonbored__metagraphed.gittensory.yml:148,jsonbored__awesome-claude.gittensory.yml:107)..gittensory.yml.exampleandconfig/examples/gittensory.full.yml(byte-synced pertest/unit/config-templates.test.ts) — which still documentblockedPaths:with non-empty example values (vendor/**,.github/workflows/**) and false claims that it "feed[s] advisory-only guidance findings" (.gittensory.yml.example:51), "surfaces in onboarding guidance and gittensory's own risk-reason commentary" (lines 61-68), and becomes "an enforceable blocker" undergate.manifestPolicy: block(lines 271-273) — all three claims are false, contradicted bytest/unit/predicted-gate.test.ts:348-370andtest/unit/focus-manifest.test.ts:583-588. This is very likely why operators keep copy-pasting the dead key into live configs.docs.self-hosting-configuration.tsx:594-604claims live guidance behavior in one sentence and correctly notes retirement in the very next one.test/unit/config-templates.test.ts's zero-warnings test calls the lenientparseFocusManifestContent(never warns on unrecognized fields by design), notlintManifestText(the only function with the retired-field check,src/selfhost/config-lint.ts:67-69, reachable only via the manualnpm run selfhost:config-lintCLI with zero production callers). So the one test that already parses this exact stale template structurally cannot flag it.Note: an unrelated, fully-live
blockedPathsfield exists on the separateMinerGoalSpecschema (.gittensory-miner.yml) — keep any fix scoped to the top-level.gittensory.yml/FocusManifestfield only.Requirements
Deliverables
PR (JSONbored/gittensory):
.gittensory.yml.exampleandconfig/examples/gittensory.full.yml— fix all three false-claim locations (lines 51, 61-68, 271-273 and theirfull.ymlmirrors): either replace with an accurate "legacy, fully retired, no runtime effect — usesettings.hardGuardrailGlobs" note, or delete the block entirely.docs.self-hosting-configuration.tsx:594-604— remove the false "surfaces in onboarding guidance" sentence; keep only the accurate retirement sentence.test/unit/config-templates.test.ts— extend the "parses gittensory.full.yml with zero warnings" test to also assertlintManifestText(...)returns zero warnings, so a retired field reintroduced into the shipped templates fails CI automatically going forward."manifest_blocked_path"string fromprocessors.ts:7320'spolicyCodesSet.Direct VPS edit (edge-nl-01, separate from the PR):
blockedPaths: []from all 3 live private-config files.Expected Outcome
The templates no longer document a dead feature with false behavioral claims; CI automatically catches this class of "retirement commit missed a template" bug going forward; the live configs no longer carry the dead key.
Links & Resources
packages/gittensory-engine/src/focus-manifest.ts:886-906,3071-3090(zeroblockedPathsreferences);src/selfhost/config-lint.ts:65-88;.gittensory.yml.example:51,61-68,271-273;config/examples/gittensory.full.yml:64-67,74-81,284-286;apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx:585,594-604;src/services/decision-pack.ts:1024-1056;src/queue/processors.ts:7320Part of #5270 (roadmap epic).