Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
48df22e
docs: design canonical owner recovery
misunders2d Aug 9, 2026
8b735f0
docs: plan canonical owner recovery
misunders2d Aug 9, 2026
c903f0e
feat: adopt canonical approval owner
misunders2d Aug 9, 2026
103748f
fix: project communication scope atomically
misunders2d Aug 9, 2026
618dd52
fix: converge approval owner during upgrade
misunders2d Aug 9, 2026
2b7c975
fix: recover canonical onboarding authority
misunders2d Aug 9, 2026
57e19a4
test: reconcile ambiguous setup response
misunders2d Aug 9, 2026
99af203
fix: close recovery crash windows
misunders2d Aug 9, 2026
01b8e21
test: stabilize packed process lock
misunders2d Aug 9, 2026
4cda4bc
docs: design expired scope harness replacement
misunders2d Aug 9, 2026
5394bfe
docs: plan expired scope harness replacement
misunders2d Aug 9, 2026
bdb7226
fix: recover expired scope membership
misunders2d Aug 9, 2026
d3603d4
test: target projected scope member
misunders2d Aug 10, 2026
585e692
ci: test current installed-host upgrade
misunders2d Aug 10, 2026
32c9634
test: restore collaboration scope import
misunders2d Aug 10, 2026
20ae667
test: bind conflict race to valid scope
misunders2d Aug 10, 2026
85aedd2
fix: converge retained approval ttl
misunders2d Aug 10, 2026
f80cb86
fix: preserve published approval ttl
misunders2d Aug 10, 2026
741e58d
fix: prove retained ttl marker drift
misunders2d Aug 10, 2026
4e8ebd7
fix(storage): recover failed runtime lease
misunders2d Aug 10, 2026
8bed78f
docs(evidence): bind server postgres run
misunders2d Aug 11, 2026
3c8b4d8
fix: validate combined live recovery
misunders2d Aug 11, 2026
564d74d
fix: revalidate combined recovery resume
misunders2d Aug 11, 2026
6ab16c7
fix: recover journal-less owner state
misunders2d Aug 11, 2026
acdcfc2
fix: accept explicit scoped ttl recovery
misunders2d Aug 12, 2026
3f237d9
fix: preserve marker-matched Core recovery
misunders2d Aug 12, 2026
8abcfaa
fix: reconstruct dual policy recovery
misunders2d Aug 12, 2026
3d9409c
fix: retain release verification evidence
misunders2d Aug 12, 2026
b6b778e
fix: recover proof-bound dual drift
misunders2d Aug 12, 2026
5869a15
fix: resume partial owner recovery
misunders2d Aug 13, 2026
c0f77f2
fix: accept canonical trust order
misunders2d Aug 13, 2026
47fa716
fix: verify partial recovery policy
misunders2d Aug 13, 2026
661176f
fix(setup): recover source approval principal
Aug 14, 2026
a32c945
fix(approval): load legacy TTL policy
Aug 14, 2026
0baf4f0
fix(server): use peer identity for recovery
Aug 14, 2026
021b57d
fix(approval): allow credential recovery review
Aug 14, 2026
2e8d83c
fix(core): read managed supersession journal
Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ permissions:
id-token: write

jobs:
# v0.1.45 ships fresh-install-only: in-place upgrade from 0.1.44 is not a
# supported path, so publication is gated on the exact clean-install lane
# that operators actually follow, not on the unsupported upgrade chain.
# Publication is gated on current clean-install evidence. Historical upgrade
# chains remain release records, not mandatory workflows for current changes.
clean-install-chain:
if: github.repository == 'misunders2d/agentnet'
uses: ./.github/workflows/server-setup-e2e.yml
Expand Down
11 changes: 3 additions & 8 deletions .github/workflows/server-setup-upgrade-e2e.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Ordinary server 0.1.45 to 0.1.46 timer upgrade E2E
name: Ordinary server 0.1.50 to 0.1.51 installed-host upgrade E2E

on:
workflow_call:
Expand Down Expand Up @@ -37,7 +37,7 @@ permissions:

jobs:
released-upgrade-chain:
name: Ubuntu 24.04 / PostgreSQL 18 / recurring credential renewal
name: Ubuntu 24.04 / PostgreSQL 18 / installed-host state preservation
runs-on: ubuntu-24.04
timeout-minutes: 60

Expand All @@ -51,11 +51,6 @@ jobs:
shell: bash
run: install -m 0755 scripts/ci/ordinary-server-upgrade-e2e.sh "$RUNNER_TEMP/ordinary-server-upgrade-e2e.sh"

