From f66bd1807a4a308541d5cdac77bebc569359ea53 Mon Sep 17 00:00:00 2001
From: JSONbored <49853598+JSONbored@users.noreply.github.com>
Date: Sat, 4 Jul 2026 22:01:54 -0700
Subject: [PATCH] fix(selfhost): recognize repoDocGeneration in the config-lint
allowlist
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
repoDocGeneration is a real, actively-parsed top-level manifest field
(#3002), but was missing from config-lint.ts's TOP_LEVEL_FIELDS
allowlist, so an operator using it got a false "unknown top-level
field" warning even though the field works correctly.
Also corrects the self-hosting-configuration docs page, which claimed
blockedPaths is enforced via a manifest_blocked_path finding gated by
gate.manifestPolicy: block — that finding code does not exist; path
holds are enforced only via settings.hardGuardrailGlobs. Adds the
missing repoDocGeneration doc section alongside the existing
contentLane one.
---
.../docs.self-hosting-configuration.tsx | 31 ++++++++++++++++---
src/selfhost/config-lint.ts | 1 +
test/unit/selfhost-config-lint.test.ts | 16 +++++++++-
3 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx b/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx
index 501d4a1af6..6f8302c993 100644
--- a/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx
+++ b/apps/gittensory-ui/src/routes/docs.self-hosting-configuration.tsx
@@ -480,10 +480,16 @@ features:
regardless of this setting. Default false.
- blockedPaths (top-level, alongside wantedPaths) — globs off-limits
- to contributors. Touching one yields a manifest_blocked_path finding,
- enforceable when gate.manifestPolicy: block is set. Default []{" "}
- (nothing blocked).
+ blockedPaths (top-level, alongside wantedPaths) is{" "}
+ contributor-facing guidance only — it never blocks, holds, or produces a
+ gate finding. A touched path surfaces in contributor onboarding guidance and in
+ gittensory's own risk-reason commentary, but the gate itself never enforces it.{" "}
+ The only mechanism that actually holds a PR for a touched path is{" "}
+ settings.hardGuardrailGlobs (config-as-code only, described above) — a
+ would-merge PR that touches a configured guardrail glob is held for manual review regardless
+ of blockedPaths. A legacy top-level blockedPaths that once acted
+ as an enforcement mechanism is retired; setting it produces a migration warning pointing at{" "}
+ settings.hardGuardrailGlobs. Default [] (nothing listed).
+ Lets gittensory open a pull request that refreshes this repo's own{" "}
+ AGENTS.md/CLAUDE.md (and, additively, a skill file) on a schedule
+ — never a direct commit. Disabled by default: an unconfigured repo, or an explicit{" "}
+ enabled: false, means no repo-doc refresh ever runs for it.
+
SELFHOST_DEPLOYMENT_MODE forces write suppression for the whole instance,
diff --git a/src/selfhost/config-lint.ts b/src/selfhost/config-lint.ts
index 989f824263..2ff0af08ef 100644
--- a/src/selfhost/config-lint.ts
+++ b/src/selfhost/config-lint.ts
@@ -15,6 +15,7 @@ const TOP_LEVEL_FIELDS = [
"review",
"features",
"contentLane",
+ "repoDocGeneration",
] as const;
const TOP_LEVEL_FIELD_SET = new Set