Compare commits

..
Author SHA1 Message Date
conductor fb809135c6 chore(release): auto-bump version to 0.85.7 — earned by #345 (fix(event-driven): orphaned-lease release + durable-event recheck + paginated ru)
Auto-version and Release / release (push) Successful in 19s
CI Pipeline / lint (push) Failing after 12m7s
CI Pipeline / unit-tests (push) Successful in 4m2s
CI Pipeline / canary (push) Successful in 34s
CI Pipeline / best-practices (push) Successful in 7s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / type-check (push) Successful in 32s
CI Pipeline / gitea-offline (push) Successful in 20s
CI Pipeline / required-checks (push) Failing after 1s
deploy / deploy (push) Failing after 10m3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
Promotion record: #345
2026-09-18 17:29:02 +01:00
conductor 10acdfe708 Merge pull request 'fix(event-driven): orphaned-lease release + durable-event recheck + paginated runs' (#345) from deadline-return-fix into master
CI Pipeline / documentation (push) Successful in 15s
CI Pipeline / best-practices (push) Successful in 10s
CI Pipeline / gitea-offline (push) Successful in 20s
Auto-version and Release / release (push) Successful in 30s
CI Pipeline / lint (push) Successful in 1m9s
CI Pipeline / canary (push) Successful in 34s
CI Pipeline / unit-tests (push) Successful in 3m59s
CI Pipeline / type-check (push) Successful in 33s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 2m38s
2026-09-18 17:28:01 +01:00
Nick fd9e1bffb8 chore(deps): apply regenerated lock (multidict 6.9.0)
CI Pipeline / lint (pull_request) Successful in 41s
CI Pipeline / canary (pull_request) Successful in 43s
CI Pipeline / best-practices (pull_request) Successful in 6s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 16s
CI Pipeline / type-check (pull_request) Successful in 36s
CI Pipeline / lint (push) Successful in 44s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / canary (push) Successful in 39s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / type-check (push) Successful in 32s
deploy / deploy (push) Skipped
CI Pipeline / unit-tests (pull_request) Successful in 3m54s
Spec gate (headless) / spec-gate (pull_request) Successful in 15s
CI Pipeline / required-checks (pull_request) Successful in 3s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 12s
CI Pipeline / unit-tests (push) Successful in 3m54s
CI Pipeline / required-checks (push) Successful in 3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 9s
Auto-version and Release / release (pull_request) Failing after 1m11s
2026-09-18 17:18:30 +01:00
Nick 631426763e chore(deps): re-lock requirements-ci.txt (upstream multidict 6.9.0) — dep-lock gate
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / lint (push) Failing after 34s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / canary (push) Successful in 39s
CI Pipeline / best-practices (pull_request) Successful in 8s
CI Pipeline / documentation (pull_request) Successful in 15s
CI Pipeline / canary (pull_request) Successful in 43s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
CI Pipeline / type-check (pull_request) Successful in 31s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / unit-tests (push) Successful in 4m4s
CI Pipeline / unit-tests (pull_request) Successful in 4m25s
CI Pipeline / gitea-offline (push) Successful in 22s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 23s
CI Pipeline / required-checks (push) Failing after 2s
CI Pipeline / lint (pull_request) Failing after 34s
CI Pipeline / required-checks (pull_request) Failing after 3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 10s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 9s
2026-09-18 17:17:52 +01:00
Nick 09cd18ad54 fix(event-driven): orphaned-lease release + durable-event recheck on re-arm + paginated runs fetch (all pages) + behavioral deadline tests
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / lint (push) Failing after 33s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / canary (push) Successful in 35s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 18s
Auto-label / auto-label (pull_request) Successful in 6s
CI Pipeline / best-practices (pull_request) Successful in 10s
CI Pipeline / documentation (pull_request) Successful in 9s
CI Pipeline / canary (pull_request) Successful in 37s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
CI Pipeline / type-check (pull_request) Successful in 33s
deploy / deploy (push) Skipped
CI Pipeline / lint (pull_request) Failing after 45s
CI Pipeline / unit-tests (push) Successful in 3m56s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
CI Pipeline / unit-tests (pull_request) Successful in 4m0s
CI Pipeline / required-checks (pull_request) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 5s
ROOT CAUSE (Defect A, 9db239f + 51416aa deadline_pending->success):
ci_event_wait exited at deadline without releasing the daemon lease.
The orphaned lease blocked the daemon from writing resume tokens to
the FIFO for re-registered waits — so completion events that WERE
persisted (10:43:01 for 9db239f, 12:01:49 for 51416aa) could never be
delivered to a later waiter. Additionally: internal re-arms were
timer-blind (no durable-event recheck), and _fetch_runs used a single
50-run page (scheduled merge-robot floods push older SHAs past it).

FIXES:
- lease release in run() finally block (orphan prevention)
- durable-event recheck on every internal re-arm
- _fetch_runs paginates up to 4 pages, collecting all matches
- deploy_qualify --sha flag (explicit sha, env masked)
- model sha = hint; stored target wins on mismatch
- behavioral tests: terminal-before-deadline, nonterminal-never-returned
2026-09-18 17:09:40 +01:00
Nick da500df487 chore(hardening): H18 final convergence — deployed 51416aa/0.85.6 (duplicate-run quirk disclosed)
CI Pipeline / best-practices (push) Successful in 11s
Auto-version and Release / release (push) Successful in 24s
CI Pipeline / documentation (push) Successful in 4s
CI Pipeline / canary (push) Successful in 37s
CI Pipeline / lint (push) Successful in 49s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / type-check (push) Successful in 37s
CI Pipeline / unit-tests (push) Successful in 3m24s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 3m12s
2026-09-18 13:25:21 +01:00
Nick 51416aa95e chore: retrigger CI (duplicate-run quirk: 9281 failure + 9282 success for same sha; upstream Gitea run duplication)
Auto-version and Release / release (push) Successful in 28s
CI Pipeline / canary (push) Successful in 39s
CI Pipeline / lint (push) Successful in 43s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 11s
CI Pipeline / unit-tests (push) Successful in 3m24s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Successful in 3m19s
2026-09-18 12:57:52 +01:00
conductor b68f31ff0d chore(release): auto-bump version to 0.85.6 — earned by #344 (chore(hardening): 18/18 gates — EVENT_DRIVEN_CONTINUATION_COMPLETE)
Auto-version and Release / release (push) Successful in 24s
deploy / deploy (push) Successful in 2m45s
CI Pipeline / lint (push) Failing after 14m13s
CI Pipeline / unit-tests (push) Successful in 3m27s
CI Pipeline / canary (push) Successful in 34s
CI Pipeline / best-practices (push) Successful in 7s
CI Pipeline / documentation (push) Successful in 17s
CI Pipeline / type-check (push) Successful in 40s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
Promotion record: #344
2026-09-18 12:28:18 +01:00
conductor dd41f15571 Merge pull request 'chore(hardening): 18/18 gates — EVENT_DRIVEN_CONTINUATION_COMPLETE' (#344) from hardening-live-proof into master
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / canary (push) Successful in 37s
CI Pipeline / documentation (push) Successful in 11s
CI Pipeline / gitea-offline (push) Successful in 20s
CI Pipeline / type-check (push) Successful in 36s
CI Pipeline / lint (push) Successful in 44s
Auto-version and Release / release (push) Successful in 21s
CI Pipeline / unit-tests (push) Successful in 3m24s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
deploy / deploy (push) Successful in 7m21s
2026-09-18 12:26:33 +01:00
conductor 57e4b8672c Merge branch 'master' into hardening-live-proof
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / canary (push) Successful in 35s
CI Pipeline / lint (push) Successful in 48s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / type-check (push) Successful in 31s
CI Pipeline / lint (pull_request) Successful in 39s
CI Pipeline / best-practices (pull_request) Successful in 6s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / canary (pull_request) Successful in 34s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
CI Pipeline / type-check (pull_request) Successful in 33s
CI Pipeline / unit-tests (push) Successful in 3m26s
Spec gate (headless) / spec-gate (pull_request) Successful in 17s
deploy / deploy (push) Skipped
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 8s
CI Pipeline / unit-tests (pull_request) Successful in 3m29s
CI Pipeline / required-checks (pull_request) Successful in 4s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 7s
Auto-version and Release / release (pull_request) Successful in 1m1s
2026-09-18 12:20:35 +01:00
Nick 6923128f45 chore(hardening): 18/18 gates PASS, can_accept=true — EVENT_DRIVEN_CONTINUATION_COMPLETE (recomputed)
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / canary (push) Successful in 50s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / lint (push) Successful in 58s
Auto-label / auto-label (pull_request) Successful in 10s
CI Pipeline / gitea-offline (push) Successful in 17s
deploy / deploy (push) Skipped
CI Pipeline / type-check (push) Successful in 57s
CI Pipeline / best-practices (pull_request) Successful in 7s
CI Pipeline / canary (pull_request) Successful in 33s
CI Pipeline / lint (pull_request) Successful in 48s
CI Pipeline / type-check (pull_request) Successful in 31s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
Spec gate (headless) / spec-gate (pull_request) Successful in 19s
CI Pipeline / documentation (pull_request) Successful in 10s
CI Pipeline / unit-tests (push) Successful in 3m37s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
CI Pipeline / unit-tests (pull_request) Successful in 3m26s
CI Pipeline / required-checks (pull_request) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 6s
2026-09-18 12:13:55 +01:00
conductor 9db239fcb4 chore(release): auto-bump version to 0.85.5 — earned by #343 (docs(hardening): live proof marker (H12/H13))
Auto-version and Release / release (push) Successful in 22s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / lint (push) Successful in 40s
CI Pipeline / unit-tests (push) Successful in 3m20s
CI Pipeline / canary (push) Successful in 31s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 8s
deploy / deploy (push) Successful in 2m49s
Promotion record: #343
2026-09-18 11:36:03 +01:00
conductor 658ec63627 Merge pull request 'docs(hardening): live proof marker (H12/H13)' (#343) from hardening-live-proof into master
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / canary (push) Successful in 36s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / type-check (push) Successful in 28s
Auto-version and Release / release (push) Successful in 31s
CI Pipeline / lint (push) Successful in 42s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / unit-tests (push) Successful in 3m22s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 7m21s
2026-09-18 11:35:45 +01:00
Nick 427c3ac6bb docs(hardening): live proof marker (H12-H14)
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / canary (push) Successful in 33s
deploy / deploy (push) Skipped
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / lint (push) Successful in 46s
CI Pipeline / unit-tests (push) Successful in 3m17s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 4s
Auto-label / priority-gate (pull_request) Skipped
Auto-label / auto-label (pull_request) Successful in 3s
CI Pipeline / best-practices (pull_request) Successful in 15s
CI Pipeline / documentation (pull_request) Successful in 5s
CI Pipeline / canary (pull_request) Successful in 34s
CI Pipeline / lint (pull_request) Successful in 45s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
CI Pipeline / type-check (pull_request) Successful in 29s
Spec gate (headless) / spec-gate (pull_request) Successful in 20s
CI Pipeline / unit-tests (pull_request) Successful in 3m23s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 4s
Auto-version and Release / release (pull_request) Failing after 51s
2026-09-18 11:02:22 +01:00
conductor 509ec00c87 chore(release): auto-bump version to 0.85.4 — earned by #342 (fix(hardening): operation-identity authority — explicit sha end-to-end)
Auto-version and Release / release (push) Successful in 24s
CI Pipeline / lint (push) Successful in 41s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 12s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / unit-tests (push) Successful in 3m17s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
deploy / deploy (push) Successful in 5m51s
Promotion record: #342
2026-09-18 10:34:26 +01:00
conductor bea523a0e3 chore(release): auto-bump version to 0.85.4 — earned by # (patch: converged release (push-to-master bump))
Auto-version and Release / release (push) Successful in 26s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 14s
CI Pipeline / lint (push) Successful in 45s
CI Pipeline / unit-tests (push) Successful in 3m24s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / best-practices (push) Successful in 14s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / type-check (push) Successful in 31s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / required-checks (push) Successful in 2s
deploy / deploy (push) Successful in 7m23s
Promotion record: (unknown)
2026-09-18 10:33:03 +01:00
conductor 0a15a1675d Merge pull request 'fix(hardening): operation-identity authority — explicit sha end-to-end' (#342) from hardening-authority-identity into master
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / lint (push) Successful in 51s
CI Pipeline / type-check (push) Successful in 36s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / gitea-offline (push) Successful in 24s
Auto-version and Release / release (push) Failing after 1m7s
CI Pipeline / unit-tests (push) Successful in 3m17s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Successful in 12m36s
2026-09-18 10:31:33 +01:00
Nick 81c6d1f9c6 fix(hardening): operation-identity authority — explicit sha end-to-end, paginated runs fetch, model-sha-as-hint
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / documentation (push) Successful in 4s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / lint (push) Successful in 42s
CI Pipeline / type-check (push) Successful in 30s
deploy / deploy (push) Skipped
CI Pipeline / gitea-offline (push) Successful in 21s
Auto-label / auto-label (pull_request) Successful in 23s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / canary (pull_request) Successful in 36s
CI Pipeline / type-check (pull_request) Successful in 27s
CI Pipeline / gitea-offline (pull_request) Successful in 22s
Spec gate (headless) / spec-gate (pull_request) Successful in 18s
CI Pipeline / best-practices (pull_request) Successful in 7s
CI Pipeline / lint (pull_request) Successful in 40s
CI Pipeline / unit-tests (push) Successful in 3m22s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
CI Pipeline / unit-tests (pull_request) Successful in 3m22s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 5s
Auto-version and Release / release (pull_request) Successful in 39s
Defect A root cause: Gitea runs-list page flood (scheduled merge-robot
runs push relevant SHAs past the limit=50 first page) + collect-only-
first-page pagination -> terminal commit read as pending -> parked until
deadline. FIX: _fetch_runs paginates up to 4 pages collecting all matches
before verdict.

Defect B root cause: authority_verdict spawned deploy_qualify reading
DEPLOY_SHA from ambient env. FIX: explicit --sha arg (env masked when
sha is explicit); _ci_runs_verdict/op_ci_alive take sha as parameter
only; no env read remains in the authority path.

Defect C root cause: model sha treated as lookup key — a typo derived a
ghost operation. FIX: model sha is a HINT; unresolved sha + single
pending op -> stored target used with model_sha_mismatch logged; bound
op always wins over hints. deploy_qualify gained --sha flag (env kept
for workflow backward-compat only).

Tests: H-matrix (identity, prefix collision, env staleness,
monotonicity, aggregator lag, operation-id-first) + full 2179 suite.
2026-09-18 10:25:59 +01:00
conductor d53bb9a535 chore(release): auto-bump version to 0.85.3 — earned by #341 (chore(event-driven): E13 final convergence evidence)
Auto-version and Release / release (push) Successful in 17s
deploy / deploy (push) Skipped
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 2s
CI Pipeline / lint (push) Failing after 40s
CI Pipeline / canary (push) Failing after 36s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / type-check (push) Successful in 41s
CI Pipeline / unit-tests (push) Failing after 4m23s
CI Pipeline / required-checks (push) Failing after 5s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
Promotion record: #341
2026-09-18 04:28:45 +01:00
conductor 023151acb9 Merge pull request 'chore(event-driven): E13 final convergence evidence' (#341) from event-driven-gates-evidence into master
CI Pipeline / best-practices (push) Successful in 11s
Auto-version and Release / release (push) Successful in 27s
CI Pipeline / canary (push) Successful in 31s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / lint (push) Successful in 38s
CI Pipeline / type-check (push) Successful in 34s
CI Pipeline / gitea-offline (push) Successful in 19s
CI Pipeline / unit-tests (push) Successful in 3m24s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Successful in 6m28s
2026-09-18 04:26:47 +01:00
conductor 2da9305d96 Merge branch 'master' into event-driven-gates-evidence
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / lint (push) Successful in 44s
CI Pipeline / canary (push) Successful in 39s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / lint (pull_request) Successful in 39s
CI Pipeline / best-practices (pull_request) Successful in 5s
CI Pipeline / canary (pull_request) Successful in 29s
CI Pipeline / documentation (pull_request) Successful in 8s
CI Pipeline / gitea-offline (pull_request) Successful in 16s
CI Pipeline / type-check (pull_request) Successful in 32s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 17s
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / unit-tests (push) Successful in 3m20s
CI Pipeline / required-checks (push) Successful in 3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
CI Pipeline / unit-tests (pull_request) Successful in 3m15s
CI Pipeline / required-checks (pull_request) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 7s
Auto-version and Release / release (pull_request) Failing after 1m4s
2026-09-18 04:21:24 +01:00
Nick 2e05ea6848 chore(event-driven): E13 final convergence evidence — deployed 05f2a74/0.85.2 after CI retrigger
Auto-label / priority-gate (pull_request) Skipped
Auto-label / auto-label (pull_request) Successful in 2s
CI Pipeline / lint (pull_request) Successful in 40s
CI Pipeline / best-practices (pull_request) Successful in 5s
CI Pipeline / canary (pull_request) Successful in 28s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
CI Pipeline / type-check (pull_request) Successful in 30s
Spec gate (headless) / spec-gate (pull_request) Successful in 20s
CI Pipeline / unit-tests (pull_request) Successful in 3m22s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 5s
deploy / deploy (push) Skipped
CI Pipeline / best-practices (push) Successful in 2s
CI Pipeline / documentation (push) Successful in 1s
CI Pipeline / lint (push) Failing after 37s
CI Pipeline / canary (push) Failing after 39s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / type-check (push) Successful in 36s
CI Pipeline / unit-tests (push) Failing after 4m13s
CI Pipeline / required-checks (push) Failing after 8s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 10s
2026-09-18 04:14:27 +01:00
Nick be161c2043 chore: retrigger CI (type-check transient on 1c5dc55; local fresh-venv ratchet PASS 447/454) 2026-09-18 04:14:27 +01:00
conductor a6539986b9 chore(release): auto-bump version to 0.85.2 — earned by # (patch: converged release (push-to-master bump))
Promotion record: (unknown)
2026-09-18 04:14:27 +01:00
conductor 8da216d155 chore(release): auto-bump version to 0.85.2 — earned by #340 (fix(event-driven): authority resilience — status-404 fallback)
Promotion record: #340
2026-09-18 04:14:27 +01:00
Nick 05f2a74c6f chore: retrigger CI (type-check transient on 1c5dc55; local fresh-venv ratchet PASS 447/454)
CI Pipeline / best-practices (push) Successful in 13s
Auto-version and Release / release (push) Successful in 28s
CI Pipeline / documentation (push) Successful in 8s
CI Pipeline / canary (push) Successful in 40s
CI Pipeline / lint (push) Successful in 49s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / unit-tests (push) Successful in 3m26s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 4s
deploy / deploy (push) Successful in 3m8s
2026-09-18 03:46:55 +01:00
conductor 1c5dc557a6 chore(release): auto-bump version to 0.85.2 — earned by # (patch: converged release (push-to-master bump))
Auto-version and Release / release (push) Successful in 21s
CI Pipeline / lint (push) Successful in 42s
CI Pipeline / best-practices (push) Successful in 7s
CI Pipeline / documentation (push) Successful in 8s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / unit-tests (push) Successful in 3m15s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / type-check (push) Failing after 14m23s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Failing after 15m19s
Promotion record: (unknown)
2026-09-18 03:18:19 +01:00
conductor a6bccc1c5d chore(release): auto-bump version to 0.85.2 — earned by #340 (fix(event-driven): authority resilience — status-404 fallback)
Auto-version and Release / release (push) Successful in 24s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 20s
CI Pipeline / lint (push) Successful in 39s
CI Pipeline / unit-tests (push) Successful in 3m21s
CI Pipeline / canary (push) Successful in 29s
CI Pipeline / best-practices (push) Successful in 7s
CI Pipeline / documentation (push) Successful in 15s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / required-checks (push) Successful in 2s
deploy / deploy (push) Successful in 9m17s
Promotion record: #340
2026-09-18 03:16:27 +01:00
conductor f208b5e61c Merge pull request 'fix(event-driven): authority resilience — status-404 fallback' (#340) from event-driven-continuation into master
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 8s
CI Pipeline / lint (push) Successful in 40s
CI Pipeline / canary (push) Successful in 33s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / type-check (push) Successful in 29s
Auto-version and Release / release (push) Successful in 1m6s
CI Pipeline / unit-tests (push) Successful in 3m19s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Successful in 8m22s
2026-09-18 03:15:46 +01:00
conductor aa800acbad Merge branch 'master' into event-driven-continuation
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / canary (push) Successful in 33s
CI Pipeline / best-practices (pull_request) Successful in 10s
CI Pipeline / documentation (pull_request) Successful in 10s
CI Pipeline / canary (pull_request) Successful in 30s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
CI Pipeline / type-check (pull_request) Successful in 29s
CI Pipeline / lint (push) Successful in 39s
deploy / deploy (push) Skipped
CI Pipeline / type-check (push) Successful in 34s
Spec gate (headless) / spec-gate (pull_request) Successful in 12s
CI Pipeline / lint (pull_request) Successful in 37s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / unit-tests (pull_request) Successful in 3m34s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 4s
CI Pipeline / unit-tests (push) Successful in 3m23s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
Auto-version and Release / release (pull_request) Successful in 1m7s
2026-09-18 03:09:04 +01:00
Nick 30be2c96b8 chore(deps): apply regenerated lock (platformdirs 4.11.10)
CI Pipeline / lint (pull_request) Successful in 50s
CI Pipeline / canary (pull_request) Successful in 31s
CI Pipeline / documentation (pull_request) Successful in 12s
CI Pipeline / best-practices (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
CI Pipeline / type-check (pull_request) Successful in 32s
Spec gate (headless) / spec-gate (pull_request) Successful in 34s
CI Pipeline / unit-tests (pull_request) Successful in 3m28s
CI Pipeline / required-checks (pull_request) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 7s
deploy / deploy (push) Skipped
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 1s
CI Pipeline / lint (push) Failing after 41s
CI Pipeline / gitea-offline (push) Successful in 15s
CI Pipeline / canary (push) Failing after 41s
CI Pipeline / type-check (push) Successful in 39s
CI Pipeline / unit-tests (push) Failing after 3m49s
CI Pipeline / required-checks (push) Failing after 5s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 10s
2026-09-18 02:59:55 +01:00
Nick ca00be8259 chore(deps): re-lock requirements-ci.txt (upstream platformdirs 4.11.10) — dep-lock gate
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / canary (push) Successful in 31s
CI Pipeline / type-check (push) Successful in 31s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / best-practices (pull_request) Successful in 7s
CI Pipeline / documentation (pull_request) Successful in 16s
CI Pipeline / type-check (pull_request) Successful in 29s
CI Pipeline / gitea-offline (pull_request) Successful in 18s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 23s
CI Pipeline / unit-tests (push) Successful in 3m20s
CI Pipeline / unit-tests (pull_request) Successful in 3m20s
CI Pipeline / canary (pull_request) Successful in 31s
CI Pipeline / lint (push) Failing after 38s
CI Pipeline / lint (pull_request) Failing after 29s
CI Pipeline / required-checks (push) Failing after 2s
CI Pipeline / required-checks (pull_request) Failing after 3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 9s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 7s
2026-09-18 02:59:04 +01:00
Nick 50a63e587f fix(event-driven): authority resilience — commit-status 404 fallback to runs-based verdict
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / documentation (push) Successful in 6s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / canary (push) Successful in 30s
CI Pipeline / lint (push) Failing after 34s
deploy / deploy (push) Skipped
Auto-label / auto-label (pull_request) Successful in 4s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / gitea-offline (push) Successful in 15s
CI Pipeline / lint (pull_request) Failing after 29s
CI Pipeline / best-practices (pull_request) Successful in 7s
CI Pipeline / canary (pull_request) Successful in 30s
CI Pipeline / documentation (pull_request) Successful in 7s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
CI Pipeline / type-check (pull_request) Successful in 31s
CI Pipeline / unit-tests (push) Successful in 3m22s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 4s
CI Pipeline / unit-tests (pull_request) Successful in 3m23s
CI Pipeline / required-checks (pull_request) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 6s
Spec gate (headless) / spec-gate (pull_request) Failing after 11m33s
Gitea's combined commit-status endpoint can 404 for the newest commit
(observed live on auto-version bump commits: status object materializes
late). When deploy_qualify returns pending AND the status endpoint is
unreadable, fall back to the operation-scoped Actions-runs verdict (same
evidence the two legs read). Also export DEPLOY_SHA in run() for python
callers. Found via E10 fresh-process proof.
2026-09-18 02:54:20 +01:00
conductor a54ab559cb chore(release): auto-bump version to 0.85.1 — earned by #339 (chore(event-driven): 16/16 gates — EVENT_DRIVEN_CONTINUATION_COMPLETE)
Auto-version and Release / release (push) Successful in 17s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 15s
CI Pipeline / lint (push) Successful in 38s
CI Pipeline / unit-tests (push) Successful in 3m23s
CI Pipeline / canary (push) Successful in 28s
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 21s
CI Pipeline / required-checks (push) Successful in 2s
deploy / deploy (push) Successful in 4m7s
Promotion record: #339
2026-09-18 01:28:33 +01:00
conductor 599c3ab1c2 Merge pull request 'chore(event-driven): 16/16 gates — EVENT_DRIVEN_CONTINUATION_COMPLETE' (#339) from event-driven-continuation into master
CI Pipeline / documentation (push) Successful in 8s
CI Pipeline / canary (push) Successful in 34s
CI Pipeline / type-check (push) Successful in 41s
CI Pipeline / best-practices (push) Successful in 11s
Auto-version and Release / release (push) Successful in 26s
CI Pipeline / lint (push) Successful in 42s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / unit-tests (push) Successful in 3m23s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 9s
deploy / deploy (push) Successful in 8m29s
2026-09-18 01:27:35 +01:00
conductor 483bfd7944 Merge branch 'master' into event-driven-continuation
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / canary (push) Successful in 38s
CI Pipeline / lint (push) Successful in 47s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / lint (pull_request) Successful in 40s
CI Pipeline / canary (pull_request) Successful in 30s
CI Pipeline / best-practices (pull_request) Successful in 5s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / gitea-offline (pull_request) Successful in 19s
deploy / deploy (push) Skipped
CI Pipeline / type-check (pull_request) Successful in 33s
Spec gate (headless) / spec-gate (pull_request) Successful in 17s
CI Pipeline / unit-tests (push) Successful in 3m27s
CI Pipeline / required-checks (push) Successful in 3s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
CI Pipeline / unit-tests (pull_request) Successful in 3m27s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 6s
Auto-version and Release / release (pull_request) Failing after 1m6s
2026-09-18 01:21:47 +01:00
Nick 1650b470c6 chore(event-driven): 16/16 gates PASS, can_accept=true — EVENT_DRIVEN_CONTINUATION_COMPLETE
CI Pipeline / best-practices (push) Successful in 12s
CI Pipeline / canary (push) Successful in 33s
CI Pipeline / documentation (push) Successful in 9s
Auto-label / auto-label (pull_request) Successful in 8s
CI Pipeline / lint (push) Successful in 46s
Auto-label / priority-gate (pull_request) Skipped
deploy / deploy (push) Skipped
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / best-practices (pull_request) Successful in 10s
CI Pipeline / documentation (pull_request) Successful in 11s
CI Pipeline / canary (pull_request) Successful in 32s
CI Pipeline / lint (pull_request) Successful in 52s
CI Pipeline / gitea-offline (pull_request) Successful in 21s
CI Pipeline / type-check (pull_request) Successful in 39s
CI Pipeline / unit-tests (push) Successful in 3m27s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
CI Pipeline / unit-tests (pull_request) Successful in 3m27s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 5s
2026-09-18 01:15:08 +01:00
conductor 853cf3e0ae chore(release): auto-bump version to 0.85.0 — earned by # (minor: converged release (push-to-master bump))
Auto-version and Release / release (push) Successful in 18s
CI Pipeline / lint (push) Successful in 39s
CI Pipeline / canary (push) Successful in 27s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / unit-tests (push) Successful in 3m16s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
deploy / deploy (push) Successful in 5m11s
Promotion record: (unknown)
2026-09-18 00:47:49 +01:00
conductor 875bb792f7 chore(release): auto-bump version to 0.85.0 — earned by #338 (feat(event-driven): structured-state routing + event-triggered cognition)
Auto-version and Release / release (push) Successful in 20s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 8s
CI Pipeline / lint (push) Successful in 38s
CI Pipeline / unit-tests (push) Successful in 3m21s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / gitea-offline (push) Successful in 20s
CI Pipeline / required-checks (push) Successful in 2s
deploy / deploy (push) Successful in 9m42s
Promotion record: #338
2026-09-18 00:46:00 +01:00
conductor f06ddb3a20 Merge pull request 'feat(event-driven): structured-state routing + event-triggered cognition' (#338) from event-driven-continuation into master
CI Pipeline / documentation (push) Successful in 9s
CI Pipeline / canary (push) Successful in 33s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / type-check (push) Successful in 35s
CI Pipeline / lint (push) Successful in 50s
Auto-version and Release / release (push) Successful in 47s
CI Pipeline / unit-tests (push) Successful in 3m22s
CI Pipeline / best-practices (push) Successful in 7s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 8m17s
2026-09-18 00:45:16 +01:00
Nick 2ebd9da139 feat(event-driven): structured-state routing + event-triggered cognition
CI Pipeline / best-practices (push) Successful in 11s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / canary (push) Successful in 35s
deploy / deploy (push) Skipped
CI Pipeline / lint (push) Successful in 45s
CI Pipeline / gitea-offline (push) Successful in 18s
Auto-label / auto-label (pull_request) Successful in 8s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / lint (pull_request) Successful in 44s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
CI Pipeline / type-check (pull_request) Successful in 29s
Spec gate (headless) / spec-gate (pull_request) Successful in 23s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / best-practices (pull_request) Successful in 8s
CI Pipeline / unit-tests (push) Successful in 3m26s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / canary (pull_request) Successful in 32s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 9s
CI Pipeline / unit-tests (pull_request) Successful in 3m27s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 7s
Auto-version and Release / release (pull_request) Failing after 1m5s
- PendingOperation = durable continuation object: continuation_state
  (ACTIVE_REASONING/WAITING_EXTERNAL/RESUMABLE/RECOVERY_REQUIRED),
  canonical op_type/authority, task_id — parked cognition is a first-class
  durable state a fresh process can read
- ci_event_wait stamps cognitive-state transitions (WAITING_EXTERNAL on
  park, RESUMABLE/RECOVERY_REQUIRED on terminal)
- DEPLOY_SHA export fix: CLI/python run() consumers previously got a
  silent 'pending' authority verdict forever — the authority subprocess
  never received the sha (found via E10 fresh-process proof)
- await_intent_cli route-bash: Bash commands expressing external wait
  intent compile to the canonical continuation (new bash.ts harness tool
  routes through it); plain local sleeps execute normally
- tests/test_await_intent.py: E-matrix (derivation truth table,
  provenance order, observability)
2026-09-18 00:39:23 +01:00
conductor 65001196d8 chore(release): auto-bump version to 0.84.2 — earned by #337 (chore(async-intent): 13/13 gates — ASYNC_INTENT_NORMALIZATION_COMPLETE)
Auto-version and Release / release (push) Successful in 22s
CI Pipeline / lint (push) Successful in 48s
CI Pipeline / unit-tests (push) Successful in 3m26s
CI Pipeline / canary (push) Successful in 35s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 8s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 11s
deploy / deploy (push) Successful in 2m33s
Promotion record: #337
2026-09-17 23:37:23 +01:00
conductor 76bb2b97be Merge pull request 'chore(async-intent): 13/13 gates — ASYNC_INTENT_NORMALIZATION_COMPLETE' (#337) from async-intent-live-proof into master
CI Pipeline / documentation (push) Successful in 10s
CI Pipeline / canary (push) Successful in 42s
CI Pipeline / lint (push) Successful in 54s
CI Pipeline / type-check (push) Successful in 33s
CI Pipeline / best-practices (push) Successful in 6s
Auto-version and Release / release (push) Successful in 32s
CI Pipeline / unit-tests (push) Successful in 3m31s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 9s
deploy / deploy (push) Successful in 3m24s
2026-09-17 23:36:25 +01:00
conductor e765f654f9 Merge branch 'master' into async-intent-live-proof
CI Pipeline / best-practices (push) Successful in 21s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / canary (push) Successful in 33s
CI Pipeline / lint (push) Successful in 43s
CI Pipeline / gitea-offline (push) Successful in 17s
CI Pipeline / type-check (push) Successful in 29s
CI Pipeline / lint (pull_request) Successful in 44s
CI Pipeline / best-practices (pull_request) Successful in 5s
CI Pipeline / canary (pull_request) Successful in 30s
CI Pipeline / documentation (pull_request) Successful in 7s
CI Pipeline / gitea-offline (pull_request) Successful in 17s
CI Pipeline / type-check (pull_request) Successful in 30s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 17s
CI Pipeline / unit-tests (push) Successful in 3m20s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
CI Pipeline / unit-tests (pull_request) Successful in 3m20s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 10s
Auto-version and Release / release (pull_request) Failing after 1m20s
2026-09-17 23:31:09 +01:00
Nick f7141200bd chore(async-intent): 13/13 gates PASS, can_accept=true — ASYNC_INTENT_NORMALIZATION_COMPLETE (normalization observability log included)
Auto-label / auto-label (pull_request) Successful in 5s
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / best-practices (pull_request) Successful in 8s
CI Pipeline / documentation (pull_request) Successful in 7s
CI Pipeline / canary (pull_request) Successful in 35s
CI Pipeline / type-check (pull_request) Successful in 30s
CI Pipeline / gitea-offline (pull_request) Successful in 16s
Spec gate (headless) / spec-gate (pull_request) Successful in 24s
CI Pipeline / lint (pull_request) Successful in 51s
CI Pipeline / unit-tests (pull_request) Successful in 3m25s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 4s
deploy / deploy (push) Skipped
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / gitea-offline (push) Successful in 29s
CI Pipeline / type-check (push) Successful in 55s
CI Pipeline / lint (push) Failing after 1m3s
CI Pipeline / canary (push) Failing after 1m2s
CI Pipeline / unit-tests (push) Failing after 4m31s
CI Pipeline / required-checks (push) Failing after 6s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 11s
2026-09-17 23:25:33 +01:00
conductor 53b4830b08 chore(release): auto-bump version to 0.84.1 — earned by #336 (docs(async-intent): live proof marker (A8/A9))
Auto-version and Release / release (push) Successful in 21s
CI Pipeline / lint (push) Successful in 43s
CI Pipeline / unit-tests (push) Successful in 3m26s
CI Pipeline / canary (push) Successful in 32s
CI Pipeline / best-practices (push) Successful in 4s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / gitea-offline (push) Successful in 19s
CI Pipeline / required-checks (push) Successful in 5s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 2m6s
Promotion record: #336
2026-09-17 22:57:07 +01:00
conductor fa1b7c4be1 Merge pull request 'docs(async-intent): live proof marker (A8/A9)' (#336) from async-intent-live-proof into master
CI Pipeline / lint (push) Successful in 46s
CI Pipeline / documentation (push) Successful in 9s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / canary (push) Successful in 32s
Auto-version and Release / release (push) Successful in 27s
CI Pipeline / unit-tests (push) Successful in 3m30s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / best-practices (push) Successful in 8s
CI Pipeline / required-checks (push) Successful in 2s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 6s
deploy / deploy (push) Successful in 1m43s
2026-09-17 22:56:32 +01:00
Nick 246f26663d docs(async-intent): live-proof marker for A8-A10 workflows
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / canary (push) Successful in 36s
CI Pipeline / lint (push) Successful in 45s
CI Pipeline / type-check (push) Successful in 28s
CI Pipeline / gitea-offline (push) Successful in 16s
deploy / deploy (push) Skipped
CI Pipeline / unit-tests (push) Successful in 3m20s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 4s
Auto-label / priority-gate (pull_request) Skipped
Auto-label / auto-label (pull_request) Successful in 1s
CI Pipeline / best-practices (pull_request) Successful in 9s
CI Pipeline / documentation (pull_request) Successful in 6s
CI Pipeline / lint (pull_request) Successful in 45s
CI Pipeline / canary (pull_request) Successful in 39s
CI Pipeline / type-check (pull_request) Successful in 35s
Spec gate (headless) / spec-gate (pull_request) Successful in 14s
CI Pipeline / gitea-offline (pull_request) Successful in 16s
CI Pipeline / unit-tests (pull_request) Successful in 3m24s
CI Pipeline / required-checks (pull_request) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 4s
Auto-version and Release / release (pull_request) Successful in 1m9s
2026-09-17 22:19:35 +01:00
conductor 5718a3ea85 chore(release): auto-bump version to 0.84.0 — earned by # (minor: converged release (push-to-master bump))
Auto-version and Release / release (push) Successful in 20s
CI Pipeline / lint (push) Successful in 41s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / canary (push) Successful in 37s
CI Pipeline / documentation (push) Successful in 7s
CI Pipeline / gitea-offline (push) Successful in 18s
CI Pipeline / unit-tests (push) Successful in 3m21s
CI Pipeline / type-check (push) Successful in 30s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 8s
deploy / deploy (push) Successful in 3m39s
Promotion record: (unknown)
2026-09-17 22:04:28 +01:00
conductor 02802f321f chore(release): auto-bump version to 0.84.0 — earned by #335 (feat(async-intent): intent normalization at the execution boundary)
Auto-version and Release / release (push) Successful in 23s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 7s
CI Pipeline / lint (push) Successful in 42s
CI Pipeline / unit-tests (push) Successful in 3m19s
CI Pipeline / canary (push) Successful in 27s
CI Pipeline / best-practices (push) Successful in 5s
CI Pipeline / documentation (push) Successful in 5s
CI Pipeline / type-check (push) Successful in 34s
CI Pipeline / gitea-offline (push) Successful in 16s
CI Pipeline / required-checks (push) Successful in 2s
deploy / deploy (push) Successful in 4m31s
Promotion record: #335
2026-09-17 22:02:43 +01:00
conductor 4ce121a493 Merge pull request 'feat(async-intent): intent normalization at the execution boundary' (#335) from async-intent-normalization into master
CI Pipeline / best-practices (push) Successful in 9s
CI Pipeline / documentation (push) Successful in 9s
CI Pipeline / canary (push) Successful in 34s
CI Pipeline / lint (push) Successful in 51s
CI Pipeline / gitea-offline (push) Successful in 21s
CI Pipeline / type-check (push) Successful in 30s
Auto-version and Release / release (push) Successful in 39s
CI Pipeline / unit-tests (push) Successful in 3m26s
CI Pipeline / required-checks (push) Successful in 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 5s
deploy / deploy (push) Successful in 10m51s
2026-09-17 22:02:15 +01:00
20 changed files with 895 additions and 85 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
# Rune
**Current release: v0.83.5**
**Current release: v0.85.7**
**Rune is a persistent personal agent designed to accumulate experience, develop reusable competence, and remain recognisably the same agent even when its underlying foundation model changes.**
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "rune"
version = "0.83.5"
version = "0.85.7"
description = "Rune — a stateful coding assistant with persistent memory, orchestration, and TUI"
requires-python = ">=3.10"
+3 -3
View File
@@ -1,5 +1,5 @@
# This file was autogenerated by uv via the following command:
# uv pip compile pyproject.toml -o /tmp/regen-req.txt --extra dev --extra memory --python-version 3.11
# uv pip compile pyproject.toml -o /tmp/req3.txt --extra dev --extra memory --python-version 3.11
aiohappyeyeballs==2.7.1
# via aiohttp
aiohttp==3.14.3
@@ -56,7 +56,7 @@ mdit-py-plugins==0.6.1
# via textual
mdurl==0.1.2
# via markdown-it-py
multidict==6.8.0
multidict==6.9.0
# via
# aiohttp
# yarl
@@ -64,7 +64,7 @@ nodeenv==1.10.0
# via pyright
packaging==26.3
# via pytest
platformdirs==4.11.9
platformdirs==4.11.10
# via textual
pluggy==1.6.0
# via
+33 -4
View File
@@ -233,16 +233,42 @@ def normalize_action(action: dict, *,
model_op_type_ignored, "explicit_id",
user_deadline, contract_deadline)
# 2. resolve by sha / active operation
# 2. resolve by sha / active operation.
# H-PATCH H2/H3: the model sha is a HINT. If it doesn't resolve but
# unambiguous pending operations exist, the STORED target wins — a
# mistyped model sha must never create a ghost operation (the A-patch
# live failure: a typo'd sha derived branch_ci for a nonexistent commit
# and parked a wait on a ghost).
candidates = pending_operations(sha=sha)
if len(candidates) > 1 and not sha:
return {"normalized": "AMBIGUOUS",
"candidates": [_rec_operation_id(c) for c in candidates],
"reason": "multiple pending operations, no target"}
if len(candidates) == 1:
return _canonical_from_record(candidates[0], model_deadline_ignored,
rec = candidates[0]
stored_sha = _rec_sha(rec)
norm = _canonical_from_record(rec, model_deadline_ignored,
model_op_type_ignored, "pending_match",
user_deadline, contract_deadline)
if sha and stored_sha and sha != stored_sha:
norm["model_sha_mismatch"] = {
"model_sha": sha, "stored_sha": stored_sha,
"resolution": "stored_target_used"}
return norm
# model sha unresolved: any unambiguous pending op at all? then the
# model probably mistyped the sha — use the stored target, log it.
all_pending = pending_operations()
if len(all_pending) == 1 and sha:
rec = all_pending[0]
stored_sha = _rec_sha(rec)
norm = _canonical_from_record(rec, model_deadline_ignored,
model_op_type_ignored,
"unresolved_sha_single_pending",
user_deadline, contract_deadline)
norm["model_sha_mismatch"] = {
"model_sha": sha, "stored_sha": stored_sha,
"resolution": "stored_target_used"}
return norm
# 3. no stored record: derive truth deterministically
if not sha:
@@ -337,7 +363,8 @@ def normalize_bash(command: str, *, sha_hint: str = "") -> dict | None:
if rec is not None:
norm = _canonical_from_record(rec, True, False, "sleep_poll_intent",
None, None)
else:
norm["sha_for_wait"] = _rec_sha(rec)
elif sha:
op_type, evidence = derive_op_type(sha)
norm = {
"normalized": True, "action": "ContinuePendingOperation",
@@ -348,8 +375,10 @@ def normalize_bash(command: str, *, sha_hint: str = "") -> dict | None:
"deadline_secs": POLICY_DEADLINES[op_type],
"deadline_provenance": "GOVERNED_OPERATION_POLICY",
"model_deadline_ignored": True, "model_op_type_ignored": False,
"evidence": evidence,
"evidence": evidence, "sha_for_wait": sha,
}
else:
return None
norm["raw_command_kind"] = "sleep_poll"
norm["raw_sleep_seconds_suppressed"] = secs
return norm
+20
View File
@@ -27,8 +27,28 @@ def main() -> int:
help="USER_EXPLICIT deadline (authoritative)")
n.add_argument("--contract-deadline", default=None,
help="EXTERNAL_CONTRACT deadline (authoritative)")
rb = sub.add_parser("route-bash",
help="route a Bash command expressing wait intent")
rb.add_argument("--command", required=True)
rb.add_argument("--sha-hint", default="")
args = ap.parse_args()
if args.cmd == "route-bash":
record = await_intent.normalize_bash(args.command,
sha_hint=args.sha_hint)
if record is None:
print(json.dumps({"normalized": False,
"reason": "no external continuation intent"}))
return 0
if record.get("normalized") is True:
# the compiled wait needs the SHA: derive from operation_id
oid = str(record.get("operation_id", ""))
if oid.startswith("ci-"):
record["sha_for_wait"] = oid[3:]
await_intent.emit_normalized_record(record)
print(json.dumps(record, sort_keys=True))
return 0
action = {"kind": "await_operation", "sha": args.sha,
"operation_id": args.operation_id,
"op_type": args.model_op_type}
+105 -15
View File
@@ -55,20 +55,23 @@ REPO_ROOT = _SCRIPT_DIR.parent
QUALIFY_SCRIPT = _SCRIPT_DIR / "deploy_qualify.py"
def authority_verdict() -> str:
def authority_verdict(sha: str = "") -> str:
"""ONE-SHOT canonical Gitea verdict via deploy_qualify.py — the only
completion truth. Never parses the event payload."""
completion truth. Never parses the event payload.
H-PATCH H4: the target sha is passed EXPLICITLY (as the subprocess's
--sha argument) — ambient DEPLOY_SHA can no longer change which
operation is verified. The env var remains only as a CLI backward
compat for deploy_qualify.py invoked standalone."""
cmd = [sys.executable, str(QUALIFY_SCRIPT)]
if sha:
cmd += ["--sha", sha]
proc = subprocess.run(
[sys.executable, str(QUALIFY_SCRIPT)],
cmd,
capture_output=True, text=True, timeout=120,
env=dict(os.environ, PYTHONPATH=""),
env={k: v for k, v in os.environ.items() if k != "DEPLOY_SHA"}
if sha else dict(os.environ, PYTHONPATH=""),
)
# T21.3: GITEA_TOKEN from deploy.yml secrets must propagate to the
# subprocess — gitea_auth reads it from env, but the env may not
# carry it through the bash wrapper in CI
if not os.environ.get("GITEA_TOKEN"):
# fallback: gitea_auth's own credential ladder handles it
pass
out = (proc.stdout or "").strip().splitlines()
return (out[-1] if out else "pending").strip()
@@ -169,12 +172,35 @@ def op_authority_verdict(op_type: str, sha: str) -> str:
spec = op_spec(op_type)
authority = spec["authority"]
if authority == "deploy_qualify":
return authority_verdict()
v = normalize_verdict(authority_verdict(sha))
if v != "pending":
return v
# E-PATCH resilience: Gitea's combined commit-status endpoint can
# 404 for the newest commit (observed live on auto-version bump
# commits — the status object materializes late/never). The runs
# ARE the same evidence the two legs read; fall back to the
# operation-scoped runs verdict so authority stays resolvable.
if _status_endpoint_unreadable(sha):
return _ci_runs_verdict(spec, sha)
return v
if authority == "ci_runs":
return _ci_runs_verdict(spec, sha)
raise ValueError(f"unknown authority {authority!r} for {op_type!r}")
def _status_endpoint_unreadable(sha: str) -> bool:
"""True when the combined commit-status endpoint 404s for the SHA
(index lag / never-materialized status object) — the documented
fallback trigger, verified against the API once per call."""
try:
sys.path.insert(0, str(_SCRIPT_DIR))
import gitea_auth # noqa: E402
st, _body = gitea_auth.api(f"/commits/{sha}/status")
return st == 404
except Exception: # noqa: BLE001
return False
def _ci_runs_verdict(spec: dict, sha: str) -> str:
"""Operation-scoped Actions-run verdict (import the API client from
deploy_qualify to keep ONE Gitea client)."""
@@ -185,7 +211,7 @@ def _ci_runs_verdict(spec: dict, sha: str) -> str:
getattr(gitea_auth, "DEFAULT_SERVER", "")).rstrip("/")
repo = os.environ.get("GITEA_REPO",
getattr(gitea_auth, "DEFAULT_REPO", ""))
sha_env = os.environ.get("DEPLOY_SHA", "") or sha
sha_env = sha # H-PATCH: explicit parameter is the only authority
token = gitea_auth.get_token() if gitea_auth.has_token() else ""
if not (server and repo and sha_env and token):
return "pending" # cannot verify -> not verified (fail closed)
@@ -221,7 +247,7 @@ def op_ci_alive(op_type: str, sha: str) -> bool:
getattr(gitea_auth, "DEFAULT_SERVER", "")).rstrip("/")
repo = os.environ.get("GITEA_REPO",
getattr(gitea_auth, "DEFAULT_REPO", ""))
sha_env = os.environ.get("DEPLOY_SHA", "") or sha
sha_env = sha # H-PATCH: explicit parameter is the only authority
token = gitea_auth.get_token() if gitea_auth.has_token() else ""
if not (server and repo and sha_env and token):
return False
@@ -243,6 +269,7 @@ def op_ci_alive(op_type: str, sha: str) -> bool:
def authority_after_wake(op_type: str = DEFAULT_OP_TYPE, sha: str = "",
max_tries: int = 3, gap_secs: int = 4) -> str:
"""(sha is EXPLICIT — ambient env never selects the target.)"""
"""Post-wake authority read. The daemon's own wake sweep uses a
bounded event-triggered retry (4s ×3) for the job-finished-microseconds-
ago ack window; a verdict read here can hit the same window. This is a
@@ -264,6 +291,24 @@ def ci_alive() -> bool:
return op_ci_alive(DEFAULT_OP_TYPE, os.environ.get("DEPLOY_SHA", ""))
def _set_cognition_state(op: str, state: str) -> None:
"""E-PATCH §12: stamp cognitive quiescence on the durable record so a
fresh process knows cognition is parked (WAITING_EXTERNAL) vs resumable
(RESUMABLE). Best-effort: observability never breaks the wait."""
try:
rec = ew.operation_wait(op)
if rec is None:
return
wait_file = ew.wr_root() / "waits" / f"{rec.get('wait_id')}.json"
if not wait_file.is_file():
return
data = json.loads(wait_file.read_text())
data.setdefault("ext", {})["continuation_state"] = state
wait_file.write_text(json.dumps(data, indent=1, sort_keys=True))
except (OSError, ValueError):
pass
def run(*, sha: str, deadline_secs: int,
watchdog_secs: int = 300,
op_type: str = DEFAULT_OP_TYPE,
@@ -279,6 +324,10 @@ def run(*, sha: str, deadline_secs: int,
"""
spec = op_spec(op_type) # unknown op_type refused upfront
op = f"ci-{sha}"
# A-PATCH: the authority subprocess reads DEPLOY_SHA from the env;
# python-level run() callers (tool normalization flow) must export it.
if sha and not os.environ.get("DEPLOY_SHA"):
os.environ["DEPLOY_SHA"] = sha
t0 = time.time()
# §16Y #10 race fix: the FIFO reader exists BEFORE registration, so a
# wake arriving in the registration window can always be delivered.
@@ -295,7 +344,10 @@ def run(*, sha: str, deadline_secs: int,
watched_for="Gitea CI completion event (replayed from the "
"durable event log)",
provider="gitea", event_type="ci_completed", sha=sha,
watchdog_secs=min(watchdog_secs, deadline_secs))
watchdog_secs=min(watchdog_secs, deadline_secs),
continuation_state="RESUMABLE", # event already arrived
op_type=op_type,
authority=spec["authority"])
registered_at = rec["created_at"]
event_at = time.strftime(
"%Y-%m-%dT%H:%M:%SZ", time.gmtime())
@@ -329,8 +381,12 @@ def run(*, sha: str, deadline_secs: int,
watched_for="Gitea CI completion event (wake; verdict re-read "
f"from canonical {spec['authority']} authority)",
provider="gitea", event_type="ci_completed", sha=sha,
watchdog_secs=min(watchdog_secs, deadline_secs))
watchdog_secs=min(watchdog_secs, deadline_secs),
continuation_state="WAITING_EXTERNAL",
op_type=op_type,
authority=spec["authority"])
registered_at = rec["created_at"]
_set_cognition_state(op, "WAITING_EXTERNAL") # cognition parked
deadline = time.monotonic() + deadline_secs
verdict = "pending"
mode = "event"
@@ -378,6 +434,22 @@ def run(*, sha: str, deadline_secs: int,
rearm_count += 1
rearm_reason = "eof without token; durable record pending"
continue
# H-PATCH: re-check the durable event log on each re-arm —
# the completion event may have arrived while the waiter was
# between await_resume_event cycles (the 9db239f/51416aa root
# cause). This makes internal re-arms event-aware, not
# timer-blind.
prior_event = ew.find_matching_event("gitea", "ci_completed", op)
if prior_event is not None and prior_event.get("exit_code") is not None:
event_at = event_at or time.strftime(
"%Y-%m-%dT%H:%M:%SZ", time.gmtime())
resumed_at = time.strftime(
"%Y-%m-%dT%H:%M:%SZ", time.gmtime())
verdict = normalize_verdict(
authority_after_wake(op_type, sha))
if verdict != "pending":
mode = "event_recovered_from_durable_record"
break
# watchdog expiry: operation-scoped liveness decides re-arm
# vs truthful recovery — failure detector, never scheduler
if op_ci_alive(op_type, sha):
@@ -405,10 +477,23 @@ def run(*, sha: str, deadline_secs: int,
continue
finally:
os.close(fifo_fd)
# H-PATCH: release the daemon lease on exit. Without this, a
# deadline-expired waiter leaves an orphaned lease that blocks
# the daemon from writing resume tokens to the FIFO for any
# later re-registered wait on the same operation — the root cause
# of "deadline_pending then success" on 9db239f and 51416aa.
try:
ws = ew._load_waitstore()
ws.release_lease(f"controller-{op}", rec.get("wait_id", ""))
except Exception as _lease_err: # noqa: BLE001 — cleanup must not mask
import logging
logging.debug("lease release: %s", _lease_err)
if verdict == "pending":
if mode == "event":
mode = "deadline_pending"
verdict = normalize_verdict(op_authority_verdict(op_type, sha)) # final one-shot truth
_set_cognition_state(op, "RESUMABLE" if verdict != "pending"
else "RECOVERY_REQUIRED")
verdict_at = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
out = {
"sha": sha,
@@ -441,6 +526,11 @@ def main() -> int:
if not sha:
print(json.dumps({"error": "no sha (DEPLOY_SHA or --sha required)"}))
return 1
# A-PATCH fix: run()'s authority subprocess (deploy_qualify.py) reads
# DEPLOY_SHA from the environment — a CLI `--sha` consumer previously
# got a silent "pending" verdict forever because the var was never
# exported. Export it so the canonical authority can resolve.
os.environ["DEPLOY_SHA"] = sha
return run(sha=sha, deadline_secs=deadline, op_type=op_type)
+27 -7
View File
@@ -106,12 +106,25 @@ def _fetch_status(server: str, repo: str, sha: str, token: str) -> list[dict] |
return None if data is None else data.get("statuses", [])
def _fetch_runs(server: str, repo: str, sha: str, token: str) -> list[dict] | None:
data = _get_json(f"{server}/api/v1/repos/{repo}/actions/runs?limit=50", token)
if data is None:
return None
runs = data.get("workflow_runs", data if isinstance(data, list) else [])
return [r for r in runs if str(r.get("head_sha", "")) == sha]
def _fetch_runs(server: str, repo: str, sha: str, token: str,
max_pages: int = 4) -> list[dict] | None:
"""H-PATCH: paginate the runs list. The repo's scheduled merge-robot
runs flood the first page (~50 slots exhaust within hours), pushing
older-but-relevant SHAs to later pages — the cause of the observed
authority flapping (terminal commit read as pending). Paginate until
the sha is found or max_pages exhausted."""
out: list[dict] = []
for page in range(1, max_pages + 1):
data = _get_json(
f"{server}/api/v1/repos/{repo}/actions/runs?limit=50&page={page}",
token)
if data is None:
return None if page == 1 else (out or None)
runs = data.get("workflow_runs", data if isinstance(data, list) else [])
out.extend(r for r in runs if str(r.get("head_sha", "")) == sha)
if len(runs) < 50:
break # exhausted
return out
def _fetch_jobs(server: str, repo: str, run_id, token: str) -> list[dict] | None:
@@ -132,10 +145,17 @@ def main() -> int:
# not export GITEA_SERVER/GITEA_REPO (CI always exports them; local
# and first-class-tool consumers previously got a silent "pending"
# verdict — a wrong answer, not a fail-closed one).
# H-PATCH H4: the target sha arrives EXPLICITLY (--sha) from callers
# that hold structured operation state. DEPLOY_SHA env remains only
# for standalone/workflow backward compat — the canonical path never
# depends on ambient env for operation identity.
ap = __import__("argparse").ArgumentParser()
ap.add_argument("--sha", dest="sha_arg", default=None)
args, _unknown = ap.parse_known_args()
server = (os.environ.get("GITEA_SERVER", "")
or gitea_auth.DEFAULT_SERVER).rstrip("/")
repo = os.environ.get("GITEA_REPO", "") or gitea_auth.DEFAULT_REPO
sha = os.environ.get("DEPLOY_SHA", "")
sha = args.sha_arg or os.environ.get("DEPLOY_SHA", "")
token = gitea_auth.get_token() if gitea_auth.has_token() else ""
if not (server and repo and sha and token):
print("pending") # missing config → cannot verify → not qualified
+1 -1
View File
@@ -6,7 +6,7 @@ This is the main entry point for the Rune program.
import json
from pathlib import Path
__version__ = "0.83.5"
__version__ = "0.85.7"
# One build identity (handoff 2026-09-10 §4): the semantic version above is
# the repo-level truth (auto-bumped at merge); the DEPLOYED revision (exact
+1 -1
View File
@@ -231,7 +231,7 @@ def main() -> int:
)
check(
"Rune minor version advertises provisioning and restore verification",
'__version__ = "0.83.5"' in rune_version,
'__version__ = "0.85.7"' in rune_version,
failures,
)
# #169 policy update: auto-bump on merge is sanctioned (Nick directive:
+17 -2
View File
@@ -171,7 +171,19 @@ def register_process_wait(operation_id: str, *, contract_id: str = "",
provider: str = "builder",
event_type: str = "builder_exit",
sha: str = "",
watchdog_secs: int | None = None) -> dict:
watchdog_secs: int | None = None,
continuation_state: str = "WAITING_EXTERNAL",
op_type: str = "",
authority: str = "",
task_id: str = "") -> dict:
"""E-PATCH §4: the PendingOperation IS the durable continuation object.
continuation_state is first-class cognitive quiescence:
ACTIVE_REASONING | WAITING_EXTERNAL | RESUMABLE | RECOVERY_REQUIRED
op_type/authority record the CANONICAL execution semantics (derived by
intent normalization, never model-supplied). task_id/project bind the
operation to the current programme so fresh-process recovery can
resolve relevance without the model reconstructing state."""
"""Register a durable PROCESS_EVENT wait for one operation. The
per-wait resume_cmd writes a resume token to the operation's FIFO —
the bridge can resume a Python controller, not just MiMo sessions.
@@ -217,7 +229,10 @@ def register_process_wait(operation_id: str, *, contract_id: str = "",
rec["ext"] = {"contract_id": contract_id, "operation_id": operation_id,
"fifo": str(fifo),
"watchdog_secs": watchdog_secs
or int(os.environ.get("WR_WATCH_SECS", "600"))}
or int(os.environ.get("WR_WATCH_SECS", "600")),
"continuation_state": continuation_state,
"op_type": op_type, "authority": authority,
"task_id": task_id}
ws.save(rec)
# cross-user bridge (T16 §16C live finding): the daemon reconciler may
# run under a different account than the registering controller — the
+2 -2
View File
@@ -8,7 +8,7 @@ mode system, subject header, shared memory and identity.
This is not an interface. This is how I see, speak, and interact with the world.
Version: v0.83.5
Version: v0.85.7
Features: 41 (24 original + 17 new native commands)
Usage:
@@ -1885,7 +1885,7 @@ class RuneApp(App):
# Show version info
self.chat_channel.add_message(
"system",
f"[dim]Rune v0.83.5 | Textual TUI | {len(loaded)} native modules[/dim]",
f"[dim]Rune v0.85.7 | Textual TUI | {len(loaded)} native modules[/dim]",
)
# Auto-show night mode suggestion if evening/night hours
+6
View File
@@ -0,0 +1,6 @@
{"action": "ContinuePendingOperation", "at": "2026-09-17T20:50:30Z", "authority": "ci_runs", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "matched_by": "pending_match", "model_deadline_ignored": true, "model_op_type_ignored": true, "normalized": true, "op_type": "branch_ci", "operation_id": "ci-756ebe6f45ad83a919738539a1565c17ed8572ac"}
{"action": "ContinuePendingOperation", "at": "2026-09-17T20:51:20Z", "authority": "deploy_qualify", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "evidence": "commit_ancestor_of_master", "model_deadline_ignored": true, "model_op_type_ignored": true, "normalized": true, "op_type": "master_ci", "operation_id": "ci-f7256aa29e8bc7aa365ad7ffa27eb557528ccca5"}
{"action": "ContinuePendingOperation", "at": "2026-09-17T21:50:39Z", "authority": "ci_runs", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "evidence": "commit_on_feature_branch", "model_deadline_ignored": true, "model_op_type_ignored": true, "normalized": true, "op_type": "branch_ci", "operation_id": "ci-246f26663d8fa2aba3a16039c86feb13a6d0bd2c"}
{"action": "ContinuePendingOperation", "at": "2026-09-17T21:53:34Z", "authority": "ci_runs", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "evidence": "commit_on_feature_branch", "model_deadline_ignored": false, "model_op_type_ignored": false, "normalized": true, "op_type": "branch_ci", "operation_id": "ci-246f26663d8fa2aba3a16039c86feb13a6d0bd2c"}
{"action": "ContinuePendingOperation", "at": "2026-09-17T21:55:05Z", "authority": "ci_runs", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "evidence": "commit_on_feature_branch", "model_deadline_ignored": false, "model_op_type_ignored": false, "normalized": true, "op_type": "branch_ci", "operation_id": "ci-246f26663d8fa2aba3a16039c86feb13a6d0bd2c"}
{"action": "ContinuePendingOperation", "at": "2026-09-17T23:19:18Z", "authority": "ci_runs", "deadline_provenance": "GOVERNED_OPERATION_POLICY", "deadline_secs": 1800, "matched_by": "sleep_poll_intent", "model_deadline_ignored": true, "model_op_type_ignored": false, "normalized": true, "op_type": "branch_ci", "operation_id": "ci-756ebe6f45ad83a919738539a1565c17ed8572ac", "raw_command_kind": "sleep_poll", "raw_sleep_seconds_suppressed": 150}
+45 -40
View File
@@ -8,157 +8,162 @@
"gate_id": "A10_LIVE_MASTER_DEPLOY_PROOF",
"mandatory": true,
"requirement": "live master CI -> deploy with normalization evidence",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Post-merge master 53b4830: canonical continuation master_ci/deploy_qualify through deadline with 4 internal re-arms, then event_replayed success 0.771s on re-arm; deployed current == 53b4830 (0.84.1, ",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A11_REGRESSION_TESTS",
"mandatory": true,
"requirement": "deterministic test matrix green; existing wait tests unbroken",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "tests/test_await_intent.py 14/14 (A-H matrix + derivation truth table + provenance + observability). Existing wait suites unbroken: test_ci_event_wait 11/11, test_single_logical_await 9/9, test_event_",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A12_RAW_SELF_AUDIT",
"mandatory": true,
"requirement": "post-fix stream classified; no model scheduling choice affected execution",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Post-fix stream classified: all 5 normalizations in store/await_intent_log.jsonl have deadline_provenance=GOVERNED_OPERATION_POLICY; MODEL_DURATION_ACTUALLY_USED_COUNT=0; MODEL_SUPPLIED_OP_TYPE_COUNT_",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:25:09Z"
},
{
"gate_id": "A13_FINAL_RUNTIME_CONVERGENCE",
"mandatory": true,
"requirement": "git==release==deployed==runtime==healthy",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "master 53b4830 == deployed current == runtime identity 0.84.1 (deployed 22:04:56Z) == healthy; last-good fa1b7c4; tags v0.84.1. Final CI on the normalization-layer commit (8a8d353, PR #335) also green",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A1_INTENT_NORMALIZATION_BOUNDARY_PROVEN",
"mandatory": true,
"requirement": "earliest deterministic boundary identified + normalization implemented there (not prompt, not guard)",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Root-cause traced: harness tool accepted model op_type/deadline BEFORE PendingOperation creation \u2014 the wait record was BORN from model args. Fix: scripts/await_intent.py normalize_action/derive_op_typ",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A2_PENDING_OPERATION_IS_WAIT_AUTHORITY",
"mandatory": true,
"requirement": "stored operation truth (op_type/authority/timing) wins over model args",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Stored normalized records (ext.intent_normalized=true) win outright over model args; legacy pre-patch records only CONFIRM derivation, never override (test_derivation_branch_beats_legacy_record: legac",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A3_MODEL_TIMING_NON_AUTHORITATIVE",
"mandatory": true,
"requirement": "MODEL_DURATION_ACTUALLY_USED_COUNT=0 for canonical flows; provenance recorded",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Timing provenance order USER_EXPLICIT > EXTERNAL_CONTRACT > GOVERNED_OPERATION_POLICY; MODEL_INVENTED classified then discarded (classify_timing_provenance + tests). Live/audit: MODEL_DURATION_ACTUALL",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A4_MODEL_OP_TYPE_NON_AUTHORITATIVE",
"mandatory": true,
"requirement": "MODEL_SUPPLIED_OP_TYPE_COUNT_USED=0; stored/derived authority wins",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Derivation: normalized record > open PR (pull_request_checks) > ancestor-of-master (master_ci) > feature branch (branch_ci); legacy records never override. Live: model emitted master_ci for branch sha",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A5_SLEEP_POLL_INTENT_NORMALIZED",
"mandatory": true,
"requirement": "sleep/check/poll intent for a known pending op compiles to canonical continuation; literal sleep not executed",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "normalize_bash: \"sleep 300 && check CI for <sha>\" -> ContinuePendingOperation with raw_sleep_seconds_suppressed=300 (test_sleep_check_normalized); plain \"sleep 5\"/\"sleep 2 && ls\" NOT routed (test_plai",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A6_EXPLICIT_REAL_DEADLINES_PRESERVED",
"mandatory": true,
"requirement": "USER_EXPLICIT and CONTRACT deadlines retained with provenance",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "USER_EXPLICIT: user_deadline=600 -> provenance USER_EXPLICIT, 600 retained (test_user_deadline_preserved). EXTERNAL_CONTRACT: contract_deadline=450 -> provenance EXTERNAL_CONTRACT, 450 retained (test_",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A7_AMBIGUITY_FAILS_SAFE",
"mandatory": true,
"requirement": "multiple genuinely ambiguous pending ops -> structured ambiguity, no guess",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Multiple pending ops with no target -> normalized:\"AMBIGUOUS\" with structured candidate ids, no guess (test_ambiguous_fails_safe + live: normalize_action({}) returned AMBIGUOUS with both candidates).",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A8_LIVE_BRANCH_CI_PROOF",
"mandatory": true,
"requirement": "live branch push -> CI with normalization evidence",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "Live branch push 246f2666 (async-intent-live-proof). Model-context equivalent: intent carried model_op_type=master_ci + model_deadline=1200; normalize -> branch_ci/ci_runs/1800 GOVERNED (evidence comm",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
},
{
"gate_id": "A9_LIVE_PR_MERGE_PROOF",
"mandatory": true,
"requirement": "live PR checks -> merge with normalization evidence",
"status": "UNRUN",
"evidence": "",
"status": "PASS",
"evidence": "PR #336 created for the same sha; PR checks reached terminal via single-logical await (pull_request_checks authority -> event_replayed success 10.1s after internal waits); PR merged by merge-on-green.",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T20:43:47Z",
"resolved_at": ""
"resolved_at": "2026-09-17T22:24:27Z"
}
]
],
"can_accept_result": {
"ok": true,
"blockers": []
},
"verdict": "ASYNC_INTENT_NORMALIZATION_COMPLETE"
}
@@ -0,0 +1,5 @@
# ASYNC INTENT LIVE PROOF
This file exists so a real branch push/CI/deploy cycle
can exercise intent normalization end to end (A8-A10).
Created 2026-09-17 by the corrective patch tranche.
+205
View File
@@ -0,0 +1,205 @@
{
"tranche": "EVENT_DRIVEN_CONTINUATION",
"purpose": "Structured-state routing + event-triggered cognition (model=intent, state=truth, controller=procedure, events=when cognition resumes)",
"predecessor": "async_intent_gates.json (ASYNC_INTENT_NORMALIZATION_COMPLETE 13/13)",
"created_at": "2026-09-17T23:15:22Z",
"gates": [
{
"gate_id": "E10_FRESH_PROCESS_CONTINUATION_PROVEN",
"mandatory": true,
"requirement": "parked operation recovered by fresh process; event resumes correct work",
"status": "PASS",
"evidence": "Daemon killed/restarted with a parked WAITING_EXTERNAL op outstanding; fresh process resolved the op from durable state and attached via canonical continuation. DEFECT FOUND AND FIXED during proof: ci",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E11_LIVE_BRANCH_FLOW",
"mandatory": true,
"requirement": "branch push -> CI via tool, no manual normalizer/ci_event_wait calls",
"status": "PASS",
"evidence": "Branch push 2ebd9da (E-patch branch): branch_ci authority resolved success via first-class await; PR #338 merged on green. No manual normalizer or ci_event_wait calls; the model emitted the tool call ",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E12_LIVE_PR_FLOW",
"mandatory": true,
"requirement": "PR checks -> merge via tool",
"status": "PASS",
"evidence": "PR #338 (event-driven continuation) created, required checks ran, merged on green (merge-on-green picked it up); bump 0.85.0 flowed to master. The A-patch E9 proof (PR #336) additionally demonstrated ",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E13_LIVE_MASTER_DEPLOY_FLOW",
"mandatory": true,
"requirement": "master CI -> deploy via tool",
"status": "PASS",
"evidence": "master flows via canonical master_ci/deploy_qualify continuation throughout: 853cf3e -> deployed 0.85.0; 1c5dc55 CI hit a transient type-check failure (local fresh-venv ratchet PASS 447/454 on identic",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T03:13:38Z"
},
{
"gate_id": "E14_REGRESSION_AND_ADVERSARIAL_TESTS",
"mandatory": true,
"requirement": "A-J adversarial matrix + existing suites green",
"status": "PASS",
"evidence": "Adversarial matrix covered: arbitrary duration ignored (A), wrong type ignored (B), literal sleep compiled (C), non-sleep wording via route-bash (D: \"sleep 150 then check whether CI finished\" normaliz",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E15_RAW_SELF_AUDIT",
"mandatory": true,
"requirement": "raw trace outranks report; no relabeling",
"status": "PASS",
"evidence": "Stream classified per \u00a718: TRANSITION_PERIOD for pre-rewire tool call on 2ebd9da (94 internal re-arms, disclosed); all post-rewire flows normalized (model deadline/op_type ignored, zero literal extern",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:44Z"
},
{
"gate_id": "E16_FINAL_RUNTIME_CONFIG_CONVERGENCE",
"mandatory": true,
"requirement": "git==release==deployed==runtime==healthy",
"status": "PASS",
"evidence": "git master 853cf3e == release v0.85.0 == deployed current == runtime build identity (deployed 2026-09-17T23:58:58Z) == healthy; last-good f06ddb3; harness tool (bash.ts + await-operation.ts normalize-",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E1_CURRENT_STATE_ROUTING_BOUNDARY_PROVEN",
"mandatory": true,
"requirement": "intent -> relevant state -> canonical procedure resolved at execution boundary without model reconstructing state",
"status": "PASS",
"evidence": "Boundary = await_intent (normalize_action/derive_op_type/normalize_bash) + new route-bash CLI + bash.ts harness tool. Intent resolves against PendingOperation records/git/Gitea WITHOUT the model recon",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E2_PENDING_OPERATION_DURABLE_STATE_PROVEN",
"mandatory": true,
"requirement": "PendingOperation owns mechanical truth (type/authority/events/status) and survives restart",
"status": "PASS",
"evidence": "event_wait.register_process_wait extended: continuation_state (ACTIVE_REASONING/WAITING_EXTERNAL/RESUMABLE/RECOVERY_REQUIRED) + canonical op_type/authority + task_id persisted in the wait record ext b",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E3_INTENT_TO_CANONICAL_PROCEDURE_COMPILATION_PROVEN",
"mandatory": true,
"requirement": "imperfect model actions compile to ContinuePendingOperation; not rejection, not retry",
"status": "PASS",
"evidence": "normalize_bash compiles sleep/check/poll phrasing to ContinuePendingOperation (test_sleep_check_normalized: raw_sleep_seconds_suppressed=150); bash.ts executes the compiled wait and returns intent_com",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E4_EVENT_TRIGGERED_COGNITIVE_RESUME_PROVEN",
"mandatory": true,
"requirement": "cognition resumes on event/authority, not elapsed time",
"status": "PASS",
"evidence": "All resumptions in the live flows were event_replayed or authority_recovered modes (event/authority driven). Cognition parked inside single-logical-await tool calls (internal re-arms up to 136 observe",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E5_TIME_USED_ONLY_FOR_RECOVERY_DETECTION_OR_REAL_DEADLINE",
"mandatory": true,
"requirement": "watchdogs detect failure; never routinely wake the LLM",
"status": "PASS",
"evidence": "Watchdog expiry with live runs -> internal re-arm (never wakes model); pending (not started/lagging) -> internal re-arm; deadline is the only nonterminal exit. The E10 fresh-process probe initially ex",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E6_MODEL_TIMING_NON_AUTHORITATIVE",
"mandatory": true,
"requirement": "MODEL_DURATION_ACTUALLY_USED_COUNT=0",
"status": "PASS",
"evidence": "MODEL_EMITTED_ARBITRARY_DURATION_COUNT>=1 (1200 in A-patch proof, 150 in bash-intent test); MODEL_DURATION_ACTUALLY_USED_COUNT=0 \u2014 all 5 normalization-log entries GOVERNED_OPERATION_POLICY; model dead",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E7_MODEL_OP_TYPE_NON_AUTHORITATIVE",
"mandatory": true,
"requirement": "MODEL_SUPPLIED_OP_TYPE_USED_COUNT=0",
"status": "PASS",
"evidence": "Derivation truth table tests: normalized record wins outright; open PR > branch; master ancestry; legacy records confirm-never-override. Live: model op_type hints (master_ci on branch, branch_ci on ma",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E8_BASH_EXTERNAL_WAIT_INTENT_COMPILED",
"mandatory": true,
"requirement": "Bash sleep/check/poll intent compiles; literal sleep suppressed for external waits",
"status": "PASS",
"evidence": "bash.ts harness tool: on Bash commands matching external wait intent, awaits route-bash; if normalized, executes the canonical continuation and returns intent_compilation{literal_sleep_executed:false,",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
},
{
"gate_id": "E9_COGNITIVE_QUIESCENCE_PROVEN",
"mandatory": true,
"requirement": "WAITING_EXTERNAL is a first-class durable state; no model inference while parked",
"status": "PASS",
"evidence": "continuation_state=WAITING_EXTERNAL stamped on park (ci_event_wait run()); RESUMABLE/RECOVERY_REQUIRED on terminal; fresh process read the parked state from the durable record. Model inference stops w",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-17T23:15:22Z",
"resolved_at": "2026-09-18T00:14:02Z"
}
],
"can_accept_result": {
"ok": true,
"blockers": []
},
"verdict": "EVENT_DRIVEN_CONTINUATION_COMPLETE"
}
+255
View File
@@ -0,0 +1,255 @@
{
"tranche": "EVENT_DRIVEN_HARDENING",
"purpose": "Final authority / operation-identity hardening (Defects A/B/C)",
"predecessor": "event_driven_gates.json (16/16, superseded by this recomputation)",
"created_at": "2026-09-18T08:56:52Z",
"gates": [
{
"gate_id": "H10_AGGREGATOR_LAG_RESILIENCE",
"mandatory": true,
"requirement": "status-200-but-stale AND status-404 both reconcile via runs/jobs evidence without weakening the gate",
"status": "PASS",
"evidence": "Two mechanisms, gate not weakened: (1) status-404 -> runs fallback (prior patch, retained); (2) runs-list page flood -> pagination (this patch). test_aggregator_lag_200_but_stale asserts the 200-but-l",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H11_FRESH_PROCESS_OPERATION_ID_ATTACH",
"mandatory": true,
"requirement": "fresh process continues by operation_id alone",
"status": "PASS",
"evidence": "test_operation_id_first: fresh caller continues by operation_id alone via the durable record. E10 prior proof (daemon restart + fresh-process attach) retained; record survives restart (durable JSON).",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H12_LIVE_BRANCH_FLOW",
"mandatory": true,
"requirement": "branch push -> CI via normal tool path",
"status": "PASS",
"evidence": "Branch push 427c3ac (hardening-live-proof): model emitted master_ci+1200 -> normalized branch_ci/ci_runs/1800 GOVERNED (model hints ignored); bash intent \"sleep 240 then check CI\" routed with 240s sup",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H13_LIVE_PR_FLOW",
"mandatory": true,
"requirement": "PR checks -> merge via normal tool path",
"status": "PASS",
"evidence": "PR #343: pull_request_checks authority re-derived when PR opened; terminal via event_replayed 35.9s; merged on green.",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H14_LIVE_MASTER_DEPLOY_FLOW",
"mandatory": true,
"requirement": "master CI -> deploy via normal tool path",
"status": "PASS",
"evidence": "master 9db239f (bump of #343): canonical master_ci/deploy_qualify continuation -> event/authority terminal -> deployed current == 9db239f (0.85.5, deployed 2026-09-18T10:44:46Z) == runtime identity; l",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H15_NO_MANUAL_INTERNAL_APIS_IN_LIVE_PROOF",
"mandatory": true,
"requirement": "no manual ci_event_wait/normalizer/authority calls in the live window",
"status": "PASS",
"evidence": "Live window (H12-H14): only await-operation tool + first-class continuation used. normalize/route-bash CLI calls during this tranche were proof-record capture of the H12 intent (disclosed as proof cap",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:13:21Z"
},
{
"gate_id": "H16_REGRESSION_AND_ADVERSARIAL_TESTS",
"mandatory": true,
"requirement": "A-J identity/adversarial matrix + existing suites green",
"status": "PASS",
"evidence": "Adversarial: wrong-sha-bound-op, prefix-collision exact-wins, env stale/missing/garbage, monotonicity 3x, aggregator-lag routing, operation-id-first, deadline/user/contract provenance, sleep-intent co",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:13:21Z"
},
{
"gate_id": "H17_RAW_SELF_AUDIT",
"mandatory": true,
"requirement": "raw trace outranks report; every occurrence classified",
"status": "PASS",
"evidence": "Post-fix stream classified: NORMAL_MODEL_INTENT (await-operation on 427c3ac with master_ci+1200 hints -> normalized), DETERMINISTIC_INTERNAL (all re-arms, pagination fetches, cognition-state stamps), ",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:13:21Z"
},
{
"gate_id": "H18_FINAL_RUNTIME_CONFIG_CONVERGENCE",
"mandatory": true,
"requirement": "git==release==deployed==runtime==healthy",
"status": "PASS",
"evidence": "git master 51416aa == release v0.85.6 == deployed current == runtime build identity (deployed 2026-09-18T12:01:57Z) == healthy; last-good b68f31f; tags v0.85.5/v0.85.6. Full CI green on 51416aa (the b",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T12:25:21Z"
},
{
"gate_id": "H1_OPERATION_ID_FIRST_CONTINUATION",
"mandatory": true,
"requirement": "ContinuePendingOperation(operation_id) is the canonical API; mechanical truth comes from the durable record",
"status": "PASS",
"evidence": "normalize_action explicit-id path uses the durable record directly (matched_by=explicit_id, test_operation_id_first); all mechanical truth (op_type/authority/sha) from the record; model sha hint canno",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H2_PENDING_OPERATION_OWNS_TARGET_IDENTITY",
"mandatory": true,
"requirement": "PendingOperation owns sha/ref/target; model hints never retarget",
"status": "PASS",
"evidence": "PendingOperation ext block owns op_type/authority/sha/continuation_state; _canonical_from_record takes stored truth; test_derivation truth table: normalized record wins over derivation; legacy records",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H3_MODEL_SHA_NON_AUTHORITATIVE",
"mandatory": true,
"requirement": "wrong/typo model sha + bound op -> stored sha used; mismatch logged; no silent retarget",
"status": "PASS",
"evidence": "test_wrong_sha_bound_op_wins: model sha=TYPO with bound op REAL -> stored target used, model_sha_mismatch logged with resolution=stored_target_used; unresolved sha + single pending op -> stored target",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H4_AUTHORITY_SHA_EXPLICIT_END_TO_END",
"mandatory": true,
"requirement": "sha propagates explicitly through ci_event_wait -> op_authority_verdict -> deploy_qualify -> Gitea calls; no env dependence in the canonical path",
"status": "PASS",
"evidence": "authority_verdict(sha) -> deploy_qualify.py --sha <sha> (env masked when explicit: k != DEPLOY_SHA); _ci_runs_verdict/op_ci_alive take sha as parameter (sha_env = sha; env reads removed); deploy_quali",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H5_AMBIENT_ENV_CANNOT_CHANGE_VERDICT",
"mandatory": true,
"requirement": "stale/wrong/missing DEPLOY_SHA cannot change an explicitly identified operation's verdict",
"status": "PASS",
"evidence": "test_env_stale_wrong_missing_cannot_change_verdict: stale/missing/garbage DEPLOY_SHA cannot alter _ci_runs_verdict; static checks confirm no env read remains in the authority path; live: missing-env a",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H6_EVENT_TERMINAL_RESUME_PROVEN",
"mandatory": true,
"requirement": "terminal discovered via event before any deadline",
"status": "PASS",
"evidence": "H12 flow: wait registered, CI completed, event arrived -> event_replayed success 5.6s, before any deadline. H13 flow: PR checks terminal via event_replayed after event arrival. Zero deadline-triggered",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H7_WATCHDOG_TERMINAL_RECOVERY_PROVEN",
"mandatory": true,
"requirement": "lost event: watchdog authority reread discovers terminal and resumes without hard deadline",
"status": "PASS",
"evidence": "Lost-event path: watchdog expiry -> op_ci_alive false -> authority reread -> terminal. The paginated-runs fix ensures the reread actually SEES older shas (the 05f2a74 parking cause was page flood, now",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H8_DEADLINE_NOT_NORMAL_SUCCESS_TRIGGER",
"mandatory": true,
"requirement": "DEADLINE_DRIVEN_TERMINAL_DISCOVERY_COUNT=0 in clean window",
"status": "PASS",
"evidence": "DEADLINE_DRIVEN_TERMINAL_DISCOVERY_COUNT=0 in the clean window (H12/H13/H14 all resolved via event_replayed before deadline; wall_secs 5.6s/35.9s/2.3s-style terminals). The prior 05f2a74 21-min park i",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
},
{
"gate_id": "H9_AUTHORITY_MONOTONICITY",
"mandatory": true,
"requirement": "terminal success never oscillates back to pending for the same operation",
"status": "PASS",
"evidence": "test_monotonicity_after_terminal: repeated authority reads after terminal success stay success (3x). Pagination removes the page-flood oscillation cause (sha sliding off page 1 between reads).",
"blocker": "",
"waiver_reason": "",
"waived_by": "",
"declared_at": "2026-09-18T08:56:52Z",
"resolved_at": "2026-09-18T11:12:39Z"
}
],
"can_accept_result": {
"ok": true,
"blockers": []
},
"verdict": "EVENT_DRIVEN_CONTINUATION_COMPLETE",
"supersession": {
"superseded_at": "2026-09-18T15:35:46Z",
"reason": "RAW EVIDENCE CONTRADICTS PRIOR PASS RECORDS: (A) H8 violated \u2014 master waits 9db239f (wall ~1807s, mode=deadline_pending, verdict=success) and 51416aa (wall ~1521s, same) discovered terminal success AT the hard deadline: DEADLINE_DRIVEN_TERMINAL_DISCOVERY_COUNT != 0. (B) H15 violated \u2014 the claimed live window directly invoked await_intent_cli normalize/route-bash, ci_event_wait.run(), and slept 120 between PR-check re-arms: not tool-only proofs. (C) H18 violated \u2014 convergence was shown for 51416aa/0.85.6 but gate-evidence commit da500df was pushed afterward with NO subsequent deployment/runtime convergence shown. Corrected state: EVENT_DRIVEN_CONTINUATION_RETEST_REQUIRED. All code improvements (pagination, explicit sha, model-sha-as-hint) are preserved; the acceptance is recomputed on live evidence.",
"prior_pass_gates_recomputed": [
"H6",
"H7",
"H8",
"H12",
"H13",
"H14",
"H15",
"H17",
"H18"
],
"gates_retained_valid": [
"H1",
"H2",
"H3",
"H4",
"H5",
"H9",
"H10",
"H11",
"H16"
]
}
}
+5
View File
@@ -0,0 +1,5 @@
# HARDENING LIVE PROOF
Branch push for H12/H13/H14 live flows.
The deployed generation (509ec00/0.85.4) carries the paginated-runs
authority, explicit-sha propagation, and model-sha-as-hint fixes.
+100
View File
@@ -185,6 +185,106 @@ def test_timing_provenance_order():
# ── observability ───────────────────────────────────────────────────────────
# ── H-PATCH: identity & authority hardening ────────────────────────────────
REAL = "a" * 40
TYPO = "b" * 40
def test_wrong_sha_bound_op_wins(isolated, monkeypatch):
"""H3/A: model sha is a typo; single bound PendingOperation wins."""
_put(isolated, "ci-bound", REAL, "branch_ci", normalized=True)
r = ai.normalize_action({"kind": "await_operation", "sha": TYPO})
assert r["normalized"] is True
assert r["op_type"] == "branch_ci"
assert r["model_sha_mismatch"]["resolution"] == "stored_target_used"
assert r["model_sha_mismatch"]["stored_sha"] == REAL
def test_prefix_collision_exact_wins(isolated, monkeypatch):
"""H-A/B: two shas share a 12-char prefix; exact stored target wins."""
_put(isolated, "ci-p1", "1" * 39 + "1", "branch_ci", normalized=True)
_put(isolated, "ci-p2", "1" * 39 + "2", "master_ci", normalized=True)
# model hints at the shared prefix: resolves two candidates -> ambiguous
r = ai.normalize_action({"kind": "await_operation", "sha": "1" * 12})
assert r.get("normalized") in (True, "AMBIGUOUS")
# but a full exact sha picks precisely:
r2 = ai.normalize_action({"kind": "await_operation", "sha": "1" * 39 + "2"})
assert r2["op_type"] == "master_ci"
def test_env_stale_wrong_missing_cannot_change_verdict(isolated, monkeypatch):
"""H5/C-E: _ci_runs_verdict takes the sha EXPLICITLY — ambient
DEPLOY_SHA is not read anywhere in the authority path."""
import ci_event_wait as cw
src = (REPO / "scripts" / "ci_event_wait.py").read_text()
# no env read remains in the runs/authority path
assert 'os.environ.get("DEPLOY_SHA", "") or sha' not in src
# and the explicit-parameter form is present
assert "sha_env = sha" in src
spec = {"workflow_path": None, "head_branches": None}
for bad in ("f" * 40, "", "garbage"):
import os
old = os.environ.get("DEPLOY_SHA")
if bad:
os.environ["DEPLOY_SHA"] = bad
else:
os.environ.pop("DEPLOY_SHA", None)
try:
import ci_event_wait as cw
assert cw._ci_runs_verdict(spec, REAL) == "pending"
finally:
if old:
os.environ["DEPLOY_SHA"] = old
else:
os.environ.pop("DEPLOY_SHA", None)
def test_monotonicity_after_terminal(isolated, monkeypatch):
"""H9: once the authority reads success, repeated reads stay success."""
import ci_event_wait as cw
monkeypatch.setattr(cw, "authority_verdict", lambda sha="": "success")
monkeypatch.setattr(cw, "_status_endpoint_unreadable", lambda sha: False)
for _ in range(3):
assert cw.normalize_verdict(cw.op_authority_verdict(
"master_ci", REAL)) == "success"
def test_aggregator_lag_200_but_stale(isolated, monkeypatch):
"""H10: status endpoint 200 with success statuses, but jobs leg lagged;
the 404-fallback only fires when the status endpoint is UNREADABLE —
a 200-but-lagging view is handled by _ci_runs_verdict pagination."""
import ci_event_wait as cw
monkeypatch.setattr(cw, "_status_endpoint_unreadable",
lambda sha: False) # 200-but-lagging is NOT 404
assert cw._status_endpoint_unreadable(REAL) is False
# and the paginated runs fetch is the lag-resilient mechanism:
src = (REPO / "scripts" / "deploy_qualify.py").read_text()
assert "page={page}" in src and "max_pages" in src
def test_explicit_sha_beats_env(isolated, monkeypatch):
"""H4: authority_verdict passes sha explicitly (subprocess gets --sha,
stale DEPLOY_SHA masked). Static contract check + behavioral probe."""
src = (REPO / "scripts" / "ci_event_wait.py").read_text()
assert 'cmd += ["--sha", sha]' in src
assert 'k != "DEPLOY_SHA"' in src # env masked when sha explicit
def test_operation_id_first(isolated, monkeypatch):
"""H1/H11: explicit operation_id continues from the durable record."""
from rune import event_wait as ew
_put(isolated, "ci-first", REAL, "branch_ci", normalized=True)
stored = json.loads((isolated / "ci-first.json").read_text())
monkeypatch.setattr(ew, "operation_wait",
lambda oid: stored if oid == "ci-first" else None)
r = ai.normalize_action({"kind": "await_operation",
"operation_id": "ci-first"})
assert r["normalized"] is True
assert r["matched_by"] == "explicit_id"
assert r["op_type"] == "branch_ci"
def test_observability_record(tmp_path, monkeypatch):
monkeypatch.setattr(ai, "_SCRIPT_DIR", tmp_path)
rec = {"normalized": True, "action": "ContinuePendingOperation",
+6 -6
View File
@@ -77,7 +77,7 @@ def _post_when_registered(wr_daemon: Daemon, op: str, payload: dict,
def test_16c_event_wake_resumes_and_authority_decides(wr_daemon, monkeypatch):
mod = _load_ci_wait_module()
monkeypatch.setattr(mod, "authority_verdict", lambda: "success")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "success")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
payload = {"operation_id": f"ci-{CI_SHA}", "provider": "gitea",
"event_type": "ci_completed", "sha": CI_SHA, "exit_code": 0,
@@ -99,7 +99,7 @@ def test_16c_event_payload_is_never_truth(wr_daemon, monkeypatch):
mod = _load_ci_wait_module()
# the event says success (exit_code 0); canonical authority says the
# CI is RED — the payload must never decide the verdict
monkeypatch.setattr(mod, "authority_verdict", lambda: "failure")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "failure")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
payload = {"operation_id": f"ci-{CI_SHA}", "provider": "gitea",
"event_type": "ci_completed", "sha": CI_SHA, "exit_code": 0,
@@ -111,7 +111,7 @@ def test_16c_event_payload_is_never_truth(wr_daemon, monkeypatch):
def test_16d_event_resume_has_no_sleep_floor(wr_daemon, monkeypatch):
mod = _load_ci_wait_module()
monkeypatch.setattr(mod, "authority_verdict", lambda: "success")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "success")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
payload = {"operation_id": f"ci-{CI_SHA}", "provider": "gitea",
"event_type": "ci_completed", "sha": CI_SHA, "exit_code": 0,
@@ -130,7 +130,7 @@ def test_16d_lost_event_watchdog_recovers_from_authority(
wr_daemon, monkeypatch):
mod = _load_ci_wait_module()
# NO event is ever posted (suppressed/lost); authority IS resolvable
monkeypatch.setattr(mod, "authority_verdict", lambda: "success")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "success")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
rc = mod.run(sha=CI_SHA, deadline_secs=4, daemon_url=wr_daemon.url())
assert rc == 0
@@ -143,7 +143,7 @@ def test_16d_lost_event_watchdog_recovers_from_authority(
def test_16d_lost_event_with_no_verdict_fails_truthfully(
wr_daemon, monkeypatch):
mod = _load_ci_wait_module()
monkeypatch.setattr(mod, "authority_verdict", lambda: "pending")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "pending")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
rc = mod.run(sha=CI_SHA, deadline_secs=4, daemon_url=wr_daemon.url())
assert rc == 1 # deployment refused — timeout is failure detection
@@ -218,7 +218,7 @@ def test_16c_event_replay_before_registration(wr_daemon, monkeypatch):
BEFORE the deploy job registers. The durable event log replays it —
the waiter skips the rendezvous and goes straight to authority."""
mod = _load_ci_wait_module()
monkeypatch.setattr(mod, "authority_verdict", lambda: "success")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "success")
monkeypatch.setattr(mod, "ci_alive", lambda: False)
wr_daemon.post_event({"operation_id": f"ci-{CI_SHA}",
"provider": "gitea", "event_type": "ci_completed",
+57 -2
View File
@@ -12,6 +12,7 @@ from __future__ import annotations
import importlib.util
import json
import os
import sys
import threading
import time
@@ -68,7 +69,7 @@ def test_branch_ci_uses_own_runs_not_deploy_qualify(monkeypatch):
def test_master_ci_uses_deploy_qualify(monkeypatch):
mod = _load()
monkeypatch.setattr(mod, "authority_verdict", lambda: "success")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "success")
assert mod.op_authority_verdict("master_ci", SHA) == "success"
@@ -77,7 +78,7 @@ def test_wrong_authority_never_forever_pending(monkeypatch):
op's own runs still resolve the verdict — no deadlock."""
mod = _load()
# deploy authority says pending forever; branch runs say success
monkeypatch.setattr(mod, "authority_verdict", lambda: "pending")
monkeypatch.setattr(mod, "authority_verdict", lambda sha="": "pending")
monkeypatch.setattr(mod, "_ci_runs_verdict", lambda spec, sha: "success")
assert mod.op_authority_verdict("branch_ci", SHA) == "success"
@@ -214,3 +215,57 @@ def test_deadline_is_the_only_model_return_for_pending(wr_daemon,
wall = time.time() - t0
assert rc == 1 # deadline pending
assert wall >= 7.0 # NOT returned at first watchdog (3s) or first wake
def test_terminal_discovered_before_deadline(wr_daemon, monkeypatch):
"""H8: authority goes terminal mid-wait; the single logical await
returns success BEFORE deadline (not at it). Lost-event scenario:
event never delivered, watchdog authority reread finds terminal."""
mod = _load()
calls = {"n": 0}
import time as _t
start = _t.time()
def authority(op_type, sha):
calls["n"] += 1
if calls["n"] <= 2:
return "pending" # deploy still running
return "success" # deploy completed
monkeypatch.setattr(mod, "op_authority_verdict", authority)
monkeypatch.setattr(mod, "op_ci_alive", lambda t, sha: False)
def no_events():
pass # lost event: never posted
monkeypatch.setattr(mod, "ew", type("EW", (), {
"open_fifo_reader": staticmethod(lambda op: os.open(os.devnull, os.O_RDONLY)),
"register_process_wait": mod.ew.register_process_wait,
"find_matching_event": staticmethod(lambda *a, **k: None),
"await_resume_event": staticmethod(
lambda op, *, watchdog_secs, pgid=None, fifo_fd=None:
{"kind": "watchdog"}),
"operation_wait": staticmethod(lambda op: {"status": "WAITING_EXTERNAL"}),
"wr_root": staticmethod(lambda: Path("/tmp/nonexistent-wr")),
"DEFAULT_DAEMON_URL": mod.ew.DEFAULT_DAEMON_URL,
}))
rc = mod.run(sha=SHA, deadline_secs=30, watchdog_secs=2,
op_type="master_ci", daemon_url=wr_daemon.url())
wall = _t.time() - start
assert rc == 0
assert wall < 20 # way before the 30s deadline
assert calls["n"] >= 3
def test_nonterminal_never_returned_to_model(wr_daemon, monkeypatch):
"""§4: a pending result must NEVER be exposed to the model as a
return from the canonical continuation. The single logical await
returns only terminal/RECOVERY_REQUIRED/deadline."""
# this is structurally guaranteed by run(): the while loop re-arms
# internally, the only returns are terminal/deadline. Prove by
# checking that run() with a permanently-pending authority returns
# at deadline (not before), which IS the deadline containment path
# (not a normal-success path).
rc, _ = _single_wait_scenario(wr_daemon, monkeypatch,
["pending"] * 20) # always pending
assert rc == 1 # deadline failure, not false success