@codyswann/lisa 4.84.6 → 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.
- package/all/copy-overwrite/scripts/lib/completion-authorization.mjs +282 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-adapters.mjs +213 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-conformance.mjs +115 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-content.mjs +408 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-errors.mjs +16 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-github.mjs +233 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-markdown.mjs +70 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-projection.mjs +169 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-publisher.mjs +238 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-reader.mjs +175 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-shape.mjs +374 -0
- package/all/copy-overwrite/scripts/lib/completion-proof-source.mjs +174 -0
- package/all/copy-overwrite/scripts/lib/history-secret-scanner.mjs +20 -5
- package/all/copy-overwrite/scripts/lib/npm-update-helper-inventory.mjs +15 -0
- package/all/copy-overwrite/scripts/lib/usage-effectiveness.d.mts +27 -0
- package/all/copy-overwrite/scripts/lib/usage-effectiveness.mjs +156 -0
- package/all/copy-overwrite/scripts/lib/usage-ledger-integrity.d.mts +8 -0
- package/all/copy-overwrite/scripts/lib/usage-ledger-integrity.mjs +141 -0
- package/all/copy-overwrite/scripts/lib/usage-ledger.d.mts +89 -0
- package/all/copy-overwrite/scripts/lib/usage-ledger.mjs +206 -0
- package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +3 -1
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +255 -39
- package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +141 -3
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +186 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +108 -15
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/parity-safety-net.sh +3 -1
- package/dist/utils/effectiveness.d.ts +4 -41
- package/dist/utils/effectiveness.d.ts.map +1 -1
- package/dist/utils/effectiveness.js +2 -126
- package/dist/utils/effectiveness.js.map +1 -1
- package/dist/utils/usage-accounting.d.ts +5 -100
- package/dist/utils/usage-accounting.d.ts.map +1 -1
- package/dist/utils/usage-accounting.js +4 -287
- package/dist/utils/usage-accounting.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/lisa/hooks/host-name-command-context.mjs +16 -4
- package/plugins/lisa/hooks/parity-safety-net.sh +3 -1
- package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
- package/plugins/lisa/rules/reference/completion-authorization.md +10 -0
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa-agy/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/lisa-agy/hooks/host-name-command-context.mjs +16 -4
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +3 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa-agy/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa-agy/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/lisa-copilot/hooks/host-name-command-context.mjs +16 -4
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +3 -1
- package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
- package/plugins/lisa-copilot/rules/reference/completion-authorization.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa-copilot/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa-copilot/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/lisa-cursor/hooks/host-name-command-context.mjs +16 -4
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +3 -1
- package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
- package/plugins/lisa-cursor/rules/completion-authorization-reference.mdc +15 -0
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa-cursor/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa-cursor/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/lisa-devin/hooks/host-name-command-context.mjs +16 -4
- package/plugins/lisa-devin/hooks/parity-safety-net.sh +3 -1
- package/plugins/lisa-devin/rules/eager/00-rule-index.md +1 -0
- package/plugins/lisa-devin/rules/reference/completion-authorization.md +10 -0
- package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/lisa-devin/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/lisa-devin/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/src/base/hooks/block-host-name-leak.mjs +25 -13
- package/plugins/src/base/hooks/host-name-command-context.mjs +16 -4
- package/plugins/src/base/hooks/parity-safety-net.sh +3 -1
- package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
- package/plugins/src/base/rules/reference/completion-authorization.md +10 -0
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +15 -1
- package/plugins/src/base/skills/lisa-tracker-evidence/SKILL.md +7 -1
- package/plugins/src/base/skills/lisa-tracker-evidence/references/completion-authorization.md +193 -0
- package/scripts/lib/host-name-expanded-command-cases.mjs +286 -0
- package/scripts/lib/host-name-field-occurrence-cases.mjs +60 -0
- package/scripts/two-channel-couplings.json +2 -2
- package/scripts/verify-host-name-target-scope.mjs +27 -1
- package/typescript/copy-overwrite/.prettierignore +15 -0
- 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.
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/** Direct expanded command-name regressions; all identities are synthetic. */
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { boundedExecFileSync } from "./bounded-spawn.mjs";
|
|
4
|
+
|
|
5
|
+
/** @param {object} context Isolated actual-wrapper fixtures. @returns {Array[]} Named cases. */
|
|
6
|
+
export function hostNameExpandedCommandCases(context) {
|
|
7
|
+
const { lisaCwd, unknownCwd, hostCwd, lisa, host, fixtureName, body } =
|
|
8
|
+
context;
|
|
9
|
+
const cases = [];
|
|
10
|
+
for (const [target, cwd, repo] of [
|
|
11
|
+
["protected", lisaCwd, ` --repo ${lisa}`],
|
|
12
|
+
["unknown", unknownCwd, ""],
|
|
13
|
+
]) {
|
|
14
|
+
for (const [name, noun] of [
|
|
15
|
+
["unquoted", "$N"],
|
|
16
|
+
["double quoted", '"$N"'],
|
|
17
|
+
["braced", '"${N}"'],
|
|
18
|
+
["concatenated", 'is"$SUFFIX"'],
|
|
19
|
+
]) {
|
|
20
|
+
cases.push([
|
|
21
|
+
`expanded noun ${name} ${target} write`,
|
|
22
|
+
cwd,
|
|
23
|
+
`gh ${noun} create${repo} --body '${fixtureName}'`,
|
|
24
|
+
2,
|
|
25
|
+
]);
|
|
26
|
+
}
|
|
27
|
+
for (const [name, verb] of [
|
|
28
|
+
["unquoted", "$V"],
|
|
29
|
+
["double quoted", '"$V"'],
|
|
30
|
+
["braced", '"${V}"'],
|
|
31
|
+
["concatenated", 'cre"$TAIL"'],
|
|
32
|
+
]) {
|
|
33
|
+
cases.push([
|
|
34
|
+
`expanded verb ${name} ${target} write`,
|
|
35
|
+
cwd,
|
|
36
|
+
`gh issue ${verb}${repo} --body '${fixtureName}'`,
|
|
37
|
+
2,
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
for (const [name, prefix] of [
|
|
41
|
+
["multiple-word noun", "gh $N"],
|
|
42
|
+
["multiple-word verb", "gh issue $V"],
|
|
43
|
+
["noun before read-looking word", "gh $N view"],
|
|
44
|
+
["verb before read-looking word", "gh issue $V view"],
|
|
45
|
+
]) {
|
|
46
|
+
cases.push([
|
|
47
|
+
`expanded ${name} ${target} write`,
|
|
48
|
+
cwd,
|
|
49
|
+
`${prefix}${repo} --body '${fixtureName}'`,
|
|
50
|
+
2,
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
for (const [name, args] of [
|
|
54
|
+
["API field text", `-F body=${fixtureName}`],
|
|
55
|
+
["API field file", `-F body=@${body}`],
|
|
56
|
+
["API attached field file", `-Fbody=@${body}`],
|
|
57
|
+
["API raw field", `-f body=${fixtureName}`],
|
|
58
|
+
["API input file", `--input ${body}`],
|
|
59
|
+
]) {
|
|
60
|
+
cases.push([
|
|
61
|
+
`expanded noun possible ${name} ${target} write`,
|
|
62
|
+
cwd,
|
|
63
|
+
`gh "$N" repos/${lisa}/issues ${args}`,
|
|
64
|
+
2,
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
cases.push(
|
|
68
|
+
[
|
|
69
|
+
`expanded noun issue body-file ${target} write`,
|
|
70
|
+
cwd,
|
|
71
|
+
`gh "$N" create${repo} -F ${body}`,
|
|
72
|
+
2,
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
`expanded both command positions ${target} write`,
|
|
76
|
+
cwd,
|
|
77
|
+
`gh${repo} "$N" "$V" --body '${fixtureName}'`,
|
|
78
|
+
2,
|
|
79
|
+
]
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
cases.push(
|
|
83
|
+
[
|
|
84
|
+
"expanded PR verb protected body-file write",
|
|
85
|
+
lisaCwd,
|
|
86
|
+
`gh pr "$V" --repo ${lisa} --body-file ${body}`,
|
|
87
|
+
2,
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"expanded PR verb unknown body-file write",
|
|
91
|
+
unknownCwd,
|
|
92
|
+
`gh pr "$V" --body-file ${body}`,
|
|
93
|
+
2,
|
|
94
|
+
],
|
|
95
|
+
[
|
|
96
|
+
"expanded noun literal host flag cannot certify target",
|
|
97
|
+
hostCwd,
|
|
98
|
+
`gh "$N" create --repo ${host} --body '${fixtureName}'`,
|
|
99
|
+
2,
|
|
100
|
+
],
|
|
101
|
+
[
|
|
102
|
+
"expanded-name API GET prose with dynamic filter control",
|
|
103
|
+
lisaCwd,
|
|
104
|
+
`gh api repos/${lisa}/issues -X GET -F body=${fixtureName} -q "$FILTER"`,
|
|
105
|
+
0,
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
"expanded-name API GET input with dynamic filter control",
|
|
109
|
+
lisaCwd,
|
|
110
|
+
`gh api repos/${lisa}/issues -X GET --input ${body} -q "$FILTER"`,
|
|
111
|
+
0,
|
|
112
|
+
],
|
|
113
|
+
[
|
|
114
|
+
"expanded-name literal host control",
|
|
115
|
+
hostCwd,
|
|
116
|
+
`gh issue create --repo ${host} --body '${fixtureName}'`,
|
|
117
|
+
0,
|
|
118
|
+
],
|
|
119
|
+
[
|
|
120
|
+
"expanded-name literal protected control",
|
|
121
|
+
lisaCwd,
|
|
122
|
+
`gh issue create --repo ${lisa} --body '${fixtureName}'`,
|
|
123
|
+
2,
|
|
124
|
+
],
|
|
125
|
+
[
|
|
126
|
+
"expanded-name literal unknown control",
|
|
127
|
+
unknownCwd,
|
|
128
|
+
`gh issue create --body '${fixtureName}'`,
|
|
129
|
+
2,
|
|
130
|
+
],
|
|
131
|
+
[
|
|
132
|
+
"expanded-name dynamic read filter control",
|
|
133
|
+
lisaCwd,
|
|
134
|
+
`gh issue list --repo ${lisa} --json title --jq "$FILTER"`,
|
|
135
|
+
0,
|
|
136
|
+
],
|
|
137
|
+
[
|
|
138
|
+
"expanded-name dynamic read selector control",
|
|
139
|
+
lisaCwd,
|
|
140
|
+
`gh issue view "$NUMBER" --repo ${lisa} --json title --jq '${fixtureName}'`,
|
|
141
|
+
0,
|
|
142
|
+
],
|
|
143
|
+
[
|
|
144
|
+
"expanded-name API GET dynamic filter control",
|
|
145
|
+
lisaCwd,
|
|
146
|
+
`gh api repos/${lisa}/issues -X GET -q "$FILTER"`,
|
|
147
|
+
0,
|
|
148
|
+
],
|
|
149
|
+
[
|
|
150
|
+
"expanded-name single-quoted noun control",
|
|
151
|
+
lisaCwd,
|
|
152
|
+
`gh '$N' create --repo ${lisa} --body '${fixtureName}'`,
|
|
153
|
+
0,
|
|
154
|
+
],
|
|
155
|
+
[
|
|
156
|
+
"expanded-name single-quoted verb control",
|
|
157
|
+
lisaCwd,
|
|
158
|
+
`gh issue '$V' --repo ${lisa} --body '${fixtureName}'`,
|
|
159
|
+
0,
|
|
160
|
+
],
|
|
161
|
+
[
|
|
162
|
+
"expanded-name escaped noun control",
|
|
163
|
+
lisaCwd,
|
|
164
|
+
`gh \\$N create --repo ${lisa} --body '${fixtureName}'`,
|
|
165
|
+
0,
|
|
166
|
+
],
|
|
167
|
+
[
|
|
168
|
+
"expanded-name quoted non-command control",
|
|
169
|
+
lisaCwd,
|
|
170
|
+
`printf '%s' 'gh $N create --repo ${lisa} --body ${fixtureName}'`,
|
|
171
|
+
0,
|
|
172
|
+
],
|
|
173
|
+
[
|
|
174
|
+
"expanded-name clean prose control",
|
|
175
|
+
lisaCwd,
|
|
176
|
+
`gh "$N" create --repo ${lisa} --body 'A clean report.'`,
|
|
177
|
+
0,
|
|
178
|
+
],
|
|
179
|
+
[
|
|
180
|
+
"expanded-name options before noun preserve prose boundaries",
|
|
181
|
+
lisaCwd,
|
|
182
|
+
`gh --repo ${lisa} --title 'view list' "$N" create --body '${fixtureName}'`,
|
|
183
|
+
2,
|
|
184
|
+
],
|
|
185
|
+
[
|
|
186
|
+
"expanded-name literal host API control",
|
|
187
|
+
hostCwd,
|
|
188
|
+
`gh api repos/${host}/issues -F body=${fixtureName}`,
|
|
189
|
+
0,
|
|
190
|
+
]
|
|
191
|
+
);
|
|
192
|
+
return cases;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Establish expansion premises with a Bash function that only prints argv.
|
|
197
|
+
* @param {object} context Synthetic fixtures.
|
|
198
|
+
* @param {object} env Isolated child environment.
|
|
199
|
+
* @returns {void}
|
|
200
|
+
*/
|
|
201
|
+
export function verifyExpandedCommandArgv(context, env) {
|
|
202
|
+
const { lisaCwd, lisa, fixtureName, body } = context;
|
|
203
|
+
const suffix = ` --repo ${lisa} --body '${fixtureName}'`;
|
|
204
|
+
for (const [name, command, values, expected] of [
|
|
205
|
+
[
|
|
206
|
+
"unquoted noun",
|
|
207
|
+
`gh $N create${suffix}`,
|
|
208
|
+
{ N: "issue" },
|
|
209
|
+
["issue", "create", "--repo", lisa, "--body", fixtureName],
|
|
210
|
+
],
|
|
211
|
+
[
|
|
212
|
+
"quoted braced noun",
|
|
213
|
+
`gh "${"${N}"}" create${suffix}`,
|
|
214
|
+
{ N: "issue" },
|
|
215
|
+
["issue", "create", "--repo", lisa, "--body", fixtureName],
|
|
216
|
+
],
|
|
217
|
+
[
|
|
218
|
+
"concatenated noun",
|
|
219
|
+
`gh is"$SUFFIX" create${suffix}`,
|
|
220
|
+
{ SUFFIX: "sue" },
|
|
221
|
+
["issue", "create", "--repo", lisa, "--body", fixtureName],
|
|
222
|
+
],
|
|
223
|
+
[
|
|
224
|
+
"concatenated verb",
|
|
225
|
+
`gh issue cre"$TAIL"${suffix}`,
|
|
226
|
+
{ TAIL: "ate" },
|
|
227
|
+
["issue", "create", "--repo", lisa, "--body", fixtureName],
|
|
228
|
+
],
|
|
229
|
+
[
|
|
230
|
+
"multiword noun before read-looking word",
|
|
231
|
+
`gh $N view${suffix}`,
|
|
232
|
+
{ N: "issue create --title" },
|
|
233
|
+
[
|
|
234
|
+
"issue",
|
|
235
|
+
"create",
|
|
236
|
+
"--title",
|
|
237
|
+
"view",
|
|
238
|
+
"--repo",
|
|
239
|
+
lisa,
|
|
240
|
+
"--body",
|
|
241
|
+
fixtureName,
|
|
242
|
+
],
|
|
243
|
+
],
|
|
244
|
+
[
|
|
245
|
+
"multiword verb before read-looking word",
|
|
246
|
+
`gh issue $V view${suffix}`,
|
|
247
|
+
{ V: "create --title" },
|
|
248
|
+
[
|
|
249
|
+
"issue",
|
|
250
|
+
"create",
|
|
251
|
+
"--title",
|
|
252
|
+
"view",
|
|
253
|
+
"--repo",
|
|
254
|
+
lisa,
|
|
255
|
+
"--body",
|
|
256
|
+
fixtureName,
|
|
257
|
+
],
|
|
258
|
+
],
|
|
259
|
+
[
|
|
260
|
+
"possible API field file",
|
|
261
|
+
`gh "$N" repos/${lisa}/issues -F body=@${body}`,
|
|
262
|
+
{ N: "api" },
|
|
263
|
+
["api", `repos/${lisa}/issues`, "-F", `body=@${body}`],
|
|
264
|
+
],
|
|
265
|
+
]) {
|
|
266
|
+
const argv = boundedExecFileSync(
|
|
267
|
+
"/bin/bash",
|
|
268
|
+
["-c", `gh() { printf '%s\\0' "$@"; }; ${command}`],
|
|
269
|
+
{ cwd: lisaCwd, env: { ...env, ...values }, encoding: "utf8" }
|
|
270
|
+
)
|
|
271
|
+
.split("\0")
|
|
272
|
+
.slice(0, -1);
|
|
273
|
+
assert.deepEqual(argv, expected, name);
|
|
274
|
+
console.log(
|
|
275
|
+
JSON.stringify({
|
|
276
|
+
localExpandedArgvControl: {
|
|
277
|
+
name,
|
|
278
|
+
command,
|
|
279
|
+
argv,
|
|
280
|
+
inspectedTrackerWriteExecuted: false,
|
|
281
|
+
ghImplementation: "Bash argv-only printer",
|
|
282
|
+
},
|
|
283
|
+
})
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Repeated typed API fields must not hide an earlier unresolved prose file. */
|
|
2
|
+
export function hostNameFieldOccurrenceCases({ lisaCwd, lisa, relative }) {
|
|
3
|
+
const prefix = 'cd "$D" && gh',
|
|
4
|
+
endpoint = `repos/${lisa}/issues`,
|
|
5
|
+
clean = `${lisaCwd}/body.md`,
|
|
6
|
+
refusal = "BLOCKED: the working directory";
|
|
7
|
+
const unknown = (name, command) => [name, lisaCwd, command, 2, {}, refusal];
|
|
8
|
+
return [
|
|
9
|
+
unknown(
|
|
10
|
+
"expanded repeated field retains earlier relative prose file",
|
|
11
|
+
`${prefix} "$N" ${endpoint} --field body=@body.md --field title=clean`
|
|
12
|
+
),
|
|
13
|
+
unknown(
|
|
14
|
+
"literal API repeated field retains earlier relative prose file",
|
|
15
|
+
`${prefix} api ${endpoint} --field body=@body.md --field title=clean`
|
|
16
|
+
),
|
|
17
|
+
unknown(
|
|
18
|
+
"literal API repeated F before absolute clean field retains relative file",
|
|
19
|
+
`${prefix} api ${endpoint} -F body=@body.md -F title=@${clean}`
|
|
20
|
+
),
|
|
21
|
+
unknown(
|
|
22
|
+
"expanded repeated F union retains unresolved file control",
|
|
23
|
+
`${prefix} "$N" ${endpoint} -F body=@body.md -F title=@${clean}`
|
|
24
|
+
),
|
|
25
|
+
unknown(
|
|
26
|
+
"expanded repeated field body-last control",
|
|
27
|
+
`${prefix} "$N" ${endpoint} --field title=clean --field body=@body.md`
|
|
28
|
+
),
|
|
29
|
+
[
|
|
30
|
+
"literal API repeated fields known cwd reads original prose file",
|
|
31
|
+
lisaCwd,
|
|
32
|
+
`cd '${relative}' && gh api ${endpoint} --field body=@body.md --field title=clean`,
|
|
33
|
+
2,
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
"literal API repeated fields GET remains read-only",
|
|
37
|
+
lisaCwd,
|
|
38
|
+
`${prefix} api ${endpoint} -X GET --field body=@body.md --field title=clean -q "$FILTER"`,
|
|
39
|
+
0,
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
"nonadditive body-file last value remains authoritative",
|
|
43
|
+
lisaCwd,
|
|
44
|
+
`${prefix} issue create --repo ${lisa} --body-file missing.md --body-file ${clean}`,
|
|
45
|
+
0,
|
|
46
|
+
],
|
|
47
|
+
unknown(
|
|
48
|
+
"expanded mixed field aliases retain earlier relative file control",
|
|
49
|
+
`${prefix} "$N" ${endpoint} --field body=@body.md -F title=@${clean}`
|
|
50
|
+
),
|
|
51
|
+
unknown(
|
|
52
|
+
"expanded repeated equal field retains earlier relative file",
|
|
53
|
+
`${prefix} "$N" ${endpoint} --field=body=@body.md --field=title=clean`
|
|
54
|
+
),
|
|
55
|
+
unknown(
|
|
56
|
+
"literal API repeated attached F retains earlier relative file",
|
|
57
|
+
`${prefix} api ${endpoint} -Fbody=@body.md -Ftitle=@${clean}`
|
|
58
|
+
),
|
|
59
|
+
];
|
|
60
|
+
}
|
|
@@ -17,6 +17,11 @@ import path from "node:path";
|
|
|
17
17
|
import { boundedExecFileSync, boundedSpawnSync } from "./lib/bounded-spawn.mjs";
|
|
18
18
|
import { hostNameTargetCases } from "./lib/host-name-target-cases.mjs";
|
|
19
19
|
import { hostNameReviewCases } from "./lib/host-name-review-cases.mjs";
|
|
20
|
+
import {
|
|
21
|
+
hostNameExpandedCommandCases,
|
|
22
|
+
verifyExpandedCommandArgv,
|
|
23
|
+
} from "./lib/host-name-expanded-command-cases.mjs";
|
|
24
|
+
import { hostNameFieldOccurrenceCases } from "./lib/host-name-field-occurrence-cases.mjs";
|
|
20
25
|
|
|
21
26
|
const root = process.cwd();
|
|
22
27
|
const DETECTOR_RELATIVE = "dist/core/downstream-references.js";
|
|
@@ -118,6 +123,15 @@ try {
|
|
|
118
123
|
const identity = {
|
|
119
124
|
proverCheckoutHead: git(root, ["rev-parse", "HEAD"]),
|
|
120
125
|
proverSha256: digest(new URL(import.meta.url)),
|
|
126
|
+
caseModules: [
|
|
127
|
+
"host-name-target-cases.mjs",
|
|
128
|
+
"host-name-review-cases.mjs",
|
|
129
|
+
"host-name-expanded-command-cases.mjs",
|
|
130
|
+
"host-name-field-occurrence-cases.mjs",
|
|
131
|
+
].map(file => ({
|
|
132
|
+
file,
|
|
133
|
+
sha256: digest(new URL(`./lib/${file}`, import.meta.url)),
|
|
134
|
+
})),
|
|
121
135
|
payloadRoot,
|
|
122
136
|
payloadPackageVersion: JSON.parse(
|
|
123
137
|
readFileSync(path.join(payloadRoot, "package.json"), "utf8")
|
|
@@ -299,7 +313,10 @@ try {
|
|
|
299
313
|
const cases = [
|
|
300
314
|
...hostNameTargetCases(context),
|
|
301
315
|
...hostNameReviewCases(context),
|
|
316
|
+
...hostNameExpandedCommandCases(context),
|
|
317
|
+
...hostNameFieldOccurrenceCases(context),
|
|
302
318
|
];
|
|
319
|
+
verifyExpandedCommandArgv(context, fixtureEnv);
|
|
303
320
|
for (const [
|
|
304
321
|
name,
|
|
305
322
|
cwd,
|
|
@@ -330,7 +347,16 @@ try {
|
|
|
330
347
|
);
|
|
331
348
|
const passed =
|
|
332
349
|
run.status === expected && (expected !== 2 || output.includes(refusal));
|
|
333
|
-
records.push({
|
|
350
|
+
records.push({
|
|
351
|
+
name,
|
|
352
|
+
cwd,
|
|
353
|
+
command,
|
|
354
|
+
overrides,
|
|
355
|
+
expected,
|
|
356
|
+
actual: run.status,
|
|
357
|
+
passed,
|
|
358
|
+
output,
|
|
359
|
+
});
|
|
334
360
|
console.log(JSON.stringify(records.at(-1)));
|
|
335
361
|
}
|
|
336
362
|
const failed = records.filter(record => !record.passed);
|
|
@@ -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
|