@codyswann/lisa 4.84.7 → 4.84.8

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 (150) hide show
  1. package/all/copy-overwrite/scripts/lib/completion-authorization.mjs +282 -0
  2. package/all/copy-overwrite/scripts/lib/completion-proof-adapters.mjs +213 -0
  3. package/all/copy-overwrite/scripts/lib/completion-proof-conformance.mjs +115 -0
  4. package/all/copy-overwrite/scripts/lib/completion-proof-content.mjs +408 -0
  5. package/all/copy-overwrite/scripts/lib/completion-proof-errors.mjs +16 -0
  6. package/all/copy-overwrite/scripts/lib/completion-proof-github.mjs +233 -0
  7. package/all/copy-overwrite/scripts/lib/completion-proof-markdown.mjs +70 -0
  8. package/all/copy-overwrite/scripts/lib/completion-proof-projection.mjs +169 -0
  9. package/all/copy-overwrite/scripts/lib/completion-proof-publisher.mjs +238 -0
  10. package/all/copy-overwrite/scripts/lib/completion-proof-reader.mjs +175 -0
  11. package/all/copy-overwrite/scripts/lib/completion-proof-shape.mjs +374 -0
  12. package/all/copy-overwrite/scripts/lib/completion-proof-source.mjs +174 -0
  13. package/all/copy-overwrite/scripts/lib/history-secret-scanner.mjs +20 -5
  14. package/all/copy-overwrite/scripts/lib/npm-update-helper-inventory.mjs +15 -0
  15. package/all/copy-overwrite/scripts/lib/usage-effectiveness.d.mts +27 -0
  16. package/all/copy-overwrite/scripts/lib/usage-effectiveness.mjs +156 -0
  17. package/all/copy-overwrite/scripts/lib/usage-ledger-integrity.d.mts +8 -0
  18. package/all/copy-overwrite/scripts/lib/usage-ledger-integrity.mjs +141 -0
  19. package/all/copy-overwrite/scripts/lib/usage-ledger.d.mts +89 -0
  20. package/all/copy-overwrite/scripts/lib/usage-ledger.mjs +206 -0
  21. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +3 -1
  22. package/all/copy-overwrite/scripts/lisa-work-item.mjs +255 -39
  23. package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +141 -3
  24. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  25. package/dist/core/lisa-owned-hash-ledger.js +186 -0
  26. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  27. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  28. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  29. package/dist/core/upstream-evidence-manifest.js +101 -12
  30. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  31. package/dist/opencode/plugin-templates/parity-safety-net.sh +3 -1
  32. package/dist/utils/effectiveness.d.ts +4 -41
  33. package/dist/utils/effectiveness.d.ts.map +1 -1
  34. package/dist/utils/effectiveness.js +2 -126
  35. package/dist/utils/effectiveness.js.map +1 -1
  36. package/dist/utils/usage-accounting.d.ts +5 -100
  37. package/dist/utils/usage-accounting.d.ts.map +1 -1
  38. package/dist/utils/usage-accounting.js +4 -287
  39. package/dist/utils/usage-accounting.js.map +1 -1
  40. package/package.json +4 -4
  41. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  44. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +7 -1
  45. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  46. package/plugins/lisa/hooks/parity-safety-net.sh +3 -1
  47. package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
  48. package/plugins/lisa/rules/reference/completion-authorization.md +10 -0
  49. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  50. package/plugins/lisa/skills/lisa-tracker-evidence/SKILL.md +7 -1
  51. package/plugins/lisa/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  52. package/plugins/lisa-agy/hooks/parity-safety-net.sh +3 -1
  53. package/plugins/lisa-agy/plugin.json +1 -1
  54. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  55. package/plugins/lisa-agy/skills/lisa-tracker-evidence/SKILL.md +7 -1
  56. package/plugins/lisa-agy/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  57. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  60. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +1 -1
  64. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +3 -1
  66. package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
  67. package/plugins/lisa-copilot/rules/reference/completion-authorization.md +10 -0
  68. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  69. package/plugins/lisa-copilot/skills/lisa-tracker-evidence/SKILL.md +7 -1
  70. package/plugins/lisa-copilot/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  71. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +3 -1
  73. package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
  74. package/plugins/lisa-cursor/rules/completion-authorization-reference.mdc +15 -0
  75. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  76. package/plugins/lisa-cursor/skills/lisa-tracker-evidence/SKILL.md +7 -1
  77. package/plugins/lisa-cursor/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  78. package/plugins/lisa-devin/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-devin/.devin-plugin/plugin.json +1 -1
  80. package/plugins/lisa-devin/hooks/parity-safety-net.sh +3 -1
  81. package/plugins/lisa-devin/rules/eager/00-rule-index.md +1 -0
  82. package/plugins/lisa-devin/rules/reference/completion-authorization.md +10 -0
  83. package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  84. package/plugins/lisa-devin/skills/lisa-tracker-evidence/SKILL.md +7 -1
  85. package/plugins/lisa-devin/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  86. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-expo-agy/plugin.json +1 -1
  89. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +1 -1
  93. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  95. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  96. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +1 -1
  100. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  102. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  103. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +1 -1
  107. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  109. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  110. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  112. package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +1 -1
  114. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  116. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  117. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  118. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +1 -1
  120. package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +1 -1
  121. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  122. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  123. package/plugins/lisa-rails-agy/plugin.json +1 -1
  124. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  125. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  126. package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +1 -1
  127. package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +1 -1
  128. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  129. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  130. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  131. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  132. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  133. package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +1 -1
  134. package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +1 -1
  135. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  136. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  137. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  138. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  139. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +1 -1
  141. package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +1 -1
  142. package/plugins/src/base/hooks/parity-safety-net.sh +3 -1
  143. package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
  144. package/plugins/src/base/rules/reference/completion-authorization.md +10 -0
  145. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
  146. package/plugins/src/base/skills/lisa-tracker-evidence/SKILL.md +7 -1
  147. package/plugins/src/base/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
  148. package/scripts/two-channel-couplings.json +2 -2
  149. package/typescript/copy-overwrite/.prettierignore +15 -0
  150. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +32 -0
