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.
@@ -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.19-release-notes.md`](release/v0.8.0-beta.19-release-notes.md).
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.17` are historical staging-only Consumer
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 beta.19 transport, verification, Finish, consumption, or
125
- replay fact. Beta.17's Node20/npm10 registry PUT was authorization-shaped,
126
- not a package-absence claim. Beta.18 is immutable staging evidence: its
127
- registry version, selected tag, SHA-1/SRI, raw SHA-256, and portable content
128
- identity matched frozen canonical facts, but its readback incorrectly required
129
- an unsupported registry `gitHead` metadata field. `0.8.0-beta.19` is the current source-preparation
130
- candidate. It makes no package, tag, staging mapping,
131
- GitHub release, original signed consumer artifact, promotion, Stable/GA, or
132
- Finish authority claim. Its pre-fixture gate requires a package-visible
133
- observer credential-preflight, separate caller/reusable signer binding,
134
- portable canonical package-content identity, and
135
- the complete public Java/Spring lifecycle to reach only
136
- `trusted-authority-required` in
137
- [`release/v0.8.0-beta.19-release-notes.md`](release/v0.8.0-beta.19-release-notes.md).
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` | Current source-preparation record for workflow-bound canonical source to registry-byte reconciliation and sanitized failed-readback evidence. |
61
- | 0.8.0-beta.19 acceptance record | `docs/current/release/consumer-authority-beta19-acceptance.json` | Machine-readable source/packed lifecycle, package-root, canonical publisher, bounded observer plans, and one hosted registry reconciliation residual. |
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 | Current Consumer Authority Beta source-preparation record for workflow-bound canonical source to registry-byte reconciliation; it makes no live publish, tag, release, promotion, or Finish authority claim. |
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 | Source/packed lifecycle and package-root contract extended with workflow-bound canonical source-to-registry-byte reconciliation and sanitized failed-readback evidence. |
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 the next strict-prerelease source-preparation candidate; it
85
- has no source-level claim of a tag, publish, channel movement, GitHub release,
86
- or original signed consumer artifact. Its release contract requires
87
- package-visible observer credential preflight, separate caller/reusable signer
88
- binding, and a complete public Java/Spring readiness route whose default Finish
89
- is blocked only by `trusted-authority-required` before a fixture may be
90
- authorized. Beta21 binds that readiness to one exact Git-backed consumer
91
- CWD/HEAD and isolated HOME/store, requires trusted/unconsumed recheck in that
92
- same consumer before one Finish/replay, and forbids lifecycle reset or consumer
93
- switch after fetch. The preflights use a host-derived credential only inside its fixed
94
- read-only GitHub Actions worker; they do not pass that credential to `ph`, npm,
95
- archive tooling, or the consumer HOME. Its package evidence also starts from the
96
- exact complete-history bundle, not an ambient working directory: detached
97
- checkout, Git/manifest/lock/npm-prefix binding, normal prepack, and fresh
98
- installed CLI identity must all agree before the tarball is eligible for
99
- independent package review. The beta21 release contract additionally owns
100
- no-token/no-artifact attestation and artifact transport parser preflights. The
101
- transport plan binds the caller repository/run/artifact endpoint, exact ZIP
102
- bytes, and safe members before it hands an original ZIP to the separate reusable
103
- signer command plan. The package proof invokes plain `npm` from that bound
104
- detached checkout, never `npm --prefix ... pack`, and uses the exact resulting
105
- tarball for both source-built and fresh installed consumer contracts. Its release
106
- handoff keeps the Node20/npm10 canonical packer separate from the isolated
107
- Node24/npm11 publisher, which dry-runs and then publishes the same canonical
108
- tarball only. Postpublish reconciliation binds protected workflow source
109
- preflight to registry version, selected tag, SHA-1/SRI, raw SHA-256, and portable
110
- content identity; it does not require registry `gitHead`.
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 beta.21
10
- current-version consumer authority evidence. Beta.16's final observer accepted
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. The active `0.8.0-beta.21` source candidate has no
18
- package, tag, channel movement, GitHub release, or signed consumer-project
19
- artifact at source preparation time.
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
- Beta21 binds the missing immutable same-consumer observer order. It cannot
28
- inherit beta.16's observer failure, beta.17's registry PUT result, beta.18's
29
- failed metadata predicate, an earlier lifecycle, or an earlier authority result.
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.20` is a bounded
143
- binding mismatch or historical-evidence block for `0.8.0-beta.21`; only a future
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-beta21-acceptance.json`](consumer-authority-beta21-acceptance.json)
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.21 package evidence is accepted, the verifier materializes the
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.21 fixture push, an independent observer must prepare
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.21",
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 { readBeta21AcceptanceManifest } from "./consumer-authority-beta21-acceptance-schema.mjs"
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
- readBeta21AcceptanceManifest(packageRoot)
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 { readBeta21AcceptanceManifest } from "./consumer-authority-beta21-acceptance-schema.mjs"
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 = readBeta21AcceptanceManifest(packageRoot)
18
+ const manifest = readBeta22AcceptanceManifest(packageRoot)
19
19
  const result = runExternalAttestationGrammarPreflight(
20
20
  manifest.externalAttestationCommandPlan,
21
21
  grammarOnlyTopology(manifest),