- name: Check out frozen v0.1.46 evidence source
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
ref: 9620e24c74e3720ad90790da037b013dd26bfbab

- name: Configure Node.js
uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
Expand Down Expand Up @@ -91,7 +86,7 @@ jobs:
sudo pg_createcluster 18 main --port 5432 --start
sudo -u postgres psql -Atq --dbname=postgres -c "SHOW server_version" | grep -E '^18\.'

- name: Prove exact released-to-corrected timer upgrade
- name: Prove exact v0.1.50-to-v0.1.51 installed-host upgrade
shell: bash
run: "$RUNNER_TEMP/ordinary-server-upgrade-e2e.sh"

Expand Down
56 changes: 38 additions & 18 deletions PUBLIC_RELEASE_STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,52 @@ requirements, gate ledgers, or accountable-owner evidence.
Reads of the public npm registry and immutable Git tag returned:

- package: `@misunders2d/agentnet`
- latest published version: `0.1.45`
- published source commit: `e8a49671481767078551f677599f51af051c3d5a`
- immutable tag: `v0.1.45`
- registry shasum: `06f4775ecf63097068e1f3583fe84a2c66c64096`
- latest published version: `0.1.50`
- published source commit: `c7c5659055884b3a6fa4ad05f1e43b7e7e844436`
- immutable tag: `v0.1.50`
- registry shasum: `4875fd0e37b8a12689a6a50772b89e118931e7d7`
- provenance: SLSA statement signed by the trusted GitHub Actions publisher and
approved by the accountable npm owner

`0.1.45` is a **fresh-install-only** release. In-place upgrade from `0.1.44` is
not a supported path: the packaged upgrade and rollback lane is preserved as
non-green, so operators must install `0.1.45` on a clean host and re-enroll the
server and each harness. Publication is gated on the ordinary-server
clean-install lane, which is the exact path operators follow.
`0.1.50` is the published setup-usability release. It supports the exact
allowlisted schema-v7 five-unit upgrade paths documented by that immutable
package. Publication does not prove installed-host convergence, production
durability, or any must-not-ship gate.

Package availability does not authorize deployment and does not establish
production readiness. No must-not-ship gate is promoted by publication.

## Setup-usability `0.1.50` candidate
## Corrective `0.1.51` candidate

Candidate `0.1.51` retains the published `0.1.50` setup and laptop protocols
and adds package-owned convergence for the exact ordinary-onboarding
placeholder Approval owner and for a committed communication scope missing
its schema-v7 collaboration projection. The target owner is derived from
enrolled Core identity plus Approval's pinned OIDC binding; signer and Core
policy cutover is journaled and resumable. New scope activation writes its
projection atomically, and legacy repair derives it from the existing
committed scope without replacing authority.

The retained one-hour v0.1.50 Approval hotfix is accepted only when its
reconstructed published form matches the setup marker, then journaled and
normalized to separate ordinary and communication-scope deadlines. When that
hotfix and an already-completed canonical-owner repair coexist while the marker
still records the pre-repair source, setup accepts the host only by validating
the terminal recovery journal and reconstructing both marker-era Approval and
Core documents. Both digests must match before journaling or managed writes;
incomplete evidence or unrelated drift fails closed.

A lost PostgreSQL runtime heartbeat publishes fail-closed state before another
protected operation can enter; work remains unavailable until a later operation
verifies a fresh connection and acquires a strictly higher same-owner fence.

The candidate accepts only exact five-unit schema-v7 markers from v0.1.45
through v0.1.50. Ambiguous, drifted, incomplete, or unsupported state fails
closed. Installed-host, cross-platform, and disposable PostgreSQL 18.4 evidence
for the preceding exact commit remains retained but does not bind this
corrective source delta. Fresh same-commit CI and server PostgreSQL validation
remain pending before live convergence; no production or gate claim is made.

Candidate `0.1.50` wraps the existing strict server and laptop protocols in
one resumable command per machine. It adds authenticated discovery defaults,
content-free named phases, bounded deadlines, exact blocker/recovery output,
and direct allowlisted upgrades from exact v0.1.45–v0.1.49 schema-v7 five-unit
markers. Packed-package verification requires an installed separate-process
message/obligation roundtrip. Release artifacts, complete validation, fresh CI,
and publication remain pending. This local implementation does not promote a
requirement, production claim, or must-not-ship gate.

## Corrective `0.1.49` candidate

