You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(validate): honest scoped PASS — name the disclosure homes, stop paying to delete caveats
A fresh-install smoke proved a contradiction: validate.py rejects any PASS
whose not_checked is nonempty, silently rewriting the verdict to NOT_PROVEN,
while SKILL.md, AGENTS.md Closeout, and docs/architecture/operating-loop.md all
instruct disclosing checked and not_checked. An identical honest draft passed
only after its scope caveats were deleted.
Decision: PASS stays strict-empty (option b), and every doc surface now defines
where honest scope limits go instead. not_checked has exactly one meaning —
in-scope acceptance surface that went unverified — so a PASS has none by
construction; a bounded proof of a criterion goes in criteria[].reason, a
declared non-goal stays in the intent source (optionally restated as an
evidence-backed boundary criterion), and residual risk goes in the report. The
integrity finding now names those homes instead of failing silently, so the
honest draft is told where to move a caveat rather than paid to delete it.
Also fixes two verified SKILL.md defects and one error message:
- checkout-relative `python3 skills/validate/scripts/...` paths are now
install-agnostic ($SKILL_DIR = this SKILL.md's own directory).
- the `manifest` subcommand was documented flagless; a Helper commands table
now documents the real flags for all five subcommands.
- store-verdict's criteria-field error names the allowed set
{id, result, evidence_refs, reason} and the offending keys.
Copy file name to clipboardExpand all lines: images/gemini/skills/validate/SKILL.md
+52-5Lines changed: 52 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -77,10 +77,53 @@ fresh context produced the PASS (`e9b6cdb8...37b9`). If a mutating check is
77
77
genuinely required by acceptance, run it against a disposable copy or a
78
78
committed subject, never the judged working tree.
79
79
80
+
## Scope disclosure
81
+
82
+
`not_checked` has exactly one meaning: **in-scope acceptance surface this
83
+
validation did not verify**. PASS asserts that the whole declared acceptance
84
+
surface was verified, so a PASS carries no `not_checked` entries; the helper
85
+
refuses one and records a `validate.integrity` finding.
86
+
87
+
That rule never pays for deleting an honest caveat, because every kind of scope
88
+
limit has a home that survives inside a PASS:
89
+
90
+
| Scope limit | Home | Example |
91
+
|---|---|---|
92
+
| A criterion proven by a bounded check |`criteria[].reason` on that criterion | "proven by the unit suite; the full integration matrix was not replayed" |
93
+
| A declared non-goal or out-of-scope area | the intent source's non-goals, optionally restated as an evidence-backed boundary criterion in `criteria`| "`cli/**` is a declared non-goal; the diff proves it untouched" |
94
+
| Residual risk or judgment caveat | the caller-facing report | "the migration path is untested against pre-3.0 stores" |
95
+
| Acceptance that genuinely went unverified |`not_checked`, and the result is `NOT_PROVEN` rather than PASS | "criterion 3 needs hardware this context cannot reach" |
96
+
97
+
Emptying `not_checked` to obtain PASS is a contract violation, not a
98
+
workaround. If acceptance really went unverified, the honest result is
99
+
`NOT_PROVEN`. If the entry was never acceptance in the first place, it belongs
100
+
in one of the other homes, where it stays visible in the stored artifact
101
+
instead of being deleted.
102
+
103
+
## Helper commands
104
+
105
+
The helper ships beside this file. Invoke it through this skill's own
106
+
directory rather than a checkout-relative path: `$SKILL_DIR` is the directory
107
+
containing this `SKILL.md` — `skills/validate/` in a repository checkout,
108
+
`.agents/skills/validate/` in an installed runtime.
109
+
110
+
| Command | Required | Optional |
111
+
|---|---|---|
112
+
|`manifest`|`--root <dir>`, `--include <path>` (repeatable, at least one) |`--exclude <path-or-glob>` (repeatable), `--base-manifest <file>`, `--git-metadata-json <json>`, `--output <file>`|
Copy file name to clipboardExpand all lines: skills-codex/validate/SKILL.md
+52-5Lines changed: 52 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -49,10 +49,53 @@ fresh context produced the PASS (`e9b6cdb8...37b9`). If a mutating check is
49
49
genuinely required by acceptance, run it against a disposable copy or a
50
50
committed subject, never the judged working tree.
51
51
52
+
## Scope disclosure
53
+
54
+
`not_checked` has exactly one meaning: **in-scope acceptance surface this
55
+
validation did not verify**. PASS asserts that the whole declared acceptance
56
+
surface was verified, so a PASS carries no `not_checked` entries; the helper
57
+
refuses one and records a `validate.integrity` finding.
58
+
59
+
That rule never pays for deleting an honest caveat, because every kind of scope
60
+
limit has a home that survives inside a PASS:
61
+
62
+
| Scope limit | Home | Example |
63
+
|---|---|---|
64
+
| A criterion proven by a bounded check |`criteria[].reason` on that criterion | "proven by the unit suite; the full integration matrix was not replayed" |
65
+
| A declared non-goal or out-of-scope area | the intent source's non-goals, optionally restated as an evidence-backed boundary criterion in `criteria`| "`cli/**` is a declared non-goal; the diff proves it untouched" |
66
+
| Residual risk or judgment caveat | the caller-facing report | "the migration path is untested against pre-3.0 stores" |
67
+
| Acceptance that genuinely went unverified |`not_checked`, and the result is `NOT_PROVEN` rather than PASS | "criterion 3 needs hardware this context cannot reach" |
68
+
69
+
Emptying `not_checked` to obtain PASS is a contract violation, not a
70
+
workaround. If acceptance really went unverified, the honest result is
71
+
`NOT_PROVEN`. If the entry was never acceptance in the first place, it belongs
72
+
in one of the other homes, where it stays visible in the stored artifact
73
+
instead of being deleted.
74
+
75
+
## Helper commands
76
+
77
+
The helper ships beside this file. Invoke it through this skill's own
78
+
directory rather than a checkout-relative path: `$SKILL_DIR` is the directory
79
+
containing this `SKILL.md` — `skills/validate/` in a repository checkout,
80
+
`.agents/skills/validate/` in an installed runtime.
81
+
82
+
| Command | Required | Optional |
83
+
|---|---|---|
84
+
|`manifest`|`--root <dir>`, `--include <path>` (repeatable, at least one) |`--exclude <path-or-glob>` (repeatable), `--base-manifest <file>`, `--git-metadata-json <json>`, `--output <file>`|
0 commit comments