Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) #2449
Closed
opened 2026-10-02 23:00:08 +01:00 by conductor
·
28 comments
No Branch/Tag Specified
master
fix/shared-ci-unblock
fix/ci-concurrency-per-ref
fix/2552-handler-triage
feat/2618-context
fix/2604-scaffolding-surgical
feat/2618-provider-stack
feat/final-integration
feat/2618-safety-parity
feat/2609-integration-w6
feat/2618-audit-forge
feat/2618-background-memory
feat/2618-operator-residual
feat/2618-warm-recall
feat/2617-research-r3
feat/2606-spine-w4
feat/2617-research-r2
fix/2607-spine-dichotomy
feat/2609-go-interception-w3
feat/2618-memory-store
feat/2617-research-r1
feat/2609-go-interception-w2
fix/data-safety-audits
fix/integration-audits
fix/sqlite-floor-audits
feat/2617-research-r0
feat/2609-model-replay
fix/tool-boundary-audits
feat/2609-go-interception-w1
fix/2582-release-final
fix/2613-self-hosting-gate
removal-prep/dead-superseded-pile
removal-prep/auto-context
removal-prep/reconcile-tools
removal-prep/openai-compat-transport
removal-prep/message-queue
removal-prep/forge-client
removal-prep/cache
removal-prep/paths
fix/2532-text-selection
throwaway-force-merge-test
fix/2582-namespace-cli-flag
feat/2582-release-reporting
fix/2535-pane-scrollback
dichotomy-gap-f0
gap-transport
gap-construction-commands
wave-ca-ms
tmp-detach
gap-ltr
backup-rune-as
wave-ax
feat/wave6-rust-backend
feat/wave4-consolidation-kernel
ci/build-cognition-core-unit
ci/register-w34-canaries
feat/wire-programme-continuation
feat/wire-construction-commands-dispatch
feat/wire-stage-guards-transition
feat/tui-pane-swap-chat-left
fix/operator-probe-tools-2468
r2-wave2-memory-retrieval
r2-wave2-memory-storage
phase-g-strangler-evidence-provenance
phase-g-strangler-retrieval-index
tranche-r1-wave-0
m10-derive-refresh
t22-scaffolding-default-path
research-depth-gate
fix-407-autolabel
fix-tui-banner-surface
r13-m9-pr-proof
gitea-internal-endpoint
auto-label-epic-kinds
issue-templates-heading
issue-templates
event-driven-clean
deadline-return-fix
hardening-live-proof
hardening-authority-identity
event-driven-final-metrics
event-driven-gates-evidence
event-driven-continuation
async-intent-live-proof
async-intent-normalization
memory-t0-external-report
memory-t0-asis-map
t21.5-pending-class-fix
t21.5-gate-evidence
t21.5-root-cause-continuation
t21.4-gate-evidence
t21.4-qualify-defaults-fix
t21.4-final-v1-proof
prototype/openai-compat-transport
wr-experiment
adapt2-route-authority
pl0-experience-ledger
d5-authority-audit
task-d-stage-contracts
b3v2-fresh
d5-tightening
d4d5-artifact-contract
correction-1-d2d3
adapt9-artifact-authority
prov1-source-ledger
infra1-accept
infra1-probe5
infra1-probe4
infra1-probe3
infra1-probe2
infra1-probe
obs1-telemetry
rp13-metrics
rp12-rerun-163
rp11-retirement
issue161-harness-v2
issue161-harness
rp2-canonical-stage-model
sweep-live
umbrella-rewire
trigger-bump-2
release-token-fix
trigger-bump
version-reconcile
umbrella-pipeline
pinned-live
research-structuralization
merge-robot-checkout
p1-03-memory-selection
coverage-ratchet
failure-auto-filing
release-safety-net
ci-dependency-lock
bugfix-contract
merge-robot-fix
adversarial-gates
merge-robot
runner-desktop-gate
research-gate-evidence
backup/pinned-20260908-035000
release-tui-footer
v0.361.0
v0.359.0
v0.358.3
v0.358.2
v0.358.1
v0.358.0
v0.357.0
v0.356.0
v0.355.0
v0.354.0
v0.353.0
v0.352.0
v0.351.0
v0.350.0
v0.349.0
v0.348.0
v0.347.0
tui-v0.346.0
v0.346.0
tui-v0.345.0
v0.345.0
tui-v0.344.0
v0.344.0
tui-v0.343.0
v0.343.0
tui-v0.342.0
v0.342.0
tui-v0.341.0
v0.341.0
tui-v0.340.0
v0.340.0
tui-v0.339.0
v0.339.0
tui-v0.338.0
v0.338.0
tui-v0.337.0
v0.337.0
tui-v0.336.0
v0.336.0
tui-v0.335.0
v0.335.0
tui-v0.334.0
v0.334.0
tui-v0.333.1
v0.333.1
tui-v0.333.0
v0.333.0
tui-v0.332.0
v0.332.0
tui-v0.331.1
v0.331.1
tui-v0.331.0
v0.331.0
tui-v0.330.0
v0.330.0
tui-v0.329.0
v0.329.0
tui-v0.328.0
v0.328.0
tui-v0.327.0
v0.327.0
tui-v0.326.0
v0.326.0
tui-v0.325.1
v0.325.1
tui-v0.325.0
v0.325.0
tui-v0.324.0
v0.324.0
tui-v0.323.0
v0.323.0
tui-v0.322.0
v0.322.0
tui-v0.321.0
v0.321.0
tui-v0.320.0
v0.320.0
tui-v0.319.2
v0.319.2
tui-v0.319.1
v0.319.1
tui-v0.319.0
v0.319.0
tui-v0.318.0
v0.318.0
tui-v0.317.0
v0.317.0
tui-v0.316.0
v0.316.0
v0.315.0
tui-v0.315.0
tui-v0.314.0
v0.314.0
tui-v0.313.0
v0.313.0
tui-v0.312.0
v0.312.0
tui-v0.311.0
v0.311.0
tui-v0.310.0
v0.310.0
tui-v0.309.0
v0.309.0
tui-v0.1.0
v0.308.0
v0.307.0
v0.306.0
v0.305.0
v0.304.0
v0.303.0
v0.302.0
v0.301.0
v0.300.0
v0.299.1
v0.299.0
v0.298.0
v0.297.0
v0.296.0
v0.295.0
v0.294.0
v0.293.2
v0.293.1
v0.293.0
v0.292.0
v0.291.0
v0.290.2
v0.290.1
v0.290.0
v0.289.0
v0.288.1
v0.288.0
v0.287.0
v0.286.0
v0.285.0
v0.284.1
v0.284.0
v0.283.0
v0.282.0
v0.281.0
v0.280.0
v0.279.2
v0.279.1
v0.279.0
v0.278.1
v0.278.0
v0.277.1
v0.277.0
v0.276.0
v0.275.0
v0.274.2
v0.274.1
v0.274.0
v0.273.0
v0.272.0
v0.271.0
v0.270.0
v0.269.1
v0.269.0
v0.268.0
v0.267.0
v0.266.0
v0.265.1
v0.265.0
v0.264.0
v0.263.0
v0.262.0
v0.261.0
v0.260.0
v0.259.0
v0.258.1
v0.258.0
v0.257.0
v0.256.0
v0.255.0
v0.254.0
v0.253.0
v0.252.0
v0.251.0
v0.250.0
v0.249.0
v0.248.0
v0.247.1
v0.247.0
v0.246.0
v0.245.0
v0.244.0
v0.243.1
v0.243.0
v0.242.0
v0.241.0
v0.240.0
v0.239.0
v0.238.0
v0.237.0
v0.236.0
v0.235.0
v0.234.0
v0.233.0
v0.232.0
v0.231.0
v0.230.0
v0.229.0
v0.228.0
v0.227.0
v0.226.0
v0.225.0
v0.224.0
v0.223.0
v0.222.0
v0.221.0
v0.220.0
v0.219.0
v0.218.0
v0.217.0
v0.216.0
v0.215.0
v0.214.0
v0.213.0
v0.212.0
v0.211.0
v0.210.0
v0.209.0
v0.208.0
v0.207.0
v0.206.0
v0.205.0
v0.204.0
v0.203.0
v0.202.0
v0.201.0
v0.200.0
v0.199.0
v0.198.0
v0.197.0
v0.196.0
v0.195.0
v0.194.0
v0.193.0
v0.192.0
v0.191.0
v0.190.0
v0.189.1
v0.189.0
v0.188.0
v0.187.0
v0.186.0
v0.185.0
v0.184.0
v0.183.0
v0.182.0
v0.181.0
v0.180.0
v0.179.0
v0.178.0
v0.177.0
v0.176.0
v0.175.0
v0.174.0
v0.173.0
v0.172.0
v0.171.0
v0.170.0
v0.169.0
v0.168.0
v0.167.0
v0.166.0
v0.165.0
v0.164.1
v0.164.0
v0.163.0
v0.162.1
v0.162.0
v0.161.0
v0.160.0
v0.159.0
v0.158.1
v0.158.0
v0.157.1
v0.157.0
v0.156.4
v0.156.3
v0.156.2
v0.156.1
v0.156.0
v0.155.2
v0.155.1
v0.155.0
v0.154.0
v0.153.0
v0.152.0
v0.151.0
v0.150.0
v0.149.0
v0.148.0
v0.147.0
v0.146.0
v0.145.0
v0.144.0
v0.143.0
v0.142.0
v0.141.0
v0.140.0
v0.139.0
v0.138.0
v0.137.1
v0.137.0
v0.136.5
v0.136.4
v0.136.3
v0.136.2
v0.136.1
v0.136.0
v0.135.0
v0.134.0
v0.133.0
v0.132.0
v0.131.0
v0.130.0
v0.129.5
v0.129.4
v0.129.3
v0.129.2
v0.129.1
v0.129.0
v0.128.0
v0.127.0
v0.126.0
v0.125.1
v0.125.0
v0.124.0
v0.123.0
v0.122.0
v0.121.0
v0.120.1
v0.120.0
v0.119.0
v0.118.1
v0.118.0
v0.117.2
v0.117.1
v0.117.0
v0.116.0
v0.115.0
v0.114.0
v0.113.0
v0.112.0
v0.111.0
v0.110.1
v0.110.0
v0.109.0
v0.108.2
v0.108.1
v0.108.0
v0.107.0
v0.106.2
v0.106.1
v0.106.0
v0.105.0
v0.104.0
v0.103.0
v0.102.0
v0.101.0
v0.100.0
v0.99.10
v0.99.9
v0.99.8
v0.99.7
v0.99.6
v0.99.5
v0.99.4
v0.99.3
v0.99.2
v0.99.1
v0.99.0
v0.98.0
v0.97.0
v0.96.1
v0.96.0
v0.95.1
v0.95.0
v0.94.0
v0.93.0
v0.92.2
v0.92.1
v0.92.0
v0.91.0
v0.90.0
v0.89.1
v0.89.0
v0.88.4
v0.88.3
v0.88.2
v0.88.1
v0.88.0
v0.87.6
v0.87.5
v0.87.4
v0.87.3
v0.87.2
v0.87.1
v0.85.9
v0.85.8
v0.85.6
v0.85.4
v0.85.2
v0.84.1
v0.83.4
v0.83.1
v0.83.0
v0.82.3
v0.82.0
v0.81.5
v0.81.1
v0.81.0
v0.80.0
v0.79.0
v0.78.0
v0.77.0
v0.75.0
v0.72.1
v0.72.0
v0.71.1
v0.70.0
v0.68.0
v0.67.1
v0.67.0
v0.66.82
v0.66.80
v0.66.76
v0.66.75
v0.66.74
v0.66.73
v0.66.72
v0.66.71
v0.66.70
v0.66.69
v0.66.68
v0.66.67
v0.66.66
v0.66.65
v0.66.64
v0.66.63
v0.66.62
v0.66.60
v0.66.59
v0.66.58
v0.66.57
v0.66.56
v0.66.55
v0.66.54
v0.66.53
v0.66.52
v0.66.51
v0.66.50
v0.66.49
v0.66.48
v0.66.47
v0.66.46
v0.66.45
v0.66.44
v0.66.43
v0.66.42
v0.66.41
v0.66.40
v0.66.39
v0.66.38
v0.66.37
v0.66.36
v0.66.35
v0.66.34
v0.66.33
v0.66.32
v0.66.31
v0.66.30
v0.66.29
v0.66.28
v0.66.27
v0.66.26
v0.66.25
v0.66.24
v0.66.23
v0.66.22
v0.66.21
v0.66.20
v0.66.19
v0.66.18
v0.66.17
v0.66.16
v0.66.15
v0.66.14
v0.66.13
v0.66.12
v0.66.11
v0.66.10
v0.66.9
v0.66.8
v0.66.7
v0.66.6
v0.66.5
v0.66.4
v0.66.3
v0.66.2
v0.66.1
v0.66.0
v0.65.0
v0.64.0
v0.63.0
v0.62.3
v0.62.2
v0.62.1
v0.62.0
v0.61.1
v0.61.0
v0.60.0
v0.59.5
v0.59.4
v0.59.3
v0.59.2
v0.59.1
v0.59.0
v0.58.1
v0.58.0
v0.57.0
v0.56.0
v0.54.10
v0.54.9
v0.54.8
v0.54.7
v0.54.6
v0.54.5
v0.54.4
v0.54.3
archive/build-20260926-133840
archive/build-20260925-234719
archive/build-20260925-234605
archive/build-20260925-232908
archive/build-20260925-232907
archive/build-20260925-232229
archive/build-20260925-191117
archive/build-20260925-180508
archive/build-20260925-163033
archive/build-20260925-161652
archive/build-20260925-122523
archive/build-20260925-121406
archive/build-20260925-115549
archive/build-20260925-114145
archive/build-20260925-112814
archive/build-20260925-111822
archive/build-20260925-024607
archive/build-20260925-022443
archive/build-20260925-022315
archive/build-20260925-022250
archive/build-20260925-022154
archive/build-20260925-022153
archive/build-20260925-022141
archive/build-20260925-022127
archive/build-20260925-022116
archive/build-20260925-022108
archive/build-20260925-022058
archive/build-20260925-022048
archive/build-20260925-020930
archive/build-20260925-020910
archive/build-20260925-020337
archive/build-20260925-020303
archive/build-20260925-020251
archive/build-20260925-020229
archive/build-20260925-020223
archive/build-20260925-020222
archive/build-20260925-020214
archive/build-20260925-020208
archive/build-20260925-020030
archive/build-20260925-015548
archive/build-20260915-122729
archive/build-20260915-121830
archive/build-20260915-121129
archive/build-20260915-120929
archive/build-20260915-120328
archive/build-20260915-114627
archive/build-20260915-114022
archive/build-20260915-113543
archive/build-20260915-112801
archive/build-20260915-041723
archive/build-20260915-035618
archive/build-20260915-035320
archive/build-20260915-035034
archive/build-20260915-034913
archive/build-20260915-021627
archive/build-20260915-021430
archive/build-20260915-021353
archive/build-20260915-021323
archive/build-20260915-021240
archive/build-20260915-021109
archive/build-20260915-020532
archive/build-20260915-020400
archive/build-20260915-020304
archive/build-20260915-020300
archive/build-20260915-020218
archive/build-20260915-020149
archive/build-20260915-020040
archive/build-20260915-015933
archive/build-20260915-015800
archive/build-20260915-015147
archive/build-20260915-014949
archive/build-20260915-014707
archive/build-20260915-014442
archive/build-20260915-013935
archive/build-20260915-013633
archive/build-20260915-013428
archive/build-20260915-012934
archive/build-20260915-012650
v0.55.0
v0.54.2
v0.54.1
v0.54.0
v0.51.0
v0.50.1
v0.50.0
v0.49.0
v0.48.0
v0.47.0
v0.46.0
v0.45.1
v0.45.0
v0.44.0
v0.43.0
v0.42.0
v0.87.0
v0.86.0
v0.85.7
v0.85.5
v0.85.3
v0.85.1
v0.85.0
v0.84.2
v0.84.0
v0.83.5
v0.83.3
v0.83.2
v0.82.2
v0.82.1
v0.81.6
v0.81.4
v0.81.3
v0.81.2
v0.76.0
v0.74.0
v0.73.0
v0.72.2
v0.71.0
v0.69.1
v0.69.0
v0.66.84
v0.66.83
v0.66.81
v0.66.79
v0.66.78
v0.66.77
v0.66.61
Labels
Clear labels
P0 — critical
P1 — high
P2 — medium
P3 — low
blocked
bug
custodian
epic
feature
governance
growth
identity
in-progress
incomplete
infrastructure
life
memory
memory-atlas
needs-testing
perception
ready
release-drift
research
rune
scaffolding
spine,correction
spine,deferred
spine,resolved
strangler,burn,endgame,deferred
strangler,burn,endgame,inventory,epic
tui
tui,epic
tui,openspec
v1-course-correction
Spine/core correctness or blocks other work — do first
Material user value or real defect (money, bugs, next-stage dep)
Quality/consolidation improvement
Measurement / benchmark / deferred policy
Dependencies open
Confirmed defect or regression
Rune v1 course-correction issue graph
New capability or improvement
Currently being worked on by Rune
Incomplete work — draft PR with ledger, awaiting resume
Memory Research Atlas child domain
Needs manual testing with dumbed-down steps before close
Order satisfied - Rune may start
Research jobs — spikes, watchlists, evidence work
rune
scaffolding
spine,correction
spine,deferred
spine,resolved
strangler,burn,endgame,deferred
strangler,burn,endgame,inventory,epic
tui
tui,epic
tui,openspec
Rune v1 course-correction issue graph
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: conductor/rune#2449
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
CLOSED — slice 2 complete: all six modules switched, shadow evidence fresh, supersession ledger recorded, the drift-key hazard eliminated.
Per-module final state (all verified this session):
Shadow evidence (fresh, this session): all five parity batteries re-run green — 16+13+17+24+33 = 103 parity checks exact-equal; the LIVE promotion ledger verifies through the Rust seam (75 entries, chain intact — the live growth since batch A's 62 proves append-through-Rust works in production); tests/test_audit_ledger_switch.py + shims green in both import orders.
Vintage reconciliation (RECONCILE-DON'T-CLOBBER, batch A): one chain, one key — the src/rune vintage adopted the deployed authority key; zero history rewritten.
Supersession ledger: each module's Python vintage is preserved in git history (the slice-1 doctrine); the cdylib is the authority; no silent fallbacks — missing cdylib fails loudly everywhere.
Language verdict (dichotomy law): the ep hash-chain, probe validation, bl_* kernels, ca_* seams = deterministic state work → RUST placement confirmed and exercised; Python keeps the reactive adapters (the registered contributor surfaces).
Port 1 (audit_ledger) — authority switch EXECUTED, evidence wall
Scope: deployed
~/.config/opencode/scripts/audit_ledger.pynow serves the core ledger operations in-process through the Rustevidence_provenancecdylib (ep_loader). Vintage upgrade + language swap per frozen contract §2/§3.Evidence (observed, this session):
verify_chain()→{'valid': True, 'entries': 23, 'reason': 'chain intact'}— the §3 linchpin holds: live ledger signed under the drift key, shim default = drift key (rune-drift-integrity-2024), governed-key latent break NOT reintroduced.append_entrylanded live entry 4242 (reason=canary, same shape as entries 89/90); chain intact post-append. First observed write through the shim.src/rune/canary_audit_ledger.py): deployed surface contract (LEDGER_FILE live path, drift-key default, 3-key dict shape), live verify, read path (ascending serving order — observed deployed-vintage shape), write path, Rust CLI parity shapes.src/rust/evidence_provenance/canary_evidence_provenance_rust.py): binary CLI shapes (verify/list/log-promotion incl. argparse error shapes +--limit=Nform), FFI contract via ep_loader (compute_hash/append_entry/verify_chain/get_entries/default_ledger_path), fresh-ledger append→verify→get round-trip, live ledger verifies under the drift key.114c394): read/write/CLI-error shapes vs the939883d:shared/audit_ledger.pyoriginal, error-path parity closed.import audit_ledgerto the deployed shim (scripts-first sys.path); their last two ledger writes (entries 89, 90) predate the shim — entry 4242 is the first observed post-switch write.Sequence-break disclosure (honesty over tidiness): the shim was deployed at 02:08 BEFORE the §5 canary pair existed. Both canaries were written after the fact and pass against the deployed state (28/28 + 23/23). Recorded, not retrofitted: no canary expectation was weakened to achieve green; the one initially-invented expectation (newest-first serving order) was corrected to the OBSERVED deployed-vintage shape (ascending) after the live probe.
Not yet owed by port 1: src/rune old-vintage module deletion,
shared/audit_ledger.pysupersession, coverage-registry remap, supersession ledger — per contract §7 those fall at SLICE completion (ports 2–6 remain; next: verification_layer).Commits:
114c394(crate + loader + shim, shadow 18/18) →4b0d1d2(canary pair). Branchphase-g-strangler-evidence-provenance.Port 2 (verification_layer) — authority switch EXECUTED
Scope:
src/rune/verification_layer.pynow serves all seven verifiers + dispatch through the Rustevidence_provenancecdylib (ep_verifyFFI). TheVerificationResultdataclass stays Python (rune_operator.py:323constructs it directly); theverify_*functions delegate and reconstruct. CLI, embedded test,handle_hook,PLUGINshapes unchanged.Evidence (observed this session):
src/rust/evidence_provenance/parity_verification.py): full battery — all seven verifiers × pass/fail/edge/default shapes, unknown-verifier path, real-fs file_exists cases, CLI indent=2 rendering — byte-equal vs the original Python vintage (pre-switch) and round-trip through the shim (post-switch).passed, verifier_type, evidence_refs, failures, retryable, escalation_reason).contracts.py:435/522(__import__→ getattr surface),canary_native.pyMODULES list (importability confirmed),full_audit.pyfile list (string ref only). Import surface unchanged.Parity subtleties proven (the kind that bite silently):
str()bool rendering —evidence_refscarryexit_code=False, NOTexit_code=0(raw value's str(), not the coerced int).== 0bool/int cross-compare —{"exit_code": false}passes verification (False == 0); a naive Rustpassed = (n == 0)with bool→int coercion was correct, but the evidence_ref rendering diverged until fixed.escalation_reason: Nonerenders as JSONnull, matching Python'sNone→nullin to_dict dumps.Commits:
4b0d1d2(port-1 canaries) →9cb93e6(port-2 core + shim + parity). Port order per contract §4: audit_ledger ✅ → verification_layer ✅ → evidence_probe (next) → behaviour_ledger → behavior → claim_audit.Port 3 (evidence_probe) — authority switch EXECUTED
Scope:
src/rune/evidence_probe.py— the schema gate (validate_probe) and budget count (count_probes) now served in-process by the Rust cdylib (ep_validate_probe/ep_count_probes). Orchestration (run_probe, runner subprocess, exception semantics,build_probe_prompt,record_probe) stays Python by design — same split as ports 1–2: pure logic to Rust, orchestration to Python.Evidence (observed this session):
parity_probe.py): 17 schema-gate shapes + 3 non-dict top levels + 4 count_probes file shapes — byte-equal error lists pre-switch (vs the original vintage) and post-switch (round-trip through the shim).test_evidence_probe.py(5) +test_orchestration_evidence.py+test_runner_evidence.py(18).rune_operator.py:581/603(run_probe, opt-in via MIMO_PROBE_ENABLED),failure_recovery.py:40(budget map),research_stage_executor.py:312(run_probe+MAX_PROBES_PER_TASK+ProbeBudgetExceeded). Import surface unchanged.Parity traps proven this port (the silent-wrong class):
status not in PROBE_STATUSESon the RAW.getvalue —{"status": 1}fires BOTH the field error and the "must be one of … got 1" error. A naive Rust gate that skips the membership check for non-strings diverges silently (caught by the int-status battery case).got {status!r}→ single-quoted'maybe'; the sorted-set list renders['CONTRADICTED', 'GROUNDED', 'STILL_UNKNOWN']— comma-space, single quotes, sorted.sys.modulesbeforeexec_moduleor the@dataclassmachinery raisesAttributeError: 'NoneType' has no attribute '__dict__'.Commits:
9cb93e6→3450a1c. Port order per contract §4: audit_ledger ✅ → verification_layer ✅ → evidence_probe ✅ → behaviour_ledger (next) → behavior → claim_audit.Port 4 (behaviour_ledger) — authority switch EXECUTED
Scope:
src/rune/behaviour_ledger.py— the state machine (define / get / transitions / selective invalidation / queues / summary) served in-process by the Rust cdylib. File glue (load/save) + state constants stay Python; timestamps are pinned by the shim (nowpassed in) so the core is deterministic.Evidence (observed this session):
parity_behaviour.py): full-scenario battery — 3 behaviours defined, auto-verification, user-confirmed + other-confirmer real-world passes, selective invalidation with reasons override + owner-component hit, project/component filters, byte-equal error messages (duplicate define, unknown behaviour), save render (indent=1 sort_keys). Doc parity is FULL-document byte-equality.testing_mode.py:19imports TEST_FAILED/USER_CONFIRMED at module load — verified), save/reload round-trip through the shim, selective invalidation live,iteration.py+testing_mode.pyimport chains green.iteration.py:23,testing_mode.py:19,rune_tui.py:3152(lazy). Import surface unchanged.Design notes:
{ok, err}envelope — the shim raisesValueErrorwith the exact Python message on err. All three error classes byte-equal.nowis an argument everywhere. Parity becomes fully deterministic (the Python vintage'stime.strftimewas frozen in the harness to match).CONFIRMED_STATESrecords with dependency/owner overlap reopen; the default reason carries the Python sorted-list repr (['dep:one']).Commits:
3450a1c→8973caa. Port order per contract §4: audit_ledger ✅ → verification_layer ✅ → evidence_probe ✅ → behaviour_ledger ✅ → behavior (next) → claim_audit.Port 5 (behavior) — authority switch EXECUTED
Scope:
src/rune/behavior.pydecision math (reinforce counting, confidence formulas, promotion/state thresholds) served in-process by the Rust cdylib (ep_habit_reinforce/ep_correction_reinforce). Storage stays Python — SQLite I/O and regex matching remain in the module: the crate is zero-dep by design, and hand-rolling SQLite or a regex engine would be hubris, not hardening. The deployed~/.config/opencode/scripts/behavior.pyvintage ALSO upgraded to the same shim shape (contract §2 vintage-upgrade) pointing at the LIVE db.Evidence (observed this session):
parity_behavior.py): 12 decision-math cases (outcome × state × boundaries: promotion-at-min-activations, confidence floors/ceilings, neutral counts activation, archive-threshold crossing) with SEMANTIC comparison (parse-then-compare — the1.0vs1delta is JSON rendering, not semantics) + 4 full-stack live-db scenarios running both sides' complete stacks (promotion observed, habit_activations logged identically).~/.config/opencode/memory/behavior.db, 2 corrections / 1 habit — read-verified through the shim, data untouched; parity scenarios ran on temp dirs).rune_tui.py:83(import behaviorat startup) resolves the deployed shim; read paths (behavior_stats,match_context) verified against the live db.Design decisions recorded:
if new_count > 0: ... else: new_confidence = habit["confidence"]else-branch is DEAD CODE (activation_count+1 is always ≥ 1); the Rust core is faithful to the live path, and the dead branch stays dead.nowpassed in for the SQL UPDATE, not the math).memory_env, the deployed copy viaexpanduser; both verified.Commits:
8973caa→2732677. Port order per contract §4: audit_ledger ✅ → verification_layer ✅ → evidence_probe ✅ → behaviour_ledger ✅ → behavior ✅ → claim_audit (next, last).Port 6 (claim_audit) — authority switch EXECUTED — ALL SIX PORTS DONE
Scope:
src/rune/claim_audit.py— the decision skeleton (verify verdict tree, report aggregation, clean fold, evidence-term stoplist) served in-process by the Rust cdylib. Regex engine (scan/reframe/degrade/EVIDENCE_TAG), journal I/O, and ledger lookups stay Python (zero-dep crate law). BOTH copies shimmed (src/rune + deployed).Evidence (observed this session):
parity_claim.py): verify tree 12 cases (flags derived exactly as the original derives them, original-vs-FFI), report aggregate over a real-shaped journal incl. '?' fallback rows, clean fold 3 cases, stoplist filter.rune_tui.py:62(import) +:2468(report) +:3752(scan_text),contracts.pydynamic imports,canary_nativeMODULES,hook_engine.py:270,shared/auto_detect.py:101— import surface unchanged.Two vintage-merge disclosures (this port is a MERGE, not just an upgrade):
research_lens.symmetry_checkintegration (2026-08-15) that src/rune's vintage LACKED — the shim serves it in BOTH no-claims and per-claim paths. Feature-preserving merge; the contract's "src/rune is authority" is honored for the shared surface, and the guard is load-bearing deployed behavior that would have been a regression to drop.rune_tui.py:3752callsclaim_audit.scan_text(response[:500])expecting{degraded: [...], claims: [...]}— NO implementation existed in EITHER vintage; the call died silently in try/except every TUI response.scan_text()is now implemented (audit → filtered dict), verified live returning the exact shape. This is a BUG FIX the port surfaced — the silent-try/except class, caught by reading the actual call site.Commits:
2732677→969e39f. SLICE COMPLETE: all six ports executed (audit_ledger114c394, verification_layer9cb93e6, evidence_probe3450a1c, behaviour_ledger8973caa, behavior2732677, claim_audit969e39f). Slice-level close-out (§7): registry remap + regression gate + supersession ledger + final wall NEXT.SLICE 2 EXECUTION COMPLETE — close-out + full-suite verification
Close-out commit
2e68b6b:shared/audit_ledger.pyDELETED — superseded (strangler step 11): zero importers verified by sweep, deployed shim + Rust core proven live before removal (language-governance ⑥).audit_ledgerremoved from SHARED_D.plans/2026-10-03-phaseG-evidence-provenance-supersession.md— port table (6/6 with commits, parity counts, consumer proofs), 12-step doctrine discharge, vintage-merge disclosures, live-data rules honored.Full-suite verification (
ci: register canary_audit_ledgercommit497d14a):2ac2d0ain a clean worktree): 9 of 10 are PRE-EXISTING at the baseline (henxels contract module errors ×5, umbrella manifest, lint baseline, spine-rebuild neutrality — none touched by slice 2). 1 of 10 was MINE:test_every_canary_on_disk_is_registered_in_ci— the new canary wasn't in the CI loop (the henxels per-canary rule); FIXED in497d14a(registered; the contract test doing exactly its job — gap #138's rule enforced live).Net slice-2 state: commits
2ac2d0a→497d14a(7 commits); 6 ports executed; parity batteries 33+24+13+16+17 = 103 checks all green; canaries 34+28; regression gate green; branch pushed to both remotes; issue #2449 carries the evidence trail (comments 33817, 33819, 33820, 33821, 33822, 33823).Remaining (per contract §7): none for EXECUTION — the slice is complete. T7.3 next steps are slice-3 selection (NOT part of this slice's scope).
Slice-2 close-out — evidence (correcting 33826)
The completion comment posted at 16:26 (
33826) was one minute premature: CI on497d14acame back red (canary job failed; the new lint/type/lock gates also red). This comment supersedes it with observed evidence. Root causes, honestly split:Slice-2's own debt (mine to fix):
canary_audit_ledger.py74/74,canary_evidence_provenance_rust.py66/66.RUNE_HOME=/tmp/rune-ci-*, NOT file existence: run 18141's shim writes left a zombie 1-entry ledger in the runner's persistent HOME that flipped a naive isfile() gate on run 18161, now fixed and documented), and a ghost-divergence repair (the Rust binary honors RUNE_MEMORY_DIR first while the shim resolved $HOME — both surfaces now always resolve the SAME ledger; §5 strips RUNE_* from binary envs).Pre-existing latent debt, first exposed by the new CI profile (fixed in passing):
43e7f5f(umbrella gate green at the true merge-base9425cccwith UMBRELLA_SKIP_PROPAGATION=1).Observation on the runner's persistent HOME (maintenance-class, not blocking): run 18141's canary writes left a zombie 1-entry promotion_ledger.jsonl in /var/lib/gitea-desktop-runner/.config/opencode/memory/. CI's own job env now overrides RUNE_HOME/RUNE_MEMORY_DIR, so it no longer affects runs, but the zombie file merits cleanup.
Final wall (all observed on this machine):
CI on
02a9dc4: run 18172 — all 9 jobs green (lint, unit-tests, canary, best-practices, documentation, type-check, gitea-offline, required-checks, notify-event-bridge).Slice-2 close-out is now honestly complete: six ports parity-proven, both remotes pushed, CI green with the full canary pair carrying all six per-port sections.
#2449 progress note — grounding census + batch A landed (the issue stays OPEN for the remaining batches).
Grounding census (contract BUILDER-2026-10-08T14:02:24Z-588ca6, closed): docs/phaseG_slice2_census.md — the measured per-module state: claim_audit 17/17 SWITCHED; behavior/behaviour_ledger/evidence_probe/verification_layer loader-integrated; audit_ledger the one gap — with the drift-key pin and vintage-reconciliation constraint as frozen-contract input. Batteries green: 14/14 + 6/6 shims.
Batch A — the audit_ledger switch (contract BUILDER-2026-10-08T14:06:45Z-f1eada, closed):
rune-governed-adaptation-2024while the LIVE 62-entry chain verifies under the DEPLOYED vintagerune-drift-integrity-2024— proved live (deployed: 62/valid; old default: 0 entries). A src/rune append would have corrupted the chain under the authority key. The key ADOPTS the authority (RECONCILE-DON'T-CLOBBER: one chain, one key).Remaining per the census: vintage reconciliation, supersession ledger, ep-shadow evidence.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (scheduled sweep); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (scheduled sweep); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #2478); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #258); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #259); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #16); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #175); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #181); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #356); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #398); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #403); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #404); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #405); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #406); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #413); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #414); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #415); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (closed: #411); Rune may start.
🎓 NEXT: #2449 — Phase G strangler slice 2: evidence-provenance Rust candidate (T7.3) — dependencies satisfied (scheduled sweep); Rune may start.