persona-harness 0.8.0-beta.21 → 0.8.0-beta.22
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/docs/current/README.md +19 -16
- package/docs/current/canonical-docs-index.md +4 -2
- package/docs/current/docs-inventory.md +4 -2
- package/docs/current/release/README.md +40 -27
- package/docs/current/release/consumer-authority-beta.md +26 -13
- package/docs/current/release/consumer-authority-beta22-acceptance.json +587 -0
- package/docs/current/release/v0.8.0-beta.22-release-notes.md +59 -0
- package/docs/releases/package-index.md +1 -0
- package/package.json +3 -1
- package/scripts/consumer-authority-beta22-acceptance-schema.d.mts +9 -0
- package/scripts/consumer-authority-beta22-acceptance-schema.mjs +171 -0
- package/scripts/preflight-consumer-authority-external-artifact-transport.mjs +2 -2
- package/scripts/preflight-consumer-authority-external-attestation.mjs +2 -2
package/docs/current/README.md
CHANGED
|
@@ -41,7 +41,7 @@ not become current merely because they remain under `docs/current/`.
|
|
|
41
41
|
[`docs/releases/package-index.md`](../releases/package-index.md).
|
|
42
42
|
- Release operations and workflow-compatible release notes:
|
|
43
43
|
[`release/README.md`](release/README.md) and
|
|
44
|
-
[`release/v0.8.0-beta.
|
|
44
|
+
[`release/v0.8.0-beta.22-release-notes.md`](release/v0.8.0-beta.22-release-notes.md).
|
|
45
45
|
- P3 integrity roadmap and release hold:
|
|
46
46
|
[`p3-integrity-roadmap.md`](p3-integrity-roadmap.md).
|
|
47
47
|
- P3-2 closure authority candidate:
|
|
@@ -118,23 +118,26 @@ not become current merely because they remain under `docs/current/`.
|
|
|
118
118
|
policy artifact verifier remains read-only/non-authoritative, while local or
|
|
119
119
|
caller-provided staged-package evidence remains
|
|
120
120
|
`artifact-provenance-unavailable`.
|
|
121
|
-
- `0.8.0-beta.1` through `0.8.0-beta.
|
|
121
|
+
- `0.8.0-beta.1` through `0.8.0-beta.20` are historical staging-only Consumer
|
|
122
122
|
Authority Beta evidence. Beta.16's external observer accepted an exit-zero
|
|
123
123
|
artifact download without an exact nonempty ZIP postcondition, so it
|
|
124
|
-
provides no reusable
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
124
|
+
provides no reusable transport, verification, Finish, consumption, or replay
|
|
125
|
+
fact. Beta.17's Node20/npm10 registry PUT was authorization-shaped, not a
|
|
126
|
+
package-absence claim. Beta.18 is immutable staging evidence: its registry
|
|
127
|
+
version, selected tag, SHA-1/SRI, raw SHA-256, and portable content identity
|
|
128
|
+
matched frozen canonical facts, but its readback incorrectly required an
|
|
129
|
+
unsupported registry `gitHead` metadata field. `0.8.0-beta.21` is
|
|
130
|
+
non-reusable temporal final-observer evidence because online crypto and
|
|
131
|
+
identity bindings completed only after the leaf certificate window expired.
|
|
132
|
+
`0.8.0-beta.22` is the current procedure-only source candidate. It makes no
|
|
133
|
+
package, tag, staging mapping, GitHub release, original signed consumer
|
|
134
|
+
artifact, promotion, Stable/GA, or Finish authority claim. Its pre-fixture
|
|
135
|
+
gate requires source-bound bootstrap before one final fixture commit, retention
|
|
136
|
+
of that same unpushed commit as the installed consumer CWD/HEAD, a
|
|
137
|
+
package-visible observer credential preflight, separate caller/reusable signer
|
|
138
|
+
binding, portable canonical package-content identity, and the complete public
|
|
139
|
+
Java/Spring lifecycle to reach only `trusted-authority-required` in
|
|
140
|
+
[`release/v0.8.0-beta.22-release-notes.md`](release/v0.8.0-beta.22-release-notes.md).
|
|
138
141
|
- P3-9 permits separately dispatched P2 source, measurement, or report-only
|
|
139
142
|
investigation. The sole product-scope exception is
|
|
140
143
|
[`korean-cli-help-scope-authorization.md`](korean-cli-help-scope-authorization.md)
|
|
@@ -57,8 +57,10 @@ current decision inputs.
|
|
|
57
57
|
| 0.8.0-beta.17 acceptance record | `docs/current/release/consumer-authority-beta17-acceptance.json` | Historical machine-readable source/packed lifecycle, package-root, canonical tar/content identity, bounded command/transport parser preflights, safe ZIP handoff, modeled exact-once Finish/replay, privacy, and one superseded current-version artifact residual. |
|
|
58
58
|
| 0.8.0-beta.18 Consumer Authority Beta | `docs/current/release/v0.8.0-beta.18-release-notes.md` | Historical staging evidence: registry bytes matched canonical facts, but an unsupported registry gitHead predicate blocked workflow readback. |
|
|
59
59
|
| 0.8.0-beta.18 acceptance record | `docs/current/release/consumer-authority-beta18-acceptance.json` | Historical machine-readable source/packed lifecycle and Node20 packer to Node24 publisher contract. |
|
|
60
|
-
| 0.8.0-beta.19 Consumer Authority Beta | `docs/current/release/v0.8.0-beta.19-release-notes.md` |
|
|
61
|
-
| 0.8.0-beta.19 acceptance record | `docs/current/release/consumer-authority-beta19-acceptance.json` |
|
|
60
|
+
| 0.8.0-beta.19 Consumer Authority Beta | `docs/current/release/v0.8.0-beta.19-release-notes.md` | Historical staging evidence; its registry/original artifact checks do not supply current-version authority completion. |
|
|
61
|
+
| 0.8.0-beta.19 acceptance record | `docs/current/release/consumer-authority-beta19-acceptance.json` | Historical machine-readable source/packed lifecycle, package-root, canonical publisher, bounded observer plans, and one superseded hosted residual. |
|
|
62
|
+
| 0.8.0-beta.22 Consumer Authority Beta | `docs/current/release/v0.8.0-beta.22-release-notes.md` | Current procedure-only source candidate: source-bound bootstrap precedes one final fixture commit, and the same unpushed commit remains the installed consumer CWD/HEAD. |
|
|
63
|
+
| 0.8.0-beta.22 acceptance record | `docs/current/release/consumer-authority-beta22-acceptance.json` | Machine-readable beta22 procedure, package, observer, and one hosted residual contract; it changes no product authority behavior. |
|
|
62
64
|
| Consumer Authority Beta lifecycle | `docs/current/release/consumer-authority-beta.md` | Fixed tag-bound staging, exact package readback, original-artifact consumer boundary, and separately approved `next` promotion sequence. |
|
|
63
65
|
| 0.7.0-rc.3 published capsule | `docs/releases/v0.7.0-rc.3/README.md` | Current npm `next` candidate with matching registry gitHead, tag, GitHub prerelease, and workflow provenance. |
|
|
64
66
|
| 0.7.0-rc.2 published capsule | `docs/releases/v0.7.0-rc.2/README.md` | Previous npm `next` candidate with registry gitHead/tag/workflow provenance. |
|
|
@@ -220,7 +220,8 @@ Total indexed files: 336
|
|
|
220
220
|
| `docs/current/release/v0.8.0-beta.16-release-notes.md` | version-specific release note | v0.8.0-beta.16 | Historical Consumer Authority Beta staging evidence. Its observer accepted an exit-zero API download without proving a nonempty exact ZIP, so it supplies no beta.17 transport or authority evidence. |
|
|
221
221
|
| `docs/current/release/v0.8.0-beta.17-release-notes.md` | version-specific release note | v0.8.0-beta.17 | Historical Consumer Authority Beta source-preparation record. Its canonical tar/provenance observation ended at an authorization-shaped registry response and makes no package-absence, promotion, or Finish authority claim. |
|
|
222
222
|
| `docs/current/release/v0.8.0-beta.18-release-notes.md` | version-specific release note | v0.8.0-beta.18 | Historical immutable staging evidence. Registry bytes matched canonical facts, but an unsupported registry gitHead predicate blocked workflow readback. |
|
|
223
|
-
| `docs/current/release/v0.8.0-beta.19-release-notes.md` | version-specific release note | v0.8.0-beta.19 |
|
|
223
|
+
| `docs/current/release/v0.8.0-beta.19-release-notes.md` | version-specific release note | v0.8.0-beta.19 | Historical Consumer Authority Beta staging evidence; it makes no current-version authority, consumption, replay, promotion, or Finish authority claim. |
|
|
224
|
+
| `docs/current/release/v0.8.0-beta.22-release-notes.md` | version-specific release note | v0.8.0-beta.22 | Current procedure-only Consumer Authority Beta source candidate: source-bound bootstrap precedes one final fixture commit, whose identical unpushed SHA remains the installed consumer CWD/HEAD. |
|
|
224
225
|
| `docs/current/release/consumer-authority-beta7-acceptance.json` | machine-readable release contract | v0.8.0-beta.7 | Historical source/packed lifecycle record retained with beta.7 staging evidence; it cannot satisfy beta.10 current-version authority. |
|
|
225
226
|
| `docs/current/release/consumer-authority-beta8-acceptance.json` | machine-readable release contract | v0.8.0-beta.8 | Historical source/packed lifecycle and beta.7 expiry record. The later beta.8 original-artifact discovery failure is recorded by the beta.9 acceptance contract. |
|
|
226
227
|
| `docs/current/release/consumer-authority-beta9-acceptance.json` | machine-readable release contract | v0.8.0-beta.9 | Historical source/packed lifecycle record for beta.8 discovery-to-binding; beta.9's independently verified original artifact and endpoint failure are recorded by the beta.10 acceptance contract. |
|
|
@@ -233,7 +234,8 @@ Total indexed files: 336
|
|
|
233
234
|
| `docs/current/release/consumer-authority-beta16-acceptance.json` | machine-readable release contract | v0.8.0-beta.16 | Historical source/packed public initialization, root-bound exact-tar package proof, canonical no-token gh parser preflight, and modeled authority-backed Finish readiness contract. |
|
|
234
235
|
| `docs/current/release/consumer-authority-beta17-acceptance.json` | machine-readable release contract | v0.8.0-beta.17 | Source/packed public initialization, root-bound exact-tar package proof, canonical no-token command and transport parser preflights, safe external ZIP handoff, and authority-backed Finish readiness contract with modeled exact-once consumption/replay and one future current-version artifact residual. |
|
|
235
236
|
| `docs/current/release/consumer-authority-beta18-acceptance.json` | machine-readable release contract | v0.8.0-beta.18 | Source/packed lifecycle and package-root contract extended with the strict Node20 canonical packer, isolated Node24 publisher, exact canonical-tar dry-run, and one hosted registry PUT/readback residual. |
|
|
236
|
-
| `docs/current/release/consumer-authority-beta19-acceptance.json` | machine-readable release contract | v0.8.0-beta.19 |
|
|
237
|
+
| `docs/current/release/consumer-authority-beta19-acceptance.json` | machine-readable release contract | v0.8.0-beta.19 | Historical source/packed lifecycle and package-root contract extended with workflow-bound canonical source-to-registry-byte reconciliation and sanitized failed-readback evidence. |
|
|
238
|
+
| `docs/current/release/consumer-authority-beta22-acceptance.json` | machine-readable release contract | v0.8.0-beta.22 | Current procedure-only source/packed observer contract binding the immutable final-observer procedure record, source-bound pre-push commit, and one hosted residual. |
|
|
237
239
|
| `docs/current/release/consumer-authority-beta.md` | operational stable | - | Staging-first Consumer Authority Beta lifecycle boundary with fixed tag/readback, original-artifact consumer verification, and separately approved next promotion. |
|
|
238
240
|
| `docs/current/release/production-integrity-audit.md` | operational stable | - | Fixed protected-main read-only Actions audit contract with sanitized digest-bound durable output; it cannot mutate release state or grant authority. |
|
|
239
241
|
| `docs/current/rule-curation.md` | current compatibility doc | - | Compatibility/current-era doc retained in place; migrate by summary and pointer before moving. |
|
|
@@ -81,33 +81,46 @@ incorrectly required an unsupported registry `gitHead` metadata field.
|
|
|
81
81
|
`0.8.0-beta.20` is immutable staging-only evidence: live authority fetch reached
|
|
82
82
|
`trusted/unconsumed`, then Finish correctly blocked before consumption because
|
|
83
83
|
the observer had not initialized the same consumer workflow state.
|
|
84
|
-
`0.8.0-beta.21` is
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
84
|
+
`0.8.0-beta.21` is non-reusable temporal final-observer evidence: its online
|
|
85
|
+
crypto and identity bindings passed only after the leaf certificate window
|
|
86
|
+
expired, so authenticated fetch, Finish consumption, and replay were not run.
|
|
87
|
+
`0.8.0-beta.22` is the next strict-prerelease procedure-only source candidate;
|
|
88
|
+
it has no source-level claim of a tag, publish, channel movement, GitHub
|
|
89
|
+
release, or original signed consumer artifact. Beta22 records the governed
|
|
90
|
+
future final-observer procedure without changing product fetch, authority,
|
|
91
|
+
Finish, transport, workflow, or CI behavior.
|
|
92
|
+
|
|
93
|
+
The beta22 release contract requires package-visible observer credential
|
|
94
|
+
preflight, separate caller/reusable signer binding, and a complete public
|
|
95
|
+
Java/Spring readiness route whose default Finish is blocked only by
|
|
96
|
+
`trusted-authority-required` before a fixture may be authorized. Source-bound
|
|
97
|
+
bootstrap must finish before the final fixture commit. That one commit may
|
|
98
|
+
contain only declared source-bound bootstrap outputs and the immutable reusable
|
|
99
|
+
pin; the same unpushed final fixture commit is retained as the installed
|
|
100
|
+
consumer CWD/HEAD. Later slow preparation may modify only excluded runtime or
|
|
101
|
+
build state. Immediately before its one normal push, the remote parent, CWD,
|
|
102
|
+
Git top-level, HEAD, and source identity must still bind to that final commit.
|
|
103
|
+
No lifecycle reinitialization, consumer switch, or source reset is permitted
|
|
104
|
+
after fetch.
|
|
105
|
+
|
|
106
|
+
The preflights use a host-derived credential only inside their fixed read-only
|
|
107
|
+
GitHub Actions worker; they do not pass that credential to `ph`, npm, archive
|
|
108
|
+
tooling, or the consumer HOME. Beta22 retains the no-token/no-artifact
|
|
109
|
+
attestation and artifact transport parser preflights. The transport plan binds
|
|
110
|
+
the caller repository/run/artifact endpoint, exact ZIP bytes, and safe members
|
|
111
|
+
before it hands an original ZIP to the separate reusable signer command plan.
|
|
112
|
+
Its package evidence starts from the exact complete-history bundle, not an
|
|
113
|
+
ambient working directory: detached checkout, Git/manifest/lock/npm-prefix
|
|
114
|
+
binding, normal prepack, and fresh installed CLI identity must all agree before
|
|
115
|
+
the tarball is eligible for independent package review. The package proof uses
|
|
116
|
+
plain `npm` from that bound detached checkout, never `npm --prefix ... pack`,
|
|
117
|
+
and uses the exact resulting tarball for both source-built and fresh installed
|
|
118
|
+
consumer contracts. Its release handoff keeps the Node20/npm10 canonical packer
|
|
119
|
+
separate from the isolated Node24/npm11 publisher, which dry-runs and then
|
|
120
|
+
publishes the same canonical tarball only. Postpublish reconciliation binds
|
|
121
|
+
protected workflow source preflight to registry version, selected tag, SHA-1/SRI,
|
|
122
|
+
raw SHA-256, and portable content identity; it does not require registry
|
|
123
|
+
`gitHead`.
|
|
111
124
|
`0.7.0-rc.2` remains an earlier published `next` record.
|
|
112
125
|
|
|
113
126
|
The staged-package artifact producer is a controlled future-run source:
|
|
@@ -6,17 +6,20 @@ user-scoped consumer authority route; neither one automatically promotes a
|
|
|
6
6
|
package or makes Finish pass.
|
|
7
7
|
|
|
8
8
|
`0.8.0-beta.1` through `0.8.0-beta.20` are immutable staging-only evidence.
|
|
9
|
-
Their registry and provenance observations cannot be reused as
|
|
10
|
-
|
|
9
|
+
Their registry and provenance observations cannot be reused as current-version
|
|
10
|
+
consumer authority evidence. Beta.16's final observer accepted
|
|
11
11
|
an exit-zero API download without proving a nonempty exact ZIP, so it stopped
|
|
12
12
|
before ZIP validation. Beta.17 created a canonical tarball and provenance but
|
|
13
13
|
its Node20/npm10 registry PUT received an authorization-shaped E404; that is not
|
|
14
14
|
a package-absence claim, and beta.16 remains present in the public registry.
|
|
15
15
|
Beta.18 is immutable staging evidence: its registry bytes matched canonical
|
|
16
16
|
facts, but its postpublish checker incorrectly required an unsupported registry
|
|
17
|
-
`gitHead` metadata field.
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
`gitHead` metadata field. Beta.21 is non-reusable temporal final-observer
|
|
18
|
+
evidence: online crypto and identity bindings completed only after the leaf
|
|
19
|
+
certificate window expired, so fetch, Finish, and replay did not run. The active
|
|
20
|
+
`0.8.0-beta.22` procedure-only source candidate has no package, tag, channel
|
|
21
|
+
movement, GitHub release, or signed consumer-project artifact at source
|
|
22
|
+
preparation time.
|
|
20
23
|
|
|
21
24
|
The prior beta candidates are retained as staging-only NO-GO or
|
|
22
25
|
source-preparation evidence: none qualifies for promotion or issue closure
|
|
@@ -24,9 +27,10 @@ because it did not complete the full current-version public consumer route.
|
|
|
24
27
|
Beta.20 reached a live `trusted/unconsumed` fetch but then correctly stopped at
|
|
25
28
|
`workflow-state-uninitialized` because the observer had not prepared the same
|
|
26
29
|
consumer's public lifecycle. That result consumed nothing and is not reusable.
|
|
27
|
-
|
|
28
|
-
inherit beta.16's observer failure, beta.17's
|
|
29
|
-
|
|
30
|
+
Beta22 binds the immutable same-consumer observer order and the pre-push source
|
|
31
|
+
identity procedure. It cannot inherit beta.16's observer failure, beta.17's
|
|
32
|
+
registry PUT result, beta.18's failed metadata predicate, beta.21's expired
|
|
33
|
+
temporal result, an earlier lifecycle, or an earlier authority result.
|
|
30
34
|
|
|
31
35
|
The consumer must create its own workflow state through public bootstrap and
|
|
32
36
|
report/evidence commands in the exact project that later fetches authority.
|
|
@@ -37,6 +41,15 @@ After public initialization the same command must reach only
|
|
|
37
41
|
artifact then proves one real Finish consumption and immediate replay block
|
|
38
42
|
without standing in for hosted crypto evidence.
|
|
39
43
|
|
|
44
|
+
For the final public fixture, source-bound bootstrap must complete before the
|
|
45
|
+
final fixture commit. That one commit contains only declared source-bound
|
|
46
|
+
bootstrap outputs and the immutable reusable workflow pin. The same unpushed
|
|
47
|
+
final fixture commit is retained as the installed consumer CWD/HEAD; subsequent
|
|
48
|
+
slow preparation may change only excluded runtime and build state. Immediately
|
|
49
|
+
before the one normal push, the fixture remote parent, CWD, Git top-level, HEAD,
|
|
50
|
+
and source identity must still match the final commit. No lifecycle or source
|
|
51
|
+
reinitialization, consumer switch, or state reset is permitted after fetch.
|
|
52
|
+
|
|
40
53
|
## Fixed Sequence
|
|
41
54
|
|
|
42
55
|
1. An approved protected-main source candidate has strict prerelease SemVer
|
|
@@ -139,12 +152,12 @@ authority artifact or Finish PASS.
|
|
|
139
152
|
|
|
140
153
|
The external-attested fixture must pin the exact current package revision. The
|
|
141
154
|
verifier binds the signed receipt `phVersion` to its installed CLI version, so
|
|
142
|
-
an original artifact from `0.8.0-beta.1` through `0.8.0-beta.
|
|
143
|
-
binding mismatch or historical-evidence block for `0.8.0-beta.
|
|
155
|
+
an original artifact from `0.8.0-beta.1` through `0.8.0-beta.21` is a bounded
|
|
156
|
+
binding mismatch or historical-evidence block for `0.8.0-beta.22`; only a future
|
|
144
157
|
original signed artifact for the current immutable version can exercise
|
|
145
158
|
enrollment, fetch, explicit consumption, and replay rejection. The complete
|
|
146
159
|
source/packed acceptance contract is the structured
|
|
147
|
-
[`consumer-authority-
|
|
160
|
+
[`consumer-authority-beta22-acceptance.json`](consumer-authority-beta22-acceptance.json)
|
|
148
161
|
record; it names the exact public Java/Spring readiness route, the separate
|
|
149
162
|
caller and reusable certificate identities, the independent observer credential
|
|
150
163
|
and no-token command/transport plan preflights, the immutable same-consumer
|
|
@@ -157,7 +170,7 @@ than caller project source. The profile, Gradle descriptors, Git identity,
|
|
|
157
170
|
reports, and evidence remain bound. This does not relax caller enrollment,
|
|
158
171
|
reusable SHA/SAN, repository, source, run, original-archive, or digest checks.
|
|
159
172
|
|
|
160
|
-
Before beta.
|
|
173
|
+
Before beta.22 package evidence is accepted, the verifier materializes the
|
|
161
174
|
exact complete-history bundle in a detached no-local checkout. It binds one
|
|
162
175
|
explicit canonical `refs/heads/...` candidate ref and
|
|
163
176
|
`refs/remotes/origin/main`; the candidate ref must equal the expected candidate
|
|
@@ -205,7 +218,7 @@ is not retained.
|
|
|
205
218
|
|
|
206
219
|
## Live Verification Deadline
|
|
207
220
|
|
|
208
|
-
Before the one natural beta.
|
|
221
|
+
Before the one natural beta.22 fixture push, an independent observer must prepare
|
|
209
222
|
one exact Git-backed registry consumer CWD/HEAD and one private consumer `HOME`.
|
|
210
223
|
It must first complete the public bootstrap/Gradle/report/evidence/plan route and
|
|
211
224
|
confirm default Finish is blocked only by `trusted-authority-required`; it may
|
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "consumer-authority-beta22-acceptance.1",
|
|
3
|
+
"package": {
|
|
4
|
+
"channel": "staging",
|
|
5
|
+
"scope": "staging-only",
|
|
6
|
+
"version": "0.8.0-beta.22"
|
|
7
|
+
},
|
|
8
|
+
"packageBoundary": {
|
|
9
|
+
"bundle": {
|
|
10
|
+
"requiredRefs": [
|
|
11
|
+
"explicit-single-refs-heads-candidate-must-match-expected-head",
|
|
12
|
+
"refs/remotes/origin/main"
|
|
13
|
+
],
|
|
14
|
+
"verification": "git-bundle-verify-and-exact-ref-binding",
|
|
15
|
+
"baseComparison": "independent-no-local-base-checkout-under-the-same-npm-policy"
|
|
16
|
+
},
|
|
17
|
+
"cleanCheckout": {
|
|
18
|
+
"requiredBindings": [
|
|
19
|
+
"checkout-cwd",
|
|
20
|
+
"git-toplevel",
|
|
21
|
+
"npm-prefix",
|
|
22
|
+
"resolved-package-json-path",
|
|
23
|
+
"resolved-package-lock-path",
|
|
24
|
+
"HEAD-package-json-bytes",
|
|
25
|
+
"HEAD-package-lock-bytes"
|
|
26
|
+
],
|
|
27
|
+
"sourceFallback": "forbidden"
|
|
28
|
+
},
|
|
29
|
+
"npm": {
|
|
30
|
+
"invocation": "plain-npm-from-bound-detached-checkout-cwd",
|
|
31
|
+
"packPrefixFlag": "forbidden",
|
|
32
|
+
"global": false,
|
|
33
|
+
"ignoreScriptsBeforePack": false,
|
|
34
|
+
"install": "npm-ci-ignore-scripts",
|
|
35
|
+
"workspaces": false
|
|
36
|
+
},
|
|
37
|
+
"pack": {
|
|
38
|
+
"metadata": "name-version-filename-must-match-frozen-package-and-lock",
|
|
39
|
+
"prepack": "package-root-build-script-derived-from-its-own-package-root",
|
|
40
|
+
"postcondition": "fresh-installed-cli-version-must-match-tarball-version"
|
|
41
|
+
},
|
|
42
|
+
"authoritativeBundleContract": {
|
|
43
|
+
"command": "node scripts/verify-clean-package-boundary.mjs --exercise-contract",
|
|
44
|
+
"baseAndTarget": "fresh-detached-no-local-checkouts-from-the-same-complete-bundle",
|
|
45
|
+
"candidateRef": "explicit-single-refs-heads-candidate-must-match-expected-head",
|
|
46
|
+
"headAlias": "optional-head-mapping-must-match-the-same-expected-head",
|
|
47
|
+
"sourceCandidateRef": "refs/heads/clean-package-source",
|
|
48
|
+
"rejectBeforePack": "launcher-cwd-or-manifest-outside-bound-checkout",
|
|
49
|
+
"sourceContract": "built-cli-package-exercise-contract-under-the-same-executable",
|
|
50
|
+
"installedContract": "fresh-installed-package-exercise-uses-the-exact-canonical-target-tarball-sha256-and-package-content-identity-before-the-separate-node24-publisher-handoff",
|
|
51
|
+
"fullJavaGradleContract": "source-and-fresh-installed-full-contract-on-a-provisioned-java-gradle-host",
|
|
52
|
+
"partialCloneSourceHydration": "only-a-blob-none-promisor-clone-with-the-exact-canonical-origin-may-no-filter-hydrate-the-retained-origin-main-sha-before-local-bundle-materialization-without-moving-refs"
|
|
53
|
+
},
|
|
54
|
+
"contentIdentity": {
|
|
55
|
+
"aggregate": "sorted-package-relative-path-type-normalized-allowed-mode-size-sha256",
|
|
56
|
+
"allowedMemberTypes": [
|
|
57
|
+
"regular"
|
|
58
|
+
],
|
|
59
|
+
"allowedModes": [
|
|
60
|
+
"0600",
|
|
61
|
+
"0644",
|
|
62
|
+
"0700",
|
|
63
|
+
"0755"
|
|
64
|
+
],
|
|
65
|
+
"canonicalPacker": {
|
|
66
|
+
"environment": [
|
|
67
|
+
"isolated-HOME",
|
|
68
|
+
"isolated-npm-cache",
|
|
69
|
+
"isolated-npm-config",
|
|
70
|
+
"isolated-git-config",
|
|
71
|
+
"umask-0022",
|
|
72
|
+
"LANG-C",
|
|
73
|
+
"LC_ALL-C",
|
|
74
|
+
"TZ-UTC",
|
|
75
|
+
"SOURCE_DATE_EPOCH-0"
|
|
76
|
+
],
|
|
77
|
+
"node": "20.19.0",
|
|
78
|
+
"npm": "10.8.2",
|
|
79
|
+
"publish": "handoff-one-exact-canonical-tarball-to-isolated-node24-npm11-publisher"
|
|
80
|
+
},
|
|
81
|
+
"crossEnvironment": "compare-package-content-identity-not-generic-independent-npm-pack-raw-tar-sha256",
|
|
82
|
+
"rawTarballSha256": "valid-only-for-the-exact-canonical-supplied-tarball-or-postpublish-registry-blob",
|
|
83
|
+
"registryReadback": "require-protected-main-tag-source-preflight-and-registry-version-sha1-sri-raw-sha256-and-package-content-identity-to-match-frozen-canonical-package-facts-without-registry-githead",
|
|
84
|
+
"retainedExternalDiagnostics": {
|
|
85
|
+
"beta16": {
|
|
86
|
+
"contentOnlySha256": "9bb1c7eaeceb79d198d7baafdaea9c8bc73cd8750209ea5aa76cfc46070e0832",
|
|
87
|
+
"entryCount": 1191,
|
|
88
|
+
"identitySha256": "9eac0bdc041e8e616bd6e4de3ba49e8490b8a269f3f0d3e520027833b927c332",
|
|
89
|
+
"modeCounts": {
|
|
90
|
+
"0600": 296,
|
|
91
|
+
"0644": 887,
|
|
92
|
+
"0700": 7,
|
|
93
|
+
"0755": 1
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"beta17": {
|
|
97
|
+
"contentOnlySha256": "d411a23a2343cd21e33ac30250ed903934968e214b7f198ccd0ea91a7d6bf580",
|
|
98
|
+
"entryCount": 1200,
|
|
99
|
+
"identitySha256": "5771dc973dd95e5d3f8b01a9e17becf3c17223b3d94aed692e5248e0c3054c5e",
|
|
100
|
+
"modeCounts": {
|
|
101
|
+
"0600": 305,
|
|
102
|
+
"0644": 887,
|
|
103
|
+
"0700": 7,
|
|
104
|
+
"0755": 1
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"headerClassification": "normalized-gzip-tar-headers-do-not-explain-the-retained-content-or-mode-identity-delta",
|
|
108
|
+
"reuse": "diagnostic-only-not-acceptance-evidence"
|
|
109
|
+
},
|
|
110
|
+
"schemaVersion": "package-content-identity.1",
|
|
111
|
+
"publisherRuntime": "node24.18.0-npm11.16.0-dry-run-and-real-publish-use-identical-canonical-tarball-argv"
|
|
112
|
+
},
|
|
113
|
+
"registryReadback": {
|
|
114
|
+
"failureEvidence": "sanitized-readback-is-uploaded-even-when-postpublish-reconciliation-blocks",
|
|
115
|
+
"sourceBinding": "workflow-verified-canonical-tar",
|
|
116
|
+
"unsupportedMetadata": "registry-githead-is-neither-required-nor-reflected"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"preAuthorityReadiness": {
|
|
120
|
+
"consumer": "exact-registry-installed-java-spring-gradle",
|
|
121
|
+
"commands": [
|
|
122
|
+
"ph bootstrap backend --strict --no-developer-mcp",
|
|
123
|
+
"ph bearshell ./gradlew test",
|
|
124
|
+
"ph bearshell ./gradlew compileJava",
|
|
125
|
+
"ph bearshell ./gradlew clean",
|
|
126
|
+
"ph evidence read README.md",
|
|
127
|
+
"ph evidence read .persona/project-profile.jsonc",
|
|
128
|
+
"ph evidence read src/main/java/example/cooperative/GreetingService.java",
|
|
129
|
+
"ph plan --report-filled implementation --stdin",
|
|
130
|
+
"ph plan --report-filled review --stdin"
|
|
131
|
+
],
|
|
132
|
+
"expectedDefaultFinish": {
|
|
133
|
+
"absentBlockers": [
|
|
134
|
+
"implementation-report-missing",
|
|
135
|
+
"review-report-missing",
|
|
136
|
+
"evidence-missing",
|
|
137
|
+
"report-coverage-missing",
|
|
138
|
+
"profile-read-coverage-missing",
|
|
139
|
+
"java-role-read-coverage-missing",
|
|
140
|
+
"workflow-loop-state-absent",
|
|
141
|
+
"ralph-loop-state-absent"
|
|
142
|
+
],
|
|
143
|
+
"primaryBlocker": "trusted-authority-required",
|
|
144
|
+
"status": "blocked"
|
|
145
|
+
},
|
|
146
|
+
"publicOutput": {
|
|
147
|
+
"absoluteWorkspacePaths": "omitted",
|
|
148
|
+
"stableReferences": [
|
|
149
|
+
".persona/workflow/plan.md",
|
|
150
|
+
".persona/workflow/implementation-report.md",
|
|
151
|
+
".persona/workflow/review-report.md"
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
"initialization": {
|
|
155
|
+
"acceptedPlan": "ph bootstrap backend --strict --no-developer-mcp",
|
|
156
|
+
"binding": {
|
|
157
|
+
"consumerRoot": "same-canonical-project-root",
|
|
158
|
+
"profile": ".persona/project-profile.jsonc",
|
|
159
|
+
"reportsAndEvidence": "public-command-created-only",
|
|
160
|
+
"sourceIdentity": "current-git-source-identity"
|
|
161
|
+
},
|
|
162
|
+
"inactiveFinish": {
|
|
163
|
+
"blocker": "workflow-state-uninitialized",
|
|
164
|
+
"status": "blocked"
|
|
165
|
+
},
|
|
166
|
+
"loopState": [
|
|
167
|
+
".persona/workflow/workflow-loop-state.json",
|
|
168
|
+
".persona/workflow/ralph-loop-state.json"
|
|
169
|
+
],
|
|
170
|
+
"sameConsumer": true
|
|
171
|
+
},
|
|
172
|
+
"negativeCases": [
|
|
173
|
+
"absolute-workspace-or-temp-path-public-output",
|
|
174
|
+
"missing-or-malformed-report",
|
|
175
|
+
"repeated-control-or-oversized-report",
|
|
176
|
+
"missing-unsafe-replaced-or-identity-drifted-evidence",
|
|
177
|
+
"workflow-or-ralph-loop-missing-malformed-or-unsafe",
|
|
178
|
+
"default-finish-has-no-authority-side-effect"
|
|
179
|
+
],
|
|
180
|
+
"proof": "source-built-and-fresh-packed-installed-public-cli"
|
|
181
|
+
},
|
|
182
|
+
"authority": {
|
|
183
|
+
"binding": {
|
|
184
|
+
"callerEnrollment": {
|
|
185
|
+
"repositoryId": 1304576182,
|
|
186
|
+
"repositorySlug": "jyt6640/persona-harness-attestation-claim-fixture",
|
|
187
|
+
"workflowPath": ".github/workflows/research-attestation.yml",
|
|
188
|
+
"workflowRef": "refs/heads/main"
|
|
189
|
+
},
|
|
190
|
+
"reusableSigner": {
|
|
191
|
+
"certificateSanIdentity": "reusable-producer-workflow",
|
|
192
|
+
"workflowPath": ".github/workflows/persona-harness-project-finish.yml"
|
|
193
|
+
},
|
|
194
|
+
"runtimeSourceProjection": {
|
|
195
|
+
"excludedRuntimeMetadata": [
|
|
196
|
+
".persona/.ph-init-manifest.json",
|
|
197
|
+
".persona/workflow"
|
|
198
|
+
],
|
|
199
|
+
"reason": "bootstrap-local ownership metadata contains the consumer real path and is not caller project source",
|
|
200
|
+
"stillBound": [
|
|
201
|
+
".persona/project-profile.jsonc",
|
|
202
|
+
"root-gradle-build-and-settings",
|
|
203
|
+
"git-source-identity",
|
|
204
|
+
"public-reports-and-evidence"
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
"required": [
|
|
208
|
+
"caller-workflow-filename-ref-and-sha",
|
|
209
|
+
"reusable-workflow-sha-and-certificate-SAN",
|
|
210
|
+
"repository-id-and-slug",
|
|
211
|
+
"source-head-and-source-identity",
|
|
212
|
+
"workflow-run-and-attempt",
|
|
213
|
+
"artifact-id-and-sha256",
|
|
214
|
+
"original-archive-members"
|
|
215
|
+
],
|
|
216
|
+
"storeSchema": "consumer-authority-original-artifact.2"
|
|
217
|
+
},
|
|
218
|
+
"modeledContract": {
|
|
219
|
+
"acceptedTopology": "separate-enrolled-caller-and-reusable-signer",
|
|
220
|
+
"proof": "source-built-and-fresh-packed-installed-public-bootstrap-bound-discovery-exact-once-finish-and-replay-test",
|
|
221
|
+
"rejected": [
|
|
222
|
+
"caller-workflow-mismatch",
|
|
223
|
+
"reusable-workflow-or-certificate-SAN-mismatch",
|
|
224
|
+
"repository-source-or-run-mismatch",
|
|
225
|
+
"artifact-digest-or-archive-mismatch",
|
|
226
|
+
"stale-or-replayed-terminal-record"
|
|
227
|
+
],
|
|
228
|
+
"authorityClaim": "none-before-a-current-original-artifact-is-verified-online"
|
|
229
|
+
},
|
|
230
|
+
"fixturePlan": {
|
|
231
|
+
"artifact": "project-finish-attestation",
|
|
232
|
+
"consumer": "public-java-spring-gradle",
|
|
233
|
+
"postmergeAction": "normal-push-to-main",
|
|
234
|
+
"registryInstall": "npm install persona-harness@0.8.0-beta.22 --registry https://registry.npmjs.org"
|
|
235
|
+
},
|
|
236
|
+
"hostedFixture": {
|
|
237
|
+
"callerWorkflowPath": ".github/workflows/research-attestation.yml",
|
|
238
|
+
"certificateSanIdentity": "reusable-producer-workflow",
|
|
239
|
+
"event": "push",
|
|
240
|
+
"ref": "refs/heads/main",
|
|
241
|
+
"repository": "jyt6640/persona-harness-attestation-claim-fixture",
|
|
242
|
+
"reusableWorkflowPath": ".github/workflows/persona-harness-project-finish.yml",
|
|
243
|
+
"revision": "postmerge-persona-harness-beta22-main-sha"
|
|
244
|
+
},
|
|
245
|
+
"verification": {
|
|
246
|
+
"predicate": "project-finish-attestation.1",
|
|
247
|
+
"route": "fixed-product-owned-online",
|
|
248
|
+
"unavailable": "bounded-non-authoritative"
|
|
249
|
+
},
|
|
250
|
+
"fetchDiagnostic": {
|
|
251
|
+
"allowedCodes": [
|
|
252
|
+
"authority-fetch-evidence",
|
|
253
|
+
"authority-fetch-invalid",
|
|
254
|
+
"authority-fetch-network",
|
|
255
|
+
"authority-fetch-policy"
|
|
256
|
+
],
|
|
257
|
+
"childEnvelope": "only-exit-one-fixed-code-ok-false",
|
|
258
|
+
"persistence": "blocked-child-leaves-no-artifact-or-authority-state",
|
|
259
|
+
"privacy": "no-token-path-url-or-raw-child-output",
|
|
260
|
+
"publicState": "missing"
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
"externalAttestationCommandPlan": {
|
|
264
|
+
"certificateOidcIssuer": "https://token.actions.githubusercontent.com",
|
|
265
|
+
"command": [
|
|
266
|
+
"attestation",
|
|
267
|
+
"verify"
|
|
268
|
+
],
|
|
269
|
+
"denySelfHostedRunners": true,
|
|
270
|
+
"exitClassification": {
|
|
271
|
+
"authenticationRequired": 4,
|
|
272
|
+
"normalVerificationFailure": 1,
|
|
273
|
+
"verified": 0
|
|
274
|
+
},
|
|
275
|
+
"format": "json",
|
|
276
|
+
"predicateType": "https://github.com/jyt6640/persona-harness/attestations/project-finish-attestation.1",
|
|
277
|
+
"repositorySelector": {
|
|
278
|
+
"flag": "--repo",
|
|
279
|
+
"source": "caller-enrollment.repositorySlug"
|
|
280
|
+
},
|
|
281
|
+
"schemaVersion": "consumer-authority-external-attestation-command-plan.1",
|
|
282
|
+
"signerDigest": {
|
|
283
|
+
"flag": "--signer-digest",
|
|
284
|
+
"source": "reusable-signer.workflowSha"
|
|
285
|
+
},
|
|
286
|
+
"signerSelector": {
|
|
287
|
+
"flag": "--signer-workflow",
|
|
288
|
+
"source": "reusable-signer.workflowPath"
|
|
289
|
+
},
|
|
290
|
+
"sourceDigest": {
|
|
291
|
+
"flag": "--source-digest",
|
|
292
|
+
"source": "caller-source.sourceSha"
|
|
293
|
+
},
|
|
294
|
+
"sourceRef": {
|
|
295
|
+
"flag": "--source-ref",
|
|
296
|
+
"source": "caller-source.ref"
|
|
297
|
+
},
|
|
298
|
+
"tokenIsolation": {
|
|
299
|
+
"artifactAccess": "forbidden-during-preflight",
|
|
300
|
+
"credential": "absent",
|
|
301
|
+
"output": "bounded-classification-only"
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
"prearmedExternalHandoff": {
|
|
305
|
+
"prepare": {
|
|
306
|
+
"allowedBeforeFixture": [
|
|
307
|
+
"prepare-one-exact-git-backed-fixture-clone-and-isolated-home-store",
|
|
308
|
+
"source-bound-bootstrap-before-final-fixture-commit",
|
|
309
|
+
"retain-identical-unpushed-final-fixture-commit-as-the-installed-consumer-cwd-head",
|
|
310
|
+
"post-commit-excluded-runtime-build-only-preparation",
|
|
311
|
+
"pre-push-parent-cwd-top-level-head-and-source-identity-assertion",
|
|
312
|
+
"public-pre-authority-readiness",
|
|
313
|
+
"public-initialized-finish-state",
|
|
314
|
+
"observer-credential-preflight",
|
|
315
|
+
"external-attestation-command-plan-preflight",
|
|
316
|
+
"external-artifact-transport-plan-preflight",
|
|
317
|
+
"enroll-after-prefetch-readiness",
|
|
318
|
+
"status-and-explain-on-ready-same-consumer"
|
|
319
|
+
],
|
|
320
|
+
"consumer": "isolated-exact-registry-install",
|
|
321
|
+
"credentialPreflight": {
|
|
322
|
+
"acquisition": "host-gh-auth-token-read-once",
|
|
323
|
+
"command": "node node_modules/persona-harness/scripts/preflight-consumer-authority-observer.mjs --json",
|
|
324
|
+
"consumerHome": "isolated-ephemeral",
|
|
325
|
+
"hostCredential": "host-gh-only",
|
|
326
|
+
"logging": "forbidden",
|
|
327
|
+
"observerWorker": "github-actions-read-only",
|
|
328
|
+
"persistence": "forbidden",
|
|
329
|
+
"productFallback": "forbidden",
|
|
330
|
+
"scope": "fixed-authenticated-user-and-empty-sentinel-actions-metadata",
|
|
331
|
+
"tokenEnvironment": "PH_OBSERVER_PREFLIGHT_GITHUB_TOKEN"
|
|
332
|
+
},
|
|
333
|
+
"attestationCommandPreflight": {
|
|
334
|
+
"command": "node node_modules/persona-harness/scripts/preflight-consumer-authority-external-attestation.mjs --json",
|
|
335
|
+
"credential": "absent",
|
|
336
|
+
"input": "no-artifact-grammar-sentinel-only",
|
|
337
|
+
"output": "bounded-exit-classification-only",
|
|
338
|
+
"productFallback": "forbidden"
|
|
339
|
+
},
|
|
340
|
+
"prohibitedBeforeArtifact": [
|
|
341
|
+
"artifact-download",
|
|
342
|
+
"online-crypto-validation",
|
|
343
|
+
"authority-fetch",
|
|
344
|
+
"finish-consumption",
|
|
345
|
+
"replay-observation"
|
|
346
|
+
],
|
|
347
|
+
"requiredBeforeFixtureAuthorization": "public-initialized-finish-blocked-only-on-trusted-authority-required",
|
|
348
|
+
"artifactTransportPreflight": {
|
|
349
|
+
"command": "node node_modules/persona-harness/scripts/preflight-consumer-authority-external-artifact-transport.mjs --json",
|
|
350
|
+
"credential": "absent",
|
|
351
|
+
"input": "no-artifact-fixed-topology-and-metadata-sentinel-only",
|
|
352
|
+
"output": "bounded-parser-classification-only",
|
|
353
|
+
"productFallback": "forbidden"
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
"trigger": {
|
|
357
|
+
"onlyAfter": "immutable-prepush-fixture-commit-and-final-observer-procedure-prefetch-ready-and-natural-current-version-original-artifact",
|
|
358
|
+
"steps": [
|
|
359
|
+
"pre-push-fixture-parent-cwd-head-and-source-identity-ready",
|
|
360
|
+
"normal-push-of-the-same-final-fixture-commit-to-main",
|
|
361
|
+
"current-original-artifact-transport-and-online-crypto",
|
|
362
|
+
"verify-online-before-leaf-certificate-notAfter",
|
|
363
|
+
"authority-fetch-discovers-and-binds-original-artifact",
|
|
364
|
+
"same-consumer-trusted-unconsumed-no-readiness-blocker",
|
|
365
|
+
"finish-consume-once",
|
|
366
|
+
"finish-replay-blocked"
|
|
367
|
+
]
|
|
368
|
+
},
|
|
369
|
+
"nonAuthority": [
|
|
370
|
+
"preflight-does-not-self-validate",
|
|
371
|
+
"readiness-does-not-authorize-fixture",
|
|
372
|
+
"readiness-does-not-grant-authority",
|
|
373
|
+
"readiness-does-not-persist-or-log-host-credential",
|
|
374
|
+
"command-plan-preflight-does-not-access-artifact-or-network",
|
|
375
|
+
"command-plan-preflight-does-not-reuse-beta15-artifact",
|
|
376
|
+
"transport-plan-preflight-does-not-access-an-artifact-or-network",
|
|
377
|
+
"transport-model-safety-is-not-online-crypto-or-authority-evidence"
|
|
378
|
+
],
|
|
379
|
+
"finalObserverProcedure": {
|
|
380
|
+
"failureHandling": {
|
|
381
|
+
"afterFetch": "do-not-reinitialize-switch-reset-or-retry",
|
|
382
|
+
"beforeFetch": "abandon-and-recreate-the-consumer-before-any-live-fetch"
|
|
383
|
+
},
|
|
384
|
+
"liveSteps": [
|
|
385
|
+
"normal-push-of-the-same-final-fixture-commit-to-main",
|
|
386
|
+
"current-original-artifact-transport-and-online-crypto-within-leaf-window",
|
|
387
|
+
"authenticated-fetch-once",
|
|
388
|
+
"same-consumer-status-and-explain-trusted-unconsumed-with-no-readiness-blocker",
|
|
389
|
+
"Finish-consume-once",
|
|
390
|
+
"immediate-Finish-replay-blocked"
|
|
391
|
+
],
|
|
392
|
+
"noReinitializationAfterFetch": [
|
|
393
|
+
"consumer-cwd-git-head-or-source-profile-change",
|
|
394
|
+
"consumer-home-or-authority-store-replacement",
|
|
395
|
+
"bootstrap-plan-report-evidence-or-loop-state-reset",
|
|
396
|
+
"consumer-switch-or-copied-state"
|
|
397
|
+
],
|
|
398
|
+
"postCommitPreparation": {
|
|
399
|
+
"allowedMutations": [
|
|
400
|
+
".persona/.ph-init-manifest.json",
|
|
401
|
+
".persona/evidence/**",
|
|
402
|
+
".persona/workflow/**",
|
|
403
|
+
".gradle/**",
|
|
404
|
+
"build/**",
|
|
405
|
+
"node_modules/**"
|
|
406
|
+
],
|
|
407
|
+
"forbiddenSourceBoundMutations": [
|
|
408
|
+
".github/workflows/research-attestation.yml",
|
|
409
|
+
".gitignore",
|
|
410
|
+
".opencode/opencode.json",
|
|
411
|
+
".persona/conventions/**",
|
|
412
|
+
".persona/harness.jsonc",
|
|
413
|
+
".persona/policies/**",
|
|
414
|
+
".persona/project-profile.jsonc",
|
|
415
|
+
".persona/rules/**",
|
|
416
|
+
"AGENTS.md",
|
|
417
|
+
"root-gradle-build-and-settings",
|
|
418
|
+
"src/**"
|
|
419
|
+
]
|
|
420
|
+
},
|
|
421
|
+
"prePushCommit": {
|
|
422
|
+
"cwd": "must-be-exact-fixture-git-toplevel-and-canonical-project-root",
|
|
423
|
+
"finalCommit": "one-final-commit-contains-only-allowed-source-bound-bootstrap-outputs-and-reusable-pin",
|
|
424
|
+
"head": "must-remain-the-identical-unpushed-final-fixture-commit",
|
|
425
|
+
"remoteParent": "must-remain-unchanged-immediately-before-normal-push",
|
|
426
|
+
"sourceBoundBootstrap": "must-complete-before-final-commit",
|
|
427
|
+
"sourceIdentity": "must-be-clean-except-excluded-runtime-and-build-residue"
|
|
428
|
+
},
|
|
429
|
+
"prefetchSteps": [
|
|
430
|
+
"one-exact-git-backed-fixture-clone-cwd-head-and-isolated-home-store",
|
|
431
|
+
"source-bound-bootstrap-before-final-fixture-commit",
|
|
432
|
+
"one-final-commit-with-only-source-bound-bootstrap-allowlist-and-reusable-pin",
|
|
433
|
+
"post-commit-excluded-runtime-build-only-preparation",
|
|
434
|
+
"pre-push-parent-cwd-top-level-head-and-source-identity-assertion",
|
|
435
|
+
"public-bootstrap-accepted-plan-and-current-loop-state",
|
|
436
|
+
"public-Gradle-test-compileJava-and-clean",
|
|
437
|
+
"public-README-profile-and-Java-evidence",
|
|
438
|
+
"public-implementation-and-review-report-ingress",
|
|
439
|
+
"public-plan-status",
|
|
440
|
+
"default-Finish-blocked-only-trusted-authority-required"
|
|
441
|
+
],
|
|
442
|
+
"procedureRecord": {
|
|
443
|
+
"location": "coordinator-governed-immutable-external-procedure-record-no-local-path",
|
|
444
|
+
"sha256": "8b2537fa1ca4e8209790a3c9539666abbb0a5ffda13d6a82cb9e5c7e2635b863"
|
|
445
|
+
},
|
|
446
|
+
"schemaVersion": "consumer-authority-final-observer-procedure.2"
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
"hostedResidual": {
|
|
450
|
+
"id": "beta22-prearmed-same-commit-current-artifact-fetch-consume-replay",
|
|
451
|
+
"requiredEvidence": "one separately authorized normal push of the prearmed exact fixture commit; immediate current-version original-artifact transport, online verification before leaf-certificate-notAfter, one authenticated fetch, one Finish consumption, and immediate replay rejection occur in the same unchanged consumer",
|
|
452
|
+
"whyLocalCannotClose": "A real current signed artifact, leaf-certificate validity window, isolated external credential, online verification, and GitHub Actions discovery cannot be produced locally. Local source and packed contracts prove the pre-push source identity procedure, public readiness, privacy, trusted modeled fetch, one Finish consumption, and replay block without accessing a live artifact."
|
|
453
|
+
},
|
|
454
|
+
"mutationBoundary": {
|
|
455
|
+
"performed": false,
|
|
456
|
+
"prohibited": [
|
|
457
|
+
"npm-publish",
|
|
458
|
+
"tag-or-dist-tag-mutation",
|
|
459
|
+
"release-creation",
|
|
460
|
+
"artifact-download-or-live-verification",
|
|
461
|
+
"Finish-consumption",
|
|
462
|
+
"fixture-push-or-workflow-dispatch"
|
|
463
|
+
]
|
|
464
|
+
},
|
|
465
|
+
"beta16HistoricalExternal": {
|
|
466
|
+
"outcome": "external-gh-artifact-download-exit-zero-with-zero-byte-output-before-zip-validation",
|
|
467
|
+
"reusableForBeta17": false,
|
|
468
|
+
"version": "0.8.0-beta.16"
|
|
469
|
+
},
|
|
470
|
+
"externalArtifactTransportPlan": {
|
|
471
|
+
"api": {
|
|
472
|
+
"accept": "application/vnd.github+json, application/octet-stream",
|
|
473
|
+
"origin": "https://api.github.com",
|
|
474
|
+
"version": "2022-11-28"
|
|
475
|
+
},
|
|
476
|
+
"artifact": {
|
|
477
|
+
"maximumBytes": 8388608,
|
|
478
|
+
"source": "validated-actions-artifact-metadata"
|
|
479
|
+
},
|
|
480
|
+
"endpoint": {
|
|
481
|
+
"method": "GET",
|
|
482
|
+
"path": "/repos/{caller-enrollment.repositorySlug}/actions/artifacts/{artifact.id}/zip"
|
|
483
|
+
},
|
|
484
|
+
"output": {
|
|
485
|
+
"files": [
|
|
486
|
+
"original.zip",
|
|
487
|
+
"bundle.json"
|
|
488
|
+
],
|
|
489
|
+
"root": "private-observer-mkdtemp",
|
|
490
|
+
"write": "no-follow-reserved-and-promote-after-validation"
|
|
491
|
+
},
|
|
492
|
+
"redirect": {
|
|
493
|
+
"authorization": "api-origin-only",
|
|
494
|
+
"maximum": 1,
|
|
495
|
+
"permittedHosts": [
|
|
496
|
+
"pipelines.actions.githubusercontent.com",
|
|
497
|
+
"results-receiver.actions.githubusercontent.com",
|
|
498
|
+
"*.blob.core.windows.net"
|
|
499
|
+
]
|
|
500
|
+
},
|
|
501
|
+
"response": {
|
|
502
|
+
"contentTypes": [
|
|
503
|
+
"application/octet-stream",
|
|
504
|
+
"application/zip"
|
|
505
|
+
],
|
|
506
|
+
"status": 200,
|
|
507
|
+
"timeoutMs": 15000
|
|
508
|
+
},
|
|
509
|
+
"schemaVersion": "consumer-authority-external-artifact-transport-plan.1"
|
|
510
|
+
},
|
|
511
|
+
"beta17HistoricalPublish": {
|
|
512
|
+
"beta16Registry": "present-in-public-registry",
|
|
513
|
+
"outcome": "canonical-tar-and-provenance-completed-before-authorization-shaped-registry-put-e404",
|
|
514
|
+
"reusableForBeta18": false,
|
|
515
|
+
"version": "0.8.0-beta.17"
|
|
516
|
+
},
|
|
517
|
+
"canonicalPackagePublisherPlan": {
|
|
518
|
+
"canonicalPackerRuntime": {
|
|
519
|
+
"node": "20.19.0",
|
|
520
|
+
"npm": "10.8.2"
|
|
521
|
+
},
|
|
522
|
+
"canonicalTar": {
|
|
523
|
+
"handoff": "exact-canonical-tarball-sha256-and-package-content-identity",
|
|
524
|
+
"source": "canonical-package-packer-output-and-package-facts"
|
|
525
|
+
},
|
|
526
|
+
"preflight": {
|
|
527
|
+
"argv": [
|
|
528
|
+
"npm",
|
|
529
|
+
"publish",
|
|
530
|
+
"<canonical-tarball>",
|
|
531
|
+
"--access",
|
|
532
|
+
"public",
|
|
533
|
+
"--tag",
|
|
534
|
+
"<selected-dist-tag>",
|
|
535
|
+
"--provenance",
|
|
536
|
+
"--dry-run"
|
|
537
|
+
],
|
|
538
|
+
"credentials": "no-custom-token-exchange-or-auth-state-output",
|
|
539
|
+
"mode": "node24-npm11-exact-canonical-tarball-dry-run"
|
|
540
|
+
},
|
|
541
|
+
"publisherEnvironment": {
|
|
542
|
+
"canonicalPackerConfigInheritance": "forbidden",
|
|
543
|
+
"isolated": [
|
|
544
|
+
"HOME",
|
|
545
|
+
"NPM_CONFIG_CACHE",
|
|
546
|
+
"NPM_CONFIG_GLOBALCONFIG",
|
|
547
|
+
"NPM_CONFIG_USERCONFIG"
|
|
548
|
+
]
|
|
549
|
+
},
|
|
550
|
+
"publisherRuntime": {
|
|
551
|
+
"node": "24.18.0",
|
|
552
|
+
"npm": "11.16.0"
|
|
553
|
+
},
|
|
554
|
+
"npmTrustedPublishingMinimum": {
|
|
555
|
+
"node": "22.14.0",
|
|
556
|
+
"npm": "11.5.1"
|
|
557
|
+
},
|
|
558
|
+
"registryPut": {
|
|
559
|
+
"evidence": "hosted-only",
|
|
560
|
+
"historicalBeta17": "authorization-shaped-registry-response-not-package-absence"
|
|
561
|
+
},
|
|
562
|
+
"schemaVersion": "canonical-package-publisher-plan.1"
|
|
563
|
+
},
|
|
564
|
+
"beta18HistoricalPublish": {
|
|
565
|
+
"contentIdentity": "bf3de031ae9ed6d9ab290291f151d0befc1fc4804465f55bddb5ad382399a150",
|
|
566
|
+
"outcome": "registry-publish-succeeded-and-canonical-registry-bytes-matched-before-an-unsupported-githead-metadata-requirement-blocked-readback",
|
|
567
|
+
"rawTarballSha256": "66ef460552d03fd067baf412c1d4952e5bd42811b419c585092fc7a75b4c54e6",
|
|
568
|
+
"reusableForBeta19": false,
|
|
569
|
+
"version": "0.8.0-beta.18"
|
|
570
|
+
},
|
|
571
|
+
"beta19HistoricalPublish": {
|
|
572
|
+
"outcome": "published-immutable-staging-package-not-reusable-as-current-package-evidence",
|
|
573
|
+
"reusableForBeta20": false,
|
|
574
|
+
"version": "0.8.0-beta.19"
|
|
575
|
+
},
|
|
576
|
+
"beta20HistoricalFinalObserver": {
|
|
577
|
+
"outcome": "trusted-unconsumed-live-fetch-followed-by-intentional-workflow-state-uninitialized-block-not-reusable-as-closure-evidence",
|
|
578
|
+
"procedureRecordSha256": "1d370a4e4cdd55b20e27c016073246b78c373548c84c89c3499b3838e27980a7",
|
|
579
|
+
"reusableForBeta21": false,
|
|
580
|
+
"version": "0.8.0-beta.20"
|
|
581
|
+
},
|
|
582
|
+
"beta21HistoricalFinalObserver": {
|
|
583
|
+
"outcome": "online-crypto-and-bindings-passed-after-leaf-window-expired-before-authority-fetch-not-reusable-as-closure-evidence",
|
|
584
|
+
"reusableForBeta22": false,
|
|
585
|
+
"version": "0.8.0-beta.21"
|
|
586
|
+
}
|
|
587
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# v0.8.0-beta.22 Release Notes
|
|
2
|
+
|
|
3
|
+
## Pre-Push Final Observer Procedure
|
|
4
|
+
|
|
5
|
+
This document records the `0.8.0-beta.22` Consumer Authority Beta
|
|
6
|
+
procedure-only source candidate. It makes no npm publication, tag, dist-tag
|
|
7
|
+
movement, GitHub release, original signed consumer artifact, promotion, Finish
|
|
8
|
+
authority, or issue closure claim.
|
|
9
|
+
|
|
10
|
+
`0.8.0-beta.21` is non-reusable temporal final-observer evidence. Its online
|
|
11
|
+
crypto and identity bindings passed only after the leaf certificate window
|
|
12
|
+
expired, so authenticated fetch, Finish consumption, and replay were not run.
|
|
13
|
+
That timing result is not a product defect and must not be retried.
|
|
14
|
+
|
|
15
|
+
Beta22 changes no product fetch, authority, Finish, transport, workflow, or CI
|
|
16
|
+
behavior. It binds the coordinator-governed immutable future final-observer
|
|
17
|
+
procedure record by SHA-256
|
|
18
|
+
`8b2537fa1ca4e8209790a3c9539666abbb0a5ffda13d6a82cb9e5c7e2635b863`.
|
|
19
|
+
No local absolute path is a source of truth.
|
|
20
|
+
|
|
21
|
+
The package-visible
|
|
22
|
+
[`consumer-authority-beta22-acceptance.json`](consumer-authority-beta22-acceptance.json)
|
|
23
|
+
record binds the procedure to the existing release and observer boundaries.
|
|
24
|
+
|
|
25
|
+
## Required Procedure
|
|
26
|
+
|
|
27
|
+
Use one exact Git-backed fixture clone and one isolated consumer HOME/store.
|
|
28
|
+
Complete source-bound bootstrap before the final fixture commit. The final
|
|
29
|
+
commit may contain only the immutable reusable workflow pin and declared
|
|
30
|
+
source-bound bootstrap outputs. Retain that same unpushed final fixture commit
|
|
31
|
+
as the installed consumer CWD/HEAD.
|
|
32
|
+
|
|
33
|
+
After that commit, slow preparation may modify only excluded runtime or build
|
|
34
|
+
state: the bootstrap-local `.persona/.ph-init-manifest.json`, `.persona/evidence`,
|
|
35
|
+
`.persona/workflow`, `.gradle`, `build`, and `node_modules`. It may not alter
|
|
36
|
+
the pin, source-bound bootstrap files, project source, root Gradle descriptors,
|
|
37
|
+
or the Git identity. Immediately before the one normal push, require the remote
|
|
38
|
+
parent, CWD, Git top-level, HEAD, and source identity to remain bound to that
|
|
39
|
+
final commit.
|
|
40
|
+
|
|
41
|
+
Before enrollment, live artifact work, or fetch, run public strict bootstrap,
|
|
42
|
+
the accepted plan/current loops, Gradle test/compileJava/clean,
|
|
43
|
+
README/profile/Java evidence reads, public implementation/review report ingress,
|
|
44
|
+
and plan status. A default Finish must then block only on
|
|
45
|
+
`trusted-authority-required`. Only that unchanged consumer may enroll, fetch
|
|
46
|
+
the one current artifact, recheck trusted/unconsumed status and explain with no
|
|
47
|
+
readiness blocker, consume Finish once, and check immediate replay rejection.
|
|
48
|
+
After fetch, do not bootstrap, reset/copy lifecycle state, change CWD/HEAD/
|
|
49
|
+
source/profile, replace HOME/store, or switch consumers. A prefetch failure
|
|
50
|
+
requires abandoning and recreating the consumer before any live fetch.
|
|
51
|
+
|
|
52
|
+
## Required Live Evidence
|
|
53
|
+
|
|
54
|
+
After protected integration and current-package installation, the sole hosted
|
|
55
|
+
residual is one separately authorized normal push of the prearmed final fixture
|
|
56
|
+
commit. The observer immediately performs original-artifact transport, online
|
|
57
|
+
verification inside the leaf window, authenticated fetch, one Finish consumption,
|
|
58
|
+
and replay rejection in that same unchanged consumer. It does not substitute
|
|
59
|
+
local modeled evidence for live crypto or authority.
|
|
@@ -141,6 +141,7 @@ Use this index to scan package history. Use the linked release notes,
|
|
|
141
141
|
| `0.8.0-beta.17` | 2026-08-02 | historical Consumer Authority Beta source preparation | [`release notes`](../current/release/v0.8.0-beta.17-release-notes.md), [`beta lifecycle`](../current/release/consumer-authority-beta.md) | canonical tar and provenance were created, but the Node20/npm10 registry PUT was authorization-shaped; it is not a package-absence or authority fact |
|
|
142
142
|
| `0.8.0-beta.18` | 2026-08-02 | immutable Consumer Authority Beta staging evidence | [`release notes`](../current/release/v0.8.0-beta.18-release-notes.md), [`beta lifecycle`](../current/release/consumer-authority-beta.md) | registry bytes matched canonical facts, but an unsupported registry gitHead predicate blocked workflow readback; it is not reusable lifecycle evidence |
|
|
143
143
|
| `0.8.0-beta.19` | 2026-08-02 | Consumer Authority Beta source preparation | [`release notes`](../current/release/v0.8.0-beta.19-release-notes.md), [`beta lifecycle`](../current/release/consumer-authority-beta.md) | workflow-bound canonical source to registry-byte reconciliation with one fresh hosted registry PUT/readback residual |
|
|
144
|
+
| `0.8.0-beta.22` | 2026-08-02 | Consumer Authority Beta procedure-only source preparation | [`release notes`](../current/release/v0.8.0-beta.22-release-notes.md), [`beta lifecycle`](../current/release/consumer-authority-beta.md) | source-bound bootstrap before one final fixture commit; the same unpushed commit is the installed consumer CWD/HEAD for the one future hosted observation |
|
|
144
145
|
|
|
145
146
|
## Future Migration Notes
|
|
146
147
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "persona-harness",
|
|
3
|
-
"version": "0.8.0-beta.
|
|
3
|
+
"version": "0.8.0-beta.22",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@10.8.2",
|
|
@@ -150,6 +150,8 @@
|
|
|
150
150
|
"scripts/consumer-authority-beta20-acceptance-schema.mjs",
|
|
151
151
|
"scripts/consumer-authority-beta21-acceptance-schema.d.mts",
|
|
152
152
|
"scripts/consumer-authority-beta21-acceptance-schema.mjs",
|
|
153
|
+
"scripts/consumer-authority-beta22-acceptance-schema.d.mts",
|
|
154
|
+
"scripts/consumer-authority-beta22-acceptance-schema.mjs",
|
|
153
155
|
"scripts/consumer-authority-external-artifact-transport-plan.d.mts",
|
|
154
156
|
"scripts/consumer-authority-external-artifact-transport-plan.mjs",
|
|
155
157
|
"scripts/consumer-authority-external-observer-boundary.d.mts",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const BETA22_ACCEPTANCE_SCHEMA_VERSION: "consumer-authority-beta22-acceptance.1"
|
|
2
|
+
|
|
3
|
+
export class Beta22AcceptanceManifestError extends Error {
|
|
4
|
+
readonly code: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function canonicalBeta22AcceptanceManifest(): Readonly<Record<string, unknown>>
|
|
8
|
+
export function readBeta22AcceptanceManifest(packageRoot: string): Readonly<Record<string, unknown>>
|
|
9
|
+
export function parseBeta22AcceptanceManifest(value: unknown, packageVersion: string): Readonly<Record<string, unknown>>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs"
|
|
2
|
+
import { join } from "node:path"
|
|
3
|
+
import { isDeepStrictEqual } from "node:util"
|
|
4
|
+
|
|
5
|
+
import { canonicalBeta21AcceptanceManifest } from "./consumer-authority-beta21-acceptance-schema.mjs"
|
|
6
|
+
import {
|
|
7
|
+
parseCanonicalPackagePublisherPlan,
|
|
8
|
+
} from "./canonical-package-publisher.mjs"
|
|
9
|
+
import {
|
|
10
|
+
parseExternalArtifactTransportPlan,
|
|
11
|
+
} from "./consumer-authority-external-artifact-transport-plan.mjs"
|
|
12
|
+
import { parseExternalAttestationCommandPlan } from "./consumer-authority-external-attestation-command-plan.mjs"
|
|
13
|
+
|
|
14
|
+
export const BETA22_ACCEPTANCE_SCHEMA_VERSION = "consumer-authority-beta22-acceptance.1"
|
|
15
|
+
|
|
16
|
+
const BETA22_PACKAGE_VERSION = "0.8.0-beta.22"
|
|
17
|
+
const ACCEPTANCE_PATH = join("docs", "current", "release", "consumer-authority-beta22-acceptance.json")
|
|
18
|
+
const PROCEDURE_RECORD_SHA256 = "8b2537fa1ca4e8209790a3c9539666abbb0a5ffda13d6a82cb9e5c7e2635b863"
|
|
19
|
+
const EXPECTED_MANIFEST = buildExpectedManifest()
|
|
20
|
+
|
|
21
|
+
export class Beta22AcceptanceManifestError extends Error {
|
|
22
|
+
constructor(code) {
|
|
23
|
+
super(code)
|
|
24
|
+
this.code = code
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function canonicalBeta22AcceptanceManifest() {
|
|
29
|
+
return structuredClone(EXPECTED_MANIFEST)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function readBeta22AcceptanceManifest(packageRoot) {
|
|
33
|
+
let packageVersion
|
|
34
|
+
let value
|
|
35
|
+
try {
|
|
36
|
+
packageVersion = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8")).version
|
|
37
|
+
value = JSON.parse(readFileSync(join(packageRoot, ACCEPTANCE_PATH), "utf8"))
|
|
38
|
+
} catch {
|
|
39
|
+
fail()
|
|
40
|
+
}
|
|
41
|
+
return parseBeta22AcceptanceManifest(value, packageVersion)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function parseBeta22AcceptanceManifest(value, packageVersion) {
|
|
45
|
+
if (packageVersion !== BETA22_PACKAGE_VERSION || !isDeepStrictEqual(value, EXPECTED_MANIFEST)) fail()
|
|
46
|
+
parseCanonicalPackagePublisherPlan(value.canonicalPackagePublisherPlan)
|
|
47
|
+
parseExternalAttestationCommandPlan(value.externalAttestationCommandPlan)
|
|
48
|
+
parseExternalArtifactTransportPlan(value.externalArtifactTransportPlan)
|
|
49
|
+
return value
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function buildExpectedManifest() {
|
|
53
|
+
const manifest = canonicalBeta21AcceptanceManifest()
|
|
54
|
+
manifest.schemaVersion = BETA22_ACCEPTANCE_SCHEMA_VERSION
|
|
55
|
+
manifest.package.version = BETA22_PACKAGE_VERSION
|
|
56
|
+
manifest.beta21HistoricalFinalObserver = {
|
|
57
|
+
outcome: "online-crypto-and-bindings-passed-after-leaf-window-expired-before-authority-fetch-not-reusable-as-closure-evidence",
|
|
58
|
+
reusableForBeta22: false,
|
|
59
|
+
version: "0.8.0-beta.21",
|
|
60
|
+
}
|
|
61
|
+
manifest.authority.fixturePlan.registryInstall = "npm install persona-harness@0.8.0-beta.22 --registry https://registry.npmjs.org"
|
|
62
|
+
manifest.authority.hostedFixture.revision = "postmerge-persona-harness-beta22-main-sha"
|
|
63
|
+
manifest.prearmedExternalHandoff.finalObserverProcedure = finalObserverProcedure()
|
|
64
|
+
manifest.prearmedExternalHandoff.prepare.allowedBeforeFixture = [
|
|
65
|
+
"prepare-one-exact-git-backed-fixture-clone-and-isolated-home-store",
|
|
66
|
+
"source-bound-bootstrap-before-final-fixture-commit",
|
|
67
|
+
"retain-identical-unpushed-final-fixture-commit-as-the-installed-consumer-cwd-head",
|
|
68
|
+
"post-commit-excluded-runtime-build-only-preparation",
|
|
69
|
+
"pre-push-parent-cwd-top-level-head-and-source-identity-assertion",
|
|
70
|
+
"public-pre-authority-readiness",
|
|
71
|
+
"public-initialized-finish-state",
|
|
72
|
+
"observer-credential-preflight",
|
|
73
|
+
"external-attestation-command-plan-preflight",
|
|
74
|
+
"external-artifact-transport-plan-preflight",
|
|
75
|
+
"enroll-after-prefetch-readiness",
|
|
76
|
+
"status-and-explain-on-ready-same-consumer",
|
|
77
|
+
]
|
|
78
|
+
manifest.prearmedExternalHandoff.trigger.onlyAfter = "immutable-prepush-fixture-commit-and-final-observer-procedure-prefetch-ready-and-natural-current-version-original-artifact"
|
|
79
|
+
manifest.prearmedExternalHandoff.trigger.steps = [
|
|
80
|
+
"pre-push-fixture-parent-cwd-head-and-source-identity-ready",
|
|
81
|
+
"normal-push-of-the-same-final-fixture-commit-to-main",
|
|
82
|
+
"current-original-artifact-transport-and-online-crypto",
|
|
83
|
+
"verify-online-before-leaf-certificate-notAfter",
|
|
84
|
+
"authority-fetch-discovers-and-binds-original-artifact",
|
|
85
|
+
"same-consumer-trusted-unconsumed-no-readiness-blocker",
|
|
86
|
+
"finish-consume-once",
|
|
87
|
+
"finish-replay-blocked",
|
|
88
|
+
]
|
|
89
|
+
manifest.hostedResidual = {
|
|
90
|
+
id: "beta22-prearmed-same-commit-current-artifact-fetch-consume-replay",
|
|
91
|
+
requiredEvidence: "one separately authorized normal push of the prearmed exact fixture commit; immediate current-version original-artifact transport, online verification before leaf-certificate-notAfter, one authenticated fetch, one Finish consumption, and immediate replay rejection occur in the same unchanged consumer",
|
|
92
|
+
whyLocalCannotClose: "A real current signed artifact, leaf-certificate validity window, isolated external credential, online verification, and GitHub Actions discovery cannot be produced locally. Local source and packed contracts prove the pre-push source identity procedure, public readiness, privacy, trusted modeled fetch, one Finish consumption, and replay block without accessing a live artifact.",
|
|
93
|
+
}
|
|
94
|
+
return manifest
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function finalObserverProcedure() {
|
|
98
|
+
return {
|
|
99
|
+
failureHandling: {
|
|
100
|
+
afterFetch: "do-not-reinitialize-switch-reset-or-retry",
|
|
101
|
+
beforeFetch: "abandon-and-recreate-the-consumer-before-any-live-fetch",
|
|
102
|
+
},
|
|
103
|
+
liveSteps: [
|
|
104
|
+
"normal-push-of-the-same-final-fixture-commit-to-main",
|
|
105
|
+
"current-original-artifact-transport-and-online-crypto-within-leaf-window",
|
|
106
|
+
"authenticated-fetch-once",
|
|
107
|
+
"same-consumer-status-and-explain-trusted-unconsumed-with-no-readiness-blocker",
|
|
108
|
+
"Finish-consume-once",
|
|
109
|
+
"immediate-Finish-replay-blocked",
|
|
110
|
+
],
|
|
111
|
+
noReinitializationAfterFetch: [
|
|
112
|
+
"consumer-cwd-git-head-or-source-profile-change",
|
|
113
|
+
"consumer-home-or-authority-store-replacement",
|
|
114
|
+
"bootstrap-plan-report-evidence-or-loop-state-reset",
|
|
115
|
+
"consumer-switch-or-copied-state",
|
|
116
|
+
],
|
|
117
|
+
postCommitPreparation: {
|
|
118
|
+
allowedMutations: [
|
|
119
|
+
".persona/.ph-init-manifest.json",
|
|
120
|
+
".persona/evidence/**",
|
|
121
|
+
".persona/workflow/**",
|
|
122
|
+
".gradle/**",
|
|
123
|
+
"build/**",
|
|
124
|
+
"node_modules/**",
|
|
125
|
+
],
|
|
126
|
+
forbiddenSourceBoundMutations: [
|
|
127
|
+
".github/workflows/research-attestation.yml",
|
|
128
|
+
".gitignore",
|
|
129
|
+
".opencode/opencode.json",
|
|
130
|
+
".persona/conventions/**",
|
|
131
|
+
".persona/harness.jsonc",
|
|
132
|
+
".persona/policies/**",
|
|
133
|
+
".persona/project-profile.jsonc",
|
|
134
|
+
".persona/rules/**",
|
|
135
|
+
"AGENTS.md",
|
|
136
|
+
"root-gradle-build-and-settings",
|
|
137
|
+
"src/**",
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
prePushCommit: {
|
|
141
|
+
cwd: "must-be-exact-fixture-git-toplevel-and-canonical-project-root",
|
|
142
|
+
finalCommit: "one-final-commit-contains-only-allowed-source-bound-bootstrap-outputs-and-reusable-pin",
|
|
143
|
+
head: "must-remain-the-identical-unpushed-final-fixture-commit",
|
|
144
|
+
remoteParent: "must-remain-unchanged-immediately-before-normal-push",
|
|
145
|
+
sourceBoundBootstrap: "must-complete-before-final-commit",
|
|
146
|
+
sourceIdentity: "must-be-clean-except-excluded-runtime-and-build-residue",
|
|
147
|
+
},
|
|
148
|
+
prefetchSteps: [
|
|
149
|
+
"one-exact-git-backed-fixture-clone-cwd-head-and-isolated-home-store",
|
|
150
|
+
"source-bound-bootstrap-before-final-fixture-commit",
|
|
151
|
+
"one-final-commit-with-only-source-bound-bootstrap-allowlist-and-reusable-pin",
|
|
152
|
+
"post-commit-excluded-runtime-build-only-preparation",
|
|
153
|
+
"pre-push-parent-cwd-top-level-head-and-source-identity-assertion",
|
|
154
|
+
"public-bootstrap-accepted-plan-and-current-loop-state",
|
|
155
|
+
"public-Gradle-test-compileJava-and-clean",
|
|
156
|
+
"public-README-profile-and-Java-evidence",
|
|
157
|
+
"public-implementation-and-review-report-ingress",
|
|
158
|
+
"public-plan-status",
|
|
159
|
+
"default-Finish-blocked-only-trusted-authority-required",
|
|
160
|
+
],
|
|
161
|
+
procedureRecord: {
|
|
162
|
+
location: "coordinator-governed-immutable-external-procedure-record-no-local-path",
|
|
163
|
+
sha256: PROCEDURE_RECORD_SHA256,
|
|
164
|
+
},
|
|
165
|
+
schemaVersion: "consumer-authority-final-observer-procedure.2",
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function fail() {
|
|
170
|
+
throw new Beta22AcceptanceManifestError("beta22-acceptance-schema")
|
|
171
|
+
}
|
|
@@ -2,7 +2,7 @@ import { realpathSync } from "node:fs"
|
|
|
2
2
|
import { dirname } from "node:path"
|
|
3
3
|
import { fileURLToPath, pathToFileURL } from "node:url"
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { readBeta22AcceptanceManifest } from "./consumer-authority-beta22-acceptance-schema.mjs"
|
|
6
6
|
import { runExternalArtifactTransportPreflight } from "./consumer-authority-external-artifact-transport-plan.mjs"
|
|
7
7
|
|
|
8
8
|
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)))
|
|
@@ -14,7 +14,7 @@ async function main() {
|
|
|
14
14
|
process.exitCode = 1
|
|
15
15
|
return
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
readBeta22AcceptanceManifest(packageRoot)
|
|
18
18
|
const result = await runExternalArtifactTransportPreflight()
|
|
19
19
|
process.stdout.write(`${JSON.stringify(result)}\n`)
|
|
20
20
|
process.exitCode = result.state === "ready" ? 0 : 1
|
|
@@ -2,7 +2,7 @@ import { realpathSync } from "node:fs"
|
|
|
2
2
|
import { dirname } from "node:path"
|
|
3
3
|
import { fileURLToPath, pathToFileURL } from "node:url"
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { readBeta22AcceptanceManifest } from "./consumer-authority-beta22-acceptance-schema.mjs"
|
|
6
6
|
import { runExternalAttestationGrammarPreflight } from "./consumer-authority-external-attestation-command-plan.mjs"
|
|
7
7
|
|
|
8
8
|
const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)))
|
|
@@ -15,7 +15,7 @@ function main() {
|
|
|
15
15
|
process.exitCode = 1
|
|
16
16
|
return
|
|
17
17
|
}
|
|
18
|
-
const manifest =
|
|
18
|
+
const manifest = readBeta22AcceptanceManifest(packageRoot)
|
|
19
19
|
const result = runExternalAttestationGrammarPreflight(
|
|
20
20
|
manifest.externalAttestationCommandPlan,
|
|
21
21
|
grammarOnlyTopology(manifest),
|