Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
431e35e
fix(docs): accept proposed status in ADR frontmatter schema
yordis Jul 16, 2026
aa7480c
docs(adr): record decider platform authorization, tenancy, admission,…
yordis Jul 16, 2026
c0cff15
feat(decider): make wire error codes, resulting state, and codec roun…
yordis Jul 16, 2026
81b615e
revert(scheduler-domain): withdraw wire error-code assignments pendin…
yordis Jul 16, 2026
902743c
chore(decider-runtime): drop never-compiled leftover codec test files
yordis Jul 16, 2026
441d21b
feat(decider-runtime): recover from unusable snapshots and let hosts …
yordis Jul 16, 2026
84235bd
perf(decider-nats): replay only the subject's own events and survive …
yordis Jul 16, 2026
b88614a
feat(decider-wasm): support Act decisions, structured guest errors, a…
yordis Jul 16, 2026
35ba1a4
feat(decider-wasm): allow live module rollout without a process restart
yordis Jul 16, 2026
9d044dc
feat(decider-sim): match production limits, chain multi-step scenario…
yordis Jul 16, 2026
c4f563d
feat(decider-nats): give consumers provisioning, projection, and proc…
yordis Jul 16, 2026
b77ad73
feat(decider-sim): prove native and wasm deciders agree through one s…
yordis Jul 16, 2026
4c032f8
feat(decider): make command execution, replay, and guest runs observable
yordis Jul 16, 2026
ee219ad
ci: keep workflow files free of inline scripting
yordis Jul 16, 2026
9f6a18d
ci: resolve the repo root from the runner or git instead of script lo…
yordis Jul 16, 2026
5172347
docs(decider): give the platform an architecture guide and a fully do…
yordis Jul 16, 2026
6f4f09d
ci: move the multi-line wasm-components task out of mise config
yordis Jul 16, 2026
3222cc1
docs(adr): use the draft lifecycle state instead of inventing a propo…
yordis Jul 16, 2026
cff5902
refactor(decider)!: drop the per-variant wire error-code hook
yordis Jul 16, 2026
3518d32
fix(decider-test): keep suite payloads human-readable
yordis Jul 17, 2026
6dfd5f3
Merge remote-tracking branch 'origin/main' into yordis/decider-platfo…
yordis Jul 17, 2026
a1f9f48
fix(decider): satisfy the module-level use policy and coverage builds
yordis Jul 17, 2026
d3aaed0
feat(decider-wasm): mirror native snapshot failure recovery
yordis Jul 17, 2026
179150b
fix(decider-nats): keep broker-bound replay test out of coverage builds
yordis Jul 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .config/mise/tasks/artifacts/wasm-components
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
#MISE description="Build every rsworkspace/wasm-components/* decider to dist/decider/<name>.wasm"
#MISE depends=["proto:schedules-descriptor-set", "rust:wasm-target"]
#
# `proto:schedules-descriptor-set` only feeds the schedules component's own dist
# artifact (copied below when present); it is not required by, and does not
# block, other components.
set -euo pipefail

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT/rsworkspace"

