Sibyl 1.5Trust It
1.5 makes accumulated agent experience dependable in daily use. Project boundaries hold, corrections and deletions stick, recall stays fast on a large graph, and the dream cycle learns from the right evidence.
The learning claim rides along only if a sealed study earns it. A study that comes back inconclusive changes the release note, not the release date.
At a glance
Four workstreams in priority order, with a hard ceiling of $435 in inference spend and a likely spend nearer $300. Sibyl is an open-source project, so the plan buys evidence as cheaply as the statistics allow. The scale and migration work runs on the devbox and free public-repo CI, and engineering time is not counted. The release ships when the trust, scale, spend-guard and migration-rehearsal gates pass. The study runs alongside and decides only what the release note may claim. Every gate figure in this document is a proposed acceptance criterion, not a measurement, and every spend figure is a ceiling awaiting approval.
Decision
1.5 is a trust release. 1.4 proved that the dream cycle runs end to end with receipts, and the September 25 cleanup fixed the reasons it learned the wrong things. What a user meets first, though, is not consolidation. They meet recall that crosses projects, a delete that returns 500, a correction they can't undo from the CLI, and a graph page that takes a minute and then fails. 1.5 fixes those, makes the system hold up at the size real graphs reach, and delivers one real team migration.
The learning proof stays a first-class workstream, but it doesn't gate the release. The study is staged behind cheap gates, so money is spent only once the pipeline can plausibly show an effect, and the whole plan's inference spend is capped at $435. If the sealed study passes the 1.4 claim gate, 1.5 carries a bounded claim. If it doesn't, the release note reports the measured result and 1.5 still ships.
1.5 does not: activate Jev in production, claim general or autonomous learning, chase leaderboard numbers, polish graph visuals beyond the capacity fix, expand the archive or memoryfield surfaces, or build team workflow features beyond migration. Proposals in those areas go on the 1.6 list.
Where 1.4 left us
The learning mechanism now keeps what matters
The September 20 re-probe showed memory of any kind lifting the three headroom tasks, but native memory did not beat raw retrieval (native 12/15, raw 13/15). The cause was consolidation: 33 of the 34 procedures it promoted were generic repair choreography. Four PRs merged on September 25 address that.
| PR | What it changed | Measured effect |
|---|---|---|
| #656 | Dream cohorts grow from nearest embedded neighbours, and proposals ask for the problem's decision rules. | Majority-family share 0.92 (was 0.24). A promoted procedure now carries the percent-escape mechanism. |
| #657 | Per-repetition seeds shared across arms, and the diagnostic intervention harness. | Paired arms see the same seed and repetitions differ. |
| #659 | Joins a family's two cohorts when the union stands clearly apart. | Recall on 100-source pages 35.2% → 40.4%. One proposal instead of two near-duplicates. |
| #660 | Per-model consolidation input budget: 1.6M characters for Opus 5 and 5.5. | A whole family fits one proposal (about 412K tokens on screen48). |
| #661 | Dream pages seeded by a source and filled with its nearest pending neighbours, with coverage and send-gate checks. Verified, merging. | Recall on the real job path 76.7% with 9 cross-family pairs (was 40.4% and 39). |
The intervention probe (task b7bc8bf4) gives the only native-over-raw signal so far: 14/18 against 9/20 on cdn-batch-map, a paired +6 of 18 at p = 0.11. That clears the pre-stated +4 threshold but isn't significant. On the 16 repetitions where both arms finished, removing the derived items cost only 2 of those wins (11/18 overall against 14/18), a family summary adds nothing over raw, and a task with opaque keys shows no negative transfer (10/10 in both arms). One more finding from the probe: the promoted pattern itself was excluded from native recall as out of scope, and the mechanism reached the solver only through two raw candidate rows (task 3ed9000e).
What a user meets first
The September 22 demo prep and the proof work surfaced trust defects, and every one of them is still present on main. Each is small and reproduced. The gap that matters most is in process: PR CI never runs the :check bundle, so a delegated-scope regression from PR 525 shipped through 11 days of green PRs and surfaced only at the 1.4.0 dry cut.
The system slows as it grows
On the real 10.5K-entity graph, /graph spins for about 70 seconds and then fails with a 500, starving other pages in the same tab. A long-lived Surreal process reached 33 GB resident, with plain selects taking 14.8 seconds. Sustained ingest degrades from about 10 seconds to 100 to 700 seconds per capture once the entity table deepens. These also contaminate every latency number the public benchmarks would report.
Public benchmarks have no current anchor
LongMemEval-S sits at 26.2% because the adapter truncates every session at 3,985 characters and never calls compile_context. V2 Web Small's 23.3% ran with notes off and isn't comparable to the notes-on 30.38% anchor. The 80% and 60% targets in the 1.4 plan were never measured.
Spend so far
The 1.4 campaign spent about $463: roughly $385 on memory calls and $8.50 on solver attempts through September 19, then $69.47 across the headroom screen, re-probe, three scoped cycles and the intervention.
Release rules
- Trust gates run on every PR. Nothing that affects scope, authorization or lifecycle merges without the gate bundle having run on its head.
- Scale fixes grow capacity. Truncating results, lowering concurrency or skipping work doesn't count as a fix. A temporary mitigation needs a name, a tracking task and a stated path back.
- Every paid run sits behind a gate and a guard. Each spend stage unlocks only when the previous gate passes. No product default ships with unbounded model spend.
- Claims need sealed evidence. Design, analysis and exclusions are frozen before unsealing. Failures stay in the denominators, and nothing is rerun selectively.
- Verification is independent. Every non-trivial PR gets an adversarial verifier that did not write it, plus root
moon run :lintand:typecheckbefore push.
Boundaries and lifecycle that hold
~$10Goal: what a user stores stays in the scope they stored it in, and what they correct, delete or restore behaves the way the CLI and API say it will. Approach: fix the CI gap first, so every later fix lands under the gates. Then generate one authorization matrix that covers every role and scope across MCP, CLI and REST, and fix defects until it's green. The matrix extends the existing team-scope gate, which today seeds only private, team, project and delegated fixtures and says nothing about SHARED or ORGANIZATION.
| Task | Problem | Fix direction | Size |
|---|---|---|---|
| c5ecc5b4 first | PR CI runs lint, typecheck and tests but never moon run :check. Trust gates run only at the release RC, uncached. | A PR job runs the trust gate tasks (team-scope, doc-claim, and whatever else :check adds) with correct moon inputs. | S |
| 672d5084 | Default sibyl context recall returns memories from other projects. | Scope default recall to the linked project plus explicitly shared scopes. --all stays as a labelled opt-in. | M |
| 952d4340 | Every web page defaults to All Projects and shows other projects' cards. | Default to the selected or most recent project and persist the choice. All Projects becomes an explicit selection. | S |
| 78b4010c d9e4b5bd | authorize_memory_read has no SHARED branch, so raw recall drops SHARED rows while listing returns them. Legacy shared captures are denied to every reader. | Retire SHARED for new writes and map legacy rows to team: add the read branch for the mapped scope, backfill the legacy rows, and tombstone what cannot map. | M |
| 3ed9000e | A promoted pattern from a scoped cycle is excluded from native recall as out of scope, while its superseded draft stays recallable. | Fix the inventory's scope resolution for promoted private patterns, and make superseded drafts unrecallable. Shared with workstream two. | M |
| a3e39787 | After a raw source is revised, three old relationship generations stay readable. | Bind relationship reads to the source's current observation across search, explore, REST and cache. In progress since September 11. | L |
| 21495240 | Deleting a raw_memory: id returns 500, and the CLI buffers the write forever. | Route raw ids to the correction lifecycle or return a 4xx with remediation. Never buffer a write the server can't accept. | S |
| 468693b1 | The CLI maps five correction actions; restore, hide, redact and mark-sensitive exist only in the API. | Add the missing actions (restore aliased as undo), each with a preview line. | S |
| 6ec73846 | An entity PATCH between backfill enqueue and drain leaves an embedding that's never refreshed. | Give the update path ownership of re-embedding and enqueue on write. | M |
| 47640192 | The two projection paths disagree on whether private prose may be extracted. Not a leak today; rows inherit private stamps. | Refuse private prose on both paths, matching project_memory_entities. | S |
| e23ccd49 | The Next.js dev server exposed a credential in its process title. | Rotate, trace how the value reaches argv, remove the path, and verify value-free inspection after restart. | S |
| 1a156f2b 5a978550 | Pending writes that reference mutated task ids never drain. sibyl health reports healthy while auth storage is down. | Recheck the first against PR 615 and close or fix it. Have health round-trip a trivial auth-storage read. | S |
Acceptance
| Gate | Passes when |
|---|---|
| Authorization matrix | At least 200 generated assertions across every role and scope, over MCP, CLI and REST. Zero unauthorized reads, zero foreign-project results under the default selection, and complete authorized SHARED results. |
| Lifecycle sequences | 20 end-to-end runs of capture, correction, deletion, restore and recall, including a restart with pending-write replay. Provenance and receipts survive every step. A revised source leaves no stale relationship readable. |
| The gate guards itself | A deliberately broken trust assertion fails a PR check. |
A learning loop worth measuring, then one credible study
≤ $425Goal: the dream cycle turns related experience into procedures that reach the next agent, at a bounded cost, and one sealed study measures whether that beats simpler memory. Approach: finish the product fixes first, then build task families with real headroom, then spend in stages.
Product fixes, before any study spend
| Task | Problem | Fix direction | Size |
|---|---|---|---|
| bb650b6e release blocker | Dream-path proposal, critic and correction calls run outside any token budget context. With #660, one Opus call can carry about 420K tokens. | Open a budget context per dream run and settle it to actual usage. Add a per-run spend ceiling that fails closed with a clear receipt. | M |
| a5b6cc73 | The classic consolidation path reserves the 9-attempt worst case per call and never refunds it, so the third 40K Opus call in a month is refused. | Reserve one attempt plus a margin, then settle to actual usage after each call. | S |
| b1bf1287 | No consolidation call uses prompt caching, yet every critique and correction resends the cohort's whole evidence. | Put the cohort evidence first as a shared, cached prefix, with role instructions after it. A cohort accepted on first critique then pays about a third less input, and each correction round much less. Verify the pydantic-ai caching surface first, and treat the prompt change as a new execution identity. | M |
| 3ed9000e | Promoted patterns don't reach native recall (see workstream one). | As above. This is the prerequisite for the canary. | M |
| f1093a5a | Reflection candidates share raw_captures with originals and shift BM25 statistics, so consolidation changes the raw control's ranking. | Keep candidates out of the raw lane's index and statistics, or give them their own table. | M |
| fe47bb18 | An abstained reflection chain orphans its pending correction children, which fail forever. It ate one of two good candidates. | Abstain or archive the children along with the parent, and repair orphans already stored. | S |
| 258af557 | The critic passes a candidate that says nothing useful. | Add a coverage finding for a supported distinction the candidate omits, with evidence spans and a correction or abstain outcome. | M |
| 6f97769b #641 | The candidate drain re-projects each cohort's evidence per candidate (32 minutes at 85% CPU with no model calls). | Merge #641 (reuse within one preparation, 1.56 s → 0.67 s), then cache projected evidence per cohort digest. | M |
| follow-up | Sources that 1.4.0 reflected alone never seed a dream page again after upgrade (a #661 upgrade effect). | An operator-triggered re-sweep of pre-1.5 singletons, costed per cohort, run after the spend guard lands. | S |
Task families with headroom
Only cdn-batch-map has real native-versus-raw room today; stock-adjustment-log and department-unit-budget saturate near raw. The study needs harder families before it needs a bigger n. Keep cdn-batch-map and add two families with different mechanisms, for example retry with idempotency keys, and revision-sensitive authorization. Each family needs:
- At least 25 instances: 5 for development screening and 20 sealed.
- Cases where applying the remembered procedure would be wrong, so negative transfer is measurable.
- Task validity verified independently of any memory arm, with public checks the solver can run and hidden checks it can't.
- A learning corpus of episodes that captures the family's mechanism, generated the way screen48's was.
The saturated screen48 tasks become regression controls.
Staged spend
The study is sized to what the statistics need. Uncertainty is clustered by instance, so once each instance has a few repetitions, more repetitions add little power; new instances add a lot. The plan keeps 20 sealed instances per family and lets the screen's variance set the repetitions. At the intervention's measured $0.19 per attempt ($29.98 for 160 cells), 1,300 attempts cost about $250, and the $300 cap leaves room for harder tasks running longer. The interim look means about half the time the study stops at half the cost.
Evaluation contract
| Element | Contract |
|---|---|
| Arms | native (product recall after the fresh cycle), raw (raw retrieval over the same corpus), strong summary (the best simple control), no memory, and native minus derived (native with the promoted items removed and no refill). |
| Unit | One attempt at a fixed task budget. The primary endpoint is success on hidden checks. |
| Pairing | Each instance and repetition shares one seed across all arms (the per-repetition seeds from #657). |
| Freeze before unsealing | Solver model and budget, memory model, corpus and checkpoint, seeds, exclusion rules, and the analysis script with its hash. |
| Analysis | Paired differences with uncertainty clustered by instance (cluster bootstrap), reported per family and pooled. A negative family is reported, never averaged away. |
| Claim gate (from 1.4) | At least +10 points over no memory and at least +5 over the best simple control, with positive paired lower 95% bounds. |
| Also required | A positive native-minus-derived ablation, negative-transfer bounds on the exception cases, repeated-mistake rates, and cost per success with consolidation cost amortized in. |
| Power preflight | From the screen's variance, pick the repetitions per instance (2 to 6), favouring instances over repetitions. The sealed design must have at least 80% power to detect +5 over the best simple control within the $300 cap. If it doesn't, no claim-bearing run happens and the gate stays where it is. |
| Interim look | One pre-registered analysis at half the attempts, with alpha spending (O'Brien-Fleming boundaries). It can stop for futility, or for success only if the boundary is crossed. The final analysis uses the adjusted threshold. |
| Multiplicity | The primary endpoint is the pooled paired difference across families, clustered by instance. cdn-batch-map is pre-registered as the primary family. Per-family claims are secondary: a family may be named in the note only if the pooled gate passes and its own lower bound stays positive after Holm adjustment across the families tested. Nominal per-family bounds are reported but never carry a claim on their own. |
| Integrity | Voided cells (provider errors, harness faults) are rerun under the same seeds and listed, and failures stay in the denominators. Nothing is rerun for any other reason. |
What the release note says, by outcome
| Outcome | Release note |
|---|---|
| Gate passes in every family | A bounded claim: native memory improved task success by the measured margin on these families at this budget, with the ablation and cost. |
| Pooled gate passes, some families pass | The claim is stated for the pooled result and names only the families whose Holm-adjusted bounds are positive. The others are reported with their numbers. |
| Pooled gate fails, one family passes nominally | No claim. The family result is reported as exploratory, with its unadjusted and adjusted bounds. |
| Native beats no memory but not the simple control | Memory helps, but consolidation's added value is unproven. The numbers are reported. |
| Canary stop, or no power within the cap | No study ran. The note says why and what the canary showed. |
Fast on a big graph, under load
$0 incrementalGoal: the graph page, recall and ingest stay responsive at ten times today's real graph, with concurrent clients. Approach: treat the four symptoms as one capacity investigation on the devbox against native Surreal (local OrbStack has wedged four times under this kind of load). Name the contended resource for each symptom before changing code. The work runs on the devbox and free public-repo CI, so it adds no inference spend.
| Task | Symptom and known mechanism | First move | Size |
|---|---|---|---|
| 8ea64f07 | /graph takes 70 to 105 seconds or returns 500, and other pages starve. Batched snapshot queries take about 1.5 seconds each, and the hierarchical view is capped at 1,000 nodes and 5,000 edges, so a large graph gets a cut rather than an overview. | Capture the server-side 500 and profile the snapshot path. Then build the overview on the server, keeping the remaining nodes reachable on demand. | L |
| defd7d5b 8a56f5c7 | Surreal resident memory reached 33 GB after 24 hours of mixed load, and peaked at 11.7 GiB on a 15 GiB runner, killing the enterprise V2 run. | Replay the frozen snapshot and pack queries on v3.2.x, sample RSS, and bisect block cache vs FTS and HNSW residency vs query-time allocation. | L |
| e2ffa177 | Ingest degrades from about 10 seconds to 100 to 700 seconds per capture at depth. Each capture bulk-upserts about 700 fat rows through four FTS indexes plus HNSW, holding pool sockets so every other query queues. | Profile the bulk upsert at depth, then fix the write shape (slimmer rows, batched index maintenance, or a separate pool for bulk writes) rather than throttling ingest. | L |
Acceptance
| Workload | Passes when |
|---|---|
| The real 10.5K graph, a 10× expansion, and the residency and ingest reproducers. Three repetitions each at 1, 8 and 32 concurrent clients, plus a two-hour mixed soak. | Zero 500s. Recall p95 at most 2 s. Graph first useful render at most 5 s with every node still reachable. Other pages slow by at most 20% during graph use. Deep ingest runs at 80% or more of shallow throughput. Resident memory on the reproducer drops at least 50% and grows no more than 5% after warm-up. |
One real team move
$0 incrementalGoal: any team member can move their personal Sibyl into a shared org server with one command, and one real team does it end to end. Both tasks have waited at high priority since September 2. An archive import makes no model calls, so the move adds no inference spend.
| Task | Scope | Size |
|---|---|---|
| a7dcbe91 | A new sibyl migrate to-team <url> command. It exports the local org archive (graph and content, auth skipped), authenticates through the existing flow, and streams to a new server-side import endpoint. The server runs check, dry run and import into the caller's org, remapping scope ownership to the authenticated user, which resolves the private-scope owner mismatch by construction. It returns per-kind counts and conflicts. The conflict policy for overlapping project knowledge is additive with dedup. | L |
| aa3ea579 | Move a personal graph into a shared team server as the acceptance deployment, once both ends run 1.5. The existing consolidate path assumes an SSH and compose target, and a Kubernetes-hosted server needs manual kubectl steps, so to-team replaces them. | M |
Acceptance
| Gate | Passes when |
|---|---|
| Rehearsal (release gate) | Two full rehearsals on a representative snapshot, including interrupt and resume, an idempotent rerun, and rollback. Every source record reconciles by stable identity and content checksum, with an explicit exception ledger. |
| Pilot (post-cut acceptance) | One separately authorized migration into a real team server, then five days with two users across two projects and 20 scripted cross-agent handoffs. Zero scope leaks, missing captures or duplicates. The pilot runs on the release candidate and can finish in 1.5.1. |
Side lanes with a set position
| Lane | Position for 1.5 |
|---|---|
| Jev stack (14 PRs) | Merge perf PR #641 once its current head reproduces the preparation speedup with identical outputs. Hold #626 until the real-data semantic gate G1 runs; a disabled experiment doesn't justify a per-capture backfill. Its migration renumbers, since #661 took version 46. Archive experiments 628 to 646 as one indexed evidence branch, and extract standalone critic fixes (28b8e89d, 2563d7ef) as small PRs. |
| Public benchmarks | Scope is measurement integrity only. Fix the LongMemEval adapter so it stops truncating sessions and uses compile_context, add the missing QA regression baseline, and prove 20 long-session fixtures keep their evidence. Retire 26.2% and 23.3% as product anchors. Paid reruns wait until the adapter and scale gates pass. |
| Dependencies | Clear the Dependabot queue. First fix the single ty diagnostic on #648, rerun the Opus 5.5 live smoke before #649 (pydantic-ai 2.45), and check the web runner config before #655 (vitest 5). |
| Developer experience | Opportunistic only: the 49 GB moon cache and 62 worktrees that make repo greps take minutes (9828a377), and apps/e2e/uv.lock drifting behind sibyl-core's pins. |
What users get
- Recall and web pages scoped to the current project by default, with cross-project access as a visible choice.
- Delete, restore, hide and redact from the CLI, with previews, and no forever-buffered writes.
- SHARED memories that behave as documented.
- A graph page that renders in seconds on a real graph without starving the rest of the app.
- Ingest and recall that stay fast as memory grows.
- A dream cycle that groups related experience across pages and keeps the mechanism in what it promotes.
- Opus memory models sized to their window, with spend bounded per run.
sibyl migrate to-teamfor moving personal memory into a team server.- A health check that tells the truth about storage.
Release boundary
| Must pass for 1.5.0 | Decides the note, not the date | May finish in 1.5.1 |
|---|---|---|
|
|
|
The cut follows the 1.4 mechanics: bump VERSION, run moon run sync-versions for the 11 static pins, do a release dry run (it caught the delegated-scope regression in 1.4.0), then cut. The tag, publish and release steps each need your go-ahead.
Sequence
Each phase ends on a gate rather than a date. From P1 on, workstreams two and three run side by side, with the study on the devbox and the capacity work on a separate native Surreal stack.
-
P0
Land the cleanup and close the CI gap
Merge #661. Wire
Exit: main carries the whole partition stack, trust gates run on every PR, and no dream run can spend without a budget.:checkinto PR CI (c5ecc5b4). Land the dream spend guard and refund (bb650b6e, a5b6cc73). -
P1
Trust fixes, recall defects, task families
Default project scoping, the SHARED decision, CLI lifecycle, and the authorization matrix. Fix 3ed9000e, f1093a5a, fe47bb18 and 258af557. Build the two new task families and run the $30 headroom screen. Start the residency bisect on the devbox.
Exit: the authorization matrix is green, at least two families show headroom, and the capacity bottlenecks are named. -
P2
Canary, cycle, study, capacity fixes
$20 canary, then the $75 fresh cycle, the power preflight and the sealed study with its interim look. Capacity fixes land against the load harness.
Exit: the canary has run, the sealed study is unsealed or stopped, and the scale gates pass. The study verdict feeds the release note whenever it lands and never holds P3. -
P3
Migration and release
Exit:sibyl migrate to-team, two rehearsals, then the release dry run and the 1.5.0 cut. The team pilot starts on the RC.:checkgreen at the RC, rehearsals reconciled, and your go-ahead for the tag and publish.
Dependencies that set the order
| Before | Unlocks | Why |
|---|---|---|
| c5ecc5b4 | All trust fixes | Fixes should land under the gates they exist to satisfy. |
| bb650b6e | Fresh cycle, re-sweep, 1.5.0 | No paid dream run and no shipped Opus default without a spend bound. |
| 3ed9000e f1093a5a | Canary | The canary measures whether promoted items reach the solver and whether the raw control stays clean. |
| Headroom screen | Sealed study design | The power preflight needs the screen's variance. |
| Workstream one and three gates | Team pilot | A team deployment should inherit fixed boundaries and capacity. |
| Adapter fix | Any paid LongMemEval run | A truncating adapter makes the number meaningless. |
Spend and scope controls
| Stage | Cap | Unlock condition | Running total |
|---|---|---|---|
| Workstream one live smokes | $10 | None; the checks are deterministic. | $10 |
| Headroom screen | $30 | Task families built and validated. | $40 |
| Canary | $20 | Screen shows headroom; 3ed9000e and f1093a5a landed. | $60 |
| Fresh cycle | $75 | Canary passes; spend guard landed. | $135 |
| Sealed study | $300 | Inventory audit and power preflight pass. | $435 |
| Capacity investigation | $0 | None; devbox and free public-repo CI. | $435 |
| Migration rehearsals and pilot | $0 | No model calls. The pilot needs its own authorization. | $435 |
- The harness cost guard stays armed on every paid run and counts billed-but-unmeasured attempts.
- A stage that would overrun its cap stops and reports. It never borrows from the next stage.
- If the canary stops the study, total spend is about $60. If the interim look stops it for futility, total spend is about $285.
- New scope goes on the 1.6 list unless it fixes a defect that blocks a 1.5 gate.
Risk register
Consolidation may add little beyond better raw retrieval. The intervention already hints at it: on the 16 paired repetitions, removing the promoted items cost only 2 of native's 6 extra wins. The earliest cheap signal is the $20 canary after 3ed9000e and f1093a5a. If the promoted mechanism now reaches the solver but removing it still changes nothing, pause the study and investigate consumption. That result stops the spend; it doesn't prove zero benefit.
| Risk | Earliest signal | Response |
|---|---|---|
| New task families lack headroom or validity. | The $30 screen. | Iterate on instances before spending further, or scope the study to the families that qualify. |
| A capacity bottleneck sits inside the Surreal engine rather than our code. | The residency bisect in P1. | Report upstream with a reproducer, and change our query or write shape around it. Pin a fixed version if one exists. |
| Migration identity remapping collides with records that already exist. | The first rehearsal's reconciliation ledger. | An additive-with-dedup policy and an explicit exception ledger. The rollback path is rehearsed before the pilot. |
| The legacy SHARED mapping turns out larger than sized. | The P1 estimate for the read branch and backfill exceeds a medium task. | Keep the workstream-one gate blocked. Ship the read branch and the team mapping for rows that map cleanly, tombstone the rest with an exception ledger, and keep the stricter private-extraction policy as decided. |
| Spend overruns. | A stage near its cap. | Stage caps, the harness cost guard, and the product spend guard. Stop and report rather than borrow. |
| Local infrastructure wedges during long runs. | OrbStack stops answering (four incidents so far). | Run long jobs on the devbox or native Surreal, with liveness probes that use real timeouts. |
| Merge bandwidth becomes the bottleneck. | Verified PRs waiting more than a day. | Batch merges at phase boundaries, and use stacked PRs with one verification each. |
Decisions taken
These are settled and the plan builds on them. Each has a line of reasoning so the choice can be revisited if the reasoning stops holding. Say so if one is wrong, and the plan changes.
project_memory_entities, is simpler to audit, and loses nothing a private recall needs (47640192).First execution slice
The first PRs, in order. Each one goes through independent verification and root gates before merge.
| # | PR | Tasks | Why now |
|---|---|---|---|
| 1 | Neighbour-page selection (#661, verified) | 2a1a7fee | Completes the partition stack on main. |
| 2 | Run the trust gate bundle in PR CI | c5ecc5b4 | Every later fix lands under the gates. |
| 3 | Budget the dream path and settle reservations to usage | bb650b6e a5b6cc73 | Bounds spend now that Opus runs at 1.6M. |
| 4 | Scope default recall and web pages to the current project | 672d5084 952d4340 | The most visible trust defect. |
| 5 | Let promoted patterns reach native recall | 3ed9000e | Prerequisite for the canary. |
| 6 | Delete and restore work from the CLI | 21495240 468693b1 | Small and user-facing. |
| 7 | Task family design and the first family | new | Starts the study's longest lead-time item. |
In parallel from day one: the residency bisect on the devbox (8a56f5c7), since it gates the scale fixes and needs no merges.
Evidence this plan leans on
| Measurement | Value | Source |
|---|---|---|
| Re-probe, n = 5, three headroom tasks: native vs raw vs no memory | 12/15 · 13/15 · 6/11 | SIBYL_1_4_EXECUTION.md, September 20 |
| Promoted procedures that were generic before #656 | 33 of 34 | task f7f38f5a |
| Same-family pair recall, 100-source pages: before join, with #659 | 35.2% → 40.4% | claim_95639fbb1c13 |
| Same, whole corpus partitioned at once with join, 1.6M / 3.2M | 82.3% / 85.1% | partition matrix, September 24 |
| Neighbour-page selection on the real job path (#661) | 76.7%, 9 cross-family | devbox validation, two identical passes |
| Scoped Opus 5.5 cycle, joined family | 1 procedure, $8.15 | #659 |
| cdn-batch-map: native vs raw, paired | 14/18 vs 9/20, +6 | b7bc8bf4 |
| Native minus derived items | 11/18 | b7bc8bf4 |
| Negative transfer on opaque keys | 10/10 both arms | b7bc8bf4 |
/graph on the 10.5K graph | 70 to 105 s or 500 | 8ea64f07 |
| Surreal resident memory under mixed load | 33 GB | defd7d5b |
| Ingest time per capture at depth | 100 to 700 s | e2ffa177 |
| LongMemEval-S with the truncating adapter | 26.2% | run 33300782053 |