task-packet: track follows issue status and history, not a class-A-free diff

A product issue in S5-S7 whose branch holds only its spec review was
classified as infrastructure and told "class A is forbidden". The track is
now decided by product-flow evidence first (S1-S5 status, "## ТЗ" in the
body, docs/specs file, spec review doc or verdict); the "diff without
class A" heuristic applies only outside the product flow. docs/reviews/**
no longer counts as branch material. Three mutants guard both directions.

Issue: #632
User-Visible: no
This commit is contained in:
Claude
2026-09-24 02:52:09 +00:00
committed by claude[bot]
parent c8f9b5d3b4
commit 10d32312b5
3 changed files with 122 additions and 6 deletions
+33
View File
@@ -3129,6 +3129,39 @@ const MUTANT_DEFINITIONS = [
replace: " releaseSourceViolations: releaseSourceViolationsOf(sha, files),",
}],
},
{
id: 'task-packet-product-flow-overrides-diff',
guard: 'node --test test/task-packet.test.mjs',
because: 'a product S6 issue whose branch holds no class A yet must keep its class A rights; '
+ 'letting the diff heuristic win again prints the false infrastructure ban of #632',
patches: [{
file: 'scripts/task-packet.mjs',
find: " const infrastructure = branch?.infrastructure === true && productFlow.length === 0;",
replace: " const infrastructure = branch?.infrastructure === true;",
}],
},
{
id: 'task-packet-review-docs-not-material',
guard: 'node --test test/task-packet.test.mjs',
because: 'docs/reviews/** is written by the pipeline, not by the task: counting it as '
+ 'material makes a spec-review-only product branch look like infrastructure (#632)',
patches: [{
file: 'scripts/task-packet.mjs',
find: " const material = changedFiles.filter((name) => !name.startsWith('docs/reviews/'));",
replace: " const material = changedFiles;",
}],
},
{
id: 'task-packet-s6-s7-alone-not-product-flow',
guard: 'node --test test/task-packet.test.mjs',
because: 'infrastructure issues enter at S7 and return to S6, so S6/S7 alone must not '
+ 'count as product flow — otherwise a returned infra task loses the class A ban (#632)',
patches: [{
file: 'scripts/task-packet.mjs',
find: " if (PRE_CODE_STATUSES.includes(status)) reasons.push(`статус ${status}`);",
replace: " if (STATUS_LABELS.includes(status)) reasons.push(`статус ${status}`);",
}],
},
{
id: 'fit-house-hidden-walls-vote',
guard: 'node demo/smoke_space_card.mjs',