@@ -0,0 +1,193 @@
1
+ # Accepted completion proof
2
+
3
+ Merging a pull request makes work available for delivery. It does not authorize
4
+ closing the work item. The canonical `scripts/lisa-work-item.mjs complete` and
5
+ GitHub applying sweep require the same accepted-for-completion record before
6
+ adding a terminal label, removing competing lifecycle labels, closing an issue,
7
+ or changing a Linear item to its terminal state. Jira completion remains
8
+ unsupported. Intermediate deployment roles retain their existing behavior.
9
+
10
+ An absent record or pending delivery leaves the item open with its current owner
11
+ and labels. The command names the pending obligation and asks for canonical
12
+ Verify/evidence. An invalid record, unreadable provider, or failed write is a
13
+ different outcome. A workflow must not file a delivery-failure issue merely
14
+ because verification has not finished.
15
+
16
+ ## Publish after verification
17
+
18
+ The canonical tracker-evidence skill performs these steps after real evidence
19
+ uploads and exact readbacks:
20
+
21
+ 1. Capture the delivered behavior, required hosted checks, actual configured
22
+ delivery, and every local typed evidence marker. Keep historical RED captures
23
+ and expected refusal exits as captures; current required claims and criteria
24
+ must independently pass.
25
+ 2. Write canonical Verify usage, including explicit unavailable metrics when
26
+ needed. The future native completion time (`acceptedAt`) remains null.
27
+ 3. Prepare the record input below from actual native source and uploaded asset
28
+ identities. Attach a structured CONFORMS report for the complete requirement
29
+ conjunctions and current full specification.
30
+ 4. Execute the shipped producer:
31
+
32
+ ```sh
33
+ node scripts/lisa-work-item.mjs publish-completion-proof \
34
+ --ref acme/code#42 --record evidence/completion-record.json
35
+ ```
36
+
37
+ Linear uses its configured identifier and implementation GitHub repository.
38
+ Both providers use the implementation repository's existing `pr-assets`
39
+ release. The producer reads current native requirements/configuration,
40
+ validates the actual attachment bytes and source/delivery, uploads a uniquely
41
+ hash-named JSON asset without replacement, reads it back, then posts and reads
42
+ back an exact native-item locator. The locator alone proves nothing.
43
+ 5. Run canonical completion. Record the real native terminal readback and usage
44
+ acceptance afterward. A pending result is retryable after its named proof
45
+ obligation is satisfied; it does not authorize a manual close.
46
+
47
+ For a journey requiring a pending-state screenshot or state dump, capture and
48
+ upload that nonempty Phase-A artifact before publication/completion. Keep it
49
+ immutable. Append the later real terminal readback as a separate Phase-B
50
+ postcondition. Historical pending text in the earlier artifact is valid.
51
+
52
+ When a final requirement includes the terminal event itself, retain its claim
53
+ as an explicit pending postcondition in the complete phase ledger. The
54
+ accepted record's conjunctions and CONFORMS report cover only actual transition
55
+ inputs; they do not claim the future event passed. Keep the full final-spec
56
+ report PARTIAL until native Phase B, then attach the actual readback and update
57
+ the final required claim. Never fabricate a future closed state to obtain
58
+ pre-transition CONFORMS.
59
+
60
+ ## Record contract
61
+
62
+ Schema version 1 has kind `lisa-completion-authorization`. The producer derives
63
+ the stable record ID, monotonic revision, predecessor digest, capture timestamp,
64
+ native item ID/provider/scope, repository ID/name, publisher ID, production
65
+ environment/branch and current `spec_sha256`. Input supplies:
66
+
67
+ - `state`: `accepted-for-completion`, `pending`, or `revoked`. A newer trusted
68
+ pending, revoked or malformed revision never falls back to an older accepted
69
+ record. Untrusted comments cannot select or revoke a record.
70
+ - `source`: primary `pull_request`, `pr_head`, actual `tested_head`, `merge_sha`,
71
+ `declaring_commits`, `production_snapshot_sha`, and `delivered_sha`. These are
72
+ distinct identities with native reconciliation, not a requirement that all
73
+ SHAs be equal. The primary PR and source commits must declare this exact work
74
+ item. A supplied `--pr-url` must identify that primary PR. Timeline mentions
75
+ and a different work item's accepted record cannot substitute.
76
+ - `evidence`: rows with `evidence_id`, canonical `kind`, native `asset_id`, actual
77
+ `bytes`, `sha256`, `captured_at`, and `artifact_head_sha`.
78
+ - `manifest`: one `{name, kind, evidence_id}` row for every local marker.
79
+ `EVIDENCE-REF` is non-claiming and cannot satisfy a local marker.
80
+ - `verdicts`: actual native JSON asset pointers (`asset_id`, `bytes`, `sha256`)
81
+ with role `remote` or `quality`. Each is schema2 PASS with passing criteria,
82
+ positively established required claims, attached reaching evidence and
83
+ `not_established_reviewed: true`. Each claim's evidence must also occur in its
84
+ own verdict's evidence list with the same execution head and digest.
85
+ - `requirements`: unique `{requirement_id, operator: "all", claim_ids}` rows.
86
+ Every required conjunct must be a validated required established claim.
87
+ Canonical `required_evidence_kinds` remain alternatives; an explicit
88
+ `evidence_operator: "all"` requires each listed kind.
89
+ - `obligations`: exactly `remote`, `conformance`, `typed_manifest`, `delivery`,
90
+ `usage`, `linkage`, and `acceptance`. Each has an explicit boolean `required`
91
+ and applicable status. Required values are `pass`, except conformance uses
92
+ `CONFORMS` and acceptance uses `accepted-for-completion`.
93
+
94
+ The conformance obligation includes `requirement_ids` and a native `report`
95
+ asset pointer. Its JSON is `{verdict: "CONFORMS", work_item, spec_sha256,
96
+ requirements, scenario_names}`. Requirement rows include status `pass` and must
97
+ match the record's complete conjunction map; every primary acceptance scenario
98
+ must be covered. The usage obligation lists the actual canonical `entry_ids`.
99
+ The remote obligation lists empirical required `claim_ids` against the delivered
100
+ environment/source, beyond code-unit checks.
101
+
102
+ Runtime leaves require remote and delivery proof. Explicit doc-only,
103
+ config-only and type-only no-runtime declarations permit their corresponding
104
+ N/A reasons; no-local-markers permits only the empty manifest exemption.
105
+ Missing or duplicate environment declarations cannot grant an exemption.
106
+ Childless Story/Spike work remains a leaf. Container rollup is a separate path;
107
+ older blanket container wording in evidence guidance does not grant a new
108
+ terminal-writer bypass.
109
+
110
+ Attachments must be nonempty bounded actual native assets in this repository's
111
+ `pr-assets` release, with matching byte counts and SHA256. Canonical kinds are
112
+ screenshot, recording, http-transcript, cli-output, log-snippet, db-query-output,
113
+ perf-trace, test-run-log, deploy-log and state-dump. The reader validates actual
114
+ captured structure/header, not an extension. HTTP HEAD/204 and empty query rows
115
+ can be legitimate observations. Structure checks do not claim to evaluate the
116
+ visual truth of an image or the business meaning of every captured line.
117
+
118
+ Native JSON reads use a separate 16 MiB ceiling per response, including the
119
+ complete slurped output of a paginated listing. The immutable proof record
120
+ remains limited to 2 MiB. Page and row limits are additional bounds: a listing
121
+ with at most 100 pages or 10,000 comments can still exceed its byte ceiling and
122
+ must fail closed without a lifecycle write. Visible local evidence markers
123
+ claim attachments; fenced or indented examples and HTML comments do not.
124
+
125
+ An ordinary pending result from `complete` or the applying sweep exits zero
126
+ because it preserves the nonterminal state. A refused `publish-completion-proof`
127
+ exits nonzero when no locator was published. A successful bot publication with
128
+ category `published/pending-producer` remains a successful publication; only
129
+ completion waits for its pinned producer attempt.
130
+
131
+ ## Delivery and publisher configuration
132
+
133
+ Configure the actual production delivery mechanism under
134
+ `verification.completion.delivery.<environment>`. For GitHub Actions, use
135
+ `mechanism: "github-actions"`, exact `workflow_path`, and permitted native
136
+ `events`. Records pin each actual run's `run_id`, `workflow_id`, `workflow_path`,
137
+ `event`, `attempt` and `head_sha`. The whole configured post-merge run must
138
+ finish successfully and reconcile with delivered source. Pre-merge CI and an
139
+ auxiliary green workflow cannot replace it. Artifact or external-deployment
140
+ projects declare their applicable mechanism and empirical attached
141
+ `evidence_refs`; npm, browser, cloud and device checks are not universal.
142
+
143
+ User publishers require fresh native repository write/maintain/admin permission
144
+ and matching stable native asset-uploader identity. Association labels, display
145
+ names and issue edit access are insufficient. `automationPublishers` defaults
146
+ to an empty array. A configured automation row requires stable Bot `user_id`,
147
+ `type: "Bot"`, `repository_id`, exact `workflow_id`, `workflow_path`, allowed
148
+ `events`, and branch `ref`. Its record producer additionally pins
149
+ `workflow_run_id`, `workflow_attempt`, and `workflow_head`.
150
+
151
+ The native asset belongs to the repository and uploader; exact native run
152
+ repository, workflow, ref, head, attempt and upload interval corroborate that
153
+ configured automation policy. This is not a cryptographic claim about which
154
+ step uploaded the asset. A bot can publish during its pinned attempt and gets
155
+ `published/pending-producer`. Completion remains pending until that exact native
156
+ attempt succeeds, without rewriting the asset. A failed/cancelled/timed-out
157
+ attempt cannot be upgraded by a later successful rerun. User records do not
158
+ gain an unnecessary producer-run requirement.
159
+
160
+ ## Freshness and readbacks
161
+
162
+ The full primary specification is hashed except positively recognized canonical
163
+ accounting lines/tokens and closed-schema machine metadata. Unknown visible
164
+ prose and table rows inside the usage section remain hashed, including text
165
+ before its rollup. Fenced examples cannot declare runtime scope or machine
166
+ blocks. Duplicate declarations are refused.
167
+
168
+ Precisely delimited `lisa:completion-authorization` blocks exclude only the
169
+ JSON locator's six exact fields: `schema_version`, `record_id`, `revision`,
170
+ `repository`, `asset_id`, `sha256`. `lisa:completion-postcondition` blocks exclude
171
+ only JSON with `schema_version: 1`, `provider`, canonical `ref`, real `native_id`,
172
+ `record_sha256`, UTC `completed_at`, and native terminal `state` (`CLOSED` for
173
+ GitHub, `completed` for Linear). Unknown keys, prose, or visible requirements
174
+ inside either block remain part of the specification. These bookkeeping fields
175
+ must use the exact canonical compact or two-space JSON serialization; duplicate
176
+ keys and other raw forms remain hashed. These bookkeeping fields
177
+ never authorize completion or replace the actual native readback; publish them
178
+ only after observing the real terminal event. Do not add outside prose or
179
+ spacing as if it were part of the machine metadata block.
180
+
181
+ The reader checks the accepted production snapshot against a fresh native
182
+ branch tip and fully paginates native compare commits. Newer source declaring
183
+ this same item anywhere from delivered source through the accepted snapshot to
184
+ the current tip requires fresh proof; unrelated newer work does not invalidate
185
+ it. It re-reads the trusted record, native scope, canonical usage, backlink and
186
+ lifecycle state immediately before mutation, preserving freshly observed owner
187
+ and unrelated labels. This is bounded authoritative rereading and post-write
188
+ verification, not a distributed atomic transaction.
189
+
190
+ The shipped Node usage parser is the same implementation used by the TypeScript
191
+ facade and works in a host without application `dist`. Local advisory Stop-hook
192
+ files cannot authorize production writes. Protocol version 1.2.0 adds these
193
+ verdict semantics; normal generator checks maintain its dependent versions.
@@ -108,9 +108,9 @@
108
108
  },
