mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-04 18:36:54 +02:00
test: fold per-incident replay series into their detector owners (D)
Twelve detector families move into one owner test each: 73 incident files become describe blocks in ceo-section-loading-fixture (stale-fill race), model-overlays, coverage-audit-evidence, autoplan-phase-observer, native-auto-decide, outside-voice-evidence, eng-first-review, plan-count-completion, plan-count-file-permission, ceo-mode-option, plan-scope-selection and plan-count-prerequisite. Each block keeps its original code and fixture, so every case still runs; only tests asserting the incident file's own touchfile registration are dropped (41). Touchfile lists that named an incident now name its owner.
This commit is contained in:
1 parent
6415690a18
commit
0489bc9fe8
89 files changed
+8091
-8373
No files matched your search
@@ -6,6 +6,8 @@ import { pathToFileURL } from 'node:url';
|
||||
import { autoplanPhaseCompletions } from './helpers/autoplan-phase-observer';
|
||||
import type { PlanCountTranscript } from './helpers/plan-count-transcript';
|
||||
import { E2E_TOUCHFILES, selectTests } from './helpers/touchfiles';
|
||||
import fixture_autoplan_phase_dash_ao from './fixtures/autoplan-phase-dash-ao.json';
|
||||
import actual_autoplan_with_result_au from './fixtures/autoplan-with-result-au.json';
|
||||
|
||||
const START = Date.parse('2026-09-08T16:00:00.000Z');
|
||||
const transcript = (...messages: Array<[number, string]>): PlanCountTranscript => ({
|
||||
@@ -298,3 +300,191 @@ try {
|
||||
}
|
||||
}, 15_000);
|
||||
});
|
||||
|
||||
describe('autoplan-phase-dash-ao', () => {
|
||||
const fixture = fixture_autoplan_phase_dash_ao;
|
||||
const at = Date.parse(fixture.message.timestamp);
|
||||
const transcript = (text = fixture.message.text): PlanCountTranscript => ({
|
||||
status: 'ready', calls: [], assistantMessages: [{ ...fixture.message, text }],
|
||||
});
|
||||
const hits = (text: string) => autoplanPhaseCompletions(transcript(text), at - 1);
|
||||
|
||||
test('exact owned DX dash declaration adds only DX at its native timestamp', () => {
|
||||
expect(hits(fixture.message.text)).toEqual([{ phase: 2.5, ts: at }]);
|
||||
const all = autoplanPhaseCompletions({ status: 'ready', calls: [],
|
||||
assistantMessages: fixture.orderedMessages }, fixture.commandLowerBound);
|
||||
expect(all).toEqual([...fixture.actualHits, { phase: 2.5, ts: at }]);
|
||||
expect(all.map(hit => hit.phase)).toEqual([1, 2, 2.5]);
|
||||
});
|
||||
|
||||
test('em and en dash spacing share the existing completed declaration forms', () => {
|
||||
for (const dash of ['—', '–']) for (const before of ['', ' ']) for (const after of ['', ' ']) {
|
||||
expect(hits(fixture.message.text.replace('complete—', `complete${before}${dash}${after}`)))
|
||||
.toEqual([{ phase: 2.5, ts: at }]);
|
||||
for (const phase of [1, 2, 2.5, 3]) for (const state of ['complete', 'completed', 'done', 'finished', 'wrapped up']) {
|
||||
expect(hits(`Phase ${phase} is ${state}${before}${dash}${after}Work retained.`))
|
||||
.toEqual([{ phase, ts: at }]);
|
||||
}
|
||||
}
|
||||
expect(hits('**Phase 2.5 complete** — Work retained.')).toEqual([{ phase: 2.5, ts: at }]);
|
||||
});
|
||||
|
||||
test('dash continuations cannot turn a conditional, quotation, question or denial into completion', () => {
|
||||
for (const dash of ['—', '–']) for (const tail of [
|
||||
'', 'if approved.', 'unless the checks fail.', 'when review finishes.',
|
||||
'once the reviewer signs off.', 'pending final checks.', 'maybe tomorrow.',
|
||||
'perhaps it is complete.', 'would be complete after review.',
|
||||
'not complete yet.', 'the phase is not complete.', 'this completion is withdrawn.',
|
||||
'actually never finished.', 'this completion is superseded.',
|
||||
'provided the remaining checks pass.', 'this completion is rejected.',
|
||||
'the completion announcement is retracted.', 'actually incomplete.',
|
||||
'the review remains pending.', 'Work retained?', 'is this complete?',
|
||||
'Source excerpt: Work retained.', 'Earlier review: Work retained.',
|
||||
'the historical example says work is retained.', '"Work retained."',
|
||||
]) expect(hits(`Phase 2.5 complete ${dash} ${tail}`), tail).toEqual([]);
|
||||
for (const text of [
|
||||
'If approved, Phase 2.5 complete—Work retained.',
|
||||
'Phase 2.5 is not complete—Work retained.',
|
||||
'Phase 2.5 complete?—Work retained.',
|
||||
'> Phase 2.5 complete—Work retained.',
|
||||
'"Phase 2.5 complete—Work retained."',
|
||||
'Source excerpt:\nPhase 2.5 complete—Work retained.',
|
||||
'Example:\nPhase 2.5 complete—Work retained.\nPhase 3 complete—Work retained.',
|
||||
'```text\nPhase 2.5 complete—Work retained.\n```',
|
||||
' Phase 2.5 complete—Work retained.',
|
||||
'# Phase 2.5 complete—Work retained.',
|
||||
'Phase 2.5 (Eng review) complete—Work retained.',
|
||||
]) expect(hits(text), text).toEqual([]);
|
||||
});
|
||||
|
||||
test('dash support keeps ready/current native evidence and first-hit ordering', () => {
|
||||
for (const status of ['missing', 'error'] as const) {
|
||||
expect(autoplanPhaseCompletions({ ...transcript(), status }, at - 1)).toEqual([]);
|
||||
}
|
||||
expect(autoplanPhaseCompletions(transcript(), at + 1)).toEqual([]);
|
||||
expect(autoplanPhaseCompletions({ ...transcript(), assistantMessages: [
|
||||
{ ...fixture.message, timestamp: 'invalid' },
|
||||
] }, at - 1)).toEqual([]);
|
||||
const later = { ...fixture.message, timestamp: new Date(at + 1).toISOString() };
|
||||
expect(autoplanPhaseCompletions({ ...transcript(), assistantMessages: [later, fixture.message] }, at - 1))
|
||||
.toEqual([{ phase: 2.5, ts: at }]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('autoplan-with-result-au', () => {
|
||||
const actual = actual_autoplan_with_result_au;
|
||||
const at=Date.parse(actual.timestamp);
|
||||
const transcript=(text=actual.text):PlanCountTranscript=>({status:'ready',calls:[],assistantMessages:[{...actual,text}]});
|
||||
const observe=(text:string)=>autoplanPhaseCompletions(transcript(text),at-1);
|
||||
|
||||
test('the exact first AU DX completion retains its native timestamp without crediting the Eng transition',()=>{
|
||||
expect(autoplanPhaseCompletions(transcript(),at-1)).toEqual([{phase:2.5,ts:at}]);
|
||||
expect(actual.sessionId).toBe('78ce9c42-e5f7-4595-81ea-7d9bb8b4345c');
|
||||
expect(actual.timestamp).toBe('2026-09-10T21:35:46.209Z');
|
||||
});
|
||||
|
||||
test('affirmative result clauses share phase identity and the existing completion vocabulary',()=>{
|
||||
for(const [phase,name] of [[1,'CEO'],[2,'Design review'],[2.5,'DX'],[3,'Engineering review']] as const)
|
||||
for(const state of ['complete','completed','done','finished','wrapped up'])
|
||||
for(const result of ['22 findings recorded in the plan.','the score at 8/10.','all adopted changes written; moving to the next phase.']) {
|
||||
expect(observe(`Phase ${phase} (${name}) is ${state} with ${result}`)).toEqual([{phase,ts:at}]);
|
||||
}
|
||||
expect(observe('**Phase 2.5 wrapped up** with 22 findings retained.')).toEqual([{phase:2.5,ts:at}]);
|
||||
});
|
||||
|
||||
const rejected=[
|
||||
'Phase 2.5 wrapped up with ',
|
||||
'Phase 2.5 wrapped up without the review.',
|
||||
'Phase 2.5 will be complete with 22 findings.',
|
||||
'Phase 2.5 is not complete with 22 findings.',
|
||||
'Phase 2.5 complete with no completed review.',
|
||||
'Phase 2.5 complete with findings still pending.',
|
||||
'Phase 2.5 complete with 22 findings if the review finishes.',
|
||||
'Phase 2.5 complete with 22 findings once approved.',
|
||||
'Phase 2.5 complete with 22 findings when the review ends.',
|
||||
'Phase 2.5 complete with 22 findings unless the review fails.',
|
||||
'Phase 2.5 complete with 22 findings provided the reviewer agrees.',
|
||||
'Phase 2.5 complete with 22 findings?','Phase 2.5 complete with results that will arrive tomorrow.',
|
||||
'Phase 2.5 complete with maybe 22 findings.','Phase 2.5 complete with an unfinished review.',
|
||||
'Phase 2.5 complete with 22 findings. This phase is withdrawn.',
|
||||
'Phase 2.5 complete with 22 findings. This phase is "withdrawn".',
|
||||
'Phase 2.5 complete with 22 findings. This phase is not complete.',
|
||||
'Phase 2.5 complete with 22 findings. This phase is retracted.',
|
||||
'Phase 2.5 complete with 22 findings. The declaration is superseded.',
|
||||
'Phase 2.5 complete with a historical example.',
|
||||
'Phase 2.5 complete with source instructions.',
|
||||
'Phase 2.5 complete with "22 findings recorded".',
|
||||
'Phase 2.5 complete with \'22 findings recorded\'.',
|
||||
'Phase 2.5 (Design) complete with 22 findings.',
|
||||
'Phase 2.5 (DX review if approved) complete with 22 findings.',
|
||||
'Phase 4 complete with 22 findings.','Phase 2.1 complete with 22 findings.',
|
||||
'# Phase 2.5 complete with 22 findings.',
|
||||
'> Phase 2.5 complete with 22 findings.',
|
||||
'"Phase 2.5 complete with 22 findings."',
|
||||
'- Phase 2.5 complete with 22 findings.',
|
||||
'| Phase 2.5 complete with 22 findings. |',
|
||||
' Phase 2.5 complete with 22 findings.',
|
||||
'\tPhase 2.5 complete with 22 findings.',
|
||||
'```text\nPhase 2.5 complete with 22 findings.\n```',
|
||||
'~~~text\nPhase 2.5 complete with 22 findings.\n~~~',
|
||||
'Source:\nPhase 2.5 complete with 22 findings.',
|
||||
'Historical example:\nPhase 2.5 complete with 22 findings.',
|
||||
'Historical review:\nPhase 2.5 complete with 22 findings.',
|
||||
'**Historical review:**\nPhase 2.5 complete with 22 findings.',
|
||||
'**Source:**\nPhase 2.5 complete with 22 findings.',
|
||||
'Hypothetical scenario:\nPhase 2.5 complete with 22 findings.',
|
||||
'Phase 2.5 complete with 22 findings.\n```text\nexample text\n````\nThis phase is withdrawn.',
|
||||
'Earlier review:\nPhase 2.5 complete with 22 findings.',
|
||||
'Phase 2.5 complete with a hypothetical 8/10 score.',
|
||||
'Phase 2.5 complete with 22 findings.\nThis phase is withdrawn.',
|
||||
'Phase 2.5 complete with 22 findings.\nThis phase is \"withdrawn\".',
|
||||
'Phase 2.5 complete with 22 findings.\n**Phase 2.5** is ‘withdrawn’.',
|
||||
'Phase 2.5 complete with 22 findings.\nCurrent status: this phase is no longer current.',
|
||||
'The template says:\n\nPhase 2.5 complete with 22 findings.',
|
||||
'Example:\nPhase 1 complete with findings.\nPhase 2.5 complete with findings.',
|
||||
];
|
||||
test.each(rejected)('%s cannot supply completion',text=>expect(observe(text)).toEqual([]));
|
||||
|
||||
test('quoted summaries retain their existing concrete-consensus requirement',()=>{
|
||||
const summary='> Phase 2.5 complete with 22 findings retained.\n> Consensus: 22/22 accepted.\n> Moving to Phase 3.';
|
||||
expect(observe(summary)).toEqual([{phase:2.5,ts:at}]);
|
||||
for(const text of [summary.replace('22/22','[N]/22'),'Example:\n'+summary,summary.replace('22/22','X/Y')])
|
||||
expect(observe(text)).toEqual([]);
|
||||
});
|
||||
|
||||
test('native readiness, timestamp, duplicate and observed-order rules remain intact',()=>{
|
||||
for(const status of ['missing','error'] as const)
|
||||
expect(autoplanPhaseCompletions({...transcript(),status},at-1)).toEqual([]);
|
||||
expect(autoplanPhaseCompletions(transcript(),at+1)).toEqual([]);
|
||||
expect(autoplanPhaseCompletions({...transcript(),assistantMessages:[{...actual,timestamp:'invalid'}]},at-1)).toEqual([]);
|
||||
const data=transcript();data.assistantMessages.push({...actual,timestamp:new Date(at+1).toISOString()});
|
||||
expect(autoplanPhaseCompletions(data,at-1)).toEqual([{phase:2.5,ts:at}]);
|
||||
data.assistantMessages.unshift({...actual,text:'Phase 3 complete with 7 findings retained.',timestamp:new Date(at-10).toISOString()});
|
||||
expect(autoplanPhaseCompletions(data,at-11)).toEqual([{phase:3,ts:at-10},{phase:2.5,ts:at}]);
|
||||
});
|
||||
test('quoted history and a foreign phase withdrawal do not cancel the current completed result',()=>{
|
||||
for(const suffix of [
|
||||
'> This phase is withdrawn.',
|
||||
'Historical note: "This phase is withdrawn."',
|
||||
'Example:\nThis phase is withdrawn.',
|
||||
'```text\nThis phase is withdrawn.\n```',
|
||||
'Phase 2 is withdrawn.',
|
||||
'Phase 3 complete.\nThis phase is withdrawn.',
|
||||
]) expect(observe('Phase 2.5 complete with 22 findings retained.\n'+suffix).some(hit=>hit.phase===2.5)).toBe(true);
|
||||
expect(observe('Phase 2.5 complete with 22 findings.\nHistorical note:\nThis phase is withdrawn.\nCurrent status: Phase 2.5 is withdrawn.')).toEqual([]);
|
||||
});
|
||||
|
||||
|
||||
test('a current Markdown status heading resets historical context for an owned withdrawal',()=>{
|
||||
const prefix='Phase 2.5 complete with 22 findings retained.\nHistorical note:\nThis phase is withdrawn.\n';
|
||||
expect(observe(prefix+'## Current status\nPhase 2.5 is withdrawn.')).toEqual([]);
|
||||
expect(observe(prefix+'`## Current status`\nThis phase is withdrawn.')).toEqual([{phase:2.5,ts:at}]);
|
||||
});
|
||||
|
||||
test('inline code around an owned status is scalar formatting while a whole quoted statement stays literal',()=>{
|
||||
const prefix='Phase 2.5 complete with 22 findings retained.\n';
|
||||
expect(observe(prefix+'This phase is `withdrawn`.')).toEqual([]);
|
||||
for(const literal of ['`This phase is withdrawn.`','"This phase is withdrawn."','```text\nThis phase is withdrawn.\n```'])
|
||||
expect(observe(prefix+literal)).toEqual([{phase:2.5,ts:at}]);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user