triad-plus 1.12.1 → 1.12.2

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/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 1.12.2 — 2026-09-26
4
+
5
+ - Fix compatibility for historical assignments with `scope_contract: null` and
6
+ omit unconfigured scope contracts from new bootstrap templates while keeping
7
+ valid scope enforcement fail-closed.
8
+ - Clarify the exact explicit verifier identity/run-id invocation contract and
9
+ the omission rule for unconfigured repository-skill bindings.
10
+ - Clarify the bounded Card and delivery handoff report-context contract without
11
+ changing Reviewer independence or deterministic verification semantics.
4
12
 
5
13
  ## 1.12.1 — 2026-09-26
6
14
 
@@ -39,6 +39,25 @@ committed fingerprint separately. A blocked or not-delivered terminal Card must
39
39
  include a truthful reason and never claims delivery. Writes are atomic and
40
40
  re-running the command with the same context is idempotent.
41
41
 
42
+ ### Card context checklist
43
+
44
+ The derived card context should carry only canonical control-plane fields:
45
+
46
+ - `card.id` (and its title, goal/outcome, repository, and card path);
47
+ - terminal `status`, `attempts`, and verification runs;
48
+ - at least one passing verification run with its evidence path and candidate
49
+ fingerprint;
50
+ - independent `review.decision: approved` and its evidence/fingerprint;
51
+ - `final.branch`, `final.commit`, `final.repository`, `final.base_commit`, and
52
+ `final.candidate_fingerprint`;
53
+ - assignment/packet/verification provenance and bounded evidence references.
54
+
55
+ For an approved card, `final.candidate_fingerprint` is the pre-commit
56
+ fingerprint recorded by the passing verifier. The renderer computes and records
57
+ `final.committed_candidate_fingerprint` from the committed delta; do not replace
58
+ the verified fingerprint with a newly calculated value in the input context.
59
+ The source card and canonical evidence remain read-only.
60
+
42
61
  ## Materialize the final handoff
43
62
 
