process: tracks ship/show/ask are set by the owner's label (#695)

The analysis of 85 closed tasks #600-#691 showed that the light track
cost as much as the full one (115 min and 12 events vs 102 and 13) and
that the owner had no label to choose the route. The owner accepted the
proposal on 2026-09-28.

- PROCESS §5 is the track table: track:ship (S1 -> S5, one line under
  "## ТЗ", <= 30 src lines, batch review before the beta), track:show
  (default, S2 -> S5, up to three AC, no spec review, 2 code cycles),
  track:ask (full route). The owner's label beats the criteria, which
  become a hint; any agent may raise a track, only the owner lowers it.
- §5.1: ci:full / ci:golden / ci:mutants order heavy checks on any track;
  small and trivial read as track:show, no label as track:ask, an
  infrastructure task as track:show.
- §2, §2.2, §2.4, §2.5, §4, §7.1, §7.2, §9, §11 follow; AUTHOR/REVIEWER
  digests and AGENTS.md follow with the digest test and its mutants.
- task-packet.mjs reports the track via trackFromLabels(); the pipeline
  reads track:show/track:ship for the cycle limit of 2 and lets an
  explicit track:ask win. Pipeline behaviour by track is #696.

Issue: #695
User-Visible: no
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
This commit is contained in:
Claude
2026-09-28 22:13:21 +03:00
parent 7d4d75bdfb
commit 57ce10721f
9 changed files with 179 additions and 125 deletions
+4 -4
View File
@@ -10262,8 +10262,8 @@ const MUTANT_DEFINITIONS = [
+ 'the digest must fail as soon as an anchor goes stale (#634 AC2)',
patches: [{
file: 'docs/process/AUTHOR.md',
find: '[§5.1](../../PROCESS.md#51-короткий-трек-метка-trivial)',
replace: '[§5.1](../../PROCESS.md#51-короткий-трек)',
find: '[§5.1](../../PROCESS.md#51-метки-тяжёлых-проверок-и-прежние-метки)',
replace: '[§5.1](../../PROCESS.md#51-метки-тяжёлых-проверок)',
}],
},
{
@@ -10273,8 +10273,8 @@ const MUTANT_DEFINITIONS = [
+ 'digest invented or a paraphrase nobody can check (#634 AC2)',
patches: [{
file: 'docs/process/AUTHOR.md',
find: ' нечего ([§5.1](../../PROCESS.md#51-короткий-трек-метка-trivial)).',
replace: ' нечего.',
find: ' `track:show` ([§5.1](../../PROCESS.md#51-метки-тяжёлых-проверок-и-прежние-метки)).',
replace: ' `track:show`.',
}],
},
{
+18 -3
View File
@@ -40,8 +40,8 @@ export function rightsFor(status, labels = [], { infrastructure = false, infrast
lines.push('метка infra — только подсказка, не доказательство и не право: до ветки проверь предполагаемые пути; без class A начинай сразу, при любом class A нужен продуктовый S-flow (#562)');
}
switch (status) {
case 'S1-new': lines.push('следующий шаг: аналитика (S2) — оценки метками, критерий лёгкого трека, затем ТЗ'); break;
case 'S2-analysis': lines.push('следующий шаг: ТЗ (S3); трек по умолчанию small — отказ от него обосновать названным критерием §5'); break;
case 'S1-new': lines.push('следующий шаг: аналитика (S2) — оценки и трек метками (по умолчанию track:show); на track:ship — строка «что меняется и чем проверить» под «## ТЗ», затем S5'); break;
case 'S2-analysis': lines.push('следующий шаг: track:show — до трёх AC под «## ТЗ», затем S5; track:ask — ТЗ (S3) с названным критерием §5'); break;
case 'S3-spec': lines.push('следующий шаг: ТЗ готово → push ветки → метка S4-spec-review (метку после push)'); break;
case 'S4-spec-review': lines.push('идёт ревью ТЗ: ждать вердикт (scripts/wait-verdict.mjs), не править материал'); break;
case 'S5-ready': lines.push('следующий шаг: ветка issue/NN-slug от dev, код по ТЗ, метка S6-in-progress'); break;
@@ -126,6 +126,21 @@ export function branchIsInfrastructure(changedFiles = []) {
const PRE_CODE_STATUSES = ['S1-new', 'S2-analysis', 'S3-spec', 'S4-spec-review', 'S5-ready'];
/**
* Трек продуктовой задачи по меткам (PROCESS §5, #695): `track:ship`,
* `track:show` или `track:ask`; прежние `trivial` и `small` читаются как `show`
* (§5.1), задача без трековой метки — как `ask`. Метки трека не доказывают
* продуктовый поток: инфраструктурной задаче владелец тоже может поставить
* `track:*`, чтобы задать ей цену конвейера.
*/
export function trackFromLabels(labels = []) {
if (labels.includes('track:ship')) return 'ship';
if (labels.includes('track:show')) return 'show';
if (labels.includes('track:ask')) return 'ask';
if (labels.includes('trivial') || labels.includes('small')) return 'show';
return 'ask';
}
/**
* Признаки продуктового S-flow (#632). Инфраструктурная задача входит в поток
* сразу на S7 и никогда не несёт S1–S5, ТЗ и ревью ТЗ; поэтому любой из этих
@@ -165,7 +180,7 @@ export function buildPacket(inputs) {
const track = infrastructure
? 'инфраструктурный'
: infrastructureHint ? 'инфраструктурный (предварительно; подтвердить путями/diff)'
: labels.includes('trivial') ? 'trivial' : labels.includes('small') ? 'small' : 'полный';
: trackFromLabels(labels);
const stage = status === 'S4-spec-review' || status === 'S3-spec' || status === 'S5-ready' ? 'spec' : 'code';
const verdict = lastVerdict(comments, reviewDocs, stage);
// ТЗ живёт в теле issue (#517); архивный файл — источник только у задач до