Repository navigation
v0.3.0
The coordinated breaking contract release (#97), plus the full M4
post-landing-audit remediation (docs/m4-postmortem-audit.md,
tracked in #87) — every fix its own PR carrying the audit's named
negative-case test.
Security (P0).
- Gate-job checkout/complete bind to the identity that claimed the job
(#88) — previously anyrunnertoken could tarball any org's source and
forge signed gate evidence. repos(owner,name)unique;ownervalidated against path traversal;
repos.org_idNOT NULL and indexed (#89).POST /api/adp/tokensmints bounded tokens;adminno longer satisfies
runner(#90).- Org isolation enforced on every plane — REST, git http, GraphQL,
/api/adp— with explicit, audited org provisioning and the
org-isolation matrix test, M4 exit criterion #1 (#91).
Queue reliability (P1a).
- Claims are leases; a reaper requeues what a dead runner held, up to a
retry cap, with operations recorded at every lifecycle transition, an
oldest_running_agegauge, and an alert on the reaper itself (#92). FOR UPDATE OF gate_jobs— issue/PR numbering no longer starves the
claim path (#93).- All three org quotas enforce inside the transactions that consume them
(#94). Completion and its signed evidence are one transaction (#95). - Background writers (sweeper, reaper) take advisory locks — a second API
replica is safe (#96).
Contract (breaking).
ADP-API-Version0.2.0 → 0.3.0, with an operation-set snapshot guard so
the version can never silently not-move again.- Every 4xx carries a shared
Errorschema; validation errors are a stable
{path, message, code}projection, never raw validator internals. - Auth and per-operation scopes declared in the spec (
x-required-scope)
and asserted against the code in both directions. - Every list endpoint is bounded:
per_page/pageon the compat plane,
limit+ADP-Next-Cursorkeyset cursor on the native plane. The
gate-jobs listing no longer inlineslogs. - Org administration (quota ceilings, policy repo, kill switch) has
audited REST write paths, and org-level operations appear in the org
audit-log export. - The run/compare/verify/eval responses squad-lab consumes are typed.
- URLs keep
{owner}/{repo}: the owner string is the org's immutable URL
slug; org rename is unsupported pre-1.0 by design.
Hardening & hygiene (P2).
- Gate containers:
--cap-drop=ALL,--security-opt no-new-privileges,
--pids-limit, and a host-operator image allowlist
(RUNNER_IMAGE_ALLOWLIST) (#100). - The acceptance walkthrough runs in CI;
make runnerrequires a real
docker daemon; every self-skipping suite routes through the shared
skip-into-failure guards (#99). web/runs tests in CI, with its hand-copied server enums bound to
their sources (#98).- This release identity itself: tag, GitHub release, published image with
digest,image:in the compose file (#101).
Image: ghcr.io/deduva/adp:v0.3.0
Digest: sha256:dcec032d7b48b895a888167a682f7e183570d8b0b47830aa1094a1ce44d1b377 — pin with ADP_IMAGE=ghcr.io/deduva/adp@sha256:dcec032d7b48b895a888167a682f7e183570d8b0b47830aa1094a1ce44d1b377