44
63
  ```bash
@@ -53,3 +72,22 @@ The handoff opens with the executive summary and Card results, then preserves
53
72
  links to the technical evidence, branch/commit map, quality-contract closure,
54
73
  Evaluator+ result, delivery gates, demo details, risks, and practical test.
55
74
  It is a view for people, not an alternative delivery state machine.
75
+
76
+ ### Handoff context checklist
77
+
78
+ The derived handoff context must include a non-empty `cards` list and a
79
+ `decision` plus `executive_summary`. Each card entry carries `id`, `title`,
80
+ `status`, `summary`, `report_path`, and, when available, `commit`,
81
+ `candidate_fingerprint`, `verification`, `review`, `evaluator_report`, and
82
+ `evidence_refs`. The remaining canonical handoff fields are:
83
+
84
+ `code_areas`, `residual`, `verification`, `review`, `branch_commits`,
85
+ `practical_test`, `evaluator`, `delivery`, `quality_contract`,
86
+ `delivery_criteria`, `demo`, `evidence_refs`, `exceptions`, `prd_baseline`,
87
+ `approved_cards`, `push_evidence`, `gate_metrics`,
88
+ `local_worktree_integration`, `delivery_closure_record`, `final_message`,
89
+ `risks`, and `generated_from`.
90
+
91
+ Populate fields from canonical run, card, verifier, Reviewer, Evaluator+, and
92
+ delivery records. Do not pass Developer reasoning, queue-control narrative, or
93
+ unbounded source documents merely to satisfy the renderer.
@@ -17,6 +17,36 @@ An agent-reported claim is not the same as verification evidence. A Developer ca
17
17
  report the commands it ran; `triad-verify` independently observes declared
18
18
  required `control-plane` gates and writes atomic evidence.
19
19
 
20
+ ## Explicit verifier dispatch contract
21
+
22
+ When the configured route is `explicit_dispatch`, invoke the installed verifier
23
+ with the active assignment's exact Developer identity. The trigger is supplied
24
+ as JSON on stdin; it is not inferred from the shell process or from the card:
25
+
26
+ ```bash
27
+ agent_id="<assignment.agent_id>"
28
+ run_id="<assignment.verification_run_id>"
29
+ printf '{"event":"manual_explicit_dispatch","agent_id":"%s","agent_type":"triad_developer","run_id":"%s"}' "$agent_id" "$run_id" |
30
+ node .triad-runtime/triad-verify.mjs \
31
+ --project /absolute/path/to/control-workspace \
32
+ --assignment /absolute/path/to/control-workspace/.loop/runtime/assignments/<assignment-file>.json \
33
+ --run-id "$run_id"
34
+ ```
35
+
36
+ `agent_id` must match the active assignment exactly and `agent_type` must be
37
+ `triad_developer`. The `run_id` on stdin and `--run-id` must match the active
38
+ assignment when one is bound. A missing or mismatched trigger is
39
+ `invalid_context`; no gate runs and no retry/remediation budget is consumed.
40
+
41
+ When the repository has no router or required repository skills, omit the
42
+ `required_repository_skills` property from the assignment. Do not represent an
43
+ unconfigured binding as a present empty array: a present array is a declared
44
+ binding and must contain at least one validated skill. This documents existing
45
+ runtime behavior; it does not add a new verifier mode or transition.
46
+
47
+ `triad-verify.mjs` does not expose a help screen. Use the assignment, project
48
+ configuration, and this explicit recipe rather than invoking it with `--help`.
49
+
20
50
  ## Immutable Quality Contract
21
51
 
22
52
  Projects may opt into `project.quality_contract` with a project-relative JSON
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "triad-plus",
3
- "version": "1.12.1",
3
+ "version": "1.12.2",
4
4
  "description": "A lightweight, evidence-backed engineering loop for coding agents.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -115,7 +115,10 @@ function withinRoot(root, candidate, label) {
115
115
 
116
116
  async function scopePreflight(projectRoot, worktree, assignment) {
117
117
  const specification = assignment.scope_contract;
118
- if (specification === undefined) {
118
+ // v1.12.1's assignment template materialized an unconfigured scope as
119
+ // `null`. Treat that historical sentinel exactly like an omitted contract,
120
+ // while continuing to fail closed for every malformed non-null value.
121
+ if (specification === undefined || specification === null) {
119
122
  const candidate = await collectCandidateChanges(worktree);
120
123
  return {
121
124
  configured: false,
@@ -20,7 +20,6 @@
20
20
  "quality_baseline_path": null,
21
21
  "expected_quality_baseline_fingerprint": null,
22
22
  "required_gate_ids": [],
23
- "scope_contract": null,
24
23
  "required_repository_skills": [
25
24
  {
26
25
  "path": ".agents/skills/router/SKILL.md",
@@ -153,7 +153,24 @@ fail-closed escalation; do not dispatch a Developer or consume retry budget.
153
153
  for a missing detail or contradiction, not systematic startup context.
154
154
  4. After completion, move to `verifying`. Follow the recorded dispatch route:
155
155
  wait for a valid hook-produced file when one is configured, otherwise invoke
156
- the verifier explicitly. Accept only current evidence whose assignment ID,
156
+ the verifier with the exact active Developer identity. For explicit dispatch,
157
+ pipe the trigger JSON and bind the same run ID on stdin and argv:
158
+
159
+ ```bash
160
+ agent_id="<assignment.agent_id>"
161
+ run_id="<assignment.verification_run_id>"
162
+ printf '{"event":"manual_explicit_dispatch","agent_id":"%s","agent_type":"triad_developer","run_id":"%s"}' "$agent_id" "$run_id" |
163
+ node .triad-runtime/triad-verify.mjs \
164
+ --project /absolute/path/to/control-workspace \
165
+ --assignment /absolute/path/to/control-workspace/.loop/runtime/assignments/<assignment-file>.json \
166
+ --run-id "$run_id"
167
+ ```
168
+
169
+ Do not substitute a generic `manual` trigger or a different agent identity.
170
+ When no repository skills are configured, omit
171
+ `required_repository_skills` from the assignment; a present empty array is
172
+ a declared binding and fails closed. These are existing runtime semantics,
173
+ not a new verification behavior. Accept only current evidence whose assignment ID,
157
174
  feature, attempt, PRD/card/gate hashes, expected branch, and candidate
158
175
  fingerprint match the active candidate. When an opt-in scope contract is
159
176
  configured, `triad-verify` first compares the complete candidate delta from