fix(process): drain label input before reporting guard membership (#793)

Avoid grep -q closing the pipe before printf completes under pipefail.
Exercise the actual guard with a large label snapshot and retain refusal cases.

Issue: #793
User-Visible: no
This commit is contained in:
Matysh
2026-10-05 09:29:54 +03:00
parent 9ebc430983
commit 841bad4e79
2 changed files with 38 additions and 3 deletions
+35 -2
View File
@@ -1106,13 +1106,46 @@ test('r1 #695: guard даёт инфраструктуре без треково
];
for (const [input, limit, why] of cases) {
const r = runGuard(t, input);
assert.equal(r.status, 0, `${why}: ${r.stderr}`);
assert.equal(r.out.stage, 'code', why);
const diagnostic = `${why}\n${r.stdout}\n${r.stderr}`;
assert.equal(r.status, 0, diagnostic);
assert.equal(r.out.stage, 'code', diagnostic);
assert.equal(r.out.limit, String(limit), why);
assert.equal(r.out.labels, input.labels.join(','), `${why}: метки для prepare`);
}
});
test('#793: guard не принимает ранний выход поиска за снятие метки', (t) => {
if (process.platform === 'win32' || spawnSync('bash', ['--version']).status !== 0) { t.skip('bash недоступен'); return; }
// Больше ёмкости обычного pipe: совпадение в начале вынуждает grep -q
// закрыть чтение, пока printf ещё пишет. Без этого свидетель зависит от
// планировщика и может месяцами оставаться зелёным на прежнем коде.
const labels = ['S7-code-review', 'track:ask', ...Array.from({ length: 12_000 }, (_, i) => `n${i}`)];
const r = runGuard(t, { labels, compare: ['scripts/x.mjs'] });
const diagnostic = `${r.stdout}\n${r.stderr}`;
assert.equal(r.status, 0, diagnostic);
assert.equal(r.out.stage, 'code', diagnostic);
assert.equal(r.out.limit, '4', 'явная track:ask остаётся приоритетной');
assert.equal(r.out.labels, labels.join(','), 'весь снимок меток передаётся prepare');
assert.doesNotMatch(r.stdout, /запрос отозван|метка .* уже снята/);
});
test('#793: guard по-прежнему отказывает при снятой метке и блокировках', (t) => {
if (process.platform === 'win32' || spawnSync('bash', ['--version']).status !== 0) { t.skip('bash недоступен'); return; }
const cases = [
[['track:ask'], /запрос отозван/],
[['S7-code-review-extra', 'track:ask'], /запрос отозван/],
[['S7-code-review', 'blocked'], /стоит blocked/],
[['S7-code-review', 'review-4'], /стоит review-4/],
];
for (const [labels, reason] of cases) {
const r = runGuard(t, { labels, compare: ['scripts/x.mjs'] });
const diagnostic = `${labels.join(',')}\n${r.stdout}\n${r.stderr}`;
assert.equal(r.status, 0, diagnostic);
assert.equal(r.out.stage, '', diagnostic);
assert.match(r.stdout, reason);
}
});
// #737: расход сессии модели — последней строкой блока якорей. Строка приходит
// выходом недоверенной стадии и разбирается строго; прежние строки блока и их
// разбор не меняются.