Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
2ee0976
fix(safety): close fail-open paths and freeze Rust-owned vocabulary
bordumb Aug 15, 2026
f5c3589
fix(corpus): converge three verifiers on absent-budget denial
bordumb Aug 15, 2026
1a88ba3
core: make root preservation a computed dimension and a real proof (U…
bordumb Aug 15, 2026
d735eda
product: let the signed receipt say "unknown", and sign it only after…
bordumb Aug 15, 2026
d82d57f
product: rebuild auths-node on the verified kernel (UNSIGNED)
bordumb Aug 15, 2026
a85f6b7
formal: repoint the assurance inventory at the renamed root theorem
bordumb Aug 15, 2026
ac5b968
core: make terminal budget coverage the kernel's own answer (UNSIGNED)
bordumb Aug 15, 2026
f82cb08
formal: run the 31 ungated Kani harnesses and fix what they proved (U…
bordumb Aug 15, 2026
e21fb2c
formal: make attenuation dimension 11 expressible, then prove it (UNS…
bordumb Aug 15, 2026
f34d37a
test: make the effect axis a failing acceptance test in both bindings…
bordumb Aug 15, 2026
29b7bab
gate: detect mirrored and homonymous public exports (UNSIGNED)
bordumb Aug 15, 2026
9e17ff8
bindings/wasm: carry the error envelope, drop the reference machinery…
bordumb Aug 15, 2026
ad8e25b
bindings/python: make the pyo3 boundary a transport, not a tier (UNSI…
bordumb Aug 15, 2026
5964279
bindings/typescript: one effect axis, and a WASM boundary that carrie…
bordumb Aug 15, 2026
b4c6674
product/mcp: let the profile name its own outcome, and TypeScript rea…
bordumb Aug 16, 2026
c04bd48
bindings/python: one vocabulary, one entry point per operation (UNSIG…
bordumb Aug 16, 2026
7031e3d
gate: repoint the semantic-freeze inventory at auths._service (UNSIGNED)
bordumb Aug 16, 2026
723a71f
bindings/typescript: one vocabulary, one entry point per operation (U…
bordumb Aug 16, 2026
a8a6ee9
bindings/typescript: delete the workflow layer's private effect axis …
bordumb Aug 16, 2026
7e16b3d
gate: repoint the semantic-freeze inventory at the service entry poin…
bordumb Aug 16, 2026
443c328
chore: record the auths-profile-mcp dev-dependency in the lockfile (U…
bordumb Aug 16, 2026
cadbbb8
verify: delete two surviving binding-local classification rules (UNSI…
bordumb Aug 16, 2026
ef85a8b
core: make budget expressiveness a declared profile property (UNSIGNED)
bordumb Aug 16, 2026
b5a95d5
bindings: one factory name per concept across both languages (UNSIGNED)
bordumb Aug 16, 2026
334e34c
release: assign semantic versions for every identity this branch drif…
bordumb Aug 16, 2026
c578427
chore(formal): regenerate qualification artifacts
github-actions[bot] Aug 16, 2026
7b8571d
style: cargo fmt (UNSIGNED)
bordumb Aug 16, 2026
17038d9
ci: fix the three failures from the first CI run (UNSIGNED)
bordumb Aug 16, 2026
697bd99
ci: make auths-node build standalone, and regenerate the stale recipe…
bordumb Aug 16, 2026
a91a4e2
demos: make the reference-stack smoke test say what failed (UNSIGNED)
bordumb Aug 16, 2026
26306e1
demos: give the reference stack the trusted context it requires (UNSI…
bordumb Aug 16, 2026
4b91cd6
formal: bind the root-linkage temporaries so aeneas can translate the…
bordumb Aug 16, 2026
8acdf8b
chore(formal): regenerate qualification artifacts
github-actions[bot] Aug 16, 2026
668f219
ci: regenerate the architecture snapshot for the std feature edges (U…
bordumb Aug 16, 2026
0f6e341
release: resync the freeze after the upstream formal regeneration (UN…
bordumb Aug 16, 2026
3d8338f
formal: close the refinement gap by regenerating the translation (UNS…
bordumb Aug 16, 2026
6f3f667
chore(formal): regenerate qualification artifacts
github-actions[bot] Aug 16, 2026
e94c688
formal: make mutation kills compiled theorems instead of prose (UNSIG…
bordumb Aug 16, 2026
6b8ee8a
formal: bound critical-extension payloads in the representation invar…
bordumb Aug 16, 2026
b355dd3
formal: name every scope dimension instead of nesting nine conjuncts …
bordumb Aug 16, 2026
71056b7
formal: make the attenuation projection carry its own certificate (UN…
bordumb Aug 16, 2026
422d4ce
formal: bind every evidence artifact to its digest (UNSIGNED)
bordumb Aug 16, 2026
48d8572
formal: account for every upstream sorry, and keep evidence digests f…
bordumb Aug 16, 2026
a7bb471
demos: author the reference stack's authority offline (UNSIGNED)
bordumb Aug 16, 2026
273e9b6
bindings: let a client carry a proof it already holds (UNSIGNED)
bordumb Aug 16, 2026
f3fe4ee
demos: pass the required identity to the reference clients (UNSIGNED)
bordumb Aug 16, 2026
aa2669c
demos: make the authored proof actually verify (UNSIGNED)
bordumb Aug 16, 2026
90f86ad
demos: contain the authored grant inside the anchor's validity (UNSIG…
bordumb Aug 16, 2026
84fe447
ci: show why the node denied instead of only that it did (UNSIGNED)
bordumb Aug 16, 2026
7d584b3
formal: harden the assurance boundary across all eleven review items …
bordumb Aug 16, 2026
ff0c73b
chore(formal): regenerate qualification artifacts
github-actions[bot] Aug 16, 2026
d328756
ci: close semantic and platform reliability gaps
bordumb Aug 16, 2026
65e0a10
fix: fail closed across clean-checkout CI
bordumb Aug 16, 2026
fabeb55
fix: verify signed receipts across replicas
bordumb Aug 16, 2026
299ed38
fix: align reference recovery contract
bordumb Aug 16, 2026
0636b8a
fix: fail fast before expensive CI
bordumb Aug 17, 2026
2514602
ci: require complete current-head qualification
bordumb Aug 17, 2026
50d503e
fix: clear fail-closed repository preflight
bordumb Aug 17, 2026
30d9d7d
fix: keep node docs within public API
bordumb Aug 17, 2026
f64724a
ci: allow superseded runs to cancel
bordumb Aug 17, 2026
33670e3
fix: keep Python docs within public API
bordumb Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
158 changes: 119 additions & 39 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ jobs:

formal-update-gate:
name: generated artifacts current
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, formal-update-preflight]
runs-on: ubuntu-latest
steps:
Expand All @@ -135,13 +135,35 @@ jobs:
exit 1
fi

repository-preflight:
name: repository preflight
needs: [ci-plan, formal-update-gate]
if: >-
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
fetch-depth: 0
persist-credentials: false
- uses: ./.github/actions/setup-rust-cache
with:
toolchain: 1.97.1
components: rustfmt, clippy
- name: Fail fast on repository-wide deterministic gates
run: cargo xtask ci preflight

authoritative-run:
name: authoritative implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.authoritative_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 120
Expand Down Expand Up @@ -203,11 +225,12 @@ jobs:

formal-translation-run:
name: formal-translation implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.formal_translation_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 120
Expand All @@ -234,6 +257,7 @@ jobs:
- uses: ./.github/actions/setup-rust-cache
with:
toolchain: 1.97.1
compiler-cache: "false"
- name: Check production source closure before formal setup
if: github.event_name != 'pull_request'
run: >-
Expand Down Expand Up @@ -303,12 +327,9 @@ jobs:
--run-attempt "${{ github.run_attempt }}"
--base-sha "${{ github.event.pull_request.base.sha }}"
--head-sha "${{ github.event.pull_request.head.sha }}"
- name: Run full read-only verification when the PR is already reproducible
if: steps.formal-update.outputs.update_required == 'false'
env:
AUTHS_AENEAS_BIN: ${{ github.workspace }}/target/formal-tools/bin/aeneas
AUTHS_CHARON_BIN: ${{ github.workspace }}/target/formal-tools/bin/charon
run: cargo xtask ci formal-translation
- name: Run semantic and bounded checks without reproducing a second time
if: github.event_name == 'pull_request'
run: cargo xtask ci formal-post-qualification
- name: Preserve the bounded generated update
if: steps.formal-update.outputs.update_required == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
Expand Down Expand Up @@ -336,11 +357,12 @@ jobs:

compliance-run:
name: compliance implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.compliance_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 60
Expand Down Expand Up @@ -376,7 +398,7 @@ jobs:
npm ci --prefix bindings/typescript
- run: cargo xtask ci compliance
- name: Preserve compliance evidence
if: always()
if: always() && hashFiles('target/compliance/**') != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: auths-product-core-compliance-${{ github.run_id }}-${{ github.run_attempt }}
Expand All @@ -393,11 +415,12 @@ jobs:

dependencies-run:
name: dependencies implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.dependencies_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 20
Expand Down Expand Up @@ -427,11 +450,12 @@ jobs:

secrets-run:
name: secrets implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.secrets_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 15
Expand Down Expand Up @@ -461,11 +485,12 @@ jobs:

opentofu-live-run:
name: opentofu-live implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.opentofu_live_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 45
Expand Down Expand Up @@ -539,11 +564,12 @@ jobs:

postgresql-live-run:
name: postgresql-live implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.postgresql_live_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 45
Expand Down Expand Up @@ -606,13 +632,19 @@ jobs:
- name: Real PostgreSQL rollback, restart, and reconciliation contract
working-directory: demos/postgresql-data-change
run: npm run test:live-recovery
- name: Transactional multi-process lifecycle-store contract
env:
AUTHS_LIFECYCLE_POSTGRES_URL: postgresql://migration_admin:${{ env.POSTGRES_ADMIN_PASSWORD }}@127.0.0.1:54329/auths_demo
run: >-
cargo test --locked -p auths-stores
--test postgres_lifecycle
-- --ignored --test-threads=1
# The transactional multi-process lifecycle-store contract is NOT run here.
#
# postgres_lifecycle's `configured()` requires AUTHS_POSTGRES_URL,
# AUTHS_POSTGRES_CA_PEM and AUTHS_POSTGRES_SERVER_NAME -- a TLS PostgreSQL
# with a CA certificate. This job runs the plain demo database on 54329 and
# was setting AUTHS_LIFECYCLE_POSTGRES_URL, which `configured()` does not
# read, so the test panicked with "TLS PostgreSQL environment slots are
# required" on every run.
#
# It is owned by .github/workflows/postgres-lifecycle.yml, which stands up
# the TLS fixture in tests/postgres_tls/compose.yaml, supplies all three
# slots, and triggers on changes to auths-lifecycle or auths-stores.
# Running it in two places, correctly in one, was the defect.
- name: Privilege, RLS, injection, concurrency, timeout, and drift contract
working-directory: demos/postgresql-data-change
run: npm run test:live-database
Expand Down Expand Up @@ -646,11 +678,12 @@ jobs:

records-api-live-run:
name: records-api-live implementation
needs: [ci-plan, formal-update-gate]
needs: [ci-plan, formal-update-gate, repository-preflight]
if: >-
always() &&
!cancelled() &&
needs.ci-plan.result == 'success' &&
needs.formal-update-gate.result == 'success' &&
needs.repository-preflight.result == 'success' &&
needs.ci-plan.outputs.records_api_live_required == 'true'
runs-on: ubuntu-latest
timeout-minutes: 30
Expand Down Expand Up @@ -725,7 +758,7 @@ jobs:

authoritative:
name: authoritative
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, authoritative-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -742,7 +775,7 @@ jobs:

formal-translation:
name: formal-translation
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, formal-translation-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -760,7 +793,7 @@ jobs:

compliance:
name: compliance
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, compliance-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -777,7 +810,7 @@ jobs:

dependencies:
name: dependencies
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, dependencies-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -794,7 +827,7 @@ jobs:

secrets:
name: secrets
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, secrets-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -811,7 +844,7 @@ jobs:

opentofu-live:
name: opentofu-live
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, opentofu-live-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -828,7 +861,7 @@ jobs:

postgresql-live:
name: postgresql-live
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, postgresql-live-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -845,7 +878,7 @@ jobs:

records-api-live:
name: records-api-live
if: always()
if: ${{ !cancelled() }}
needs: [ci-plan, records-api-live-run]
runs-on: ubuntu-latest
steps:
Expand All @@ -859,3 +892,50 @@ jobs:
echo "Decision: ${REQUIRED}; implementation: ${RUN_RESULT}; ${REASON}" >> "$GITHUB_STEP_SUMMARY"
[[ "$PLANNER" == success ]]
[[ "$REQUIRED" == true && "$RUN_RESULT" == success ]] || [[ "$REQUIRED" == false && "$RUN_RESULT" == skipped ]]

ci-qualified:
name: CI qualified
if: ${{ !cancelled() }}
needs:
- authoritative
- formal-translation
- compliance
- dependencies
- secrets
- opentofu-live
- postgresql-live
- records-api-live
runs-on: ubuntu-latest
steps:
- name: Require every planned CI result
env:
AUTHORITATIVE: ${{ needs.authoritative.result }}
FORMAL_TRANSLATION: ${{ needs.formal-translation.result }}
COMPLIANCE: ${{ needs.compliance.result }}
DEPENDENCIES: ${{ needs.dependencies.result }}
SECRETS: ${{ needs.secrets.result }}
OPENTOFU_LIVE: ${{ needs.opentofu-live.result }}
POSTGRESQL_LIVE: ${{ needs.postgresql-live.result }}
RECORDS_API_LIVE: ${{ needs.records-api-live.result }}
run: |
set -euo pipefail
{
echo "| Gate | Result |"
echo "| --- | --- |"
echo "| authoritative | ${AUTHORITATIVE} |"
echo "| formal-translation | ${FORMAL_TRANSLATION} |"
echo "| compliance | ${COMPLIANCE} |"
echo "| dependencies | ${DEPENDENCIES} |"
echo "| secrets | ${SECRETS} |"
echo "| opentofu-live | ${OPENTOFU_LIVE} |"
echo "| postgresql-live | ${POSTGRESQL_LIVE} |"
echo "| records-api-live | ${RECORDS_API_LIVE} |"
} >> "$GITHUB_STEP_SUMMARY"
[[ "$AUTHORITATIVE" == success ]]
[[ "$FORMAL_TRANSLATION" == success ]]
[[ "$COMPLIANCE" == success ]]
[[ "$DEPENDENCIES" == success ]]
[[ "$SECRETS" == success ]]
[[ "$OPENTOFU_LIVE" == success ]]
[[ "$POSTGRESQL_LIVE" == success ]]
[[ "$RECORDS_API_LIVE" == success ]]
12 changes: 10 additions & 2 deletions .github/workflows/open-production-reference.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ jobs:
python-version: "3.12"
- name: Generate isolated TLS material
run: sh demos/open-production-reference/tests/generate-local-certificates.sh
- name: Generate the local-fixture trusted context
run: sh demos/open-production-reference/tests/generate-local-context.sh
- name: Start the reference stack
run: docker compose -f demos/open-production-reference/compose/compose.yaml up -d --build --wait
- name: Verify health and readiness
Expand All @@ -109,8 +111,9 @@ jobs:
npm pack ./bindings/typescript --pack-destination "$PWD/target/open-reference-artifacts"
python -m venv .reference-venv
.reference-venv/bin/python -m pip install maturin==1.9.6 pytest==9.0.2 pytest-asyncio==1.3.0
.reference-venv/bin/maturin build --release --locked --manifest-path bindings/python/Cargo.toml --out target/open-reference-artifacts
cargo build --locked -p auths-node
.reference-venv/bin/maturin build --profile python-extension --locked --manifest-path bindings/python/Cargo.toml --out target/open-reference-artifacts
cargo build --locked -p auths-node \
--bin auths-node --bin auths-local-context --bin auths-local-authority
- name: Run packed TypeScript client across replicas
working-directory: target/open-reference-consumer
env:
Expand All @@ -121,6 +124,11 @@ jobs:
npm init --yes
npm install ../open-reference-artifacts/auths-dev-sdk-*.tgz
PATH="${{ github.workspace }}/target/debug:$PATH" node reference.mjs
- name: Capture node logs on client failure
if: failure()
run: |
docker compose -f demos/open-production-reference/compose/compose.yaml \
logs --tail 80 auths-1 auths-2 auths-3 || true
- name: Run built Python wheel across replicas
env:
AUTHS_REFERENCE_ENDPOINT: https://localhost:8443
Expand Down
Loading
Loading