diff --git a/.gc/plan-rules.md b/.gc/plan-rules.md index 1a187eabe..a6ac86517 100644 --- a/.gc/plan-rules.md +++ b/.gc/plan-rules.md @@ -32,18 +32,14 @@ These encode the hard rules previously in `AGENTS.md` prose. concept-authority surfaces. - Plans MUST keep IMPLEMENTS and TESTS traceability in Ground Control aligned with changed code and tests. -- Plans with a user-visible change MUST add a fragment under - `changelog.d/..md` (or `changelog.d/+..md` - for issue-free entries), where `` is one of `breaking`, `security`, - `added`, `changed`, `deprecated`, `removed`, `fixed`. The fragment `` - drives the release version bump (`tools/release.py`): `removed` → major (once - ≥ 1.0; pre-1.0 it is a minor), `added`/`changed`/`deprecated` → minor, - `security`/`fixed` → patch; `breaking` is recorded in the changelog but does - NOT auto-bump (force a major with `release.py --version 1.0.0`). Do not edit - `CHANGELOG.md` directly outside release-collation commits. -- Plans MUST NOT hand-edit the version. It is a single committed literal, - `__version__` in `implementations/python/src/aces/__init__.py`, bumped only by - `tools/release.py` from the pending changelog fragments at release time (#684). - The PR title must still pass the `title-guard` conventional-shape / no-branding - gate (`tools/check_pr_title.py`), but the PR title does NOT drive the version — - only the changelog fragment types do. +- Plans MUST NOT edit `CHANGELOG.md` or add changelog fragments: release-please + owns `CHANGELOG.md` and generates it from the Conventional Commit history on + `main` (#684). There is no `changelog.d/`. +- Plans MUST NOT hand-edit the version (`[project] version` in + `implementations/python/pyproject.toml`); release-please bumps it on release. + Feature PRs squash-merge, so the PR title becomes the commit release-please + reads: `feat:` → minor, `fix:`/`perf:` → patch, `feat!:` / a `BREAKING CHANGE:` + footer → major (pre-1.0 demoted to minor); `docs`/`chore`/`refactor`/`test`/ + `ci`/`build` do not release. Use `feat:`/`fix:` for consumer-visible changes so + release-please actually cuts a release. The PR title MUST still pass the + `title-guard` gate (`tools/check_pr_title.py`). diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 000000000..daf17a642 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,101 @@ +name: Release Please + +# release-please (#684) owns versioning + CHANGELOG.md. On each push to `main` +# it maintains a release PR ("chore(main): release X.Y.Z") that bumps the version +# (in implementations/python/pyproject.toml via extra-files) and updates the +# repo-root CHANGELOG.md from the Conventional Commits since the last release. +# Merging that PR tags `vX.Y.Z` and cuts the GitHub Release; the publish job then +# builds the corpus-bundled wheel/sdist (#537) and publishes to PyPI over OIDC +# trusted publishing. +# +# Feature PRs never touch CHANGELOG.md (release-please owns it) — no fragment +# collisions. The version literal is `[project] version` in the subdir pyproject; +# `aces.__version__` derives from the installed distribution metadata. +# +# Caveat: the release PR is opened by GITHUB_TOKEN, so required CI checks do not +# auto-run on it — admin-merge it, or give release-please a PAT so checks run. +# First release + PyPI setup: docs/explain/releasing.md. +on: + push: + branches: [main] + +permissions: + contents: read + +concurrency: + group: release-please + cancel-in-progress: false + +jobs: + release-please: + runs-on: ubuntu-latest + permissions: + contents: write # create/maintain the release PR, tag, and Release + pull-requests: write # maintain the release PR + outputs: + release_created: ${{ steps.rp.outputs.release_created }} + tag_name: ${{ steps.rp.outputs.tag_name }} + steps: + - uses: googleapis/release-please-action@5c625bfb5d1ff62eadeeb3772007f7f66fdcf071 # v4.4.1 + id: rp + with: + token: ${{ secrets.GITHUB_TOKEN }} + config-file: release-please-config.json + manifest-file: .release-please-manifest.json + + publish: + needs: release-please + if: needs.release-please.outputs.release_created == 'true' + runs-on: ubuntu-latest + environment: pypi + permissions: + contents: write # upload the built distributions to the Release + id-token: write # OIDC trusted publishing to PyPI (no stored token) + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + fetch-depth: 0 + + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8 + + - name: Build the corpus-bundled wheel + sdist + run: uv build --out-dir dist implementations/python + + - name: Verify the contract corpus is bundled in the wheel (#537) + run: | + python - <<'PY' + import glob + import sys + import zipfile + + wheels = glob.glob("dist/aces_sdl-*.whl") + if len(wheels) != 1: + sys.exit(f"expected exactly one wheel, found {wheels}") + names = zipfile.ZipFile(wheels[0]).namelist() + required = [ + "aces_contracts/_corpus/profiles/backend/provisioning-only.json", + "aces_contracts/_corpus/fixtures/", + "aces_contracts/_corpus/concept-authority/controlled-vocabularies-v1.json", + "aces_contracts/_corpus/schemas/", + ] + missing = [r for r in required if not any(n == r or n.startswith(r) for n in names)] + if missing: + sys.exit(f"wheel is missing corpus payload: {missing}") + print(f"corpus payload present: {sum(n.startswith('aces_contracts/_corpus/') for n in names)} files") + PY + + - name: Publish to PyPI (OIDC trusted publishing) + uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1 + with: + packages-dir: dist + + - name: Attach the distributions to the GitHub Release + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ needs.release-please.outputs.tag_name }} + run: gh release upload "${TAG}" dist/* --clobber diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index cef4e5b2c..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,177 +0,0 @@ -name: Release - -# Committed-literal release (#684), built on the corpus-bundled wheel (#537). -# -# The version is the single committed literal `__version__` in -# src/aces/__init__.py. `tools/release.py` bumps it from the pending towncrier -# changelog fragments and collates CHANGELOG.md on a `release/vX.Y.Z` branch; that -# opens a PR to `main`. Merging it (a normal human-reviewed PR merge) is the only -# thing that puts a new version on `main` — this workflow never commits to `main`, -# it only reads the literal and creates a tag, so no bot/PAT/deploy-key/bypass is -# needed. -# -# On push to `main` the `decide` job publishes iff: -# * the changelog fragments have been collated (none pending) — a real release -# always collates first, so a plain `dev`->`main` promotion with pending -# fragments never publishes a half-baked version; and -# * no tag exists yet for the current `__version__`. -# The `release` job then builds the corpus-bundled wheel/sdist, verifies the -# corpus payload and that the built version matches, attaches a CycloneDX SBOM, -# publishes to PyPI via OIDC trusted publishing, and cuts a GitHub Release whose -# notes are the CHANGELOG.md section. First release + PyPI setup: -# docs/explain/releasing.md. -on: - push: - branches: [main] - workflow_dispatch: - -permissions: - contents: read - -concurrency: - group: release - cancel-in-progress: false - -env: - VERSION_FILE: implementations/python/src/aces/__init__.py - -jobs: - decide: - if: github.ref == 'refs/heads/main' - runs-on: ubuntu-latest - outputs: - release: ${{ steps.decide.outputs.release }} - version: ${{ steps.decide.outputs.version }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - fetch-depth: 0 - - name: Decide whether to release - id: decide - run: | - set -euo pipefail - version="$(grep -oP '^__version__\s*=\s*"\K[^"]+' "${VERSION_FILE}")" - if [ -z "${version}" ]; then - echo "::error::no __version__ literal in ${VERSION_FILE}"; exit 1 - fi - # Guard: uncollated fragments mean this is not a prepared release - # (release.py collates before opening the release PR). Never publish a - # version whose changelog has not been collated. - if find changelog.d -type f -name '*.md' ! -name '_*' ! -name 'README.md' | grep -q .; then - echo "::notice::changelog fragments are still pending; run tools/release.py to prepare a release. Skipping." - echo "release=false" >> "$GITHUB_OUTPUT"; exit 0 - fi - if git rev-parse -q --verify "refs/tags/v${version}" >/dev/null; then - echo "::notice::v${version} already tagged; nothing to release" - echo "release=false" >> "$GITHUB_OUTPUT"; exit 0 - fi - echo "::notice::releasing v${version}" - echo "release=true" >> "$GITHUB_OUTPUT" - echo "version=${version}" >> "$GITHUB_OUTPUT" - - release: - needs: decide - if: needs.decide.outputs.release == 'true' - runs-on: ubuntu-latest - environment: pypi - permissions: - contents: write # create the release tag + the GitHub Release - id-token: write # OIDC trusted publishing to PyPI (no stored token) - env: - VERSION: ${{ needs.decide.outputs.version }} - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - with: - fetch-depth: 0 - - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 - with: - python-version: "3.12" - - - name: Install uv - uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8 - - - name: Build the corpus-bundled wheel + sdist - run: uv build --out-dir dist implementations/python - - - name: Verify built version matches and the corpus is bundled - run: | - python - <<'PY' - import glob - import os - import sys - import zipfile - - expected = os.environ["VERSION"] - wheels = glob.glob("dist/aces_sdl-*.whl") - if len(wheels) != 1: - sys.exit(f"expected exactly one wheel, found {wheels}") - built = wheels[0].split("/")[-1].split("-")[1] - if built != expected: - sys.exit(f"built version {built!r} != __version__ {expected!r}") - names = zipfile.ZipFile(wheels[0]).namelist() - required = [ - "aces_contracts/_corpus/profiles/backend/provisioning-only.json", - "aces_contracts/_corpus/fixtures/", - "aces_contracts/_corpus/concept-authority/controlled-vocabularies-v1.json", - "aces_contracts/_corpus/schemas/", - ] - missing = [r for r in required if not any(n == r or n.startswith(r) for n in names)] - if missing: - sys.exit(f"wheel is missing corpus payload: {missing}") - print(f"v{expected}: corpus payload present ({sum(n.startswith('aces_contracts/_corpus/') for n in names)} files)") - PY - - - name: Generate CycloneDX SBOM - run: | - set -euo pipefail - python -m pip install --upgrade pip - python -m pip install dist/*.whl cyclonedx-bom - mkdir -p sbom - cyclonedx-py environment --output-format JSON --output-file sbom/aces-sdl.cdx.json - - - name: Extract the changelog section for the release notes - run: | - python - <<'PY' > notes.md - import os - import pathlib - import re - - ver = os.environ["VERSION"] - lines = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8").splitlines() - out, capturing = [], False - header = re.compile(r"^##\s*\[" + re.escape(ver) + r"\]") - any_header = re.compile(r"^##\s*\[") - for line in lines: - if header.match(line): - capturing = True - continue - if capturing and any_header.match(line): - break - if capturing: - out.append(line) - body = "\n".join(out).strip() - print(body if body else f"Release v{ver}") - PY - - - name: Create + push the release tag (tag-only; main is never committed to) - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git -c tag.gpgSign=false tag -a "v${VERSION}" -m "v${VERSION}" - git push origin "v${VERSION}" - - - name: Publish to PyPI (OIDC trusted publishing) - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1 - with: - packages-dir: dist - - - name: Create the GitHub Release (notes from the changelog) - env: - GH_TOKEN: ${{ github.token }} - run: | - gh release create "v${VERSION}" dist/* sbom/aces-sdl.cdx.json \ - --repo "${GITHUB_REPOSITORY}" \ - --title "v${VERSION}" \ - --notes-file notes.md diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 000000000..5e39b9417 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.18.0" +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b69ba722..e81b4858f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,465 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -PRs do **not** edit this file directly. Add a fragment under -[`changelog.d/`](changelog.d/) instead; release-time `towncrier build` collates -fragments into this file. See [`changelog.d/README.md`](changelog.d/README.md). +PRs do **not** edit this file directly. release-please maintains it from the +Conventional Commit history on `main` (#684). - +## [0.18.0] - 2026-07-06 + +### Security + +- Bound OCI module import fetches against memory and disk exhaustion. The registry resolver now caps every remote response before buffering it — a separate, larger limit for the compressed bundle blob than for tag-list, manifest, and config metadata — rejecting an oversized or invalid `Content-Length` early and enforcing the cap on the bytes actually read so a compromised or malicious registry cannot force an unbounded in-memory buffer. Bundle extraction additionally bounds the tar member count, per-member extracted size, and total extracted bytes (rejecting duplicate paths), iterating members lazily so an oversized or decompression-bomb bundle fails closed before the archive is fully unpacked. Explicit network timeouts and the issue #13 tar path/link/mode safety checks remain in force. (#12)- Harden OCI module bundle extraction to fail closed on every supported Python runtime. The resolver now validates the entire tar archive before writing — rejecting path traversal, symlinks, hard links, and special files, and stripping setuid/setgid/sticky bits — instead of relying on `tarfile`'s `filter="data"`, which is unavailable on Python 3.11.0–3.11.3 (the PEP 706 backport landed in 3.11.4) and previously allowed an unsafe extraction path on those supported runtimes. (#13)- Bind the OCI module config object into the resolver's trust boundary. The registry resolver now verifies that the fetched config blob bytes hash to the manifest's `config.digest` before decoding it — fetching by digest is not integrity, so a compromised registry could previously serve arbitrary config bytes (carrying the unsigned `root_file` entrypoint) under a valid manifest. The Ed25519 signature payload now also binds `root_file` alongside the module identity, exports, and bundle `content_digest`, and the resolver verifies the signature over the same `root_file` it extracts. Together these close a semantic-substitution attack where a registry that cannot alter the signed bundle could still repoint resolution to a different file already inside that bundle by rewriting `root_file`. Signatures produced over the previous payload (which omitted `root_file`) fail closed when signatures are required. (#14)- Port runtime control-plane and SDL module-registry security hardening onto the current package layout. (#143)- Protected branches (`main`, `dev`) now enforce the CI-strictness baseline: all + CI checks are required and strict, the SonarCloud quality gate is waited on and + fails on any new issue, and pre-commit file hygiene plus secret scanning run in + CI — so nothing merges past a failing check or a failing quality gate, while + admin override is retained. (#527)- Bumped `asyncssh` (2.23.1), `cryptography` (49.0.0), `idna` (3.18), `pytest` (9.1.0), and `starlette` (1.3.1) in the Python lockfile to clear five moderate Dependabot advisories: AsyncSSH `AuthorizedKeysFile %u` path traversal (GHSA-g794-3fmp-753h), cryptography non-contiguous-buffer overflow (GHSA-p423-j2cm-9vmq), idna `encode()` CVE-2024-3651 bypass (GHSA-65pc-fj4g-8rjx), pytest tmpdir handling (GHSA-6w46-j5rx-g56g), and Starlette missing Host-header validation (GHSA-86qp-5c8j-p5mr). The directly-declared floors for `cryptography`, `asyncssh`, and `pytest` were raised to their patched versions to prevent regression. + +### Added + +- Added an advisory (non-gating) OSV-scanner CI job that scans `implementations/python/uv.lock` for known CVEs against the OSV.dev advisory feed and publishes the findings as a JSON report artifact. (#34)- Canonical machine-readable mapping for the classification-based assurance policy (ASR-505): `specs/formal/assurance-policy.yaml` enumerates every `FM` level's required and prohibited artifacts; `tools/check_assurance_policy.py` gates drift in CI; ADR-018 records the decision and `docs/specs/formal.md` is realigned to ADR-007's level names. (#68)- Add the canonical normative-artifact authority-boundary manifest for ASR-517 (`specs/authority/authority-boundary.yaml`), governed by ADR-019, with a structural gate (`tools/check_authority_boundary.py`) wired into `nox -s policy`. (#69)- Add declarative participant framing fields to the SDL `agents` section (ACT-601, ADR-020): `starting_conditions`, `authority_anchors`, and `operating_scope` on `Agent`, with semantic validation against the `conditions` section and the named-reference / targetable indexes. Identity and role continue to come from `Agent.entity` and `Entity.role`. (#70)- Added the issue 71 participant-semantics design ADR, formal spec, and lineage + documentation for SEM-208, SEM-209, SEM-210, SEM-211, SEM-212, SEM-213, and + SEM-215. + + Recorded cross-issue design deferrals for benchmark anti-contamination, + machine-checkable participant conformance, and DSL language adequacy evidence, + including GitHub issue #346 for DSL evaluation/language adequacy. (#71)- Added the normative SEM-218 explicitness and realization semantics spec at + `specs/formal/realization/explicitness-and-realization.md`, distinguishing + binding author declarations from open backend realization and stating the + fail-closed rule for unsupported exact requirements. The spec scopes + realization-support disclosure to backend manifests only (processor + manifests carry no `realization_support` because the processor layer + does not realize underspecified concerns), and records its current + realization status as `partial` in the SEM-200 coverage table. + Enforcement today is the narrow structural floor: the apparatus-contract + shape gates on backend `RealizationSupportDeclaration`, the JSON-schema + conditional gate, the processor-manifest asymmetric rejection of + `realization_support`, and the closed-Pydantic SDL model boundary. The + SEM-218 classifier (exact / constrained / open) in `SemanticValidator`, + the typed compiler emission, the planner-side match against backend + `realization_support`, the runtime non-approximation envelope, and the + SEM-218 provenance fields are normative for the implementation work + that lifts the row from `partial` to `active`. (#72)- Added the issue 74 participant-runtime design ADR and formal spec for RUN-305, + RUN-306, RUN-307, and RUN-308, including explicit support for opaque LLM, RL, + human, script, and external-service participants whose internal decision loops + are not exposed to ACES. (#74)- ### Added + + - Published the joint participant backend-facing contract surface (ADR-060; + API-405/406/407/408/411 design issue #76): a `participant-runtime` schema + family (`participant-lifecycle-event-v1`, + `participant-observation-envelope-v1`, + `participant-shared-state-record-v1`, `participant-outcome-report-v1`), + control-plane retrieval projections (`participant-status-view-v1`, + `participant-history-view-v1`, `participant-context-view-v1`), an API-407 + `feature_support` extension of the backend-manifest + `capabilities.participant_runtime` block on the ADR-054 guarantee-strength + scale (with the `participant-runtime-feature-support-levels` controlled + vocabulary), the normative spec section + `specs/formal/runtime-contracts/participant-backend-contracts.md`, and the + research notes under `docs/research/participant-backend-contracts/`. + Design-issue scope only: shapes, schemas, and fixtures; runtime emission + and conformance land on #200-#203. (#76)- Added the participant behavior model ADR and formal spec covering ACT-602, + ACT-603, ACT-606, ACT-607, and ACT-608. (#77)- Added the experiment-core task, run, apparatus-context, and study/collection + contract design with generated schema support and published schema + descriptions. The contracts include semantic validators for task/run apparatus + constraints, manifest payload binding, study metric grounding, semantic- + invariant annotation shape checks, required wire-level schema versions, + study metric result coverage, study run-allocation coverage, and RFC 3339 + case/valid-leap-second validation. Run-allocation coverage now requires + explicit condition assignments to declared study factors, declared blocking + factors with operational levels and appropriate factor kinds, distinct + factor-level combinations, distinct auditable non-opaque run-level criteria, + and exactly-one condition satisfaction for included runs. It also excludes + invalidated, superseded, and not-evaluated runs from analysis allocation and + from analysis-bearing collection/cohort records. The final traceability pass + adds a literature/lineage criteria matrix, binds digest/path-bearing task and + metric evidence requirements to concrete run artifact checksum and URI/path, + prevents redacted or withheld experiment parameters from carrying concrete + values, requires validity notes for claim-bearing study and benchmark records, + and exposes explicit benchmark/agent-evaluation artifact roles for starter + files, evaluators, subtasks, gold steps, milestones, human assistance, + scaffolds, baselines, and cost/resource traces. Digest-bound semantic + validation treats schema-valid hex case variants as the same digest, optional + reference qualifiers constrain only when supplied, and unsupported + identity-reference digest/path qualifiers cannot silently satisfy apparatus or + run-allocation criteria. Schema semantic-invariant annotations must resolve to + callable validators, and declared run allocations are checked even when a + collection/cohort omits an analysis plan. + Experiment artifact references now require explicit sensitivity metadata, and + EXP-701 through EXP-705 are mapped to the generated schema publication surface + in requirement governance. Task records require leakage, apparatus, validity, + and supporting-artifact disclosure surfaces, and run-allocation condition + assignments now reject empty criteria at the JSON Schema boundary. Identity + references for processor/backend apparatus constraints reject digest/path + qualifiers. Generic scenario refs, run task refs, study task/run membership + refs, run-internal result evidence refs, artifact `satisfies_refs`, and all + run-allocation condition refs now also reject qualifiers they cannot bind. + Apparatus manifest validation rejects ambiguous selected-manifest subject + bindings, manifest path qualifiers, unvalidated digest-qualified manifest refs, + digest-qualified selected manifests that are not canonical component manifests, + processor/backend required manifest ids that do not match subject identities, + and mutually incompatible processor/backend manifest payloads. Apparatus + compatibility refs and measurement-channel refs now reject digest/path + qualifiers, including explicit null fields, so candidate run metadata cannot + satisfy id-only task or study criteria while carrying unvalidated checksum/path + claims. + Experiment core now incorporates participant implementation manifest and + provenance contracts, requires participant implementation apparatus to bind to + participant manifests and run-level provenance, resolves participant study + criteria through selected run provenance, renumbers the experiment ADR to avoid + the current SDL ADR range, and documents scenario-snapshot identity over + expanded canonical SDL module compositions. (#87)- Add the experiment evidence and measure contract boundary for EXP-707, EXP-708, EXP-709, and EXP-715. The experiment-core schema family now publishes `experiment-capture-spec-v1`, `experiment-evidence-record-v1`, and `experiment-derived-measure-v1`, with valid/invalid fixtures, semantic invariant annotations, and conformance validators that keep declarative capture intent, raw evidence, and derived measures separate. Backend manifests now support an optional `capabilities.observation` block with governed capture-kind, channel-kind, and sealing-mode vocabularies, and conformance rejects observation claims that lack the published evidence contracts. ADR-064 and the formal experiment-core spec record the boundary; runtime capture, storage, APIs, schedulers, and statistical engines remain out of scope for this contract-only change. + Refactor the reported-value invariant helper and observation capability gap reporting so SonarCloud quality gates remain clean for the published contract surface. (#88)- Extend `experiment-run-v1` as the canonical run provenance record for EXP-710, EXP-720, and EXP-722. Run records now include required traceability links from capture specs to raw evidence, derived measures, and claims, plus realized-form disclosures for processor/backend/operator choices that were not fully authored in the scenario or task. ADR-065 and the formal experiment-core spec document the boundary; generated schemas, fixtures, and contract tests enforce the new provenance surface. Reference de-duplication now also tolerates constrained experiment reference models that omit optional digest, path, or subject fields. (#89)- ### Added + + - Added the ASR-511/ASR-515 validation and admission profile design, including + ADR-072, the formal validation-basis disclosure spec, and the clause matrix. (#97)- Add EXP-706/EXP-712 trial, replication, reproducibility, and replay-claim + design guidance for experiment-core ADRs, formal specs, and preflight + guardrails. (#105)- Publish the GOV-913 reusable-asset trust, authenticity, and integrity policy: + a normative spec (`specs/supply-chain/reusable-asset-trust-integrity.md`), + ADR-071, and the `reusable-asset-trust-policy-v1` contract declaring, per + reusable asset family, the required integrity/authenticity/provenance/governance + evidence classes referencing existing ACES trust mechanisms. (#115)- Added participant implementation manifest and provenance contracts with generated schemas, fixtures, conformance validation, and documentation. (#129)- Added the proposed falsification-first claim evidence gate ADR for ASR-530. (#162)- Added governed participant behavior contracts, observation boundaries, compiled participant behavior addresses, and a published participant behavior history stream for SEM-208. (#185)- Add explicit SEM-209 participant interaction semantics for action contracts, behavior history provenance, reference validation, and joint-action ordering conformance. (#186)- Add SEM-210 participant visibility and information-boundary contracts with ordered, evidence-backed view transitions, runtime view-relation timelines, behavior-history anchors, snapshot-scoped hidden-truth observation guards, closed participant observation detail metadata, and fail-closed reference validation. (#187)- ### Added + + - Added typed participant action precondition, effect, failure, and action-result semantics for SEM-211, + including complete precondition coverage checks, declared reference validation, action-result + evidence grounding, observation-boundary authorization, action-result observation-point anchoring, and durable + participant behavior-history persistence. (#188)- ### Added + - Add SEM-212 participant attribution edge semantics, runtime validation, contract schema publication, and adversarial tests. + - Refactor participant attribution event parsing and validation helpers for the SonarCloud complexity gate. (#189)- ### Added + + - Added SEM-213 temporal participant contracts, runtime temporal-context + validation, backend timing disclosures, generated schema publication, and + adversarial tests for domain/clock/disclosure, contract-shape, bounded timing, + and cadence/deadline/dwell/timeout state-machine failures. (#190)- Add explicit SEM-215 participant outcome interpretation rules and runtime records that relate participant-local outcomes to objective, workflow, evaluation, evidence, and reward meaning only through declared provenance-bearing rules. (#191)- Added RUN-305 participant runtime state/history enforcement: behavior history now + survives public runtime snapshots, uses tighter generated schema constraints, + and is rejected on backend apply when the snapshot shape, participant identity, + episode anchoring, append-only history prefix, or metadata boundary is invalid. + The behavior-history model now also rejects boolean `realized_order` values so + Python model validation matches the published JSON Schema and semantic validator. (#192)- Added RUN-306 participant runtime lifecycle fields and Sonar-clean shared validation to behavior-history event contracts, schemas, and validators. (#193)- ### Added + - Added first-class RUN-307 shared operational state records/history to runtime snapshots with revision-aware validation. + - Added semantic diagnostics for malformed shared-state records, access markers, and append-only history violations. (#194)- Added RUN-308 participant-runtime contract surfaces for joint action records, time-management contexts, runtime snapshot concurrency validation, and coverage for the concurrency guardrails. (#195)- Add a repository-owned reference processor (`aces_processor.reference.run_reference_processor` / `ReferenceProcessor`) that realizes the normative processing model: it carries SDL authoring input through instantiation, compilation, and planning to a portable execution plan and exposes the published processor manifest. Per ADR-008 the processor stops at the execution plan; backend realization stays in the runtime. The backend-conformance live probe now consumes the reference processor instead of inlining the compile/plan chain, and new tests drive its plan through the reference runtime to prove every contract version the processor manifest declares is exercised end to end. (RUN-313) (#196)- Add a repository-owned reference emulation backend (`aces_reference_backend`) that implements the four backend protocol roles (Provisioner, Orchestrator, Evaluator, ParticipantRuntime) over a pluggable deployment driver. The default in-process driver is hermetic; an opt-in OCI driver realizes plans against a real container runtime (docker/podman) through fixed-argv subprocess calls with bounded timeouts and no secret/native-id leakage into any portable artifact. The backend publishes identity/capability through the standard `BackendManifest`, registers on the existing `BackendRegistry` descriptor seam as `reference-emulation`, and passes `run_target_conformance` at the `FULL_REMOTE_CONTROL_PLANE` profile. Provenance flows through the SEM-218 apply gate; only portable ACES facts reach snapshots, diagnostics, and conformance reports. A `docker`-marked, runtime-gated integration test and a non-blocking `integration_docker` nox session / CI job exercise real-container realization without touching the hermetic `verify` graph. (RUN-314, ADR-063) (#197)- Backend manifests now declare supported participant roles, behavior features, and interaction features on participant runtime capability blocks. (#199)- ### Added + + - Made the API-406 participant lifecycle-event, observation-envelope, and + shared-state record contracts required by the full remote control-plane + backend profile and registered their conformance model validators. (#200)- Expose API-407 participant feature-support declarations through backend manifest capability helpers and preserve them in rendered backend-manifest v2 payloads. (#201)- Expose API-408 participant status, history, and reference/provenance context retrieval views through the runtime control plane and HTTP API. (#202)- Expose ACT-607 participant authority and scope declarations as compiled runtime metadata. (#207)- Added ACT-608 participant behavior-mode scope validation so authored behavior specifications resolve through the governed decision-surface mode vocabulary. (#208)- Added ACT-609 offensive behavior refs on behavior specifications, backed by separately governed MITRE ATT&CK Enterprise tactics v19.1 and MITRE ATLAS tactics v2026.06 vocabularies, pinned source lineage, SDL validation, generated schemas, and compiler carry-through. (#209)- Added claim-aware ACES MCP tools for parsing, compile/plan dry runs, manifest introspection, design assessment, and supported-claim assessment for scenario authors. (#223)- Added SDL language-service helpers and MCP tools for completions, references, formatting, structured diagnostics, and structured edits. + Refined reference navigation and structured edit coverage for SonarCloud quality gates. + Consolidated language-service diagnostic payload helpers to avoid duplicated implementation blocks. (#224)- Add a canonical AUT-811 agent guidance profile, checker, MCP tool, tests, and docs for machine-readable scope boundaries, invariants, review priorities, and safe-operating expectations. (#225)- Added a repo-wide documentation style guide, glossary, reference map, documentation-scope guidance, and corrected setup references for current-state, cited technical and academic prose; local nox pre-commit hooks now run serially to avoid concurrent schema-generation races during all-files checks. (#226)- Added current-state getting-started guidance and an examples inventory that state available ACES entrypoints, validation levels, and unsupported template or pattern surfaces. (#227)- Add negative conformance coverage and an invalid fixture for the EXP-707 experiment-capture-spec-v1 contract: a dedicated rejection test exercising the capture-requirement key-equality, window-reference resolution, capture-window time-ordering, and under-specified-window invariants, plus a schema-and-model invalid fixture for a window that declares no start, end, or trigger. (#233)- Add negative conformance coverage and invalid fixtures for the EXP-708 experiment-evidence-record-v1 contract: a dedicated rejection test exercising the content-uri-requires-checksum, non-empty source-refs, RFC 3339 captured-at, and redaction-requires-loss-disclosure invariants, plus schema-and-model invalid fixtures for a content URI without a checksum, an empty source-refs list, and a malformed captured-at timestamp. The model and published schema shipped under #88; this change adds the conformance tests of record without changing them. (#234)- Add negative conformance coverage and invalid fixtures for the EXP-709 experiment-derived-measure-v1 contract: a dedicated rejection test exercising the reported-requires-value, non-reported-must-not-carry-value, and RFC 3339 generated-at invariants, plus schema-and-model invalid fixtures for a reported measure without a value, a withheld measure carrying a value, and a malformed generated-at timestamp. The model and published schema shipped under #88; this change adds the conformance tests of record without changing them. (#235)- Add negative conformance coverage and invalid fixtures for the EXP-720 experiment-run-v1 canonical run provenance contract: a dedicated rejection test exercising the run-traceability claim-grounding and duplicate-reference invariants, the realized-form-disclosure substantive and processor/backend authority invariants, and the required traceability capture-spec surface, plus schema-and-model invalid fixtures for a realized-form disclosure missing a realized target, a backend-realized disclosure carrying a processor realization authority, and a run whose traceability omits capture-spec references. The model and published schema shipped under #89; this change adds the conformance tests of record without changing them. (#238)- Add negative conformance coverage and an invalid fixture for the EXP-722 experiment-run-v1 realized-form disclosure contract: a dedicated rejection test exercising the realized-form substantive invariants (a disclosure must name a realized reference or value summary and use the matching processor/backend realization authority) and the run-level invariant that disclosure evidence refs must be listed in the run traceability evidence refs and must be duplicate-free, plus a schema-and-model invalid fixture for a processor-realized disclosure carrying a backend realization authority. The model and published schema shipped under #89; this change adds the conformance tests of record without changing them. (#239)- ### Added + + - Published SEM-214 meaning and comparability semantics for API-408 participant context views. (#247)- ### Added + + - Published SEM-216 boundary semantics distinguishing runtime-observable state, captured evidence, derived evaluations, analysis outputs, and audience-specific views over the existing contract families. Participant-visible context views drawing on archival `evidence_record` or `derived_measure` source layers must now declare a governed view rule and redaction policy and mediate the source through the transformation, and redacted or withheld evidence records must disclose redaction/loss at the schema boundary. (#248)- Added SEM-217 external knowledge binding effect semantics, including a typed classifier for annotation, alignment, refinement, and constraint effects over existing concept-authority and semantic-profile artifacts. (#249)- Added ASR-521 participant benchmark conformance preflight guardrails. (#331)- ### Added + + - Published SEM-224 observability plane separation semantics: a carrier-oriented plane classifier (`aces_sdl.observability_plane_semantics`) that assigns each claim-bearing observability/evidence artifact exactly one of the five named planes — scenario-native observability, authored evidence requirement, processor/backend operational observability, captured evidence, and derived analysis — by carrier role rather than by free-form strings such as `log`, `trace`, or `evidence`. The three claim-bearing experiment-core contracts (`experiment-capture-spec-v1`, `experiment-evidence-record-v1`, `experiment-derived-measure-v1`) now publish their plane as a portable `x-aces-plane` schema annotation sourced from that classifier. (#334)- Added SEM-225 run-level augmentation disclosures to `experiment-run-v1`, with validation for processor/backend authority, environment-visible carriers, participant-visible markings, comparability observer effects, and run-traced evidence provenance. + Refactored the SEM-225 disclosure validator into focused helper checks so the published contract validation stays maintainable. (#335)- Added the SDL `evidence_requirements` section, validation, and schema support for authored data, evidence, and output capture obligations. (#337)- Added a read-only runtime control-plane operational summary for processor/backend apparatus monitoring and troubleshooting. (#338)- ### Added + + - Added typed SDL node runtime metadata for mounts, local control interfaces, process identity, package inventory, dependency manifests, and scanner-derived package vulnerability findings. (#354)- Add typed SDL runtime surfaces for observed process sets, runtime environment variables, Linux capability policy, restart policy, and container resource limits; support issue-only CI verification for no-requirement implementation branches. (#358)- Add typed SDL runtime surfaces for filesystem inventory, container host/security configuration, full mount metadata, and health observations, with TechVault runtime parity example coverage. (#363)- Add the SDL `source.build` container image build-provenance surface, expressing base image and digest, image layer chain, structured Dockerfile instructions, classified build arguments, copied source mappings, image-default configuration, source-input checksums, and attestation/verification status, with TechVault webapp parity example coverage (ADR-023). (#364)- Add the SDL `runtime.local_identity` surface, expressing the observed local identity database — `/etc/passwd` users (UID, primary GID/group, GECOS, home, shell, supplemental groups, and distinct disabled/locked/no-login status), `/etc/group` records, and structured sudo/sudoers grants — with provenance and stability classification, and TechVault webapp parity example coverage (ADR-024). (#365)- Add the SDL `runtime.network` surface, expressing observed container network + realization facts — container hostname/domain identity; per-network endpoints + with realized IP, prefix length, gateway, and MAC address; backend network and + endpoint identifiers each with an explicit stable/ephemeral stability class; + distinct stable-alias, observed-DNS-name, and backend-generated-DNS-name lists; + observable backend network driver/IPAM detail; and host-published port bindings + with host IP and host port — validated against switch-backed `infrastructure` + networks, with TechVault webapp parity example coverage (ADR-025). (#366)- Add the SDL `runtime.applications` surface, expressing the participant-observable + HTTP application route/API/UI inventory of a node service — per-route paths and + HTTP methods, owning transport service, auth/session requirements, typed request + inputs (path/query/header/cookie/form/JSON-body/uploaded-file), response status + codes and content types, template/static asset associations, route-specific + vulnerability placement, route-visible fixture secrets or diagnostic disclosures + with sensitivity classification, and observable redirect/error-disclosure + behavior — validated against same-node services, top-level `vulnerabilities`, + and observed file inventory, with TechVault webapp parity example coverage + (ADR-026). (#367)- Added an `init_process` descriptor to `RuntimeContainerConfiguration` so SDL can + express that a container runs under a backend-injected init / PID-1 reaper (for + example Docker Compose `init: true`, where PID 1 becomes `/sbin/docker-init`). + The typed `RuntimeInitProcess` submodel records whether the reaper is enabled, + its implementation and executable path, child-reaping intent, and optional + redactable PID-1 argv evidence, kept distinct from observed process inventory. + See ADR-027. (#384)- Added `seccomp_profile` and `security_opt` fields to + `RuntimeContainerConfiguration`, letting the SDL express a container's seccomp + posture and backend-native security options without conflating them with + `privileged` (see ADR-028). (#385)- ### Added — Process-scoped Linux capability overrides on `RuntimeCapabilityPolicy` + + `Node.runtime.linux_capabilities` now accepts a `process_overrides` list of + `RuntimeProcessCapabilityOverride` records, letting an inventory express a + capability delta scoped to a single process or its descendant subtree + without flattening the container-wide baseline. Each override identifies its + subject via the existing `RuntimeProcessIdentity` selectors and asserts an + `effective` / `add` / `drop` delta at `process` or `subtree` scope. The + motivating case is a container where the entrypoint loads audit rules with + `CAP_AUDIT_CONTROL` and then exec's `sshd` through + `capsh --drop=cap_audit_control`, so the interactive shell subtree runs + without `CAP_AUDIT_CONTROL` and cannot disable auditing. The design + boundary is locked in ADR-030. (Closes #386.) (#386)- ### Added — SDL surface for SSH server configuration (`Node.runtime.ssh_servers`): typed forced-command, accept-env allowlist, scoped `Match` rules, and adjacent sshd directives (allow/deny users and groups, authentication methods, password / pubkey / TTY toggles, chroot directory, authorized-keys file). Implements ADR-031. (#387)- Add a first-class `runtime.database_services` surface to ACES SDL + (ADR-029). Database logical state — engine, wire protocol and version; + listener observations; logical objects (databases, schemas, tables); + database-local roles; privilege grants; and provenance-bearing settings + — is now typed, queryable runtime inventory instead of prose in + `runtime.applications[].description`. A top-level relationship can model + typed application-to-database access with a structurally validated + `database_access` (`role_ref`, `auth_method`). (#388)- ### Added + + - Added `runtime.software_components` for node-scoped runtime software component identity below package-manager row granularity. (#395)- Added separate Claude Code and Codex ACES asset inventory capture skills that + turn the participant-discoverable inventory methodology into runnable + agent-level guidance. (#397)- ### Added + + - Added the scenario/delivery classification drift audit and remediation record, fixed the live runtime-scope wording drift in the SDL sections reference, and added structural coverage tests for issue #400. (#400)- Add the SDL `runtime.identity_authorities` inventory for provider-neutral directory, domain, realm, IdP, IAM, and federation identity semantics, with typed authority services, subjects, policies, relationships, unambiguous local and qualified semantic reference validation, module-import ref rewriting, generated schema coverage, documentation lineage, example coverage, and secret-bearing attribute redaction. (#401)- Added ACES-owned asset inventory methodology docs plus deterministic container + evidence capture and Syft CycloneDX normalization templates to the ACES asset + inventory capture skills. (#411)- `Node.runtime.service_manager_units` records observed service-manager (systemd) unit state — `load_state`, `active_state`, `sub_state`, `enabled_state`, `result`, optional `main_pid`, `unit_file_path`, redactable `exec_start`, and same-node `Node.services[]` refs — distinct from transport services, live processes, packages, content, and authored conditions. See ADR-035. (#418)- Add typed `Node.runtime.mail_services` inventory and `mail_access` relationship semantics for mail-server logical state. (#420)- Add `Node.runtime.file_services` runtime inventory for SMB/Samba (and a + generalizable seam for NFS, FTP/SFTP, WebDAV, and object-store services), + with typed shares, service-local passdb-style principals, portable + subject/resource/action/effect/basis access rules, observed access + outcomes, and qualified `nodes..runtime.file_services.[...]` + references for module composition. Extend `RuntimeFilesystemEntry` with a + `presence` field (`present` default, `expected_absent`, `unknown`, + `other`) so authored/expected paths absent at capture time retain their + expected `entry_type` instead of collapsing to `other`. Implements + ADR-037. (#421)- Added typed `Node.runtime.dns_services` inventory for DNS authoritative and + resolver runtime state, including zones, RRsets, common typed RDATA, resolver + policy, DNSSEC posture, dynamic-update posture, settings redaction, evidence + refs, semantic validation, module-import ref rewriting, docs, and schemas. (#426)- Added node-scoped `runtime.security_monitoring_managers` inventory for SIEM/security-monitoring managers, including listeners, components, enrolled agents, agent groups, detection content sets, bounded settings, semantic validation, qualified relationship refs, and generated schema support. (#428)- ### Added + + - Added `runtime.network_sensors` for node-scoped NSM/IDS monitoring posture, including monitored network refs, capture metadata, validation, docs, and schema publication. (#429)- ### Added + + - Add typed SDL runtime inventory for IDS/NDR network detection engines. (#430)- Added `runtime.service_listeners` so SDL inventories can model observed bind + addresses, ports, listener scope, process/service ownership, readiness evidence, + and published-port correlations without overloading `Node.services`. (#431)- Added SDL support for parsed security-monitoring detection definitions beneath runtime security-monitoring managers, including validation-backed source, content-set, correlation, target, and canonical digest metadata. (#434)- ### Added - Registered the ACES gap-remediation implement overlay for Codex/Claude discovery and regression coverage. (#445)- Added the SCN-010 expressivity gap analysis (`docs/aces/inventory/scn010-expressivity-gap-analysis.md`): the peer-review-grade analysis of ACES SDL runtime-surface expressivity gaps found while holding the remaining APTL TechVault SCN-010 SOC-stack containers to the wazuh.manager parity depth bar, and the cohesive whole-SDL architecture that resolves them (requirements DSL-132 through DSL-139). (#449)- Add the SCN-010 `runtime.datastore_services` inventory family (DSL-132): a single + `RuntimeDatastoreService` spine discriminated by an OPEN `data_model` + (`search_index` / `wide_column` / `key_value` / `relational` / `unknown` / + `other`) for the non-relational datastores (OpenSearch/Elasticsearch search + clusters, Cassandra wide-column store, Redis key-value store) that the + irreducibly-relational `runtime.database_services` cannot shape. A + `require_profile_for_data_model` guard makes each data model's defining geometry + (search shard/replica counts, wide-column replication strategy/factor, key-value + persistence posture) executable so an under-populated instance fails validation. + The family is registered in the runtime service-family registry, wired into + `RuntimeConfiguration`, semantically validated (owning-service and delegated + `authorization_ref` resolution against the same node), and published to the + generated SDL schemas. (#450)- Add the SCN-010 `runtime.platform_applications` inventory family (DSL-133): a + single `RuntimePlatformApplication` spine discriminated by an OPEN + `platform_kind` (`threat_intel` / `soar` / `analyzer_engine` / + `case_management` / `analytics_dashboard` / `unknown` / `other`) for the + security platform applications (threat-intelligence platform, SOAR, analyzer + engine, case management, analytics dashboard). Content objects are bounded + parsed manifests (typed kind + bounded attributes + typed references + + marking/evidence refs, never raw bodies). A `require_profile_for_platform_kind` + guard makes each kind's defining content/binding profile executable so an + under-populated instance fails validation. The family is registered in the + runtime service-family registry, wired into `RuntimeConfiguration`, semantically + validated (owning-service and delegated `authorization_ref` resolution, + content-object `references` and `marking_refs` intra-application integrity), and + published to the generated SDL schemas. (#451)- Add `runtime.app_authorizations` application-internal RBAC inventory (principals with credential classification, roles, resource-scoped permission grants, role mappings, and tenants) with reference validation and generated schemas (DSL-134). (#452)- Add `runtime.scheduled_jobs` cadence-and-run-state inventory (closed interval/cron/calendar recurrence plus observed last/next run and last result) with generated schemas (DSL-135). (#453)- Add `runtime.forwarding_agents` log-forwarding / intel-sync agent inventory (typed sources, transforms, ship targets, buffer policy, reload channels, and settings) with an executable `require_profile_for_agent_kind` guard, scenario-scoped ship-target node/service ref resolution, enrollment-identity and secret-setting redaction, and generated schemas (DSL-136). (#454)- Add `runtime.orchestration_authorities` container-spawn authority inventory (engine, scope, spawn templates, lifecycle policy, realized children, and privilege class) with an executable `require_profile_for_privilege_class` guard and scenario-scoped `control_interface_ref` resolution that requires a read-write docker socket for `host_root_equivalent` authorities, plus generated schemas (DSL-137). (#455)- Wired three typed relationship subtypes into the top-level `Relationship` model + (DSL-138): `forwarding_edge` (`RelationshipForwardingEdge`), + `service_integration` (`RelationshipServiceIntegration`), and `proxy_upstream` + (`RelationshipProxyUpstream`), mirroring the existing `database_access` / + `mail_access` typed exceptions. The semantic validator now cross-references each + subtype's refs (forwarder, consumer/engine and auth principal, route and + upstream node/service) and enforces two agreement guards: a forwarding edge's + `target_listener_role`/`protocol` must be consistent with at least one of the + agent's ship targets, and a proxy upstream's shared facts (target node, target + service, TLS-termination boolean) must agree with the referenced route's + `upstream_target` so the same fact recorded at two scopes can never silently + contradict. See ADR-052. (#456)- Add scenario-level forwarding agents for off-node sidecar forwarders, with typed `forwarding_edge` resolution across node-hosted and scenario-level registries (DSL-140). (#460)- Added typed datastore cluster and partition fields for native UUIDs, document counts, deleted-document counts, byte-normalized store sizes, creation timestamps, and open/closed status. (#468)- Add structured `runtime.datastore_services` mapping and template manifests so search-index schemas can carry bounded field counts, dynamic policy, digests, and evidence refs instead of name-only lists. (#469)- Added DSL-141 datastore-node engine provenance to `runtime.datastore_services`: typed `engine_version`/`build_hash`/`build_type`, JVM heap byte bounds and `memory_locked` posture, a per-node `RuntimeDatastoreEnginePlugin` inventory carrying per-plugin versions, and a product-neutral `RuntimeDatastoreNodeEndpoint` (client/peer) listener inventory — replacing the name-only service-level `engine_plugins` list and the single ambiguous node `address`. (#470)- ### Added + - Add an ADR amendment policy (ADR-059) and an acceptance-content pin gate: `docs/decisions/adrs/adr-index.yaml` pins every accepted ADR's canonical-content `sha256`, and `tools/check_adr_immutability.py` (wired into the `policy` nox session) fails when an accepted ADR changes without a recorded `## Amendments` entry or a superseding ADR. Reconciled the already-amended ADRs (025, 029, 032, 038, 041, 048, 050, 052) with honest amendment records so the gate starts green. (#481)- Added an assurance fulfillment gate (`specs/formal/assurance-fulfillment.yaml`, enforced by `tools/check_assurance_policy.py` via `nox -s policy`): every classified formal-spec subsystem must deliver — or explicitly waive with an ISO date and tracking reference — each verification artifact kind required by its FM level, so a subsystem can no longer be classified FM3 with no executable artifacts while CI stays green. (#485)- Added an executable participant-semantics invariant oracle covering I1-I18 with property-based valid progressions and targeted rejecting mutations. (#487)- Carry the SEM-218 explicitness class through processor compilation as typed realization-requirement metadata on the runtime model, and add a planner realization-support gate that rejects an unrealizable exact (or unsupported constrained) requirement against the selected backend's `realization_support` with a structured diagnostic instead of silently approximating it (invariants I1/I2/I4). (#490)- Added the SEM-218 runtime non-approximation gate (invariant I2) at the backend-adapter boundary, which rejects a backend that silently realizes an exact author declaration with a weaker value, and the `realization_provenance` ledger (invariant I5) on the runtime snapshot envelope, which records each realized concern's explicitness class and author-declared / processor-derived / backend-realized origin in published schemas, fixtures, and the schema-publication manifest. (#491)- Added a normative definition of "surface" to the concept-authority specification — including the one-surface-versus-two decision rule from ADR-033 — with a derivative glossary entry that points back to it; and classified the agent-usable guidance profile (`specs/agent-guidance/agent-guidance.yaml`, AUT-811) as a `governance-guidance` artifact through a new `normative_artifact_families` block in the authority-boundary manifest, enforced by `tools/check_authority_boundary.py`, so its authority class is decidable from the manifest alone. (#494)- Added the UCO alignment evidence contract (`uco-alignment-v1`): a machine-checkable mapping from every adopted/adapted cyber-domain concept family to the UCO object types it aligns to, with the reviewed UCO version pinned, adapted-family divergences enumerated explicitly, generated JSON Schema, valid/invalid fixtures, and catalog-derived coverage validation. (#495)- Added a concept-authority catalog governance gate (ADR-062, `tools/check_concept_authority_governance.py`, wired into the `policy` nox session): every concept family in `concept-families-v1.json` must be ADR-linked, and inline-code cross-references in a family's `relation_rules` must resolve to a known concept family or controlled vocabulary. (#496)- Add the normative, language-neutral SDL authoring specification under `specs/sdl/`: a catalog set covering the document model, the top-level section catalog (reconciled to the live `sdl-authoring-input-v1.json` contract), the cross-section reference-resolution catalog, the variable/instantiation catalog, the node-scoped runtime-family index, and the error-vs-advisory diagnostics boundary. The specification is registered as a `prose` authority root in `specs/authority/authority-boundary.yaml`, giving independent implementations a structural authority that does not require reading the reference Python. (#498)- The worked SDL examples under `examples/scenarios/` are now validated against the published `sdl-authoring-input-v1` JSON Schema in CI, proving the shipped example corpus conforms to the contract surface downstream consumers read (previously only Pydantic-parser acceptance was checked). Includes a non-vacuity corpus guard and a negative control so the suite cannot pass vacuously. (#501)- The `aces conformance backend` suite now has end-to-end proof tests: a realistic stub backend manifest passes against the canonical `contracts/fixtures` corpus under a full runtime-contract profile, and two seeded-violation tests copy the corpus to a temp tree, corrupt a required field in a required contract fixture (the backend manifest and a deep participant-episode runtime contract), and assert the runner exits non-zero while naming the offending contract. This demonstrates a caught contract violation rather than only a missing-fixture failure, backing the conformance CI claim in `docs/explain/reference/backend-conformance.md` (ASR-502). (#502)- Add a determinism witness for the SDL parse/instantiate/compile pipeline: it compiles representative scenarios (including a module-import scenario) twice, and once more under a varied PYTHONHASHSEED in a subprocess, and asserts the compiled output is byte-identical. docs/explain/sdl/parser.md now cites it. (#506)- Added a related-work comparison page (`docs/explain/sdl/related-work-comparison.md`) + positioning ACES against precedent systems — OCR SDL, CybORG, CACAO, SISO Cyber + DEM/FOM, and academic range DSLs (CRACK/KYPO/CyRIS) — across eight expressivity + dimensions. Every non-ACES cell carries a primary-source citation, and the page + states explicitly where the precedents lead ACES. Linked from the README Lineage + section and `lineage.md`, which gains a Cyber DEM/FOM differentiation subsection. (#508)- The published contract corpus (backend/semantic profiles, the fixture conformance corpus, concept-authority catalogs, and schemas) now ships as package data in the `aces-sdl` wheel and sdist and is resolved through a single `importlib.resources`-backed seam (`aces_contracts.corpus`), so `aces conformance backend` and SDL semantic validation work from an installed distribution with no source checkout. The top-level `contracts/` tree remains the normative authority; `--fixtures-root` / `--profiles-root` overrides are unchanged. Added a `v*`-tag release workflow that builds the corpus-bundled artifacts and publishes a GitHub Release so downstream backends can pin a version instead of a `dev` commit SHA. (#537)- Added a repository-side PR title guard (`.github/workflows/pr-title-lint.yml` backed by `tools/check_pr_title.py`) that rejects agent-branded PR title prefixes such as `[codex]`, `[claude]`, `[openai]`, and `[chatgpt]`, and enforces the conventional `(): ` shape with a lowercase-leading subject on every target branch including `dev`. The same validator powers local tests so the policy cannot silently drift from the workflow. (#567)- Added a focused enterprise reference SDL scenario for authored participant action, observation-boundary, Wazuh evidence, policy provenance, and runtime/backend handoff. (#598)- Added a participant action-admission binding path that lets runtime backends record SDL-declared participant behavior through a selected participant implementation, including a request DTO control-plane surface. (#599)- Add the cross-backend evidence corpus producer (`aces corpus build`) that pairs the + libvirt reference-backend scenario-evidence run with the APTL realization of the same + authored scenario and derives a cross-backend **invariant ledger** + (`aces.cross-backend-evidence-corpus/v1`, a thin local artifact). The ledger records + preserved invariants (authored scenario digest + compiled ACES address sets + + recorded evidence surfaces, each with a per-backend basis), realization differences, + unsupported/degraded surfaces, and evidence limitations. The libvirt run is consumed + through the existing `aces.libvirt.scenario-evidence-run/v1` producer in deterministic + mode; the APTL run is a bounded, honestly-labeled summary + link to + Brad-Edwards/aptl#558, with an optional `--aptl-evidence` path that ingests only + allowlisted portable fields from a supplied APTL export (no APTL-private data). The + committed corpus lives at `examples/corpus/reference-demonstration/` and is drift-tested. (#600)- ### Added + + - Added a provisioning-only `aces_backend_libvirt` package with libvirt/QEMU target construction, manifest wiring, invalid-plan diagnostics, fail-closed driver confirmation checks, and an injected libvirt driver boundary. + - Tightened the libvirt backend type and reconciliation helpers so SonarCloud accepts the new backend surface. + - Validated the TechVault scenario through dynamic instantiation, planning, and libvirt provisioning, including switch-backed network links. + - Added the full TechVault operational scenario and libvirt provisioning coverage for its 30-node, four-network SOC/enterprise/red-team surface. + - Added APTL-style reduced TechVault scenario variants and native libvirt coverage proving they realize distinct ACES-derived domain/network/service surfaces. + - Added `aces libvirt techvault validate-live`, which boots TechVault scenarios as native libvirt/QEMU initramfs appliances, verifies the independent substrate, service readiness, Kali-shared-network reachability, SOC readback, clean-boot recomposition, and run-archive evidence. + - Added an `aces_operations` package for live operational gates so the CLI can invoke TechVault parity checks without crossing backend/runtime ownership boundaries directly. + - Hardened the TechVault live gate implementation structure so SonarCloud complexity checks stay green while preserving the SOC readiness and evidence checks. (#601)- ### Added + + - Published the libvirt/QEMU provisioning-only `backend-manifest-v2` as a conformance-verified acceptance bar: the manifest validates against the checked-in `backend-manifest-v2` JSON Schema, `supported_contract_versions` covers the published provisioning-only profile contract set, and `realization_support` declares a non-hollow realization envelope (node-type and os-family only — no content or account over-claim, matching what the libvirt interpreter actually realizes). (#602)- ### Added + + - The libvirt/QEMU backend now fully and dynamically realizes provisioning plans: node resources become libvirt domains (base image + a NoCloud cloud-init seed), network resources become libvirt networks with real `ip`/`dhcp` addressing, and `account-placement`, `content-placement`, and `feature-binding` resources are realized into the target domain's cloud-init. Account realization covers every governed feature (groups, shell, home, disabled, auth_method, mail, spn, authorized SSH keys); content realization covers file/dataset/directory; and feature/service and mail realization is **OS-family-aware** — Linux (`systemctl`/`apt`), FreeBSD (`sysrc`/`pkg`), Windows (`choco`/`sc.exe`), and macOS (`brew`) each get their native mechanism, with a portable descriptor as the substrate ceiling for families and terms (e.g. Kerberos SPN without a domain) that no generic host can realize further. Node network ACLs are realized host-side as libvirt **nwfilter** rules referenced from the domain interface (OS-independent enforcement). `apply()` is idempotent against the `RuntimeSnapshot` (UNCHANGED operations never touch the host), and a placement change realizes its target domain even when the node itself is UNCHANGED (the seed now carries different cloud-init). For the CREATE/UPDATE operations that do reach the driver it **converges** existing host objects (stop + undefine, then redefine the desired XML/seed/nwfilter) so a tightened ACL, a disabled account, or a changed seed is genuinely enforced rather than skipped, with no duplicate resources and with seed and nwfilter cleanup on destroy. Convergence, deletion, and host-global nwfilter redefinition are all ownership-checked: each domain, network, and nwfilter carries a deterministic per-address libvirt UUID, and an existing object that shares a name but is not the ACES object for that address is never destroyed, undefined, or overwritten — apply fails closed. The NoCloud `instance-id` is derived from the rendered seed content, so a converged UPDATE with changed content re-runs cloud-init in the guest instead of being treated as already consumed. The backend manifest declares the full governed provisioning vocabulary it realizes — all content types, all account features, accounts, ACLs, and the `macos` OS family — superseding the earlier "provisioning-only, node-type and os-family only" capability surface; "provisioning-only" now means domain scope only (no orchestrator/evaluator/participant runtime). + - Realization is **fail-closed** at every governed-value boundary so a claim can never exceed what is enforced: an ACL whose action/protocol/direction is unrecognized, whose port is invalid, whose port scope is paired with a non-`tcp`/`udp` (wildcard) protocol, or whose `from_net`/`to_net` does not resolve to a concrete CIDR is rejected with an ERROR diagnostic instead of widening into a broad allow; a placement that cannot be bound to a node in the plan fails the apply rather than being silently dropped; a password account is never unlocked without rendered credential material (key-based accounts get their authorized keys and stay password-locked); and plan-controlled identifiers interpolated into `/etc/aces` descriptor filenames are reduced to a single safe path component so a crafted account/feature/content name cannot traverse out of its descriptor directory (the content-placement `path` remains the one intentional arbitrary-write surface). Cloud-init `runcmd` entries are emitted in argv-list form (cloud-init runs them without a shell) so plan-derived paths and package names cannot inject shell commands into the root-applied guest config. Seed media is written into a freshly created, owner-verified workspace with `O_NOFOLLOW`/`O_EXCL` exclusive `0o600` writes (a pre-positioned symlink or file cannot redirect or capture rendered content); the seed directory is `0o711` (traversable, not listable) and the seed ISO is `0o600` — never world-readable — so the rendered cloud-init stays private while the libvirt/QEMU process reaches it through libvirt's dynamic-ownership relabel of the attached disk. Real libvirt/QEMU realization is exercised only on a host with the daemon; default verification stays hermetic through injected seed-builder and connection seams. (#603)- ### Added + + - libvirt backend: emit typed, blocking capability diagnostics + (`libvirt-backend.realization.unsupported-{node-type,os-family,content-type,account-feature}`) + when a provisioning plan requires a node type, OS family, content type, or + account feature outside the backend's declared manifest envelope. The backend + now fails closed on out-of-envelope terms instead of silently or partially + realizing them, consistent with the processor's manifest capability checks. (#605)- Added a libvirt backend participant runtime for the reference scenario. `create_libvirt_manifest(participant_runtime=True)` now declares `ParticipantRuntimeCapabilities` (red role, behavior features disclosed as `disclosed_weak`) plus the required participant episode/behavior contract versions, and the libvirt target provides a `LibvirtParticipantRuntime` driven through `RuntimeControlPlane`. The shared RUN-311 episode lifecycle is factored into `BaseParticipantRuntime` (reused by the reference and stub backends), and libvirt's action leaf routes through a pluggable `LibvirtParticipantDomainAdapter`; the default `DeterministicParticipantDomainAdapter` needs no live libvirt daemon and discloses that limitation in the emitted participant-implementation provenance. Without the flag the backend stays provisioning-only. (#614)- Add the libvirt evidence-run evaluator-evidence producer + (`aces libvirt evidence validate`) that composes the libvirt participant + runtime, native substrate realization, backend manifest, and + experiment/evaluation contracts into a stable, validated, redacted + `aces.libvirt.scenario-evidence-run/v1` run artifact for the enterprise + participant/evidence scenario, feeding the Brad-Edwards/aces#600 cross-backend + invariant ledger. (#615)- Added the accepted CAGE-2 replication architecture ADR and companion design + record for REP-001. (#635)- Documented the proposed realization-envelope semantics, including prior art, + manifest carriage, subsumption, witness generation, and negative conformance. (#667)- Add ADR-073 (proposed) examining whether OCR-inherited SDL scoring + (`metrics`/`evaluations`/`tlos`/`goals`) and the CybORG `agents.reward_calculator` + label belong in ACES, with scoring-scope research notes + (`docs/research/scoring-scope/`) and a SEM-206 assessment-semantics compatibility + guardrail. The ADR recommends treating these surfaces as vestigial against the + experiment-vs-data-use boundary (ADR-055/064/069) and defers the decision to + review. (#671)- `aces-sdl` is now published to PyPI (`pip install aces-sdl`). Releases are cut from a single committed `__version__` literal, bumped from the towncrier changelog fragments by `tools/release.py` (`removed` → major once ≥ 1.0 else minor, `added`/`changed`/`deprecated` → minor, `security`/`fixed` → patch; `breaking` is recorded but forced manually). Merging the release PR to `main` builds the corpus-bundled wheel + sdist, publishes over OIDC trusted publishing, and attaches a CycloneDX SBOM to the GitHub Release. (#684)- - Added a README lineage section listing the main prior-work influences behind + ACES.- Adopted `towncrier` changelog fragments so PRs add release-note snippets under `changelog.d/` instead of hand-editing `CHANGELOG.md`.- Noted in the README that APTL (Advanced Purple Team Lab) is a worked example of a separate project specifying its scenarios as ACES SDL documents and realizing the selected topology on a concrete Docker Compose backend. + +### Changed + +- Split the oversized `aces_sdl.validator` module (4,139 lines) into a package of per-validation-seam mixin modules (`_core`, runtime families, relationships, content/objectives, workflows, sections), each under the ADR-015 600-line cap, behind an API-stable `SemanticValidator` re-export, and reduced the per-pass cyclomatic/cognitive complexity of the moved validators by extracting focused helpers and shared context objects. Pure refactor: no validation behavior, diagnostics, pass ordering, or public-API change. The `validator.py` entry is removed from the oversized-source allowlist. (#42)- Migrated the backend conformance suite and CLI onto the published + contracts tree: `contracts/profiles/backend/*.json` is now the single + authority for profile-to-contract requirements (loaded via the new + schema-published `aces_contracts.backend_profiles.BackendProfileModel`, + which carries a `schema_version` field, is registered in `schema_bundle()`, + ships as `contracts/schemas/profiles/backend-profile-v1.json`, and is + validated end-to-end by `tools/check_json_artifacts.py`), the in-code + `_PROFILE_REQUIREMENTS` duplicate authority has been removed, the + `full-remote-control-plane` profile now declares the participant-episode + contracts it actually validates, and `aces conformance backend` is the + canonical Typer CLI entry point with a thin + `python -m aces_conformance.runner` compatibility delegate. The runner + and CLI accept any profile id discoverable from the JSON corpus (not + just the four known `BackendCapabilityProfile` enum members); known + runtime surfaces continue to drive capability-gap and live-probe + behavior for the four families this implementation understands, and + target conformance refuses unknown profile ids with a structured + `conformance.profile-runtime-surface-unknown` diagnostic. Profile-load + failures (missing file, malformed JSON, schema-rejected payload, swapped + identity) surface as structured `conformance.profile-load-failed` + diagnostics — with sanitized error text that does not echo rejected + payload contents — at every public surface, and CLI JSON diagnostics + now carry full `code`/`domain`/`address`/`severity` so downstream tooling + can dispatch on codes without parsing prose. The shared loader rejects + profile ids that don't match `^[a-z0-9]+(?:-[a-z0-9]+)*$` before + constructing a filesystem path, and the override path additionally + confines the resolved profile path under the supplied `profiles_root`. (#66)- Added experiment-run observability/evidence conformance diagnostics for run-level augmentation disclosures and evidence-requirement refinements. (#128)- Tightened SEM-215 outcome interpretation scope plus runtime provenance and event-grounding checks for benchmark, episode-status, action-outcome, evidence, and terminal participant-episode-history inputs. (#191)- Require API-411 participant outcome reports to carry at least one explicit state relationship in the published contract model and generated schema. (#203)- Added a runtime-snapshot conformance gate requiring participant behavior history to be tied to a compiled participant behavior binding before history is accepted. (#204)- Added SDL `behavior-specifications` for first-class participant behavior aggregates with validation, compiler output, schemas, docs, and examples. + + Refactored the behavior-specification semantic reference checks to keep the SonarCloud maintainability gate clean without changing validation behavior, including grouping the private reference-index inputs used by the validator. (#206)- Added a validated AUT-806 example, template, and pattern library covering scenarios, workflows, participant behavior, tasks, runs, and studies. (#227)- Documented and test-backed DSL-123 scenario-native observability reference coverage. (#336)- Document the ACES asset-inventory issue-template fragment and reconcile the + methodology closeout notes for ACES #353. (#353)- Clarified the SDL scenario/delivery boundary for runtime node state and added + redaction classifications for runtime mount sources/options and local-control + bind sources so host-local details can be withheld by contract. The generated + SDL JSON Schemas now carry matching conditional guards for those redacted raw + values across parser-normalized sensitivity label spellings, and ADR-033 + documents the ACES-native basis, explicit cross-repo downstream APTL limits, and + the claim scope for adjacent academic and standards sources behind the design. (#399)- Split live runtime control out of `aces_processor` into the new `aces_runtime` + package, added policy enforcement for SDL/processor/runtime module boundaries, + documented the new architecture in ADR-036 and the API reference, tightened + the boundary gate to fail closed under pre-commit/CI, and removed built-in + control-plane principals from strict defaults. Shared runtime/backend DTOs now + live in `aces_contracts`, backend protocol signatures are typed against those + contracts, module-boundary policy covers every first-party package root, and + proxy identity headers require explicit opt-in. (#410)- Added a required `control_interface_id` to `RuntimeControlInterface` so local control interfaces carry a stable, reference-able id (DSL-137). The id is symbol-validated (no empty or `${var}` placeholder) and is enforced unique across a node's `local_control_interfaces`. Generated SDL contract schemas were regenerated accordingly. (#455)- Renamed the runtime service-family inventory models `SshServerConfig` and `DatabaseService` to `RuntimeSshServer` and `RuntimeDatabaseService` so every runtime service-family model follows the uniform `Runtime` class-name invariant (DSL-139). The generated SDL authoring and instantiated schemas reflect the new `$defs` names. + + Unified the five drifted per-family secret-bearing setting-name detectors (database, DNS, directory-identity, mail-service, security-monitoring) into a single shared `name_indicates_secret` helper in `runtime_values`, backed by the de-duplicated union of every family's token set (`SECRET_NAME_TOKENS`) plus the alphanumeric-part match (`SECRET_NAME_PARTS`). Detection is now a strict superset across all runtime families, closing gaps where one family would redact a secret-bearing setting name that another would have let through. + + Renamed the seven forked runtime service-family primary identifiers to the uniform `singular(collection) + "_id"` rule (DSL-139 / #443): `RuntimeServiceListener.listener_id` to `service_listener_id`, `RuntimeIdentityAuthority.authority_id` to `identity_authority_id`, `RuntimeFileService.service_id` to `file_service_id`, `RuntimeMailService.service_id` to `mail_service_id`, `RuntimeNetworkSensor.sensor_id` to `network_sensor_id`, `RuntimeNetworkDetectionEngine.engine_id` to `network_detection_engine_id`, `RuntimeSecurityMonitoringManager.manager_id` to `security_monitoring_manager_id`, and `RuntimeSshServer.server_id` to `ssh_server_id`. Child-collection identifiers of the same spelling are unchanged, and the generated SDL authoring and instantiated schemas reflect the new field names. + + Removed the redundant scalar `RuntimeConfiguration.process` twin (DSL-139 / #443); a single observed process is now expressed as a one-element `processes` list. The generated SDL authoring and instantiated schemas drop the `process` field, and the runtime service-family structural-invariant lint now enforces an empty `KNOWN_VIOLATIONS` set across the whole surface. + + Migrated the runtime mail-service validators in-class to match every other runtime family (DSL-139 / #442): `RuntimeMailService` model-local duplicate/cross-field checks are now private `@model_validator(after)` methods, and the scenario-level mail-service and relationship `mail_access` cross-reference checks are now `SemanticValidator._verify_*` methods rather than free functions wired specially from `validate()`. Validation behavior is unchanged. + + Reconciled the runtime service-family enum surface to the enum-sentinel convention (DSL-139 / #443): every observed-value runtime enum now carries both `unknown` and `other` (open taxonomy) and closed structural/protocol/redaction-lattice vocabularies carry neither, eliminating the single-sentinel state where an enum carried exactly one of the two. Forty-nine single-sentinel runtime enums were made open by additively appending the missing sentinel (no existing value or default changed), and the generated SDL authoring and instantiated schemas reflect the new enum values. An executable drift guard (`test_runtime_enums_open_or_closed_not_single_sentinel`) now fails on any future runtime enum introduced in a single-sentinel state. (#457)- ### Changed + + - Centralize runtime observed-value redaction rules and enforce secret-bearing + raw-value omission across environment, image-default, exposed-field, and + setting surfaces. (#463)- ADR corpus policy now validates the canonical ADR template's required sections. (#482)- ### Changed + + - Added an auditable FM classification ledger and policy gate for new ADR + classification fields. (#483)- Added executable participant-runtime invariant oracle evidence for ADR-054 / ASR-505. (#486)- Add SEM-218 explicitness classification metadata to SDL validation and preserve authored exact/constrained/open classes through instantiation, including helper traversal paths that keep downstream metadata derivation consistent. (#489)- Added a native `episodes` concept family with participant-runtime lineage, + semantic-profile coverage for participant episode contracts, and tests that + anchor episode-keyed contracts to the shared concept authority. (#492)- Added a native `runtime-inventory` concept family and a `scenario-node-runtime` + reference model for `nodes.*.runtime`, with authoring-phase semantic-profile + coverage, an extension-governance decision path for runtime fields, and + reference-model binding resolution for nullable-optional schema surfaces. (#493)- Published schema evolution is now governed by an ADR-backed manifest policy: + current schemas are marked draft with canonical content hashes, and stable + schemas cannot take incompatible in-place structural changes without a version + bump. (#497)- Flipped published-schema authority per ADR-009 §7: `contracts/schemas/` is now the hand-governed normative authority, `tools/check_generated_schemas.py` proves the reference implementation generates an identical bundle without overwriting the published schemas, and a manifest change-ledger (`schema-publication-manifest.json` `last_change` for added/modified schemas and `removed_schemas` tombstones for deletions) plus the `schema-change-missing-manifest` policy rule require a contract-facing description for any schema change, including removals. (#499)- The published `instantiated-scenario-v1` contract now rejects unresolved `${var}` substitution tokens in string values — both whole-string placeholders (`"${os}"`) and embedded tokens (`"host-${index}"`) — differentiating it from `sdl-authoring-input-v1`, which still accepts them. The same invariant is enforced on the `InstantiatedScenario` model so directly constructed instances must be fully concrete. (#500)- The SEM-200 semantic-coverage gate (`tools/check_semantic_coverage.py`) now verifies integration, not just existence: an `active` row whose named tests import none of its realizing Python modules, or whose named test files contain a zero-assertion `test_*` stub, fails `nox -s policy`. Import resolution recognizes compatibility wrappers and package re-exports. Adds a read-only `--report` mode that lists construct families by status with per-row test and module-coverage counts to surface thin coverage. (#504)- State the SDL error-vs-advisory boundary normatively in `specs/sdl/diagnostics.md` §5, resolving the classification previously deferred to review IMP-3. The criterion is meaning preservation: an error affects SDL meaning (structural/semantic invariants — reference resolution, uniqueness, ambiguity, acyclicity, required-profile guards, instantiation, explicit redaction), while an advisory is a deployability or quality heuristic that leaves SDL meaning intact, with a fail-closed default for borderline cases. `docs/explain/sdl/validation.md` now cites that single normative source instead of restating the rule, and a new AST drift-guard test enforces that the reference `SemanticValidator` keeps the advisory (`_warn_*`/`_collect_advisories`) and error (`_verify_*`/`_err`) channels separate. (#505)- ### Changed + + - Hardened the participant-semantics and participant-runtime literature + lineage with the missing primary theory: interpreted systems and dynamic + epistemic logic for information states and view transitions, Kuhn's + extensive-form information sets and perfect recall, Goguen-Meseguer + noninterference and Sabelfeld-Sands declassification for the hidden-truth + boundary, STRIPS/PDDL/PDDL2.1/PPDDL/RDDL for precondition/effect contracts, + the Oliehoek-Amato Dec-POMDP monograph, mean-field game theory, + Fidge/Mattern vector time with the Schwarz-Mattern causality survey for the + `VectorClock` ordering basis, Winskel/Mazurkiewicz partial-order + concurrency, Allen/Koymans/Alur-Dill temporal formalisms, and + Chockler-Halpern responsibility for multi-cause attribution. Corrected the + PettingZoo/OpenSpiel contribution attribution (including in ADR-054's + context), the CyGIL title conflation, the CRACK venue, the Dec-POMDP + complexity authors/venue, the HLA edition, and grounded the CybORG + sim-to-emulation claim in Standen et al. (2021). (#511)- ### Changed + + - Formatted the native TechVault libvirt live-gate helpers after splitting the QEMU appliance builder and probe/readback code into dedicated modules, and added explicit VM resources to the reduced TechVault scenario variants. (#601)- Backend target conformance now runs a backend-neutral live provisioning probe + that proves real snapshot mutation for provisioning-only backends (including + libvirt/QEMU) — succeeded provisioning status, changed addresses, and at least + one provisioning-domain snapshot entry — so a backend can no longer pass target + conformance on manifest/contract-surface validation alone. Adds a daemon-free + recording libvirt driver for hermetic verification and a committed libvirt + `provisioning-only` conformance report. (#606)- Renamed the `paper-*` reference-scenario, evidence-run, and corpus identifiers to + functional names, decoupling the ACES repo from any specific publication. The + scenario is now `examples/scenarios/enterprise-participant-evidence-loop.sdl.yaml`; + the libvirt producer is `aces_operations.libvirt_evidence_run` emitting + `aces.libvirt.scenario-evidence-run/v1`; the corpus producer is + `aces_operations.cross_backend_corpus` emitting `aces.cross-backend-evidence-corpus/v1`. + The CLI command `aces libvirt paper validate-evidence` is now + `aces libvirt evidence validate` (`aces corpus build` is unchanged). The committed + demonstration corpus was removed from this repo — the producer remains, and the + canonical published corpus now lives in the public `Brad-Edwards/research` repo. (#670)- Clarified the ACES acronym expansion in the README introduction.- Dedupe the SDL module-import symbol-index hashmap-section list (now lives in `_module_symbols.py` and is re-exported to `composition.py`) and extract a shared `_verify_step_terminator_and_compensation` helper in the SDL semantic validator so OBJECTIVE and CALL workflow steps share one terminator/compensation pass instead of two near-identical inlined copies. Pure code-quality cleanup; no behavior change.- Internal refactor to clear the SonarCloud `new_violations` quality gate on the `dev → main` integration PR: split four oversized source files into focused modules — `aces_contracts/participant_behavior.py` (enums/tables → `_participant_behavior_types.py`), `aces_sdl/validator/_runtime_platform.py` (orchestration-authority checks → `_runtime_orchestration.py`), `aces_sdl/validator/_relationships.py` (proxy-upstream checks → `_relationships_proxy.py`), and `aces_sdl/runtime_datastore_partitions.py` (node child models → `runtime_datastore_nodes.py`, shared helpers → `_runtime_datastore_support.py`) — and reduced the cognitive complexity of `ParticipantHistoryViewModel._validate_nested_record_scope` plus a returns-count refactor in `runtime_values.name_indicates_secret`. No behavior change; all public APIs are preserved by re-export.- Updated repository URLs and project metadata for the move to `autarchy-ai/aces`. + +### Fixed + +- Added an authoritative schema publication manifest and verification gate for the current `contracts/schemas/` tree. (#65)- Restored the example-scenario leg of the validation corpus and closed a related runtime-planner gap surfaced by the test-quality review. The MCP-server tests now exercise the curated `examples/scenarios/` SDL files through the MCP tool flow instead of silently skipping when the path resolved to a non-existent directory. The runtime planner now enforces `allowed_values` against backend `supported_os_families` and `max_total_nodes` even when the variable carries a default; previously the compile step substituted defaults before the planner could see the variable reference, so the capability check at `aces_processor/planner.py` was unreachable. (#67)- Refactored SEM-208 participant behavior validation and runtime compilation to clear SonarCloud maintainability findings. (#185)- Fix SEM-210 runtime conformance so visibility transition anchors are participant-local, participant behavior histories reject outer/inner participant mismatches, episode-close disclosures resolve to participant episode history, and observation-time visibility only applies transitions whose anchors have occurred. (#187)- Clarified SEM-211 participant behavior-history validation documentation to mention action-result reference authorization when compiled observation boundaries are supplied. (#188)- Participant runtime capability declarations now reject duplicate values and require published contract evidence during conformance. (#199)- Refactored ACT-607 authority-scope runtime address resolution helpers to clear SonarCloud maintainability findings without changing compiler behavior. (#207)- Avoided unnecessary iterable materialization in the agent guidance helper. (#225)- Refactored runtime mail-service semantic validation to satisfy SonarCloud maintainability checks. (#420)- ### Fixed + + - Addressed SonarCloud maintainability findings in the DNS runtime inventory implementation. (#426)- ### Fixed + + - Consolidated runtime service-family registration so public exports, module namespacing aliases, and semantic runtime refs share one registry, including `ssh_servers`. Accepted `provenance` on runtime identity attributes as a checked synonym for the existing origin enum to keep TechVault capture facts lossless. (#441)- Consolidated runtime validation helper policy and backfilled mail validation documentation plus ADR gate coverage for the runtime SDL consistency work. (#442)- Tightened typed runtime relationship validation so proxy-upstream service refs resolve to real upstream services and service-integration auth principals resolve within the engine application's authorization store. (#456)- Removed name-derived raw-value omission from runtime SDL observed-value + validators so credential-shaped values remain realizable scenario content unless + they are explicitly classified as `redacted` or `operator_secret`. (#471)- Added named semantic regression tests for composition-readiness and objective-window invariants. (#488)- Added a cross-family runtime invariant lint that prevents documented required-profile discriminators from shipping without registered Pydantic guard wiring. (#503)- Tightened citation hygiene across the SDL lineage and precedent documentation: expanded a bare-DOI citation to a full inline author-title-venue reference, snapshotted a Zotero-only preprint citation into a repo-tracked `docs/research/primary/` page so it is verifiable from the repository alone, relabelled the SCN-010 expressivity gap analysis's review process honestly (architect-guided adversarial self-review rather than an external peer-review panel), added a Syntax/Semantics/Both ("Borrowed") column to the design-precedent tables, sharpened the OpenC2 lineage boundary (command/response principle borrowed, payload/target structures not adopted), and added a research-corpus and citation-verification-scope note to the SDL limitations. (#509)- ### Fixed + + - Closed the participant-runtime formal-spec defects found in the 2026-06 + review: `mapping_loss` is now a closed vocabulary (with + `mapping_loss_detail`); `LifecycleEnvelope` carries the + attribution-edge and outcome-interpretation references its overview names + (SEM-212/SEM-215 cross-ref); the declared delivery point is defined and + carried (`delivery_basis`, `delivery_point_ref`, `delivered_at`) and the + visible-history projection binds to it; stable redaction tokens have a + declared stability scope; rollback/supersession can never rewrite + participant-visible history; marking enforcement and visibility projection + compose deny-first; `ClassificationClaim` defines when + `event_classification`/`source_status` may be null; fully opaque + participants have a defined minimal observable trace; the capability meet + is total over affecting components (missing declarations contribute + `unsupported`, never skipped); and reconstruction algorithm/proof refs must + resolve through a versioned reconstruction registry. (#512)- ### Fixed + + - Corrected the shared-semantic-integrity coverage table: SEM-214 (derived + operational context views, DRAFT/wave-3, no artifacts) no longer shares an + `active` row with SEM-215; it now has its own `planned` row. Resolved the + scheduling inversion for the MUST-priority time-model requirements by + assigning wave 2 to SEM-227, SEM-228, and SEM-229 in Ground Control, which + ACTIVE SEM-213 temporal semantics explicitly defer to. (#513)- Corrected the ACES asset-inventory capture guidance so participant-discoverable scenario-target secrets are preserved in source evidence bundles, while operator/out-of-scenario secrets remain withheld or recorded as capture limits. (#516)- Declared `packaging` as a runtime dependency of `aces-sdl`. It was imported by `aces_sdl.module_registry` on the CLI import path but only present transitively, so any `aces` command failed with `ModuleNotFoundError: No module named 'packaging'` in a clean wheel install. (#537)- `aces sdl resolve` now records `local:` imports with a checkout-independent, SDL-base-relative `resolved_source` (POSIX separators) instead of an absolute machine path, so a committed `aces.lock.json` is portable. `aces sdl verify-imports` now passes on any checkout regardless of its absolute path — including CI and other contributors' machines — and fails only when imported content actually changes. Lockfiles generated before this fix contain absolute paths and are treated as stale; re-run `aces sdl resolve` to regenerate them. (#551)- ### Fixed + + - Reduced native TechVault libvirt live-gate helper complexity and documented generated boot-artifact permissions so SonarCloud accepts the native backend path. + - Kept the native TechVault live CLI on a clean-boot-only public path and moved the generated boot-artifact permission exception into scoped Sonar configuration. (#601)- Made libvirt backend teardown idempotent: a DELETE for a domain or network that is already absent now succeeds as torn down (connection, permission, and ownership failures still fail closed), and a partial CREATE that defines a domain before it fails to start is now rolled back so no orphaned domains, networks, or seed media are left behind. (#604)- ### Fixed + + - Enforced SDL variable declaration-name grammar and embedded placeholder validation consistently across parser, semantic validation, and published schemas, with factored traversal for variable-reference checks. (#655)- Target conformance no longer assumes every backend can realize an arbitrary + reference scenario. `run_target_conformance` accepts an optional + `reference_scenario`, so a fixed-topology emulation or bounded simulation + backend can certify against a scenario it declares it can realize instead of + being wrongly failed for not realizing a hard-coded `vm` node; the issue #606 + full-realization guard still applies to whichever scenario is selected. + Temporary bridge superseded by the realizability-envelope design (#667/#668). (#663)- - Restored SonarCloud configuration to the existing KeplerOps ACES SDL project + while leaving the GitHub repository location under `autarchy-ai/aces`. ## [0.17.0] - 2026-05-10 diff --git a/changelog.d/+act-601-sonarcloud-dedup.changed.md b/changelog.d/+act-601-sonarcloud-dedup.changed.md deleted file mode 100644 index 9709f96d1..000000000 --- a/changelog.d/+act-601-sonarcloud-dedup.changed.md +++ /dev/null @@ -1 +0,0 @@ -Dedupe the SDL module-import symbol-index hashmap-section list (now lives in `_module_symbols.py` and is re-exported to `composition.py`) and extract a shared `_verify_step_terminator_and_compensation` helper in the SDL semantic validator so OBJECTIVE and CALL workflow steps share one terminator/compensation pass instead of two near-identical inlined copies. Pure code-quality cleanup; no behavior change. diff --git a/changelog.d/+add-lineage-docs.added.md b/changelog.d/+add-lineage-docs.added.md deleted file mode 100644 index 7a866375a..000000000 --- a/changelog.d/+add-lineage-docs.added.md +++ /dev/null @@ -1,2 +0,0 @@ -- Added a README lineage section listing the main prior-work influences behind - ACES. diff --git a/changelog.d/+dependabot-security-bumps.security.md b/changelog.d/+dependabot-security-bumps.security.md deleted file mode 100644 index bd0a067ed..000000000 --- a/changelog.d/+dependabot-security-bumps.security.md +++ /dev/null @@ -1 +0,0 @@ -Bumped `asyncssh` (2.23.1), `cryptography` (49.0.0), `idna` (3.18), `pytest` (9.1.0), and `starlette` (1.3.1) in the Python lockfile to clear five moderate Dependabot advisories: AsyncSSH `AuthorizedKeysFile %u` path traversal (GHSA-g794-3fmp-753h), cryptography non-contiguous-buffer overflow (GHSA-p423-j2cm-9vmq), idna `encode()` CVE-2024-3651 bypass (GHSA-65pc-fj4g-8rjx), pytest tmpdir handling (GHSA-6w46-j5rx-g56g), and Starlette missing Host-header validation (GHSA-86qp-5c8j-p5mr). The directly-declared floors for `cryptography`, `asyncssh`, and `pytest` were raised to their patched versions to prevent regression. diff --git a/changelog.d/+explain-aces-acronym.changed.md b/changelog.d/+explain-aces-acronym.changed.md deleted file mode 100644 index 79396e8bf..000000000 --- a/changelog.d/+explain-aces-acronym.changed.md +++ /dev/null @@ -1 +0,0 @@ -Clarified the ACES acronym expansion in the README introduction. diff --git a/changelog.d/+readme-aptl-example.added.md b/changelog.d/+readme-aptl-example.added.md deleted file mode 100644 index 7763b77a6..000000000 --- a/changelog.d/+readme-aptl-example.added.md +++ /dev/null @@ -1 +0,0 @@ -Noted in the README that APTL (Advanced Purple Team Lab) is a worked example of a separate project specifying its scenarios as ACES SDL documents and realizing the selected topology on a concrete Docker Compose backend. diff --git a/changelog.d/+restore-sonarcloud-project.fixed.md b/changelog.d/+restore-sonarcloud-project.fixed.md deleted file mode 100644 index 287e468c6..000000000 --- a/changelog.d/+restore-sonarcloud-project.fixed.md +++ /dev/null @@ -1,2 +0,0 @@ -- Restored SonarCloud configuration to the existing KeplerOps ACES SDL project - while leaving the GitHub repository location under `autarchy-ai/aces`. diff --git a/changelog.d/+sonar-modularity-refactor.changed.md b/changelog.d/+sonar-modularity-refactor.changed.md deleted file mode 100644 index 415eef059..000000000 --- a/changelog.d/+sonar-modularity-refactor.changed.md +++ /dev/null @@ -1 +0,0 @@ -Internal refactor to clear the SonarCloud `new_violations` quality gate on the `dev → main` integration PR: split four oversized source files into focused modules — `aces_contracts/participant_behavior.py` (enums/tables → `_participant_behavior_types.py`), `aces_sdl/validator/_runtime_platform.py` (orchestration-authority checks → `_runtime_orchestration.py`), `aces_sdl/validator/_relationships.py` (proxy-upstream checks → `_relationships_proxy.py`), and `aces_sdl/runtime_datastore_partitions.py` (node child models → `runtime_datastore_nodes.py`, shared helpers → `_runtime_datastore_support.py`) — and reduced the cognitive complexity of `ParticipantHistoryViewModel._validate_nested_record_scope` plus a returns-count refactor in `runtime_values.name_indicates_secret`. No behavior change; all public APIs are preserved by re-export. diff --git a/changelog.d/+towncrier-adoption.added.md b/changelog.d/+towncrier-adoption.added.md deleted file mode 100644 index 59c00c1b5..000000000 --- a/changelog.d/+towncrier-adoption.added.md +++ /dev/null @@ -1 +0,0 @@ -Adopted `towncrier` changelog fragments so PRs add release-note snippets under `changelog.d/` instead of hand-editing `CHANGELOG.md`. diff --git a/changelog.d/+update-repository-location.changed.md b/changelog.d/+update-repository-location.changed.md deleted file mode 100644 index e9418d0b6..000000000 --- a/changelog.d/+update-repository-location.changed.md +++ /dev/null @@ -1 +0,0 @@ -Updated repository URLs and project metadata for the move to `autarchy-ai/aces`. diff --git a/changelog.d/105.added.md b/changelog.d/105.added.md deleted file mode 100644 index 8e54e501a..000000000 --- a/changelog.d/105.added.md +++ /dev/null @@ -1,3 +0,0 @@ -Add EXP-706/EXP-712 trial, replication, reproducibility, and replay-claim -design guidance for experiment-core ADRs, formal specs, and preflight -guardrails. diff --git a/changelog.d/115.added.md b/changelog.d/115.added.md deleted file mode 100644 index 9e8854d33..000000000 --- a/changelog.d/115.added.md +++ /dev/null @@ -1,5 +0,0 @@ -Publish the GOV-913 reusable-asset trust, authenticity, and integrity policy: -a normative spec (`specs/supply-chain/reusable-asset-trust-integrity.md`), -ADR-071, and the `reusable-asset-trust-policy-v1` contract declaring, per -reusable asset family, the required integrity/authenticity/provenance/governance -evidence classes referencing existing ACES trust mechanisms. diff --git a/changelog.d/12.security.md b/changelog.d/12.security.md deleted file mode 100644 index b236b7e41..000000000 --- a/changelog.d/12.security.md +++ /dev/null @@ -1 +0,0 @@ -Bound OCI module import fetches against memory and disk exhaustion. The registry resolver now caps every remote response before buffering it — a separate, larger limit for the compressed bundle blob than for tag-list, manifest, and config metadata — rejecting an oversized or invalid `Content-Length` early and enforcing the cap on the bytes actually read so a compromised or malicious registry cannot force an unbounded in-memory buffer. Bundle extraction additionally bounds the tar member count, per-member extracted size, and total extracted bytes (rejecting duplicate paths), iterating members lazily so an oversized or decompression-bomb bundle fails closed before the archive is fully unpacked. Explicit network timeouts and the issue #13 tar path/link/mode safety checks remain in force. diff --git a/changelog.d/128.changed.md b/changelog.d/128.changed.md deleted file mode 100644 index 7a4a995f3..000000000 --- a/changelog.d/128.changed.md +++ /dev/null @@ -1 +0,0 @@ -Added experiment-run observability/evidence conformance diagnostics for run-level augmentation disclosures and evidence-requirement refinements. diff --git a/changelog.d/129.added.md b/changelog.d/129.added.md deleted file mode 100644 index f9b993aee..000000000 --- a/changelog.d/129.added.md +++ /dev/null @@ -1 +0,0 @@ -Added participant implementation manifest and provenance contracts with generated schemas, fixtures, conformance validation, and documentation. diff --git a/changelog.d/13.security.md b/changelog.d/13.security.md deleted file mode 100644 index 24da67d6c..000000000 --- a/changelog.d/13.security.md +++ /dev/null @@ -1 +0,0 @@ -Harden OCI module bundle extraction to fail closed on every supported Python runtime. The resolver now validates the entire tar archive before writing — rejecting path traversal, symlinks, hard links, and special files, and stripping setuid/setgid/sticky bits — instead of relying on `tarfile`'s `filter="data"`, which is unavailable on Python 3.11.0–3.11.3 (the PEP 706 backport landed in 3.11.4) and previously allowed an unsafe extraction path on those supported runtimes. diff --git a/changelog.d/14.security.md b/changelog.d/14.security.md deleted file mode 100644 index 457bf7cc6..000000000 --- a/changelog.d/14.security.md +++ /dev/null @@ -1 +0,0 @@ -Bind the OCI module config object into the resolver's trust boundary. The registry resolver now verifies that the fetched config blob bytes hash to the manifest's `config.digest` before decoding it — fetching by digest is not integrity, so a compromised registry could previously serve arbitrary config bytes (carrying the unsigned `root_file` entrypoint) under a valid manifest. The Ed25519 signature payload now also binds `root_file` alongside the module identity, exports, and bundle `content_digest`, and the resolver verifies the signature over the same `root_file` it extracts. Together these close a semantic-substitution attack where a registry that cannot alter the signed bundle could still repoint resolution to a different file already inside that bundle by rewriting `root_file`. Signatures produced over the previous payload (which omitted `root_file`) fail closed when signatures are required. diff --git a/changelog.d/143.security.md b/changelog.d/143.security.md deleted file mode 100644 index 77504df71..000000000 --- a/changelog.d/143.security.md +++ /dev/null @@ -1 +0,0 @@ -Port runtime control-plane and SDL module-registry security hardening onto the current package layout. diff --git a/changelog.d/162.added.md b/changelog.d/162.added.md deleted file mode 100644 index 59bca970d..000000000 --- a/changelog.d/162.added.md +++ /dev/null @@ -1 +0,0 @@ -Added the proposed falsification-first claim evidence gate ADR for ASR-530. diff --git a/changelog.d/185.added.md b/changelog.d/185.added.md deleted file mode 100644 index 27f4f2bd6..000000000 --- a/changelog.d/185.added.md +++ /dev/null @@ -1 +0,0 @@ -Added governed participant behavior contracts, observation boundaries, compiled participant behavior addresses, and a published participant behavior history stream for SEM-208. diff --git a/changelog.d/185.fixed.md b/changelog.d/185.fixed.md deleted file mode 100644 index 0a849091c..000000000 --- a/changelog.d/185.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Refactored SEM-208 participant behavior validation and runtime compilation to clear SonarCloud maintainability findings. diff --git a/changelog.d/186.added.md b/changelog.d/186.added.md deleted file mode 100644 index 5d2533095..000000000 --- a/changelog.d/186.added.md +++ /dev/null @@ -1 +0,0 @@ -Add explicit SEM-209 participant interaction semantics for action contracts, behavior history provenance, reference validation, and joint-action ordering conformance. diff --git a/changelog.d/187.added.md b/changelog.d/187.added.md deleted file mode 100644 index a6da34300..000000000 --- a/changelog.d/187.added.md +++ /dev/null @@ -1 +0,0 @@ -Add SEM-210 participant visibility and information-boundary contracts with ordered, evidence-backed view transitions, runtime view-relation timelines, behavior-history anchors, snapshot-scoped hidden-truth observation guards, closed participant observation detail metadata, and fail-closed reference validation. diff --git a/changelog.d/187.fixed.md b/changelog.d/187.fixed.md deleted file mode 100644 index d4d56bfcb..000000000 --- a/changelog.d/187.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Fix SEM-210 runtime conformance so visibility transition anchors are participant-local, participant behavior histories reject outer/inner participant mismatches, episode-close disclosures resolve to participant episode history, and observation-time visibility only applies transitions whose anchors have occurred. diff --git a/changelog.d/188.added.md b/changelog.d/188.added.md deleted file mode 100644 index b2bf1f41e..000000000 --- a/changelog.d/188.added.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- Added typed participant action precondition, effect, failure, and action-result semantics for SEM-211, - including complete precondition coverage checks, declared reference validation, action-result - evidence grounding, observation-boundary authorization, action-result observation-point anchoring, and durable - participant behavior-history persistence. diff --git a/changelog.d/188.fixed.md b/changelog.d/188.fixed.md deleted file mode 100644 index e0f14501b..000000000 --- a/changelog.d/188.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Clarified SEM-211 participant behavior-history validation documentation to mention action-result reference authorization when compiled observation boundaries are supplied. diff --git a/changelog.d/189.added.md b/changelog.d/189.added.md deleted file mode 100644 index ed8003f7f..000000000 --- a/changelog.d/189.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added -- Add SEM-212 participant attribution edge semantics, runtime validation, contract schema publication, and adversarial tests. -- Refactor participant attribution event parsing and validation helpers for the SonarCloud complexity gate. diff --git a/changelog.d/190.added.md b/changelog.d/190.added.md deleted file mode 100644 index 3a2246988..000000000 --- a/changelog.d/190.added.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- Added SEM-213 temporal participant contracts, runtime temporal-context - validation, backend timing disclosures, generated schema publication, and - adversarial tests for domain/clock/disclosure, contract-shape, bounded timing, - and cadence/deadline/dwell/timeout state-machine failures. diff --git a/changelog.d/191.added.md b/changelog.d/191.added.md deleted file mode 100644 index d7821c1fe..000000000 --- a/changelog.d/191.added.md +++ /dev/null @@ -1 +0,0 @@ -Add explicit SEM-215 participant outcome interpretation rules and runtime records that relate participant-local outcomes to objective, workflow, evaluation, evidence, and reward meaning only through declared provenance-bearing rules. diff --git a/changelog.d/191.changed.md b/changelog.d/191.changed.md deleted file mode 100644 index 97628e04f..000000000 --- a/changelog.d/191.changed.md +++ /dev/null @@ -1 +0,0 @@ -Tightened SEM-215 outcome interpretation scope plus runtime provenance and event-grounding checks for benchmark, episode-status, action-outcome, evidence, and terminal participant-episode-history inputs. diff --git a/changelog.d/192.added.md b/changelog.d/192.added.md deleted file mode 100644 index d5b890c4b..000000000 --- a/changelog.d/192.added.md +++ /dev/null @@ -1,6 +0,0 @@ -Added RUN-305 participant runtime state/history enforcement: behavior history now -survives public runtime snapshots, uses tighter generated schema constraints, -and is rejected on backend apply when the snapshot shape, participant identity, -episode anchoring, append-only history prefix, or metadata boundary is invalid. -The behavior-history model now also rejects boolean `realized_order` values so -Python model validation matches the published JSON Schema and semantic validator. diff --git a/changelog.d/193.added.md b/changelog.d/193.added.md deleted file mode 100644 index 0be036585..000000000 --- a/changelog.d/193.added.md +++ /dev/null @@ -1 +0,0 @@ -Added RUN-306 participant runtime lifecycle fields and Sonar-clean shared validation to behavior-history event contracts, schemas, and validators. diff --git a/changelog.d/194.added.md b/changelog.d/194.added.md deleted file mode 100644 index e809b2f49..000000000 --- a/changelog.d/194.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added -- Added first-class RUN-307 shared operational state records/history to runtime snapshots with revision-aware validation. -- Added semantic diagnostics for malformed shared-state records, access markers, and append-only history violations. diff --git a/changelog.d/195.added.md b/changelog.d/195.added.md deleted file mode 100644 index 0a724e5d4..000000000 --- a/changelog.d/195.added.md +++ /dev/null @@ -1 +0,0 @@ -Added RUN-308 participant-runtime contract surfaces for joint action records, time-management contexts, runtime snapshot concurrency validation, and coverage for the concurrency guardrails. diff --git a/changelog.d/196.added.md b/changelog.d/196.added.md deleted file mode 100644 index 2dbda03be..000000000 --- a/changelog.d/196.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a repository-owned reference processor (`aces_processor.reference.run_reference_processor` / `ReferenceProcessor`) that realizes the normative processing model: it carries SDL authoring input through instantiation, compilation, and planning to a portable execution plan and exposes the published processor manifest. Per ADR-008 the processor stops at the execution plan; backend realization stays in the runtime. The backend-conformance live probe now consumes the reference processor instead of inlining the compile/plan chain, and new tests drive its plan through the reference runtime to prove every contract version the processor manifest declares is exercised end to end. (RUN-313) diff --git a/changelog.d/197.added.md b/changelog.d/197.added.md deleted file mode 100644 index e2097d609..000000000 --- a/changelog.d/197.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a repository-owned reference emulation backend (`aces_reference_backend`) that implements the four backend protocol roles (Provisioner, Orchestrator, Evaluator, ParticipantRuntime) over a pluggable deployment driver. The default in-process driver is hermetic; an opt-in OCI driver realizes plans against a real container runtime (docker/podman) through fixed-argv subprocess calls with bounded timeouts and no secret/native-id leakage into any portable artifact. The backend publishes identity/capability through the standard `BackendManifest`, registers on the existing `BackendRegistry` descriptor seam as `reference-emulation`, and passes `run_target_conformance` at the `FULL_REMOTE_CONTROL_PLANE` profile. Provenance flows through the SEM-218 apply gate; only portable ACES facts reach snapshots, diagnostics, and conformance reports. A `docker`-marked, runtime-gated integration test and a non-blocking `integration_docker` nox session / CI job exercise real-container realization without touching the hermetic `verify` graph. (RUN-314, ADR-063) diff --git a/changelog.d/199.added.md b/changelog.d/199.added.md deleted file mode 100644 index 0113dbe19..000000000 --- a/changelog.d/199.added.md +++ /dev/null @@ -1 +0,0 @@ -Backend manifests now declare supported participant roles, behavior features, and interaction features on participant runtime capability blocks. diff --git a/changelog.d/199.fixed.md b/changelog.d/199.fixed.md deleted file mode 100644 index 212d51d1c..000000000 --- a/changelog.d/199.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Participant runtime capability declarations now reject duplicate values and require published contract evidence during conformance. diff --git a/changelog.d/200.added.md b/changelog.d/200.added.md deleted file mode 100644 index 6b90390ba..000000000 --- a/changelog.d/200.added.md +++ /dev/null @@ -1,5 +0,0 @@ -### Added - -- Made the API-406 participant lifecycle-event, observation-envelope, and - shared-state record contracts required by the full remote control-plane - backend profile and registered their conformance model validators. diff --git a/changelog.d/201.added.md b/changelog.d/201.added.md deleted file mode 100644 index 031c3ee02..000000000 --- a/changelog.d/201.added.md +++ /dev/null @@ -1 +0,0 @@ -Expose API-407 participant feature-support declarations through backend manifest capability helpers and preserve them in rendered backend-manifest v2 payloads. diff --git a/changelog.d/202.added.md b/changelog.d/202.added.md deleted file mode 100644 index a991a10d6..000000000 --- a/changelog.d/202.added.md +++ /dev/null @@ -1 +0,0 @@ -Expose API-408 participant status, history, and reference/provenance context retrieval views through the runtime control plane and HTTP API. diff --git a/changelog.d/203.changed.md b/changelog.d/203.changed.md deleted file mode 100644 index b1079b1e5..000000000 --- a/changelog.d/203.changed.md +++ /dev/null @@ -1 +0,0 @@ -Require API-411 participant outcome reports to carry at least one explicit state relationship in the published contract model and generated schema. diff --git a/changelog.d/204.changed.md b/changelog.d/204.changed.md deleted file mode 100644 index a8aec51da..000000000 --- a/changelog.d/204.changed.md +++ /dev/null @@ -1 +0,0 @@ -Added a runtime-snapshot conformance gate requiring participant behavior history to be tied to a compiled participant behavior binding before history is accepted. diff --git a/changelog.d/206.changed.md b/changelog.d/206.changed.md deleted file mode 100644 index b64fa40e3..000000000 --- a/changelog.d/206.changed.md +++ /dev/null @@ -1,3 +0,0 @@ -Added SDL `behavior-specifications` for first-class participant behavior aggregates with validation, compiler output, schemas, docs, and examples. - -Refactored the behavior-specification semantic reference checks to keep the SonarCloud maintainability gate clean without changing validation behavior, including grouping the private reference-index inputs used by the validator. diff --git a/changelog.d/207.added.md b/changelog.d/207.added.md deleted file mode 100644 index 79e10fd2c..000000000 --- a/changelog.d/207.added.md +++ /dev/null @@ -1 +0,0 @@ -Expose ACT-607 participant authority and scope declarations as compiled runtime metadata. diff --git a/changelog.d/207.fixed.md b/changelog.d/207.fixed.md deleted file mode 100644 index ed5fb67a7..000000000 --- a/changelog.d/207.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Refactored ACT-607 authority-scope runtime address resolution helpers to clear SonarCloud maintainability findings without changing compiler behavior. diff --git a/changelog.d/208.added.md b/changelog.d/208.added.md deleted file mode 100644 index d845c51fe..000000000 --- a/changelog.d/208.added.md +++ /dev/null @@ -1 +0,0 @@ -Added ACT-608 participant behavior-mode scope validation so authored behavior specifications resolve through the governed decision-surface mode vocabulary. diff --git a/changelog.d/209.added.md b/changelog.d/209.added.md deleted file mode 100644 index 7b55867e7..000000000 --- a/changelog.d/209.added.md +++ /dev/null @@ -1 +0,0 @@ -Added ACT-609 offensive behavior refs on behavior specifications, backed by separately governed MITRE ATT&CK Enterprise tactics v19.1 and MITRE ATLAS tactics v2026.06 vocabularies, pinned source lineage, SDL validation, generated schemas, and compiler carry-through. diff --git a/changelog.d/223.added.md b/changelog.d/223.added.md deleted file mode 100644 index 315690c36..000000000 --- a/changelog.d/223.added.md +++ /dev/null @@ -1 +0,0 @@ -Added claim-aware ACES MCP tools for parsing, compile/plan dry runs, manifest introspection, design assessment, and supported-claim assessment for scenario authors. diff --git a/changelog.d/224.added.md b/changelog.d/224.added.md deleted file mode 100644 index 3b4a593d7..000000000 --- a/changelog.d/224.added.md +++ /dev/null @@ -1,3 +0,0 @@ -Added SDL language-service helpers and MCP tools for completions, references, formatting, structured diagnostics, and structured edits. -Refined reference navigation and structured edit coverage for SonarCloud quality gates. -Consolidated language-service diagnostic payload helpers to avoid duplicated implementation blocks. diff --git a/changelog.d/225.added.md b/changelog.d/225.added.md deleted file mode 100644 index a6d24964b..000000000 --- a/changelog.d/225.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a canonical AUT-811 agent guidance profile, checker, MCP tool, tests, and docs for machine-readable scope boundaries, invariants, review priorities, and safe-operating expectations. diff --git a/changelog.d/225.fixed.md b/changelog.d/225.fixed.md deleted file mode 100644 index 1cb9f0a7e..000000000 --- a/changelog.d/225.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Avoided unnecessary iterable materialization in the agent guidance helper. diff --git a/changelog.d/226.added.md b/changelog.d/226.added.md deleted file mode 100644 index 8d9b35a54..000000000 --- a/changelog.d/226.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a repo-wide documentation style guide, glossary, reference map, documentation-scope guidance, and corrected setup references for current-state, cited technical and academic prose; local nox pre-commit hooks now run serially to avoid concurrent schema-generation races during all-files checks. diff --git a/changelog.d/227.added.md b/changelog.d/227.added.md deleted file mode 100644 index 1c360ca2e..000000000 --- a/changelog.d/227.added.md +++ /dev/null @@ -1 +0,0 @@ -Added current-state getting-started guidance and an examples inventory that state available ACES entrypoints, validation levels, and unsupported template or pattern surfaces. diff --git a/changelog.d/227.changed.md b/changelog.d/227.changed.md deleted file mode 100644 index 13608efa5..000000000 --- a/changelog.d/227.changed.md +++ /dev/null @@ -1 +0,0 @@ -Added a validated AUT-806 example, template, and pattern library covering scenarios, workflows, participant behavior, tasks, runs, and studies. diff --git a/changelog.d/233.added.md b/changelog.d/233.added.md deleted file mode 100644 index f4bb06255..000000000 --- a/changelog.d/233.added.md +++ /dev/null @@ -1 +0,0 @@ -Add negative conformance coverage and an invalid fixture for the EXP-707 experiment-capture-spec-v1 contract: a dedicated rejection test exercising the capture-requirement key-equality, window-reference resolution, capture-window time-ordering, and under-specified-window invariants, plus a schema-and-model invalid fixture for a window that declares no start, end, or trigger. diff --git a/changelog.d/234.added.md b/changelog.d/234.added.md deleted file mode 100644 index 25b7588c4..000000000 --- a/changelog.d/234.added.md +++ /dev/null @@ -1 +0,0 @@ -Add negative conformance coverage and invalid fixtures for the EXP-708 experiment-evidence-record-v1 contract: a dedicated rejection test exercising the content-uri-requires-checksum, non-empty source-refs, RFC 3339 captured-at, and redaction-requires-loss-disclosure invariants, plus schema-and-model invalid fixtures for a content URI without a checksum, an empty source-refs list, and a malformed captured-at timestamp. The model and published schema shipped under #88; this change adds the conformance tests of record without changing them. diff --git a/changelog.d/235.added.md b/changelog.d/235.added.md deleted file mode 100644 index 85bbc7ea6..000000000 --- a/changelog.d/235.added.md +++ /dev/null @@ -1 +0,0 @@ -Add negative conformance coverage and invalid fixtures for the EXP-709 experiment-derived-measure-v1 contract: a dedicated rejection test exercising the reported-requires-value, non-reported-must-not-carry-value, and RFC 3339 generated-at invariants, plus schema-and-model invalid fixtures for a reported measure without a value, a withheld measure carrying a value, and a malformed generated-at timestamp. The model and published schema shipped under #88; this change adds the conformance tests of record without changing them. diff --git a/changelog.d/238.added.md b/changelog.d/238.added.md deleted file mode 100644 index e997b29a9..000000000 --- a/changelog.d/238.added.md +++ /dev/null @@ -1 +0,0 @@ -Add negative conformance coverage and invalid fixtures for the EXP-720 experiment-run-v1 canonical run provenance contract: a dedicated rejection test exercising the run-traceability claim-grounding and duplicate-reference invariants, the realized-form-disclosure substantive and processor/backend authority invariants, and the required traceability capture-spec surface, plus schema-and-model invalid fixtures for a realized-form disclosure missing a realized target, a backend-realized disclosure carrying a processor realization authority, and a run whose traceability omits capture-spec references. The model and published schema shipped under #89; this change adds the conformance tests of record without changing them. diff --git a/changelog.d/239.added.md b/changelog.d/239.added.md deleted file mode 100644 index 633f7ffc1..000000000 --- a/changelog.d/239.added.md +++ /dev/null @@ -1 +0,0 @@ -Add negative conformance coverage and an invalid fixture for the EXP-722 experiment-run-v1 realized-form disclosure contract: a dedicated rejection test exercising the realized-form substantive invariants (a disclosure must name a realized reference or value summary and use the matching processor/backend realization authority) and the run-level invariant that disclosure evidence refs must be listed in the run traceability evidence refs and must be duplicate-free, plus a schema-and-model invalid fixture for a processor-realized disclosure carrying a backend realization authority. The model and published schema shipped under #89; this change adds the conformance tests of record without changing them. diff --git a/changelog.d/247.added.md b/changelog.d/247.added.md deleted file mode 100644 index e7e28068b..000000000 --- a/changelog.d/247.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Published SEM-214 meaning and comparability semantics for API-408 participant context views. diff --git a/changelog.d/248.added.md b/changelog.d/248.added.md deleted file mode 100644 index 556965668..000000000 --- a/changelog.d/248.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Published SEM-216 boundary semantics distinguishing runtime-observable state, captured evidence, derived evaluations, analysis outputs, and audience-specific views over the existing contract families. Participant-visible context views drawing on archival `evidence_record` or `derived_measure` source layers must now declare a governed view rule and redaction policy and mediate the source through the transformation, and redacted or withheld evidence records must disclose redaction/loss at the schema boundary. diff --git a/changelog.d/249.added.md b/changelog.d/249.added.md deleted file mode 100644 index 6a7b11436..000000000 --- a/changelog.d/249.added.md +++ /dev/null @@ -1 +0,0 @@ -Added SEM-217 external knowledge binding effect semantics, including a typed classifier for annotation, alignment, refinement, and constraint effects over existing concept-authority and semantic-profile artifacts. diff --git a/changelog.d/331.added.md b/changelog.d/331.added.md deleted file mode 100644 index 53075c181..000000000 --- a/changelog.d/331.added.md +++ /dev/null @@ -1 +0,0 @@ -Added ASR-521 participant benchmark conformance preflight guardrails. diff --git a/changelog.d/334.added.md b/changelog.d/334.added.md deleted file mode 100644 index b43ab5b73..000000000 --- a/changelog.d/334.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Published SEM-224 observability plane separation semantics: a carrier-oriented plane classifier (`aces_sdl.observability_plane_semantics`) that assigns each claim-bearing observability/evidence artifact exactly one of the five named planes — scenario-native observability, authored evidence requirement, processor/backend operational observability, captured evidence, and derived analysis — by carrier role rather than by free-form strings such as `log`, `trace`, or `evidence`. The three claim-bearing experiment-core contracts (`experiment-capture-spec-v1`, `experiment-evidence-record-v1`, `experiment-derived-measure-v1`) now publish their plane as a portable `x-aces-plane` schema annotation sourced from that classifier. diff --git a/changelog.d/335.added.md b/changelog.d/335.added.md deleted file mode 100644 index cf0382d73..000000000 --- a/changelog.d/335.added.md +++ /dev/null @@ -1,2 +0,0 @@ -Added SEM-225 run-level augmentation disclosures to `experiment-run-v1`, with validation for processor/backend authority, environment-visible carriers, participant-visible markings, comparability observer effects, and run-traced evidence provenance. -Refactored the SEM-225 disclosure validator into focused helper checks so the published contract validation stays maintainable. diff --git a/changelog.d/336.changed.md b/changelog.d/336.changed.md deleted file mode 100644 index 44f125dca..000000000 --- a/changelog.d/336.changed.md +++ /dev/null @@ -1 +0,0 @@ -Documented and test-backed DSL-123 scenario-native observability reference coverage. diff --git a/changelog.d/337.added.md b/changelog.d/337.added.md deleted file mode 100644 index e9083a9b9..000000000 --- a/changelog.d/337.added.md +++ /dev/null @@ -1 +0,0 @@ -Added the SDL `evidence_requirements` section, validation, and schema support for authored data, evidence, and output capture obligations. diff --git a/changelog.d/338.added.md b/changelog.d/338.added.md deleted file mode 100644 index c9e5db333..000000000 --- a/changelog.d/338.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a read-only runtime control-plane operational summary for processor/backend apparatus monitoring and troubleshooting. diff --git a/changelog.d/34.added.md b/changelog.d/34.added.md deleted file mode 100644 index 4785f94a4..000000000 --- a/changelog.d/34.added.md +++ /dev/null @@ -1 +0,0 @@ -Added an advisory (non-gating) OSV-scanner CI job that scans `implementations/python/uv.lock` for known CVEs against the OSV.dev advisory feed and publishes the findings as a JSON report artifact. diff --git a/changelog.d/353.changed.md b/changelog.d/353.changed.md deleted file mode 100644 index ebd8cd0cd..000000000 --- a/changelog.d/353.changed.md +++ /dev/null @@ -1,2 +0,0 @@ -Document the ACES asset-inventory issue-template fragment and reconcile the -methodology closeout notes for ACES #353. diff --git a/changelog.d/354.added.md b/changelog.d/354.added.md deleted file mode 100644 index a8fc5eb07..000000000 --- a/changelog.d/354.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Added typed SDL node runtime metadata for mounts, local control interfaces, process identity, package inventory, dependency manifests, and scanner-derived package vulnerability findings. diff --git a/changelog.d/358.added.md b/changelog.d/358.added.md deleted file mode 100644 index d8baa7be5..000000000 --- a/changelog.d/358.added.md +++ /dev/null @@ -1 +0,0 @@ -Add typed SDL runtime surfaces for observed process sets, runtime environment variables, Linux capability policy, restart policy, and container resource limits; support issue-only CI verification for no-requirement implementation branches. diff --git a/changelog.d/363.added.md b/changelog.d/363.added.md deleted file mode 100644 index 13f19c1c3..000000000 --- a/changelog.d/363.added.md +++ /dev/null @@ -1 +0,0 @@ -Add typed SDL runtime surfaces for filesystem inventory, container host/security configuration, full mount metadata, and health observations, with TechVault runtime parity example coverage. diff --git a/changelog.d/364.added.md b/changelog.d/364.added.md deleted file mode 100644 index 1da030b76..000000000 --- a/changelog.d/364.added.md +++ /dev/null @@ -1 +0,0 @@ -Add the SDL `source.build` container image build-provenance surface, expressing base image and digest, image layer chain, structured Dockerfile instructions, classified build arguments, copied source mappings, image-default configuration, source-input checksums, and attestation/verification status, with TechVault webapp parity example coverage (ADR-023). diff --git a/changelog.d/365.added.md b/changelog.d/365.added.md deleted file mode 100644 index 3e3d703f9..000000000 --- a/changelog.d/365.added.md +++ /dev/null @@ -1 +0,0 @@ -Add the SDL `runtime.local_identity` surface, expressing the observed local identity database — `/etc/passwd` users (UID, primary GID/group, GECOS, home, shell, supplemental groups, and distinct disabled/locked/no-login status), `/etc/group` records, and structured sudo/sudoers grants — with provenance and stability classification, and TechVault webapp parity example coverage (ADR-024). diff --git a/changelog.d/366.added.md b/changelog.d/366.added.md deleted file mode 100644 index 05dfc00a1..000000000 --- a/changelog.d/366.added.md +++ /dev/null @@ -1,8 +0,0 @@ -Add the SDL `runtime.network` surface, expressing observed container network -realization facts — container hostname/domain identity; per-network endpoints -with realized IP, prefix length, gateway, and MAC address; backend network and -endpoint identifiers each with an explicit stable/ephemeral stability class; -distinct stable-alias, observed-DNS-name, and backend-generated-DNS-name lists; -observable backend network driver/IPAM detail; and host-published port bindings -with host IP and host port — validated against switch-backed `infrastructure` -networks, with TechVault webapp parity example coverage (ADR-025). diff --git a/changelog.d/367.added.md b/changelog.d/367.added.md deleted file mode 100644 index 177844748..000000000 --- a/changelog.d/367.added.md +++ /dev/null @@ -1,10 +0,0 @@ -Add the SDL `runtime.applications` surface, expressing the participant-observable -HTTP application route/API/UI inventory of a node service — per-route paths and -HTTP methods, owning transport service, auth/session requirements, typed request -inputs (path/query/header/cookie/form/JSON-body/uploaded-file), response status -codes and content types, template/static asset associations, route-specific -vulnerability placement, route-visible fixture secrets or diagnostic disclosures -with sensitivity classification, and observable redirect/error-disclosure -behavior — validated against same-node services, top-level `vulnerabilities`, -and observed file inventory, with TechVault webapp parity example coverage -(ADR-026). diff --git a/changelog.d/384.added.md b/changelog.d/384.added.md deleted file mode 100644 index 42c5dad67..000000000 --- a/changelog.d/384.added.md +++ /dev/null @@ -1,7 +0,0 @@ -Added an `init_process` descriptor to `RuntimeContainerConfiguration` so SDL can -express that a container runs under a backend-injected init / PID-1 reaper (for -example Docker Compose `init: true`, where PID 1 becomes `/sbin/docker-init`). -The typed `RuntimeInitProcess` submodel records whether the reaper is enabled, -its implementation and executable path, child-reaping intent, and optional -redactable PID-1 argv evidence, kept distinct from observed process inventory. -See ADR-027. diff --git a/changelog.d/385.added.md b/changelog.d/385.added.md deleted file mode 100644 index ce71fa9af..000000000 --- a/changelog.d/385.added.md +++ /dev/null @@ -1,4 +0,0 @@ -Added `seccomp_profile` and `security_opt` fields to -`RuntimeContainerConfiguration`, letting the SDL express a container's seccomp -posture and backend-native security options without conflating them with -`privileged` (see ADR-028). diff --git a/changelog.d/386.added.md b/changelog.d/386.added.md deleted file mode 100644 index 171aedaf8..000000000 --- a/changelog.d/386.added.md +++ /dev/null @@ -1,13 +0,0 @@ -### Added — Process-scoped Linux capability overrides on `RuntimeCapabilityPolicy` - -`Node.runtime.linux_capabilities` now accepts a `process_overrides` list of -`RuntimeProcessCapabilityOverride` records, letting an inventory express a -capability delta scoped to a single process or its descendant subtree -without flattening the container-wide baseline. Each override identifies its -subject via the existing `RuntimeProcessIdentity` selectors and asserts an -`effective` / `add` / `drop` delta at `process` or `subtree` scope. The -motivating case is a container where the entrypoint loads audit rules with -`CAP_AUDIT_CONTROL` and then exec's `sshd` through -`capsh --drop=cap_audit_control`, so the interactive shell subtree runs -without `CAP_AUDIT_CONTROL` and cannot disable auditing. The design -boundary is locked in ADR-030. (Closes #386.) diff --git a/changelog.d/387.added.md b/changelog.d/387.added.md deleted file mode 100644 index 2aedd7638..000000000 --- a/changelog.d/387.added.md +++ /dev/null @@ -1 +0,0 @@ -### Added — SDL surface for SSH server configuration (`Node.runtime.ssh_servers`): typed forced-command, accept-env allowlist, scoped `Match` rules, and adjacent sshd directives (allow/deny users and groups, authentication methods, password / pubkey / TTY toggles, chroot directory, authorized-keys file). Implements ADR-031. diff --git a/changelog.d/388.added.md b/changelog.d/388.added.md deleted file mode 100644 index b354c416b..000000000 --- a/changelog.d/388.added.md +++ /dev/null @@ -1,8 +0,0 @@ -Add a first-class `runtime.database_services` surface to ACES SDL -(ADR-029). Database logical state — engine, wire protocol and version; -listener observations; logical objects (databases, schemas, tables); -database-local roles; privilege grants; and provenance-bearing settings -— is now typed, queryable runtime inventory instead of prose in -`runtime.applications[].description`. A top-level relationship can model -typed application-to-database access with a structurally validated -`database_access` (`role_ref`, `auth_method`). diff --git a/changelog.d/395.added.md b/changelog.d/395.added.md deleted file mode 100644 index 399137c6e..000000000 --- a/changelog.d/395.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Added `runtime.software_components` for node-scoped runtime software component identity below package-manager row granularity. diff --git a/changelog.d/397.added.md b/changelog.d/397.added.md deleted file mode 100644 index bcd69e0b9..000000000 --- a/changelog.d/397.added.md +++ /dev/null @@ -1,3 +0,0 @@ -Added separate Claude Code and Codex ACES asset inventory capture skills that -turn the participant-discoverable inventory methodology into runnable -agent-level guidance. diff --git a/changelog.d/399.changed.md b/changelog.d/399.changed.md deleted file mode 100644 index 76f395696..000000000 --- a/changelog.d/399.changed.md +++ /dev/null @@ -1,7 +0,0 @@ -Clarified the SDL scenario/delivery boundary for runtime node state and added -redaction classifications for runtime mount sources/options and local-control -bind sources so host-local details can be withheld by contract. The generated -SDL JSON Schemas now carry matching conditional guards for those redacted raw -values across parser-normalized sensitivity label spellings, and ADR-033 -documents the ACES-native basis, explicit cross-repo downstream APTL limits, and -the claim scope for adjacent academic and standards sources behind the design. diff --git a/changelog.d/400.added.md b/changelog.d/400.added.md deleted file mode 100644 index c6c28401f..000000000 --- a/changelog.d/400.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Added the scenario/delivery classification drift audit and remediation record, fixed the live runtime-scope wording drift in the SDL sections reference, and added structural coverage tests for issue #400. diff --git a/changelog.d/401.added.md b/changelog.d/401.added.md deleted file mode 100644 index 14c8dec09..000000000 --- a/changelog.d/401.added.md +++ /dev/null @@ -1 +0,0 @@ -Add the SDL `runtime.identity_authorities` inventory for provider-neutral directory, domain, realm, IdP, IAM, and federation identity semantics, with typed authority services, subjects, policies, relationships, unambiguous local and qualified semantic reference validation, module-import ref rewriting, generated schema coverage, documentation lineage, example coverage, and secret-bearing attribute redaction. diff --git a/changelog.d/410.changed.md b/changelog.d/410.changed.md deleted file mode 100644 index 183988cb2..000000000 --- a/changelog.d/410.changed.md +++ /dev/null @@ -1,8 +0,0 @@ -Split live runtime control out of `aces_processor` into the new `aces_runtime` -package, added policy enforcement for SDL/processor/runtime module boundaries, -documented the new architecture in ADR-036 and the API reference, tightened -the boundary gate to fail closed under pre-commit/CI, and removed built-in -control-plane principals from strict defaults. Shared runtime/backend DTOs now -live in `aces_contracts`, backend protocol signatures are typed against those -contracts, module-boundary policy covers every first-party package root, and -proxy identity headers require explicit opt-in. diff --git a/changelog.d/411.added.md b/changelog.d/411.added.md deleted file mode 100644 index 02da9c7e8..000000000 --- a/changelog.d/411.added.md +++ /dev/null @@ -1,3 +0,0 @@ -Added ACES-owned asset inventory methodology docs plus deterministic container -evidence capture and Syft CycloneDX normalization templates to the ACES asset -inventory capture skills. diff --git a/changelog.d/418.added.md b/changelog.d/418.added.md deleted file mode 100644 index acfbe4bd5..000000000 --- a/changelog.d/418.added.md +++ /dev/null @@ -1 +0,0 @@ -`Node.runtime.service_manager_units` records observed service-manager (systemd) unit state — `load_state`, `active_state`, `sub_state`, `enabled_state`, `result`, optional `main_pid`, `unit_file_path`, redactable `exec_start`, and same-node `Node.services[]` refs — distinct from transport services, live processes, packages, content, and authored conditions. See ADR-035. diff --git a/changelog.d/42.changed.md b/changelog.d/42.changed.md deleted file mode 100644 index 802526691..000000000 --- a/changelog.d/42.changed.md +++ /dev/null @@ -1 +0,0 @@ -Split the oversized `aces_sdl.validator` module (4,139 lines) into a package of per-validation-seam mixin modules (`_core`, runtime families, relationships, content/objectives, workflows, sections), each under the ADR-015 600-line cap, behind an API-stable `SemanticValidator` re-export, and reduced the per-pass cyclomatic/cognitive complexity of the moved validators by extracting focused helpers and shared context objects. Pure refactor: no validation behavior, diagnostics, pass ordering, or public-API change. The `validator.py` entry is removed from the oversized-source allowlist. diff --git a/changelog.d/420.added.md b/changelog.d/420.added.md deleted file mode 100644 index e468c58c9..000000000 --- a/changelog.d/420.added.md +++ /dev/null @@ -1 +0,0 @@ -Add typed `Node.runtime.mail_services` inventory and `mail_access` relationship semantics for mail-server logical state. diff --git a/changelog.d/420.fixed.md b/changelog.d/420.fixed.md deleted file mode 100644 index 44f383c1c..000000000 --- a/changelog.d/420.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Refactored runtime mail-service semantic validation to satisfy SonarCloud maintainability checks. diff --git a/changelog.d/421.added.md b/changelog.d/421.added.md deleted file mode 100644 index 278a4a083..000000000 --- a/changelog.d/421.added.md +++ /dev/null @@ -1,10 +0,0 @@ -Add `Node.runtime.file_services` runtime inventory for SMB/Samba (and a -generalizable seam for NFS, FTP/SFTP, WebDAV, and object-store services), -with typed shares, service-local passdb-style principals, portable -subject/resource/action/effect/basis access rules, observed access -outcomes, and qualified `nodes..runtime.file_services.[...]` -references for module composition. Extend `RuntimeFilesystemEntry` with a -`presence` field (`present` default, `expected_absent`, `unknown`, -`other`) so authored/expected paths absent at capture time retain their -expected `entry_type` instead of collapsing to `other`. Implements -ADR-037. diff --git a/changelog.d/426.added.md b/changelog.d/426.added.md deleted file mode 100644 index fdf09d556..000000000 --- a/changelog.d/426.added.md +++ /dev/null @@ -1,4 +0,0 @@ -Added typed `Node.runtime.dns_services` inventory for DNS authoritative and -resolver runtime state, including zones, RRsets, common typed RDATA, resolver -policy, DNSSEC posture, dynamic-update posture, settings redaction, evidence -refs, semantic validation, module-import ref rewriting, docs, and schemas. diff --git a/changelog.d/426.fixed.md b/changelog.d/426.fixed.md deleted file mode 100644 index 51759d4d0..000000000 --- a/changelog.d/426.fixed.md +++ /dev/null @@ -1,3 +0,0 @@ -### Fixed - -- Addressed SonarCloud maintainability findings in the DNS runtime inventory implementation. diff --git a/changelog.d/428.added.md b/changelog.d/428.added.md deleted file mode 100644 index 0e60dba34..000000000 --- a/changelog.d/428.added.md +++ /dev/null @@ -1 +0,0 @@ -Added node-scoped `runtime.security_monitoring_managers` inventory for SIEM/security-monitoring managers, including listeners, components, enrolled agents, agent groups, detection content sets, bounded settings, semantic validation, qualified relationship refs, and generated schema support. diff --git a/changelog.d/429.added.md b/changelog.d/429.added.md deleted file mode 100644 index 43992c711..000000000 --- a/changelog.d/429.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Added `runtime.network_sensors` for node-scoped NSM/IDS monitoring posture, including monitored network refs, capture metadata, validation, docs, and schema publication. diff --git a/changelog.d/430.added.md b/changelog.d/430.added.md deleted file mode 100644 index 26617dfe5..000000000 --- a/changelog.d/430.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Add typed SDL runtime inventory for IDS/NDR network detection engines. diff --git a/changelog.d/431.added.md b/changelog.d/431.added.md deleted file mode 100644 index ff2091d70..000000000 --- a/changelog.d/431.added.md +++ /dev/null @@ -1,3 +0,0 @@ -Added `runtime.service_listeners` so SDL inventories can model observed bind -addresses, ports, listener scope, process/service ownership, readiness evidence, -and published-port correlations without overloading `Node.services`. diff --git a/changelog.d/434.added.md b/changelog.d/434.added.md deleted file mode 100644 index aff5d67ab..000000000 --- a/changelog.d/434.added.md +++ /dev/null @@ -1 +0,0 @@ -Added SDL support for parsed security-monitoring detection definitions beneath runtime security-monitoring managers, including validation-backed source, content-set, correlation, target, and canonical digest metadata. diff --git a/changelog.d/441.fixed.md b/changelog.d/441.fixed.md deleted file mode 100644 index 0e85f2ae6..000000000 --- a/changelog.d/441.fixed.md +++ /dev/null @@ -1,3 +0,0 @@ -### Fixed - -- Consolidated runtime service-family registration so public exports, module namespacing aliases, and semantic runtime refs share one registry, including `ssh_servers`. Accepted `provenance` on runtime identity attributes as a checked synonym for the existing origin enum to keep TechVault capture facts lossless. diff --git a/changelog.d/442.fixed.md b/changelog.d/442.fixed.md deleted file mode 100644 index 187dffa87..000000000 --- a/changelog.d/442.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Consolidated runtime validation helper policy and backfilled mail validation documentation plus ADR gate coverage for the runtime SDL consistency work. diff --git a/changelog.d/445.added.md b/changelog.d/445.added.md deleted file mode 100644 index 09179c19a..000000000 --- a/changelog.d/445.added.md +++ /dev/null @@ -1 +0,0 @@ -### Added - Registered the ACES gap-remediation implement overlay for Codex/Claude discovery and regression coverage. diff --git a/changelog.d/449.added.md b/changelog.d/449.added.md deleted file mode 100644 index e318bc284..000000000 --- a/changelog.d/449.added.md +++ /dev/null @@ -1 +0,0 @@ -Added the SCN-010 expressivity gap analysis (`docs/aces/inventory/scn010-expressivity-gap-analysis.md`): the peer-review-grade analysis of ACES SDL runtime-surface expressivity gaps found while holding the remaining APTL TechVault SCN-010 SOC-stack containers to the wazuh.manager parity depth bar, and the cohesive whole-SDL architecture that resolves them (requirements DSL-132 through DSL-139). diff --git a/changelog.d/450.added.md b/changelog.d/450.added.md deleted file mode 100644 index 1691d205d..000000000 --- a/changelog.d/450.added.md +++ /dev/null @@ -1,13 +0,0 @@ -Add the SCN-010 `runtime.datastore_services` inventory family (DSL-132): a single -`RuntimeDatastoreService` spine discriminated by an OPEN `data_model` -(`search_index` / `wide_column` / `key_value` / `relational` / `unknown` / -`other`) for the non-relational datastores (OpenSearch/Elasticsearch search -clusters, Cassandra wide-column store, Redis key-value store) that the -irreducibly-relational `runtime.database_services` cannot shape. A -`require_profile_for_data_model` guard makes each data model's defining geometry -(search shard/replica counts, wide-column replication strategy/factor, key-value -persistence posture) executable so an under-populated instance fails validation. -The family is registered in the runtime service-family registry, wired into -`RuntimeConfiguration`, semantically validated (owning-service and delegated -`authorization_ref` resolution against the same node), and published to the -generated SDL schemas. diff --git a/changelog.d/451.added.md b/changelog.d/451.added.md deleted file mode 100644 index 3cc59e3c1..000000000 --- a/changelog.d/451.added.md +++ /dev/null @@ -1,14 +0,0 @@ -Add the SCN-010 `runtime.platform_applications` inventory family (DSL-133): a -single `RuntimePlatformApplication` spine discriminated by an OPEN -`platform_kind` (`threat_intel` / `soar` / `analyzer_engine` / -`case_management` / `analytics_dashboard` / `unknown` / `other`) for the -security platform applications (threat-intelligence platform, SOAR, analyzer -engine, case management, analytics dashboard). Content objects are bounded -parsed manifests (typed kind + bounded attributes + typed references + -marking/evidence refs, never raw bodies). A `require_profile_for_platform_kind` -guard makes each kind's defining content/binding profile executable so an -under-populated instance fails validation. The family is registered in the -runtime service-family registry, wired into `RuntimeConfiguration`, semantically -validated (owning-service and delegated `authorization_ref` resolution, -content-object `references` and `marking_refs` intra-application integrity), and -published to the generated SDL schemas. diff --git a/changelog.d/452.added.md b/changelog.d/452.added.md deleted file mode 100644 index 56b9678c6..000000000 --- a/changelog.d/452.added.md +++ /dev/null @@ -1 +0,0 @@ -Add `runtime.app_authorizations` application-internal RBAC inventory (principals with credential classification, roles, resource-scoped permission grants, role mappings, and tenants) with reference validation and generated schemas (DSL-134). diff --git a/changelog.d/453.added.md b/changelog.d/453.added.md deleted file mode 100644 index 16d75f7b5..000000000 --- a/changelog.d/453.added.md +++ /dev/null @@ -1 +0,0 @@ -Add `runtime.scheduled_jobs` cadence-and-run-state inventory (closed interval/cron/calendar recurrence plus observed last/next run and last result) with generated schemas (DSL-135). diff --git a/changelog.d/454.added.md b/changelog.d/454.added.md deleted file mode 100644 index 712c80444..000000000 --- a/changelog.d/454.added.md +++ /dev/null @@ -1 +0,0 @@ -Add `runtime.forwarding_agents` log-forwarding / intel-sync agent inventory (typed sources, transforms, ship targets, buffer policy, reload channels, and settings) with an executable `require_profile_for_agent_kind` guard, scenario-scoped ship-target node/service ref resolution, enrollment-identity and secret-setting redaction, and generated schemas (DSL-136). diff --git a/changelog.d/455.added.md b/changelog.d/455.added.md deleted file mode 100644 index cb99dfda2..000000000 --- a/changelog.d/455.added.md +++ /dev/null @@ -1 +0,0 @@ -Add `runtime.orchestration_authorities` container-spawn authority inventory (engine, scope, spawn templates, lifecycle policy, realized children, and privilege class) with an executable `require_profile_for_privilege_class` guard and scenario-scoped `control_interface_ref` resolution that requires a read-write docker socket for `host_root_equivalent` authorities, plus generated schemas (DSL-137). diff --git a/changelog.d/455.changed.md b/changelog.d/455.changed.md deleted file mode 100644 index f50a8657d..000000000 --- a/changelog.d/455.changed.md +++ /dev/null @@ -1 +0,0 @@ -Added a required `control_interface_id` to `RuntimeControlInterface` so local control interfaces carry a stable, reference-able id (DSL-137). The id is symbol-validated (no empty or `${var}` placeholder) and is enforced unique across a node's `local_control_interfaces`. Generated SDL contract schemas were regenerated accordingly. diff --git a/changelog.d/456.added.md b/changelog.d/456.added.md deleted file mode 100644 index 5f966a2fc..000000000 --- a/changelog.d/456.added.md +++ /dev/null @@ -1,12 +0,0 @@ -Wired three typed relationship subtypes into the top-level `Relationship` model -(DSL-138): `forwarding_edge` (`RelationshipForwardingEdge`), -`service_integration` (`RelationshipServiceIntegration`), and `proxy_upstream` -(`RelationshipProxyUpstream`), mirroring the existing `database_access` / -`mail_access` typed exceptions. The semantic validator now cross-references each -subtype's refs (forwarder, consumer/engine and auth principal, route and -upstream node/service) and enforces two agreement guards: a forwarding edge's -`target_listener_role`/`protocol` must be consistent with at least one of the -agent's ship targets, and a proxy upstream's shared facts (target node, target -service, TLS-termination boolean) must agree with the referenced route's -`upstream_target` so the same fact recorded at two scopes can never silently -contradict. See ADR-052. diff --git a/changelog.d/456.fixed.md b/changelog.d/456.fixed.md deleted file mode 100644 index 96339c32a..000000000 --- a/changelog.d/456.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Tightened typed runtime relationship validation so proxy-upstream service refs resolve to real upstream services and service-integration auth principals resolve within the engine application's authorization store. diff --git a/changelog.d/457.changed.md b/changelog.d/457.changed.md deleted file mode 100644 index 984a61d1a..000000000 --- a/changelog.d/457.changed.md +++ /dev/null @@ -1,11 +0,0 @@ -Renamed the runtime service-family inventory models `SshServerConfig` and `DatabaseService` to `RuntimeSshServer` and `RuntimeDatabaseService` so every runtime service-family model follows the uniform `Runtime` class-name invariant (DSL-139). The generated SDL authoring and instantiated schemas reflect the new `$defs` names. - -Unified the five drifted per-family secret-bearing setting-name detectors (database, DNS, directory-identity, mail-service, security-monitoring) into a single shared `name_indicates_secret` helper in `runtime_values`, backed by the de-duplicated union of every family's token set (`SECRET_NAME_TOKENS`) plus the alphanumeric-part match (`SECRET_NAME_PARTS`). Detection is now a strict superset across all runtime families, closing gaps where one family would redact a secret-bearing setting name that another would have let through. - -Renamed the seven forked runtime service-family primary identifiers to the uniform `singular(collection) + "_id"` rule (DSL-139 / #443): `RuntimeServiceListener.listener_id` to `service_listener_id`, `RuntimeIdentityAuthority.authority_id` to `identity_authority_id`, `RuntimeFileService.service_id` to `file_service_id`, `RuntimeMailService.service_id` to `mail_service_id`, `RuntimeNetworkSensor.sensor_id` to `network_sensor_id`, `RuntimeNetworkDetectionEngine.engine_id` to `network_detection_engine_id`, `RuntimeSecurityMonitoringManager.manager_id` to `security_monitoring_manager_id`, and `RuntimeSshServer.server_id` to `ssh_server_id`. Child-collection identifiers of the same spelling are unchanged, and the generated SDL authoring and instantiated schemas reflect the new field names. - -Removed the redundant scalar `RuntimeConfiguration.process` twin (DSL-139 / #443); a single observed process is now expressed as a one-element `processes` list. The generated SDL authoring and instantiated schemas drop the `process` field, and the runtime service-family structural-invariant lint now enforces an empty `KNOWN_VIOLATIONS` set across the whole surface. - -Migrated the runtime mail-service validators in-class to match every other runtime family (DSL-139 / #442): `RuntimeMailService` model-local duplicate/cross-field checks are now private `@model_validator(after)` methods, and the scenario-level mail-service and relationship `mail_access` cross-reference checks are now `SemanticValidator._verify_*` methods rather than free functions wired specially from `validate()`. Validation behavior is unchanged. - -Reconciled the runtime service-family enum surface to the enum-sentinel convention (DSL-139 / #443): every observed-value runtime enum now carries both `unknown` and `other` (open taxonomy) and closed structural/protocol/redaction-lattice vocabularies carry neither, eliminating the single-sentinel state where an enum carried exactly one of the two. Forty-nine single-sentinel runtime enums were made open by additively appending the missing sentinel (no existing value or default changed), and the generated SDL authoring and instantiated schemas reflect the new enum values. An executable drift guard (`test_runtime_enums_open_or_closed_not_single_sentinel`) now fails on any future runtime enum introduced in a single-sentinel state. diff --git a/changelog.d/460.added.md b/changelog.d/460.added.md deleted file mode 100644 index 8399dd9fe..000000000 --- a/changelog.d/460.added.md +++ /dev/null @@ -1 +0,0 @@ -Add scenario-level forwarding agents for off-node sidecar forwarders, with typed `forwarding_edge` resolution across node-hosted and scenario-level registries (DSL-140). diff --git a/changelog.d/463.changed.md b/changelog.d/463.changed.md deleted file mode 100644 index 0418376a4..000000000 --- a/changelog.d/463.changed.md +++ /dev/null @@ -1,5 +0,0 @@ -### Changed - -- Centralize runtime observed-value redaction rules and enforce secret-bearing - raw-value omission across environment, image-default, exposed-field, and - setting surfaces. diff --git a/changelog.d/468.added.md b/changelog.d/468.added.md deleted file mode 100644 index 94060c3b4..000000000 --- a/changelog.d/468.added.md +++ /dev/null @@ -1 +0,0 @@ -Added typed datastore cluster and partition fields for native UUIDs, document counts, deleted-document counts, byte-normalized store sizes, creation timestamps, and open/closed status. diff --git a/changelog.d/469.added.md b/changelog.d/469.added.md deleted file mode 100644 index 1cb9d6ab9..000000000 --- a/changelog.d/469.added.md +++ /dev/null @@ -1 +0,0 @@ -Add structured `runtime.datastore_services` mapping and template manifests so search-index schemas can carry bounded field counts, dynamic policy, digests, and evidence refs instead of name-only lists. diff --git a/changelog.d/470.added.md b/changelog.d/470.added.md deleted file mode 100644 index 1dae21b29..000000000 --- a/changelog.d/470.added.md +++ /dev/null @@ -1 +0,0 @@ -Added DSL-141 datastore-node engine provenance to `runtime.datastore_services`: typed `engine_version`/`build_hash`/`build_type`, JVM heap byte bounds and `memory_locked` posture, a per-node `RuntimeDatastoreEnginePlugin` inventory carrying per-plugin versions, and a product-neutral `RuntimeDatastoreNodeEndpoint` (client/peer) listener inventory — replacing the name-only service-level `engine_plugins` list and the single ambiguous node `address`. diff --git a/changelog.d/471.fixed.md b/changelog.d/471.fixed.md deleted file mode 100644 index f8257eec1..000000000 --- a/changelog.d/471.fixed.md +++ /dev/null @@ -1,3 +0,0 @@ -Removed name-derived raw-value omission from runtime SDL observed-value -validators so credential-shaped values remain realizable scenario content unless -they are explicitly classified as `redacted` or `operator_secret`. diff --git a/changelog.d/481.added.md b/changelog.d/481.added.md deleted file mode 100644 index d91171677..000000000 --- a/changelog.d/481.added.md +++ /dev/null @@ -1,2 +0,0 @@ -### Added -- Add an ADR amendment policy (ADR-059) and an acceptance-content pin gate: `docs/decisions/adrs/adr-index.yaml` pins every accepted ADR's canonical-content `sha256`, and `tools/check_adr_immutability.py` (wired into the `policy` nox session) fails when an accepted ADR changes without a recorded `## Amendments` entry or a superseding ADR. Reconciled the already-amended ADRs (025, 029, 032, 038, 041, 048, 050, 052) with honest amendment records so the gate starts green. diff --git a/changelog.d/482.changed.md b/changelog.d/482.changed.md deleted file mode 100644 index 1f567ef93..000000000 --- a/changelog.d/482.changed.md +++ /dev/null @@ -1 +0,0 @@ -ADR corpus policy now validates the canonical ADR template's required sections. diff --git a/changelog.d/483.changed.md b/changelog.d/483.changed.md deleted file mode 100644 index be98c40d7..000000000 --- a/changelog.d/483.changed.md +++ /dev/null @@ -1,4 +0,0 @@ -### Changed - -- Added an auditable FM classification ledger and policy gate for new ADR - classification fields. diff --git a/changelog.d/485.added.md b/changelog.d/485.added.md deleted file mode 100644 index 6d207bb83..000000000 --- a/changelog.d/485.added.md +++ /dev/null @@ -1 +0,0 @@ -Added an assurance fulfillment gate (`specs/formal/assurance-fulfillment.yaml`, enforced by `tools/check_assurance_policy.py` via `nox -s policy`): every classified formal-spec subsystem must deliver — or explicitly waive with an ISO date and tracking reference — each verification artifact kind required by its FM level, so a subsystem can no longer be classified FM3 with no executable artifacts while CI stays green. diff --git a/changelog.d/486.changed.md b/changelog.d/486.changed.md deleted file mode 100644 index eb72868ba..000000000 --- a/changelog.d/486.changed.md +++ /dev/null @@ -1 +0,0 @@ -Added executable participant-runtime invariant oracle evidence for ADR-054 / ASR-505. diff --git a/changelog.d/487.added.md b/changelog.d/487.added.md deleted file mode 100644 index 29ca6f392..000000000 --- a/changelog.d/487.added.md +++ /dev/null @@ -1 +0,0 @@ -Added an executable participant-semantics invariant oracle covering I1-I18 with property-based valid progressions and targeted rejecting mutations. diff --git a/changelog.d/488.fixed.md b/changelog.d/488.fixed.md deleted file mode 100644 index 7d44ccb80..000000000 --- a/changelog.d/488.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Added named semantic regression tests for composition-readiness and objective-window invariants. diff --git a/changelog.d/489.changed.md b/changelog.d/489.changed.md deleted file mode 100644 index 272f74e0f..000000000 --- a/changelog.d/489.changed.md +++ /dev/null @@ -1 +0,0 @@ -Add SEM-218 explicitness classification metadata to SDL validation and preserve authored exact/constrained/open classes through instantiation, including helper traversal paths that keep downstream metadata derivation consistent. diff --git a/changelog.d/490.added.md b/changelog.d/490.added.md deleted file mode 100644 index 96ff5063f..000000000 --- a/changelog.d/490.added.md +++ /dev/null @@ -1 +0,0 @@ -Carry the SEM-218 explicitness class through processor compilation as typed realization-requirement metadata on the runtime model, and add a planner realization-support gate that rejects an unrealizable exact (or unsupported constrained) requirement against the selected backend's `realization_support` with a structured diagnostic instead of silently approximating it (invariants I1/I2/I4). diff --git a/changelog.d/491.added.md b/changelog.d/491.added.md deleted file mode 100644 index 02060d964..000000000 --- a/changelog.d/491.added.md +++ /dev/null @@ -1 +0,0 @@ -Added the SEM-218 runtime non-approximation gate (invariant I2) at the backend-adapter boundary, which rejects a backend that silently realizes an exact author declaration with a weaker value, and the `realization_provenance` ledger (invariant I5) on the runtime snapshot envelope, which records each realized concern's explicitness class and author-declared / processor-derived / backend-realized origin in published schemas, fixtures, and the schema-publication manifest. diff --git a/changelog.d/492.changed.md b/changelog.d/492.changed.md deleted file mode 100644 index cec7f197b..000000000 --- a/changelog.d/492.changed.md +++ /dev/null @@ -1,3 +0,0 @@ -Added a native `episodes` concept family with participant-runtime lineage, -semantic-profile coverage for participant episode contracts, and tests that -anchor episode-keyed contracts to the shared concept authority. diff --git a/changelog.d/493.changed.md b/changelog.d/493.changed.md deleted file mode 100644 index a531810bf..000000000 --- a/changelog.d/493.changed.md +++ /dev/null @@ -1,4 +0,0 @@ -Added a native `runtime-inventory` concept family and a `scenario-node-runtime` -reference model for `nodes.*.runtime`, with authoring-phase semantic-profile -coverage, an extension-governance decision path for runtime fields, and -reference-model binding resolution for nullable-optional schema surfaces. diff --git a/changelog.d/494.added.md b/changelog.d/494.added.md deleted file mode 100644 index 3d52dd4f4..000000000 --- a/changelog.d/494.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a normative definition of "surface" to the concept-authority specification — including the one-surface-versus-two decision rule from ADR-033 — with a derivative glossary entry that points back to it; and classified the agent-usable guidance profile (`specs/agent-guidance/agent-guidance.yaml`, AUT-811) as a `governance-guidance` artifact through a new `normative_artifact_families` block in the authority-boundary manifest, enforced by `tools/check_authority_boundary.py`, so its authority class is decidable from the manifest alone. diff --git a/changelog.d/495.added.md b/changelog.d/495.added.md deleted file mode 100644 index efeab5765..000000000 --- a/changelog.d/495.added.md +++ /dev/null @@ -1 +0,0 @@ -Added the UCO alignment evidence contract (`uco-alignment-v1`): a machine-checkable mapping from every adopted/adapted cyber-domain concept family to the UCO object types it aligns to, with the reviewed UCO version pinned, adapted-family divergences enumerated explicitly, generated JSON Schema, valid/invalid fixtures, and catalog-derived coverage validation. diff --git a/changelog.d/496.added.md b/changelog.d/496.added.md deleted file mode 100644 index 2da952c79..000000000 --- a/changelog.d/496.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a concept-authority catalog governance gate (ADR-062, `tools/check_concept_authority_governance.py`, wired into the `policy` nox session): every concept family in `concept-families-v1.json` must be ADR-linked, and inline-code cross-references in a family's `relation_rules` must resolve to a known concept family or controlled vocabulary. diff --git a/changelog.d/497.changed.md b/changelog.d/497.changed.md deleted file mode 100644 index f9c88df78..000000000 --- a/changelog.d/497.changed.md +++ /dev/null @@ -1,4 +0,0 @@ -Published schema evolution is now governed by an ADR-backed manifest policy: -current schemas are marked draft with canonical content hashes, and stable -schemas cannot take incompatible in-place structural changes without a version -bump. diff --git a/changelog.d/498.added.md b/changelog.d/498.added.md deleted file mode 100644 index 78a2e210c..000000000 --- a/changelog.d/498.added.md +++ /dev/null @@ -1 +0,0 @@ -Add the normative, language-neutral SDL authoring specification under `specs/sdl/`: a catalog set covering the document model, the top-level section catalog (reconciled to the live `sdl-authoring-input-v1.json` contract), the cross-section reference-resolution catalog, the variable/instantiation catalog, the node-scoped runtime-family index, and the error-vs-advisory diagnostics boundary. The specification is registered as a `prose` authority root in `specs/authority/authority-boundary.yaml`, giving independent implementations a structural authority that does not require reading the reference Python. diff --git a/changelog.d/499.changed.md b/changelog.d/499.changed.md deleted file mode 100644 index bea73b4b5..000000000 --- a/changelog.d/499.changed.md +++ /dev/null @@ -1 +0,0 @@ -Flipped published-schema authority per ADR-009 §7: `contracts/schemas/` is now the hand-governed normative authority, `tools/check_generated_schemas.py` proves the reference implementation generates an identical bundle without overwriting the published schemas, and a manifest change-ledger (`schema-publication-manifest.json` `last_change` for added/modified schemas and `removed_schemas` tombstones for deletions) plus the `schema-change-missing-manifest` policy rule require a contract-facing description for any schema change, including removals. diff --git a/changelog.d/500.changed.md b/changelog.d/500.changed.md deleted file mode 100644 index 9cc48b23b..000000000 --- a/changelog.d/500.changed.md +++ /dev/null @@ -1 +0,0 @@ -The published `instantiated-scenario-v1` contract now rejects unresolved `${var}` substitution tokens in string values — both whole-string placeholders (`"${os}"`) and embedded tokens (`"host-${index}"`) — differentiating it from `sdl-authoring-input-v1`, which still accepts them. The same invariant is enforced on the `InstantiatedScenario` model so directly constructed instances must be fully concrete. diff --git a/changelog.d/501.added.md b/changelog.d/501.added.md deleted file mode 100644 index bd351acd8..000000000 --- a/changelog.d/501.added.md +++ /dev/null @@ -1 +0,0 @@ -The worked SDL examples under `examples/scenarios/` are now validated against the published `sdl-authoring-input-v1` JSON Schema in CI, proving the shipped example corpus conforms to the contract surface downstream consumers read (previously only Pydantic-parser acceptance was checked). Includes a non-vacuity corpus guard and a negative control so the suite cannot pass vacuously. diff --git a/changelog.d/502.added.md b/changelog.d/502.added.md deleted file mode 100644 index 0f69ce957..000000000 --- a/changelog.d/502.added.md +++ /dev/null @@ -1 +0,0 @@ -The `aces conformance backend` suite now has end-to-end proof tests: a realistic stub backend manifest passes against the canonical `contracts/fixtures` corpus under a full runtime-contract profile, and two seeded-violation tests copy the corpus to a temp tree, corrupt a required field in a required contract fixture (the backend manifest and a deep participant-episode runtime contract), and assert the runner exits non-zero while naming the offending contract. This demonstrates a caught contract violation rather than only a missing-fixture failure, backing the conformance CI claim in `docs/explain/reference/backend-conformance.md` (ASR-502). diff --git a/changelog.d/503.fixed.md b/changelog.d/503.fixed.md deleted file mode 100644 index c0021e20b..000000000 --- a/changelog.d/503.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Added a cross-family runtime invariant lint that prevents documented required-profile discriminators from shipping without registered Pydantic guard wiring. diff --git a/changelog.d/504.changed.md b/changelog.d/504.changed.md deleted file mode 100644 index c2d456d79..000000000 --- a/changelog.d/504.changed.md +++ /dev/null @@ -1 +0,0 @@ -The SEM-200 semantic-coverage gate (`tools/check_semantic_coverage.py`) now verifies integration, not just existence: an `active` row whose named tests import none of its realizing Python modules, or whose named test files contain a zero-assertion `test_*` stub, fails `nox -s policy`. Import resolution recognizes compatibility wrappers and package re-exports. Adds a read-only `--report` mode that lists construct families by status with per-row test and module-coverage counts to surface thin coverage. diff --git a/changelog.d/505.changed.md b/changelog.d/505.changed.md deleted file mode 100644 index 23d1825a9..000000000 --- a/changelog.d/505.changed.md +++ /dev/null @@ -1 +0,0 @@ -State the SDL error-vs-advisory boundary normatively in `specs/sdl/diagnostics.md` §5, resolving the classification previously deferred to review IMP-3. The criterion is meaning preservation: an error affects SDL meaning (structural/semantic invariants — reference resolution, uniqueness, ambiguity, acyclicity, required-profile guards, instantiation, explicit redaction), while an advisory is a deployability or quality heuristic that leaves SDL meaning intact, with a fail-closed default for borderline cases. `docs/explain/sdl/validation.md` now cites that single normative source instead of restating the rule, and a new AST drift-guard test enforces that the reference `SemanticValidator` keeps the advisory (`_warn_*`/`_collect_advisories`) and error (`_verify_*`/`_err`) channels separate. diff --git a/changelog.d/506.added.md b/changelog.d/506.added.md deleted file mode 100644 index 25d7e7c86..000000000 --- a/changelog.d/506.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a determinism witness for the SDL parse/instantiate/compile pipeline: it compiles representative scenarios (including a module-import scenario) twice, and once more under a varied PYTHONHASHSEED in a subprocess, and asserts the compiled output is byte-identical. docs/explain/sdl/parser.md now cites it. diff --git a/changelog.d/508.added.md b/changelog.d/508.added.md deleted file mode 100644 index 6f4715cb0..000000000 --- a/changelog.d/508.added.md +++ /dev/null @@ -1,6 +0,0 @@ -Added a related-work comparison page (`docs/explain/sdl/related-work-comparison.md`) -positioning ACES against precedent systems — OCR SDL, CybORG, CACAO, SISO Cyber -DEM/FOM, and academic range DSLs (CRACK/KYPO/CyRIS) — across eight expressivity -dimensions. Every non-ACES cell carries a primary-source citation, and the page -states explicitly where the precedents lead ACES. Linked from the README Lineage -section and `lineage.md`, which gains a Cyber DEM/FOM differentiation subsection. diff --git a/changelog.d/509.fixed.md b/changelog.d/509.fixed.md deleted file mode 100644 index 2e1c14a53..000000000 --- a/changelog.d/509.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Tightened citation hygiene across the SDL lineage and precedent documentation: expanded a bare-DOI citation to a full inline author-title-venue reference, snapshotted a Zotero-only preprint citation into a repo-tracked `docs/research/primary/` page so it is verifiable from the repository alone, relabelled the SCN-010 expressivity gap analysis's review process honestly (architect-guided adversarial self-review rather than an external peer-review panel), added a Syntax/Semantics/Both ("Borrowed") column to the design-precedent tables, sharpened the OpenC2 lineage boundary (command/response principle borrowed, payload/target structures not adopted), and added a research-corpus and citation-verification-scope note to the SDL limitations. diff --git a/changelog.d/511.changed.md b/changelog.d/511.changed.md deleted file mode 100644 index 59823db4a..000000000 --- a/changelog.d/511.changed.md +++ /dev/null @@ -1,17 +0,0 @@ -### Changed - -- Hardened the participant-semantics and participant-runtime literature - lineage with the missing primary theory: interpreted systems and dynamic - epistemic logic for information states and view transitions, Kuhn's - extensive-form information sets and perfect recall, Goguen-Meseguer - noninterference and Sabelfeld-Sands declassification for the hidden-truth - boundary, STRIPS/PDDL/PDDL2.1/PPDDL/RDDL for precondition/effect contracts, - the Oliehoek-Amato Dec-POMDP monograph, mean-field game theory, - Fidge/Mattern vector time with the Schwarz-Mattern causality survey for the - `VectorClock` ordering basis, Winskel/Mazurkiewicz partial-order - concurrency, Allen/Koymans/Alur-Dill temporal formalisms, and - Chockler-Halpern responsibility for multi-cause attribution. Corrected the - PettingZoo/OpenSpiel contribution attribution (including in ADR-054's - context), the CyGIL title conflation, the CRACK venue, the Dec-POMDP - complexity authors/venue, the HLA edition, and grounded the CybORG - sim-to-emulation claim in Standen et al. (2021). diff --git a/changelog.d/512.fixed.md b/changelog.d/512.fixed.md deleted file mode 100644 index 4fa06b850..000000000 --- a/changelog.d/512.fixed.md +++ /dev/null @@ -1,17 +0,0 @@ -### Fixed - -- Closed the participant-runtime formal-spec defects found in the 2026-06 - review: `mapping_loss` is now a closed vocabulary (with - `mapping_loss_detail`); `LifecycleEnvelope` carries the - attribution-edge and outcome-interpretation references its overview names - (SEM-212/SEM-215 cross-ref); the declared delivery point is defined and - carried (`delivery_basis`, `delivery_point_ref`, `delivered_at`) and the - visible-history projection binds to it; stable redaction tokens have a - declared stability scope; rollback/supersession can never rewrite - participant-visible history; marking enforcement and visibility projection - compose deny-first; `ClassificationClaim` defines when - `event_classification`/`source_status` may be null; fully opaque - participants have a defined minimal observable trace; the capability meet - is total over affecting components (missing declarations contribute - `unsupported`, never skipped); and reconstruction algorithm/proof refs must - resolve through a versioned reconstruction registry. diff --git a/changelog.d/513.fixed.md b/changelog.d/513.fixed.md deleted file mode 100644 index bce446384..000000000 --- a/changelog.d/513.fixed.md +++ /dev/null @@ -1,8 +0,0 @@ -### Fixed - -- Corrected the shared-semantic-integrity coverage table: SEM-214 (derived - operational context views, DRAFT/wave-3, no artifacts) no longer shares an - `active` row with SEM-215; it now has its own `planned` row. Resolved the - scheduling inversion for the MUST-priority time-model requirements by - assigning wave 2 to SEM-227, SEM-228, and SEM-229 in Ground Control, which - ACTIVE SEM-213 temporal semantics explicitly defer to. diff --git a/changelog.d/516.fixed.md b/changelog.d/516.fixed.md deleted file mode 100644 index be6a1da2b..000000000 --- a/changelog.d/516.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Corrected the ACES asset-inventory capture guidance so participant-discoverable scenario-target secrets are preserved in source evidence bundles, while operator/out-of-scenario secrets remain withheld or recorded as capture limits. diff --git a/changelog.d/527.security.md b/changelog.d/527.security.md deleted file mode 100644 index 2e2e3e112..000000000 --- a/changelog.d/527.security.md +++ /dev/null @@ -1,5 +0,0 @@ -Protected branches (`main`, `dev`) now enforce the CI-strictness baseline: all -CI checks are required and strict, the SonarCloud quality gate is waited on and -fails on any new issue, and pre-commit file hygiene plus secret scanning run in -CI — so nothing merges past a failing check or a failing quality gate, while -admin override is retained. diff --git a/changelog.d/537.added.md b/changelog.d/537.added.md deleted file mode 100644 index 899c807a2..000000000 --- a/changelog.d/537.added.md +++ /dev/null @@ -1 +0,0 @@ -The published contract corpus (backend/semantic profiles, the fixture conformance corpus, concept-authority catalogs, and schemas) now ships as package data in the `aces-sdl` wheel and sdist and is resolved through a single `importlib.resources`-backed seam (`aces_contracts.corpus`), so `aces conformance backend` and SDL semantic validation work from an installed distribution with no source checkout. The top-level `contracts/` tree remains the normative authority; `--fixtures-root` / `--profiles-root` overrides are unchanged. Added a `v*`-tag release workflow that builds the corpus-bundled artifacts and publishes a GitHub Release so downstream backends can pin a version instead of a `dev` commit SHA. diff --git a/changelog.d/537.fixed.md b/changelog.d/537.fixed.md deleted file mode 100644 index 87b96192f..000000000 --- a/changelog.d/537.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Declared `packaging` as a runtime dependency of `aces-sdl`. It was imported by `aces_sdl.module_registry` on the CLI import path but only present transitively, so any `aces` command failed with `ModuleNotFoundError: No module named 'packaging'` in a clean wheel install. diff --git a/changelog.d/551.fixed.md b/changelog.d/551.fixed.md deleted file mode 100644 index ed8742561..000000000 --- a/changelog.d/551.fixed.md +++ /dev/null @@ -1 +0,0 @@ -`aces sdl resolve` now records `local:` imports with a checkout-independent, SDL-base-relative `resolved_source` (POSIX separators) instead of an absolute machine path, so a committed `aces.lock.json` is portable. `aces sdl verify-imports` now passes on any checkout regardless of its absolute path — including CI and other contributors' machines — and fails only when imported content actually changes. Lockfiles generated before this fix contain absolute paths and are treated as stale; re-run `aces sdl resolve` to regenerate them. diff --git a/changelog.d/567.added.md b/changelog.d/567.added.md deleted file mode 100644 index acf59ebda..000000000 --- a/changelog.d/567.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a repository-side PR title guard (`.github/workflows/pr-title-lint.yml` backed by `tools/check_pr_title.py`) that rejects agent-branded PR title prefixes such as `[codex]`, `[claude]`, `[openai]`, and `[chatgpt]`, and enforces the conventional `(): ` shape with a lowercase-leading subject on every target branch including `dev`. The same validator powers local tests so the policy cannot silently drift from the workflow. diff --git a/changelog.d/598.added.md b/changelog.d/598.added.md deleted file mode 100644 index a2412c483..000000000 --- a/changelog.d/598.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a focused enterprise reference SDL scenario for authored participant action, observation-boundary, Wazuh evidence, policy provenance, and runtime/backend handoff. diff --git a/changelog.d/599.added.md b/changelog.d/599.added.md deleted file mode 100644 index a338ad01d..000000000 --- a/changelog.d/599.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a participant action-admission binding path that lets runtime backends record SDL-declared participant behavior through a selected participant implementation, including a request DTO control-plane surface. diff --git a/changelog.d/600.added.md b/changelog.d/600.added.md deleted file mode 100644 index 7c057b6f8..000000000 --- a/changelog.d/600.added.md +++ /dev/null @@ -1,12 +0,0 @@ -Add the cross-backend evidence corpus producer (`aces corpus build`) that pairs the -libvirt reference-backend scenario-evidence run with the APTL realization of the same -authored scenario and derives a cross-backend **invariant ledger** -(`aces.cross-backend-evidence-corpus/v1`, a thin local artifact). The ledger records -preserved invariants (authored scenario digest + compiled ACES address sets + -recorded evidence surfaces, each with a per-backend basis), realization differences, -unsupported/degraded surfaces, and evidence limitations. The libvirt run is consumed -through the existing `aces.libvirt.scenario-evidence-run/v1` producer in deterministic -mode; the APTL run is a bounded, honestly-labeled summary + link to -Brad-Edwards/aptl#558, with an optional `--aptl-evidence` path that ingests only -allowlisted portable fields from a supplied APTL export (no APTL-private data). The -committed corpus lives at `examples/corpus/reference-demonstration/` and is drift-tested. diff --git a/changelog.d/601.added.md b/changelog.d/601.added.md deleted file mode 100644 index ac403543b..000000000 --- a/changelog.d/601.added.md +++ /dev/null @@ -1,10 +0,0 @@ -### Added - -- Added a provisioning-only `aces_backend_libvirt` package with libvirt/QEMU target construction, manifest wiring, invalid-plan diagnostics, fail-closed driver confirmation checks, and an injected libvirt driver boundary. -- Tightened the libvirt backend type and reconciliation helpers so SonarCloud accepts the new backend surface. -- Validated the TechVault scenario through dynamic instantiation, planning, and libvirt provisioning, including switch-backed network links. -- Added the full TechVault operational scenario and libvirt provisioning coverage for its 30-node, four-network SOC/enterprise/red-team surface. -- Added APTL-style reduced TechVault scenario variants and native libvirt coverage proving they realize distinct ACES-derived domain/network/service surfaces. -- Added `aces libvirt techvault validate-live`, which boots TechVault scenarios as native libvirt/QEMU initramfs appliances, verifies the independent substrate, service readiness, Kali-shared-network reachability, SOC readback, clean-boot recomposition, and run-archive evidence. -- Added an `aces_operations` package for live operational gates so the CLI can invoke TechVault parity checks without crossing backend/runtime ownership boundaries directly. -- Hardened the TechVault live gate implementation structure so SonarCloud complexity checks stay green while preserving the SOC readiness and evidence checks. diff --git a/changelog.d/601.changed.md b/changelog.d/601.changed.md deleted file mode 100644 index e5587ab6f..000000000 --- a/changelog.d/601.changed.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- Formatted the native TechVault libvirt live-gate helpers after splitting the QEMU appliance builder and probe/readback code into dedicated modules, and added explicit VM resources to the reduced TechVault scenario variants. diff --git a/changelog.d/601.fixed.md b/changelog.d/601.fixed.md deleted file mode 100644 index e537b2612..000000000 --- a/changelog.d/601.fixed.md +++ /dev/null @@ -1,4 +0,0 @@ -### Fixed - -- Reduced native TechVault libvirt live-gate helper complexity and documented generated boot-artifact permissions so SonarCloud accepts the native backend path. -- Kept the native TechVault live CLI on a clean-boot-only public path and moved the generated boot-artifact permission exception into scoped Sonar configuration. diff --git a/changelog.d/602.added.md b/changelog.d/602.added.md deleted file mode 100644 index 538349aee..000000000 --- a/changelog.d/602.added.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- Published the libvirt/QEMU provisioning-only `backend-manifest-v2` as a conformance-verified acceptance bar: the manifest validates against the checked-in `backend-manifest-v2` JSON Schema, `supported_contract_versions` covers the published provisioning-only profile contract set, and `realization_support` declares a non-hollow realization envelope (node-type and os-family only — no content or account over-claim, matching what the libvirt interpreter actually realizes). diff --git a/changelog.d/603.added.md b/changelog.d/603.added.md deleted file mode 100644 index 83b6174ba..000000000 --- a/changelog.d/603.added.md +++ /dev/null @@ -1,4 +0,0 @@ -### Added - -- The libvirt/QEMU backend now fully and dynamically realizes provisioning plans: node resources become libvirt domains (base image + a NoCloud cloud-init seed), network resources become libvirt networks with real `ip`/`dhcp` addressing, and `account-placement`, `content-placement`, and `feature-binding` resources are realized into the target domain's cloud-init. Account realization covers every governed feature (groups, shell, home, disabled, auth_method, mail, spn, authorized SSH keys); content realization covers file/dataset/directory; and feature/service and mail realization is **OS-family-aware** — Linux (`systemctl`/`apt`), FreeBSD (`sysrc`/`pkg`), Windows (`choco`/`sc.exe`), and macOS (`brew`) each get their native mechanism, with a portable descriptor as the substrate ceiling for families and terms (e.g. Kerberos SPN without a domain) that no generic host can realize further. Node network ACLs are realized host-side as libvirt **nwfilter** rules referenced from the domain interface (OS-independent enforcement). `apply()` is idempotent against the `RuntimeSnapshot` (UNCHANGED operations never touch the host), and a placement change realizes its target domain even when the node itself is UNCHANGED (the seed now carries different cloud-init). For the CREATE/UPDATE operations that do reach the driver it **converges** existing host objects (stop + undefine, then redefine the desired XML/seed/nwfilter) so a tightened ACL, a disabled account, or a changed seed is genuinely enforced rather than skipped, with no duplicate resources and with seed and nwfilter cleanup on destroy. Convergence, deletion, and host-global nwfilter redefinition are all ownership-checked: each domain, network, and nwfilter carries a deterministic per-address libvirt UUID, and an existing object that shares a name but is not the ACES object for that address is never destroyed, undefined, or overwritten — apply fails closed. The NoCloud `instance-id` is derived from the rendered seed content, so a converged UPDATE with changed content re-runs cloud-init in the guest instead of being treated as already consumed. The backend manifest declares the full governed provisioning vocabulary it realizes — all content types, all account features, accounts, ACLs, and the `macos` OS family — superseding the earlier "provisioning-only, node-type and os-family only" capability surface; "provisioning-only" now means domain scope only (no orchestrator/evaluator/participant runtime). -- Realization is **fail-closed** at every governed-value boundary so a claim can never exceed what is enforced: an ACL whose action/protocol/direction is unrecognized, whose port is invalid, whose port scope is paired with a non-`tcp`/`udp` (wildcard) protocol, or whose `from_net`/`to_net` does not resolve to a concrete CIDR is rejected with an ERROR diagnostic instead of widening into a broad allow; a placement that cannot be bound to a node in the plan fails the apply rather than being silently dropped; a password account is never unlocked without rendered credential material (key-based accounts get their authorized keys and stay password-locked); and plan-controlled identifiers interpolated into `/etc/aces` descriptor filenames are reduced to a single safe path component so a crafted account/feature/content name cannot traverse out of its descriptor directory (the content-placement `path` remains the one intentional arbitrary-write surface). Cloud-init `runcmd` entries are emitted in argv-list form (cloud-init runs them without a shell) so plan-derived paths and package names cannot inject shell commands into the root-applied guest config. Seed media is written into a freshly created, owner-verified workspace with `O_NOFOLLOW`/`O_EXCL` exclusive `0o600` writes (a pre-positioned symlink or file cannot redirect or capture rendered content); the seed directory is `0o711` (traversable, not listable) and the seed ISO is `0o600` — never world-readable — so the rendered cloud-init stays private while the libvirt/QEMU process reaches it through libvirt's dynamic-ownership relabel of the attached disk. Real libvirt/QEMU realization is exercised only on a host with the daemon; default verification stays hermetic through injected seed-builder and connection seams. diff --git a/changelog.d/604.fixed.md b/changelog.d/604.fixed.md deleted file mode 100644 index f3cfeecdb..000000000 --- a/changelog.d/604.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Made libvirt backend teardown idempotent: a DELETE for a domain or network that is already absent now succeeds as torn down (connection, permission, and ownership failures still fail closed), and a partial CREATE that defines a domain before it fails to start is now rolled back so no orphaned domains, networks, or seed media are left behind. diff --git a/changelog.d/605.added.md b/changelog.d/605.added.md deleted file mode 100644 index 972f34252..000000000 --- a/changelog.d/605.added.md +++ /dev/null @@ -1,8 +0,0 @@ -### Added - -- libvirt backend: emit typed, blocking capability diagnostics - (`libvirt-backend.realization.unsupported-{node-type,os-family,content-type,account-feature}`) - when a provisioning plan requires a node type, OS family, content type, or - account feature outside the backend's declared manifest envelope. The backend - now fails closed on out-of-envelope terms instead of silently or partially - realizing them, consistent with the processor's manifest capability checks. diff --git a/changelog.d/606.changed.md b/changelog.d/606.changed.md deleted file mode 100644 index 29fe6c61c..000000000 --- a/changelog.d/606.changed.md +++ /dev/null @@ -1,7 +0,0 @@ -Backend target conformance now runs a backend-neutral live provisioning probe -that proves real snapshot mutation for provisioning-only backends (including -libvirt/QEMU) — succeeded provisioning status, changed addresses, and at least -one provisioning-domain snapshot entry — so a backend can no longer pass target -conformance on manifest/contract-surface validation alone. Adds a daemon-free -recording libvirt driver for hermetic verification and a committed libvirt -`provisioning-only` conformance report. diff --git a/changelog.d/614.added.md b/changelog.d/614.added.md deleted file mode 100644 index 7c9998a5e..000000000 --- a/changelog.d/614.added.md +++ /dev/null @@ -1 +0,0 @@ -Added a libvirt backend participant runtime for the reference scenario. `create_libvirt_manifest(participant_runtime=True)` now declares `ParticipantRuntimeCapabilities` (red role, behavior features disclosed as `disclosed_weak`) plus the required participant episode/behavior contract versions, and the libvirt target provides a `LibvirtParticipantRuntime` driven through `RuntimeControlPlane`. The shared RUN-311 episode lifecycle is factored into `BaseParticipantRuntime` (reused by the reference and stub backends), and libvirt's action leaf routes through a pluggable `LibvirtParticipantDomainAdapter`; the default `DeterministicParticipantDomainAdapter` needs no live libvirt daemon and discloses that limitation in the emitted participant-implementation provenance. Without the flag the backend stays provisioning-only. diff --git a/changelog.d/615.added.md b/changelog.d/615.added.md deleted file mode 100644 index d3980b8fb..000000000 --- a/changelog.d/615.added.md +++ /dev/null @@ -1,7 +0,0 @@ -Add the libvirt evidence-run evaluator-evidence producer -(`aces libvirt evidence validate`) that composes the libvirt participant -runtime, native substrate realization, backend manifest, and -experiment/evaluation contracts into a stable, validated, redacted -`aces.libvirt.scenario-evidence-run/v1` run artifact for the enterprise -participant/evidence scenario, feeding the Brad-Edwards/aces#600 cross-backend -invariant ledger. diff --git a/changelog.d/635.added.md b/changelog.d/635.added.md deleted file mode 100644 index 09117859f..000000000 --- a/changelog.d/635.added.md +++ /dev/null @@ -1,2 +0,0 @@ -Added the accepted CAGE-2 replication architecture ADR and companion design -record for REP-001. diff --git a/changelog.d/65.fixed.md b/changelog.d/65.fixed.md deleted file mode 100644 index eb97bd164..000000000 --- a/changelog.d/65.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Added an authoritative schema publication manifest and verification gate for the current `contracts/schemas/` tree. diff --git a/changelog.d/655.fixed.md b/changelog.d/655.fixed.md deleted file mode 100644 index fe7dde767..000000000 --- a/changelog.d/655.fixed.md +++ /dev/null @@ -1,3 +0,0 @@ -### Fixed - -- Enforced SDL variable declaration-name grammar and embedded placeholder validation consistently across parser, semantic validation, and published schemas, with factored traversal for variable-reference checks. diff --git a/changelog.d/66.changed.md b/changelog.d/66.changed.md deleted file mode 100644 index e92517e0b..000000000 --- a/changelog.d/66.changed.md +++ /dev/null @@ -1,27 +0,0 @@ -Migrated the backend conformance suite and CLI onto the published -contracts tree: `contracts/profiles/backend/*.json` is now the single -authority for profile-to-contract requirements (loaded via the new -schema-published `aces_contracts.backend_profiles.BackendProfileModel`, -which carries a `schema_version` field, is registered in `schema_bundle()`, -ships as `contracts/schemas/profiles/backend-profile-v1.json`, and is -validated end-to-end by `tools/check_json_artifacts.py`), the in-code -`_PROFILE_REQUIREMENTS` duplicate authority has been removed, the -`full-remote-control-plane` profile now declares the participant-episode -contracts it actually validates, and `aces conformance backend` is the -canonical Typer CLI entry point with a thin -`python -m aces_conformance.runner` compatibility delegate. The runner -and CLI accept any profile id discoverable from the JSON corpus (not -just the four known `BackendCapabilityProfile` enum members); known -runtime surfaces continue to drive capability-gap and live-probe -behavior for the four families this implementation understands, and -target conformance refuses unknown profile ids with a structured -`conformance.profile-runtime-surface-unknown` diagnostic. Profile-load -failures (missing file, malformed JSON, schema-rejected payload, swapped -identity) surface as structured `conformance.profile-load-failed` -diagnostics — with sanitized error text that does not echo rejected -payload contents — at every public surface, and CLI JSON diagnostics -now carry full `code`/`domain`/`address`/`severity` so downstream tooling -can dispatch on codes without parsing prose. The shared loader rejects -profile ids that don't match `^[a-z0-9]+(?:-[a-z0-9]+)*$` before -constructing a filesystem path, and the override path additionally -confines the resolved profile path under the supplied `profiles_root`. diff --git a/changelog.d/663.fixed.md b/changelog.d/663.fixed.md deleted file mode 100644 index 93ae2bcae..000000000 --- a/changelog.d/663.fixed.md +++ /dev/null @@ -1,7 +0,0 @@ -Target conformance no longer assumes every backend can realize an arbitrary -reference scenario. `run_target_conformance` accepts an optional -`reference_scenario`, so a fixed-topology emulation or bounded simulation -backend can certify against a scenario it declares it can realize instead of -being wrongly failed for not realizing a hard-coded `vm` node; the issue #606 -full-realization guard still applies to whichever scenario is selected. -Temporary bridge superseded by the realizability-envelope design (#667/#668). diff --git a/changelog.d/667.added.md b/changelog.d/667.added.md deleted file mode 100644 index ea8f8817e..000000000 --- a/changelog.d/667.added.md +++ /dev/null @@ -1,2 +0,0 @@ -Documented the proposed realization-envelope semantics, including prior art, -manifest carriage, subsumption, witness generation, and negative conformance. diff --git a/changelog.d/67.fixed.md b/changelog.d/67.fixed.md deleted file mode 100644 index 670fa49ac..000000000 --- a/changelog.d/67.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Restored the example-scenario leg of the validation corpus and closed a related runtime-planner gap surfaced by the test-quality review. The MCP-server tests now exercise the curated `examples/scenarios/` SDL files through the MCP tool flow instead of silently skipping when the path resolved to a non-existent directory. The runtime planner now enforces `allowed_values` against backend `supported_os_families` and `max_total_nodes` even when the variable carries a default; previously the compile step substituted defaults before the planner could see the variable reference, so the capability check at `aces_processor/planner.py` was unreachable. diff --git a/changelog.d/670.changed.md b/changelog.d/670.changed.md deleted file mode 100644 index 493c1c506..000000000 --- a/changelog.d/670.changed.md +++ /dev/null @@ -1,10 +0,0 @@ -Renamed the `paper-*` reference-scenario, evidence-run, and corpus identifiers to -functional names, decoupling the ACES repo from any specific publication. The -scenario is now `examples/scenarios/enterprise-participant-evidence-loop.sdl.yaml`; -the libvirt producer is `aces_operations.libvirt_evidence_run` emitting -`aces.libvirt.scenario-evidence-run/v1`; the corpus producer is -`aces_operations.cross_backend_corpus` emitting `aces.cross-backend-evidence-corpus/v1`. -The CLI command `aces libvirt paper validate-evidence` is now -`aces libvirt evidence validate` (`aces corpus build` is unchanged). The committed -demonstration corpus was removed from this repo — the producer remains, and the -canonical published corpus now lives in the public `Brad-Edwards/research` repo. diff --git a/changelog.d/671.added.md b/changelog.d/671.added.md deleted file mode 100644 index 86fa4d9db..000000000 --- a/changelog.d/671.added.md +++ /dev/null @@ -1,7 +0,0 @@ -Add ADR-073 (proposed) examining whether OCR-inherited SDL scoring -(`metrics`/`evaluations`/`tlos`/`goals`) and the CybORG `agents.reward_calculator` -label belong in ACES, with scoring-scope research notes -(`docs/research/scoring-scope/`) and a SEM-206 assessment-semantics compatibility -guardrail. The ADR recommends treating these surfaces as vestigial against the -experiment-vs-data-use boundary (ADR-055/064/069) and defers the decision to -review. diff --git a/changelog.d/68.added.md b/changelog.d/68.added.md deleted file mode 100644 index e5964d61e..000000000 --- a/changelog.d/68.added.md +++ /dev/null @@ -1 +0,0 @@ -Canonical machine-readable mapping for the classification-based assurance policy (ASR-505): `specs/formal/assurance-policy.yaml` enumerates every `FM` level's required and prohibited artifacts; `tools/check_assurance_policy.py` gates drift in CI; ADR-018 records the decision and `docs/specs/formal.md` is realigned to ADR-007's level names. diff --git a/changelog.d/684.added.md b/changelog.d/684.added.md deleted file mode 100644 index 12b903d30..000000000 --- a/changelog.d/684.added.md +++ /dev/null @@ -1 +0,0 @@ -`aces-sdl` is now published to PyPI (`pip install aces-sdl`). Releases are cut from a single committed `__version__` literal, bumped from the towncrier changelog fragments by `tools/release.py` (`removed` → major once ≥ 1.0 else minor, `added`/`changed`/`deprecated` → minor, `security`/`fixed` → patch; `breaking` is recorded but forced manually). Merging the release PR to `main` builds the corpus-bundled wheel + sdist, publishes over OIDC trusted publishing, and attaches a CycloneDX SBOM to the GitHub Release. diff --git a/changelog.d/69.added.md b/changelog.d/69.added.md deleted file mode 100644 index 458395b14..000000000 --- a/changelog.d/69.added.md +++ /dev/null @@ -1 +0,0 @@ -Add the canonical normative-artifact authority-boundary manifest for ASR-517 (`specs/authority/authority-boundary.yaml`), governed by ADR-019, with a structural gate (`tools/check_authority_boundary.py`) wired into `nox -s policy`. diff --git a/changelog.d/70.added.md b/changelog.d/70.added.md deleted file mode 100644 index eb5aab1fb..000000000 --- a/changelog.d/70.added.md +++ /dev/null @@ -1 +0,0 @@ -Add declarative participant framing fields to the SDL `agents` section (ACT-601, ADR-020): `starting_conditions`, `authority_anchors`, and `operating_scope` on `Agent`, with semantic validation against the `conditions` section and the named-reference / targetable indexes. Identity and role continue to come from `Agent.entity` and `Entity.role`. diff --git a/changelog.d/71.added.md b/changelog.d/71.added.md deleted file mode 100644 index 2599066a8..000000000 --- a/changelog.d/71.added.md +++ /dev/null @@ -1,7 +0,0 @@ -Added the issue 71 participant-semantics design ADR, formal spec, and lineage -documentation for SEM-208, SEM-209, SEM-210, SEM-211, SEM-212, SEM-213, and -SEM-215. - -Recorded cross-issue design deferrals for benchmark anti-contamination, -machine-checkable participant conformance, and DSL language adequacy evidence, -including GitHub issue #346 for DSL evaluation/language adequacy. diff --git a/changelog.d/72.added.md b/changelog.d/72.added.md deleted file mode 100644 index eac8155fb..000000000 --- a/changelog.d/72.added.md +++ /dev/null @@ -1,17 +0,0 @@ -Added the normative SEM-218 explicitness and realization semantics spec at -`specs/formal/realization/explicitness-and-realization.md`, distinguishing -binding author declarations from open backend realization and stating the -fail-closed rule for unsupported exact requirements. The spec scopes -realization-support disclosure to backend manifests only (processor -manifests carry no `realization_support` because the processor layer -does not realize underspecified concerns), and records its current -realization status as `partial` in the SEM-200 coverage table. -Enforcement today is the narrow structural floor: the apparatus-contract -shape gates on backend `RealizationSupportDeclaration`, the JSON-schema -conditional gate, the processor-manifest asymmetric rejection of -`realization_support`, and the closed-Pydantic SDL model boundary. The -SEM-218 classifier (exact / constrained / open) in `SemanticValidator`, -the typed compiler emission, the planner-side match against backend -`realization_support`, the runtime non-approximation envelope, and the -SEM-218 provenance fields are normative for the implementation work -that lifts the row from `partial` to `active`. diff --git a/changelog.d/74.added.md b/changelog.d/74.added.md deleted file mode 100644 index 84556b2a2..000000000 --- a/changelog.d/74.added.md +++ /dev/null @@ -1,4 +0,0 @@ -Added the issue 74 participant-runtime design ADR and formal spec for RUN-305, -RUN-306, RUN-307, and RUN-308, including explicit support for opaque LLM, RL, -human, script, and external-service participants whose internal decision loops -are not exposed to ACES. diff --git a/changelog.d/76.added.md b/changelog.d/76.added.md deleted file mode 100644 index a5b6771c3..000000000 --- a/changelog.d/76.added.md +++ /dev/null @@ -1,17 +0,0 @@ -### Added - -- Published the joint participant backend-facing contract surface (ADR-060; - API-405/406/407/408/411 design issue #76): a `participant-runtime` schema - family (`participant-lifecycle-event-v1`, - `participant-observation-envelope-v1`, - `participant-shared-state-record-v1`, `participant-outcome-report-v1`), - control-plane retrieval projections (`participant-status-view-v1`, - `participant-history-view-v1`, `participant-context-view-v1`), an API-407 - `feature_support` extension of the backend-manifest - `capabilities.participant_runtime` block on the ADR-054 guarantee-strength - scale (with the `participant-runtime-feature-support-levels` controlled - vocabulary), the normative spec section - `specs/formal/runtime-contracts/participant-backend-contracts.md`, and the - research notes under `docs/research/participant-backend-contracts/`. - Design-issue scope only: shapes, schemas, and fixtures; runtime emission - and conformance land on #200-#203. diff --git a/changelog.d/77.added.md b/changelog.d/77.added.md deleted file mode 100644 index 6c1749f56..000000000 --- a/changelog.d/77.added.md +++ /dev/null @@ -1,2 +0,0 @@ -Added the participant behavior model ADR and formal spec covering ACT-602, -ACT-603, ACT-606, ACT-607, and ACT-608. diff --git a/changelog.d/87.added.md b/changelog.d/87.added.md deleted file mode 100644 index 0b55f8e4a..000000000 --- a/changelog.d/87.added.md +++ /dev/null @@ -1,50 +0,0 @@ -Added the experiment-core task, run, apparatus-context, and study/collection -contract design with generated schema support and published schema -descriptions. The contracts include semantic validators for task/run apparatus -constraints, manifest payload binding, study metric grounding, semantic- -invariant annotation shape checks, required wire-level schema versions, -study metric result coverage, study run-allocation coverage, and RFC 3339 -case/valid-leap-second validation. Run-allocation coverage now requires -explicit condition assignments to declared study factors, declared blocking -factors with operational levels and appropriate factor kinds, distinct -factor-level combinations, distinct auditable non-opaque run-level criteria, -and exactly-one condition satisfaction for included runs. It also excludes -invalidated, superseded, and not-evaluated runs from analysis allocation and -from analysis-bearing collection/cohort records. The final traceability pass -adds a literature/lineage criteria matrix, binds digest/path-bearing task and -metric evidence requirements to concrete run artifact checksum and URI/path, -prevents redacted or withheld experiment parameters from carrying concrete -values, requires validity notes for claim-bearing study and benchmark records, -and exposes explicit benchmark/agent-evaluation artifact roles for starter -files, evaluators, subtasks, gold steps, milestones, human assistance, -scaffolds, baselines, and cost/resource traces. Digest-bound semantic -validation treats schema-valid hex case variants as the same digest, optional -reference qualifiers constrain only when supplied, and unsupported -identity-reference digest/path qualifiers cannot silently satisfy apparatus or -run-allocation criteria. Schema semantic-invariant annotations must resolve to -callable validators, and declared run allocations are checked even when a -collection/cohort omits an analysis plan. -Experiment artifact references now require explicit sensitivity metadata, and -EXP-701 through EXP-705 are mapped to the generated schema publication surface -in requirement governance. Task records require leakage, apparatus, validity, -and supporting-artifact disclosure surfaces, and run-allocation condition -assignments now reject empty criteria at the JSON Schema boundary. Identity -references for processor/backend apparatus constraints reject digest/path -qualifiers. Generic scenario refs, run task refs, study task/run membership -refs, run-internal result evidence refs, artifact `satisfies_refs`, and all -run-allocation condition refs now also reject qualifiers they cannot bind. -Apparatus manifest validation rejects ambiguous selected-manifest subject -bindings, manifest path qualifiers, unvalidated digest-qualified manifest refs, -digest-qualified selected manifests that are not canonical component manifests, -processor/backend required manifest ids that do not match subject identities, -and mutually incompatible processor/backend manifest payloads. Apparatus -compatibility refs and measurement-channel refs now reject digest/path -qualifiers, including explicit null fields, so candidate run metadata cannot -satisfy id-only task or study criteria while carrying unvalidated checksum/path -claims. -Experiment core now incorporates participant implementation manifest and -provenance contracts, requires participant implementation apparatus to bind to -participant manifests and run-level provenance, resolves participant study -criteria through selected run provenance, renumbers the experiment ADR to avoid -the current SDL ADR range, and documents scenario-snapshot identity over -expanded canonical SDL module compositions. diff --git a/changelog.d/88.added.md b/changelog.d/88.added.md deleted file mode 100644 index 35e8355de..000000000 --- a/changelog.d/88.added.md +++ /dev/null @@ -1,2 +0,0 @@ -Add the experiment evidence and measure contract boundary for EXP-707, EXP-708, EXP-709, and EXP-715. The experiment-core schema family now publishes `experiment-capture-spec-v1`, `experiment-evidence-record-v1`, and `experiment-derived-measure-v1`, with valid/invalid fixtures, semantic invariant annotations, and conformance validators that keep declarative capture intent, raw evidence, and derived measures separate. Backend manifests now support an optional `capabilities.observation` block with governed capture-kind, channel-kind, and sealing-mode vocabularies, and conformance rejects observation claims that lack the published evidence contracts. ADR-064 and the formal experiment-core spec record the boundary; runtime capture, storage, APIs, schedulers, and statistical engines remain out of scope for this contract-only change. -Refactor the reported-value invariant helper and observation capability gap reporting so SonarCloud quality gates remain clean for the published contract surface. diff --git a/changelog.d/89.added.md b/changelog.d/89.added.md deleted file mode 100644 index acb43f301..000000000 --- a/changelog.d/89.added.md +++ /dev/null @@ -1 +0,0 @@ -Extend `experiment-run-v1` as the canonical run provenance record for EXP-710, EXP-720, and EXP-722. Run records now include required traceability links from capture specs to raw evidence, derived measures, and claims, plus realized-form disclosures for processor/backend/operator choices that were not fully authored in the scenario or task. ADR-065 and the formal experiment-core spec document the boundary; generated schemas, fixtures, and contract tests enforce the new provenance surface. Reference de-duplication now also tolerates constrained experiment reference models that omit optional digest, path, or subject fields. diff --git a/changelog.d/97.added.md b/changelog.d/97.added.md deleted file mode 100644 index 8e8cc5167..000000000 --- a/changelog.d/97.added.md +++ /dev/null @@ -1,4 +0,0 @@ -### Added - -- Added the ASR-511/ASR-515 validation and admission profile design, including - ADR-072, the formal validation-basis disclosure spec, and the clause matrix. diff --git a/changelog.d/README.md b/changelog.d/README.md deleted file mode 100644 index 045fdfda7..000000000 --- a/changelog.d/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Changelog Fragments - -Every PR with a user-visible change adds one Markdown fragment in this -directory. At release time, `towncrier build` collates the fragments into -[`../CHANGELOG.md`](../CHANGELOG.md) and removes the consumed files. - -This avoids merge conflicts from multiple PRs editing the top of -`CHANGELOG.md`. - -## Add A Fragment - -Create one file named: - -```text -..md -``` - -`` is the GitHub issue or PR number. For issue-free entries, prefix a -slug with `+`, for example `+fix-typo.fixed.md`, to suppress an issue suffix. - -`` must be one of: - -- `security` -- `added` -- `changed` -- `deprecated` -- `removed` -- `fixed` - -The file body is the bullet text. Keep it to one paragraph when possible. - -## Build The Changelog - -```sh -uvx towncrier build --version --date $(date -u +%F) -``` - -Preview without writing: - -```sh -uvx towncrier build --draft --version -``` diff --git a/changelog.d/_template.md.jinja b/changelog.d/_template.md.jinja deleted file mode 100644 index 45dfaf6a3..000000000 --- a/changelog.d/_template.md.jinja +++ /dev/null @@ -1,25 +0,0 @@ -{# Custom Markdown template for the repo's Keep a Changelog format: - - ## [X.Y.Z] - YYYY-MM-DD - - ### Section - - - bullet text (#issue) --#} -## [{{ versiondata.version }}] - {{ versiondata.date }} - -{% for section, _ in sections.items() %} -{% if sections[section] %} -{% for category, _ in definitions.items() if category in sections[section] %} -### {{ definitions[category]["name"] }} - -{% for text, values in sections[section][category].items() %} -- {{ text }}{% if values %} {{ values | join(" ") }}{% endif %} -{% endfor %} -{{ "\n\n" -}} -{% endfor %} -{% else %} -No significant changes. - -{% endif %} -{% endfor %} diff --git a/docs/explain/releasing.md b/docs/explain/releasing.md index c184fb8b2..421927a89 100644 --- a/docs/explain/releasing.md +++ b/docs/explain/releasing.md @@ -1,79 +1,68 @@ # Releasing aces-sdl -`aces-sdl` is published to **PyPI**. The version is a **single committed literal** -— `__version__` in `implementations/python/src/aces/__init__.py` — bumped by -`tools/release.py` from the pending towncrier changelog fragments. The changelog -fragments, the `__version__` literal, and the git tag all carry the same value -(#684). +`aces-sdl` is published to **PyPI**, and releases are automated with +[release-please](https://github.com/googleapis/release-please) (#684). You never +hand-edit the version or `CHANGELOG.md`: release-please derives both from the +Conventional Commit history on `main`. `aces-sdl` also ships the published contract corpus as package data, so `aces conformance backend` and SDL semantic validation work from an installed wheel. Every release binds the code and the corpus in one versioned artifact (#537). -## Version rubric (fragment type → bump) +## How a release happens -`tools/release.py` scans the pending fragments and takes the **highest** bump: +1. Feature PRs **squash-merge** (into `dev`, then promoted to `main`) with a + Conventional Commit **PR title** — the squashed commit is what release-please + reads. The required `title-guard` check enforces the shape. +2. On every push to `main`, `.github/workflows/release-please.yml` maintains a + **release PR** titled `chore(main): release X.Y.Z` that bumps the version and + regenerates `CHANGELOG.md` from the commits since the last release. +3. **Merge that release PR.** release-please tags `vX.Y.Z` and creates the GitHub + Release; the `publish` job then builds the corpus-bundled wheel + sdist, + verifies the corpus payload (#537), publishes to PyPI via OIDC, and attaches + the distributions to the Release. -| Fragment type | Bump | -|---|---| -| `removed` | **major** once already ≥ 1.0; **minor** while pre-1.0 | -| `added`, `changed`, `deprecated` | **minor** | -| `security`, `fixed` | **patch** | -| `breaking` | recorded in the changelog, **no auto-bump** — force with `--version` | -| *(no fragments)* | nothing to release | +Nothing is hand-run, and feature PRs never touch `CHANGELOG.md` (release-please +owns it) — no fragment collisions. -`breaking` renders a "Breaking Changes" section so incompatible changes are -recorded now, but it never escalates the version on its own. To cut the first -major, force it: `python tools/release.py --version 1.0.0`. +## Version rubric (PR-title type → bump) -## Cutting a release +| Type | Releases? | Bump | +|---|---|---| +| `feat` | yes | minor | +| `fix`, `perf` | yes | patch | +| `feat!` / `fix!` / `BREAKING CHANGE:` footer | yes | major (pre-1.0 demoted to minor) | +| `docs`, `chore`, `refactor`, `test`, `ci`, `build` | no | — | -1. From an up-to-date checkout (with the pending fragments present), run: +Use `feat:`/`fix:` for consumer-visible changes so release-please cuts a release. - ```sh - python tools/release.py # or: --version X.Y.Z to force - ``` +## Configuration - This bumps `__version__`, runs `towncrier build` (collating the fragments into - `CHANGELOG.md` and deleting them), and prints the next commands. -2. Commit on a release branch and open a PR to `main`: +- `release-please-config.json` — package at repo root (so `CHANGELOG.md` stays at + the root), `release-type: python`, `package-name: aces-sdl`. The actual version + literal lives in the subdir pyproject and is bumped via `extra-files` + (`implementations/python/pyproject.toml` → `$.project.version`). +- `.release-please-manifest.json` — the version source of truth: `{".": "X.Y.Z"}`. +- `implementations/python/pyproject.toml` — static `[project] version` + (release-please rewrites it). `aces.__version__` derives from the installed + distribution metadata. - ```sh - git switch -c release/vX.Y.Z - git commit -am "chore: release vX.Y.Z" - gh pr create --base main --title "chore: release vX.Y.Z" --fill - ``` -3. Merge the PR into `main`. That push runs `.github/workflows/release.yml`: the - `decide` job confirms the fragments are collated (none pending) and that - `v` is untagged, then the `release` job builds the corpus-bundled - wheel + sdist, verifies the corpus + version, tags `v` (tag-only — - `main` is never committed to by the workflow), publishes to PyPI via OIDC, and - cuts a GitHub Release whose notes are the `CHANGELOG.md` section. +## Caveat: the release PR and required checks -No commit is pushed to `main` by any bot — only a tag — so no PAT, deploy key, or -ruleset bypass is needed. The version-bump/changelog commit reaches `main` the -normal way: a human-reviewed PR merge. +The release PR is opened by `GITHUB_TOKEN`, so **required status checks do not +auto-run on it** (GitHub's recursion guard). Two options: -### Keeping `dev` in sync +- **Admin-merge** the release PR (bypass the required checks for that PR), or +- Give release-please a **PAT** (repo `contents`+`pull_requests`) as the `token` + input so its PRs trigger checks normally. -Feature PRs merge to `dev` (each adds a `changelog.d/` fragment). The release PR -targets `main`, so after it merges, **back-merge `main` → `dev`** to bring the -bumped `__version__` and the collated `CHANGELOG.md` back to `dev` (otherwise the -next `release.py` run computes from a stale literal). +## First release -## First release (0.18.0) - -The literal starts at `0.17.0` (the last hand-authored changelog version, never -published). The `decide` job **skips publishing while fragments are pending**, so -merging the release-infra change to `main` cannot accidentally publish `0.17.0`. -To ship the first release: - -1. Run `python tools/release.py` — the pending backlog (`added`/`changed`/ - `fixed`/`security`) computes a minor bump → **`0.18.0`**, collated into - `## [0.18.0]`. -2. PR the `release/v0.18.0` branch to `main` and merge → `v0.18.0` is tagged, - built, and published. +`main` starts at `0.18.0` (the manifest/pyproject baseline; the historical +changelog through `0.18.0` is preserved in `CHANGELOG.md`). The first `feat:`/ +`fix:` merged to `main` after adoption produces a release PR bumping from +`0.18.0`; merging it publishes the first PyPI artifact. ## PyPI trusted publishing (one-time, maintainer) @@ -83,25 +72,14 @@ token stored): - PyPI → *Your projects* → *Publishing* → *Add a pending publisher* → GitHub - PyPI Project Name: `aces-sdl` - Owner: `Brad-Edwards` · Repository: `aces` -- Workflow name: `release.yml` · Environment name: `pypi` - -The `release` job sets `environment: pypi` (a GitHub environment restricted to -`main`). A filename/environment mismatch 403s only the PyPI publish step. - -## Contributor rule +- **Workflow name: `release-please.yml`** · Environment name: `pypi` -Per PR, add a `changelog.d/..md` fragment; **never edit -`CHANGELOG.md` directly** (only `tools/release.py` / release-collation commits -do). The fragment `` is what determines the next version. +> If you previously registered the publisher against `release.yml`, update it to +> `release-please.yml` (or add a second pending publisher) — the workflow filename +> must match or only the PyPI publish step 403s. ## Pinning from a downstream backend ``` aces-sdl== ``` - -or, for an unpublished commit, the git subdirectory install: - -``` -aces-sdl @ git+https://github.com/Brad-Edwards/aces.git@v#subdirectory=implementations/python -``` diff --git a/implementations/python/pyproject.toml b/implementations/python/pyproject.toml index 07db896e5..402c51eaf 100644 --- a/implementations/python/pyproject.toml +++ b/implementations/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "aces-sdl" -dynamic = ["version"] +version = "0.18.0" description = "Backend-agnostic cyber range scenario description language and runtime." requires-python = ">=3.11" dependencies = [ @@ -28,7 +28,6 @@ dev = [ "coverage>=7.0.0", "httpx>=0.27.0", "hypothesis>=6.0.0", - "towncrier>=23.11.0", ] docs = [ "sphinx>=7.3.0", @@ -42,12 +41,9 @@ docs = [ aces = "aces.cli.main:app" aces-mcp = "aces_mcp.server:main" -# Version is a single committed literal, `__version__` in src/aces/__init__.py -# (#684). Hatchling reads it via the `path` source; `tools/release.py` bumps that -# literal from the pending towncrier changelog fragments at release time. There -# is no VCS- or PSR-derived version and nothing to hand-edit outside a release. -[tool.hatch.version] -path = "src/aces/__init__.py" +# Version is the static `[project] version` above (#684) — the single source of +# truth, rewritten by release-please on each release. Hatchling reads it directly; +# `aces.__version__` derives from the installed distribution metadata. [tool.hatch.build.targets.wheel] packages = [ diff --git a/implementations/python/src/aces/__init__.py b/implementations/python/src/aces/__init__.py index 5ddff9a1b..a86952363 100644 --- a/implementations/python/src/aces/__init__.py +++ b/implementations/python/src/aces/__init__.py @@ -1,8 +1,9 @@ """Backward-compatible ACES namespace.""" -# Single source of truth for the version (#684). tools/release.py bumps this from -# the pending towncrier changelog fragments; hatchling reads it via the -# [tool.hatch.version] `path` source. Do not hand-edit outside a release. -__version__ = "0.17.0" +from aces._compat import package_version + +# Derived from the installed distribution metadata. The version source of truth +# is `[project] version` in pyproject.toml, bumped by release-please (#684). +__version__ = package_version("aces-sdl", default="0.1.0") __all__ = ["__version__"] diff --git a/implementations/python/tests/test_release.py b/implementations/python/tests/test_release.py deleted file mode 100644 index 4559b8a0e..000000000 --- a/implementations/python/tests/test_release.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Tests for the release version computation (tools/release.py, #684). - -Locks the fragment-type -> SemVer bump rubric so it cannot drift from -towncrier.toml or the release workflow. Runs inside `nox -s verify`. -""" - -from __future__ import annotations - -import sys -from pathlib import Path - -import pytest - -REPO_ROOT = Path(__file__).resolve().parents[3] -if str(REPO_ROOT) not in sys.path: - sys.path.insert(0, str(REPO_ROOT)) - -from tools import release # noqa: E402 -from tools.release import KNOWN_TYPES, current_version, next_version, pending_types # noqa: E402 - - -@pytest.mark.parametrize( - ("base", "types", "expected"), - [ - ((0, 17, 0), {"fixed"}, "0.17.1"), - ((0, 17, 0), {"security", "fixed"}, "0.17.1"), - ((0, 17, 0), {"added"}, "0.18.0"), - ((0, 17, 0), {"fixed", "added", "security"}, "0.18.0"), # highest wins - ((0, 17, 0), {"changed", "deprecated"}, "0.18.0"), - ((0, 17, 0), {"removed"}, "0.18.0"), # pre-1.0: removed is a minor - ((1, 2, 3), {"removed"}, "2.0.0"), # >= 1.0: removed is a major - ((1, 2, 3), {"added"}, "1.3.0"), - ((1, 2, 3), {"fixed"}, "1.2.4"), - ], -) -def test_next_version(base: tuple[int, int, int], types: set[str], expected: str) -> None: - assert next_version(base, types) == expected - - -@pytest.mark.parametrize("types", [set(), {"breaking"}]) -def test_next_version_no_auto_bump(types: set[str]) -> None: - # No fragments, or only `breaking` (which never auto-escalates), => no bump. - assert next_version((0, 17, 0), types) is None - - -def test_breaking_is_recorded_but_does_not_escalate() -> None: - # A breaking fragment alongside a real change is collated but does not raise - # the bump beyond what the other fragments imply. - assert next_version((0, 17, 0), {"breaking", "added"}) == "0.18.0" - assert next_version((0, 17, 0), {"breaking", "fixed"}) == "0.17.1" - - -def test_breaking_is_a_known_type() -> None: - assert "breaking" in KNOWN_TYPES - - -def test_current_version_reads_the_committed_literal() -> None: - major, minor, patch = current_version() - assert (major, minor, patch) >= (0, 17, 0) - - -def test_pending_types_rejects_unknown_type(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - (tmp_path / "1.added.md").write_text("- x\n", encoding="utf-8") - (tmp_path / "2.bogus.md").write_text("- x\n", encoding="utf-8") - monkeypatch.setattr(release, "FRAGMENTS", tmp_path) - with pytest.raises(SystemExit): - pending_types() - - -def test_pending_types_skips_non_fragments(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - (tmp_path / "README.md").write_text("x\n", encoding="utf-8") - (tmp_path / "_template.md.jinja").write_text("x\n", encoding="utf-8") - (tmp_path / "1.breaking.md").write_text("- x\n", encoding="utf-8") - monkeypatch.setattr(release, "FRAGMENTS", tmp_path) - assert pending_types() == {"breaking"} diff --git a/implementations/python/tests/test_repo_policy_tools.py b/implementations/python/tests/test_repo_policy_tools.py index 242eae6ab..6b2d915fb 100644 --- a/implementations/python/tests/test_repo_policy_tools.py +++ b/implementations/python/tests/test_repo_policy_tools.py @@ -222,25 +222,6 @@ def test_compatibility_layer_rejects_non_wrapper_logic(tmp_path: Path) -> None: assert [failure.rule_id for failure in failures] == ["compatibility-wrapper-only"] -def test_compatibility_layer_allows_version_literal(tmp_path: Path) -> None: - # The committed __version__ literal is the [tool.hatch.version] `path` source - # (#684); a version constant is not implementation logic. - repo_root = setup_policy_repo(tmp_path) - write_text( - repo_root / "implementations" / "python" / "src" / "aces" / "__init__.py", - '"""ns."""\n\n__version__ = "0.17.0"\n\n__all__ = ["__version__"]\n', - ) - - failures = evaluate_repo_policy( - repo_root, - ["implementations/python/src/aces/__init__.py"], - check_set="file-local", - structural_runner=structural_runner_stub, - ) - - assert "compatibility-wrapper-only" not in [failure.rule_id for failure in failures] - - def test_adr_readme_must_match_adr_documents(tmp_path: Path) -> None: repo_root = setup_policy_repo(tmp_path) write_text( diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 000000000..1141895fe --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "include-component-in-tag": false, + "packages": { + ".": { + "release-type": "python", + "package-name": "aces-sdl", + "changelog-path": "CHANGELOG.md", + "extra-files": [ + { + "type": "toml", + "path": "implementations/python/pyproject.toml", + "jsonpath": "$.project.version" + } + ] + } + } +} diff --git a/tools/policy/adr_policy.yaml b/tools/policy/adr_policy.yaml index c6b05c36b..7b351d1c9 100644 --- a/tools/policy/adr_policy.yaml +++ b/tools/policy/adr_policy.yaml @@ -9,9 +9,6 @@ source_roots: - implementations/python/packages - implementations/python/src -changelog_path: CHANGELOG.md -changelog_fragment_dir: changelog.d - # ADR-009 section 7: published schemas under contracts/schemas/ are # hand-governed normative authority. A schema change must record a # contract-facing change-ledger entry in the publication manifest (the deeper diff --git a/tools/policy/conftest/repo_policy.rego b/tools/policy/conftest/repo_policy.rego index 568809fda..6933fa279 100644 --- a/tools/policy/conftest/repo_policy.rego +++ b/tools/policy/conftest/repo_policy.rego @@ -39,39 +39,11 @@ deny contains result if { } -deny contains result if { - input.check_set == "full" - some path in input.changed - path_matches_any(path, input.policy.source_roots) - endswith(path, ".py") - not changelog_signal_touched - result := { - "msg": "source changes require a changelog fragment under changelog.d/", - "rule_id": "changelog-required", - "path": input.policy.changelog_fragment_dir, - } -} - - manifest_touched if { input.policy.generated_contracts.manifest_path in input.changed } -changelog_signal_touched if { - input.policy.changelog_path in input.changed -} - - -changelog_signal_touched if { - some path in input.changed - path_matches_prefix(path, input.policy.changelog_fragment_dir) - endswith(path, ".md") - not endswith(path, "/README.md") - not startswith(path, sprintf("%s/_", [trim(input.policy.changelog_fragment_dir, "/")])) -} - - contains_reserved_token(path) if { token := input.policy.concept_authority.reserved_path_tokens[_] contains(path, token) diff --git a/tools/policy/conftest/repo_policy_test.rego b/tools/policy/conftest/repo_policy_test.rego index 86b968f0f..8d1c0db34 100644 --- a/tools/policy/conftest/repo_policy_test.rego +++ b/tools/policy/conftest/repo_policy_test.rego @@ -107,81 +107,3 @@ test_reserved_concept_authority_paths_are_enforced if { some failure in failures failure.rule_id == "concept-authority-reserved-path" } - - -test_changelog_is_required_for_source_changes if { - failures := deny with input as { - "changed": ["implementations/python/packages/aces_processor/runtime.py"], - "check_set": "full", - "policy": { - "legacy_top_level_roots": [], - "generated_contracts": {"generated_roots": []}, - "concept_authority": {"reserved_path_tokens": [], "allowed_paths": []}, - "source_roots": ["implementations/python/packages"], - "changelog_path": "CHANGELOG.md", - "changelog_fragment_dir": "changelog.d", - }, - } - count(failures) == 1 - some failure in failures - failure.rule_id == "changelog-required" -} - - -test_changelog_fragment_satisfies_source_changes if { - failures := deny with input as { - "changed": [ - "implementations/python/packages/aces_processor/runtime.py", - "changelog.d/132.added.md", - ], - "check_set": "full", - "policy": { - "legacy_top_level_roots": [], - "generated_contracts": {"generated_roots": []}, - "concept_authority": {"reserved_path_tokens": [], "allowed_paths": []}, - "source_roots": ["implementations/python/packages"], - "changelog_path": "CHANGELOG.md", - "changelog_fragment_dir": "changelog.d", - }, - } - count(failures) == 0 -} - - -test_changelog_readme_does_not_satisfy_source_changes if { - failures := deny with input as { - "changed": [ - "implementations/python/packages/aces_processor/runtime.py", - "changelog.d/README.md", - ], - "check_set": "full", - "policy": { - "legacy_top_level_roots": [], - "generated_contracts": {"generated_roots": []}, - "concept_authority": {"reserved_path_tokens": [], "allowed_paths": []}, - "source_roots": ["implementations/python/packages"], - "changelog_path": "CHANGELOG.md", - "changelog_fragment_dir": "changelog.d", - }, - } - count(failures) == 1 - some failure in failures - failure.rule_id == "changelog-required" -} - - -test_file_local_mode_skips_changelog if { - failures := deny with input as { - "changed": ["implementations/python/packages/aces_processor/runtime.py"], - "check_set": "file-local", - "policy": { - "legacy_top_level_roots": [], - "generated_contracts": {"generated_roots": []}, - "concept_authority": {"reserved_path_tokens": [], "allowed_paths": []}, - "source_roots": ["implementations/python/packages"], - "changelog_path": "CHANGELOG.md", - "changelog_fragment_dir": "changelog.d", - }, - } - count(failures) == 0 -} diff --git a/tools/policy/repo_policy.py b/tools/policy/repo_policy.py index c0ddb99cd..e143b7acf 100644 --- a/tools/policy/repo_policy.py +++ b/tools/policy/repo_policy.py @@ -584,16 +584,8 @@ def _is_wrapper_module(tree: ast.Module) -> bool: target_names = {target.id for target in node.targets if isinstance(target, ast.Name)} if target_names == {"__all__"} and isinstance(node.value, (ast.List, ast.Tuple)): continue - if target_names == {"__version__"}: - # The committed version literal (the [tool.hatch.version] `path` - # source, #684) or a package_version()/_reexport() re-export. - if isinstance(node.value, ast.Constant) and isinstance(node.value.value, str): - continue - if ( - isinstance(node.value, ast.Call) - and isinstance(node.value.func, ast.Name) - and node.value.func.id in allowed_calls - ): + if target_names == {"__version__"} and isinstance(node.value, ast.Call): + if isinstance(node.value.func, ast.Name) and node.value.func.id in allowed_calls: continue return False if isinstance(node, ast.Expr) and isinstance(node.value, ast.Call): diff --git a/tools/release.py b/tools/release.py deleted file mode 100644 index 3802e4e17..000000000 --- a/tools/release.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -"""Cut a release (#684): compute the next version from the pending towncrier -fragments, write it as the ``__version__`` literal, and run ``towncrier build``. - -No git operations are performed. Run it, then commit the result on a -``release/vX.Y.Z`` branch and open a PR to ``main``; merging that PR triggers the -release workflow, which tags + builds + publishes. - -Fragment type -> bump (highest pending wins): - removed -> major once already >= 1.0, else minor (pre-1.0) - added, changed, deprecated -> minor - security, fixed -> patch - breaking -> recorded in the changelog but does NOT - auto-escalate the bump; force the major - explicitly with ``--version 1.0.0``. - -Usage: - python tools/release.py # auto-compute from fragments - python tools/release.py --version 1.0.0 # force an explicit version -""" - -from __future__ import annotations - -import argparse -import re -import subprocess -import sys -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -INIT = ROOT / "implementations" / "python" / "src" / "aces" / "__init__.py" # {{VERSION_FILE}} -FRAGMENTS = ROOT / "changelog.d" - -_VERSION_RE = re.compile(r'^__version__\s*=\s*"(\d+)\.(\d+)\.(\d+)"', re.M) - -MINOR = {"added", "changed", "deprecated"} -PATCH = {"fixed", "security"} -BREAK = {"removed"} -# `breaking` is a real changelog type but intentionally has no auto-bump effect. -KNOWN_TYPES = MINOR | PATCH | BREAK | {"breaking"} - - -def current_version() -> tuple[int, int, int]: - m = _VERSION_RE.search(INIT.read_text(encoding="utf-8")) - if not m: - sys.exit(f"no __version__ literal found in {INIT}") - return tuple(int(x) for x in m.groups()) # type: ignore[return-value] - - -def pending_types() -> set[str]: - found: set[str] = set() - unknown: list[str] = [] - for frag in sorted(FRAGMENTS.glob("*.md")): - if frag.name == "README.md" or frag.name.startswith("_"): - continue - parts = frag.name.split(".") - if len(parts) < 3: - continue - ftype = parts[-2] - if ftype not in KNOWN_TYPES: - unknown.append(frag.name) - continue - found.add(ftype) - if unknown: - sys.exit(f"changelog fragments with unknown type (expected {sorted(KNOWN_TYPES)}): {unknown}") - return found - - -def next_version(current: tuple[int, int, int], types: set[str]) -> str | None: - major, minor, patch = current - if types & BREAK: - return f"{major + 1}.0.0" if major >= 1 else f"{major}.{minor + 1}.0" - if types & MINOR: - return f"{major}.{minor + 1}.0" - if types & PATCH: - return f"{major}.{minor}.{patch + 1}" - return None - - -def main() -> None: - parser = argparse.ArgumentParser(description="Cut a release from pending changelog fragments (#684).") - parser.add_argument("--version", help="force an explicit X.Y.Z (e.g. to cut 1.0.0)") - args = parser.parse_args() - - types = pending_types() - if args.version: - version = args.version - elif not types: - sys.exit("no pending changelog fragments; nothing to release") - else: - version = next_version(current_version(), types) - if version is None: - sys.exit(f"pending fragment types {sorted(types)} imply no release; use --version to force one") - - if not re.fullmatch(r"\d+\.\d+\.\d+", version): - sys.exit(f"bad version {version!r} (expected X.Y.Z)") - - INIT.write_text(_VERSION_RE.sub(f'__version__ = "{version}"', INIT.read_text(encoding="utf-8"), count=1)) - subprocess.run([sys.executable, "-m", "towncrier", "build", "--yes", "--version", version], cwd=ROOT, check=True) - - print( - f"\nv{version} prepared. Next:\n" - f" git switch -c release/v{version}\n" - f" git commit -am 'chore: release v{version}'\n" - f" gh pr create --base main --title 'chore: release v{version}' --fill" - ) - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/towncrier.toml b/towncrier.toml deleted file mode 100644 index e446021be..000000000 --- a/towncrier.toml +++ /dev/null @@ -1,52 +0,0 @@ -[tool.towncrier] -name = "aces-sdl" -filename = "CHANGELOG.md" -directory = "changelog.d" -template = "changelog.d/_template.md.jinja" -title_format = false -start_string = "\n" -issue_format = "(#{issue})" -wrap = false -all_bullets = true - -# Fragment type -> release bump is computed by tools/release.py: -# removed -> major (only once already >= 1.0; pre-1.0 it is a minor) -# added / changed / deprecated -> minor -# security / fixed -> patch -# `breaking` renders a Breaking Changes section but does NOT auto-escalate the -# bump — it is inert until you force the major explicitly (release.py --version -# 1.0.0). It is kept so breaking changes are recorded in the changelog now. -[[tool.towncrier.type]] -directory = "breaking" -name = "Breaking Changes" -showcontent = true - -[[tool.towncrier.type]] -directory = "security" -name = "Security" -showcontent = true - -[[tool.towncrier.type]] -directory = "added" -name = "Added" -showcontent = true - -[[tool.towncrier.type]] -directory = "changed" -name = "Changed" -showcontent = true - -[[tool.towncrier.type]] -directory = "deprecated" -name = "Deprecated" -showcontent = true - -[[tool.towncrier.type]] -directory = "removed" -name = "Removed" -showcontent = true - -[[tool.towncrier.type]] -directory = "fixed" -name = "Fixed" -showcontent = true