diff --git a/.gitignore b/.gitignore index 1ecb30a..a6d07d4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,12 @@ DerivedData/ *.swp *~ +# Repository-local state roots created by guided examples +/.agents/ +/.release-state/ +/.aps-agent-example/ +/.aps-release-example/ +/.aps-swift-harness-example/ + # CorvidLabs trust toolchain augur.json diff --git a/.specsync/change-sequence.json b/.specsync/change-sequence.json index 5859683..06f4bab 100644 --- a/.specsync/change-sequence.json +++ b/.specsync/change-sequence.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "sequence": 64, - "id": "CHG-0064-fix-release-workflow-fetch-authentication-so-signed-tags-and-attest-notes-can-be", + "sequence": 66, + "id": "CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples", "acknowledged_collisions": [] } diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/approvals.json b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/approvals.json new file mode 100644 index 0000000..2114965 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/approvals.json @@ -0,0 +1,2057 @@ +{ + "approvals": [ + { + "gate": "definition", + "actor": "codex", + "timestamp": 1785333894, + "digest": "9bdf8ff587d75556004f03fb32a3fba0459c1a48a7ec4357d5f6f99080f94e7b", + "note": "Approved runnable examples and documentation coverage for the shipped v1.1.0 contract." + }, + { + "gate": "definition", + "actor": "codex", + "timestamp": 1785334291, + "digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "note": "Definition reconfirmed after examples and verification tasks were finalized; fledge verify passed all 12 steps." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785338981, + "digest": "450caacdb1eefddd9c1dda3c36368b6e0a7ca84d074a5f55a43bec4f8c6b9ead", + "note": "Closing approval after the 12-step Fledge lane passed and GitHub platform checks confirmed macOS, Linux, and Windows behavior." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785339909, + "digest": "3b87a25c148ab564a8c2124199eb78e8aed331c75dae8cbc748cbc6c4209f7df", + "note": "Closing approval after addressing all four PR #140 review findings and rerunning the complete Fledge verification lane." + }, + { + "gate": "definition", + "actor": "codex", + "timestamp": 1785340770, + "digest": "afa9871e790e9cfa628d4fbff52f86d5c47ee4fb1722fa5f1cf59571ad303453", + "note": "Definition updated to cover the .gitignore path required by PR review." + }, + { + "gate": "definition", + "actor": "codex", + "timestamp": 1785340877, + "digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "note": "Restored the already-applied change definition; generated-state ignore policy will be audited in a companion change." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785340962, + "digest": "b3d3f9acac5ec9cf5033d3c5066077ad4864795ed14c4f2382265eb02b373858", + "note": "Closing approval after documentation clarification; full 12-step lane and all platform checks passed." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785342058, + "digest": "11b564623193fbd49f9ba5f95c8be5dced306b90c86dde588232759f8ff00148", + "note": "Closing approval after addressing the latest PR review; full verification passed." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785342976, + "digest": "49313dc06bc0bf54135b9e2fd19aedca75f2d7ca170ad525fbb6926f8020500b", + "note": "Closing approval after the final copy-paste correctness review; full verification passed." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785343556, + "digest": "134c5b15f1db9d90a4487175ca6307f34cf658e0ca59347fa7ffe8f86b718cbe", + "note": "Closing approval after making the Swift harness launcher cross-platform; full verification passed." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785344239, + "digest": "ddb1ca4b41fc6b4300fd5794e5a84cb74a24dd14b5244e7e13c6762adbce2baf", + "note": "Closing approval after safe checkpoint output and ordering fixes; full verification passed." + } + ], + "reopenings": [ + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "PR #140 review identified resumability, safe-default, generated-state ignore, and reusable-checklist corrections before merge.", + "timestamp": 1785339803, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785338981, + "digest": "450caacdb1eefddd9c1dda3c36368b6e0a7ca84d074a5f55a43bec4f8c6b9ead", + "note": "Closing approval after the 12-step Fledge lane passed and GitHub platform checks confirmed macOS, Linux, and Windows behavior." + }, + "prior_verification": { + "timestamp": 1785338977, + "commit": "eb55402e4b5d52ee0231ea306a3edcccd6ae038c", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", + "acceptance_input_digest": "42ff76dbd92601452f2ec02a15af8de446da7c2a8df8f9dcee4d1d5840323405", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "2015740715c7a5d1866dd6be70e818cd12056c9220aa7555c4ae411662b6c6ea", + "entry_digest": "9d7f455a1c3613b7947d623cd0494d639da5a8945383082ff2197aebf6356bec", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "a5b23fd43cf629d46776db5cc5829651ced7359f5edc3c4e5a65b9a1a18eabef", + "entry_digest": "936a3d9b9e763c7855b3c7ee1c92a661591a99203bcd98a8cc30a0d1539d69bb", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "82a1554d63738a65e02bb501cdfe07e90712cdbdb25e622f5d1a286600274d67", + "entry_digest": "f4ea707d5bbcf300cab5f530302195afb223e941a7a8c071cc930595931df13c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "292f24548e6e460525e0b9bb184b689a6dbab3cf56519d98f6c2637bdbc7845a", + "entry_digest": "2a375f0176f357aad9e71c705d977aae2203506944278098658f1f5df1d2dc2f", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "84e7adca79611ef1ddd16cbe9a40f9a063e5d8a84ea1286cef135f1f385c32f3", + "entry_digest": "ba4c604859e2d47691fbf9f17b2e66c0a570ac7e2f77709ee0a7774c837c699e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "656947959de8020a59c935be59d46e134c22ba3937aa891f1f7b59eb601caed6", + "entry_digest": "cbbb1bbfc7fa0c473924f3fcc993d6ea843fd78c19f44669d015914346251e96", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "9390614a85b20add9e5c0e617ffc39d38a27af03af1951a6c23705dbc90f0ef2", + "entry_digest": "ed13c8f6ac65192a5f8f68dfadd3c837d86d2e4c31bffb0eb3424bb5bf486e4b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "b77c50c4cabe31a8ddb172c0f715b735961db528ccdf6abbe1f47025c4ab7d73", + "entry_digest": "82c3a9b2ba04a0e0463f40f7512c9d1cba94d22e6bdde982875fbf4e851aacf6", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", + "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "42ff76dbd92601452f2ec02a15af8de446da7c2a8df8f9dcee4d1d5840323405", + "current_acceptance_input_digest": "d222b59dbf9b7d7bb9c8a974f01273f6c22e104be6e74dca9c0be0dd4568c357" + }, + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "PR #140 review added generated example state exclusions to .gitignore, which must be included in the audited affected paths.", + "timestamp": 1785340759, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785339909, + "digest": "3b87a25c148ab564a8c2124199eb78e8aed331c75dae8cbc748cbc6c4209f7df", + "note": "Closing approval after addressing all four PR #140 review findings and rerunning the complete Fledge verification lane." + }, + "prior_verification": { + "timestamp": 1785339903, + "commit": "7a151837dded09817eff7fc71431404ac8bdcfc5", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "54a1b9dc8f2bf6184fb2cfa677ca4b9acc3a5387d9833ebbedde53c19249e212", + "acceptance_input_digest": "d222b59dbf9b7d7bb9c8a974f01273f6c22e104be6e74dca9c0be0dd4568c357", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "77a4dbd5d03be0f93cd0bb1fa6a1c1970053749cbd490392e5e8f59c2db77a1e", + "entry_digest": "9e766466f2a742baefbd9daa57126ed48dd4272af55268dd9c3341de43188754", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "82a1554d63738a65e02bb501cdfe07e90712cdbdb25e622f5d1a286600274d67", + "entry_digest": "f4ea707d5bbcf300cab5f530302195afb223e941a7a8c071cc930595931df13c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "292f24548e6e460525e0b9bb184b689a6dbab3cf56519d98f6c2637bdbc7845a", + "entry_digest": "2a375f0176f357aad9e71c705d977aae2203506944278098658f1f5df1d2dc2f", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "656947959de8020a59c935be59d46e134c22ba3937aa891f1f7b59eb601caed6", + "entry_digest": "cbbb1bbfc7fa0c473924f3fcc993d6ea843fd78c19f44669d015914346251e96", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "9390614a85b20add9e5c0e617ffc39d38a27af03af1951a6c23705dbc90f0ef2", + "entry_digest": "ed13c8f6ac65192a5f8f68dfadd3c837d86d2e4c31bffb0eb3424bb5bf486e4b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "3ebc618325038a9a71f71278de56a897bcc536848bd00f77541f29a61f1d3ddd", + "entry_digest": "87d4b5c6702ff0ad0d4c10d42f8e6ee72480a6fad5e2ac72fdf75f48a6e0c7b8", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", + "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "d222b59dbf9b7d7bb9c8a974f01273f6c22e104be6e74dca9c0be0dd4568c357", + "current_acceptance_input_digest": "df73ff87f4058a7fee196224182a05cd5c1bc9bd7dab39cd43ca61b33e360d46" + }, + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "Latest PR #140 review required candidate-scoped release gates, meaningful checkpoint usage, APS_BIN follow-ups, and StoredState artifact boundaries.", + "timestamp": 1785341965, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785340962, + "digest": "b3d3f9acac5ec9cf5033d3c5066077ad4864795ed14c4f2382265eb02b373858", + "note": "Closing approval after documentation clarification; full 12-step lane and all platform checks passed." + }, + "prior_verification": { + "timestamp": 1785340957, + "commit": "2f13cde531c3953d1f821b15a699449d0a1e6f03", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "da4c8bb24a069922d6e6f698130660938df9fbc76db2e9ff4d2251b568164b5c", + "acceptance_input_digest": "df73ff87f4058a7fee196224182a05cd5c1bc9bd7dab39cd43ca61b33e360d46", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "77a4dbd5d03be0f93cd0bb1fa6a1c1970053749cbd490392e5e8f59c2db77a1e", + "entry_digest": "9e766466f2a742baefbd9daa57126ed48dd4272af55268dd9c3341de43188754", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "591c2d0cf018503f1c8e287e4882463d54a1a7203f41d3165d6ccb9408f98865", + "entry_digest": "38ea652296f0d51aa743ebaf1d9a1fe528a83d7737fef1fa668a75fbf6fc7d04", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "292f24548e6e460525e0b9bb184b689a6dbab3cf56519d98f6c2637bdbc7845a", + "entry_digest": "2a375f0176f357aad9e71c705d977aae2203506944278098658f1f5df1d2dc2f", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "656947959de8020a59c935be59d46e134c22ba3937aa891f1f7b59eb601caed6", + "entry_digest": "cbbb1bbfc7fa0c473924f3fcc993d6ea843fd78c19f44669d015914346251e96", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "9390614a85b20add9e5c0e617ffc39d38a27af03af1951a6c23705dbc90f0ef2", + "entry_digest": "ed13c8f6ac65192a5f8f68dfadd3c837d86d2e4c31bffb0eb3424bb5bf486e4b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "3ebc618325038a9a71f71278de56a897bcc536848bd00f77541f29a61f1d3ddd", + "entry_digest": "87d4b5c6702ff0ad0d4c10d42f8e6ee72480a6fad5e2ac72fdf75f48a6e0c7b8", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", + "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "df73ff87f4058a7fee196224182a05cd5c1bc9bd7dab39cd43ca61b33e360d46", + "current_acceptance_input_digest": "5e7f0b5431c16fba6939b6209cf2b4447268ce93fa88aff554ca28ceee944842" + }, + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "Latest PR #140 review required release phase reset, fresh-root initialization in docs, and step-scoped runner.temp usage.", + "timestamp": 1785342891, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785342058, + "digest": "11b564623193fbd49f9ba5f95c8be5dced306b90c86dde588232759f8ff00148", + "note": "Closing approval after addressing the latest PR review; full verification passed." + }, + "prior_verification": { + "timestamp": 1785342053, + "commit": "5574c48824513a06961699b3da0d6728b7b372d3", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "e8184fcdb2e7740e5655c36f62b737aec4a60f11498d32a613d04b47a6230972", + "acceptance_input_digest": "5e7f0b5431c16fba6939b6209cf2b4447268ce93fa88aff554ca28ceee944842", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "6ef42d0fb8ca6b2282c75a25c9c10f6ce54b32f60fc569647adb04cb9d20eabc", + "entry_digest": "6ad985cbc5bb9558a1d43919659a0d46ef59f3fc819f60a2955a3acd1ec8f700", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6e866d95079eefd6656b0750fe5c157d5a09a10a30a304788861b7ce6c712e48", + "entry_digest": "093728cc13bd86bab3f36fa7fc0d30c74ef4d9c6b159631a87456fcc53ad0367", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "ce5cffc97271f61d417f3996f3ef5abac12ba5afaea42b1d14858f6adccec5b2", + "entry_digest": "ba688656a02caa548cb996b4f7eb826646fb9c6fbbf2cee0f5cd9a6b0358f766", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "656947959de8020a59c935be59d46e134c22ba3937aa891f1f7b59eb601caed6", + "entry_digest": "cbbb1bbfc7fa0c473924f3fcc993d6ea843fd78c19f44669d015914346251e96", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c7bc04262eb8c6f21b4d8e57b7e4d3f911af2c90d373458766ad92f3b6ae9f5d", + "entry_digest": "aa71cb5703ad1ae27d76ec2e243d48d60c1a1f16686892639f73763ac7489330", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ecad9bf48d87168f04e720d16950b256876a3cac0728efdfec660e8fe0ac8553", + "entry_digest": "03a9bce4bdb9b0345402d2af8be837ed395f665d8b1d42d658c3bc1c5b12529a", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", + "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "5e7f0b5431c16fba6939b6209cf2b4447268ce93fa88aff554ca28ceee944842", + "current_acceptance_input_digest": "bfdb3ed138189aad5daabce46e422de41aba234613632b7149a1bcc062e03705" + }, + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "Exact-head review required the Swift subprocess harness to resolve APS_BIN without a Unix-only launcher.", + "timestamp": 1785343470, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785342976, + "digest": "49313dc06bc0bf54135b9e2fd19aedca75f2d7ca170ad525fbb6926f8020500b", + "note": "Closing approval after the final copy-paste correctness review; full verification passed." + }, + "prior_verification": { + "timestamp": 1785342971, + "commit": "27eec40659a5756d53758309214059164f0b4286", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "7a25a434cb66ec5e457160fc5b866feb36e0a9368b491c46a0276063ad096dc9", + "acceptance_input_digest": "bfdb3ed138189aad5daabce46e422de41aba234613632b7149a1bcc062e03705", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "d3d36199917c72e8e8f0e8656c933f2de25a62d8478b075185330dd526df68f0", + "entry_digest": "b21aebf65ebf45e3932d52d12b9114268dae065c584d188e0075e1e60d8c731d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "0ff73c397b15f712c98e5ff0af6f5de30c276ed1aec106ba94e1e80c7e5a4006", + "entry_digest": "3108739f96a1883df20f8f724fee6bc7aa6bd362eed3583510141544d23089fd", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "ce5cffc97271f61d417f3996f3ef5abac12ba5afaea42b1d14858f6adccec5b2", + "entry_digest": "ba688656a02caa548cb996b4f7eb826646fb9c6fbbf2cee0f5cd9a6b0358f766", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "26e85c734d251f9fe460b8be1612de0ff532d5f51056d8ac95ec1cba36b1b87d", + "entry_digest": "7dad8764a2e11a0c8bb4d416a7b08b3e2f6d3304ef5f2460cf5705cafdd85362", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "0e71466a197fa8891b53094a2ec36d73f2dff142ecf0733ff2e72793970074a8", + "entry_digest": "cdd895463c0aaf8941a8e05d4b2692809b8fa872c6b458d8055bcc45553f8e40", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "03f97fc7786320f470db9c7795bb2726e9ff9cf2f9e9ea39e05830afe7fd6d17", + "entry_digest": "bbaf4d8009f7e596fc912618ede87ddd7a8c980e8842f32222467eb63cd182d2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", + "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "bfdb3ed138189aad5daabce46e422de41aba234613632b7149a1bcc062e03705", + "current_acceptance_input_digest": "af1b0bf8e1c3816c0bd9b53728835fabc60e6ffaea2a214332724c9dbd2c689c" + }, + { + "schema_version": 1, + "change_id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "actor": "codex", + "reason": "Exact-head review required safe reset ordering, Windows direct-path PATHEXT resolution, quiet initialization, and checkpoint-only JSON output.", + "timestamp": 1785344152, + "from_state": "accepted", + "to_state": "verifying", + "superseded_approval": { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785343556, + "digest": "134c5b15f1db9d90a4487175ca6307f34cf658e0ca59347fa7ffe8f86b718cbe", + "note": "Closing approval after making the Swift harness launcher cross-platform; full verification passed." + }, + "prior_verification": { + "timestamp": 1785343551, + "commit": "699bdd6b6b3584e67b8525aa447ddfe4dc5dda0f", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "2d134d41619b9a533b9a6cf98ed352a25e4b069b6a7ec7b7a1ecf99597e1a808", + "acceptance_input_digest": "af1b0bf8e1c3816c0bd9b53728835fabc60e6ffaea2a214332724c9dbd2c689c", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "7d31b7e608a745927bcdd5345c32d5e3107480911ef4e7a984a7398ceb77de5d", + "entry_digest": "9a973ad6f6ced02d419adc9f48dbd0173f7b4086d7812bc290776a37a5e5ca0f", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "0ff73c397b15f712c98e5ff0af6f5de30c276ed1aec106ba94e1e80c7e5a4006", + "entry_digest": "3108739f96a1883df20f8f724fee6bc7aa6bd362eed3583510141544d23089fd", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "ce5cffc97271f61d417f3996f3ef5abac12ba5afaea42b1d14858f6adccec5b2", + "entry_digest": "ba688656a02caa548cb996b4f7eb826646fb9c6fbbf2cee0f5cd9a6b0358f766", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "26e85c734d251f9fe460b8be1612de0ff532d5f51056d8ac95ec1cba36b1b87d", + "entry_digest": "7dad8764a2e11a0c8bb4d416a7b08b3e2f6d3304ef5f2460cf5705cafdd85362", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "0e71466a197fa8891b53094a2ec36d73f2dff142ecf0733ff2e72793970074a8", + "entry_digest": "cdd895463c0aaf8941a8e05d4b2692809b8fa872c6b458d8055bcc45553f8e40", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "03f97fc7786320f470db9c7795bb2726e9ff9cf2f9e9ea39e05830afe7fd6d17", + "entry_digest": "bbaf4d8009f7e596fc912618ede87ddd7a8c980e8842f32222467eb63cd182d2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "44d92e57d926164e8d7a7e7a3c375ebc2d7fc411988778804ead9c45327a3d8a", + "entry_digest": "f05317c8732996279ca925b56b976e1101224a6fe4e427893b03304b81c4a2a6", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + "stale_acceptance_input_digest": "af1b0bf8e1c3816c0bd9b53728835fabc60e6ffaea2a214332724c9dbd2c689c", + "current_acceptance_input_digest": "3767af6467f4424cd0fc682f8de755cf6ef0ea3c1afc1cde9f7751227af6a392" + } + ] +} diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/change.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/change.md new file mode 100644 index 0000000..47a96c9 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/change.md @@ -0,0 +1,24 @@ +--- +id: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +state: accepted +type: documentation +base_commit: 5a14806518b38ffdb5143c3115f1761689f8c749 +--- + +# Add runnable agent, CI, Swift integration, and release pipeline examples with README and documentation navigation + +## Intent + +Add runnable agent, CI, Swift integration, and release pipeline examples with README and documentation navigation + +## Affected Canonical Specs + +- `aps-cli` + +## Acceptance Criteria + +- Four documented examples cover agent memory, GitHub Actions, Swift/AppState integration, and release pipelines; shell examples pass an automated contract test; README and docs link to every example; guidance clearly states persistence, multi-writer, cross-job, and secret-handling boundaries. + +## No-spec Rationale + +This adds examples and explanatory documentation for existing v1.1.0 commands without changing the CLI contract. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/context.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/context.md new file mode 100644 index 0000000..04a2bcf --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/context.md @@ -0,0 +1,15 @@ +--- +change: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +artifact: context +--- + +# Context + +aps already exposes the primitives needed by agents and automation, but the +README demonstrates commands in isolation. Users need complete examples that +show state-root isolation, persistent dynamic keys, cross-process reads, +cross-job transfer, Swift-driven integration, and release checkpoints. + +The examples must remain honest about the product boundary: aps is local typed +state, not a distributed lock, secret manager, message queue, or replacement +for GitHub outputs. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/design.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/design.md new file mode 100644 index 0000000..5326c6a --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/design.md @@ -0,0 +1,18 @@ +--- +change: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +artifact: design +--- + +# Design + +Add an `examples/` index with four focused examples: + +1. Agent memory uses a dedicated `APS_HOME` and persistent FileState keys. +2. GitHub Actions transfers a state root between jobs as an artifact. +3. A Swift harness drives the AppState-backed CLI as an integration boundary. +4. A release pipeline records version, commit, phase, tests, and risk. + +Shell examples accept `APS_BIN` and `APS_HOME` so automated tests can run them +against an isolated build. The Swift example compiles into a temporary +directory. Documentation links to the examples from both navigation entry +points and explains when simpler native primitives remain preferable. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/docs.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/docs.md new file mode 100644 index 0000000..fb9e9b5 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/docs.md @@ -0,0 +1,14 @@ +--- +change: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +artifact: docs +--- + +# Docs + +- Update the root README to reflect the published v1.1.0 release and introduce + the guided examples. +- Add `docs/use-cases.md` for project selection, agents, CI, Swift harnesses, + release pipelines, state-root layouts, and safety boundaries. +- Update `docs/README.md` with the new use-case and example entry points. +- Give every example its own README with setup, expected behavior, and + production caveats. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json new file mode 100644 index 0000000..3dbb7f9 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json @@ -0,0 +1,41 @@ +{ + "schema_version": 1, + "id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "slug": "add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "title": "Add runnable agent, CI, Swift integration, and release pipeline examples with README and documentation navigation", + "description": "Add runnable agent, CI, Swift integration, and release pipeline examples with README and documentation navigation", + "kind": "documentation", + "state": "accepted", + "canonical_applied": true, + "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", + "created_at": 1785333608, + "updated_at": 1785344239, + "affected_specs": [ + "aps-cli" + ], + "affected_paths": [ + "README.md", + "docs", + "examples", + "Scripts/test-examples.sh", + "fledge.toml", + ".specsync/change-sequence.json" + ], + "no_spec_change": true, + "no_spec_change_rationale": "This adds examples and explanatory documentation for existing v1.1.0 commands without changing the CLI contract.", + "acceptance_criteria": [ + "Four documented examples cover agent memory, GitHub Actions, Swift/AppState integration, and release pipelines; shell examples pass an automated contract test; README and docs link to every example; guidance clearly states persistence, multi-writer, cross-job, and secret-handling boundaries." + ], + "selected_artifacts": [ + "context", + "docs", + "design", + "tasks", + "testing" + ], + "dependencies": [], + "answers": { + "architecture_risk": "no", + "public_contract": "no" + } +} diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/tasks.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/tasks.md new file mode 100644 index 0000000..963d641 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/tasks.md @@ -0,0 +1,11 @@ +--- +change: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +artifact: tasks +--- + +# Tasks + +- [x] Add the four guided examples and their local documentation. +- [x] Add the use-case guide and update README navigation and release copy. +- [x] Add executable example contract coverage to the Fledge verification lane. +- [x] Run local verification and prepare the documentation PR. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/testing.md b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/testing.md new file mode 100644 index 0000000..982eaec --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/testing.md @@ -0,0 +1,12 @@ +--- +change: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re +artifact: testing +--- + +# Testing + +- `Scripts/test-examples.sh` runs both shell examples against isolated roots, + compiles and runs the Swift harness, and checks the GitHub Actions contract. +- The example contract is part of `fledge lanes run verify`. +- `specsync change verify ... --strict` runs the complete project gate before + acceptance. diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification-attempts.json b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification-attempts.json new file mode 100644 index 0000000..7962444 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification-attempts.json @@ -0,0 +1,155 @@ +{ + "schema_version": 1, + "attempts": [ + { + "timestamp": 1785334380, + "commit": "5a14806518b38ffdb5143c3115f1761689f8c749", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785336293, + "commit": "3a0121b3de4caada98f79b871c77a1cbb83c26fd", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785338977, + "commit": "eb55402e4b5d52ee0231ea306a3edcccd6ae038c", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785339903, + "commit": "7a151837dded09817eff7fc71431404ac8bdcfc5", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "54a1b9dc8f2bf6184fb2cfa677ca4b9acc3a5387d9833ebbedde53c19249e212", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785340853, + "commit": "2f13cde531c3953d1f821b15a699449d0a1e6f03", + "contract_digest": "afa9871e790e9cfa628d4fbff52f86d5c47ee4fb1722fa5f1cf59571ad303453", + "workspace_digest": "da4c8bb24a069922d6e6f698130660938df9fbc76db2e9ff4d2251b568164b5c", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785340957, + "commit": "2f13cde531c3953d1f821b15a699449d0a1e6f03", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "da4c8bb24a069922d6e6f698130660938df9fbc76db2e9ff4d2251b568164b5c", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785342053, + "commit": "5574c48824513a06961699b3da0d6728b7b372d3", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "e8184fcdb2e7740e5655c36f62b737aec4a60f11498d32a613d04b47a6230972", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785342971, + "commit": "27eec40659a5756d53758309214059164f0b4286", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "7a25a434cb66ec5e457160fc5b866feb36e0a9368b491c46a0276063ad096dc9", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785343551, + "commit": "699bdd6b6b3584e67b8525aa447ddfe4dc5dda0f", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "2d134d41619b9a533b9a6cf98ed352a25e4b069b6a7ec7b7a1ecf99597e1a808", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + }, + { + "timestamp": 1785344234, + "commit": "c4e7d71ad334ebefb35cbbb669f54abfee0d8935", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "5a4c3896bd0c89603c4686ab7888831af46a383104cb00b983448b7e36f07ce2", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + } + ] +} diff --git a/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification.json b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification.json new file mode 100644 index 0000000..db85338 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification.json @@ -0,0 +1,311 @@ +{ + "timestamp": 1785344234, + "commit": "c4e7d71ad334ebefb35cbbb669f54abfee0d8935", + "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", + "workspace_digest": "5a4c3896bd0c89603c4686ab7888831af46a383104cb00b983448b7e36f07ce2", + "acceptance_input_digest": "3767af6467f4424cd0fc682f8de755cf6ef0ea3c1afc1cde9f7751227af6a392", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "adaa8b532b744738002d0a6aa594b875081452af4a91b55ff9d4237b5e9e4ce0", + "entry_digest": "b2fb45571c2450966408b73c1064994c6a2f7c955d0392523a91fd745ef1b0db", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "75bda9255be6abf7a7d79536a8730bc187b0db2b734f28c1f9e4c92fa16cb724", + "entry_digest": "858a6faa71d231c545cb66edfa358b5de852ecfdcb985828c5442c5b37dcc6f2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "Scripts/test-examples.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "e6e809f675109335cefd4603c6e62ef4a29f0f04236cf7004b196b75ce206853", + "entry_digest": "11b2cfe1d878e29052ae3ed5eda81b2ca3c44095653270e8bf1c05fcaeb1a1ac", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "4b3518868771230297bcf5946ff830dab4ffc13cfc01424f4ae2e7f33d7f21f7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "275577df7c267013a433cb73c91c09eb951a2104671fda3d5e337bd9fc1e5a39", + "entry_digest": "c37b5d54f8433e5c8ff03191d7314ac5a6d16641f58c6d7c5b02659bc3e287de", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/design/dynamic-schema.md", + "kind": "file", + "mode": 33188, + "payload_digest": "58247f2bb4d49868f6f0c05e0974887cb15fac74b04250b088248c09304d6d38", + "entry_digest": "af0efabd551276d72a241557d6a21925a604752344e53cf2ccd26e3b84f0422b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-provenance.md", + "kind": "file", + "mode": 33188, + "payload_digest": "94aa993b89d5d4056e763b6aab93a41058d57004c99cf1179be70353ebd508df", + "entry_digest": "cd4d87ecd9bee6c2fae371707d11986f9ede22e955acfcdab52cdeec026bf581", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/release-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/modelstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "55870f2ac656fa12ab1d97f31e055e9f9f1a44a0fc518a28f09bd1baa3e93144", + "entry_digest": "702da27c4eba9f889935c83a6182d0d81c1f3b4b7cf63c5e89a7bbb6f50db06d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/spikes/syncstate-feasibility.md", + "kind": "file", + "mode": 33188, + "payload_digest": "3ee20c0f792877051f80f12a2afa1e26cf76345c3cf65a489112292d0484a900", + "entry_digest": "51023ff91d431468ce0fe5bb840f7baaa8a3e74c9d5698b47de188cda4b5f37d", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/use-cases.md", + "kind": "file", + "mode": 33188, + "payload_digest": "0ff73c397b15f712c98e5ff0af6f5de30c276ed1aec106ba94e1e80c7e5a4006", + "entry_digest": "3108739f96a1883df20f8f724fee6bc7aa6bd362eed3583510141544d23089fd", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "docs/windows-readiness.md", + "kind": "file", + "mode": 33188, + "payload_digest": "4d04948c07e4e2edfd561ca7f8a4aa150988e01b0223ad372c28b3f134af313e", + "entry_digest": "fd534f17c72623573cc966ebd97d21f6bb1edee25b41a5c983754d913dbe449e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples", + "kind": "non_file", + "mode": 0, + "payload_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "entry_digest": "222691076df03c78a85394fbaafacc1a4e8eb7c79d764fa2dbf4e36ea49f084c", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "515eca101228280f147a1d97354a086809b6e96760ee7aa794defc8be9f8e979", + "entry_digest": "14b962d6e8d77622755a865ffa4ed432f951537752f5f1d01a24028e84a96914", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "86e3ee21bd27ec8101812d50bba3edb03d852524181f131671ead1efac7b4ade", + "entry_digest": "685026fda5c58ad6e141a1d66b8b5d424b4d9f2df775f8839f215c8a85889c6b", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/agent-memory/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "8170050a9d43811c6adbb65be0360ecd4f0fe1158e9f4a0e39417ab74a8685d0", + "entry_digest": "2254ef9bcdb7b42baa2d3c027d22442c7db2caef8adf06dbbdbd39a4b7097b4f", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "c38ee1f4c766b68c5b64cb75fc4ad36f2588488729bf420d3608f000d96d1266", + "entry_digest": "085dad5ca9204d4cda918d424c87104aca198d59f6c42edfe203b56944dd1536", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/github-actions/workflow.yml", + "kind": "file", + "mode": 33188, + "payload_digest": "26e85c734d251f9fe460b8be1612de0ff532d5f51056d8ac95ec1cba36b1b87d", + "entry_digest": "7dad8764a2e11a0c8bb4d416a7b08b3e2f6d3304ef5f2460cf5705cafdd85362", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b29bdf02f8861bfdfa0f4616a09ae672ac4bd293863eaa01c36015d7806ab7be", + "entry_digest": "3f080322f506676594e4e6324c3b8e7470984b56b6455d5559f4b03ea265424e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/release-pipeline/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "507139d7a5035fd4c8cfe641afdabc377e4c223885692dbb2a014ad5162bf3af", + "entry_digest": "954c414c0fdcc014854aef1b76916d6a31f6df51394901039cede5e432dde104", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/README.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6291350f1909dad08b4a8b2e51c9edd66e734604ab3de006d5f5df9939ebebb5", + "entry_digest": "fb33e3d033f74f4c1cdb1d34c6bd16ca5abf101cbd2f4c141d5798b57a5a5fd9", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/StateHarness.swift", + "kind": "file", + "mode": 33188, + "payload_digest": "55085dea0290145f4b6e70ad1106b5d3da13005b7a82b659870c4f3e6092f935", + "entry_digest": "fbd78e671ee4ed799c9e3578026453fe722bb957f82314f3c246a22eabc5858e", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "examples/swift-harness/run.sh", + "kind": "file", + "mode": 33261, + "payload_digest": "ce35f02373ad9cf8141b2d2e88079f8359a5b4190c1326fae00d03e0263d503e", + "entry_digest": "40fa9f70e75f797f8014e04773981a555ae67826b9309c3de41e978758dde990", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "fledge.toml", + "kind": "file", + "mode": 33188, + "payload_digest": "8d3657d59f52392cf55c012570cd741b0747a3ff043b58dbdcc4bf27d9502820", + "entry_digest": "40eed94866ac64b066aced4af2362cbbf5bc7efc077fc049ffd58bddebb7f6e7", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] +} diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/approvals.json b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/approvals.json new file mode 100644 index 0000000..21baef4 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/approvals.json @@ -0,0 +1,19 @@ +{ + "approvals": [ + { + "gate": "definition", + "actor": "codex", + "timestamp": 1785341042, + "digest": "f0d90ecbee8c34c97544d5407340331e2c4590a1d83a9585d0aeff2129354b35", + "note": "Approve the companion repository-hygiene change required by PR #140 review." + }, + { + "gate": "acceptance", + "actor": "codex", + "timestamp": 1785341170, + "digest": "29950e2bb5d3626a5b66303538a7fc7aad5f230ba85f82d1d0049f8511c16d4c", + "note": "Closing approval after full 12-step verification; generated example roots are documented and ignored." + } + ], + "reopenings": [] +} diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/change.md b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/change.md new file mode 100644 index 0000000..a851062 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/change.md @@ -0,0 +1,24 @@ +--- +id: CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples +state: accepted +type: documentation +base_commit: 8735d094eed5ce7428b5b9173593ece7f9e3f96b +--- + +# Document and ignore repository-local state roots generated by guided examples + +## Intent + +Document and ignore repository-local state roots generated by guided examples + +## Affected Canonical Specs + +- `aps-cli` + +## Acceptance Criteria + +- The repository ignores every local state root created by the guided examples, and the ignore policy is documented clearly. + +## No-spec Rationale + +This records repository hygiene for generated example state without changing the aps CLI contract. diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/context.md b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/context.md new file mode 100644 index 0000000..f6de762 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/context.md @@ -0,0 +1,12 @@ +--- +change: CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples +artifact: context +--- + +# Context + +The guided examples create repository-local APS state roots during hands-on use. +Those generated values should never appear as untracked project files or be +committed accidentally. The repository already excludes each example root; this +change records that policy independently from the already-applied documentation +change. diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/docs.md b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/docs.md new file mode 100644 index 0000000..35b0ee9 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/docs.md @@ -0,0 +1,11 @@ +--- +change: CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples +artifact: docs +--- + +# Docs + +Keep the guided-example entries grouped under a descriptive `.gitignore` +comment. The ignored roots cover agent memory, release coordination, and the +Swift harness. `docs/use-cases.md` explains that these repository-local roots +are excluded while showing users how to ignore their own APS state directories. diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/state.json b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/state.json new file mode 100644 index 0000000..1c8f65c --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/state.json @@ -0,0 +1,34 @@ +{ + "schema_version": 1, + "id": "CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples", + "slug": "document-and-ignore-repository-local-state-roots-generated-by-guided-examples", + "title": "Document and ignore repository-local state roots generated by guided examples", + "description": "Document and ignore repository-local state roots generated by guided examples", + "kind": "documentation", + "state": "accepted", + "canonical_applied": true, + "base_commit": "8735d094eed5ce7428b5b9173593ece7f9e3f96b", + "created_at": 1785341012, + "updated_at": 1785341170, + "affected_specs": [ + "aps-cli" + ], + "affected_paths": [ + ".gitignore", + ".specsync/change-sequence.json" + ], + "no_spec_change": true, + "no_spec_change_rationale": "This records repository hygiene for generated example state without changing the aps CLI contract.", + "acceptance_criteria": [ + "The repository ignores every local state root created by the guided examples, and the ignore policy is documented clearly." + ], + "selected_artifacts": [ + "context", + "docs" + ], + "dependencies": [], + "answers": { + "architecture_risk": "no", + "public_contract": "no" + } +} diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification-attempts.json b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification-attempts.json new file mode 100644 index 0000000..7079334 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification-attempts.json @@ -0,0 +1,20 @@ +{ + "schema_version": 1, + "attempts": [ + { + "timestamp": 1785341161, + "commit": "8735d094eed5ce7428b5b9173593ece7f9e3f96b", + "contract_digest": "f0d90ecbee8c34c97544d5407340331e2c4590a1d83a9585d0aeff2129354b35", + "workspace_digest": "7f51c03ed0da59def7a9b3179a7435cf1168e94889b936374b6f3d13a53a8964", + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] + } + ] +} diff --git a/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification.json b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification.json new file mode 100644 index 0000000..8ae1a09 --- /dev/null +++ b/.specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification.json @@ -0,0 +1,91 @@ +{ + "timestamp": 1785341161, + "commit": "8735d094eed5ce7428b5b9173593ece7f9e3f96b", + "contract_digest": "f0d90ecbee8c34c97544d5407340331e2c4590a1d83a9585d0aeff2129354b35", + "workspace_digest": "7f51c03ed0da59def7a9b3179a7435cf1168e94889b936374b6f3d13a53a8964", + "acceptance_input_digest": "1a98ec17129fccd89e7f32edeec3364ba367929c55a04dbc4b2295cb7e845ea4", + "acceptance_manifest": { + "schema_version": 1, + "entries": [ + { + "path": ".gitignore", + "kind": "file", + "mode": 33188, + "payload_digest": "d3049b43c0eb1c9bc26169f20c16941387054a0a7f7676b5f6a4dbf6bacc575f", + "entry_digest": "5f767bb0baf428846c5ea3009fc32b7f57728e3d2de80f99f6859167d44dcf31", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": ".specsync/change-sequence.json", + "kind": "file", + "mode": 33188, + "payload_digest": "219397ea3f41b37a002b380ff4b929941860367eafa3bcdf2a9708024b2226bd", + "entry_digest": "9a713de772436909179e112490433acb415810f6426aa4bfc0ef253e23cd71d2", + "owners": [ + "@exact:delivery" + ] + }, + { + "path": "specs/aps-cli/aps-cli.spec.md", + "kind": "file", + "mode": 33188, + "payload_digest": "6cc51c612445b96b9ad8314a1d60322749601edc1711afc2224fe2303b7c198d", + "entry_digest": "c56c9aa1007ceeb7ea1cfa011aa934fba624405b043512964ec334d4646cd65b", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/context.md", + "kind": "file", + "mode": 33188, + "payload_digest": "b6b45cae19244f96b97854129adc5794b76623aa0547b5b5ba27fd20e522948f", + "entry_digest": "3d95dbf704bd5d40be4f8f4c95897cf6e5549152b4cdaab0adc43328febf8b90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/requirements.md", + "kind": "file", + "mode": 33188, + "payload_digest": "49fe2728a53958f51729fe450a942671a1f8218a2c7c02ca11126c6f8747af34", + "entry_digest": "4ffacf606390f2b8aa0efb0b0051966ed3e11365fdfd331d2965ab4a0ec00780", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/tasks.md", + "kind": "file", + "mode": 33188, + "payload_digest": "83d2620192191bceccaa4a8758b8c7120300db800d7595309ddbc96ec6591525", + "entry_digest": "16ee871a59dd92753ba0d3be7f10aff13bd6a0d622abfada0d67073e6ccf0c90", + "owners": [ + "aps-cli" + ] + }, + { + "path": "specs/aps-cli/testing.md", + "kind": "file", + "mode": 33188, + "payload_digest": "adf0eef7df26d362d10062c886390a5fb518d457d84095fb3bf3e91ab7962fbc", + "entry_digest": "75ac0e1c823cbe6c2b5d97fd77e4e5f21176588ca6484893cc989c08e6d9b2cf", + "owners": [ + "aps-cli" + ] + } + ] + }, + "passed": true, + "commands": [ + { + "command": "fledge lanes run verify", + "success": true, + "exit_code": 0 + } + ], + "requirement_ids": [] +} diff --git a/README.md b/README.md index 5f1f565..4f6ef8d 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,9 @@ aps is a small Swift CLI that brings [AppState](https://github.com/0xLeif/AppState) outside SwiftUI. Declare typed state, read it, change it, watch it, and expose the same stable contract to humans, agents, and CI. -Source version: **1.1.0**. The latest published tag remains -**1.0.0** until the reviewed v1.1.0 candidate is signed and published; see -[release readiness](docs/release-readiness.md). The source and CI target -**macOS**, **Linux**, and **Windows**, while published binary availability -varies by platform. +Source version: **1.1.0**. This is also the current published release. The source and CI target **macOS**, **Linux**, and +**Windows**. Published binaries are available for macOS arm64, macOS x86_64, +and Linux x86_64; Windows currently builds and tests from source. Keys live in `/schema.json`, with demo defaults materialized on first use. Start with the [documentation map](docs/README.md) or the [dynamic schema design](docs/design/dynamic-schema.md). @@ -25,14 +23,14 @@ gate before artifact upload. See the [release provenance runbook](docs/release-p | --- | --- | | Serial and four-worker Swift verification lanes | Passing | | macOS, Linux, and Windows source CI | Active | -| Homebrew and release packaging | Portable bundle contract prepared for v1.1.0 | +| Homebrew and release packaging | v1.1.0 published with verified checksums | | Dynamic schema and secret safety | Safe paths, strict v2 envelopes, and transactional destructive operations | | SpecSync contracts | Passing with 2 active module specs | -The current release remains useful for local AppState exploration. The next -release hardens passphrase secrets for local use; production automation still -depends on the remaining distribution items in -[release readiness](docs/release-readiness.md). +The current release supports project-local state, resumable agent memory, +portable Linux CI installation, structured Swift integration tests, and +observable release checkpoints. Start with the [guided examples](examples/) +or the [use-case guide](docs/use-cases.md). ## Install @@ -66,13 +64,25 @@ cd aps-cli && swift build -c release **Foreign GitHub Actions workflows:** use the reusable composite Action to install the release binary without a Swift toolchain: ```yaml -- uses: 0xLeif/aps-cli/.github/actions/install-aps@8e2108601b182584e59b3e534b67199247593a0a +- uses: 0xLeif/aps-cli/.github/actions/install-aps@7373d124ebb3823c1f7f19651dfffe4d7ed83f51 with: version: 1.1.0 - run: aps set note "run-${{ github.run_id }}" ``` -The Action selects the release asset for Linux x64, macOS x64, or macOS arm64, verifies its `.sha256` sidecar before moving it into the job-scoped `${RUNNER_TEMP}/aps/bin`, and adds that directory to `PATH`. Linux releases are portable tar bundles containing the Swift runtime libraries, so no Swift toolchain is needed. The existing v1.0.0 release predates this Action and does not contain the portable Linux bundle; use a release built by the current release workflow for Linux. The Action defaults `APS_HOME` to `${RUNNER_TEMP}/aps-home` through `GITHUB_ENV`; an existing `APS_HOME` is preserved. Pin the Action to a release tag or pass an explicit semantic `version`. Windows is not supported until a Windows release asset is published. +The Action selects the release asset for Linux x64, macOS x64, or macOS arm64, verifies its `.sha256` sidecar before moving it into the job-scoped `${RUNNER_TEMP}/aps/bin`, and adds that directory to `PATH`. Linux releases are portable tar bundles containing the Swift runtime libraries, so no Swift toolchain is needed. Release v1.1.0 and newer include the portable Linux bundle. The Action defaults `APS_HOME` to `${RUNNER_TEMP}/aps-home` through `GITHUB_ENV`; an existing `APS_HOME` is preserved. Pin the Action to a release tag or pass an explicit semantic `version`. Windows is not supported until a Windows release asset is published. + +## Guided examples + +| Workflow | What it shows | +| --- | --- | +| [Agent memory](examples/agent-memory/) | Isolated, resumable state for Codex, Cursor, Kimi, or another agent | +| [GitHub Actions](examples/github-actions/) | Typed state across steps and jobs without a Swift toolchain | +| [Swift harness](examples/swift-harness/) | A Swift integration test driving the AppState-backed CLI | +| [Release pipeline](examples/release-pipeline/) | Observable version, commit, test, risk, and phase checkpoints | + +See [Using aps in projects, agents, and CI](docs/use-cases.md) for selection +guidance, state-root layouts, multi-writer limits, and secret-handling rules. ## Commands @@ -397,8 +407,11 @@ Sources/aps/ Tests/apsTests/ specs/ docs/design/ +docs/use-cases.md +examples/ Scripts/smoke.sh Scripts/smoke.ps1 +Scripts/test-examples.sh Scripts/release-provenance-gate.sh Scripts/test-release-provenance.sh GOAL.md @@ -406,20 +419,21 @@ LICENSE .github/workflows/{ci,linux-smoke,windows-smoke,trust,release,post-release-formula}.yml ``` -## Next goal - -**1.0.0** is shipped and public: [release v1.0.0](https://github.com/0xLeif/aps-cli/releases/tag/v1.0.0) and [`GOAL.md`](GOAL.md) record. +## Release history and next work -The next release will: +**1.1.0** is shipped with signed provenance, portable Linux and macOS assets, +verified checksum sidecars, and a converged Homebrew formula: +[release v1.1.0](https://github.com/0xLeif/aps-cli/releases/tag/v1.1.0). +The completed safety review remains available in +[release readiness](docs/release-readiness.md). -- make dynamic schema paths and destructive operations safe by construction; -- make the runtime registry authoritative for every key; -- align portable Linux, Homebrew, and GitHub Action distribution; -- ship the implemented v2 passphrase and key-file hardening; -- require signed passing-test provenance on the exact release commit; -- rehearse installation from real release artifacts on clean hosts. +Post-release work is incremental: -The full evidence, blockers, and exit criteria live in [docs/release-readiness.md](docs/release-readiness.md). +- publish a Windows binary and installer path +- increase direct in-process coverage for command dispatch and persistence +- enforce the repository Swift style and StrictConcurrency settings in CI +- decide whether process-local State and stats need explicit session semantics +- keep the guided examples aligned with each published CLI contract ## Product site design system diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh new file mode 100755 index 0000000..e2caa85 --- /dev/null +++ b/Scripts/test-examples.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "$0")/.." && pwd)" +aps_bin="${APS_BIN:-$repo_root/.build/debug/aps}" +fixture_root="$(mktemp -d "${TMPDIR:-/tmp}/aps-examples.XXXXXX")" +cleanup() { + if [[ -n "$fixture_root" && -d "$fixture_root" ]]; then + rm -rf "$fixture_root" + fi +} +trap cleanup EXIT + +test -x "$aps_bin" +aps_bin="$(cd "$(dirname "$aps_bin")" && pwd)/$(basename "$aps_bin")" + +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/agent" \ +CURRENT_ISSUE=321 \ +WORKING_BRANCH=agent/example \ +TESTS_PASSED=true \ + "$repo_root/examples/agent-memory/run.sh" > "$fixture_root/agent.json" +grep -Fq '"key":"currentIssue"' "$fixture_root/agent.json" +test "$(head -c 1 "$fixture_root/agent.json")" = "{" +if grep -Fq '"key":"secret"' "$fixture_root/agent.json"; then + echo "Agent checkpoint output contains unrelated secret state" >&2 + exit 1 +fi +test "$(APS_HOME="$fixture_root/agent" "$aps_bin" get currentIssue)" = "321" +test "$(APS_HOME="$fixture_root/agent" "$aps_bin" get testsPassed)" = "true" +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/agent" \ + "$repo_root/examples/agent-memory/run.sh" > "$fixture_root/agent-resume.json" +test "$(APS_HOME="$fixture_root/agent" "$aps_bin" get currentIssue)" = "321" +test "$(APS_HOME="$fixture_root/agent" "$aps_bin" get workingBranch)" = "agent/example" +test "$(APS_HOME="$fixture_root/agent" "$aps_bin" get testsPassed)" = "true" + +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/release" \ +RELEASE_VERSION=9.8.7 \ +CANDIDATE_COMMIT=0123456789abcdef \ + "$repo_root/examples/release-pipeline/run.sh" > "$fixture_root/release.json" +grep -Fq '"key":"releaseVersion"' "$fixture_root/release.json" +test "$(head -c 1 "$fixture_root/release.json")" = "{" +if grep -Fq '"key":"secret"' "$fixture_root/release.json"; then + echo "Release checkpoint output contains unrelated secret state" >&2 + exit 1 +fi +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseVersion)" = "9.8.7" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseTestsPassed)" = "false" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "pending" +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/release" \ +RELEASE_PHASE=published \ +RELEASE_TESTS_PASSED=true \ +RISK_VERDICT=proceed \ + "$repo_root/examples/release-pipeline/run.sh" > "$fixture_root/release-gates.json" +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/release" \ + "$repo_root/examples/release-pipeline/run.sh" > "$fixture_root/release-resume.json" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseVersion)" = "9.8.7" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releasePhase)" = "published" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseTestsPassed)" = "true" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "proceed" +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/release" \ +RELEASE_VERSION=9.8.8 \ +CANDIDATE_COMMIT=fedcba9876543210 \ + "$repo_root/examples/release-pipeline/run.sh" > "$fixture_root/release-new-candidate.json" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseVersion)" = "9.8.8" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releasePhase)" = "planned" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseTestsPassed)" = "false" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "pending" + +APS_BIN="$aps_bin" \ +APS_HOME="$fixture_root/swift" \ + "$repo_root/examples/swift-harness/run.sh" > "$fixture_root/swift.json" +grep -Fq '"name":"swift-harness"' "$fixture_root/swift.json" +if grep -Fq '/usr/bin/env' "$repo_root/examples/swift-harness/StateHarness.swift"; then + echo "Swift harness contains a Unix-only process launcher" >&2 + exit 1 +fi + +workflow="$repo_root/examples/github-actions/workflow.yml" +grep -Fq 'version: 1.1.0' "$workflow" +grep -Fq 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' "$workflow" +grep -Fq 'actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093' "$workflow" +grep -Fq 'APS_HOME: ${{ runner.temp }}/aps-home' "$workflow" +test "$(grep -Fc 'APS_HOME: ${{ runner.temp }}/aps-home' "$workflow")" -eq 2 +test "$(grep -Fc 'path: ${{ runner.temp }}/aps-home' "$workflow")" -eq 2 +test "$(grep -Fc '7373d124ebb3823c1f7f19651dfffe4d7ed83f51' "$workflow")" -eq 2 +if grep -Eq 'uses: actions/[^[:space:]@]+@v[0-9]+' "$workflow"; then + echo "GitHub Actions example contains a mutable first-party action reference" >&2 + exit 1 +fi + +for path in \ + examples/README.md \ + examples/agent-memory/README.md \ + examples/github-actions/README.md \ + examples/swift-harness/README.md \ + examples/release-pipeline/README.md \ + docs/use-cases.md +do + test -f "$repo_root/$path" +done + +for example in agent-memory github-actions swift-harness release-pipeline +do + grep -Fq "examples/$example/" "$repo_root/README.md" + grep -Fq "../examples/$example/" "$repo_root/docs/use-cases.md" +done +grep -Fq '../examples/' "$repo_root/docs/README.md" +grep -Fq './examples/agent-memory/run.sh' "$repo_root/examples/agent-memory/README.md" +grep -Fq '${APS_BIN:-aps}' "$repo_root/examples/release-pipeline/README.md" +grep -Fq 'StoredState values live in platform UserDefaults' "$repo_root/docs/use-cases.md" +for ignored_root in \ + /.agents/ \ + /.release-state/ \ + /.aps-agent-example/ \ + /.aps-release-example/ \ + /.aps-swift-harness-example/ +do + grep -Fxq "$ignored_root" "$repo_root/.gitignore" +done + +echo "example contract checks passed" diff --git a/docs/README.md b/docs/README.md index 996f8e3..411fa08 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,6 +7,8 @@ aps is a Swift CLI for exploring AppState outside SwiftUI and exposing typed sta | Goal | Read | | --- | --- | | Install and use the CLI | [Project README](../README.md) | +| Choose an integration pattern | [Projects, agents, and CI](use-cases.md) | +| Run complete workflows | [Examples](../examples/) | | Understand user-defined keys | [Dynamic schema design](design/dynamic-schema.md) | | Decide whether the next tag is ready | [Release readiness](release-readiness.md) | | Operate signed releases and recover provenance | [Release provenance](release-provenance.md) | diff --git a/docs/release-readiness.md b/docs/release-readiness.md index 9074943..b4dcebd 100644 --- a/docs/release-readiness.md +++ b/docs/release-readiness.md @@ -1,11 +1,13 @@ # Release readiness -Status: **release preparation in progress** +Status: **v1.1.0 released on 2026-07-29** -Audit basis: current `origin/main` plus issue #119 release provenance in -SpecSync change `CHG-0052`. +This document is the completed safety-release audit. The implementation, +release authentication recovery, checksum repair, signed publication, and +Homebrew convergence are archived in SpecSync. -Target release line: **1.1.0**, because the work since 1.0.0 adds a reusable installer Action, portable Linux packaging, dynamic schema behavior, concurrency fixes, and watch improvements. +Target release line: **1.1.0**. This release added a reusable installer Action, portable Linux +packaging, dynamic schema behavior, concurrency fixes, and watch improvements. ## What is already strong @@ -19,7 +21,7 @@ Target release line: **1.1.0**, because the work since 1.0.0 adds a reusable ins Measured in-process source line coverage is 53.42%. Subprocess CLI tests are not attributed back to the instrumented test process, so that number understates command-path coverage. It still shows that registry, dynamic storage, command dispatch, and termination behavior need more direct tests. -## Must close before the next tag +## Closed for v1.1.0 ### 1. Make schema paths safe by construction @@ -127,9 +129,10 @@ rotation procedures are in [release provenance](release-provenance.md). The protected `v*` tag ruleset and `release` Environment remain operator-owned GitHub settings. Confirm them immediately before signing and pushing the tag. -## Release-candidate proof +## Release proof -After the blockers merge: +The v1.1.0 release completed this procedure. Keep it as the reproducible +operator checklist for a future release: 1. Run `Scripts/prepare-version.py --check`, `fledge lanes run verify`, and @@ -139,7 +142,7 @@ After the blockers merge: 3. Push `refs/notes/attest` before the tag. 4. Require every main check to finish successfully. 5. Run `fledge release minor --no-bump --dry-run` from a clean checkout and - confirm it targets v1.1.0 without edits. + confirm it targets the intended release version without edits. 6. Publish the candidate artifacts. 7. Verify every checksum sidecar. 8. Execute both macOS binaries. diff --git a/docs/use-cases.md b/docs/use-cases.md new file mode 100644 index 0000000..68fedc5 --- /dev/null +++ b/docs/use-cases.md @@ -0,0 +1,107 @@ +# Using aps in projects, agents, and CI + +aps is a typed local state layer. It is most useful when several commands or +processes need to share discoverable state without introducing a service or +database. + +## Choose aps when + +- state must survive a new shell, process, or agent session +- humans and automation need the same inspectable values +- a schema and stable JSON output are valuable +- another process should observe changes with `aps watch` +- a CI job needs more structure than a few environment variables + +Use an environment variable or `GITHUB_OUTPUT` for a small, one-way value. Use a +database, queue, or coordination service for networked state or competing +writers. + +## Agent memory + +Give each agent a dedicated root: + +```bash +export APS_HOME="$PWD/.agents/codex" +aps schema --json +aps dump --json +``` + +At the start of a session, the agent rediscovers the live schema and values. At +each meaningful checkpoint, it updates its issue, branch, phase, tests, and +blocker. See the runnable [agent-memory example](../examples/agent-memory/). + +Use separate roots for Codex, Cursor, Kimi, and other concurrent agents. GitHub +labels and pull requests remain the shared ticket authority. + +## GitHub Actions + +Steps in one job share `APS_HOME`. Jobs use isolated machines, so transfer the +state root with `actions/upload-artifact` and `actions/download-artifact` when a +later job needs FileState keys. StoredState values live in platform UserDefaults +outside `APS_HOME` and are not included in that artifact. The complete +[GitHub Actions example](../examples/github-actions/) installs the portable +Linux release and demonstrates both jobs. + +Prefer native job outputs when only a scalar result crosses the boundary. +Artifacts are appropriate when the schema and several state files form one +reviewable snapshot. + +## Swift integration tests + +A Swift test harness can invoke aps to seed or inspect AppState-backed state +without adding a UI control surface. This is useful for feature flags, fixture +profiles, migration tests, and post-run inspection. + +The [Swift harness example](../examples/swift-harness/) compiles a small +Foundation program, writes a structured profile, and reads it back through a +fresh aps process. + +## Release pipelines + +Release automation can expose its current candidate and phase: + +```bash +APS_HOME="$PWD/.release-state" \ +RELEASE_VERSION=1.1.0 \ +CANDIDATE_COMMIT="$(git rev-parse HEAD)" \ +./examples/release-pipeline/run.sh >/dev/null + +APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" set releasePhase verifying +APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" set releaseTestsPassed true +APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" set riskVerdict proceed +``` + +This makes a local release script observable to agents and terminal dashboards. +It does not replace signed Attest provenance, the immutable tag, or CI evidence. +See the [release-pipeline example](../examples/release-pipeline/). + +## Repository layout + +Commit a project schema only when every contributor should share the same key +contract. Ignore runtime values while allowing the schema: + +```gitignore +.aps/* +!.aps/schema.json +``` + +For agent-local roots, normally ignore the complete `.agents/` directory. +The guided examples use named local state roots that this repository already +excludes in `.gitignore`. + +## Safety boundaries + +- Use one writer per key unless its adapter documents stronger behavior. +- Give concurrent agents separate roots or keys. +- `State` values are process-local; use FileState for cross-process examples. +- aps has no network synchronization or distributed locks. +- GitHub Actions jobs require artifact transfer for shared roots. +- Key-file encrypted state does not protect against compromise of the complete + state root. +- Never publish an encrypted envelope together with its private key. +- Use GitHub Secrets or a dedicated secret manager for CI credentials. + +## Start from an example + +The [`examples/` index](../examples/) provides copyable workflows for agent +memory, GitHub Actions, a Swift harness, and release automation. diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..3274d79 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,25 @@ +# aps examples + +These examples turn aps commands into complete workflows. Every local example +accepts `APS_BIN` and `APS_HOME`, so it can use either an installed release or +an isolated development build. + +| Example | Demonstrates | Run | +| --- | --- | --- | +| [Agent memory](agent-memory/) | Resumable state for Codex, Kimi, Cursor, or another agent | `./examples/agent-memory/run.sh` | +| [GitHub Actions](github-actions/) | Typed state across steps and jobs | Copy `workflow.yml` into a project | +| [Swift harness](swift-harness/) | A Swift integration test driving the AppState-backed CLI | `./examples/swift-harness/run.sh` | +| [Release pipeline](release-pipeline/) | Observable build, test, risk, and publication checkpoints | `./examples/release-pipeline/run.sh` | + +Build aps before running examples from a source checkout: + +```bash +fledge run build +export APS_BIN="$PWD/.build/debug/aps" +``` + +Each example uses persistent FileState keys when values must survive a new aps +process. Process-local `State` keys are intentionally avoided. + +Read the [use-case guide](../docs/use-cases.md) before adapting an example for +multiple writers, cross-job artifacts, or secrets. diff --git a/examples/agent-memory/README.md b/examples/agent-memory/README.md new file mode 100644 index 0000000..9b03929 --- /dev/null +++ b/examples/agent-memory/README.md @@ -0,0 +1,40 @@ +# Agent memory + +This example gives one agent a durable, typed checkpoint that survives terminal +and model-session restarts. + +```bash +APS_HOME="$PWD/.agents/codex" \ +CURRENT_ISSUE=142 \ +WORKING_BRANCH=agent/issue-142 \ +WORK_PHASE=implementing \ +TESTS_PASSED=false \ +BLOCKER="" \ +./examples/agent-memory/run.sh + +APS_HOME="$PWD/.agents/codex" ./examples/agent-memory/run.sh +``` + +The script emits one JSON checkpoint containing only these example keys. It +does not dump unrelated keys or secrets that may exist in the same state root. + +The example records: + +- current issue number +- branch +- workflow phase +- test status +- blocker text + +Give every concurrent agent its own root: + +```text +.agents/ + codex/ + cursor/ + kimi/ +``` + +Use GitHub issues, labels, and PRs as the shared coordination authority. aps is +the agent's local memory and does not claim tickets or provide distributed +locking. diff --git a/examples/agent-memory/run.sh b/examples/agent-memory/run.sh new file mode 100755 index 0000000..7849595 --- /dev/null +++ b/examples/agent-memory/run.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -euo pipefail + +aps_bin="${APS_BIN:-aps}" +export APS_HOME="${APS_HOME:-$PWD/.aps-agent-example}" + +ensure_key() { + local name="$1" + shift + if ! "$aps_bin" keys --quiet | grep -Fxq "$name"; then + "$aps_bin" key add "$name" "$@" >/dev/null + fi +} + +emit_checkpoint() { + local keys=(currentIssue workingBranch phase testsPassed blocker) + local separator="" + + printf '{"checkpoint":[' + for key in "${keys[@]}"; do + printf '%s' "$separator" + "$aps_bin" get "$key" --json + separator="," + done + printf ']}\n' +} + +ensure_key currentIssue \ + --type Int --storage FileState --path current-issue.json --initial 0 \ + --doc "Issue currently owned by this agent" +ensure_key workingBranch \ + --type String --storage FileState --path working-branch.json --initial "" \ + --doc "Branch currently owned by this agent" +ensure_key phase \ + --type String --storage FileState --path phase.json --initial idle \ + --doc "Current workflow phase" +ensure_key testsPassed \ + --type Bool --storage FileState --path tests-passed.json --initial false \ + --doc "Whether the latest verification passed" +ensure_key blocker \ + --type String --storage FileState --path blocker.json --initial "" \ + --doc "Current blocker, or an empty string" + +if [[ -n "${CURRENT_ISSUE+x}" ]]; then + "$aps_bin" set currentIssue "$CURRENT_ISSUE" >/dev/null +fi +if [[ -n "${WORKING_BRANCH+x}" ]]; then + "$aps_bin" set workingBranch "$WORKING_BRANCH" >/dev/null +fi +if [[ -n "${WORK_PHASE+x}" ]]; then + "$aps_bin" set phase "$WORK_PHASE" >/dev/null +fi +if [[ -n "${TESTS_PASSED+x}" ]]; then + "$aps_bin" set testsPassed "$TESTS_PASSED" >/dev/null +fi +if [[ -n "${BLOCKER+x}" ]]; then + "$aps_bin" set blocker "$BLOCKER" >/dev/null +fi + +emit_checkpoint diff --git a/examples/github-actions/README.md b/examples/github-actions/README.md new file mode 100644 index 0000000..b6f2296 --- /dev/null +++ b/examples/github-actions/README.md @@ -0,0 +1,18 @@ +# GitHub Actions + +[`workflow.yml`](workflow.yml) is a complete two-job example: + +1. Install the signed aps v1.1.0 release without installing Swift. +2. Create persistent CI keys and upload the state root. +3. Download the root in a dependent job. +4. Rediscover the schema and read the typed state. + +Copy it into `.github/workflows/aps-state.yml` in another repository. + +Use native `GITHUB_OUTPUT` for one or two scalar outputs. aps is useful when a +job needs a discoverable schema, several evolving values, local +cross-process reads, or a state snapshot that humans and agents can inspect. + +All Actions are pinned to reviewed commit SHAs. The example uploads no +encrypted values. Do not upload both an encrypted envelope and its key file as +a public artifact. diff --git a/examples/github-actions/workflow.yml b/examples/github-actions/workflow.yml new file mode 100644 index 0000000..546ec47 --- /dev/null +++ b/examples/github-actions/workflow.yml @@ -0,0 +1,55 @@ +name: aps state example + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + prepare: + runs-on: ubuntu-latest + steps: + - uses: 0xLeif/aps-cli/.github/actions/install-aps@7373d124ebb3823c1f7f19651dfffe4d7ed83f51 + with: + version: 1.1.0 + + - name: Record build state + env: + APS_HOME: ${{ runner.temp }}/aps-home + run: | + aps key add phase \ + --type String --storage FileState --path phase.json \ + --initial queued --doc "Current CI phase" + aps key add candidateCommit \ + --type String --storage FileState --path candidate-commit.json \ + --initial "" --doc "Commit under test" + aps set phase testing + aps set candidateCommit "$GITHUB_SHA" + aps dump --json + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: aps-state + path: ${{ runner.temp }}/aps-home + + consume: + needs: prepare + runs-on: ubuntu-latest + steps: + - uses: 0xLeif/aps-cli/.github/actions/install-aps@7373d124ebb3823c1f7f19651dfffe4d7ed83f51 + with: + version: 1.1.0 + + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: aps-state + path: ${{ runner.temp }}/aps-home + + - name: Read state in a new job + env: + APS_HOME: ${{ runner.temp }}/aps-home + run: | + aps schema --json + test "$(aps get phase)" = "testing" + test "$(aps get candidateCommit)" = "$GITHUB_SHA" diff --git a/examples/release-pipeline/README.md b/examples/release-pipeline/README.md new file mode 100644 index 0000000..b68117e --- /dev/null +++ b/examples/release-pipeline/README.md @@ -0,0 +1,25 @@ +# Release pipeline + +This example records an observable local release checkpoint: + +```bash +APS_HOME="$PWD/.release-state" \ +RELEASE_VERSION=1.1.0 \ +CANDIDATE_COMMIT="$(git rev-parse HEAD)" \ +./examples/release-pipeline/run.sh +``` + +The state root records the candidate version and commit, current phase, latest +test result, and risk verdict. A release script, agent, or terminal dashboard +can inspect it with: + +```bash +APS_HOME="$PWD/.release-state" ./examples/release-pipeline/run.sh +APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" watch releasePhase --jsonl --timeout 300 +``` + +aps records operational state. Signed provenance still belongs in Attest, the +release tag remains the version authority, and CI remains the test authority. +Changing the release version or candidate commit resets `releasePhase` to +`planned`, `releaseTestsPassed` to `false`, and `riskVerdict` to `pending`. +Provide new phase and gate results only after evaluating that candidate. diff --git a/examples/release-pipeline/run.sh b/examples/release-pipeline/run.sh new file mode 100755 index 0000000..d67c09c --- /dev/null +++ b/examples/release-pipeline/run.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +set -euo pipefail + +aps_bin="${APS_BIN:-aps}" +export APS_HOME="${APS_HOME:-$PWD/.aps-release-example}" + +ensure_key() { + local name="$1" + shift + if ! "$aps_bin" keys --quiet | grep -Fxq "$name"; then + "$aps_bin" key add "$name" "$@" >/dev/null + fi +} + +emit_checkpoint() { + local keys=(releaseVersion candidateCommit releasePhase releaseTestsPassed riskVerdict) + local separator="" + + printf '{"checkpoint":[' + for key in "${keys[@]}"; do + printf '%s' "$separator" + "$aps_bin" get "$key" --json + separator="," + done + printf ']}\n' +} + +ensure_key releaseVersion \ + --type String --storage FileState --path release-version.json --initial "" \ + --doc "Release version under evaluation" +ensure_key candidateCommit \ + --type String --storage FileState --path candidate-commit.json --initial "" \ + --doc "Exact release candidate commit" +ensure_key releasePhase \ + --type String --storage FileState --path release-phase.json --initial planned \ + --doc "Current release phase" +ensure_key releaseTestsPassed \ + --type Bool --storage FileState --path release-tests-passed.json --initial false \ + --doc "Whether release verification passed" +ensure_key riskVerdict \ + --type String --storage FileState --path risk-verdict.json --initial pending \ + --doc "Latest deterministic risk verdict" + +candidate_changed=false +if [[ -n "${RELEASE_VERSION+x}" ]]; then + if [[ "$("$aps_bin" get releaseVersion)" != "$RELEASE_VERSION" ]]; then + candidate_changed=true + fi +fi +if [[ -n "${CANDIDATE_COMMIT+x}" ]]; then + if [[ "$("$aps_bin" get candidateCommit)" != "$CANDIDATE_COMMIT" ]]; then + candidate_changed=true + fi +fi +if [[ "$candidate_changed" == true ]]; then + "$aps_bin" set releasePhase planned >/dev/null + "$aps_bin" set releaseTestsPassed false >/dev/null + "$aps_bin" set riskVerdict pending >/dev/null +fi +if [[ -n "${RELEASE_VERSION+x}" ]]; then + "$aps_bin" set releaseVersion "$RELEASE_VERSION" >/dev/null +fi +if [[ -n "${CANDIDATE_COMMIT+x}" ]]; then + "$aps_bin" set candidateCommit "$CANDIDATE_COMMIT" >/dev/null +fi +if [[ -n "${RELEASE_PHASE+x}" ]]; then + "$aps_bin" set releasePhase "$RELEASE_PHASE" >/dev/null +fi +if [[ -n "${RELEASE_TESTS_PASSED+x}" ]]; then + "$aps_bin" set releaseTestsPassed "$RELEASE_TESTS_PASSED" >/dev/null +fi +if [[ -n "${RISK_VERDICT+x}" ]]; then + "$aps_bin" set riskVerdict "$RISK_VERDICT" >/dev/null +fi + +emit_checkpoint diff --git a/examples/swift-harness/README.md b/examples/swift-harness/README.md new file mode 100644 index 0000000..106a035 --- /dev/null +++ b/examples/swift-harness/README.md @@ -0,0 +1,18 @@ +# Swift integration harness + +This example compiles a small Swift program that invokes aps as a subprocess. +It models an integration test or developer tool controlling the same +AppState-backed state surface that a human or agent can inspect. + +```bash +fledge run build +APS_BIN="$PWD/.build/debug/aps" \ +APS_HOME="$(mktemp -d)" \ +./examples/swift-harness/run.sh +``` + +The harness writes the default structured `profile` value in one process and +reads it back in another. Production projects can use the same boundary to seed +fixtures, change feature state, or inspect state after an application test. + +This is a subprocess integration example, not an aps Swift library API. diff --git a/examples/swift-harness/StateHarness.swift b/examples/swift-harness/StateHarness.swift new file mode 100644 index 0000000..b525e93 --- /dev/null +++ b/examples/swift-harness/StateHarness.swift @@ -0,0 +1,104 @@ +@preconcurrency import Foundation + +internal enum HarnessError: Error, LocalizedError { + case commandFailed(arguments: [String], status: Int32, stderr: String) + case executableNotFound(String) + + internal var errorDescription: String? { + switch self { + case .commandFailed(let arguments, let status, let stderr): + return "aps \(arguments.joined(separator: " ")) failed with \(status): \(stderr)" + case .executableNotFound(let executable): + return "Could not resolve aps executable '\(executable)' from APS_BIN or PATH" + } + } +} + +@main +internal struct StateHarness { + internal static func main() throws { + let apsBinary = ProcessInfo.processInfo.environment["APS_BIN"] ?? "aps" + let profile = #"{"name":"swift-harness","version":1}"# + + _ = try run(apsBinary, arguments: ["set", "profile", profile, "--json"]) + let result = try run(apsBinary, arguments: ["get", "profile", "--json"]) + FileHandle.standardOutput.write(result) + } + + private static func run(_ apsBinary: String, arguments: [String]) throws -> Data { + let process = Process() + let output = Pipe() + let errors = Pipe() + + process.executableURL = try executableURL(for: apsBinary) + process.arguments = arguments + process.standardOutput = output + process.standardError = errors + + try process.run() + process.waitUntilExit() + + let outputData = output.fileHandleForReading.readDataToEndOfFile() + let errorData = errors.fileHandleForReading.readDataToEndOfFile() + guard process.terminationStatus == 0 else { + let errorText = String(decoding: errorData, as: UTF8.self) + throw HarnessError.commandFailed( + arguments: arguments, + status: process.terminationStatus, + stderr: errorText + ) + } + return outputData + } + + private static func executableURL(for executable: String) throws -> URL { + let fileManager = FileManager.default + let environment = ProcessInfo.processInfo.environment + + #if os(Windows) + let pathSeparator: Character = ";" + let extensions = (environment["PATHEXT"] ?? ".EXE;.CMD;.BAT") + .split(separator: ";") + .map(String.init) + #else + let pathSeparator: Character = ":" + let extensions = [""] + #endif + + let executableNames = [executable] + extensions + .filter { !$0.isEmpty } + .map { executable + $0 } + if executable.contains("/") || executable.contains("\\") { + for executableName in executableNames { + let directURL = URL(fileURLWithPath: executableName).standardizedFileURL + if isExecutable(directURL, fileManager: fileManager) { + return directURL + } + } + throw HarnessError.executableNotFound(executable) + } + + let pathEntries = (environment["PATH"] ?? "") + .split(separator: pathSeparator) + .map(String.init) + for pathEntry in pathEntries { + for executableName in executableNames { + let candidate = URL(fileURLWithPath: pathEntry) + .appendingPathComponent(executableName) + if isExecutable(candidate, fileManager: fileManager) { + return candidate + } + } + } + + throw HarnessError.executableNotFound(executable) + } + + private static func isExecutable(_ url: URL, fileManager: FileManager) -> Bool { + #if os(Windows) + return fileManager.fileExists(atPath: url.path) + #else + return fileManager.isExecutableFile(atPath: url.path) + #endif + } +} diff --git a/examples/swift-harness/run.sh b/examples/swift-harness/run.sh new file mode 100755 index 0000000..b7145d6 --- /dev/null +++ b/examples/swift-harness/run.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +example_dir="$(cd "$(dirname "$0")" && pwd)" +build_dir="$(mktemp -d "${TMPDIR:-/tmp}/aps-swift-harness.XXXXXX")" +cleanup() { + if [[ -n "$build_dir" && -d "$build_dir" ]]; then + rm -rf "$build_dir" + fi +} +trap cleanup EXIT + +export APS_BIN="${APS_BIN:-aps}" +export APS_HOME="${APS_HOME:-$PWD/.aps-swift-harness-example}" + +swiftc -parse-as-library \ + "$example_dir/StateHarness.swift" \ + -o "$build_dir/state-harness" +"$build_dir/state-harness" diff --git a/fledge.toml b/fledge.toml index 9c8ed13..d760f7c 100644 --- a/fledge.toml +++ b/fledge.toml @@ -15,6 +15,7 @@ version-contract-test = "./Scripts/test-version-contract.sh" ox-vendor-test = "./Scripts/test-0x-vendor.sh" ox-update = "./Scripts/sync-0x.sh" release-provenance-test = "./Scripts/test-release-provenance.sh" +examples-test = "./Scripts/test-examples.sh" # Manifest-only: warns if `.build/release/aps` is missing (created by release/install hooks). plugin-validate = "fledge plugins validate ." # Keep specsync out of lanes.verify: Trust/SpecSync run it as a top-level gate @@ -35,5 +36,6 @@ steps = [ "version-contract-test", "ox-vendor-test", "release-provenance-test", + "examples-test", "plugin-validate", ]