109
109
  "inspected": {
110
110
  "workflows": 26,
111
- "steps": 787,
111
+ "steps": 788,
112
112
  "couplings": 37,
113
- "inventory": 186
113
+ "inventory": 204
114
114
  },
115
115
  "counts": {
116
116
  "package-backed": 11,
@@ -136,6 +136,18 @@ scripts/lib/automation-provenance-contract.mjs
136
136
  scripts/lib/automation-provenance-files.mjs
137
137
  scripts/lib/automation-provenance-local.mjs
138
138
  scripts/lib/bounded-spawn.mjs
139
+ scripts/lib/completion-authorization.mjs
140
+ scripts/lib/completion-proof-adapters.mjs
141
+ scripts/lib/completion-proof-conformance.mjs
142
+ scripts/lib/completion-proof-content.mjs
143
+ scripts/lib/completion-proof-errors.mjs
144
+ scripts/lib/completion-proof-github.mjs
145
+ scripts/lib/completion-proof-markdown.mjs
146
+ scripts/lib/completion-proof-projection.mjs
147
+ scripts/lib/completion-proof-publisher.mjs
148
+ scripts/lib/completion-proof-reader.mjs
149
+ scripts/lib/completion-proof-shape.mjs
150
+ scripts/lib/completion-proof-source.mjs
139
151
  scripts/lib/gate-failure-diagnosis.mjs
140
152
  scripts/lib/github-attestation-provider.mjs
141
153
  scripts/lib/github-attestation-recovery.mjs
@@ -220,6 +232,9 @@ scripts/lib/process-tree-runner.mjs
220
232
  scripts/lib/reusable-workflow-load-adapter.mjs
221
233
  scripts/lib/reusable-workflow-load-failure.mjs
222
234
  scripts/lib/reusable-workflow-load-scan.mjs
235
+ scripts/lib/usage-effectiveness.mjs
236
+ scripts/lib/usage-ledger-integrity.mjs
237
+ scripts/lib/usage-ledger.mjs
223
238
  scripts/lib/windows-process-job.mjs
224
239
  scripts/lib/worktree-dependencies.mjs
225
240
  scripts/lisa-hooks/worktree-binding-guard.mjs
@@ -2133,6 +2133,7 @@ export const REVIEW_GATE_CONDITIONS = Object.freeze({
2133
2133
  objected: "objected",
2134
2134
  pending: "pending",
2135
2135
  unrecognised: "unrecognised",
2136
+ notReviewed: "not_reviewed",
2136
2137
  undetermined: "undetermined",
2137
2138
  // A SATISFYING condition: the reviewer could not or did not review this
2138
2139
  // head, and a writer posted a local adversarial review for it in its place.
@@ -2160,6 +2161,7 @@ const SUBSTITUTABLE_REPORTED_CONDITIONS = Object.freeze(
2160
2161
  REVIEW_GATE_CONDITIONS.waived,
2161
2162
  REVIEW_GATE_CONDITIONS.waivedWithReview,
2162
2163
  REVIEW_GATE_CONDITIONS.unrecognised,
2164
+ REVIEW_GATE_CONDITIONS.notReviewed,
2163
2165
  ])
2164
2166
  );
2165
2167
 
@@ -2364,6 +2366,14 @@ export function reviewGateState(reading, vocabulary = {}) {
2364
2366
  if (state === "FAILURE" || state === "ERROR") {
2365
2367
  return objectedReviewGateState(state, text, reading.description);
2366
2368
  }
2369
+ if (state === "SKIPPED") {
2370
+ return skippedReviewGateState(
2371
+ text,
2372
+ reading.description,
2373
+ vocabulary,
2374
+ reading.reviewActivity
2375
+ );
2376
+ }
2367
2377
  if (state !== "SUCCESS") {
2368
2378
  return pendingReviewGateState(state, reading.waitExpired);
2369
2379
  }
@@ -2375,6 +2385,28 @@ export function reviewGateState(reading, vocabulary = {}) {
2375
2385
  );
2376
2386
  }
2377
2387
 
2388
+ /**
2389
+ * A terminal skip never proves review, even when its title names completed work.
2390
+ * Existing exact waivers retain their policy; all other skips need a trusted
2391
+ * head-bound substitute and a clean, readable review surface to permit merging.
2392
+ * @param {string} text - Normalized description
2393
+ * @param {string|undefined} description - Original description
2394
+ * @param {{waive?: readonly string[]}} vocabulary - Per-check waiver extensions
2395
+ * @param {{read: boolean, present: boolean, objected: boolean}|undefined} activity - Independent review surface
2396
+ * @returns {{state: string, condition: string, why: string}} Terminal no-review verdict
2397
+ */
2398
+ function skippedReviewGateState(text, description, vocabulary, activity) {
2399
+ const waivers = [...ENTITLEMENT_WAIVERS, ...(vocabulary.waive ?? [])];
2400
+ if (waivers.some(phrase => text === normalizeDescription(phrase))) {
2401
+ return waivedReviewGateState(description, activity);
2402
+ }
2403
+ return {
2404
+ state: REVIEW_GATE_STATES.unsatisfied,
2405
+ condition: REVIEW_GATE_CONDITIONS.notReviewed,
2406
+ why: `reported terminal SKIPPED with the description ${JSON.stringify(description ?? "")}. This check did not complete a review; its title cannot prove otherwise. An existing exact waiver or a trusted substitute for this head is required, and no substitute covers an objection.`,
2407
+ };
2408
+ }
2409
+
2378
2410
  /**
2379
2411
  * Builds the common verdict for a settle window that expired inconclusively.
2380
2412
  *