@sun-asterisk/sungen 3.3.0-alpha.5 → 3.3.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/cli/commands/contract-derive-command.d.ts.map +1 -1
  2. package/dist/cli/commands/contract-derive-command.js +2 -0
  3. package/dist/cli/commands/contract-derive-command.js.map +1 -1
  4. package/dist/cli/commands/delivery.d.ts.map +1 -1
  5. package/dist/cli/commands/delivery.js +21 -3
  6. package/dist/cli/commands/delivery.js.map +1 -1
  7. package/dist/cli/commands/generate.d.ts.map +1 -1
  8. package/dist/cli/commands/generate.js +3 -1
  9. package/dist/cli/commands/generate.js.map +1 -1
  10. package/dist/cli/commands/next.d.ts +5 -2
  11. package/dist/cli/commands/next.d.ts.map +1 -1
  12. package/dist/cli/commands/next.js +14 -1
  13. package/dist/cli/commands/next.js.map +1 -1
  14. package/dist/cli/commands/triage.d.ts +2 -1
  15. package/dist/cli/commands/triage.d.ts.map +1 -1
  16. package/dist/cli/commands/triage.js +42 -2
  17. package/dist/cli/commands/triage.js.map +1 -1
  18. package/dist/cli/commands/update.d.ts.map +1 -1
  19. package/dist/cli/commands/update.js +6 -2
  20. package/dist/cli/commands/update.js.map +1 -1
  21. package/dist/cli/index.js +4 -0
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/cli/json-error-on-exit.d.ts +34 -0
  24. package/dist/cli/json-error-on-exit.d.ts.map +1 -0
  25. package/dist/cli/json-error-on-exit.js +63 -0
  26. package/dist/cli/json-error-on-exit.js.map +1 -0
  27. package/dist/cli/waiting-for-you-block.d.ts +15 -0
  28. package/dist/cli/waiting-for-you-block.d.ts.map +1 -0
  29. package/dist/cli/waiting-for-you-block.js +19 -0
  30. package/dist/cli/waiting-for-you-block.js.map +1 -0
  31. package/dist/contract/derive-free-feature.d.ts +2 -0
  32. package/dist/contract/derive-free-feature.d.ts.map +1 -1
  33. package/dist/contract/derive-free-feature.js +22 -0
  34. package/dist/contract/derive-free-feature.js.map +1 -1
  35. package/dist/decisions/decision-schema.d.ts +2 -1
  36. package/dist/decisions/decision-schema.d.ts.map +1 -1
  37. package/dist/decisions/decision-schema.js +2 -1
  38. package/dist/decisions/decision-schema.js.map +1 -1
  39. package/dist/decisions/legacy-waiver-migration.d.ts +2 -0
  40. package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -1
  41. package/dist/decisions/legacy-waiver-migration.js +5 -2
  42. package/dist/decisions/legacy-waiver-migration.js.map +1 -1
  43. package/dist/graph/board-human-actions.d.ts +5 -0
  44. package/dist/graph/board-human-actions.d.ts.map +1 -0
  45. package/dist/graph/board-human-actions.js +83 -0
  46. package/dist/graph/board-human-actions.js.map +1 -0
  47. package/dist/graph/evaluate-graph.d.ts +16 -0
  48. package/dist/graph/evaluate-graph.d.ts.map +1 -1
  49. package/dist/graph/evaluate-graph.js +29 -6
  50. package/dist/graph/evaluate-graph.js.map +1 -1
  51. package/dist/graph/human-action.d.ts +21 -0
  52. package/dist/graph/human-action.d.ts.map +1 -0
  53. package/dist/graph/human-action.js +3 -0
  54. package/dist/graph/human-action.js.map +1 -0
  55. package/dist/graph/manual-triage-decisions.d.ts +19 -0
  56. package/dist/graph/manual-triage-decisions.d.ts.map +1 -0
  57. package/dist/graph/manual-triage-decisions.js +53 -0
  58. package/dist/graph/manual-triage-decisions.js.map +1 -0
  59. package/dist/graph/node-decl.d.ts +9 -0
  60. package/dist/graph/node-decl.d.ts.map +1 -1
  61. package/dist/graph/node-decl.js +4 -1
  62. package/dist/graph/node-decl.js.map +1 -1
  63. package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -1
  64. package/dist/graph/nodes/test-case-contract-nodes.js +16 -3
  65. package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -1
  66. package/dist/graph/nodes/test-case-nodes.d.ts +3 -0
  67. package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -1
  68. package/dist/graph/nodes/test-case-nodes.js +33 -4
  69. package/dist/graph/nodes/test-case-nodes.js.map +1 -1
  70. package/dist/graph/nodes/unit-audit-nodes.d.ts.map +1 -1
  71. package/dist/graph/nodes/unit-audit-nodes.js +1 -0
  72. package/dist/graph/nodes/unit-audit-nodes.js.map +1 -1
  73. package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -1
  74. package/dist/graph/nodes/unit-contract-node.js +8 -0
  75. package/dist/graph/nodes/unit-contract-node.js.map +1 -1
  76. package/dist/graph/test-case-results.d.ts +1 -0
  77. package/dist/graph/test-case-results.d.ts.map +1 -1
  78. package/dist/graph/test-case-results.js +27 -3
  79. package/dist/graph/test-case-results.js.map +1 -1
  80. package/dist/graph/test-case-satisfied.d.ts +5 -4
  81. package/dist/graph/test-case-satisfied.d.ts.map +1 -1
  82. package/dist/graph/test-case-satisfied.js +4 -0
  83. package/dist/graph/test-case-satisfied.js.map +1 -1
  84. package/dist/graph/test-case-state-shape.d.ts +7 -1
  85. package/dist/graph/test-case-state-shape.d.ts.map +1 -1
  86. package/dist/graph/unit-results-freshness.d.ts +29 -0
  87. package/dist/graph/unit-results-freshness.d.ts.map +1 -0
  88. package/dist/graph/unit-results-freshness.js +213 -0
  89. package/dist/graph/unit-results-freshness.js.map +1 -0
  90. package/dist/harness/audit.d.ts +3 -2
  91. package/dist/harness/audit.d.ts.map +1 -1
  92. package/dist/harness/audit.js +4 -17
  93. package/dist/harness/audit.js.map +1 -1
  94. package/dist/harness/catalog/gate-rules.yaml +1 -1
  95. package/dist/harness/defect-draft.d.ts.map +1 -1
  96. package/dist/harness/defect-draft.js +12 -2
  97. package/dist/harness/defect-draft.js.map +1 -1
  98. package/dist/harness/defects.d.ts +14 -0
  99. package/dist/harness/defects.d.ts.map +1 -1
  100. package/dist/harness/defects.js +14 -10
  101. package/dist/harness/defects.js.map +1 -1
  102. package/dist/harness/flow-check.d.ts +9 -0
  103. package/dist/harness/flow-check.d.ts.map +1 -1
  104. package/dist/harness/flow-check.js +11 -0
  105. package/dist/harness/flow-check.js.map +1 -1
  106. package/dist/harness/gates/audit-gate-verdict.d.ts.map +1 -1
  107. package/dist/harness/gates/audit-gate-verdict.js +2 -1
  108. package/dist/harness/gates/audit-gate-verdict.js.map +1 -1
  109. package/dist/harness/gates/audit-input-hash.d.ts +2 -0
  110. package/dist/harness/gates/audit-input-hash.d.ts.map +1 -1
  111. package/dist/harness/gates/audit-input-hash.js +30 -2
  112. package/dist/harness/gates/audit-input-hash.js.map +1 -1
  113. package/dist/harness/gates/audit-report-verification.js +1 -1
  114. package/dist/harness/gates/audit-report-verification.js.map +1 -1
  115. package/dist/harness/gates/delivery-checklist.d.ts +3 -0
  116. package/dist/harness/gates/delivery-checklist.d.ts.map +1 -1
  117. package/dist/harness/gates/delivery-checklist.js +37 -4
  118. package/dist/harness/gates/delivery-checklist.js.map +1 -1
  119. package/dist/harness/gates/in-run-decision-check.d.ts.map +1 -1
  120. package/dist/harness/gates/in-run-decision-check.js +21 -1
  121. package/dist/harness/gates/in-run-decision-check.js.map +1 -1
  122. package/dist/harness/journey.d.ts +21 -0
  123. package/dist/harness/journey.d.ts.map +1 -1
  124. package/dist/harness/journey.js +61 -11
  125. package/dist/harness/journey.js.map +1 -1
  126. package/dist/harness/next-step.d.ts +17 -0
  127. package/dist/harness/next-step.d.ts.map +1 -1
  128. package/dist/harness/next-step.js +19 -0
  129. package/dist/harness/next-step.js.map +1 -1
  130. package/dist/harness/triage-manual-classification.d.ts +32 -0
  131. package/dist/harness/triage-manual-classification.d.ts.map +1 -0
  132. package/dist/harness/triage-manual-classification.js +56 -0
  133. package/dist/harness/triage-manual-classification.js.map +1 -0
  134. package/dist/harness/unit-paths.d.ts +8 -0
  135. package/dist/harness/unit-paths.d.ts.map +1 -1
  136. package/dist/harness/unit-paths.js +23 -1
  137. package/dist/harness/unit-paths.js.map +1 -1
  138. package/dist/hooks/guard-tty-spoof-rule.d.ts +3 -1
  139. package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -1
  140. package/dist/hooks/guard-tty-spoof-rule.js +3 -2
  141. package/dist/hooks/guard-tty-spoof-rule.js.map +1 -1
  142. package/dist/hooks/hand-back-core.d.ts +1 -1
  143. package/dist/hooks/hand-back-core.d.ts.map +1 -1
  144. package/dist/hooks/hand-back-core.js +4 -2
  145. package/dist/hooks/hand-back-core.js.map +1 -1
  146. package/dist/hooks/session-start-unit-state-hook.d.ts +2 -1
  147. package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -1
  148. package/dist/hooks/session-start-unit-state-hook.js +4 -1
  149. package/dist/hooks/session-start-unit-state-hook.js.map +1 -1
  150. package/dist/hooks/stop-next-step-hook.d.ts.map +1 -1
  151. package/dist/hooks/stop-next-step-hook.js +1 -0
  152. package/dist/hooks/stop-next-step-hook.js.map +1 -1
  153. package/dist/orchestrator/templates/ai-src/commands/delivery.md +2 -0
  154. package/dist/orchestrator/templates/ai-src/commands/review.md +2 -0
  155. package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.claude.md +11 -0
  156. package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
  157. package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
  158. package/package.json +3 -3
  159. package/src/cli/commands/contract-derive-command.ts +1 -0
  160. package/src/cli/commands/delivery.ts +20 -3
  161. package/src/cli/commands/generate.ts +3 -1
  162. package/src/cli/commands/next.ts +14 -3
  163. package/src/cli/commands/triage.ts +38 -2
  164. package/src/cli/commands/update.ts +6 -2
  165. package/src/cli/index.ts +4 -0
  166. package/src/cli/json-error-on-exit.ts +72 -0
  167. package/src/cli/waiting-for-you-block.ts +23 -0
  168. package/src/contract/derive-free-feature.ts +21 -0
  169. package/src/decisions/decision-schema.ts +2 -1
  170. package/src/decisions/legacy-waiver-migration.ts +5 -1
  171. package/src/graph/board-human-actions.ts +80 -0
  172. package/src/graph/evaluate-graph.ts +37 -8
  173. package/src/graph/human-action.ts +33 -0
  174. package/src/graph/manual-triage-decisions.ts +55 -0
  175. package/src/graph/node-decl.ts +11 -0
  176. package/src/graph/nodes/test-case-contract-nodes.ts +20 -4
  177. package/src/graph/nodes/test-case-nodes.ts +37 -5
  178. package/src/graph/nodes/unit-audit-nodes.ts +2 -1
  179. package/src/graph/nodes/unit-contract-node.ts +12 -1
  180. package/src/graph/test-case-results.ts +25 -4
  181. package/src/graph/test-case-satisfied.ts +7 -4
  182. package/src/graph/test-case-state-shape.ts +7 -2
  183. package/src/graph/unit-results-freshness.ts +165 -0
  184. package/src/harness/audit.ts +4 -13
  185. package/src/harness/catalog/gate-rules.yaml +1 -1
  186. package/src/harness/defect-draft.ts +13 -2
  187. package/src/harness/defects.ts +22 -9
  188. package/src/harness/flow-check.ts +11 -0
  189. package/src/harness/gates/audit-gate-verdict.ts +2 -1
  190. package/src/harness/gates/audit-input-hash.ts +27 -3
  191. package/src/harness/gates/audit-report-verification.ts +2 -2
  192. package/src/harness/gates/delivery-checklist.ts +37 -5
  193. package/src/harness/gates/in-run-decision-check.ts +22 -1
  194. package/src/harness/journey.ts +79 -8
  195. package/src/harness/next-step.ts +31 -1
  196. package/src/harness/triage-manual-classification.ts +76 -0
  197. package/src/harness/unit-paths.ts +19 -0
  198. package/src/hooks/guard-tty-spoof-rule.ts +6 -3
  199. package/src/hooks/hand-back-core.ts +4 -2
  200. package/src/hooks/session-start-unit-state-hook.ts +4 -1
  201. package/src/hooks/stop-next-step-hook.ts +1 -0
  202. package/src/orchestrator/templates/ai-src/commands/delivery.md +2 -0
  203. package/src/orchestrator/templates/ai-src/commands/review.md +2 -0
  204. package/src/orchestrator/templates/ai-src/partials/waiting-for-you.claude.md +11 -0
  205. package/src/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
  206. package/src/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
@@ -6,6 +6,7 @@ export interface CaseOutcome {
6
6
  resultFiles: string[];
7
7
  stale?: string;
8
8
  triage?: TestCaseState['triage'];
9
+ evidence?: string;
9
10
  }
10
11
  export declare function caseOutcomes(projectRoot: string, unitDir: string, unit: string, unitId: string, cases: FeatureCase[]): CaseOutcome[];
11
12
  //# sourceMappingURL=test-case-results.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-case-results.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7E,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAAE;AAuCvJ,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAwBpI"}
1
+ {"version":3,"file":"test-case-results.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7E,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAgD1K,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA8BpI"}
@@ -43,13 +43,19 @@ exports.caseOutcomes = caseOutcomes;
43
43
  * stale the run manifest (`sungen changed`) selects the scenario: its steps/tags, a selector or a
44
44
  * test-data key it uses, or a project input changed since the recorded run
45
45
  * triage the rows of `.sungen/triage/<unit>.json` for the case, only when that triage is not
46
- * older than the case's result files (a re-run voids it)
46
+ * older than the case's result files (a re-run voids it) — unless a manual classification
47
+ * in force judged this very red (manual-triage-decisions.ts, #928): that one wins
48
+ * evidence a red case's hash of its red final attempts (file, title, status, start, duration,
49
+ * messages): what a manual classification is bound to
47
50
  */
