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 +9 -1
- package/docs/human-readable-reports.md +38 -0
- package/docs/verification.md +30 -0
- package/package.json +1 -1
- package/runtime/triad-verify.mjs +4 -1
- package/skills/triad-loop-bootstrap/assets/loop-template/runtime/assignments/assignment.template.json +0 -1
- package/skills/triad-loop-orchestrator/SKILL.md +18 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
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.
|
package/docs/verification.md
CHANGED
|
@@ -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
package/runtime/triad-verify.mjs
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
@@ -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
|
|
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
|