angr-memories

ops

8 remembered, 17 forgotten.

bd-close-epic-with-deferred-child forgotten

When closing a bd epic that has children where some are status=deferred, bd close still blocks with 'X open child issue(s)' because deferred counts as not-closed. Use --force to bypass when the epic's acceptance criteria are independent of the deferred child(ren), and explain that explicitly in the close reason (which child is deferred, what triggers reopening, why the AC are met without it). Example: angr-duta closed 2026-05-21 with duta.5 (stdcall/fastcall, deferred to 2026-08-01) still open.

forgotten 2026-06-04T16:21:39.612471+00:00 — closed-only AND status-shape: iteration receipt for closed bead

bd-comment-append-only remembered

bd CLI surface (2026-06-06): comments are APPEND-ONLY — no bd comment edit/delete subcommand exists; bd comments only supports list + add. Therefore any text quality fix (typo, dead memory citation, stale receipt) inside an existing comment cannot be cleaned in-place. Workarounds: (1) append a follow-up comment that supersedes/corrects, leaving the original as audit trail; (2) for dangling memory-key citations specifically, restore the cited memory via bd remember --key so the citation stops being dangling. Notes and description ARE mutable via bd update --notes / --description / --append-notes — those overwrite vs append cleanly. Be aware: bd update --notes REPLACES all existing notes (see avoid-bd-remember-without-key-flag's sibling rule bd-update-notes-overwrites).

bd-dep-edge-one-per-pair remembered

bd allows only ONE dependency edge per ordered pair. To change an edge's type (e.g. 'related' or 'parent-child' -> 'blocks'/depends-on) you must 'bd dep remove A B' then 'bd dep add A B'; adding directly errors with 'already exists with type X'. Note: parent-child does NOT gate bd ready — only a depends-on(blocks) edge removes a child from the ready queue when its blocker is blocked.

bd-deps-flag-direction-inverted remembered

bd create --deps 'blocks:X' is INVERTED vs intuition: it makes the NEW issue block X (X depends on NEW), NOT NEW depends on X. To express 'NEW depends on X' use 'bd dep add NEW X' or 'bd link NEW X' (both: NEW depends on X / X blocks NEW) AFTER creation. Verify any batch dep wiring with 'bd ready' (entry points should be the upstream tasks) + 'bd dep tree'. For non-blocking 'see also' links use 'bd dep relate A B' (bidirectional), NOT 'bd link A B --type related' (directional, renders as A-depends-on-B in trees and pulls unrelated subtrees in).

bd-lock-stale-process-recovery remembered

Lock-recovery for stuck bd processes: if 'bd' reports 'another process holds the exclusive lock on .beads/embeddeddolt', use 'lsof .beads/embeddeddolt/.lock' to find the holder PID, then 'kill -9 ' if it is genuinely stuck (no output, no progress). Saw this 2026-05-11 — a 'bd memories arm64' invocation hung with TTY=pts/0 holding the lock for 5+ minutes. Killing it (after confirming via lsof) released the lock cleanly. Embeddeddolt is single-writer so concurrent bd calls from different shells must serialize; the loop agent's bd calls cannot race with itself, but a stale terminal-shell bd can pin the lock indefinitely.

bd-memory-citation-repair-pattern remembered

When repairing dangling bd-memory citations after a prune, prefer OPTION (b) REWRITE (inline the evidence) over OPTION (a) RESTORE — the prune happened for a reason (status-shape receipts, stale audits, etc.) and restoring re-creates the same prune candidate. RESTORE is correct only when the citation is in an IMMUTABLE location (bd comments cannot be edited or deleted, so a dead-key citation in an old comment will always re-trigger the audit; restoring is then the only path). The full prune snapshot at ~/angr-memories/round1/snapshot-pre-prune.json (and round2/) preserves bodies verbatim — restoration is mechanical. For rewrites, do NOT name the dead key in the explanatory note, or the kebab-token audit script will re-flag it; describe what was dropped without naming the key. Audit script methodology: bd show | grep -oE '\b[a-z][a-z0-9]+(-[a-z0-9]+){2,}\b' for each open bead, cross-check each token via bd recall, manually filter prose/path/doc-anchor false positives (e.g., 'side-by-side', file paths to claude/plans/*.md, technical phrases like 'read-over-write').

bd-memory-consolidation-pattern-closed-task forgotten

bd-memory consolidation pattern for closed-task memories (iter 504, 2026-06-06): when a task closes with a fix-commit reference, redundant 'investigation findings' / 'rejected hypothesis' memories from mid-investigation can usually be pruned in favor of a single 'root-cause + durable lesson' memory. Procedure: (1) bd show to confirm task is closed + read close-reason; (2) bd memories to list all related memories; (3) identify the canonical root-cause memory; (4) extract durable structural insights from sibling memories (rejected hypotheses sometimes contain useful negative data — preserve in the canonical memory's body); (5) update canonical memory with consolidated content; (6) bd forget the now-redundant siblings. Example: angr-ryf6 had 3 memories (ryf6-investigation-findings, ryf6-root-cause-proxy-replay-clobber, ryf6-store-paths-divergence); consolidated into ryf6-root-cause-proxy-replay-clobber alone. Net: 477 → 475 memories. Apply selectively — only for tasks where the fix is firmly landed and the investigation findings have no orphan signal. Do NOT prune memories that document architectural invariants (those belong as invariant-* memories regardless of task closure).

forgotten 2026-07-03T23:13:20.171146+00:00 — status-shape

bd-memory-consolidation-pattern-invariant-pair forgotten

Procedure for merging two related invariant-* memories when an older one is fully subsumed by a newer one: (1) bd recall both keys, (2) verify the older is a strict subset of the newer (and the newer doesn't lose any unique context from the older — like 'mirror' terminology or commit pointers), (3) bd remember --key with merged content (absorb the older's unique terminology + commit history + safety reasoning), (4) bd forget the older. Sibling pattern to bd-memory-consolidation-pattern-closed-task. Example application iter 505: merged invariant-init-cache-options-mirror into invariant-init-cache-options-allowlist. ALSO use when the older memory has stale enumerations (e.g., 4-syscall list when registry now has 60+) — update in place rather than forget; capture structural invariant + pointer to source-of-truth file:line + 'do NOT enumerate (drifts)' warning. Example iter 505: invariant-native-syscall-dispatch lost 4-syscall list, gained per-arch mod.rs line pointers.

forgotten 2026-07-03T23:13:20.548260+00:00 — status-shape

bd-memory-path-audit-method forgotten

bd-memory citation audit & rename-sweep methodology (canonical; absorbs the rename-sweep JSON-dump and symbol-anchor audit notes).

ENUMERATION: bd memories --json exposes FULL bodies as a dict of key->body (plain bd memories shows only key+description — summaries miss body citations, and keyword search bd memories TOKEN provably misses bodies: it missed invariant-flush-stores-drain for interpreter_cb during the 2026-05-31 angr-ulak rename sweep). For rename-rot sweeps, enumerate hits via bd memories --json | python3 -c "json.load; [k for k,v in d.items() if TOKEN in v]", never keyword search alone. Rename nuances to check per sweep (from commit 3ca759588): paths and structs may rename while error enums/constants keep their names (interpreter_cb/ -> interpreter/ and CallbackInterpreter -> VEXInterpreter changed, but CbExecutionError and DCAS_UNSUPPORTED_REASON did not); DELETED files (RustVEXEngine, interpreter.rs) need their clauses removed, not rewritten. See bd-memory-citation-repair-pattern.

FILE-PATH AUDIT (extends docs-citation-audit-method to memory bodies): pipe the JSON bodies through grep -oE '(native/angr/src/...\.rs|angr/...\.py|tests/...\.py|docs/...\.rst|tools/...\.(sh|py))' | sort -u, then while read p; do [ -e "$p" ] || echo MISSING; done; map MISSING paths back to owning memory keys with a python json.load loop. iter59 run found 5 genuine stale hits (4 module-split path-drifts: native/angr/src/state.rs -> state/{fork,mod,snapshot}.rs in 3 memories; claripy_bridge.rs -> claripy_bridge/import.rs in 1) + 1 FACTUAL error (native-htonl-htons-parity claimed Python htonl source at procedures/libc/ but it's at procedures/posix/ — git confirms never in libc/ — which falsely manufactured a 'namespace differs from dir' gotcha that doesn't exist; posix-dir->posix-registration is consistent). 2 intentional non-citations correctly left: angr/procedures/.../mremap.py (rhetorical 'no such file' with ... ellipsis) and tests/engines/test_rust_exploration.py (historical 'formerly in the monolithic...' provenance, pre-yg2m split). Repair via bd remember "<full body>" --key <k> using quoted-heredoc-into-variable to dodge backtick/paren shell escaping. Anchor to symbols not lines per refactor-memory-sweep-rule.

SYMBOL-ANCHOR AUDIT: regex '\b(fn|struct|trait|enum)\s+([A-Za-z_]\w+)' over the JSON bodies (iter60 found 110 distinct symbols, ~80% English false-positives like 'struct field', 'enum that'); grep-verify the real code symbols against native/angr/src + tests via '(fn|struct|trait|enum) NAME'. Apparent misses can be benign: external trait impls (HasTimeout — libafl trait, only 'impl HasTimeout' in fuzzer/executor.rs), Python defs in tests/ (check_ast_passthrough, run_demo), and PROPOSED design names anchored to design docs (CallAndResume + ProcOutcome for angr-5gf0s, anchored to tools/decisions/native_subcall_dispatcher_design.md, not yet implemented). As of iter60 (2026-06-25) the symbol surface across all ~1904 bodies was CLEAN — re-run only after a large rename wave; otherwise the symbol surface needs no routine sweep.

forgotten 2026-08-05T04:34:40Z — Predominantly an iteration-audit receipt (iter59/iter60 findings, 2026-06-25 'symbol surface CLEAN' snapshot) rather than a durable rule; its own file-path claims have already drifted further -- checked ~/repos/angr and native/angr/src/state.rs no longer exists at all, having split into ~16 files under state/ (construction.rs, export.rs, filesystem/, fork.rs, history.rs, hooks.rs, inspection.rs, memory.rs, migration.rs, mod.rs, options.rs, process.rs, pymethods.rs, registers.rs, snapshot.rs, solver.rs, types.rs), not the 3 the memory names -- and it has zero inbound citations within this batch's cites.json. Its generalizable nugget (search `bd memories --json` bodies, not keyword search, which misses hits) is also already present in sibling archive keys bd-memory-rename-sweep-json-dump, memory-citation-rot-path-scan, and memory-crossref-audit-clean (verified present in memories.jsonl), so nothing unique is lost.

bd-memory-rename-sweep-json-dump forgotten

For rename-rot sweeps across bd memories (e.g. angr-ulak interpreter_cb->interpreter), enumerate hits via the FULL JSON dump, not keyword search: 'bd memories --json | python3 -c "json.load; [k for k,v in d.items() if TOKEN in v]"'. The keyword search ('bd memories TOKEN') provably misses bodies (it missed invariant-flush-stores-drain for interpreter_cb). The --json output is a dict of key->body string. NUANCE from the 2026-05-31 interpreter rename (commit 3ca759588): only the PATH (interpreter_cb/ -> interpreter/) and the struct (CallbackInterpreter -> VEXInterpreter) changed; the error enum CbExecutionError was NOT renamed (still interpreter/mod.rs:296) and DCAS_UNSUPPORTED_REASON stayed at interpreter/mod.rs:260. RustVEXEngine + interpreter.rs were DELETED (not renamed) so their clauses must be removed, not rewritten. See bd-memory-citation-repair-pattern.

forgotten 2026-07-04T00:34:16.863241+00:00 — Same cluster (bd memories --json full-body enumeration for citation audits); its unique content (keyword-search recall-gap proof, 3ca759588 rename nuances) folded into the canonical merged body; no external citers. (merged into bd-memory-path-audit-method)

bd-memory-symbol-anchor-audit-clean forgotten

bd-memory SYMBOL-ANCHOR audit (iter60, 2026-06-25): the fn/struct/trait/enum citation surface across all ~1904 memory bodies is CLEAN — zero stale citations. Method: bd memories --json (dict keyed key->body), regex '\b(fn|struct|trait|enum)\s+([A-Za-z_]\w+)' -> 110 distinct symbols, ~80% English false-positives ('struct field','enum that'); grep-verified the ~30 real code symbols against native/angr/src + tests via '(fn|struct|trait|enum) NAME'. 5 apparent misses all benign: HasTimeout (external libafl trait, only 'impl HasTimeout' exists in fuzzer/executor.rs, not a def); check_ast_passthrough + run_demo (Python defs in tests/, not Rust fn); CallAndResume + ProcOutcome (PROPOSED design names for the human-gated native sub-call dispatcher spike angr-5gf0s, correctly anchored to tools/decisions/native_subcall_dispatcher_design.md, not yet implemented). Complements iter58 docs-file-path + iter59 bd-memory-file-path audits (see bd-memory-path-audit-method). Re-run only after a large rename wave; otherwise symbol surface needs no routine sweep.

forgotten 2026-07-04T00:34:17.244115+00:00 — Largely an iter60 audit receipt (clean result) atop a method variant of the same audit cluster; regex/false-positive method and benign-miss taxonomy preserved in the canonical merged body; no external citers. (merged into bd-memory-path-audit-method)

bd-task-stale-description-check forgotten

When closing 'add X public API' tasks, first grep the codebase for what already exists — bd descriptions can predate intermediate scaffold work by weeks. angr-9o4n is the canonical example: the task described 'save_to_disk/load_from_disk' as missing, but dump_snapshot/load_snapshot were already in _public_api.py, tested, and shipped. Check angr/exploration/_public_api.py and grep tests/engines/ for the proposed names before writing new code. The work shifted from 'implement codec' to 'add cleaner classmethod + document v1.0 status', which is a 30-minute task vs a multi-day refactor.

forgotten 2026-06-04T21:40:02.840167+00:00 — Specific to closed angr-9o4n task; the general 'grep before implementing' rule is basic and any contributor would discover it in <1 minute.

bd-update-notes-overwrites remembered

WARNING: 'bd update --notes ' OVERWRITES the entire NOTES field — it does NOT append. Hit on 2026-05-22 iter 18 (slice 3h) when I tried to add the slice 3h note to angr-v5a5 and lost all prior slice 2/3a-3g history. Recovered by reconstructing from bd memories v5a5-slice-3*-landed and writing a complete chronology back with one bd update --notes. How to apply: always read the current notes (bd show ), append the new content, then bd update --notes with the FULL combined string. Better still, before update, dump existing notes to a tempfile: bd show | sed -n '/^NOTES/,/^PARENT|^$/p'. Or use --notes only on first creation and accumulate slice history elsewhere (memory keys, commit messages). Same overwrite footgun likely applies to --description and --design.

ci-gate-audit-2026-06-03 forgotten

CI gate matrix audit (angr-dmla, 2026-06-03, HEAD d163efb67). Four workflows: ci.yml (PR + master push), coverage.yml (PR + master push), nightly-ci.yml (daily cron), perf-dashboard.yml (after nightly).

PR-TIME GATES (ci.yml + coverage.yml):

  • ci: delegated full pytest via angr/ci-settings@master (Rust .so built by uv sync — testpaths=['tests'] picks up tests/engines/test_rust_exploration.py)
  • smoketest (Win/Mac): pytest --collect-only — only catches import errors, not runtime failures
  • rust_check: cargo clippy --all-targets --all-features -D warnings + cargo fmt --check
  • rust_test: cargo test --release on Linux/Mac/Win (DEFAULT features only)
  • python_baseline: ~5min vanilla angr subset (test-python-baseline)
  • benchmark_regression: run_regression.py --rust-only --skip-bimodal --threshold 0.15 --retry-failures 2 (FAST_SUITE only, no MEDIUM)
  • coverage.yml::test x10: pytest -n auto --forked --splits 10, SKIP_SLOW_TESTS=1, exit code masked (|| [[ $? -lt 2 ]])
  • coverage.yml::report: uploads to Codecov, NO fail_under threshold

NIGHTLY-ONLY GATES:

  • windows x5 / macos x3: real pytest runs (not just collect)
  • rust_feature_flags: matrix of cargo check + test + feature_flag_smoke per (no-features, vex-engine, vex+vex-z3, automaton)
  • benchmark_regression: same as PR but without --skip-bimodal (FAST_SUITE only — MEDIUM_SUITE still uncovered)
  • rss_leak_check: run_leak_check.py --iters 10 --threshold 1.5 (4 GB RLIMIT_AS)
  • property_fuzzer: --trials 50 --seed 1 --strict

GAPS / FOLLOW-ON BEADS FILED:

  • angr-ywu7 (P3): coverage fail_under threshold missing
  • angr-dtr0 (P2): property_fuzzer mini-run not PR-time
  • angr-pjio (P3): rust_feature_flags not PR-time
  • angr-sqte (P3): rss_leak smoke not PR-time
  • angr-rbcf (P2): MEDIUM_SUITE never auto-checked (10 benches: sym-write, flareon2015_5/10, ekopartyctf2016_rev250, csaw_wyvern, codegate_2017-angrybird, mma_howtouse + 3 bimodals)

ZERO-VALUE / BROKEN:

  • None outright; closest is coverage.yml test step swallowing pytest exit 1 (intentional for codecov-only but masks failures). perf-dashboard.yml is informational by design, no gate.

LOW-PRIORITY NOT FILED:

  • No rustdoc/doc-test gate (cargo doc --no-deps with RUSTDOCFLAGS=-D warnings)
  • No cargo audit / cargo-deny (dependabot updates weekly but no CVE/license scanner)
  • No pip-audit / Python SBOM
  • No perf-dashboard alert when speedup drops

forgotten 2026-06-04T21:40:03.185443+00:00 — Dated point-in-time audit (HEAD d163efb67) with follow-on beads already filed (angr-ywu7/dtr0/pjio/sqte/rbcf). The CI workflows are the authoritative source; the gaps are tracked as beads. Pure receipt.

ci-gate-bench-regression-medium forgotten

Nightly benchmark_regression MEDIUM_SUITE coverage (angr-rbcf, 2026-06-03, commit e60678109): nightly-ci.yml::benchmark_regression now runs run_regression.py --full --rust-only --retry-failures 2 with timeout-minutes: 12. Gates the 7 non-bimodal MEDIUM benches (sym-write, flareon2015_5/10, ekopartyctf2016_rev250, csaw_wyvern, codegate_2017-angrybird, mma_howtouse) at 15% threshold. The 3 bimodal MEDIUM members (securityfest_fairlight, ekopartyctf2016_sokohashv2, hackcon2016_angry-reverser) included for drift dashboard signal — same model as the existing FAST bimodal (google2016_unbreakable_1). Decision rationale: chose option 2 (extend existing job) over option 1 (separate medium-only job) because (a) single config change is simpler, (b) no duplicate FAST runs, (c) matches existing pattern, (d) the perf dashboard's bench_history_record artifact now naturally includes MEDIUM benches without separate plumbing. Per-bench rust_time totals from baseline_timings.json: non-bimodal MEDIUM 23.72s, bimodal MEDIUM 73.00s. Timeout 8→12 absorbs worst-case retry storm (3×73s ≈ 219s).

forgotten 2026-06-04T16:30:25.588597+00:00 — bead-closure-scrap

ci-gate-property-fuzzer-quick forgotten

ci.yml property_fuzzer_quick (added 2026-06-03, angr-dtr0, commit 82dce45a7): 10 trials, --seed 1 --strict, 5-min step timeout / 15-min job timeout. Pairs with nightly-ci.yml::property_fuzzer (50 trials, same seed/strict). Both share the same allow-list (rust_only/bimodal entries in property_fuzzer.py); a new PR-time divergence on something OUTSIDE the allow-list will fail the gate. Adding a new bimodal example: skip-list update lives in property_fuzzer.py itself, not in workflow. The 10-trial sample is small enough that some (example, strategy) tuples never get rolled — keep the nightly 50-trial gate for that coverage.

forgotten 2026-06-04T16:30:25.937097+00:00 — bead-closure-scrap

ci-gate-rss-leak-smoke forgotten

PR-time RSS leak smoke gate (angr-sqte, 2026-06-03, commit a71a19a43): ci.yml::rss_leak_check_smoke runs run_leak_check.py --iters 3 --threshold 1.3 under 5-min step / 15-min job timeout. Pairs with nightly's --iters 10 --threshold 1.5 job. Threshold tighter than nightly because N=3 warmup happens entirely in iter1; iters 2-3 should be flat on healthy main so 1.3x is a lower-noise signal than 1.5x. Steady-state variance still belongs to the nightly N=10 run. Together they cover both fast-feedback (PR) and steady-state (nightly) drift detection for the 9maq-class Callable leak. Same workflow shape as property_fuzzer_quick: Rust build dominates (~5-7m cold) + the actual check is ~15s.

forgotten 2026-06-04T16:30:26.278240+00:00 — bead-closure-scrap

ci-gate-rust-feature-flags-pr forgotten

PR-time rust_feature_flags_check matrix (angr-pjio, 2026-06-03, commit cb247d362): ci.yml::rust_feature_flags_check runs cargo check --no-default-features --features '<combo>' for the same 4 combos as nightly rust_feature_flags (no-features, vex-engine, vex-engine+vex-engine-z3, automaton). cargo-check-only (no test, no feature_flag_smoke) keeps each matrix entry ~1-2 min. fail-fast=false reports all 4 on a single PR. timeout-minutes 10. Nightly retained for cargo test + feature_flag_smoke. Closes the gap that invariant-ci-gate-hygiene rule (1) flagged: a PR that breaks a non-default cfg combo would otherwise sit broken until next nightly cron.

forgotten 2026-06-04T16:30:26.607127+00:00 — bead-closure-scrap

claude-cli-monthly-limit-envelope-shape forgotten

Claude CLI's monthly-usage-limit 429 returns {subtype:'success', is_error:true, api_error_status:429, result:"You've hit your org's monthly usage limit"} — NOT subtype='error_*' and NOT in errors[]. The text lives in 'result'. Any orchestrator detector that only inspects subtype + errors[] will misclassify this as unknown_error. detect_failure_mode in run_optimization_loop.py was hit by exactly this — three back-to-back monthly-limit 429s caused 80-min exponential backoff loops instead of immediate abort. Fix: include result + api_error_status in haystack; branch on 'monthly' + 'limit' → budget_exhausted (terminal).

forgotten 2026-07-04T00:34:17.636623+00:00 — Describes detect_failure_mode in run_optimization_loop.py, deleted in commit ff7382a1d; the envelope-shape insight is codified in ralph internal/runner/classify.go (comment says lifted there, scans Envelope.Result + api_error_status for 'monthly usage'). Criterion (e).

claude-md-drift-refresh-recipe forgotten

CLAUDE.md headline test count and benchmark table drift fast. As of 2026-05-31 they were ~150 tests and 3 below-1.0x benches stale relative to live state. To prevent recurrence, the test-count line now points at the grep/collect-only recipe (no hardcoded number to drift), and the table carries an explicit 'baseline_timings.json is authoritative' note. Future angr-nb0y-style refresh: recompute speedups as python_time/rust_time per row, then re-count benches at >=1.0x for the headline. Keep per-bench narrative columns; only the speedup column changes.

forgotten 2026-06-04T16:30:27.952437+00:00 — bead-closure-scrap

ralph-dirty-false-positive-venv forgotten

ralph's dirty-state detector flags any untracked file/dir, so an unignored local .venv/ would repeatedly trigger spurious 'dirty' iterations. Fixed in commit aef3e6ac0 by adding .venv/ to .gitignore. Lesson for future false-positive dirty states: before doing real work, check if 'git diff --stat' is empty and only untracked artifacts remain — those should usually be gitignored, not 'resolved'.

forgotten 2026-06-04T20:54:23.581209+00:00 — status-shape

ralph-gate-cargo-test-timeout remembered

ralph-gate.sh caps cargo test --release at CARGO_TEST_TIMEOUT_SECS (600s) and pkills leftover target/release/deps/rustylib-* binaries on failure. Two non-obvious reasons: (1) ralph's iteration timeout does NOT tear down the process tree cargo forks — a killed gate leaves the compiled test binary orphaned and still running, wedging every later iteration; timeout's SIGKILL only reaches the process it launched directly (cargo), not that grandchild, hence the by-name pkill sweep. (2) The exit status MUST be captured as cmd || rc=$?, never if ! cmd; then rc=$? — bash's ! rewrites $? to 0 inside the then-block, so the gate would exit 0 on a real test failure and silently pass. Trigger was the flaky hang tracked in angr-x8ocv.

ralph-gate-runs-cargo-test remembered

The ralph loop gate (tools/ralph-gate.sh, shared body exec'd by .ralph/hooks/states/{clean,dirty}/gate) runs TWO checks fail-fast: (1) cargo test --release, (2) run_regression.py fast-tier bench. Added in angr-6e5yv after angr-8kk32 showed a Rust-unit-test-only regression could survive a full iteration. Timing: 46s warm (14s cargo test + 32s bench); ~2m extra when an iteration touched native/ and the Rust TEST BINARIES must rebuild -- 'cargo clippy --all-targets' does NOT warm them, because clippy's driver keeps separate fingerprints from rustc's. [gate] timeout_secs raised to 1200. Supersedes 'cargo-test-not-in-ralph-gate'. If you add a third check, put it in ralph-gate.sh, never in one state hook -- the two hooks had already drifted (dirty/ lost --retry-failures 2) before the wrapper existed.

ralph-loop-noop-streak-iter100 forgotten

Ralph autonomous loop has run 44 consecutive no-op iterations (iter 57-100, ~2026-05-30 to 2026-06-02) because every issue on bd ready is blocked or deferred: angr-kq43 (mimalloc eval deferred to 2026-08-01), angr-ig3o (BE validation epic, blocked), angr-uahs (mremap, blocked on broader memory work), angr-unud (symbolic file paths, blocked), angr-j7kn (Z3 theory propagator, blocked epic). Until either the 2026-08-01 deferral lifts or a human re-triages an issue out of blocked status, the loop will keep no-opping. This is the expected and correct behavior — no actionable work means do not invent work. Cost per no-op iter: ~3-5 tool calls.

forgotten 2026-06-04T20:54:28.369147+00:00 — future-date

ralph-loop-noop-streak-iter85-2026-06-03 forgotten

Ralph autonomous loop iter 85 (2026-06-03): no-op streak continues. Triaged all 21 ready beads. Findings: angr-75mc (xmllint bench) is structurally blocked because xmllint solve.py uses angr.rustylib.fuzzer (icicle/libafl/pcode), which requires the optional 'fuzzer' cargo feature NOT in default build [vex-engine, vex-engine-z3, automaton]. angr-kq43 (mimalloc eval) STILL network-blocked (cargo search to crates.io fails, registry cache has no allocator crates). Other ready beads: P1 boundary epics (multi-session), angr-d1dr (CoW fork — open design Q), angr-xel4 (grub OOM — unsafe on 8GB box), angr-trsg (flamegraph — py-spy not installed), angr-439q (codecov fetch — needs network), P4 parking-spot beads. Pattern persists: every bd ready issue is multi-session, blocked, or env-incompatible. Suggested human action: re-triage angr-75mc (decide a/b path), pre-stage mimalloc/jemalloc crates with network access.