51
+ const crypto_1 = require("crypto");
48
52
  const fs = __importStar(require("fs"));
49
53
  const path = __importStar(require("path"));
54
+ const decision_identity_1 = require("../decisions/decision-identity");
50
55
  const playwright_report_parser_1 = require("../exporters/playwright-report-parser");
51
56
  const run_manifest_1 = require("../harness/run-manifest");
52
57
  const triage_unit_1 = require("../harness/triage-unit");
58
+ const manual_triage_decisions_1 = require("./manual-triage-decisions");
53
59
  const unit_artifact_probes_1 = require("./unit-artifact-probes");
54
60
  const RED = new Set(['failed', 'timedOut', 'interrupted']);
55
61
  /** The class a case shows when its rows disagree: what needs a human first. */
@@ -104,19 +110,32 @@ function triageRows(projectRoot, unitId) {
104
110
  ? report.rows.filter((r) => r && typeof r.scenario === 'string' && TRIAGE_PRECEDENCE.includes(r.class)) : [];
105
111
  return { at: report && typeof report.generatedAt === 'string' ? Date.parse(report.generatedAt) : NaN, rows };
106
112
  }
113
+ /** The red final attempts of one case, hashed: the same red reads the same; a re-run (new start, duration) does not. */
114
+ function redEvidence(projectRoot, reds) {
115
+ const rows = reds.map(({ file, key, r }) => ({
116
+ file: path.relative(projectRoot, file).split(path.sep).join('/'), key, status: r.status,
117
+ startTime: r.startTime ?? null, duration: r.duration ?? null, messages: r.errorMessages ?? (r.error ? [r.error] : []),
118
+ })).sort((a, b) => (`${a.file}\n${a.key}` < `${b.file}\n${b.key}` ? -1 : 1));
119
+ return (0, crypto_1.createHash)('sha256').update((0, decision_identity_1.canonicalJson)(rows)).digest('hex');
120
+ }
107
121
  function caseOutcomes(projectRoot, unitDir, unit, unitId, cases) {
108
122
  const byFeature = resultsByFeature(projectRoot, unit, unitId);
109
123
  const stale = staleReasons(projectRoot, unitDir, unit);
110
124
  const triage = triageRows(projectRoot, unitId);
125
+ const manual = (0, manual_triage_decisions_1.manualClassifications)(projectRoot, unitDir);
111
126
  return cases.map((c) => {
112
127
  const statuses = [];
113
128
  const files = [];
129
+ const reds = [];
114
130
  for (const { file, report } of byFeature.get(c.featureBase) ?? []) {
115
- const mine = [...report.entries()].filter(([key]) => ownsTitle(key, c.title)).map(([, r]) => r.status);
131
+ const mine = [...report.entries()].filter(([key]) => ownsTitle(key, c.title));
116
132
  if (mine.length) {
117
- statuses.push(...mine);
133
+ statuses.push(...mine.map(([, r]) => r.status));
118
134
  files.push(file);
119
135
  }
136
+ for (const [key, r] of mine)
137
+ if (RED.has(r.status))
138
+ reds.push({ file, key, r });
120
139
  }
121
140
  const result = statuses.some((s) => RED.has(s)) ? 'failed'
122
141
  : statuses.includes('passed') ? 'passed' : statuses.includes('skipped') ? 'skipped' : 'never-run';
@@ -126,11 +145,16 @@ function caseOutcomes(projectRoot, unitDir, unit, unitId, cases) {
126
145
  };
127
146
  if (result !== 'never-run' && stale[c.title])
128
147
  out.stale = stale[c.title];
148
+ if (result === 'failed')
149
+ out.evidence = redEvidence(projectRoot, reds);
129
150
  const current = !Number.isNaN(triage.at) && files.every((f) => mtime(f) <= triage.at);
130
151
  const rows = current ? triage.rows.filter((r) => rowOwns(r.scenario, c.title)) : [];
131
152
  const worst = TRIAGE_PRECEDENCE.find((cls) => rows.some((r) => r.class === cls));
132
153
  if (worst)
133
154
  out.triage = { class: worst, ruleId: rows.find((r) => r.class === worst).ruleId };
155
+ const byHand = (0, manual_triage_decisions_1.manualClassificationFor)(manual, c.id, out.evidence);
156
+ if (byHand)
157
+ out.triage = { class: byHand.class, ruleId: 'manual', decision: byHand.decision };
134
158
  return out;
135
159
  });
136
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-case-results.js","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-case-results.js","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"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"}
@@ -8,13 +8,14 @@
8
8
  * trigger — what the case needs otherwise, first match wins:
