Skip to content

chore: echidna first-run start point (CI restore, drift, ids, template form) - #407

Merged
hyperpolymath merged 6 commits into
mainfrom
firstrun/20261005
Oct 5, 2026
Merged

hyperpolymath merged 6 commits into
mainfrom
firstrun/20261005

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

First-run start point for echidna: CI restored, descriptor drift fixed, reproducibility pinned, ids centralised, community health and wiki source brought to the rsr-template form.

Commits

  1. fix(ci): restore Rust CI, CodeQL and lockfile-checked workflows (CI: pre-existing reds on main (Cargo Audit, governance linters, 3 startup_failures from lock drift) #401). Rust CI had been in startup_failure since 2026-07 because the local reusable workflow used tag refs under sha_pinning_required.
  2. chore(hypatia): prune .hypatia-baseline.json from 352 to 56 entries that still match (Re-arm the hypatia baseline gate: generate .hypatia-baseline.json (152 findings to grandfather + burn down) #314).
  3. feat(ids): every UUID is minted by echidna::ids. new_record_id() returns UUIDv7. content_id() returns UUIDv8: SHA-256 over the JCS bytes, per RFC 9562 B.2. temp_token() is for temp-file names. The ADR is in docs/decisions/2026-10-05-id-minting.adoc.
  4. chore: template start point. Each item is listed in the commit message.

Status of each part (§6 terms)

  • cargo fmt --check, cargo clippy --workspace --all-targets -D warnings and cargo test --workspace --locked (lib, integration and doctests) pass locally on 1.99.0. Two doctests that had never compiled are fixed.
  • gh actions-lock --no-fix is clean across 35 workflows.
  • Creusot: echidna-core-creusot, renamed from -spark, has annotations that are stated, not proved. The verify job runs on manual dispatch only.
  • UUIDv8 content_id: implemented and tested. It is not yet wired to goals, corpus or octads.
  • .github/rulesets/*.json: payloads only. They are not applied; applying them is an owner action.
  • echidna prove --output json (echidna.prove.result/1) is not in this PR.

Deferred red checks (§5c item 3)

Later commits on this PR

  • fix(ci): rust-ci.yml is now a plain workflow. The local reusable still ended in a zero-job "workflow file issue". The job names keep the canonical rust-ci / … contexts.
  • fix(ci): bump rustls to 0.23.45 for RUSTSEC-2026-0285.
  • fix(ci): Hypatia findings fixed where cheap: HTTPS doc links, fabricated action SHAs in the playground workflows replaced with real ones, bunx instead of npx, and a mktemp scratch dir instead of fixed paths. The remaining 15 pre-existing workflow-hardening findings are grandfathered under Re-arm the hypatia baseline gate: generate .hypatia-baseline.json (152 findings to grandfather + burn down) #314, as that issue prescribes.
  • CodeRabbit skipped its review because the PR touches more than 100 files. Most of them are renames (6a2/ → descriptiles/, -spark → -creusot).

Left alone

  • Root-shape conformance: about 40 non-template root entries remain. Moving them would break many paths, so that needs its own increment.
  • The STATE/META to _chora.deed migration waits for the estate-wide rename.
  • Workflows stay in plain YAML, because the KYAML conversion of workflows waits on standards#1025.

🤖 Generated with Claude Code

hyperpolymath and others added 4 commits October 5, 2026 16:09
- actions.lock: refresh with `gh actions-lock` after dependabot #405
  bumped codeql-action v4.38.2, haskell-actions/setup v2.12.1 and
  taiki-e/install-action v2.87.22 without updating the lock (#401).
  The SHA-keyed entries the tool drops in write mode are kept.
  `gh actions-lock --no-fix` is clean.
- rust-native-reusable.yml: SHA-pin the callee's actions. The repo sets
  sha_pinning_required, and GitHub does not resolve tag refs through
  actions.lock inside a local reusable workflow, so every Rust CI run
  since 2026-07 ended in startup_failure ("actions ... are not
  allowed").
- src/interfaces/rest/Cargo.toml: utoipa-swagger-ui 9.0 -> 10.0. The
  dependabot #404 lockfile bump landed without its manifest change, so
  `cargo check --locked` refused the lock.
- cargo fmt: dafny.rs line shortened by the #406 licence rewrite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
echidna#314. Of 352 baseline entries, 296 matched no finding from the
current scanner (hypatia main after #883, tokenless scan at
--severity medium, the same inputs as the governance baseline job).
They described files and rules that no longer exist, which made the
baseline read as far more accepted risk than echidna carries.

The 56 live entries are kept unchanged (notes preserved) and now carry
tracking_issue #314 so they burn down against it.

Checked with standards scripts/apply-baseline.sh (blocking mode):
old and new baselines suppress the same 68 findings and keep the same
52 (27 medium, 25 warn). All 27 high findings stay acknowledged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QFphKkDVB9pUDSCD4bkz65
… content)

All 28 former `Uuid::new_v4()` call sites now go through one module,
src/rust/ids.rs:

- new_record_id(): UUIDv7 for proof requests, sessions, attempts and runs
  (REST, gRPC, GraphQL, server, dispatch, s4 loop test).
- temp_token(): hyphen-free v7 for prover temp-file names.
- content_id(value): UUIDv8 per RFC 9562 Appendix B.2 - SHA-256 over the
  JCS (RFC 8785) bytes, first 16 bytes, version 8, variant 10. Implemented
  and tested, not yet used for goals/corpus/octads (stored identity hashes
  need their own migration).

JCS comes from the public serde_json_canonicalizer crate; the estate
ijson-jcs crate is private on GitHub, so a public build cannot use it.
uuid features: v7+v8 at the root; the interface crates drop v4.

Tests: v7 version/variant, 10k strictly monotonic ids, v8 version/variant
bits, same-JCS-content -> same id, and a hand-recomputed planted control.
ADR: docs/decisions/2026-10-05-id-minting.adoc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Descriptor drift
- META.a2ml aligned with STATE.a2ml (2.3.0; secondary deps Chapel/Bun/Guix);
  echidnabot directive no longer claims "113 prover backends".
- CODEOWNERS: src/rust/core.rs (missing) -> src/rust/lib.rs.
- .echidnabot.toml: ipkg path -> src/abi/echidnaabi.ipkg (the file that exists).
- Cargo workspace: drop dead `echidnabot` exclude (deleted 2026-04).
- settings.yml: KYAML; rebase merge off; wiki on; classic branch-protection
  block removed (rulesets are the source of truth; it named contexts no
  workflow reports).
- dependabot.yml: KYAML; npm block removed (no package.json); codeql-action
  hold; cargo security-only.
- echidna-core-spark -> echidna-core-creusot, documented as Creusot with
  annotations STATED, NOT PROVED; the Creusot job is workflow_dispatch-only
  instead of a red check on every push.
- 6a2/ -> descriptiles/ for echidna-playground and HOL-o-extension, and
  the dust/must/trust contractile write destinations (DEBT D7 resolved).
- SECURITY.md duplicate -> .github/SECURITY.md pointer; links fixed.

Reproducibility
- rust-toolchain.toml (1.99.0); mise.toml rewritten to the provisioning
  standard (latest + mise.lock; no python/deno/node/go/java; adds protoc
  for the gRPC build script); mise.lock added.
- Deno removed: deno.lock, web-project-deno.json, k9iser deno source; the
  serve-ui/gui recipes use scripts/serve-static.js under Bun (binds
  127.0.0.1, refuses path traversal).
- wolfi-base pinned by digest in Containerfile and container/Containerfile.
- Julia Project.toml: real UUID (v4, Julia ecosystem convention).
- test.txt and the invalid .gitlab-ci.yml removed.

CI and tests
- Two doctests that never compiled (isabelle.rs ROOT example, echidna-core
  TypeInfo crate path) fixed: `cargo test --workspace --locked` passes.
- gRPC ffi_wrapper: dead-code allows on FFI mirrors so clippy -D warnings
  passes.
- echidna-mcp: rmcp 3.5 ServerInfo -> ServerConfig; capnpc 0.27 to match
  capnp 0.27.
- static-analysis-gate.yml from rsr-template-repo (panic-attack assail +
  hypatia), recorded in actions.lock; `gh actions-lock --no-fix` clean.

Community health
- .github: SUPPORT.md, pull_request_template.md, ISSUE_TEMPLATE (KYAML),
  copilot-instructions.md, rulesets/ payloads (not applied); duplicate
  lowercase funding.yml (wrong account) removed.

Wiki
- docs/wiki -> docs/wikis (template path); Home gains an honest capability
  table (implemented / wired / tested / CI-gated / proved / deployed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 117 files, which is 17 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: d6162917-6c8a-43a1-91d2-e36826527bb6
📥 Commits

Reviewing files that changed from the base of the PR and between b761b3a and a9ad08e.

⛔ Files ignored due to path filters (4)
  • .github/workflows/actions.lock is excluded by !**/*.lock
  • Cargo.lock is excluded by !**/*.lock
  • deno.lock is excluded by !**/*.lock
  • mise.lock is excluded by !**/*.lock
📒 Files selected for processing (117)
  • .claude/CLAUDE.md
  • .echidnabot.toml
  • .github/CODEOWNERS
  • .github/ISSUE_TEMPLATE/bug_report.yml
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature_request.yml
  • .github/SECURITY.md
  • .github/SUPPORT.md
  • .github/canonical-references/prover-counts.yml
  • .github/copilot-instructions.md
  • .github/copilot/coding-agent.yml
  • .github/dependabot.yml
  • .github/funding.yml
  • .github/pull_request_template.md
  • .github/rulesets/Immutable-Tags.json
  • .github/rulesets/README.adoc
  • .github/rulesets/base.json
  • .github/rulesets/branch-floor.json
  • .github/rulesets/require-linear-history.json
  • .github/rulesets/require-signed-commits.json
  • .github/settings.yml
  • .github/workflows/formal-verification.yml
  • .github/workflows/rust-ci.yml
  • .github/workflows/rust-native-reusable.yml
  • .github/workflows/static-analysis-gate.yml
  • .gitlab-ci.yml
  • .hypatia-baseline.json
  • .machine_readable/bot_directives/echidnabot.a2ml
  • .machine_readable/contractiles/dust/dust.k9.ncl
  • .machine_readable/contractiles/must/must.k9.ncl
  • .machine_readable/contractiles/trust/trust.k9.ncl
  • .machine_readable/descriptiles/META.a2ml
  • .trusted-base-ignore
  • AUTHORS.adoc
  • CLAUDE.md
  • Cargo.toml
  • Containerfile
  • HOL-o-extension/.machine_readable/descriptiles/ECOSYSTEM.a2ml
  • HOL-o-extension/.machine_readable/descriptiles/META.a2ml
  • HOL-o-extension/.machine_readable/descriptiles/STATE.a2ml
  • Justfile
  • MAINTAINERS.adoc
  • NOTICE
  • Project.toml
  • README.adoc
  • RSR_COMPLIANCE.adoc
  • SECURITY.adoc
  • container/Containerfile
  • crates/echidna-core-creusot/CREUSOT-SETUP.adoc
  • crates/echidna-core-creusot/Cargo.toml
  • crates/echidna-core-creusot/rust-toolchain.toml
  • crates/echidna-core-creusot/src/axiom_tracker.rs
  • crates/echidna-core-creusot/src/lib.rs
  • crates/echidna-core-creusot/src/pareto.rs
  • crates/echidna-core/src/types.rs
  • crates/echidna-mcp/src/main.rs
  • crates/echidna-wire/Cargo.toml
  • docs/CORPUS-ADAPTERS.adoc
  • docs/DEBT.adoc
  • docs/MIZAR_QUICK_START.adoc
  • docs/ROADMAP.adoc
  • docs/STALE-REFERENCE-TOMBSTONES.adoc
  • docs/SUPPORTED_PROVERS.adoc
  • docs/decisions/2026-10-05-id-minting.adoc
  • docs/wikis/Architecture.md
  • docs/wikis/FAQ.md
  • docs/wikis/Getting-Started.md
  • docs/wikis/Guides.md
  • docs/wikis/Home.md
  • docs/wikis/README.md
  • docs/wikis/Troubleshooting.md
  • echidna-playground/.github/workflows/codeql.yml
  • echidna-playground/.github/workflows/secret-scanner.yml
  • echidna-playground/.github/workflows/security-checks.yml
  • echidna-playground/.machine_readable/descriptiles/AGENTIC.a2ml
  • echidna-playground/.machine_readable/descriptiles/ECOSYSTEM.a2ml
  • echidna-playground/.machine_readable/descriptiles/META.a2ml
  • echidna-playground/.machine_readable/descriptiles/NEUROSYM.a2ml
  • echidna-playground/.machine_readable/descriptiles/PLAYBOOK.a2ml
  • echidna-playground/.machine_readable/descriptiles/STATE.a2ml
  • echidna-playground/examples/web-project-deno.json
  • examples/web-project-deno.json
  • k9iser.toml
  • mise.toml
  • proofs/acl2/README.adoc
  • proofs/pvs/README.adoc
  • rust-toolchain.toml
  • scripts/install-proof-toolchains.sh
  • scripts/serve-static.js
  • src/interfaces/graphql/Cargo.toml
  • src/interfaces/graphql/resolvers.rs
  • src/interfaces/grpc/Cargo.toml
  • src/interfaces/grpc/ffi_wrapper.rs
  • src/interfaces/grpc/main.rs
  • src/interfaces/rest/Cargo.toml
  • src/interfaces/rest/handlers.rs
  • src/rust/dispatch.rs
  • src/rust/ids.rs
  • src/rust/integration.rs
  • src/rust/lib.rs
  • src/rust/provers/acl2.rs
  • src/rust/provers/agda.rs
  • src/rust/provers/altergo.rs
  • src/rust/provers/coq.rs
  • src/rust/provers/cvc5.rs
  • src/rust/provers/dafny.rs
  • src/rust/provers/hol_light.rs
  • src/rust/provers/idris2.rs
  • src/rust/provers/isabelle.rs
  • src/rust/provers/lean.rs
  • src/rust/provers/mizar.rs
  • src/rust/provers/spass.rs
  • src/rust/server.rs
  • src/rust/verification/mod.rs
  • src/rust/verification/result_arbiter.rs
  • test.txt
  • tests/s4_loop_closure.rs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread .github/copilot-instructions.md Fixed
Comment thread .github/pull_request_template.md Fixed
Comment thread .github/workflows/static-analysis-gate.yml Fixed
Comment thread .github/workflows/static-analysis-gate.yml Fixed
- rust-ci.yml: inline the former local reusable rust-native-reusable.yml.
  Calling it still ended in a zero-job "workflow file issue" on PR #407
  (with SHA refs, actionlint clean, actions-lock clean) while plain
  workflows started normally. Job names keep the canonical
  `rust-ci / ...` contexts. actions.lock refreshed with gh actions-lock.
- Cargo.lock: rustls 0.23.40 -> 0.23.45 (RUSTSEC-2026-0285, Cargo audit red).
- Hypatia findings: HTTPS for prover links in docs (dead mizar 8.1.14 and
  ACL2/PVS tutorial links repointed); fabricated codeql-action/trufflehog
  SHAs in echidna-playground workflows replaced with real ones; Copilot
  agent uses bunx, not npx; template references to src/interface/ point at
  echidna's src/abi/ and ffi/zig/; static-analysis-gate annotation steps no
  longer swallow failures with `|| true`.
- .hypatia-baseline.json: the 15 remaining pre-existing workflow-hardening
  findings (harden-runner, container tag pins, secrets: inherit, two
  masked-exit steps) and the tombstone doc grandfathered under #314, as
  that issue prescribes, so the gate fails only on new findings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment thread .github/copilot/coding-agent.yml Fixed
…wording)

- scripts/install-proof-toolchains.sh: downloads and the Idris2 source tree
  go to a mktemp -d dir removed on exit, not fixed paths under /tmp
  (CWE-377, hypatia hardcoded_tmp).
- copilot-instructions.md / coding-agent.yml: wording no longer trips the
  SD022 and npx patterns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hyperpolymath
hyperpolymath merged commit b97a799 into main Oct 5, 2026
76 of 78 checks passed
@hyperpolymath
hyperpolymath deleted the firstrun/20261005 branch October 5, 2026 17:42
hyperpolymath added a commit that referenced this pull request Oct 5, 2026
… CI (#409)

Follow-up to #407 (merged as b97a799), so this PR is based on `main`,
not stacked.

## What this does

**1. `echidna prove --output json`** implements the shared
`echidna.prove.result/1` contract.
- stdout carries exactly one JCS-canonical (RFC 8785) I-JSON object;
logs go to stderr.
- `status` comes from `ProverOutcome::prove_status`: `Proved` →
`verified`, `NoProofFound` → `failed`, `Timeout` → `timeout`,
`InconsistentPremises` → `unknown`, and input, prover or system failures
→ `error`. Failures before the check (no backend, unreadable file, parse
error) are also `error` objects.
- Exit code is 0 iff `verified`.
- `trust.confidence` is `null` unless a receipt backs it. This is the
epistemic-types receipt/warrant pattern, used as a pattern only, not as
a dependency. This path checks no certificate, so the value is always
`null`. `trust.axioms` comes from ECHIDNA's axiom tracker.
- Human output is still the default and unchanged.
- Docs: `docs/PROVE-RESULT-CONTRACT.adoc`.

**2. `echidna-core` 0.2.0 can now be used by clients** such as
echidnabot and proof-burrower.
- `ProverKind` moved into the crate. `echidna::ProverKind` and
`echidna::provers::ProverKind` re-export it, so no ECHIDNA source
changed.
- Adds `prove_result` (the contract type, a JCS serialiser and a strict
parser).
- Adds `trust`, a re-export of the `echidna-core-creusot` trust kernel
that echidnabot already pins.
- The git-dependency recipe and the stability policy are in
`crates/echidna-core/README.adoc`.

**3. Zig FFI and the unified-api-adapter check.**
- `ffi/zig` did not compile on any Zig release (0.14.1, 0.15.2 and
0.16.0 all failed) and no workflow built it.
- It now compiles in pure Zig (opaque `Handle`, page allocator, no
libc).
- The new `zig-ffi-ci.yml` runs `zig fmt --check`, `zig build test` (45
tests) and the `hyperpolymath/cicd-suite` purity check.
- The only `std.io` use, in `tentacles.zig`, is gone, and `poll_events`
gained tests.
- Scope: "check passing" means the purity grep passes. No Zig adapter
library exists to adopt.

**4. CI fixes.**
- `chapel-ci.yml` builds Zig with `-Dcpu=baseline`. The artifact runs on
a different runner, and that caused the SIGILL in "Rust Build with
Chapel Feature" on main.
- `rust-ci.yml` check, clippy and test now pass `--workspace`. Before,
only the root package was tested, so the `echidna-core` and trust-kernel
tests never ran.

**5. Idris2 ABI.**
- Added `%default total` to `EchidnaABI.Gnn` and
`EchidnaABI.TacticRecord`; the package still type-checks.
- Planted-positive control: a non-terminating function is rejected.
- `CapnSchemas.idr` and `NeSyAssistTesting.idr` are not in the ipkg, so
CI does not check them. This is recorded in the wiki table.

**6. Creusot: precisely why it is not in CI.**
- `cargo check -p echidna-core-creusot --features creusot` fails with 34
errors, because `creusot-contracts` is not a dependency.
- The nightly pin is stale, and the documented install path is wrong for
current Creusot.
- `CREUSOT-SETUP.adoc` no longer claims the job is a hard gate or that
milestones 8c-M1..M3 are done. The annotations remain **stated, not
proved**.

## Verification (local, rustc 1.99.0)
- `cargo fmt --all -- --check` passes.
- `cargo clippy --locked --workspace --all-targets -- -D warnings`
passes.
- `cargo test --locked --workspace --all-targets` passes.
- `zig build test` passes: 45/45 on Zig 0.15.2.
- `idris2 --build src/abi/echidnaabi.ipkg` passes on Idris2 0.7.0.
- `gh actions-lock --no-fix` is clean over 35 workflows.

## Not in this PR
- absolute-zero as a cross-prover test corpus (ADOPT-NOW in the types
fit map). It needs prover binaries in the live matrix and a pinned
corpus manifest, which is out of this increment.
- UUID minting is unchanged. It is already centralised in
`src/rust/ids.rs`, and this PR mints no IDs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants