diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index a6c4e3c..814cbc1 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -1,21 +1,18 @@ -# Current work — agent-stack 0.28.2 release candidate (not published) +# Current work — agent-stack 0.28.2 published -Agent-stack0.28.1 source `cd6421b8ca7d9440bc87e366ebd8a96bb38b69b8` is published, -but independent review found the restart instruction overbroad. The current -[restart correction packet](evidence/runs/2026-10-13-restart-boundaries.md) owns -scope, counterexamples, checks, remaining gates and the exact next action. +The bounded restart correction is published from accepted source +[`2b3d769775e368d0a1e6d0f20ea095ae24fbbd54`](https://github.com/ssheleg/agent-stack/commit/2b3d769775e368d0a1e6d0f20ea095ae24fbbd54) +as annotated tag `v0.28.2`. The [publication receipt](evidence/runs/2026-10-13-release-0.28.2.md#published-readback) +records exact candidate and accepted-main local full checks, genuine PR checks, +all four successful release jobs, registry integrity and 44 matching payload files. +Historical v0.28.0 and v0.28.1 tags remain unchanged. -Independent source review of the doctrine correction passed at -`ff797c6341fe6cdb4d9b0dd2e113f7ebb8f24f6f`, recorded in the hub's -[peer receipt](https://github.com/ssheleg/sshlg-skills/blob/82310a5/docs/evidence/completion-1013/agent-stack-restart-peer.json). -Version metadata now targets 0.28.2; this is not publication evidence. -The [release packet](evidence/runs/2026-10-13-release-0.28.2.md) owns pending gates. +The [restart correction packet](evidence/runs/2026-10-13-restart-boundaries.md) +and [independent source review](https://github.com/ssheleg/sshlg-skills/blob/82310a56309932f5d51b40e3dcdd2801db99a296/docs/evidence/completion-1013/agent-stack-restart-peer.json) +own the doctrine boundary. Text/structural checks and publication do not prove a +native agent followed the instruction or that provider timing/cache outcomes occurred. -Next: independent metadata review, one coordinated local owner aggregate, normal -exact-head PR checks and merge, then exact accepted-main local full chain before -the annotated tag and release/readback; do not change either existing0.28.0 or0.28.1 tag. Hub keeps its -accepted0.27.2 pin until the correction is accepted and published. No native retry -mechanism or model behavior is claimed by these documentation tests. - -Earlier0.27.2 source/publication evidence remains in the -[release packet](evidence/runs/2026-10-13-release-0.27.2.md#published-readback). +Next: the hub coordinator updates its accepted member pin and performs separately +recorded installed readback. This owner task made no machine apply. Remaining owner +board/runtime prerequisites remain open; publication alone does not close them. +Earlier 0.27.2 evidence remains in its [release packet](evidence/runs/2026-10-13-release-0.27.2.md#published-readback). diff --git a/docs/evidence/runs/2026-10-13-release-0.28.2-candidate-full.txt b/docs/evidence/runs/2026-10-13-release-0.28.2-candidate-full.txt new file mode 100644 index 0000000..17cdcea --- /dev/null +++ b/docs/evidence/runs/2026-10-13-release-0.28.2-candidate-full.txt @@ -0,0 +1,231 @@ + +> @ssheleg/agent-stack@0.28.2 test +> python3 test/validate.py && python3 test/plant_guard_test.py && python3 test/member_owner_gates_test.py && python3 test/reap_own_test.py && node test/installer_test.js && npm run test:audit + + unlooked: front matter vs a strict reader — no sshlg-skills umbrella above this checkout +OK: agent-stack structurally valid (17 checks = 13 named + 4 per-skill, 4 skill(s), v0.28.2) +residue: this run left nothing — 0 temp tree(s) created, 0 removed + ok a content change is seen + ok a MODE-ONLY change is seen (the incident) + ok no change at all is refused, by name + ok a new file is seen + ok a deleted file is seen + ok .git churn is not mistaken for a plant + ok a missing tree refuses rather than approves + ok verify without snap refuses + ok the manifest lives outside the tree + +PASS: plant_guard — 9 cases +residue: this run left nothing — 8 temp tree(s) created, 8 removed +Owner gates: 16 process controls; 0 failures +residue: this run left nothing — 16 temp tree(s) created, 16 removed + ok the fixture's eight cases, five distinct file sets, are all recognised + ok near-misses by one byte, entry, name, symlink or manifest are left alone + ok a tree younger than the age floor is left alone + ok dry run is the default and removes nothing + ok --apply removes exactly the matches + ok a missing temp root refuses rather than reports clean + ok --tmpdir / (and an empty root) is refused + ok --tmpdir $HOME is refused + ok --tmpdir at an ancestor of $HOME is refused + ok a non-finite, sub-hour or non-numeric age floor is refused + ok a tree changed in the removal window is put back, not removed + ok an extra empty directory makes a tree somebody else's + ok the end-state count is the fixture's, five + +PASS: reap-own — 13 cases +residue: this run left nothing — 10 temp tree(s) created, 10 removed +ok: fresh HOME installs every shipped skill, and says how updates arrive +ok: rerun skips, --force overwrites, unknown arg exits 2 +ok: plugin present in installed_plugins.json: refuse, exit 3, remedy, nothing written +ok: plugin under a differently-named marketplace: remedy names the real spec +ok: --force overrides the refusal, deliberately +ok: corrupt installed_plugins.json reads as "no plugin" — install, never crash +ok: other plugins, and a prefix-collider, do not trigger a false refusal +ok: marketplaces/ dir alone still refuses (fallback signal, exit 3) +ok: install.sh: fresh install, rerun overwrites (documented behaviour), bad arg exits 2 +ok: install.sh: plugin present — refuse, exit 3, nothing written; --force installs +ok: install.sh: marketplaces dir alone refuses; corrupt JSON fails open +residue: this run left nothing — 11 temp home(s) created, 11 removed +PASS: installer — 11 case(s) + +> @ssheleg/agent-stack@0.28.2 test:audit +> for t in test/audit_regressions/*.py; do python3 "$t" || exit 1; done + + ok the doctrine names the saga, the states, and never 2PC + ok a documented HTTP timeout is unknown, never auto-compensated + ok a definite failure compensates exactly once, with its audit row + ok unknown resolves only by reconciliation evidence + ok the success path stays clean +OK (5 checks) + ok the doctrine states the three rules and the idempotence + ok a late response cannot compensate another's ledger + ok reconciliation asks by key, never by guess + ok repeated reconciliation is idempotent + ok a lost CAS retries and lands exactly once +OK (5 checks) + ok the doctrine splits zero from absent + ok all five acceptance sequences produce their predetermined records + ok zero then zero is unchanged, not an event + +all green + ok the doctrine states the gate and the old behaviour is gone + ok an opposite instruction supersedes, never reinforces — history kept + ok shared keywords and a negation flip are not a conflict + ok a correction wins only in its own scope; a number change is caught + ok self-repetition bumps nothing; independent corroboration does + ok verified does not exempt a volatile fact from freshness + +all green + ok the doctrine states the lifecycle + ok repeated retrieval raises nothing; independence corroborates + ok supersession keeps the dated history and reverses cleanly + ok a volatile verified fact still expires; a stable one does not + +all green + ok the doctrine types the edge and drops the untyped delete rule + ok backup→migration, approval→charge, lease→edit survive + ok a truly fake edge still dies + ok two writers serialise; read-only reviews parallelise + ok a reader of a writer's target is an edge too + +all green + ok all three docs redefine auditability via the execution record + bounds + ok static is a preference, not an audit requirement + ok a complete static AND dynamic record both pass the same audit + ok a deleted event/edge is detected in both + ok a design diagram alone never passes + +all green + ok the doctrine states the seed corpus and release gate + ok the seed corpus has happy/adversarial/failure_retry with provenance + ok the scenarios note points at the seed and says specification-ready + ok observable-only is specification-ready, executed is release-ready + ok a corrupt input is TEST_ERROR, not a behaviour result + ok cases are isolated + +all green + ok the doctrine carves out the mandatory partial order + ok two independent reads reorder freely + ok confirm-after-charge fails + ok acquire-after-write fails + ok the partial order is not a total order + +all green + ok wilson ships, is boundary-honest, n=0 = total uncertainty + ok the Wald helper states its validity limits + ok dependence-widens and p^k-baseline carry their assumptions + ok unpaired comparison is legitimate with the wider band + ok pass@k/pass^k aggregate over task-level trials + ok pooling repeated trials as tasks visibly distorts the number + +all green + ok the design→method table stands, receipt names both + ok dependent repeats never iid; small n buys nothing + ok splits are frozen; holdout spent once; unseen is history + ok the matching rule refuses the audit's counterexamples + +all green + ok the doctrine states the extensible well-known set and provenance + ok the doctrine separates totals from disjoint billing buckets + ok an unknown operation value is kept raw, not dropped + ok cache reads are not billed at the full input rate + ok reasoning and modality subsets are not double-counted + +all green + ok the doctrine carries the worked reconciling receipt + ok the receipt matches the worked example ($3.84) + ok the priced buckets sum back to the totals + ok no cached token is charged twice + ok the naive input+output over-charges + +all green + ok the replay senses are split, cost/stochasticity reflected + ok candidate records separate; regrade labelled regrade + ok the mutation-must-move-the-gate rule is stated + ok the gate rule run as behaviour (mutation moves execution, not regrade) + +all green + ok the doctrine states the grant contract + ok a client boolean is not authorization + ok a valid grant authorizes its exact request + ok a stale grant does not authorize changed arguments + ok an expired grant is refused + ok a trifecta pair is not blanket safe + +all green + ok the doctrine states the trifecta's limit + ok a missing leg is not a PASS for a destructive effect + ok the full trifecta is an exfiltration finding + ok the capability and effect axes are independent + ok a genuinely safe session has neither finding + +all green + ok the two distributions are distinguished; imports named/refused + ok the pin is the example's identity, dated + ok v1/standalone out of scope; lifecycle order verified + ok proof is a localhost protocol call with the 200/401/list/call set + ok every FastMCP snippet matches the named distribution + +all green + ok the primary criterion is WHAT, duration is a second question + ok the old lifecycle→A2A tell is gone + ok the routing set covers Tasks / A2A / unsupported-fallback + ok no case is decided by the word long-running; negotiated support is checked + ok mcp.md carries the same rule at the Tasks bullet + +all green + ok the three proof classes are separated + ok no evals = unknown reliability; proven harm never masked + ok prompt-first is a heuristic with named exceptions + ok the traps carry both new rules + ok fixture: the no-evals repo keeps BOTH findings, double charge unmasked + ok a broken unit invariant is not treated by rewording + +all green + ok every case is structurally valid, none is name-picking + ok the greenfield case demands happy+adversarial+failure/retry (AS-06) + ok the negative case refuses to load the skill + ok the order case pins the causal pair and keeps the negative (AS-07) + ok boundary statistics stay honest; regrade is labelled (AS-08, AS-10) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok control and state edges survive the fake-edge pruner (AS-04) + ok the negative case refuses to load the skill + ok reconstruction covers dynamic too; confirm:true is not a grant (AS-05, AS-11) + ok no-evals hides no double charge; manifest rules recorded (AS-14) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok the pinned MCP example proves 401 + scoped old constructor (AS-12) + ok the negative case refuses to load the skill + ok protocol routing is not decided by the word long-running (AS-13) + ok unsupported Tasks falls back, not to A2A; live probe-gated (AS-13, AS-12) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok the saga case keeps an unknown outcome pending (AS-01) + ok the negative case refuses to load the skill + ok zero baseline is not missing; opposites do not merge (AS-02, AS-03) + ok the fake-edge no-op preserves control/state edges (AS-04) + ok the family harness validates each case (where present) + +all green +.............. +---------------------------------------------------------------------- +Ran 14 tests in 0.171s + +OK +residue: this run left nothing — 14 temp tree(s) created, 14 removed +PASS: restart-boundaries — candidate contract + 11 text plants/controls; no agent replay + ok the token rule is DL-26: per caller, verified, refused, narrowing + ok a tier is placed by origin; T1 waits on RM-21 + ok fail-closed and the descriptor token are scoped; pins carry DL-25/DL-26 + ok five human gates, three money levels, token-less metering + ok mcp.md: job handle, envelope, input responses, well-known degraded + +all green diff --git a/docs/evidence/runs/2026-10-13-release-0.28.2-main-full.txt b/docs/evidence/runs/2026-10-13-release-0.28.2-main-full.txt new file mode 100644 index 0000000..6177002 --- /dev/null +++ b/docs/evidence/runs/2026-10-13-release-0.28.2-main-full.txt @@ -0,0 +1,231 @@ + +> @ssheleg/agent-stack@0.28.2 test +> python3 test/validate.py && python3 test/plant_guard_test.py && python3 test/member_owner_gates_test.py && python3 test/reap_own_test.py && node test/installer_test.js && npm run test:audit + + unlooked: front matter vs a strict reader — no sshlg-skills umbrella above this checkout +OK: agent-stack structurally valid (17 checks = 13 named + 4 per-skill, 4 skill(s), v0.28.2) +residue: this run left nothing — 0 temp tree(s) created, 0 removed + ok a content change is seen + ok a MODE-ONLY change is seen (the incident) + ok no change at all is refused, by name + ok a new file is seen + ok a deleted file is seen + ok .git churn is not mistaken for a plant + ok a missing tree refuses rather than approves + ok verify without snap refuses + ok the manifest lives outside the tree + +PASS: plant_guard — 9 cases +residue: this run left nothing — 8 temp tree(s) created, 8 removed +Owner gates: 16 process controls; 0 failures +residue: this run left nothing — 16 temp tree(s) created, 16 removed + ok the fixture's eight cases, five distinct file sets, are all recognised + ok near-misses by one byte, entry, name, symlink or manifest are left alone + ok a tree younger than the age floor is left alone + ok dry run is the default and removes nothing + ok --apply removes exactly the matches + ok a missing temp root refuses rather than reports clean + ok --tmpdir / (and an empty root) is refused + ok --tmpdir $HOME is refused + ok --tmpdir at an ancestor of $HOME is refused + ok a non-finite, sub-hour or non-numeric age floor is refused + ok a tree changed in the removal window is put back, not removed + ok an extra empty directory makes a tree somebody else's + ok the end-state count is the fixture's, five + +PASS: reap-own — 13 cases +residue: this run left nothing — 10 temp tree(s) created, 10 removed +ok: fresh HOME installs every shipped skill, and says how updates arrive +ok: rerun skips, --force overwrites, unknown arg exits 2 +ok: plugin present in installed_plugins.json: refuse, exit 3, remedy, nothing written +ok: plugin under a differently-named marketplace: remedy names the real spec +ok: --force overrides the refusal, deliberately +ok: corrupt installed_plugins.json reads as "no plugin" — install, never crash +ok: other plugins, and a prefix-collider, do not trigger a false refusal +ok: marketplaces/ dir alone still refuses (fallback signal, exit 3) +ok: install.sh: fresh install, rerun overwrites (documented behaviour), bad arg exits 2 +ok: install.sh: plugin present — refuse, exit 3, nothing written; --force installs +ok: install.sh: marketplaces dir alone refuses; corrupt JSON fails open +residue: this run left nothing — 11 temp home(s) created, 11 removed +PASS: installer — 11 case(s) + +> @ssheleg/agent-stack@0.28.2 test:audit +> for t in test/audit_regressions/*.py; do python3 "$t" || exit 1; done + + ok the doctrine names the saga, the states, and never 2PC + ok a documented HTTP timeout is unknown, never auto-compensated + ok a definite failure compensates exactly once, with its audit row + ok unknown resolves only by reconciliation evidence + ok the success path stays clean +OK (5 checks) + ok the doctrine states the three rules and the idempotence + ok a late response cannot compensate another's ledger + ok reconciliation asks by key, never by guess + ok repeated reconciliation is idempotent + ok a lost CAS retries and lands exactly once +OK (5 checks) + ok the doctrine splits zero from absent + ok all five acceptance sequences produce their predetermined records + ok zero then zero is unchanged, not an event + +all green + ok the doctrine states the gate and the old behaviour is gone + ok an opposite instruction supersedes, never reinforces — history kept + ok shared keywords and a negation flip are not a conflict + ok a correction wins only in its own scope; a number change is caught + ok self-repetition bumps nothing; independent corroboration does + ok verified does not exempt a volatile fact from freshness + +all green + ok the doctrine states the lifecycle + ok repeated retrieval raises nothing; independence corroborates + ok supersession keeps the dated history and reverses cleanly + ok a volatile verified fact still expires; a stable one does not + +all green + ok the doctrine types the edge and drops the untyped delete rule + ok backup→migration, approval→charge, lease→edit survive + ok a truly fake edge still dies + ok two writers serialise; read-only reviews parallelise + ok a reader of a writer's target is an edge too + +all green + ok all three docs redefine auditability via the execution record + bounds + ok static is a preference, not an audit requirement + ok a complete static AND dynamic record both pass the same audit + ok a deleted event/edge is detected in both + ok a design diagram alone never passes + +all green + ok the doctrine states the seed corpus and release gate + ok the seed corpus has happy/adversarial/failure_retry with provenance + ok the scenarios note points at the seed and says specification-ready + ok observable-only is specification-ready, executed is release-ready + ok a corrupt input is TEST_ERROR, not a behaviour result + ok cases are isolated + +all green + ok the doctrine carves out the mandatory partial order + ok two independent reads reorder freely + ok confirm-after-charge fails + ok acquire-after-write fails + ok the partial order is not a total order + +all green + ok wilson ships, is boundary-honest, n=0 = total uncertainty + ok the Wald helper states its validity limits + ok dependence-widens and p^k-baseline carry their assumptions + ok unpaired comparison is legitimate with the wider band + ok pass@k/pass^k aggregate over task-level trials + ok pooling repeated trials as tasks visibly distorts the number + +all green + ok the design→method table stands, receipt names both + ok dependent repeats never iid; small n buys nothing + ok splits are frozen; holdout spent once; unseen is history + ok the matching rule refuses the audit's counterexamples + +all green + ok the doctrine states the extensible well-known set and provenance + ok the doctrine separates totals from disjoint billing buckets + ok an unknown operation value is kept raw, not dropped + ok cache reads are not billed at the full input rate + ok reasoning and modality subsets are not double-counted + +all green + ok the doctrine carries the worked reconciling receipt + ok the receipt matches the worked example ($3.84) + ok the priced buckets sum back to the totals + ok no cached token is charged twice + ok the naive input+output over-charges + +all green + ok the replay senses are split, cost/stochasticity reflected + ok candidate records separate; regrade labelled regrade + ok the mutation-must-move-the-gate rule is stated + ok the gate rule run as behaviour (mutation moves execution, not regrade) + +all green + ok the doctrine states the grant contract + ok a client boolean is not authorization + ok a valid grant authorizes its exact request + ok a stale grant does not authorize changed arguments + ok an expired grant is refused + ok a trifecta pair is not blanket safe + +all green + ok the doctrine states the trifecta's limit + ok a missing leg is not a PASS for a destructive effect + ok the full trifecta is an exfiltration finding + ok the capability and effect axes are independent + ok a genuinely safe session has neither finding + +all green + ok the two distributions are distinguished; imports named/refused + ok the pin is the example's identity, dated + ok v1/standalone out of scope; lifecycle order verified + ok proof is a localhost protocol call with the 200/401/list/call set + ok every FastMCP snippet matches the named distribution + +all green + ok the primary criterion is WHAT, duration is a second question + ok the old lifecycle→A2A tell is gone + ok the routing set covers Tasks / A2A / unsupported-fallback + ok no case is decided by the word long-running; negotiated support is checked + ok mcp.md carries the same rule at the Tasks bullet + +all green + ok the three proof classes are separated + ok no evals = unknown reliability; proven harm never masked + ok prompt-first is a heuristic with named exceptions + ok the traps carry both new rules + ok fixture: the no-evals repo keeps BOTH findings, double charge unmasked + ok a broken unit invariant is not treated by rewording + +all green + ok every case is structurally valid, none is name-picking + ok the greenfield case demands happy+adversarial+failure/retry (AS-06) + ok the negative case refuses to load the skill + ok the order case pins the causal pair and keeps the negative (AS-07) + ok boundary statistics stay honest; regrade is labelled (AS-08, AS-10) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok control and state edges survive the fake-edge pruner (AS-04) + ok the negative case refuses to load the skill + ok reconstruction covers dynamic too; confirm:true is not a grant (AS-05, AS-11) + ok no-evals hides no double charge; manifest rules recorded (AS-14) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok the pinned MCP example proves 401 + scoped old constructor (AS-12) + ok the negative case refuses to load the skill + ok protocol routing is not decided by the word long-running (AS-13) + ok unsupported Tasks falls back, not to A2A; live probe-gated (AS-13, AS-12) + ok the family harness validates each case (where present) + +all green + ok every case is structurally valid, none is name-picking + ok the saga case keeps an unknown outcome pending (AS-01) + ok the negative case refuses to load the skill + ok zero baseline is not missing; opposites do not merge (AS-02, AS-03) + ok the fake-edge no-op preserves control/state edges (AS-04) + ok the family harness validates each case (where present) + +all green +.............. +---------------------------------------------------------------------- +Ran 14 tests in 0.355s + +OK +residue: this run left nothing — 14 temp tree(s) created, 14 removed +PASS: restart-boundaries — candidate contract + 11 text plants/controls; no agent replay + ok the token rule is DL-26: per caller, verified, refused, narrowing + ok a tier is placed by origin; T1 waits on RM-21 + ok fail-closed and the descriptor token are scoped; pins carry DL-25/DL-26 + ok five human gates, three money levels, token-less metering + ok mcp.md: job handle, envelope, input responses, well-known degraded + +all green diff --git a/docs/evidence/runs/2026-10-13-release-0.28.2-published.json b/docs/evidence/runs/2026-10-13-release-0.28.2-published.json new file mode 100644 index 0000000..1357e4d --- /dev/null +++ b/docs/evidence/runs/2026-10-13-release-0.28.2-published.json @@ -0,0 +1,378 @@ +{ + "status": "PUBLISHED_PAYLOAD_VERIFIED", + "source": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54", + "tag": "v0.28.2", + "tags": { + "refs/tags/v0.28.0": "c900c0807a8902b44f5ee8967c2a93a8d4a56961", + "refs/tags/v0.28.0^{}": "cb8f6993a61473f3974bc3af67925439ed4abb75", + "refs/tags/v0.28.1": "004e0cbae65704c84e5b1cea5eac66bcb331c63a", + "refs/tags/v0.28.1^{}": "cd6421b8ca7d9440bc87e366ebd8a96bb38b69b8", + "refs/tags/v0.28.2": "9e5e0ec80ab5940b703a53f9d86069d504bf8376", + "refs/tags/v0.28.2^{}": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54" + }, + "run": { + "headSha": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54", + "event": "push", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38374231314" + }, + "jobs": [ + { + "name": "validate / validate", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38374231314/job/115218463166" + }, + { + "name": "validate / House skill audit", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38374231314/job/115218463583" + }, + { + "name": "release", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38374231314/job/115218706425" + }, + { + "name": "publish", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38374231314/job/115218821348" + } + ], + "dist": { + "shasum": "5842a8da28b7d95725d10e20acf89e83c55e5d34", + "tarball": "https://registry.npmjs.org/@ssheleg/agent-stack/-/agent-stack-0.28.2.tgz", + "fileCount": 44, + "integrity": "sha512-1rpdHj0+IPPYhzzK7yy4bfe4VFR+Ja0gJOEVKAChPLrtKBTMNZiy2n3Aoz58XSYr43sB1qQOYOka7PjSAZownQ==", + "signatures": [ + { + "sig": "MEUCIQC5xdPXdou5o0ULrqJghFtyzXXJvmzEnzRo5wsr/gYswAIgBS3dvNo+papGCVp8z0O+Ga/96SSgfATe/JjpDXsbDhg=", + "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U" + }, + { + "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U", + "sig": "MEUCIQC7fzaXR4eDFsvcxW5HEtlHEq3OgCbEh0DLSAP5T6gFQgIgcfWJEEl8xkrgSbmqIJDEyakbQNoMAGRRb25QchUS9zk=" + } + ], + "attestations": { + "url": "https://registry.npmjs.org/-/npm/v1/attestations/@ssheleg%2fagent-stack@0.28.2", + "provenance": { + "predicateType": "https://slsa.dev/provenance/v1" + } + }, + "unpackedSize": 609718 + }, + "integrityVerified": true, + "payloadCount": 44, + "payload": [ + { + "path": "CHANGELOG.md", + "bytes": 111515, + "sha256": "0fce6df83bb875438bbcd2dd1609665ae19348284405c1b2c7b075514a375e7e" + }, + { + "path": "LICENSE", + "bytes": 1064, + "sha256": "826df230e15df9b208c1e08c42ef3b764b21c4abec5a91a38976748e92a82e9d" + }, + { + "path": "README.md", + "bytes": 14601, + "sha256": "49953599fcd54dfcba0f1254636ddd46fca0e0ac6c141091bf72552c53131f3e" + }, + { + "path": "SECURITY.md", + "bytes": 3071, + "sha256": "87715bb85d820beb6179cf5294fc7ed461cb234657df810031c0eb527fb00b62" + }, + { + "path": "bin/agent-stack.js", + "bytes": 7391, + "sha256": "5706481b1f1266174eeefebc1f2fc5ff6f30f77b395289490b182e95d5c97b00" + }, + { + "path": "package.json", + "bytes": 1323, + "sha256": "42cbab0ed2a00d1bc950ada5688221b8d291bf82f1a681df6e3994935066ceed" + }, + { + "path": "plugins/agent-stack/.claude-plugin/plugin.json", + "bytes": 1081, + "sha256": "678aa34cceef4ff51bedad7f718baa901af911fdf33afd9bf22b091ac1461a3f" + }, + { + "path": "plugins/agent-stack/skills/agent-evals/SKILL.md", + "bytes": 20773, + "sha256": "8f533ce3e320e0416163a39a98207cd347a0d22332c4072afa1d628f77204b8b" + }, + { + "path": "plugins/agent-stack/skills/agent-evals/references/multi-agent.md", + "bytes": 5473, + "sha256": "e0c3175aa8858de1ba8117c613d2e201e32ff581453078c927a3ebddcff6c0bb" + }, + { + "path": "plugins/agent-stack/skills/agent-evals/references/otel-genai.md", + "bytes": 13131, + "sha256": "d2cadad0a6a0632d234a51621b136f3001f5a7422e256f84d261d7c0ff1660d5" + }, + { + "path": "plugins/agent-stack/skills/agent-evals/references/statistics.md", + "bytes": 13853, + "sha256": "77cd03cc4f258a097888f81b817e8c9487b4d777d9ac092f76fe48de8de692ca" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/SKILL.md", + "bytes": 14571, + "sha256": "003866190df99a02ea862860050c03c2ce8971479ced5ba75bfe42057a0ba4e0" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/audit.md", + "bytes": 11484, + "sha256": "b91b966250438edd91b87c392113404d830b06301518d9120246321c88d9a1aa" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/context-lifecycle.md", + "bytes": 9055, + "sha256": "f682b0d4894f7f58baf4f39e622ed1bf8bc773d3c76c552a09aecab4c1e23fef" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/instruction-budget.md", + "bytes": 7026, + "sha256": "3962dbe1643ca1f867575786597cfeea93a28b1d0cc940811020e2d4b49fc6a6" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/layers.md", + "bytes": 6161, + "sha256": "e2f4fd73424b0896c493616dbb98e7bd973eaad3b8365b3c1b31964fbac46d89" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/pi-sdk.md", + "bytes": 14100, + "sha256": "b7eb9375934887ed5f85e597e80c5f3d83c02c37cd585aff13960104a31ddcd5" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/pi.md", + "bytes": 12889, + "sha256": "684616062c9d109ff13eed83a5b9a10544040f1ee22790ee70e8d8156b286c08" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/system-prompt.md", + "bytes": 7712, + "sha256": "f8577ebfeb8ae7448b36b5cd7fcca1ef4ab7065d1aef9baf6f7946eb5ea2905a" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/techniques.md", + "bytes": 7968, + "sha256": "4198c8d2d8a0d6da2f8ba7f2370310578167819abbb9bd351a722491ee8f31e8" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/tools.md", + "bytes": 10351, + "sha256": "572822bc05a710019fc5454f2ddb3750537dbf3667fc73fad0c8bcdcd0f1346a" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/references/workbench-contracts.md", + "bytes": 10349, + "sha256": "a17af9cc84dcc8661085ebb606b09ac08ebe39f6c1fc436ab547ac21747bca80" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/scripts/audit_agent.py", + "bytes": 19276, + "sha256": "f0193565dd3851d3ea779a05f018099b9f2bca3eccacc370b9a43048baba656a" + }, + { + "path": "plugins/agent-stack/skills/agent-harness/scripts/instruction_budget.py", + "bytes": 5863, + "sha256": "0f88ff1764cc5a87a2b523126c871e71af750bc29128e05b97f9e6955db999ab" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/SKILL.md", + "bytes": 15786, + "sha256": "3e70a38f204edc6822814335dc6dfc4e8c3b825117137239da46b96fdd60bfec" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/a2a.md", + "bytes": 11113, + "sha256": "e39c4c6d1f19b39e09720c40a09a50e8f2a59824aeb83c5336443f8b709a6c34" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/gateway.md", + "bytes": 22093, + "sha256": "e74e8585eb6a1fba08af5b419a67c41f38689a29886a89dc149ef3465b9319a0" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/mcp-scale.md", + "bytes": 8841, + "sha256": "c69b0bfd73e189776fcc6ecdd7d3e88964073ab19a66ffcf79aab579b341a892" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/mcp-ship.md", + "bytes": 7099, + "sha256": "2918ca0beed94ca7f7e34bb30e2609495c421121d3a94a0e43e743fc76b644a2" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/mcp.md", + "bytes": 14716, + "sha256": "9b427194659408ae7f521ea689b8b23cbfd216f918f313cc961dce360b7e80b4" + }, + { + "path": "plugins/agent-stack/skills/agent-interop/references/registry.md", + "bytes": 8377, + "sha256": "648e7649369b9aa5dac5f424c9a4373292e5d73c90d9466b58171934e5c7b51f" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/SKILL.md", + "bytes": 20286, + "sha256": "8a80583133707ea69c9e7c0963a68f74b138b74e5148e31ceeea12097af32aba" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/context-engineering.md", + "bytes": 11541, + "sha256": "57811d800b75f25a5a242505e8e6be2b33775fb156893ebec51af5ea18fcfc1e" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/governance.md", + "bytes": 9487, + "sha256": "bb2e3389779a56d4ace610bb14b5df05ace7fa6efc1e5810b0ae929f7050e435" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/graph-engineering.md", + "bytes": 28552, + "sha256": "c594d1b0a4813f0d47e60a26e2b7905a964c3017556a400fcbd534f390811e70" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/kv-cache.md", + "bytes": 9911, + "sha256": "b8ae7c5ba9531ebb02ded2e403a8fcb4ae2b944940076a4f15f966d05f6caeae" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/llm-proxy-billing.md", + "bytes": 19674, + "sha256": "84c2144d6a5a917c042c5e31ecfacfe6238c60870da567abc00bd770e3bccccd" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/memory-architecture.md", + "bytes": 20225, + "sha256": "860466e4e54d0116063146401c3df54a25bbf07cdfba18b63d0fb0e06a285f1a" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/memory-landscape.md", + "bytes": 8296, + "sha256": "b297b121ebb07c50579f929f0e5361598625b024dbf49653b82e12b1dc0b4f4d" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/memory-lifecycle.md", + "bytes": 11365, + "sha256": "6c7252553bc6308e6f5ec88bb802a62e4bacd98f7946ec5b2e82fef8c1aa0073" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/patterns.md", + "bytes": 25555, + "sha256": "a239bc4549339b049b54b154f88536bed68256ffffdcdc4a0f41cf7185eeb360" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/pipeline.md", + "bytes": 4549, + "sha256": "89f160068715136c6f7793b305f78371831ebef9527cdb481e15b5af9a1af40b" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/provider-lifecycle.md", + "bytes": 8966, + "sha256": "d9b4462baf1c805daf05612d7ee8556ac5e666f72de62609666f1ee469294de3" + }, + { + "path": "plugins/agent-stack/skills/agent-orchestrator/references/runtime.md", + "bytes": 13205, + "sha256": "4c49fe64e16256fd78529e4a557782c5ccd9be8af8a5703bb92a773bdea12d70" + } + ], + "candidateFull": { + "status": "PASS", + "head": "5e762cfdb9c0d780f9abb2114807d33a1e0fdc0f", + "exit": 0, + "stopped": false, + "sourceChanged": false, + "seconds": 20.04, + "log": "/tmp/as0282-candidate-full.log", + "logSha256": "73f9be3b7a5d03bd04d8fd81d0e29a9f50c699c975a8dcd6bba7512ba41fb325" + }, + "mainFull": { + "source": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54", + "exit": 0, + "seconds": 29.78, + "logSha256": "4023d85fad0748c201a69f42daf9eacb74e24e92257be3080f5db00f68d2351c", + "cleanAfter": true + }, + "installedApply": "NOT_RUN by this task; hub coordinator owns pin/install acceptance", + "candidateLocalFull": { + "status": "PASS", + "head": "5e762cfdb9c0d780f9abb2114807d33a1e0fdc0f", + "exit": 0, + "stopped": false, + "sourceChanged": false, + "seconds": 20.04, + "log": "/tmp/as0282-candidate-full.log", + "logSha256": "73f9be3b7a5d03bd04d8fd81d0e29a9f50c699c975a8dcd6bba7512ba41fb325" + }, + "acceptedMainLocalFull": { + "source": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54", + "exit": 0, + "seconds": 29.78, + "logSha256": "4023d85fad0748c201a69f42daf9eacb74e24e92257be3080f5db00f68d2351c", + "cleanAfter": true + }, + "sourceMerge": { + "status": "MERGED", + "head": "5e762cfdb9c0d780f9abb2114807d33a1e0fdc0f", + "base": "cd6421b8ca7d9440bc87e366ebd8a96bb38b69b8", + "merge": "2b3d769775e368d0a1e6d0f20ea095ae24fbbd54", + "tree": "5827e7df40b30aaef056ec7cc9e84bfa21c9083f", + "treeEqual": true, + "url": "https://github.com/ssheleg/agent-stack/pull/51", + "run": { + "headSha": "5e762cfdb9c0d780f9abb2114807d33a1e0fdc0f", + "event": "pull_request", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38373198942" + }, + "jobs": [ + { + "name": "validate", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38373198942/job/115215002561" + }, + { + "name": "House skill audit", + "conclusion": "success", + "url": "https://github.com/ssheleg/agent-stack/actions/runs/38373198942/job/115215002584" + } + ], + "required": [ + { + "link": "https://github.com/ssheleg/agent-stack/actions/runs/38373198942/job/115215002561", + "name": "validate", + "state": "SUCCESS" + }, + { + "link": "https://github.com/ssheleg/agent-stack/actions/runs/38373198942/job/115215002584", + "name": "House skill audit", + "state": "SUCCESS" + } + ], + "mainFull": "NOT_RUN", + "tag": "NOT_CREATED" + }, + "candidateLog": { + "path": "2026-10-13-release-0.28.2-candidate-full.txt", + "rawSha256": "73f9be3b7a5d03bd04d8fd81d0e29a9f50c699c975a8dcd6bba7512ba41fb325", + "retainedSha256": "73f9be3b7a5d03bd04d8fd81d0e29a9f50c699c975a8dcd6bba7512ba41fb325", + "normalization": "owned checkout paths only" + }, + "mainLog": { + "path": "2026-10-13-release-0.28.2-main-full.txt", + "rawSha256": "4023d85fad0748c201a69f42daf9eacb74e24e92257be3080f5db00f68d2351c", + "retainedSha256": "4023d85fad0748c201a69f42daf9eacb74e24e92257be3080f5db00f68d2351c", + "normalization": "owned checkout paths only" + } +} diff --git a/docs/evidence/runs/2026-10-13-release-0.28.2.md b/docs/evidence/runs/2026-10-13-release-0.28.2.md index 55b72a0..b441fbe 100644 --- a/docs/evidence/runs/2026-10-13-release-0.28.2.md +++ b/docs/evidence/runs/2026-10-13-release-0.28.2.md @@ -1,4 +1,8 @@ -# Agent-stack 0.28.2 release candidate +# Agent-stack 0.28.2 release record + +Current status: PUBLISHED; see [published readback](#published-readback). + +## Original candidate cut Status: NOT PUBLISHED. Current published predecessor is 0.28.1 at `cd6421b8ca7d9440bc87e366ebd8a96bb38b69b8`. @@ -36,3 +40,24 @@ Only package.json, plugin.json and the new changelog section differ in the shipped payload from reviewed doctrine ff797c6; all other published bytes match. These focused checks do not replace the queued owner aggregate or future hosted and release gates. + +## Published readback + +Accepted source [2b3d769775e368d0a1e6d0f20ea095ae24fbbd54](https://github.com/ssheleg/agent-stack/commit/2b3d769775e368d0a1e6d0f20ea095ae24fbbd54) +merged normally through [PR 51](https://github.com/ssheleg/agent-stack/pull/51). +Candidate required checks passed in [run 38373198942](https://github.com/ssheleg/agent-stack/actions/runs/38373198942). +The accepted Git tree equals the reviewed candidate tree. Candidate `npm test` +passed in 20.04 seconds; a separate exact accepted-main `npm test` passed in +29.78 seconds before the annotated tag. Both runs used owned temporary directories +and retained clean source before/after. [Candidate log](2026-10-13-release-0.28.2-candidate-full.txt), +[accepted-main log](2026-10-13-release-0.28.2-main-full.txt) and +[machine receipt](2026-10-13-release-0.28.2-published.json) retain source/hash binding. + +Annotated tag `v0.28.2` peels to that accepted source. All four jobs in +[release run 38374231314](https://github.com/ssheleg/agent-stack/actions/runs/38374231314) +passed. Registry `@ssheleg/agent-stack@0.28.2` tarball integrity was checked and +all 44 payload files were byte-compared with the tagged source. The receipt records +each hash plus immutable v0.28.0/v0.28.1 tag objects and peeled commits; neither +historical tag was rewritten. This successor only records evidence outside the npm +payload and leaves version 0.28.2 unchanged. Parent hub pin/install verification +remains a separate task; no installed apply or native model behavior is claimed. diff --git a/docs/evidence/verification.md b/docs/evidence/verification.md index 8aed362..d8a8b6a 100644 --- a/docs/evidence/verification.md +++ b/docs/evidence/verification.md @@ -10,7 +10,15 @@ This file exists because its absence read as zero exposure. `sshlg-skills` board --- -## Unreleased restart-boundary correction (2026-10-13) +## Release — v0.28.2 (2026-10-13) + +The [publication receipt](runs/2026-10-13-release-0.28.2.md#published-readback) +records accepted source, candidate and exact-main local full checks, genuine PR +checks, annotated tag, all four successful release jobs and 44 byte-equal npm files. +This closes source/publication for the bounded restart correction. Native behavior, +provider outcomes and installed adoption are not established by those checks. + +## Historical unreleased restart-boundary correction cut (2026-10-13) The [owner packet](runs/2026-10-13-restart-boundaries.md) narrows the published 0.28.1 restart instruction: isolated owned recovery, sibling/in-flight admission,