From 3a0121b3de4caada98f79b871c77a1cbb83c26fd Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 08:13:11 -0600 Subject: [PATCH 01/16] docs(examples): add guided aps workflows --- .specsync/change-sequence.json | 4 +- .../approvals.json | 19 ++++ .../change.md | 24 +++++ .../context.md | 15 +++ .../design.md | 18 ++++ .../docs.md | 14 +++ .../state.json | 40 ++++++++ .../tasks.md | 11 +++ .../testing.md | 12 +++ .../verification-attempts.json | 20 ++++ .../verification.json | 15 +++ README.md | 60 +++++++----- Scripts/test-examples.sh | 70 +++++++++++++ docs/README.md | 2 + docs/release-readiness.md | 17 ++-- docs/use-cases.md | 98 +++++++++++++++++++ examples/README.md | 25 +++++ examples/agent-memory/README.md | 30 ++++++ examples/agent-memory/run.sh | 37 +++++++ examples/github-actions/README.md | 18 ++++ examples/github-actions/workflow.yml | 55 +++++++++++ examples/release-pipeline/README.md | 22 +++++ examples/release-pipeline/run.sh | 37 +++++++ examples/swift-harness/README.md | 18 ++++ examples/swift-harness/StateHarness.swift | 50 ++++++++++ examples/swift-harness/run.sh | 19 ++++ fledge.toml | 2 + 27 files changed, 720 insertions(+), 32 deletions(-) create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/approvals.json create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/change.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/context.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/design.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/docs.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/tasks.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/testing.md create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification-attempts.json create mode 100644 .specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification.json create mode 100755 Scripts/test-examples.sh create mode 100644 docs/use-cases.md create mode 100644 examples/README.md create mode 100644 examples/agent-memory/README.md create mode 100755 examples/agent-memory/run.sh create mode 100644 examples/github-actions/README.md create mode 100644 examples/github-actions/workflow.yml create mode 100644 examples/release-pipeline/README.md create mode 100755 examples/release-pipeline/run.sh create mode 100644 examples/swift-harness/README.md create mode 100644 examples/swift-harness/StateHarness.swift create mode 100755 examples/swift-harness/run.sh diff --git a/.specsync/change-sequence.json b/.specsync/change-sequence.json index 58596835..e5d15430 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": 65, + "id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", "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 00000000..a9229b96 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/approvals.json @@ -0,0 +1,19 @@ +{ + "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." + } + ], + "reopenings": [] +} 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 00000000..28b69bf4 --- /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: implementing +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 00000000..04a2bcfd --- /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 00000000..5326c6a7 --- /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 00000000..fb9e9b58 --- /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 00000000..5eddf8c3 --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json @@ -0,0 +1,40 @@ +{ + "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": "verifying", + "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", + "created_at": 1785333608, + "updated_at": 1785334382, + "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 00000000..963d641e --- /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 00000000..982eaeca --- /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 00000000..d0a965ac --- /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,20 @@ +{ + "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": [] + } + ] +} 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 00000000..a8146aee --- /dev/null +++ b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/verification.json @@ -0,0 +1,15 @@ +{ + "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": [] +} diff --git a/README.md b/README.md index 5f1f5654..4f6ef8d8 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 00000000..69c5c12e --- /dev/null +++ b/Scripts/test-examples.sh @@ -0,0 +1,70 @@ +#!/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 "$(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/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 "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseVersion)" = "9.8.7" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "proceed" + +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" + +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 '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" + +echo "example contract checks passed" diff --git a/docs/README.md b/docs/README.md index 996f8e3f..411fa084 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 9074943d..14d515db 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 diff --git a/docs/use-cases.md b/docs/use-cases.md new file mode 100644 index 00000000..03cf2be4 --- /dev/null +++ b/docs/use-cases.md @@ -0,0 +1,98 @@ +# 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 it. 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 set releasePhase verifying +aps set releaseTestsPassed true +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. + +## 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 00000000..3274d799 --- /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 00000000..30b1758c --- /dev/null +++ b/examples/agent-memory/README.md @@ -0,0 +1,30 @@ +# Agent memory + +This example gives one agent a durable, typed checkpoint that survives terminal +and model-session restarts. + +```bash +APS_HOME="$PWD/.agents/codex" ./examples/agent-memory/run.sh +APS_HOME="$PWD/.agents/codex" aps dump --json +``` + +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 00000000..0196d903 --- /dev/null +++ b/examples/agent-memory/run.sh @@ -0,0 +1,37 @@ +#!/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" "$@" + fi +} + +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" + +"$aps_bin" set currentIssue "${CURRENT_ISSUE:-142}" >/dev/null +"$aps_bin" set workingBranch "${WORKING_BRANCH:-agent/issue-142}" >/dev/null +"$aps_bin" set phase "${WORK_PHASE:-implementing}" >/dev/null +"$aps_bin" set testsPassed "${TESTS_PASSED:-false}" >/dev/null +"$aps_bin" set blocker "${BLOCKER:-}" >/dev/null + +"$aps_bin" dump --json diff --git a/examples/github-actions/README.md b/examples/github-actions/README.md new file mode 100644 index 00000000..b6f22968 --- /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 00000000..9e8de7b4 --- /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 + env: + APS_HOME: ${{ runner.temp }}/aps-home + steps: + - uses: 0xLeif/aps-cli/.github/actions/install-aps@7373d124ebb3823c1f7f19651dfffe4d7ed83f51 + with: + version: 1.1.0 + + - name: Record build state + 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: ${{ env.APS_HOME }} + + consume: + needs: prepare + runs-on: ubuntu-latest + env: + APS_HOME: ${{ runner.temp }}/aps-home + 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: ${{ env.APS_HOME }} + + - name: Read state in a new job + 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 00000000..0f2d670d --- /dev/null +++ b/examples/release-pipeline/README.md @@ -0,0 +1,22 @@ +# 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" aps dump --json +APS_HOME="$PWD/.release-state" 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. diff --git a/examples/release-pipeline/run.sh b/examples/release-pipeline/run.sh new file mode 100755 index 00000000..6acb5a62 --- /dev/null +++ b/examples/release-pipeline/run.sh @@ -0,0 +1,37 @@ +#!/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" "$@" + fi +} + +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" + +"$aps_bin" set releaseVersion "${RELEASE_VERSION:-1.1.0}" >/dev/null +"$aps_bin" set candidateCommit "${CANDIDATE_COMMIT:-local}" >/dev/null +"$aps_bin" set releasePhase "${RELEASE_PHASE:-verifying}" >/dev/null +"$aps_bin" set releaseTestsPassed "${RELEASE_TESTS_PASSED:-true}" >/dev/null +"$aps_bin" set riskVerdict "${RISK_VERDICT:-proceed}" >/dev/null + +"$aps_bin" dump --json diff --git a/examples/swift-harness/README.md b/examples/swift-harness/README.md new file mode 100644 index 00000000..106a0352 --- /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 00000000..3cf8c17d --- /dev/null +++ b/examples/swift-harness/StateHarness.swift @@ -0,0 +1,50 @@ +@preconcurrency import Foundation + +internal enum HarnessError: Error, LocalizedError { + case commandFailed(arguments: [String], status: Int32, stderr: String) + + internal var errorDescription: String? { + switch self { + case .commandFailed(let arguments, let status, let stderr): + return "aps \(arguments.joined(separator: " ")) failed with \(status): \(stderr)" + } + } +} + +@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 = URL(fileURLWithPath: "/usr/bin/env") + process.arguments = [apsBinary] + 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 + } +} diff --git a/examples/swift-harness/run.sh b/examples/swift-harness/run.sh new file mode 100755 index 00000000..b7145d62 --- /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 9c8ed13e..d760f7c7 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", ] From eb55402e4b5d52ee0231ea306a3edcccd6ae038c Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 08:45:11 -0600 Subject: [PATCH 02/16] chore(specsync): refresh verification evidence --- .../state.json | 2 +- .../verification-attempts.json | 15 +++++++++++++++ .../verification.json | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) 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 index 5eddf8c3..fa72e8a5 100644 --- 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 @@ -8,7 +8,7 @@ "state": "verifying", "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785334382, + "updated_at": 1785336296, "affected_specs": [ "aps-cli" ], 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 index d0a965ac..416efbec 100644 --- 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 @@ -15,6 +15,21 @@ } ], "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": [] } ] } 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 index a8146aee..8614cdc0 100644 --- 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 @@ -1,6 +1,6 @@ { - "timestamp": 1785334380, - "commit": "5a14806518b38ffdb5143c3115f1761689f8c749", + "timestamp": 1785336293, + "commit": "3a0121b3de4caada98f79b871c77a1cbb83c26fd", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", "passed": true, From 7a151837dded09817eff7fc71431404ac8bdcfc5 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 09:29:55 -0600 Subject: [PATCH 03/16] chore(specsync): accept guided examples change --- .../approvals.json | 7 + .../change.md | 2 +- .../state.json | 5 +- .../verification-attempts.json | 15 + .../verification.json | 300 +++++++++++++++++- 5 files changed, 324 insertions(+), 5 deletions(-) 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 index a9229b96..1791d43d 100644 --- 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 @@ -13,6 +13,13 @@ "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." } ], "reopenings": [] 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 index 28b69bf4..47a96c92 100644 --- 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 @@ -1,6 +1,6 @@ --- id: CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re -state: implementing +state: accepted type: documentation base_commit: 5a14806518b38ffdb5143c3115f1761689f8c749 --- 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 index fa72e8a5..a2df4eaf 100644 --- 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 @@ -5,10 +5,11 @@ "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": "verifying", + "state": "accepted", + "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785336296, + "updated_at": 1785338981, "affected_specs": [ "aps-cli" ], 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 index 416efbec..9efc7da1 100644 --- 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 @@ -30,6 +30,21 @@ } ], "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": [] } ] } 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 index 8614cdc0..42ce629f 100644 --- 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 @@ -1,8 +1,304 @@ { - "timestamp": 1785336293, - "commit": "3a0121b3de4caada98f79b871c77a1cbb83c26fd", + "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": [ { From a6ba9cbf5f5b895f724ee4c878047299a80f614e Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 09:45:16 -0600 Subject: [PATCH 04/16] fix(examples): preserve safe workflow checkpoints --- .gitignore | 7 + .../approvals.json | 339 +++++++++++++++++- .../state.json | 2 +- .../verification-attempts.json | 15 + .../verification.json | 24 +- Scripts/test-examples.sh | 27 ++ docs/release-readiness.md | 2 +- examples/agent-memory/run.sh | 20 +- examples/release-pipeline/run.sh | 20 +- 9 files changed, 431 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 1ecb30a5..f8803457 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,12 @@ DerivedData/ *.swp *~ +# Guided example state +/.agents/ +/.release-state/ +/.aps-agent-example/ +/.aps-release-example/ +/.aps-swift-harness-example/ + # CorvidLabs trust toolchain augur.json 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 index 1791d43d..06f9bc3d 100644 --- 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 @@ -20,7 +20,344 @@ "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." } ], - "reopenings": [] + "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" + } + ] } 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 index a2df4eaf..9c29924b 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785338981, + "updated_at": 1785339909, "affected_specs": [ "aps-cli" ], 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 index 9efc7da1..5da05bde 100644 --- 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 @@ -45,6 +45,21 @@ } ], "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": [] } ] } 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 index 42ce629f..7873dc8f 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785338977, - "commit": "eb55402e4b5d52ee0231ea306a3edcccd6ae038c", + "timestamp": 1785339903, + "commit": "7a151837dded09817eff7fc71431404ac8bdcfc5", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "d63ebd72a27f20abfe97f164f13694afd85de075f3cc6ee7b84bf932183f3b62", - "acceptance_input_digest": "42ff76dbd92601452f2ec02a15af8de446da7c2a8df8f9dcee4d1d5840323405", + "workspace_digest": "54a1b9dc8f2bf6184fb2cfa677ca4b9acc3a5387d9833ebbedde53c19249e212", + "acceptance_input_digest": "d222b59dbf9b7d7bb9c8a974f01273f6c22e104be6e74dca9c0be0dd4568c357", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -31,8 +31,8 @@ "path": "Scripts/test-examples.sh", "kind": "file", "mode": 33261, - "payload_digest": "2015740715c7a5d1866dd6be70e818cd12056c9220aa7555c4ae411662b6c6ea", - "entry_digest": "9d7f455a1c3613b7947d623cd0494d639da5a8945383082ff2197aebf6356bec", + "payload_digest": "77a4dbd5d03be0f93cd0bb1fa6a1c1970053749cbd490392e5e8f59c2db77a1e", + "entry_digest": "9e766466f2a742baefbd9daa57126ed48dd4272af55268dd9c3341de43188754", "owners": [ "@exact:delivery" ] @@ -81,8 +81,8 @@ "path": "docs/release-readiness.md", "kind": "file", "mode": 33188, - "payload_digest": "a5b23fd43cf629d46776db5cc5829651ced7359f5edc3c4e5a65b9a1a18eabef", - "entry_digest": "936a3d9b9e763c7855b3c7ee1c92a661591a99203bcd98a8cc30a0d1539d69bb", + "payload_digest": "7d768abd0e96f40bbccb21c1b69e2f5b335c0cf1c35f961678e5b173e2270973", + "entry_digest": "070bc714092221df81ac815fae17911058df58b31f92dcb5c01e2d3c4a5d9030", "owners": [ "@exact:delivery" ] @@ -161,8 +161,8 @@ "path": "examples/agent-memory/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "84e7adca79611ef1ddd16cbe9a40f9a063e5d8a84ea1286cef135f1f385c32f3", - "entry_digest": "ba4c604859e2d47691fbf9f17b2e66c0a570ac7e2f77709ee0a7774c837c699e", + "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", + "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", "owners": [ "@exact:delivery" ] @@ -201,8 +201,8 @@ "path": "examples/release-pipeline/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "b77c50c4cabe31a8ddb172c0f715b735961db528ccdf6abbe1f47025c4ab7d73", - "entry_digest": "82c3a9b2ba04a0e0463f40f7512c9d1cba94d22e6bdde982875fbf4e851aacf6", + "payload_digest": "3ebc618325038a9a71f71278de56a897bcc536848bd00f77541f29a61f1d3ddd", + "entry_digest": "87d4b5c6702ff0ad0d4c10d42f8e6ee72480a6fad5e2ac72fdf75f48a6e0c7b8", "owners": [ "@exact:delivery" ] diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh index 69c5c12e..77b8d175 100755 --- a/Scripts/test-examples.sh +++ b/Scripts/test-examples.sh @@ -23,6 +23,12 @@ TESTS_PASSED=true \ grep -Fq '"key":"currentIssue"' "$fixture_root/agent.json" 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" \ @@ -31,6 +37,18 @@ CANDIDATE_COMMIT=0123456789abcdef \ "$repo_root/examples/release-pipeline/run.sh" > "$fixture_root/release.json" grep -Fq '"key":"releaseVersion"' "$fixture_root/release.json" 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_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 releaseTestsPassed)" = "true" test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "proceed" APS_BIN="$aps_bin" \ @@ -66,5 +84,14 @@ do grep -Fq "../examples/$example/" "$repo_root/docs/use-cases.md" done grep -Fq '../examples/' "$repo_root/docs/README.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/release-readiness.md b/docs/release-readiness.md index 14d515db..b4dcebd2 100644 --- a/docs/release-readiness.md +++ b/docs/release-readiness.md @@ -142,7 +142,7 @@ operator checklist for a future release: 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/examples/agent-memory/run.sh b/examples/agent-memory/run.sh index 0196d903..2c77f31f 100755 --- a/examples/agent-memory/run.sh +++ b/examples/agent-memory/run.sh @@ -28,10 +28,20 @@ ensure_key blocker \ --type String --storage FileState --path blocker.json --initial "" \ --doc "Current blocker, or an empty string" -"$aps_bin" set currentIssue "${CURRENT_ISSUE:-142}" >/dev/null -"$aps_bin" set workingBranch "${WORKING_BRANCH:-agent/issue-142}" >/dev/null -"$aps_bin" set phase "${WORK_PHASE:-implementing}" >/dev/null -"$aps_bin" set testsPassed "${TESTS_PASSED:-false}" >/dev/null -"$aps_bin" set blocker "${BLOCKER:-}" >/dev/null +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 "$aps_bin" dump --json diff --git a/examples/release-pipeline/run.sh b/examples/release-pipeline/run.sh index 6acb5a62..8ae735fd 100755 --- a/examples/release-pipeline/run.sh +++ b/examples/release-pipeline/run.sh @@ -28,10 +28,20 @@ ensure_key riskVerdict \ --type String --storage FileState --path risk-verdict.json --initial pending \ --doc "Latest deterministic risk verdict" -"$aps_bin" set releaseVersion "${RELEASE_VERSION:-1.1.0}" >/dev/null -"$aps_bin" set candidateCommit "${CANDIDATE_COMMIT:-local}" >/dev/null -"$aps_bin" set releasePhase "${RELEASE_PHASE:-verifying}" >/dev/null -"$aps_bin" set releaseTestsPassed "${RELEASE_TESTS_PASSED:-true}" >/dev/null -"$aps_bin" set riskVerdict "${RISK_VERDICT:-proceed}" >/dev/null +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 "$aps_bin" dump --json From a20d32c630078452e5e0da4a55e356d0dc65f461 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 09:58:46 -0600 Subject: [PATCH 05/16] docs(examples): clarify generated state roots --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f8803457..5eedab93 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ DerivedData/ *.swp *~ -# Guided example state +# Guided example state roots /.agents/ /.release-state/ /.aps-agent-example/ From 2f13cde531c3953d1f821b15a699449d0a1e6f03 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 09:59:12 -0600 Subject: [PATCH 06/16] docs(examples): document ignored state roots --- docs/use-cases.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/use-cases.md b/docs/use-cases.md index 03cf2be4..6fd859b6 100644 --- a/docs/use-cases.md +++ b/docs/use-cases.md @@ -79,6 +79,8 @@ contract. Ignore runtime values while allowing the schema: ``` 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 From 8735d094eed5ce7428b5b9173593ece7f9e3f96b Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:03:29 -0600 Subject: [PATCH 07/16] chore(specsync): refresh docs example evidence --- .../approvals.json | 350 ++++++++++++++++++ .../state.json | 2 +- .../verification-attempts.json | 30 ++ .../verification.json | 12 +- 4 files changed, 387 insertions(+), 7 deletions(-) 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 index 06f9bc3d..c31d3cf8 100644 --- 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 @@ -27,6 +27,27 @@ "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." } ], "reopenings": [ @@ -358,6 +379,335 @@ }, "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" } ] } 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 index 9c29924b..c5d0b928 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785339909, + "updated_at": 1785340962, "affected_specs": [ "aps-cli" ], 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 index 5da05bde..2bf3b7a8 100644 --- 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 @@ -60,6 +60,36 @@ } ], "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": [] } ] } 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 index 7873dc8f..6b569780 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785339903, - "commit": "7a151837dded09817eff7fc71431404ac8bdcfc5", + "timestamp": 1785340957, + "commit": "2f13cde531c3953d1f821b15a699449d0a1e6f03", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "54a1b9dc8f2bf6184fb2cfa677ca4b9acc3a5387d9833ebbedde53c19249e212", - "acceptance_input_digest": "d222b59dbf9b7d7bb9c8a974f01273f6c22e104be6e74dca9c0be0dd4568c357", + "workspace_digest": "da4c8bb24a069922d6e6f698130660938df9fbc76db2e9ff4d2251b568164b5c", + "acceptance_input_digest": "df73ff87f4058a7fee196224182a05cd5c1bc9bd7dab39cd43ca61b33e360d46", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -111,8 +111,8 @@ "path": "docs/use-cases.md", "kind": "file", "mode": 33188, - "payload_digest": "82a1554d63738a65e02bb501cdfe07e90712cdbdb25e622f5d1a286600274d67", - "entry_digest": "f4ea707d5bbcf300cab5f530302195afb223e941a7a8c071cc930595931df13c", + "payload_digest": "591c2d0cf018503f1c8e287e4882463d54a1a7203f41d3165d6ccb9408f98865", + "entry_digest": "38ea652296f0d51aa743ebaf1d9a1fe528a83d7737fef1fa668a75fbf6fc7d04", "owners": [ "@exact:delivery" ] From bcc04c3fc5bbcb0568b14271eb3b9a921243a2ca Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:06:13 -0600 Subject: [PATCH 08/16] chore(specsync): audit generated example roots --- .gitignore | 2 +- .specsync/change-sequence.json | 4 +- .../approvals.json | 19 ++++ .../change.md | 24 +++++ .../context.md | 12 +++ .../docs.md | 11 +++ .../state.json | 34 +++++++ .../verification-attempts.json | 20 ++++ .../verification.json | 91 +++++++++++++++++++ 9 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/approvals.json create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/change.md create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/context.md create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/docs.md create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/state.json create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification-attempts.json create mode 100644 .specsync/changes/CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples/verification.json diff --git a/.gitignore b/.gitignore index 5eedab93..a6d07d4f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ DerivedData/ *.swp *~ -# Guided example state roots +# Repository-local state roots created by guided examples /.agents/ /.release-state/ /.aps-agent-example/ diff --git a/.specsync/change-sequence.json b/.specsync/change-sequence.json index e5d15430..06f4bab7 100644 --- a/.specsync/change-sequence.json +++ b/.specsync/change-sequence.json @@ -1,6 +1,6 @@ { "schema_version": 1, - "sequence": 65, - "id": "CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re", + "sequence": 66, + "id": "CHG-0066-document-and-ignore-repository-local-state-roots-generated-by-guided-examples", "acknowledged_collisions": [] } 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 00000000..21baef47 --- /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 00000000..a8510625 --- /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 00000000..f6de762f --- /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 00000000..35b0ee9b --- /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 00000000..1c8f65c8 --- /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 00000000..70793343 --- /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 00000000..8ae1a09a --- /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": [] +} From 5574c48824513a06961699b3da0d6728b7b372d3 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:19:16 -0600 Subject: [PATCH 09/16] fix(examples): keep guided state candidate-safe --- Scripts/test-examples.sh | 11 +++++++++++ docs/use-cases.md | 6 ++++-- examples/agent-memory/README.md | 11 +++++++++-- examples/release-pipeline/README.md | 7 +++++-- examples/release-pipeline/run.sh | 11 +++++++++++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh index 77b8d175..1e95cc63 100755 --- a/Scripts/test-examples.sh +++ b/Scripts/test-examples.sh @@ -50,6 +50,14 @@ APS_HOME="$fixture_root/release" \ test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseVersion)" = "9.8.7" 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 releaseTestsPassed)" = "false" +test "$(APS_HOME="$fixture_root/release" "$aps_bin" get riskVerdict)" = "pending" APS_BIN="$aps_bin" \ APS_HOME="$fixture_root/swift" \ @@ -84,6 +92,9 @@ do grep -Fq "../examples/$example/" "$repo_root/docs/use-cases.md" done grep -Fq '../examples/' "$repo_root/docs/README.md" +grep -Fq '${APS_BIN:-aps}' "$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/ \ diff --git a/docs/use-cases.md b/docs/use-cases.md index 6fd859b6..680f78af 100644 --- a/docs/use-cases.md +++ b/docs/use-cases.md @@ -37,8 +37,10 @@ labels and pull requests remain the shared ticket authority. 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 it. The complete [GitHub Actions example](../examples/github-actions/) -installs the portable Linux release and demonstrates both jobs. +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 diff --git a/examples/agent-memory/README.md b/examples/agent-memory/README.md index 30b1758c..47c901c0 100644 --- a/examples/agent-memory/README.md +++ b/examples/agent-memory/README.md @@ -4,8 +4,15 @@ This example gives one agent a durable, typed checkpoint that survives terminal and model-session restarts. ```bash -APS_HOME="$PWD/.agents/codex" ./examples/agent-memory/run.sh -APS_HOME="$PWD/.agents/codex" aps dump --json +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" "${APS_BIN:-aps}" dump --json ``` The example records: diff --git a/examples/release-pipeline/README.md b/examples/release-pipeline/README.md index 0f2d670d..2a589960 100644 --- a/examples/release-pipeline/README.md +++ b/examples/release-pipeline/README.md @@ -14,9 +14,12 @@ test result, and risk verdict. A release script, agent, or terminal dashboard can inspect it with: ```bash -APS_HOME="$PWD/.release-state" aps dump --json -APS_HOME="$PWD/.release-state" aps watch releasePhase --jsonl --timeout 300 +APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" dump --json +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 `releaseTestsPassed` to +`false` and `riskVerdict` to `pending`; provide new gate results only after +evaluating that candidate. diff --git a/examples/release-pipeline/run.sh b/examples/release-pipeline/run.sh index 8ae735fd..cffa0aa8 100755 --- a/examples/release-pipeline/run.sh +++ b/examples/release-pipeline/run.sh @@ -28,12 +28,23 @@ 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 "$aps_bin" set releaseVersion "$RELEASE_VERSION" >/dev/null fi if [[ -n "${CANDIDATE_COMMIT+x}" ]]; then + if [[ "$("$aps_bin" get candidateCommit)" != "$CANDIDATE_COMMIT" ]]; then + candidate_changed=true + fi "$aps_bin" set candidateCommit "$CANDIDATE_COMMIT" >/dev/null fi +if [[ "$candidate_changed" == true ]]; then + "$aps_bin" set releaseTestsPassed false >/dev/null + "$aps_bin" set riskVerdict pending >/dev/null +fi if [[ -n "${RELEASE_PHASE+x}" ]]; then "$aps_bin" set releasePhase "$RELEASE_PHASE" >/dev/null fi From 9588b3b2671e632bc58fe4cf7fd20ed52d2bdb0b Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:21:01 -0600 Subject: [PATCH 10/16] chore(specsync): refresh review fix evidence --- .../approvals.json | 336 ++++++++++++++++++ .../state.json | 2 +- .../verification-attempts.json | 15 + .../verification.json | 28 +- 4 files changed, 366 insertions(+), 15 deletions(-) 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 index c31d3cf8..8e58849b 100644 --- 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 @@ -48,6 +48,13 @@ "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." } ], "reopenings": [ @@ -708,6 +715,335 @@ }, "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" } ] } 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 index c5d0b928..0f9229bd 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785340962, + "updated_at": 1785342058, "affected_specs": [ "aps-cli" ], 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 index 2bf3b7a8..16d75406 100644 --- 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 @@ -90,6 +90,21 @@ } ], "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": [] } ] } 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 index 6b569780..218b81be 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785340957, - "commit": "2f13cde531c3953d1f821b15a699449d0a1e6f03", + "timestamp": 1785342053, + "commit": "5574c48824513a06961699b3da0d6728b7b372d3", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "da4c8bb24a069922d6e6f698130660938df9fbc76db2e9ff4d2251b568164b5c", - "acceptance_input_digest": "df73ff87f4058a7fee196224182a05cd5c1bc9bd7dab39cd43ca61b33e360d46", + "workspace_digest": "e8184fcdb2e7740e5655c36f62b737aec4a60f11498d32a613d04b47a6230972", + "acceptance_input_digest": "5e7f0b5431c16fba6939b6209cf2b4447268ce93fa88aff554ca28ceee944842", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -31,8 +31,8 @@ "path": "Scripts/test-examples.sh", "kind": "file", "mode": 33261, - "payload_digest": "77a4dbd5d03be0f93cd0bb1fa6a1c1970053749cbd490392e5e8f59c2db77a1e", - "entry_digest": "9e766466f2a742baefbd9daa57126ed48dd4272af55268dd9c3341de43188754", + "payload_digest": "6ef42d0fb8ca6b2282c75a25c9c10f6ce54b32f60fc569647adb04cb9d20eabc", + "entry_digest": "6ad985cbc5bb9558a1d43919659a0d46ef59f3fc819f60a2955a3acd1ec8f700", "owners": [ "@exact:delivery" ] @@ -111,8 +111,8 @@ "path": "docs/use-cases.md", "kind": "file", "mode": 33188, - "payload_digest": "591c2d0cf018503f1c8e287e4882463d54a1a7203f41d3165d6ccb9408f98865", - "entry_digest": "38ea652296f0d51aa743ebaf1d9a1fe528a83d7737fef1fa668a75fbf6fc7d04", + "payload_digest": "6e866d95079eefd6656b0750fe5c157d5a09a10a30a304788861b7ce6c712e48", + "entry_digest": "093728cc13bd86bab3f36fa7fc0d30c74ef4d9c6b159631a87456fcc53ad0367", "owners": [ "@exact:delivery" ] @@ -151,8 +151,8 @@ "path": "examples/agent-memory/README.md", "kind": "file", "mode": 33188, - "payload_digest": "292f24548e6e460525e0b9bb184b689a6dbab3cf56519d98f6c2637bdbc7845a", - "entry_digest": "2a375f0176f357aad9e71c705d977aae2203506944278098658f1f5df1d2dc2f", + "payload_digest": "ce5cffc97271f61d417f3996f3ef5abac12ba5afaea42b1d14858f6adccec5b2", + "entry_digest": "ba688656a02caa548cb996b4f7eb826646fb9c6fbbf2cee0f5cd9a6b0358f766", "owners": [ "@exact:delivery" ] @@ -191,8 +191,8 @@ "path": "examples/release-pipeline/README.md", "kind": "file", "mode": 33188, - "payload_digest": "9390614a85b20add9e5c0e617ffc39d38a27af03af1951a6c23705dbc90f0ef2", - "entry_digest": "ed13c8f6ac65192a5f8f68dfadd3c837d86d2e4c31bffb0eb3424bb5bf486e4b", + "payload_digest": "c7bc04262eb8c6f21b4d8e57b7e4d3f911af2c90d373458766ad92f3b6ae9f5d", + "entry_digest": "aa71cb5703ad1ae27d76ec2e243d48d60c1a1f16686892639f73763ac7489330", "owners": [ "@exact:delivery" ] @@ -201,8 +201,8 @@ "path": "examples/release-pipeline/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "3ebc618325038a9a71f71278de56a897bcc536848bd00f77541f29a61f1d3ddd", - "entry_digest": "87d4b5c6702ff0ad0d4c10d42f8e6ee72480a6fad5e2ac72fdf75f48a6e0c7b8", + "payload_digest": "ecad9bf48d87168f04e720d16950b256876a3cac0728efdfec660e8fe0ac8553", + "entry_digest": "03a9bce4bdb9b0345402d2af8be837ed395f665d8b1d42d658c3bc1c5b12529a", "owners": [ "@exact:delivery" ] From 27eec40659a5756d53758309214059164f0b4286 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:34:44 -0600 Subject: [PATCH 11/16] fix(examples): make guided workflows copy-paste safe --- Scripts/test-examples.sh | 5 +++++ docs/use-cases.md | 11 ++++++++--- examples/github-actions/workflow.yml | 12 ++++++------ examples/release-pipeline/README.md | 6 +++--- examples/release-pipeline/run.sh | 1 + 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh index 1e95cc63..25f74631 100755 --- a/Scripts/test-examples.sh +++ b/Scripts/test-examples.sh @@ -41,6 +41,7 @@ test "$(APS_HOME="$fixture_root/release" "$aps_bin" get releaseTestsPassed)" = " 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" @@ -48,6 +49,7 @@ 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" \ @@ -56,6 +58,7 @@ 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" @@ -69,6 +72,8 @@ 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 diff --git a/docs/use-cases.md b/docs/use-cases.md index 680f78af..68fedc51 100644 --- a/docs/use-cases.md +++ b/docs/use-cases.md @@ -61,9 +61,14 @@ fresh aps process. Release automation can expose its current candidate and phase: ```bash -aps set releasePhase verifying -aps set releaseTestsPassed true -aps set riskVerdict proceed +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. diff --git a/examples/github-actions/workflow.yml b/examples/github-actions/workflow.yml index 9e8de7b4..546ec47e 100644 --- a/examples/github-actions/workflow.yml +++ b/examples/github-actions/workflow.yml @@ -9,14 +9,14 @@ permissions: jobs: prepare: runs-on: ubuntu-latest - env: - APS_HOME: ${{ runner.temp }}/aps-home 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 \ @@ -31,13 +31,11 @@ jobs: - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: aps-state - path: ${{ env.APS_HOME }} + path: ${{ runner.temp }}/aps-home consume: needs: prepare runs-on: ubuntu-latest - env: - APS_HOME: ${{ runner.temp }}/aps-home steps: - uses: 0xLeif/aps-cli/.github/actions/install-aps@7373d124ebb3823c1f7f19651dfffe4d7ed83f51 with: @@ -46,9 +44,11 @@ jobs: - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: aps-state - path: ${{ env.APS_HOME }} + 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" diff --git a/examples/release-pipeline/README.md b/examples/release-pipeline/README.md index 2a589960..f6975616 100644 --- a/examples/release-pipeline/README.md +++ b/examples/release-pipeline/README.md @@ -20,6 +20,6 @@ APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" watch releasePhase --jsonl --ti 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 `releaseTestsPassed` to -`false` and `riskVerdict` to `pending`; provide new gate results only after -evaluating that candidate. +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 index cffa0aa8..bfe3dcf3 100755 --- a/examples/release-pipeline/run.sh +++ b/examples/release-pipeline/run.sh @@ -42,6 +42,7 @@ if [[ -n "${CANDIDATE_COMMIT+x}" ]]; then "$aps_bin" set candidateCommit "$CANDIDATE_COMMIT" >/dev/null 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 From 424b14bafd6d2bd0a9a994c126ab5947395fc43e Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:36:21 -0600 Subject: [PATCH 12/16] chore(specsync): refresh copy-paste evidence --- .../approvals.json | 336 ++++++++++++++++++ .../state.json | 2 +- .../verification-attempts.json | 15 + .../verification.json | 28 +- 4 files changed, 366 insertions(+), 15 deletions(-) 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 index 8e58849b..229acc5d 100644 --- 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 @@ -55,6 +55,13 @@ "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." } ], "reopenings": [ @@ -1044,6 +1051,335 @@ }, "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" } ] } 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 index 0f9229bd..8edde612 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785342058, + "updated_at": 1785342976, "affected_specs": [ "aps-cli" ], 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 index 16d75406..bbc16724 100644 --- 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 @@ -105,6 +105,21 @@ } ], "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": [] } ] } 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 index 218b81be..1b8b1bce 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785342053, - "commit": "5574c48824513a06961699b3da0d6728b7b372d3", + "timestamp": 1785342971, + "commit": "27eec40659a5756d53758309214059164f0b4286", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "e8184fcdb2e7740e5655c36f62b737aec4a60f11498d32a613d04b47a6230972", - "acceptance_input_digest": "5e7f0b5431c16fba6939b6209cf2b4447268ce93fa88aff554ca28ceee944842", + "workspace_digest": "7a25a434cb66ec5e457160fc5b866feb36e0a9368b491c46a0276063ad096dc9", + "acceptance_input_digest": "bfdb3ed138189aad5daabce46e422de41aba234613632b7149a1bcc062e03705", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -31,8 +31,8 @@ "path": "Scripts/test-examples.sh", "kind": "file", "mode": 33261, - "payload_digest": "6ef42d0fb8ca6b2282c75a25c9c10f6ce54b32f60fc569647adb04cb9d20eabc", - "entry_digest": "6ad985cbc5bb9558a1d43919659a0d46ef59f3fc819f60a2955a3acd1ec8f700", + "payload_digest": "d3d36199917c72e8e8f0e8656c933f2de25a62d8478b075185330dd526df68f0", + "entry_digest": "b21aebf65ebf45e3932d52d12b9114268dae065c584d188e0075e1e60d8c731d", "owners": [ "@exact:delivery" ] @@ -111,8 +111,8 @@ "path": "docs/use-cases.md", "kind": "file", "mode": 33188, - "payload_digest": "6e866d95079eefd6656b0750fe5c157d5a09a10a30a304788861b7ce6c712e48", - "entry_digest": "093728cc13bd86bab3f36fa7fc0d30c74ef4d9c6b159631a87456fcc53ad0367", + "payload_digest": "0ff73c397b15f712c98e5ff0af6f5de30c276ed1aec106ba94e1e80c7e5a4006", + "entry_digest": "3108739f96a1883df20f8f724fee6bc7aa6bd362eed3583510141544d23089fd", "owners": [ "@exact:delivery" ] @@ -181,8 +181,8 @@ "path": "examples/github-actions/workflow.yml", "kind": "file", "mode": 33188, - "payload_digest": "656947959de8020a59c935be59d46e134c22ba3937aa891f1f7b59eb601caed6", - "entry_digest": "cbbb1bbfc7fa0c473924f3fcc993d6ea843fd78c19f44669d015914346251e96", + "payload_digest": "26e85c734d251f9fe460b8be1612de0ff532d5f51056d8ac95ec1cba36b1b87d", + "entry_digest": "7dad8764a2e11a0c8bb4d416a7b08b3e2f6d3304ef5f2460cf5705cafdd85362", "owners": [ "@exact:delivery" ] @@ -191,8 +191,8 @@ "path": "examples/release-pipeline/README.md", "kind": "file", "mode": 33188, - "payload_digest": "c7bc04262eb8c6f21b4d8e57b7e4d3f911af2c90d373458766ad92f3b6ae9f5d", - "entry_digest": "aa71cb5703ad1ae27d76ec2e243d48d60c1a1f16686892639f73763ac7489330", + "payload_digest": "0e71466a197fa8891b53094a2ec36d73f2dff142ecf0733ff2e72793970074a8", + "entry_digest": "cdd895463c0aaf8941a8e05d4b2692809b8fa872c6b458d8055bcc45553f8e40", "owners": [ "@exact:delivery" ] @@ -201,8 +201,8 @@ "path": "examples/release-pipeline/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "ecad9bf48d87168f04e720d16950b256876a3cac0728efdfec660e8fe0ac8553", - "entry_digest": "03a9bce4bdb9b0345402d2af8be837ed395f665d8b1d42d658c3bc1c5b12529a", + "payload_digest": "03f97fc7786320f470db9c7795bb2726e9ff9cf2f9e9ea39e05830afe7fd6d17", + "entry_digest": "bbaf4d8009f7e596fc912618ede87ddd7a8c980e8842f32222467eb63cd182d2", "owners": [ "@exact:delivery" ] From 699bdd6b6b3584e67b8525aa447ddfe4dc5dda0f Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:44:23 -0600 Subject: [PATCH 13/16] fix(examples): make Swift harness launcher portable --- Scripts/test-examples.sh | 4 ++ examples/swift-harness/StateHarness.swift | 53 ++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh index 25f74631..375b1165 100755 --- a/Scripts/test-examples.sh +++ b/Scripts/test-examples.sh @@ -66,6 +66,10 @@ 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" diff --git a/examples/swift-harness/StateHarness.swift b/examples/swift-harness/StateHarness.swift index 3cf8c17d..f80effc4 100644 --- a/examples/swift-harness/StateHarness.swift +++ b/examples/swift-harness/StateHarness.swift @@ -2,11 +2,14 @@ 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" } } } @@ -27,8 +30,8 @@ internal struct StateHarness { let output = Pipe() let errors = Pipe() - process.executableURL = URL(fileURLWithPath: "/usr/bin/env") - process.arguments = [apsBinary] + arguments + process.executableURL = try executableURL(for: apsBinary) + process.arguments = arguments process.standardOutput = output process.standardError = errors @@ -47,4 +50,50 @@ internal struct StateHarness { } return outputData } + + private static func executableURL(for executable: String) throws -> URL { + let fileManager = FileManager.default + let environment = ProcessInfo.processInfo.environment + + if executable.contains("/") || executable.contains("\\") { + let directURL = URL(fileURLWithPath: executable).standardizedFileURL + guard isExecutable(directURL, fileManager: fileManager) else { + throw HarnessError.executableNotFound(executable) + } + return directURL + } + + #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 pathEntries = (environment["PATH"] ?? "") + .split(separator: pathSeparator) + .map(String.init) + for pathEntry in pathEntries { + for extensionName in extensions { + let candidate = URL(fileURLWithPath: pathEntry) + .appendingPathComponent(executable + extensionName) + 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 + } } From 9589be088408f24eeb2f94084c6833e6f5f0ee13 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:45:59 -0600 Subject: [PATCH 14/16] chore(specsync): refresh portable harness evidence --- .../approvals.json | 336 ++++++++++++++++++ .../state.json | 2 +- .../verification-attempts.json | 15 + .../verification.json | 16 +- 4 files changed, 360 insertions(+), 9 deletions(-) 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 index 229acc5d..953d5396 100644 --- 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 @@ -62,6 +62,13 @@ "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." } ], "reopenings": [ @@ -1380,6 +1387,335 @@ }, "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" } ] } 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 index 8edde612..7f53551c 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785342976, + "updated_at": 1785343556, "affected_specs": [ "aps-cli" ], 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 index bbc16724..79299b34 100644 --- 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 @@ -120,6 +120,21 @@ } ], "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": [] } ] } 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 index 1b8b1bce..c5cc4c7b 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785342971, - "commit": "27eec40659a5756d53758309214059164f0b4286", + "timestamp": 1785343551, + "commit": "699bdd6b6b3584e67b8525aa447ddfe4dc5dda0f", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "7a25a434cb66ec5e457160fc5b866feb36e0a9368b491c46a0276063ad096dc9", - "acceptance_input_digest": "bfdb3ed138189aad5daabce46e422de41aba234613632b7149a1bcc062e03705", + "workspace_digest": "2d134d41619b9a533b9a6cf98ed352a25e4b069b6a7ec7b7a1ecf99597e1a808", + "acceptance_input_digest": "af1b0bf8e1c3816c0bd9b53728835fabc60e6ffaea2a214332724c9dbd2c689c", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -31,8 +31,8 @@ "path": "Scripts/test-examples.sh", "kind": "file", "mode": 33261, - "payload_digest": "d3d36199917c72e8e8f0e8656c933f2de25a62d8478b075185330dd526df68f0", - "entry_digest": "b21aebf65ebf45e3932d52d12b9114268dae065c584d188e0075e1e60d8c731d", + "payload_digest": "7d31b7e608a745927bcdd5345c32d5e3107480911ef4e7a984a7398ceb77de5d", + "entry_digest": "9a973ad6f6ced02d419adc9f48dbd0173f7b4086d7812bc290776a37a5e5ca0f", "owners": [ "@exact:delivery" ] @@ -221,8 +221,8 @@ "path": "examples/swift-harness/StateHarness.swift", "kind": "file", "mode": 33188, - "payload_digest": "5843d8e5acca74dc6441bc0b406c51516eeef12761e2bd37075013f9b21a6c27", - "entry_digest": "7d1f5ca64655ae4f786957dde41529e50dc09e88872af38d2d40d45ced215d31", + "payload_digest": "44d92e57d926164e8d7a7e7a3c375ebc2d7fc411988778804ead9c45327a3d8a", + "entry_digest": "f05317c8732996279ca925b56b976e1101224a6fe4e427893b03304b81c4a2a6", "owners": [ "@exact:delivery" ] From c4e7d71ad334ebefb35cbbb669f54abfee0d8935 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:55:39 -0600 Subject: [PATCH 15/16] fix(examples): make checkpoint output safe and atomic --- Scripts/test-examples.sh | 12 ++++++++++- examples/agent-memory/README.md | 5 ++++- examples/agent-memory/run.sh | 17 +++++++++++++-- examples/release-pipeline/README.md | 2 +- examples/release-pipeline/run.sh | 25 +++++++++++++++++++---- examples/swift-harness/StateHarness.swift | 25 ++++++++++++++--------- 6 files changed, 67 insertions(+), 19 deletions(-) diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh index 375b1165..e2caa853 100755 --- a/Scripts/test-examples.sh +++ b/Scripts/test-examples.sh @@ -21,6 +21,11 @@ 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" \ @@ -36,6 +41,11 @@ 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" @@ -101,7 +111,7 @@ do grep -Fq "../examples/$example/" "$repo_root/docs/use-cases.md" done grep -Fq '../examples/' "$repo_root/docs/README.md" -grep -Fq '${APS_BIN:-aps}' "$repo_root/examples/agent-memory/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 \ diff --git a/examples/agent-memory/README.md b/examples/agent-memory/README.md index 47c901c0..9b03929c 100644 --- a/examples/agent-memory/README.md +++ b/examples/agent-memory/README.md @@ -12,9 +12,12 @@ TESTS_PASSED=false \ BLOCKER="" \ ./examples/agent-memory/run.sh -APS_HOME="$PWD/.agents/codex" "${APS_BIN:-aps}" dump --json +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 diff --git a/examples/agent-memory/run.sh b/examples/agent-memory/run.sh index 2c77f31f..78495950 100755 --- a/examples/agent-memory/run.sh +++ b/examples/agent-memory/run.sh @@ -8,10 +8,23 @@ ensure_key() { local name="$1" shift if ! "$aps_bin" keys --quiet | grep -Fxq "$name"; then - "$aps_bin" key add "$name" "$@" + "$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" @@ -44,4 +57,4 @@ if [[ -n "${BLOCKER+x}" ]]; then "$aps_bin" set blocker "$BLOCKER" >/dev/null fi -"$aps_bin" dump --json +emit_checkpoint diff --git a/examples/release-pipeline/README.md b/examples/release-pipeline/README.md index f6975616..b68117e7 100644 --- a/examples/release-pipeline/README.md +++ b/examples/release-pipeline/README.md @@ -14,7 +14,7 @@ test result, and risk verdict. A release script, agent, or terminal dashboard can inspect it with: ```bash -APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" dump --json +APS_HOME="$PWD/.release-state" ./examples/release-pipeline/run.sh APS_HOME="$PWD/.release-state" "${APS_BIN:-aps}" watch releasePhase --jsonl --timeout 300 ``` diff --git a/examples/release-pipeline/run.sh b/examples/release-pipeline/run.sh index bfe3dcf3..d67c09cc 100755 --- a/examples/release-pipeline/run.sh +++ b/examples/release-pipeline/run.sh @@ -8,10 +8,23 @@ ensure_key() { local name="$1" shift if ! "$aps_bin" keys --quiet | grep -Fxq "$name"; then - "$aps_bin" key add "$name" "$@" + "$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" @@ -33,19 +46,23 @@ if [[ -n "${RELEASE_VERSION+x}" ]]; then if [[ "$("$aps_bin" get releaseVersion)" != "$RELEASE_VERSION" ]]; then candidate_changed=true fi - "$aps_bin" set releaseVersion "$RELEASE_VERSION" >/dev/null fi if [[ -n "${CANDIDATE_COMMIT+x}" ]]; then if [[ "$("$aps_bin" get candidateCommit)" != "$CANDIDATE_COMMIT" ]]; then candidate_changed=true fi - "$aps_bin" set candidateCommit "$CANDIDATE_COMMIT" >/dev/null 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 @@ -56,4 +73,4 @@ if [[ -n "${RISK_VERDICT+x}" ]]; then "$aps_bin" set riskVerdict "$RISK_VERDICT" >/dev/null fi -"$aps_bin" dump --json +emit_checkpoint diff --git a/examples/swift-harness/StateHarness.swift b/examples/swift-harness/StateHarness.swift index f80effc4..b525e934 100644 --- a/examples/swift-harness/StateHarness.swift +++ b/examples/swift-harness/StateHarness.swift @@ -55,14 +55,6 @@ internal struct StateHarness { let fileManager = FileManager.default let environment = ProcessInfo.processInfo.environment - if executable.contains("/") || executable.contains("\\") { - let directURL = URL(fileURLWithPath: executable).standardizedFileURL - guard isExecutable(directURL, fileManager: fileManager) else { - throw HarnessError.executableNotFound(executable) - } - return directURL - } - #if os(Windows) let pathSeparator: Character = ";" let extensions = (environment["PATHEXT"] ?? ".EXE;.CMD;.BAT") @@ -73,13 +65,26 @@ internal struct StateHarness { 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 extensionName in extensions { + for executableName in executableNames { let candidate = URL(fileURLWithPath: pathEntry) - .appendingPathComponent(executable + extensionName) + .appendingPathComponent(executableName) if isExecutable(candidate, fileManager: fileManager) { return candidate } From 484693adbc82bc9950ea825b934b8575eb449aa4 Mon Sep 17 00:00:00 2001 From: 0xLeif Date: Wed, 29 Jul 2026 10:57:22 -0600 Subject: [PATCH 16/16] chore(specsync): refresh safe checkpoint evidence --- .../approvals.json | 336 ++++++++++++++++++ .../state.json | 2 +- .../verification-attempts.json | 15 + .../verification.json | 32 +- 4 files changed, 368 insertions(+), 17 deletions(-) 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 index 953d5396..21149651 100644 --- 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 @@ -69,6 +69,13 @@ "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": [ @@ -1716,6 +1723,335 @@ }, "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/state.json b/.specsync/changes/CHG-0065-add-runnable-agent-ci-swift-integration-and-release-pipeline-examples-with-re/state.json index 7f53551c..3dbb7f97 100644 --- 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 @@ -9,7 +9,7 @@ "canonical_applied": true, "base_commit": "5a14806518b38ffdb5143c3115f1761689f8c749", "created_at": 1785333608, - "updated_at": 1785343556, + "updated_at": 1785344239, "affected_specs": [ "aps-cli" ], 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 index 79299b34..7962444e 100644 --- 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 @@ -135,6 +135,21 @@ } ], "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 index c5cc4c7b..db853381 100644 --- 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 @@ -1,9 +1,9 @@ { - "timestamp": 1785343551, - "commit": "699bdd6b6b3584e67b8525aa447ddfe4dc5dda0f", + "timestamp": 1785344234, + "commit": "c4e7d71ad334ebefb35cbbb669f54abfee0d8935", "contract_digest": "85242c6d7e18a7e56480153d437ddefe8086c2a25c72df7afe6073f4e8f9ac00", - "workspace_digest": "2d134d41619b9a533b9a6cf98ed352a25e4b069b6a7ec7b7a1ecf99597e1a808", - "acceptance_input_digest": "af1b0bf8e1c3816c0bd9b53728835fabc60e6ffaea2a214332724c9dbd2c689c", + "workspace_digest": "5a4c3896bd0c89603c4686ab7888831af46a383104cb00b983448b7e36f07ce2", + "acceptance_input_digest": "3767af6467f4424cd0fc682f8de755cf6ef0ea3c1afc1cde9f7751227af6a392", "acceptance_manifest": { "schema_version": 1, "entries": [ @@ -31,8 +31,8 @@ "path": "Scripts/test-examples.sh", "kind": "file", "mode": 33261, - "payload_digest": "7d31b7e608a745927bcdd5345c32d5e3107480911ef4e7a984a7398ceb77de5d", - "entry_digest": "9a973ad6f6ced02d419adc9f48dbd0173f7b4086d7812bc290776a37a5e5ca0f", + "payload_digest": "e6e809f675109335cefd4603c6e62ef4a29f0f04236cf7004b196b75ce206853", + "entry_digest": "11b2cfe1d878e29052ae3ed5eda81b2ca3c44095653270e8bf1c05fcaeb1a1ac", "owners": [ "@exact:delivery" ] @@ -151,8 +151,8 @@ "path": "examples/agent-memory/README.md", "kind": "file", "mode": 33188, - "payload_digest": "ce5cffc97271f61d417f3996f3ef5abac12ba5afaea42b1d14858f6adccec5b2", - "entry_digest": "ba688656a02caa548cb996b4f7eb826646fb9c6fbbf2cee0f5cd9a6b0358f766", + "payload_digest": "86e3ee21bd27ec8101812d50bba3edb03d852524181f131671ead1efac7b4ade", + "entry_digest": "685026fda5c58ad6e141a1d66b8b5d424b4d9f2df775f8839f215c8a85889c6b", "owners": [ "@exact:delivery" ] @@ -161,8 +161,8 @@ "path": "examples/agent-memory/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "ebe6fb98670f7650378f277ce39a49f476d815eb503d5adce3b637cca6779caa", - "entry_digest": "7df235104e29e50a6746fae689a53059ed7f6bc9256694e765cc9d262fb8f649", + "payload_digest": "8170050a9d43811c6adbb65be0360ecd4f0fe1158e9f4a0e39417ab74a8685d0", + "entry_digest": "2254ef9bcdb7b42baa2d3c027d22442c7db2caef8adf06dbbdbd39a4b7097b4f", "owners": [ "@exact:delivery" ] @@ -191,8 +191,8 @@ "path": "examples/release-pipeline/README.md", "kind": "file", "mode": 33188, - "payload_digest": "0e71466a197fa8891b53094a2ec36d73f2dff142ecf0733ff2e72793970074a8", - "entry_digest": "cdd895463c0aaf8941a8e05d4b2692809b8fa872c6b458d8055bcc45553f8e40", + "payload_digest": "b29bdf02f8861bfdfa0f4616a09ae672ac4bd293863eaa01c36015d7806ab7be", + "entry_digest": "3f080322f506676594e4e6324c3b8e7470984b56b6455d5559f4b03ea265424e", "owners": [ "@exact:delivery" ] @@ -201,8 +201,8 @@ "path": "examples/release-pipeline/run.sh", "kind": "file", "mode": 33261, - "payload_digest": "03f97fc7786320f470db9c7795bb2726e9ff9cf2f9e9ea39e05830afe7fd6d17", - "entry_digest": "bbaf4d8009f7e596fc912618ede87ddd7a8c980e8842f32222467eb63cd182d2", + "payload_digest": "507139d7a5035fd4c8cfe641afdabc377e4c223885692dbb2a014ad5162bf3af", + "entry_digest": "954c414c0fdcc014854aef1b76916d6a31f6df51394901039cede5e432dde104", "owners": [ "@exact:delivery" ] @@ -221,8 +221,8 @@ "path": "examples/swift-harness/StateHarness.swift", "kind": "file", "mode": 33188, - "payload_digest": "44d92e57d926164e8d7a7e7a3c375ebc2d7fc411988778804ead9c45327a3d8a", - "entry_digest": "f05317c8732996279ca925b56b976e1101224a6fe4e427893b03304b81c4a2a6", + "payload_digest": "55085dea0290145f4b6e70ad1106b5d3da13005b7a82b659870c4f3e6092f935", + "entry_digest": "fbd78e671ee4ed799c9e3578026453fe722bb957f82314f3c246a22eabc5858e", "owners": [ "@exact:delivery" ]