@fro.bot/systematic 3.13.2 → 3.13.4

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.
package/dist/cli.js CHANGED
@@ -1981,6 +1981,7 @@ function cleanup(agentsRoot, configOptions) {
1981
1981
  // src/lib/review-artifact-schema.ts
1982
1982
  var MAX_REVIEWER_LENGTH = 64;
1983
1983
  var MAX_RUN_ID_LENGTH = 64;
1984
+ var MAX_BRANCH_LENGTH = 256;
1984
1985
  var MAX_INPUT_ID_LENGTH = 128;
1985
1986
  var MAX_REASON_LENGTH = 2048;
1986
1987
  var MAX_FINDINGS = 32;
@@ -2007,6 +2008,9 @@ var AdmittedDispositionSchema = DispositionSchema.exclude(["rejected"]);
2007
2008
  var HarnessSchema = exports_external.enum(["opencode", "pi", "claude-code"]);
2008
2009
  var RepoRelativePathSchema = boundedText(256).regex(/^(?!\/)(?![A-Za-z]:[\\/])(?!\\).+/);
2009
2010
  var ReviewerSchema = boundedText(MAX_REVIEWER_LENGTH);
2011
+ var BranchSchema = exports_external.string().max(MAX_BRANCH_LENGTH);
2012
+ var HeadShaSchema = exports_external.string().regex(/^[0-9a-f]{40}$/);
2013
+ var CompletedAtSchema = exports_external.iso.datetime({ offset: false });
2010
2014
  var ReasonSchema = boundedText(MAX_REASON_LENGTH);
2011
2015
  var FindingTitleSchema = boundedText(256);
2012
2016
  var SeveritySchema = exports_external.enum(["P0", "P1", "P2", "P3", "unknown"]);
@@ -2115,6 +2119,8 @@ var CoverageSchema = exports_external.object({
2115
2119
  var ReviewArtifactSchema = exports_external.object({
2116
2120
  schema_version: exports_external.literal(1),
2117
2121
  run_id: boundedText(MAX_RUN_ID_LENGTH),
2122
+ branch: BranchSchema,
2123
+ head_sha: HeadShaSchema,
2118
2124
  mode: exports_external.enum(["interactive", "autofix", "headless"]),
2119
2125
  harness: HarnessSchema,
2120
2126
  run_status: exports_external.enum([
@@ -2124,6 +2130,7 @@ var ReviewArtifactSchema = exports_external.object({
2124
2130
  "abnormal"
2125
2131
  ]),
2126
2132
  verdict: boundedText(256),
2133
+ completed_at: CompletedAtSchema,
2127
2134
  dispatches: exports_external.array(DispatchSchema).max(MAX_PERSONAS),
2128
2135
  input_findings: exports_external.array(InputFindingSchema).max(MAX_FINDINGS * MAX_PERSONAS),
2129
2136
  findings: exports_external.array(SynthesizedFindingSchema).max(MAX_FINDINGS),
@@ -104,6 +104,8 @@ type SynthesizedFinding = Omit<SynthesizedFindingFields, 'validated' | 'validati
104
104
  export declare const ReviewArtifactSchema: z.ZodObject<{
105
105
  schema_version: z.ZodLiteral<1>;
106
106
  run_id: z.ZodString;
107
+ branch: z.ZodString;
108
+ head_sha: z.ZodString;
107
109
  mode: z.ZodEnum<{
108
110
  autofix: "autofix";
109
111
  headless: "headless";
@@ -121,6 +123,7 @@ export declare const ReviewArtifactSchema: z.ZodObject<{
121
123
  in_progress: "in_progress";
122
124
  }>;
123
125
  verdict: z.ZodString;
126
+ completed_at: z.ZodISODateTime;
124
127
  dispatches: z.ZodArray<z.ZodObject<{
125
128
  persona: z.ZodString;
126
129
  dispatch_outcome: z.ZodEnum<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fro.bot/systematic",
3
- "version": "3.13.2",
3
+ "version": "3.13.4",
4
4
  "description": "Compound-engineering loops for OpenCode, Pi, and Claude Code",
5
5
  "type": "module",
6
6
  "homepage": "https://fro.bot/systematic",
@@ -443,6 +443,8 @@ For each unit, include:
443
443
 
444
444
  Every feature-bearing unit should include the test file path in `**Files:**`.
445
445
 
446
+ When a unit creates a file in a directory that carries registration obligations — a manifest, index, codemap, module table, or generated artifact that must list it — name those surfaces in the same unit's `**Files:**`, and name the regeneration command in its `**Verification**`. Phase 1.1 already collects this from the repository's own contributor guidance; carry it into the unit rather than leaving it for a failing gate to report. An obligation that no gate enforces is the one most likely to be missed, so state it even when nothing will fail.
447
+
446
448
  Use `Execution note` sparingly. Good uses include:
447
449
  - `Execution note: Start with a failing integration test for the request/response contract.`
448
450
  - `Execution note: Add characterization coverage before modifying this legacy parser.`
@@ -706,18 +706,7 @@ After presenting findings and verdict (Stage 6), route the next steps by mode. R
706
706
  - `review-summary.json` is the parent-owned synthesis artifact. Its lifecycle, dispatch outcomes, complete input ledger, synthesized and filtered findings with provenance, disposition counts, and downstream work are defined in the [canonical synthesis artifact contract](./references/synthesis-artifact-contract.md), whose vocabulary and bounds are executable in [`findings-schema.json`](./references/findings-schema.json).
707
707
  - Before finalizing, follow the [artifact validation and failure path](./references/synthesis-artifact-contract.md).
708
708
  - Initialize the artifact before dispatch and persist only validated parent-owned records. Finalize lifecycle and reconciliation after synthesis; preserve the existing degraded and abnormal-run behavior described in the canonical contract.
709
- - Also write `metadata.json` alongside the findings so downstream skills can verify the artifact matches the current branch and HEAD. Minimum fields:
710
- ```json
711
- {
712
- "run_id": "<run-id>",
713
- "branch": "<git branch --show-current at dispatch time>",
714
- "head_sha": "<git rev-parse HEAD at dispatch time>",
715
- "harness": "<opencode | pi | claude-code>",
716
- "verdict": "<Ready to merge | Ready with fixes | Not ready>",
717
- "completed_at": "<ISO 8601 UTC timestamp>"
718
- }
719
- ```
720
- Capture `branch` and `head_sha` at dispatch time (before any autofixes land), and write the file after the verdict is finalized. This file is additive -- pre-existing artifacts that predate this field are still valid, and downstream skills fall back to file mtime when it is missing.
709
+ - Capture `branch` and `head_sha` at dispatch time, before any autofixes land, and write them into `review-summary.json` with `completed_at` when the verdict is finalized; see the [canonical synthesis artifact contract](./references/synthesis-artifact-contract.md) for the provenance semantics.
721
710
  - In autofix mode, create durable todo files only for unresolved actionable findings whose final owner is `downstream-resolver`. Load the `todos` skill (Create section) for the canonical directory path, naming convention, YAML frontmatter structure, and template. Each todo should map the finding's severity to the todo priority (`P0`/`P1` -> `p1`, `P2` -> `p2`, `P3` -> `p3`) and set `status: ready` since these findings have already been triaged by synthesis.
722
711
  - Do not create todos for `advisory` findings, `owner: human`, `owner: release`, or protected-artifact cleanup suggestions.
723
712
  - If only advisory outputs remain, create no todos.
@@ -12,6 +12,14 @@
12
12
  "maxLength": 64,
13
13
  "pattern": "\\S"
14
14
  },
15
+ "branch": {
16
+ "type": "string",
17
+ "maxLength": 256
18
+ },
19
+ "head_sha": {
20
+ "type": "string",
21
+ "pattern": "^[0-9a-f]{40}$"
22
+ },
15
23
  "mode": {
16
24
  "type": "string",
17
25
  "enum": ["interactive", "autofix", "headless"]
@@ -30,6 +38,11 @@
30
38
  "maxLength": 256,
31
39
  "pattern": "\\S"
32
40
  },
41
+ "completed_at": {
42
+ "type": "string",
43
+ "format": "date-time",
44
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
45
+ },
33
46
  "dispatches": {
34
47
  "maxItems": 64,
35
48
  "type": "array",
@@ -500,10 +513,13 @@
500
513
  "required": [
501
514
  "schema_version",
502
515
  "run_id",
516
+ "branch",
517
+ "head_sha",
503
518
  "mode",
504
519
  "harness",
505
520
  "run_status",
506
521
  "verdict",
522
+ "completed_at",
507
523
  "dispatches",
508
524
  "input_findings",
509
525
  "findings",
@@ -136,12 +136,12 @@ The artifact must preserve these distinctions:
136
136
  or higher.
137
137
 
138
138
  The artifact also includes applied fixes, residual actionable work,
139
- advisory-only outputs, coverage data, and the harness value. Alongside the
140
- findings, the parent writes `metadata.json` with the run ID, branch and HEAD
141
- captured at dispatch time, harness, verdict, and completion timestamp. The
142
- branch and HEAD are captured before autofixes land; metadata is written after
143
- the verdict is finalized. Existing artifacts without this additive metadata
144
- remain valid, with downstream consumers falling back to file mtime.
139
+ advisory-only outputs, coverage data, and the harness value. The run artifact
140
+ itself carries the branch and HEAD provenance alongside the run ID, harness,
141
+ verdict, and completion timestamp. The parent captures `branch` and `head_sha`
142
+ at dispatch, before autofixes land, and writes the artifact after the verdict
143
+ is finalized; consumers can therefore tell whether the artifact describes the
144
+ current checkout.
145
145
 
146
146
  Validation and persistence remain parent-side: no per-agent record or finding
147
147
  is written or merged until that finding passes schema and environment-value