9
9
  * never run → run · result older than the scenario (run manifest) → rerun-stale ·
10
10
  * red with no current triage, or left `unclassified` by it → triage (a classification
11
- * is still owed) · triaged product-candidate → a QA decision
12
- * A pass — Pass (Mocked) included — needs nothing. A red triaged test-defect / environment has been
13
- * judged; the triage report and the deliverable carry it (no P0 node — a P1 follow-up).
11
+ * is still owed) · triaged product-candidate → a QA decision · triaged environment →
12
+ * rerun-environment (once it is up) · triaged test-defect → fix-test (#928)
13
+ * A pass — Pass (Mocked) included — needs nothing. The class may be `sungen triage`'s or a manual
14
+ * classification in force (manual-triage-decisions.ts); test-case-results.ts decides which.
14
15
  */
15
16
  import type { TestCaseState } from './test-case-state-shape';
16
17
  export type TestCaseExemption = 'manual' | 'requires' | 'known-defect' | 'deferred' | 'blocked-capability';
17
- export type TestCaseNeed = 'run' | 'rerun-stale' | 'triage' | 'product-candidate';
18
+ export type TestCaseNeed = 'run' | 'rerun-stale' | 'triage' | 'product-candidate' | 'rerun-environment' | 'fix-test';
18
19
  /** Why the case is satisfied regardless of its result, or null when it is not exempt. */
19
20
  export declare function exemptionOf(tc: TestCaseState): TestCaseExemption | null;
20
21
  /** What the case would need if it were not exempt. */
@@ -1 +1 @@
1
- {"version":3,"file":"test-case-satisfied.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAC3G,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,GAAG,mBAAmB,CAAC;AAIlF,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,GAAG,iBAAiB,GAAG,IAAI,CAOvE;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAQhE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAEnE;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAO7D"}
1
+ {"version":3,"file":"test-case-satisfied.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAC3G,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,UAAU,CAAC;AAIrH,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,GAAG,iBAAiB,GAAG,IAAI,CAOvE;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAUhE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAEnE;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAO7D"}
@@ -30,6 +30,10 @@ function triggerOf(tc) {
30
30
  return 'triage';
31
31
  if (tc.triage.class === 'product-candidate')
32
32
  return 'product-candidate';
33
+ if (tc.triage.class === 'environment')
34
+ return 'rerun-environment';
35
+ if (tc.triage.class === 'test-defect')
36
+ return 'fix-test';
33
37
  }
34
38
  return null;
35
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-case-satisfied.js","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":";;AAsBA,kCAOC;AAGD,8BAQC;AAED,oCAEC;AAGD,kDAOC;AAnCD,MAAM,MAAM,GAAG,CAAC,EAAiB,EAAE,GAAW,EAAW,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAEtH,yFAAyF;AACzF,SAAgB,WAAW,CAAC,EAAiB;IAC3C,IAAI,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACvE,IAAI,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC;QAAE,OAAO,cAAc,CAAC;IACvD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACxE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,SAAgB,SAAS,CAAC,EAAiB;IACzC,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,EAAE,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IACnC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC;QACtE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,mBAAmB;YAAE,OAAO,mBAAmB,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,EAAiB;IAC5C,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,SAAgB,mBAAmB,CAAC,EAAiB;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM;QAAE,OAAO,cAAc,MAAM,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,OAAO,SAAS,IAAI,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAClG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;AAC3F,CAAC"}
1
+ {"version":3,"file":"test-case-satisfied.js","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":";;AAuBA,kCAOC;AAGD,8BAUC;AAED,oCAEC;AAGD,kDAOC;AArCD,MAAM,MAAM,GAAG,CAAC,EAAiB,EAAE,GAAW,EAAW,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAEtH,yFAAyF;AACzF,SAAgB,WAAW,CAAC,EAAiB;IAC3C,IAAI,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACvE,IAAI,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC;QAAE,OAAO,cAAc,CAAC;IACvD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACxE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,SAAgB,SAAS,CAAC,EAAiB;IACzC,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,EAAE,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IACnC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC;QACtE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,mBAAmB;YAAE,OAAO,mBAAmB,CAAC;QACxE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa;YAAE,OAAO,mBAAmB,CAAC;QAClE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa;YAAE,OAAO,UAAU,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,EAAiB;IAC5C,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,SAAgB,mBAAmB,CAAC,EAAiB;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM;QAAE,OAAO,cAAc,MAAM,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,OAAO,SAAS,IAAI,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAClG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;AAC3F,CAAC"}
@@ -50,11 +50,17 @@ export interface TestCaseState {
50
50
  resultFiles: string[];
51
51
  /** Set when the scenario changed after the run that produced its result (run manifest). */
52
52
  stale?: string;
53
- /** The current `sungen triage` row for a red case — absent when triage has not judged this result. */
53
+ /**
54
+ * The class of a red case: a manual classification in force (`ruleId: 'manual'` and its decision id,
55
+ * #928), else the current `sungen triage` row — absent when neither has judged this result.
56
+ */
54
57
  triage?: {
55
58
  class: TriageClass;
56
59
  ruleId: string;
60
+ decision?: string;
57
61
  };
62
+ /** Hash of the red final attempts the case accounts for (failed only) — a manual classification is bound to it; a re-run changes it. */
63
+ evidence?: string;
58
64
  /** Spec anchors the case was generated from (manifest), and whether they moved since. */
59
65
  anchors: Array<{
60
66
  anchor: string;
@@ -1 +1 @@
1
- {"version":3,"file":"test-case-state-shape.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-state-shape.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,2FAA2F;AAC3F,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3E,4GAA4G;AAC5G,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,cAAc,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sGAAsG;IACtG,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,yFAAyF;IACzF,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,kHAAkH;IAClH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B"}
1
+ {"version":3,"file":"test-case-state-shape.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-state-shape.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,2FAA2F;AAC3F,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3E,4GAA4G;AAC5G,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,cAAc,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,wIAAwI;IACxI,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,kHAAkH;IAClH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B"}
@@ -0,0 +1,29 @@
1
+ export interface ResultsFreshness {
2
+ files: Array<{
3
+ file: string;
4
+ runAt: string;
5
+ source: 'run' | 'file';
6
+ }>;
7
+ /** The oldest result file's run — what the counts are at least as old as. */
8
+ oldestRunAt: string;
9
+ newestRunAt: string;
10
+ /** How the oldest run is dated: Playwright's run start, or (none recorded) the file's change time. */
11
+ runAtSource: 'run' | 'file';
12
+ /** Inputs changed after the results they feed were recorded. */
13
+ newerInputs: Array<{
14
+ file: string;
15
+ changedAt: string;
16
+ source: 'commit' | 'file';
17
+ }>;
18
+ /** SUNGEN_ENV, when no result file is for it. */
19
+ missingEnv?: string;
20
+ /** One line: what makes these results untrustworthy — absent when nothing does. */
21
+ warning?: string;
22
+ }
23
+ /** The unit's results, dated, and what they are older than — undefined when the unit has none. */
24
+ export declare function resultsFreshness(projectRoot: string, unitDir: string, unit: string, env?: string | undefined): ResultsFreshness | undefined;
25
+ /** `2026-08-21 03:42Z` */
26
+ export declare const shortDate: (isoTime: string) => string;
27
+ /** `run 2026-08-21 03:42Z (65 days ago)` — the oldest run, and the newest when they are days apart. */
28
+ export declare function describeResultsRun(f: ResultsFreshness, now?: number): string;
29
+ //# sourceMappingURL=unit-results-freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-results-freshness.d.ts","sourceRoot":"","sources":["../../src/graph/unit-results-freshness.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,gEAAgE;IAChE,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,SAAkC,GAAG,gBAAgB,GAAG,SAAS,CA0CnK;AAED,0BAA0B;AAC1B,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,MAAsD,CAAC;AAEnG,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,SAAa,GAAG,MAAM,CAShF"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.shortDate = void 0;
37
+ exports.resultsFreshness = resultsFreshness;
38
+ exports.describeResultsRun = describeResultsRun;
39
+ /**
40
+ * Which run a unit's results come from, and whether they still describe the suite (#942) — so `next`
41
+ * and the delivery checklist never read a months-old results JSON in silence. Read-only, like the rest
42
+ * of the graph's facts.
43
+ *
44
+ * run each result file's run start, as Playwright records it (`stats.startTime`); a file
45
+ * without one is dated by its own change time, and says so
46
+ * older an input changed after the results it feeds were recorded:
47
+ * per feature its `.feature` and compiled `<base>.spec.ts` ↔ its `<base>-test-result*.json`
48
+ * unit-wide requirements/spec.md ↔ the oldest result file
49
+ * Not contracts.lock.yaml: approving the contract after a run is the normal order, and it
50
+ * changes no test — the contract check judges the lock, not the results.
51
+ * A file's "change time" is its last commit when git tracks it unchanged, else its file
52
+ * time. Results are "recorded" at the later of their run start and their own change time.
53
+ * So a fresh checkout (every file the checkout's time) and results committed in the same
54
+ * commit as the edit they ran against read fresh; an edit, or a commit, after them does not.
55
+ * env SUNGEN_ENV names an env no result file is for: readers fall back to another env's results
56
+ * Advisory: it states what it sees and warns; it decides no step and changes no exit code.
57
+ */
58
+ const child_process_1 = require("child_process");
59
+ const fs = __importStar(require("fs"));
60
+ const path = __importStar(require("path"));
61
+ const unit_paths_1 = require("../harness/unit-paths");
62
+ const unit_artifact_probes_1 = require("./unit-artifact-probes");
63
+ /** `next` also runs inside the Claude Code hooks (10 s budget, the contract's git calls included): a slow git dates by file time instead. */
64
+ const GIT_TIMEOUT_MS = 2000;
65
+ /** Commit times have one-second resolution: an edit and its results in one commit tie. */
66
+ const TIE_MS = 1000;
67
+ const posix = (p) => p.split(path.sep).join('/');
68
+ const real = (p) => { try {
69
+ return fs.realpathSync(p);
70
+ }
71
+ catch {
72
+ return path.resolve(p);
73
+ } };
74
+ const iso = (ms) => new Date(ms).toISOString();
75
+ /** project root → its git work tree (null outside one), asked once per process: `next` reads every unit. */
76
+ const workTrees = new Map();
77
+ function git(cwd, args) {
78
+ try {
79
+ return (0, child_process_1.execFileSync)('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'], timeout: GIT_TIMEOUT_MS, maxBuffer: 16 * 1024 * 1024 }).toString('utf8');
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ /**
86
+ * When each file last changed: its last commit when git tracks it and it is unchanged, else its file
87
+ * time (no git, uncommitted, untracked, ignored, or git failed). Two git calls for the whole set.
88
+ */
89
+ function changeTimes(projectRoot, files) {
90
+ const mtime = (abs) => { try {
91
+ return { ms: fs.statSync(abs).mtimeMs, source: 'file' };
92
+ }
93
+ catch {
94
+ return null;
95
+ } };
96
+ if (!workTrees.has(projectRoot))
97
+ workTrees.set(projectRoot, git(projectRoot, ['rev-parse', '--show-toplevel'])?.trim() || null);
98
+ const top = workTrees.get(projectRoot);
99
+ if (!top)
100
+ return mtime;
101
+ const topReal = real(top);
102
+ const rels = files.map((f) => posix(path.relative(topReal, real(f)))).filter((r) => r && !r.startsWith('..'));
103
+ if (!rels.length)
104
+ return mtime;
105
+ const status = git(topReal, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--', ...rels]);
106
+ const log = git(topReal, ['log', '-n', '500', '--format=%x01%ct', '--name-only', '--', ...rels]);
107
+ if (status === null || log === null)
108
+ return mtime;
109
+ const dirty = new Set();
110
+ const entries = status.split('\0');
111
+ for (let i = 0; i < entries.length; i++) {
112
+ const e = entries[i];
113
+ if (e.length < 4)
114
+ continue;
115
+ dirty.add(e.slice(3));
116
+ if (e[0] === 'R' || e[0] === 'C')
117
+ i++; // a rename/copy carries its source path next
118
+ }
119
+ const committed = new Map();
120
+ let at = 0;
121
+ for (const line of log.split('\n')) {
122
+ if (line.startsWith('\x01'))
123
+ at = Number(line.slice(1)) * 1000;
124
+ else if (line.trim() && at && !committed.has(line.trim()))
125
+ committed.set(line.trim(), at);
126
+ }
127
+ return (abs) => {
128
+ const rel = posix(path.relative(topReal, real(abs)));
129
+ const t = committed.get(rel);
130
+ return t !== undefined && !dirty.has(rel) && fs.existsSync(abs) ? { ms: t, source: 'commit' } : mtime(abs);
131
+ };
132
+ }
133
+ function runStartOf(file) {
134
+ try {
135
+ const t = JSON.parse(fs.readFileSync(file, 'utf8'))?.stats?.startTime;
136
+ const ms = typeof t === 'string' ? Date.parse(t) : NaN;
137
+ return Number.isNaN(ms) ? null : ms;
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ /** Every result file of the unit, in the directories its readers look in. */
144
+ function resultFilesOf(projectRoot, unitDir, unit) {
145
+ const dirs = [...new Set([...(0, unit_artifact_probes_1.generatedDirs)(projectRoot, unit), path.join(projectRoot, 'specs', 'generated', (0, unit_paths_1.catalogIdFromScreenDir)(unitDir))])];
146
+ return dirs.flatMap((d) => { try {
147
+ return fs.readdirSync(d).filter((f) => unit_artifact_probes_1.RESULT_FILE.test(f)).sort().map((f) => path.join(d, f));
148
+ }
149
+ catch {
150
+ return [];
151
+ } });
152
+ }
153
+ /** The unit's results, dated, and what they are older than — undefined when the unit has none. */
154
+ function resultsFreshness(projectRoot, unitDir, unit, env = process.env.SUNGEN_ENV) {
155
+ const results = resultFilesOf(projectRoot, unitDir, unit);
156
+ if (!results.length)
157
+ return undefined;
158
+ const features = (0, unit_paths_1.featureFilesFor)(unitDir, unit).filter((f) => fs.existsSync(f));
159
+ const specsOf = (base) => [...new Set(results.map((r) => path.join(path.dirname(r), `${base}.spec.ts`)))].filter((f) => fs.existsSync(f));
160
+ const unitWide = [path.join(unitDir, 'requirements', 'spec.md')].filter((f) => fs.existsSync(f));
161
+ const baseOf = (f) => path.basename(f).replace(unit_artifact_probes_1.RESULT_FILE, '');
162
+ const bases = [...new Set(results.map(baseOf))];
163
+ const changed = changeTimes(projectRoot, [...results, ...features, ...bases.flatMap(specsOf), ...unitWide]);
164
+ const rel = (f) => posix(path.relative(projectRoot, f));
165
+ const dated = results.map((file) => {
166
+ const start = runStartOf(file);
167
+ const own = changed(file)?.ms ?? 0;
168
+ return { file, base: baseOf(file), runAt: start ?? own, source: (start !== null ? 'run' : 'file'), recordedAt: Math.max(start ?? 0, own) };
169
+ });
170
+ const oldest = dated.reduce((a, b) => (b.runAt < a.runAt ? b : a));
171
+ const newest = dated.reduce((a, b) => (b.runAt > a.runAt ? b : a));
172
+ const recordedFor = (files) => Math.min(...files.map((d) => d.recordedAt));
173
+ const newerInputs = [];
174
+ const judge = (input, recordedAt) => {
175
+ const c = changed(input);
176
+ if (c && c.ms > recordedAt + TIE_MS)
177
+ newerInputs.push({ file: rel(input), changedAt: iso(c.ms), source: c.source });
178
+ };
179
+ for (const base of bases) {
180
+ const feeds = recordedFor(dated.filter((d) => d.base === base));
181
+ for (const f of [...features.filter((x) => path.basename(x, '.feature') === base), ...specsOf(base)])
182
+ judge(f, feeds);
183
+ }
184
+ for (const f of unitWide)
185
+ judge(f, recordedFor(dated));
186
+ const variants = results.map((f) => path.basename(f).replace(/^.*-test-result\.?/, '').replace(/\.?json$/, ''));
187
+ const missingEnv = env && !variants.some((v) => v === env || v.endsWith(`.${env}`)) ? env : undefined;
188
+ const problems = [
189
+ ...(newerInputs.length ? [`results are older than ${newerInputs.slice(0, 3).map((i) => `${i.file} (changed ${(0, exports.shortDate)(i.changedAt)})`).join(', ')}${newerInputs.length > 3 ? ', …' : ''} — re-run the tests before trusting the counts`] : []),
190
+ ...(missingEnv ? [`no results for SUNGEN_ENV=${missingEnv} — readers fall back to ${rel(oldest.file)}`] : []),
191
+ ];
192
+ return {
193
+ files: dated.map((d) => ({ file: rel(d.file), runAt: iso(d.runAt), source: d.source })),
194
+ oldestRunAt: iso(oldest.runAt), newestRunAt: iso(newest.runAt), runAtSource: oldest.source,
195
+ newerInputs, ...(missingEnv ? { missingEnv } : {}), ...(problems.length ? { warning: problems.join('; ') } : {}),
196
+ };
197
+ }
198
+ /** `2026-08-21 03:42Z` */
199
+ const shortDate = (isoTime) => `${isoTime.slice(0, 16).replace('T', ' ')}Z`;
200
+ exports.shortDate = shortDate;
201
+ /** `run 2026-08-21 03:42Z (65 days ago)` — the oldest run, and the newest when they are days apart. */
202
+ function describeResultsRun(f, now = Date.now()) {
203
+ // A file neither the JSON nor the file system could date reads as epoch 0 — "20000 days ago" is noise.
204
+ if (!(Date.parse(f.oldestRunAt) > 0))
205
+ return 'run time unknown (no run start in the JSON, no file time)';
206
+ const days = Math.floor((now - Date.parse(f.oldestRunAt)) / 86400000);
207
+ const age = days <= 0 ? 'today' : days === 1 ? '1 day ago' : `${days} days ago`;
208
+ const span = Date.parse(f.newestRunAt) - Date.parse(f.oldestRunAt) >= 86400000 ? ` to ${(0, exports.shortDate)(f.newestRunAt)}` : '';
209
+ return f.runAtSource === 'run'
210
+ ? `run ${(0, exports.shortDate)(f.oldestRunAt)} (${age})${span}`
211
+ : `file time ${(0, exports.shortDate)(f.oldestRunAt)} (${age}; the JSON records no run start)${span}`;
212
+ }
213
+ //# sourceMappingURL=unit-results-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-results-freshness.js","sourceRoot":"","sources":["../../src/graph/unit-results-freshness.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { ViewpointBaseline } from './viewpoint-baseline';
2
2
  import { FlowQualityResult, InventoryResult } from './flow-contract';
3
+ import { catalogIdFromScreenDir } from './unit-paths';
3
4
  import { ReusedScenarioId, GateResult, DepthResult, BalanceResult, DuplicateResult, TraceResult, ClaimProofResult, TaxonomyResult, AutomatableManualResult, FlowDepthResult, OracleStrengthResult } from './sensors';
4
5
  import { IntentProfile } from './intent';
5
6
  import { Provenance } from './provenance';
@@ -97,8 +98,8 @@ export interface AuditReport {
97
98
  * project actually contain the spec this one says its requirements come from?".
98
99
  */
99
100
  export declare function projectUnitDirs(projectRoot: string): string[];
100
- /** The catalog-resolution id for a unit dir (relative to qa/): screen · flows/<flow> · api/<area> · api/flows/<flow>. */
101
- export declare function catalogIdFromScreenDir(screenDir: string): string;
101
+ /** The catalog-resolution id for a unit dir — lives in unit-paths.ts (the inputsHash reads it too); kept exported here. */
102
+ export { catalogIdFromScreenDir };
102
103
  /**
103
104
  * The capability that owns SCORING for a unit (AO-1): the first path segment of the unit id when it
104
105
  * is a registered capability (`api/<area>` → `api`), else the default (UI) capability. Generic — a
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"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"}
@@ -33,8 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.catalogIdFromScreenDir = void 0;
36
37
  exports.projectUnitDirs = projectUnitDirs;
37
- exports.catalogIdFromScreenDir = catalogIdFromScreenDir;
38
38
  exports.scoringCapabilityFor = scoringCapabilityFor;
39
39
  exports.seniorBandedOverall = seniorBandedOverall;
40
40
  exports.runAudit = runAudit;
@@ -52,6 +52,7 @@ const parse_1 = require("./parse");
52
52
  const viewpoint_baseline_1 = require("./viewpoint-baseline");
53
53
  const flow_contract_1 = require("./flow-contract");
54
54
  const unit_paths_1 = require("./unit-paths");
55
+ Object.defineProperty(exports, "catalogIdFromScreenDir", { enumerable: true, get: function () { return unit_paths_1.catalogIdFromScreenDir; } });
55
56
  const sensors_1 = require("./sensors");
56
57
  const flow_check_1 = require("./flow-check");
57
58
  const capability_plan_1 = require("./capability-plan");
@@ -88,20 +89,6 @@ function projectUnitDirs(projectRoot) {
88
89
  }
89
90
  return out;
90
91
  }
91
- /** The catalog-resolution id for a unit dir (relative to qa/): screen · flows/<flow> · api/<area> · api/flows/<flow>. */
92
- function catalogIdFromScreenDir(screenDir) {
93
- const parts = screenDir.split(path.sep);
94
- const qa = parts.lastIndexOf('qa');
95
- if (qa >= 0) {
96
- if (parts[qa + 1] === 'api' && parts[qa + 2] === 'flows' && parts[qa + 3])
97
- return `api/flows/${parts[qa + 3]}`;
98
- if (parts[qa + 1] === 'api' && parts[qa + 2])
99
- return `api/${parts[qa + 2]}`;
100
- if (parts[qa + 1] === 'flows' && parts[qa + 2])
101
- return `flows/${parts[qa + 2]}`;
102
- }
103
- return path.basename(screenDir);
104
- }
105
92
  /**
106
93
  * The capability that owns SCORING for a unit (AO-1): the first path segment of the unit id when it
107
94
  * is a registered capability (`api/<area>` → `api`), else the default (UI) capability. Generic — a
@@ -138,7 +125,7 @@ function runAudit(screenDir, screenName) {
138
125
  // Catalog-resolution id (for the @api/@query gate sensors): the unit's path relative to qa/ —
139
126
  // `flows/<flow>`, `api/<area>`, `api/flows/<flow>`, else the bare screen. A bare screen matches
140
127
  // the old behaviour (so the audit-sample snapshot is unchanged); flows/api now resolve correctly.
141
- const catalogScreenName = catalogIdFromScreenDir(screenDir);
128
+ const catalogScreenName = (0, unit_paths_1.catalogIdFromScreenDir)(screenDir);
142
129
  // OES-11.2 — the unit's gate rules: the catalog plus the gate-overrides in force for it.
143
130
  const gates = (0, audit_gate_verdict_1.auditGateContext)(screenDir);
144
131
  const specPath = path.join(screenDir, 'requirements', 'spec.md');
@@ -198,7 +185,7 @@ function runAudit(screenDir, screenName) {
198
185
  // gate gap, credit it to the flow instead of double-counting it as a screen gap. Screens only
199
186
  // (a flow/api unit is not credited by sibling flows); mutates the gate before coverage is scored.
200
187
  const flowCredits = [];
201
- const isScreenUnit = !/^(flows|api)\//.test(catalogScreenName);
188
+ const isScreenUnit = (0, unit_paths_1.isScreenUnitId)(catalogScreenName);
202
189
  if (isScreenUnit && gate.gaps.length) {
203
190
  const flowScenarios = (0, flow_check_1.loadFlowScenarios)((0, intent_1.projectRootFromScreenDir)(screenDir));
204
191
  if (flowScenarios.length) {