diff --git a/.gittensory.yml.example b/.gittensory.yml.example
index 7e3b499710..61782cebf8 100644
--- a/.gittensory.yml.example
+++ b/.gittensory.yml.example
@@ -484,15 +484,6 @@ review:
# (CI green, gate passing, mergeable-clean, valid linked issue). SURFACE ONLY — never changes the decision.
# auto_merge_summary: false
- # Boundary-safe test-generation advisory (#1972, kill-switch config slice #2189). Bool | null. Default:
- # null/false — byte-identical (no boundary scan runs at all). Requires the operator's
- # GITTENSORY_REVIEW_TEST_GENERATION flag to be on AND this toggle. When both are on, a diff that touches a
- # small, precise set of boundary-condition patterns (off-by-one array/index bounds, null/undefined branches,
- # empty-collection checks) with NO test evidence anywhere in the PR gets an advisory finding plus a
- # LOCAL-execution test-generation action spec (criteria/hints for your OWN agent to scaffold tests with —
- # gittensory never writes or runs test code).
- # test_generation: false
-
# Deterministic label suggestions (#2045). Each rule SUGGESTS a non-scoring label when a PR matches ALL of the
# `when` criteria it sets (at least one is required): when_paths (any changed path matches a glob), title_contains,
# description_contains (both case-insensitive). Suggestions are advisory; they are auto-applied only when the repo's
@@ -913,12 +904,6 @@ settings:
# # fallback for whatever it omits. Only takes effect when inline_comments is already on. Bool or null.
# # Default: null/false.
# finding_categories: false
-# # When true, a diff touching a small, precise set of boundary-condition patterns (off-by-one array/index
-# # bounds, null/undefined branches, empty-collection checks) with no test evidence in the PR gets an
-# # advisory finding plus a LOCAL-execution test-generation action spec (criteria/hints only -- never
-# # generated test code; your own agent scaffolds it). Also requires the operator flag
-# # GITTENSORY_REVIEW_TEST_GENERATION. Bool or null. Default: null/false (byte-identical).
-# test_generation: false
# # How strictly a linked issue must actually be SATISFIED by the PR (distinct from linkedIssuePolicy,
# # which only checks a link EXISTS). off = not evaluated; advisory = surface a finding; block = can
# # become a hard blocker (confirmed-contributor-gated). This is the config knob only — parsed and
diff --git a/apps/gittensory-ui/src/routes/docs.privacy-security.tsx b/apps/gittensory-ui/src/routes/docs.privacy-security.tsx
index 56cdc748a3..6eb7ee1251 100644
--- a/apps/gittensory-ui/src/routes/docs.privacy-security.tsx
+++ b/apps/gittensory-ui/src/routes/docs.privacy-security.tsx
@@ -92,7 +92,6 @@ GITTENSORY_REVIEW_REPUTATION="true" # submitter-reputation spend co
GITTENSORY_REVIEW_UNIFIED_COMMENT="true" # one in-place unified PR comment
GITTENSORY_REVIEW_ENRICHMENT="true" # external analyzer registry (REES) findings
GITTENSORY_REVIEW_INLINE_COMMENTS="true" # diff-anchored inline PR review comments
-GITTENSORY_REVIEW_TEST_GENERATION="true" # boundary-safe test-gen action spec (contributor-run)
GITTENSORY_REVIEW_FIX_HANDOFF="true" # machine-readable fix-handoff block (contributor-run)
GITTENSORY_REVIEW_PLANNER="true" # @gittensory plan on-demand implementation plan
GITTENSORY_REVIEW_SCREENSHOTS="true" # before/after visual capture for UI changes
diff --git a/apps/gittensory-ui/src/routes/docs.tuning.tsx b/apps/gittensory-ui/src/routes/docs.tuning.tsx
index 6b47af0cca..9162c6562e 100644
--- a/apps/gittensory-ui/src/routes/docs.tuning.tsx
+++ b/apps/gittensory-ui/src/routes/docs.tuning.tsx
@@ -183,12 +183,6 @@ function Tuning() {
GITTENSORY_REVIEW_INLINE_COMMENTS — posts AI-review findings as inline
diff-anchored PR review comments instead of (or alongside) the summary comment. Per-PR.
-
GITTENSORY_REVIEW_TEST_GENERATION — offers a boundary-safe local-write action
- spec alongside a missing-test-evidence finding, describing what test cases should exist
- for the repo's detected framework; the contributor's own agent scaffolds and runs the
- tests locally. Per-PR.
- GITTENSORY_REVIEW_FIX_HANDOFF — renders a review finding as a structured,
machine-readable "apply this fix" block for the contributor's own local agent to consume —
diff --git a/config/examples/gittensory.full.yml b/config/examples/gittensory.full.yml
index ac10a39870..e6d3414fef 100644
--- a/config/examples/gittensory.full.yml
+++ b/config/examples/gittensory.full.yml
@@ -497,15 +497,6 @@ review:
# (CI green, gate passing, mergeable-clean, valid linked issue). SURFACE ONLY — never changes the decision.
# auto_merge_summary: false
- # Boundary-safe test-generation advisory (#1972, kill-switch config slice #2189). Bool | null. Default:
- # null/false — byte-identical (no boundary scan runs at all). Requires the operator's
- # GITTENSORY_REVIEW_TEST_GENERATION flag to be on AND this toggle. When both are on, a diff that touches a
- # small, precise set of boundary-condition patterns (off-by-one array/index bounds, null/undefined branches,
- # empty-collection checks) with NO test evidence anywhere in the PR gets an advisory finding plus a
- # LOCAL-execution test-generation action spec (criteria/hints for your OWN agent to scaffold tests with —
- # gittensory never writes or runs test code).
- # test_generation: false
-
# Deterministic label suggestions (#2045). Each rule SUGGESTS a non-scoring label when a PR matches ALL of the
# `when` criteria it sets (at least one is required): when_paths (any changed path matches a glob), title_contains,
# description_contains (both case-insensitive). Suggestions are advisory; they are auto-applied only when the repo's
@@ -926,12 +917,6 @@ settings:
# # fallback for whatever it omits. Only takes effect when inline_comments is already on. Bool or null.
# # Default: null/false.
# finding_categories: false
-# # When true, a diff touching a small, precise set of boundary-condition patterns (off-by-one array/index
-# # bounds, null/undefined branches, empty-collection checks) with no test evidence in the PR gets an
-# # advisory finding plus a LOCAL-execution test-generation action spec (criteria/hints only -- never
-# # generated test code; your own agent scaffolds it). Also requires the operator flag
-# # GITTENSORY_REVIEW_TEST_GENERATION. Bool or null. Default: null/false (byte-identical).
-# test_generation: false
# # How strictly a linked issue must actually be SATISFIED by the PR (distinct from linkedIssuePolicy,
# # which only checks a link EXISTS). off = not evaluated; advisory = surface a finding; block = can
# # become a hard blocker (confirmed-contributor-gated). This is the config knob only — parsed and
diff --git a/packages/gittensory-engine/src/focus-manifest.ts b/packages/gittensory-engine/src/focus-manifest.ts
index 2be9c9c754..dabb2129e8 100644
--- a/packages/gittensory-engine/src/focus-manifest.ts
+++ b/packages/gittensory-engine/src/focus-manifest.ts
@@ -430,17 +430,6 @@ export type FocusManifestReviewConfig = {
* source, same display-only (never touches the AI prompt) shape. null/false (default, absent) = no chip =
* byte-identical behavior. (#1955) */
effortScore: boolean | null;
- /** `review.test_generation` (#1972, kill-switch config slice #2189): when true, a diff that touches a small,
- * precise set of boundary-condition patterns (off-by-one array/index bounds, null/undefined branches,
- * empty-collection checks — see `src/signals/boundary-test-generation.ts`) with NO test evidence anywhere in
- * the PR gets an additional advisory finding plus a boundary-safe LOCAL-execution
- * `gittensory_generate_tests` action spec (criteria/hints only, never generated test code — see
- * `src/mcp/local-write-tools.ts`'s `buildTestGenSpec`). Also gated by the operator's
- * `GITTENSORY_REVIEW_TEST_GENERATION` kill-switch (`src/review/test-generation.ts`'s
- * `isTestGenerationEnabled`) — the caller ANDs both. Purely additive and deterministic; it never changes what
- * `missingTestEvidence` already does. null/false (default, absent) ⇒ byte-identical behavior — no boundary
- * scan runs and no spec is ever built. */
- testGeneration: boolean | null;
/** `review.impact_map` (#2184, config slice of #1971): when true, gates BOTH the deterministic impact-map
* computation (`computeImpactMap`, `src/review/impact-map.ts`) and its rendering as a compact section in
* the unified review comment (#2185) / additive AI-review grounding context (#2186). Deterministic/display
@@ -887,7 +876,7 @@ const EMPTY_MANIFEST: FocusManifest = {
publicNotes: [],
gate: { ...EMPTY_GATE_CONFIG },
settings: {},
- review: { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, testGeneration: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null },
+ review: { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null },
features: { ...EMPTY_FEATURES_CONFIG },
contentLane: { ...EMPTY_CONTENT_LANE_CONFIG },
repoDocGeneration: { ...EMPTY_REPO_DOC_GENERATION_CONFIG },
@@ -917,7 +906,7 @@ function emptyManifest(source: FocusManifestSource, warnings: string[] = []): Fo
warnings,
gate: { ...EMPTY_GATE_CONFIG },
settings: {},
- review: { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, testGeneration: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null },
+ review: { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null },
features: { ...EMPTY_FEATURES_CONFIG },
contentLane: { ...EMPTY_CONTENT_LANE_CONFIG },
repoDocGeneration: { ...EMPTY_REPO_DOC_GENERATION_CONFIG },
@@ -1921,7 +1910,7 @@ function parsePublicSafeText(value: JsonValue | undefined, field: string, warnin
* throws; invalid/unsafe values are dropped with warnings.
*/
function parseReviewConfig(value: JsonValue | undefined, warnings: string[]): FocusManifestReviewConfig {
- const empty: FocusManifestReviewConfig = { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, testGeneration: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null };
+ const empty: FocusManifestReviewConfig = { present: false, footerText: null, note: null, fields: {}, enrichmentAnalyzers: {}, profile: null, tone: null, securityFocus: null, inlineComments: null, fixHandoff: null, autoMergeSummary: null, suggestions: null, changedFilesSummary: null, effortScore: null, impactMap: null, cultureProfile: null, selftune: null, reviewMemory: null, findingCategories: null, inlineCommentsPerCategory: null, minFindingSeverity: null, maxFindings: { ...EMPTY_MAX_FINDINGS_CONFIG }, commentVerbosity: null, pathInstructions: [], instructions: null, excludePaths: [], pathFilters: [], preMergeChecks: [], autoReview: { ...EMPTY_AUTO_REVIEW_CONFIG }, labelingRules: [], aiModel: { ...EMPTY_SELF_HOST_AI_MODEL_CONFIG }, visual: { ...EMPTY_VISUAL_CONFIG }, linkedIssueSatisfaction: null, sharedConfigSource: null };
if (value === undefined || value === null) return empty;
if (typeof value !== "object" || Array.isArray(value)) {
warnings.push(`Manifest field "review" must be a mapping; ignoring it.`);
@@ -1963,7 +1952,6 @@ function parseReviewConfig(value: JsonValue | undefined, warnings: string[]): Fo
const suggestions = normalizeOptionalBoolean(r.suggestions, "review.suggestions", warnings);
const changedFilesSummary = normalizeOptionalBoolean(r.changed_files_summary, "review.changed_files_summary", warnings);
const effortScore = normalizeOptionalBoolean(r.effort_score, "review.effort_score", warnings);
- const testGeneration = normalizeOptionalBoolean(r.test_generation, "review.test_generation", warnings);
const impactMap = normalizeOptionalBoolean(r.impact_map, "review.impact_map", warnings);
const cultureProfile = normalizeOptionalBoolean(r.culture_profile, "review.culture_profile", warnings);
const selftune = normalizeOptionalBoolean(r.selftune, "review.selftune", warnings);
@@ -2005,7 +1993,6 @@ function parseReviewConfig(value: JsonValue | undefined, warnings: string[]): Fo
suggestions !== null ||
changedFilesSummary !== null ||
effortScore !== null ||
- testGeneration !== null ||
impactMap !== null ||
cultureProfile !== null ||
selftune !== null ||
@@ -2034,7 +2021,6 @@ function parseReviewConfig(value: JsonValue | undefined, warnings: string[]): Fo
aiModel,
visual,
linkedIssueSatisfaction,
- testGeneration,
enrichmentAnalyzers,
profile,
tone,
@@ -2139,7 +2125,6 @@ function computeReviewConfigPresent(review: Omit