Expand Down
60 changes: 59 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,13 @@ Live subscriptions wake connected agents immediately. Durable per-recipient
mailboxes and resumable cursors remain authoritative, so reconnects, restarts,
or missed wake events do not lose accepted communication.

The PostgreSQL runtime lease is fenced and renewable. If its background
heartbeat fails, Core publishes the failure under the storage lock before
another protected operation can enter. The next operation opens a fresh
verified connection and may resume only after acquiring a strictly higher fence
for the same runtime owner; otherwise Core remains unavailable. The superseded
connection is closed, so a stale process cannot resume writing.

## Security is the product boundary

AgentNet treats every harness, relay, external agent, file, model output, and
Expand Down Expand Up @@ -287,6 +294,17 @@ agree. The command performs no authority grant or restart. Exact retry
reconciles interruption; missing, stale, edited, or unaudited provenance fails
closed. After completion, rerun the same digest-bound setup apply/start.

An expired laptop or peer harness that still owns an active collaboration-scope
membership is replaced only through the root-only
`server-agent replace-expired-scope-harness` command. An active managed-server
harness of the same verified principal may open the ceremony because the
expired member cannot authenticate; the exact scope-owning principal must then
approve the complete transaction through Approval. The atomic commit
tombstones the former member, activates the named same-principal replacement as
`member`, advances the scope revision and membership sequence once, and makes
current schema-v7 membership authoritative immediately. It changes no managed
identity/configuration file and restarts no service.

