Part of #4189.
Context
Every review feature in gittensory is toggled the same way: a deployment-wide GITTENSORY_REVIEW_* env kill-switch, overridable per repo via .gittensory.yml, falling back to a default when unset. The converged-feature registry (rag/reputation/unifiedComment/safety/grounding) already implements this precedence in one place:
CONVERGED_FEATURE_KEYS — packages/gittensory-engine/src/focus-manifest.ts:194-195 — currently ["rag", "reputation", "unifiedComment", "safety", "grounding"] as const, re-exported through src/signals/focus-manifest.ts.
FocusManifestFeaturesConfig (focus-manifest.ts:200), parseFeaturesConfig (focus-manifest.ts:1320), and featuresConfigToJson (focus-manifest.ts:1337) all key off CONVERGED_FEATURE_KEYS automatically — adding an entry to the array is the only schema change needed on the parsing side.
FEATURE_GLOBAL_FLAG — src/review/feature-activation.ts:31-37 — maps each key to its env-flag-checking function (isRagEnabled, isGroundingEnabled, etc.).
- The public schema doc already has a worked example of this exact block at
.gittensory.yml.example:1034-1046.
- The self-host private-config examples (
config/examples/global.gittensory.yml, config/examples/repo-override.gittensory.yml) currently only show gate:/settings: blocks — no features: example yet.
This issue is pure schema/wiring — no behavior change, no LLM call, no rendering. It unblocks every other sub-issue.
Requirements
- Add
"e2eTests" to CONVERGED_FEATURE_KEYS in packages/gittensory-engine/src/focus-manifest.ts:194.
- Add a new
isE2eTestGenerationEnabled(env) function (same shape as isRagEnabled/isGroundingEnabled) checking a new GITTENSORY_REVIEW_E2E_TESTS env var, and register it in FEATURE_GLOBAL_FLAG in src/review/feature-activation.ts:31-37.
- Use a symmetric override (no asymmetric force-on-only floor like
safety, no force-off-only ceiling like grounding) — code generation has no reason to be forced on or capped, unlike security-hardening (safety) or full-file-fetching (grounding).
- Add
e2eTests: true to the commented example features: block in .gittensory.yml.example:1034-1046, and update the block's explanatory comment to mention it.
- Add a
features: block (with e2eTests) to both config/examples/global.gittensory.yml and config/examples/repo-override.gittensory.yml, consistent with how those files already show gate:/settings: overrides deep-merging per src/selfhost/private-config.ts.
- Add a unit test asserting
CONVERGED_FEATURE_KEYS includes "e2eTests" and that resolveConvergedFeature/convergedFeatureActive handle it with the same precedence as every other key (see test/unit/feature-activation.test.ts, which already iterates CONVERGED_FEATURE_KEYS generically).
Deliverables
Expected outcome
A self-host operator (or the public schema reader) can toggle features.e2eTests globally and per-repo using the exact same mental model as every other converged feature, with zero new precedence rules to learn. No visible behavior changes yet — this is pure plumbing.
Resources / examples
src/review/feature-activation.ts (existing FEATURE_GLOBAL_FLAG map + resolveConvergedFeature/convergedFeatureActive)
packages/gittensory-engine/src/focus-manifest.ts:194-200, 1320-1344
.gittensory.yml.example:1034-1046 (the exact block to extend)
config/examples/global.gittensory.yml, config/examples/repo-override.gittensory.yml
test/unit/feature-activation.test.ts (existing generic-over-CONVERGED_FEATURE_KEYS test pattern)
Effort
S — additive schema change, no new runtime logic.
Part of #4189.
Context
Every review feature in gittensory is toggled the same way: a deployment-wide
GITTENSORY_REVIEW_*env kill-switch, overridable per repo via.gittensory.yml, falling back to a default when unset. The converged-feature registry (rag/reputation/unifiedComment/safety/grounding) already implements this precedence in one place:CONVERGED_FEATURE_KEYS—packages/gittensory-engine/src/focus-manifest.ts:194-195— currently["rag", "reputation", "unifiedComment", "safety", "grounding"] as const, re-exported throughsrc/signals/focus-manifest.ts.FocusManifestFeaturesConfig(focus-manifest.ts:200),parseFeaturesConfig(focus-manifest.ts:1320), andfeaturesConfigToJson(focus-manifest.ts:1337) all key offCONVERGED_FEATURE_KEYSautomatically — adding an entry to the array is the only schema change needed on the parsing side.FEATURE_GLOBAL_FLAG—src/review/feature-activation.ts:31-37— maps each key to its env-flag-checking function (isRagEnabled,isGroundingEnabled, etc.)..gittensory.yml.example:1034-1046.config/examples/global.gittensory.yml,config/examples/repo-override.gittensory.yml) currently only showgate:/settings:blocks — nofeatures:example yet.This issue is pure schema/wiring — no behavior change, no LLM call, no rendering. It unblocks every other sub-issue.
Requirements
"e2eTests"toCONVERGED_FEATURE_KEYSinpackages/gittensory-engine/src/focus-manifest.ts:194.isE2eTestGenerationEnabled(env)function (same shape asisRagEnabled/isGroundingEnabled) checking a newGITTENSORY_REVIEW_E2E_TESTSenv var, and register it inFEATURE_GLOBAL_FLAGinsrc/review/feature-activation.ts:31-37.safety, no force-off-only ceiling likegrounding) — code generation has no reason to be forced on or capped, unlike security-hardening (safety) or full-file-fetching (grounding).e2eTests: trueto the commented examplefeatures:block in.gittensory.yml.example:1034-1046, and update the block's explanatory comment to mention it.features:block (withe2eTests) to bothconfig/examples/global.gittensory.ymlandconfig/examples/repo-override.gittensory.yml, consistent with how those files already showgate:/settings:overrides deep-merging persrc/selfhost/private-config.ts.CONVERGED_FEATURE_KEYSincludes"e2eTests"and thatresolveConvergedFeature/convergedFeatureActivehandle it with the same precedence as every other key (seetest/unit/feature-activation.test.ts, which already iteratesCONVERGED_FEATURE_KEYSgenerically).Deliverables
e2eTestspresent inCONVERGED_FEATURE_KEYSand flowing throughFocusManifestFeaturesConfig/parseFeaturesConfig/featuresConfigToJsonwith no other code change required.GITTENSORY_REVIEW_E2E_TESTSenv kill-switch wired intoFEATURE_GLOBAL_FLAG..gittensory.yml.exampleand both self-host config examples document the new key.Expected outcome
A self-host operator (or the public schema reader) can toggle
features.e2eTestsglobally and per-repo using the exact same mental model as every other converged feature, with zero new precedence rules to learn. No visible behavior changes yet — this is pure plumbing.Resources / examples
src/review/feature-activation.ts(existingFEATURE_GLOBAL_FLAGmap +resolveConvergedFeature/convergedFeatureActive)packages/gittensory-engine/src/focus-manifest.ts:194-200, 1320-1344.gittensory.yml.example:1034-1046(the exact block to extend)config/examples/global.gittensory.yml,config/examples/repo-override.gittensory.ymltest/unit/feature-activation.test.ts(existing generic-over-CONVERGED_FEATURE_KEYStest pattern)Effort
S — additive schema change, no new runtime logic.