mkdir -p dist/decider
for manifest in wasm-components/*/Cargo.toml; do
crate_dir="$(dirname "$manifest")"
crate="$(basename "$crate_dir")"
crate_file="${crate//-/_}"
alias="${crate#trogon-}"
alias="${alias%-decider}"
cargo component build -p "$crate" --target wasm32-unknown-unknown --release
cp "target/wasm32-unknown-unknown/release/${crate_file}.wasm" "dist/decider/${alias}.wasm"
binpb="target/wasm32-unknown-unknown/release/${crate_file}.binpb"
if [[ -f "$binpb" ]]; then
cp "$binpb" "dist/decider/${alias}.binpb"
fi
done
15 changes: 15 additions & 0 deletions .config/mise/tasks/github-actions/build-release-binary
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
#MISE description="Build the acp-nats-stdio release binary for TARGET, via cross when USE_CROSS=true"
set -euo pipefail

: "${USE_CROSS:?USE_CROSS is required}"
: "${TARGET:?TARGET is required}"

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT/rsworkspace"

if [[ "$USE_CROSS" == "true" ]]; then
cross build --release --target "$TARGET" -p acp-nats-stdio
else
cargo build --release --target "$TARGET" -p acp-nats-stdio
fi
21 changes: 21 additions & 0 deletions .config/mise/tasks/github-actions/decider-test-suites
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
#MISE description="Run wasm decider conformance: sim schedules suite, macro compile-fail tests, and every decider-test YAML fixture"
set -euo pipefail

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT/rsworkspace"

cargo test -p trogon-decider-sim --test schedules --features test-support
cargo test -p trogon-decider-guest-macros --test compile_fail
cargo build -p trogon-decider-test --release

shopt -s nullglob
for wasm in dist/decider/*.wasm; do
alias="$(basename "$wasm" .wasm)"
yaml="cli/trogon-decider-test/${alias}.yaml"
if [[ -f "$yaml" ]]; then
./target/release/decider-test "$wasm" "$yaml"
else
echo "no decider-test fixture for $alias ($yaml not found); skipping"
fi
done
16 changes: 16 additions & 0 deletions .config/mise/tasks/github-actions/dylint-tests
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
#MISE description="Run the repo Rust policy lint crate's own tests on its pinned dylint toolchain"
set -euo pipefail

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT/rsworkspace/dylints/trogon_lints"

dylint_toolchain="$(python - <<'PY'
import tomllib

with open("rust-toolchain.toml", "rb") as toolchain_file:
print(tomllib.load(toolchain_file)["toolchain"]["channel"])
PY
)"

rustup run "$dylint_toolchain" cargo test
22 changes: 22 additions & 0 deletions .config/mise/tasks/github-actions/image-audit-summary
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
#MISE description="Append the canary image security audit report to GITHUB_STEP_SUMMARY"
set -euo pipefail

: "${SERVICE:?SERVICE is required}"
: "${IMAGE_NAME:?IMAGE_NAME is required}"
: "${IMAGE_DIGEST:?IMAGE_DIGEST is required}"
: "${RUNTIME_BASE:?RUNTIME_BASE is required}"
: "${GITHUB_STEP_SUMMARY:?GITHUB_STEP_SUMMARY is required}"

{
echo "## Image security audit: \`${SERVICE}\`"
echo ""
echo "- Image: \`${IMAGE_NAME}@${IMAGE_DIGEST}\`"
echo "- Runtime base: \`${RUNTIME_BASE}\`"
echo "- SBOM artifact: \`sbom-${SERVICE}-spdx\` (SPDX JSON)"
echo ""
echo "### Vulnerability scan (Trivy, image packages)"
echo '```text'
cat trivy-results.txt
echo '```'
} >>"$GITHUB_STEP_SUMMARY"
16 changes: 16 additions & 0 deletions .config/mise/tasks/github-actions/package-release-binary
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
#MISE description="Package the built acp-nats-stdio binary into a versioned tarball and export ASSET via GITHUB_ENV"
set -euo pipefail

: "${VERSION:?VERSION is required}"
: "${TARGET:?TARGET is required}"
: "${GITHUB_ENV:?GITHUB_ENV is required}"

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT"

staging="acp-nats-stdio-${VERSION}-${TARGET}"
mkdir -p "$staging"
cp "rsworkspace/target/${TARGET}/release/acp-nats-stdio" "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >>"$GITHUB_ENV"
10 changes: 10 additions & 0 deletions .config/mise/tasks/github-actions/release-upload
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
#MISE description="Create the GitHub release for the current tag if missing and upload all artifacts"
set -euo pipefail

: "${GITHUB_REF_NAME:?GITHUB_REF_NAME is required}"
: "${GH_TOKEN:?GH_TOKEN is required}"

gh release view "$GITHUB_REF_NAME" ||
gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --generate-notes
gh release upload "$GITHUB_REF_NAME" artifacts/* --clobber
12 changes: 12 additions & 0 deletions .config/mise/tasks/github-actions/resolve-image
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/env bash
#MISE description="Resolve the canary container image name and short SHA into GITHUB_OUTPUT"
set -euo pipefail

: "${IMAGE_OWNER:?IMAGE_OWNER is required}"
: "${SERVICE_IMAGE:?SERVICE_IMAGE is required}"
: "${GITHUB_SHA:?GITHUB_SHA is required}"
: "${GITHUB_OUTPUT:?GITHUB_OUTPUT is required}"

owner_lower="$(tr '[:upper:]' '[:lower:]' <<<"$IMAGE_OWNER")"
echo "name=ghcr.io/${owner_lower}/${SERVICE_IMAGE}" >>"$GITHUB_OUTPUT"
echo "short_sha=${GITHUB_SHA:0:7}" >>"$GITHUB_OUTPUT"
23 changes: 23 additions & 0 deletions .config/mise/tasks/github-actions/wasm-validate
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
#MISE description="Assert every built decider component declares zero imports and passes wasm validation"
set -euo pipefail

ROOT="${GITHUB_WORKSPACE:-$(git rev-parse --show-toplevel)}"
cd "$ROOT"

shopt -s nullglob
components=(rsworkspace/dist/decider/*.wasm)
if [[ ${#components[@]} -eq 0 ]]; then
echo "no decider components found under rsworkspace/dist/decider; run 'mise run artifacts:wasm-components' first" >&2
exit 1
fi

for wasm in "${components[@]}"; do
wit_text="$(wasm-tools component wit "$wasm")"
printf '%s\n' "$wit_text"
if grep -E '^[[:space:]]*import ' <<<"$wit_text"; then
echo "component declares imports: $wasm" >&2
exit 1
fi
wasm-tools validate "$wasm"
done
24 changes: 8 additions & 16 deletions .github/workflows/canary-container-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ jobs:
id: image
env:
IMAGE_OWNER: ${{ github.repository_owner }}
run: |
echo "name=ghcr.io/${IMAGE_OWNER,,}/${{ steps.service_config.outputs.image }}" >> "$GITHUB_OUTPUT"
echo "short_sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
SERVICE_IMAGE: ${{ steps.service_config.outputs.image }}
run: ./.config/mise/tasks/github-actions/resolve-image

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
Expand Down Expand Up @@ -88,16 +87,9 @@ jobs:

- name: Document image security audit
shell: bash
run: |
{
echo "## Image security audit: \`${{ matrix.service }}\`"
echo ""
echo "- Image: \`${{ steps.image.outputs.name }}@${{ steps.build_image.outputs.digest }}\`"
echo "- Runtime base: \`debian:bookworm-20260518-slim\`"
echo "- SBOM artifact: \`sbom-${{ matrix.service }}-spdx\` (SPDX JSON)"
echo ""
echo "### Vulnerability scan (Trivy, image packages)"
echo '```text'
cat trivy-results.txt
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
env:
SERVICE: ${{ matrix.service }}
IMAGE_NAME: ${{ steps.image.outputs.name }}
IMAGE_DIGEST: ${{ steps.build_image.outputs.digest }}
RUNTIME_BASE: debian:bookworm-20260518-slim
run: ./.config/mise/tasks/github-actions/image-audit-summary
36 changes: 6 additions & 30 deletions .github/workflows/ci-rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,7 @@ jobs:
working-directory: rsworkspace

- name: Test repo Rust policy lints
run: |
dylint_toolchain="$(python - <<'PY'
import tomllib

with open("rust-toolchain.toml", "rb") as toolchain_file:
print(tomllib.load(toolchain_file)["toolchain"]["channel"])
PY
)"
rustup run "$dylint_toolchain" cargo test
working-directory: rsworkspace/dylints/trogon_lints
run: mise run github-actions:dylint-tests

- name: Run repo Rust policy lints
run: env -u RUSTUP_TOOLCHAIN cargo dylint --path dylints/trogon_lints --workspace --no-deps -- --all-features --all-targets
Expand Down Expand Up @@ -115,8 +106,7 @@ jobs:
tool: cargo-llvm-cov,nextest

- name: Build decider components for sim fixtures
run: cargo component build -p trogon-schedules-decider --target wasm32-unknown-unknown --release
working-directory: rsworkspace
run: mise run artifacts:wasm-components

- name: Run documentation tests
run: cargo test --doc
Expand Down Expand Up @@ -187,28 +177,14 @@ jobs:
workspaces: rsworkspace -> target
save-if: always

- name: Build schedules decider component
run: cargo component build -p trogon-schedules-decider --target wasm32-unknown-unknown --release
working-directory: rsworkspace
- name: Build decider components
run: mise run artifacts:wasm-components

- name: Assert zero imports and validate
run: |
for WASM in rsworkspace/target/wasm32-unknown-unknown/release/trogon_schedules_decider.wasm; do
wasm-tools component wit "$WASM" | tee /tmp/wit.txt
if grep -E '^[[:space:]]*import ' /tmp/wit.txt; then
echo "component declares imports: $WASM"
exit 1
fi
wasm-tools validate "$WASM"
done
run: mise run github-actions:wasm-validate

- name: Run decider-test suites
run: |
cd rsworkspace
cargo test -p trogon-decider-sim --test schedules --features test-support
cargo test -p trogon-decider-guest-macros --test compile_fail
cargo build -p trogon-decider-test --release
./target/release/decider-test target/wasm32-unknown-unknown/release/trogon_schedules_decider.wasm cli/trogon-decider-test/schedules.yaml
run: mise run github-actions:decider-test-suites

- name: Run wasm decider runtime tests
run: cargo test -p trogon-decider-wasm-runtime
Expand Down
20 changes: 3 additions & 17 deletions .github/workflows/release-artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,29 +59,18 @@ jobs:
tool: cross

- name: Build
working-directory: rsworkspace
shell: bash
env:
USE_CROSS: ${{ matrix.use-cross }}
TARGET: ${{ matrix.target }}
run: |
if [ "$USE_CROSS" = "true" ]; then
cross build --release --target "$TARGET" -p acp-nats-stdio
else
cargo build --release --target "$TARGET" -p acp-nats-stdio
fi
run: mise run github-actions:build-release-binary

- name: Package
shell: bash
env:
VERSION: ${{ steps.version.outputs.version }}
TARGET: ${{ matrix.target }}
run: |
staging="acp-nats-stdio-${VERSION}-${TARGET}"
mkdir -p "$staging"
cp "rsworkspace/target/${TARGET}/release/acp-nats-stdio" "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> "$GITHUB_ENV"
run: mise run github-actions:package-release-binary

- name: Attest build provenance
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
Expand Down Expand Up @@ -119,7 +108,4 @@ jobs:
- name: Upload to GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release view "$GITHUB_REF_NAME" || \
gh release create "$GITHUB_REF_NAME" --title "$GITHUB_REF_NAME" --generate-notes
gh release upload "$GITHUB_REF_NAME" artifacts/* --clobber
run: ./.config/mise/tasks/github-actions/release-upload
9 changes: 2 additions & 7 deletions .mise.toml
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,9 @@ description = "Enforce ADR#0015: fail if native-tls/OpenSSL enter the Rust depen
dir = "rsworkspace"
run = "cargo deny check bans"

[tasks."artifacts:schedules-wasm"]
description = "Build schedules decider WASM artifact to dist/decider/"
depends = ["proto:schedules-descriptor-set", "rust:wasm-target"]
run = "cd rsworkspace && cargo component build -p trogon-schedules-decider --target wasm32-unknown-unknown --release && mkdir -p dist/decider && cp target/wasm32-unknown-unknown/release/trogon_schedules_decider.wasm dist/decider/schedules.wasm && cp target/wasm32-unknown-unknown/release/trogon_schedules_decider.binpb dist/decider/schedules.binpb"

[tasks."artifacts:decider-test"]
description = "Build schedules decider WASM + decider-test CLI"
depends = ["artifacts:schedules-wasm"]
description = "Build every wasm-components/* decider + the decider-test CLI"
depends = ["artifacts:wasm-components"]
run = "cd rsworkspace && cargo build -p trogon-decider-test --release"

[tasks."rsc"]
Expand Down
1 change: 1 addition & 0 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default async () => {
text: "Architecture",
items: [
{ text: "ACP Conformance", link: "/architecture/acp-conformance" },
{ text: "Decider", link: "/architecture/decider" },
{ text: "Event Metadata", link: "/architecture/event-metadata" },
],
},
Expand Down
Loading
Loading