Plan and apply bind exact Node/uv/launcher/`systemctl`/`useradd` paths and
content hashes plus the canonical full AgentNet package-tree content hash to
the request-versioned approval digest. Apply
Expand Down Expand Up @@ -441,7 +459,7 @@ always-on deployment—see the [implementation guide](docs/implementation-guide.
## Project status

AgentNet is an early public implementation; the latest published package is
`0.1.45`. Its publication does not promote any requirement or gate.
`0.1.50`. Its publication does not promote any requirement or gate.
Published `0.1.29` repaired owner/enrollment OIDC callback parsing after real
Google owner login exposed rejection of valid unique response extensions;
published `0.1.30` repaired installed-verifier package custody; published
Expand Down Expand Up @@ -543,6 +561,46 @@ addition to the existing installed journey. These are local and CI evidence,
not production certification, and no requirement or must-not-ship gate is
promoted.

Candidate `0.1.51` adds the package-owned corrective recovery path for the
exact ordinary-onboarding state where Approval still names the setup
placeholder owner after Core enrolled the canonical human. Managed setup
derives the target only from the enrolled Core identity and Approval's pinned
OIDC binding, rotates current Approval signing authority to that principal,
and journals resumable Core policy replacement. It rejects identity, domain,
OIDC, signer, database, configuration, or journal ambiguity. New communication
activation writes its complete schema-v7 collaboration projection in the same
transaction; an already committed scope missing that projection is repaired
from its immutable scope rows without replacing the scope or minting broader
authority. Exact five-unit schema-v7 markers from v0.1.45 through published
v0.1.50 may upgrade directly to v0.1.51.

The v0.1.50→v0.1.51 transition preserves the exact published v0.1.50
Approval TTL policy (`request_ttl_seconds=300` with no separate
communication-scope field). It separately recognizes the retained one-hour
hotfix shape. If that operational hotfix was not written into the setup marker,
setup reconstructs the exact published 300-second form and requires its
canonical digest to equal the marker before creating a journal. It then
journals the realized configuration, restores the ordinary approval deadline
to 600 seconds, keeps the communication-scope ceremony ceiling at 3600
seconds, and atomically replaces the file. A crash resumes from the journal;
any additional drift fails closed, and pre-commit rollback restores the exact
source bytes.

If the canonical-owner repair already completed while that one-hour hotfix
remained outside the marker, setup accepts the combined state only after the
completed recovery evidence reconstructs the marker-era Approval and Core
documents. It reverses only the evidence-bound owner and signer fields in
memory, then requires both reconstructed canonical digests to equal the
marker. Historical marker matching treats only the fixed mandatory
approval-purpose set as order-insensitive; it may reconstruct that set's
serialized order to reproduce the retained digest, but any added, removed,
duplicated, or changed purpose fails closed. The realized current documents
are journaled, the TTL policy is normalized, and owner/Core convergence is
rechecked idempotently. Missing Core-OIDC agreement, incomplete evidence, or
unrelated drift fails before setup creates its upgrade journal or changes
managed state.


Git tag `v0.1.23` reached the staging workflow, but CI stopped before npm
staging because one hermetic interruption test mocked `/usr/bin/useradd` on a
runner where that path did not exist. No `0.1.23` package was staged or
Expand Down
63 changes: 40 additions & 23 deletions RELEASE_MANIFEST.json
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@
"path": "uv.lock",
"pyproject": {
"path": "pyproject.toml",
"sha256": "95c9effe37951f5ab012aa00743ecc52b44ca0ac0b62ab08eddafa3ab7559e7a"
"sha256": "6aebcdea17d2715c3136c2b6b3179a424a3eed990f54d65a4cccbf67c715c5da"
},
"resolution": {
"a2a-sdk": "1.1.0",
Expand Down Expand Up @@ -285,7 +285,7 @@
"webauthn": "3.0.0"
},
"revision": 3,
"sha256": "afffa3558290939ca4f3efae1b04559db3299084f4a62c0d93ccdd4ab66e69c8"
"sha256": "c971fdea8d3782a9d7349b5723f4e036740d314f19f7c3553dc6ba1780c9f84d"
},
"external_release_evidence": {
"installer_lifecycle": {
Expand Down Expand Up @@ -529,86 +529,103 @@
"release": {
"name": "agentnet",
"production_ready": false,
"profile": "setup_usability_candidate",
"profile": "canonical_owner_recovery_candidate",
"reason": "All 19 must-not-ship gates remain non-PASSED; local implementation evidence is partial and required external, privileged, production-topology, or owner evidence remains absent.",
"ship_eligible": false,
"status": "BLOCKED",
"version": "0.1.50"
"version": "0.1.51"
},
"release_inputs": {
"README.md": {
"path": "README.md",
"sha256": "f6839282457daeeb8cad2b76621b384725cb6caac15e92ad3e09f72633fcbbe3"
"sha256": "fb8b10a622b64f024462047ba82708cc090270b27f13e9f94e045c8208ad99b8",
"size": 46552
},
"REQUIREMENTS_STATUS.md": {
"path": "REQUIREMENTS_STATUS.md",
"sha256": "59491a96c8697c41c47d29756144768f5b62da0df04c3d75c9579dc762dae0d8"
"sha256": "3afd7cfecd7199ccb142f2701aa9a8920f7542ffa52b36f8157cfd177e2e88e2",
"size": 106532
},
"deploy/Dockerfile": {
"path": "deploy/Dockerfile",
"sha256": "e0e6d42368772ecb420625d36555400e7b15ee0a4b250a2c7e6ded107f27cd37"
"sha256": "e0e6d42368772ecb420625d36555400e7b15ee0a4b250a2c7e6ded107f27cd37",
"size": 1188
},
"deploy/compose.production.json": {
"path": "deploy/compose.production.json",
"sha256": "a66803887f965dc86862d8a7ef66e44e98f201743f200d826c270a4af1cab822"
"sha256": "a66803887f965dc86862d8a7ef66e44e98f201743f200d826c270a4af1cab822",
"size": 21622
},
"deploy/nginx-agent.conf": {
"path": "deploy/nginx-agent.conf",
"sha256": "1873ee423f222c9f2efbc18c324d2be1fc2ce911dcf8848e2853d5d8fb1288be"
"sha256": "1873ee423f222c9f2efbc18c324d2be1fc2ce911dcf8848e2853d5d8fb1288be",
"size": 857
},
"deploy/render_and_run.py": {
"path": "deploy/render_and_run.py",
"sha256": "11f812ce645ee612ef5c3f2ae07e0d987a516f7f474bd0b89c435fab8432a0e0"
"sha256": "11f812ce645ee612ef5c3f2ae07e0d987a516f7f474bd0b89c435fab8432a0e0",
"size": 24256
},
"docs/GATE_EVIDENCE.md": {
"path": "docs/GATE_EVIDENCE.md",
"sha256": "1d690b65756169e1954c1a37c0436bc3dc053e903e61dd4a647a0a0f786be6e2"
"sha256": "3ed1f1795f4b02b104d80583d79758b0e8ee654af52022b3d18b329378bfc7d6",
"size": 85207
},
"docs/RELEASE_MANIFEST.md": {
"path": "docs/RELEASE_MANIFEST.md",
"sha256": "99fb7ad44dfb05766c59ac69c1decb1df9e951984c7196acb53c37179d2d99ad"
"sha256": "c04c1a93d52121f84c15f81859ecdefe85ae11d5f67ddf57e925e58a8e1c4cf6",
"size": 27861
},
"evidence/gates/G01/2026-07-13-installed-harnesses/manifest.json": {
"path": "evidence/gates/G01/2026-07-13-installed-harnesses/manifest.json",
"sha256": "f691b3a676a518f2bc8c7ee7a099e544c884ebd1f3d8bab7e7d031aa4c86946b"
"sha256": "f691b3a676a518f2bc8c7ee7a099e544c884ebd1f3d8bab7e7d031aa4c86946b",
"size": 1921
},
"evidence/gates/G04/2026-07-13-alpha2-http-json/REVIEW.md": {
"path": "evidence/gates/G04/2026-07-13-alpha2-http-json/REVIEW.md",
"sha256": "3ff08c0a0eb296ce2181f634277c4037d7278349b25a9033557dbe50dc52dd42"
"sha256": "3ff08c0a0eb296ce2181f634277c4037d7278349b25a9033557dbe50dc52dd42",
"size": 3931
},
"evidence/gates/G04/2026-07-13-alpha2-http-json/manifest.json": {
"path": "evidence/gates/G04/2026-07-13-alpha2-http-json/manifest.json",
"sha256": "5d7e6526c6da7368046684243502c42a8a31cfee5152affad01e45bdf0b23ead"
"sha256": "5d7e6526c6da7368046684243502c42a8a31cfee5152affad01e45bdf0b23ead",
"size": 10657
},
"evidence/gates/G09/2026-07-13-postgresql-18.4-local/manifest.json": {
"path": "evidence/gates/G09/2026-07-13-postgresql-18.4-local/manifest.json",
"sha256": "fc99d7d2600f031eab99b7bffefd59eabdedfe72be91209dcd0afcd847b2ceeb"
"sha256": "fc99d7d2600f031eab99b7bffefd59eabdedfe72be91209dcd0afcd847b2ceeb",
"size": 2977
},
"scripts/ci/exact_endpoint_routing_e2e.py": {
"path": "scripts/ci/exact_endpoint_routing_e2e.py",
"sha256": "60347eb321bebed08971c24ece0be1d2a72bb32f3c12070bf5b0509606b90e80"
"sha256": "60347eb321bebed08971c24ece0be1d2a72bb32f3c12070bf5b0509606b90e80",
"size": 16983
},
"scripts/ci/packaged_local_communication_e2e.py": {
"path": "scripts/ci/packaged_local_communication_e2e.py",
"sha256": "096bbc1a551c9bd313aa4e0024c40a7cb8b619a63417a7c5b1ef33776c66d27f"
"sha256": "096bbc1a551c9bd313aa4e0024c40a7cb8b619a63417a7c5b1ef33776c66d27f",
"size": 36776
},
"scripts/ci/packaged_v0145_user_journey.py": {
"path": "scripts/ci/packaged_v0145_user_journey.py",
"sha256": "3ac405c76e2b095537c34c9c0bafaf10c0bf9b0e887adcd51647fe99596f2d50"
"sha256": "3ac405c76e2b095537c34c9c0bafaf10c0bf9b0e887adcd51647fe99596f2d50",
"size": 38600
},
"scripts/export_schemas.py": {
"path": "scripts/export_schemas.py",
"sha256": "f8d8cf238c4ce1318331ae60efb1c8db5388cbbd558e2d1d355c80dd870e2ff9"
"sha256": "f8d8cf238c4ce1318331ae60efb1c8db5388cbbd558e2d1d355c80dd870e2ff9",
"size": 2831
},
"scripts/verify_release.py": {
"path": "scripts/verify_release.py",
"sha256": "b559a98eb5050f54a9d4d222ef83e2b6bda16af5c79860699d0eace2c1661d00"
"sha256": "64ee6b0d96f4d63e6ddc785fb26a783ff6a510c9df4b23266701b103404019b9",
"size": 56697
}
},
"release_source_tree": {
"algorithm": "sha256(path NUL bytes NUL)",
"path": "src",
"sha256": "740adfb28e27641c3ec0bab470036c4690fde2c70a53ab0568fde644aecddb7e"
"sha256": "a3ae6ae3d35dcc6f2252f6aeb1e663ac05cbf5f8f234c4898a4f802d54796b2b"
},
"runtime": {
"implementation": "CPython",
Expand Down Expand Up @@ -746,5 +763,5 @@
},
"version": "1.0"
},
"snapshot_date": "2026-08-07"
"snapshot_date": "2026-08-09"
}
Loading
Loading