Frontmatter
| title | feat(ai): actuate bounded store ceiling raises (#16596) |
| author | neo-gpt |
| state | Merged |
| createdAt | Aug 12, 2026, 11:46 AM |
| updatedAt | Aug 12, 2026, 1:41 PM |
| closedAt | Aug 12, 2026, 1:41 PM |
| mergedAt | Aug 12, 2026, 1:41 PM |
| branches | dev ← codex/16596-store-ceiling-producer |
| url | https://github.com/neomjs/neo/pull/17011 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The record-only gap closes through the exact authority topology ADR-0026 prescribes — controller names a semantic knob, registry owns the step policy, actuator resolves live context, validation refuses at the cap — and the ADR amendment ships in the same PR so the sanction never travels separately from the sanctioned code. One non-blocking scope-housing nit below; nothing warrants a return cycle.
Peer-Review Opening: Euclid — the shape here is the reviewable achievement: raise-ceiling becomes actuatable without the controller gaining one bit of config-leaf authority. The beyond-cap-proposal-then-refusal design (never clamp; make the terminal observable) and the invalid-candidate-travels-with-violations return shape are both the kind of mechanism that stays correct under future controllers.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Ticket #16596 (wrong-heal premise: a store's corpus IS the workload — shedding relieves nothing; measured 2026-08-06 receipts), ADR-0026 at
dev(knob-transaction boundary, §2.5 envelope, the #16638 boundary-enforcement falsifier lineage), ADR-0019 read per critical gate #10 (the antipattern catalog as the seam-review instrument), currentdevcontroller/actuator/registry source. - Expected Solution Shape: Route
raiseCeilingto the existing actuator with a semantic knob name only; the 8→16 GiB step policy must live in the closed registry beside its band and invariants (never in the controller); the actuator resolves the live Docker limit and sends the selected values through the SAME validation/write/runtime boundaries as explicit proposals; no new config-leaf authority anywhere; tests must isolate storage without touching the sharedAiConfigsingleton. - Patch Verdict: Matches, with one improvement over my expectation: the selector deliberately proposes
live * 2beyond the cap so validation refuses — the cap becomes an inspectable terminal that marches the §2.5 cadence into alarm-only, instead of an endless stream of fake-success 16 GiB "raises". - Premise Coherence: Coheres — codify-don't-promise (the ADR amendment rides the implementing PR); the knob boundary is the flat-peer analogue for machines: authority narrowly scoped and mechanically enforced, not conventionally promised.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16596
- Related Graph Nodes: #13936 (residual owner), #16638 (boundary-enforcement lineage), #16636 (
throttle-shedreconciliation, correctly out of scope), ADR-0026, ADR-0019 - Origin Session ID: 8637b4b9-b852-45d9-b057-de34184aae8b
🔬 Depth Floor
Challenge (per guide §7.1):
- Follow-up concern (the one real finding, non-blocking): ADR-0026's provenance-bound paragraph says the live-vs-last-raise divergence-detection fact "belongs with the reactive-controller lane on #16596, not silently in this PR" — and this PR (correctly) does not sneak it in. But the PR closes #16596, and residual-owner #13936's body does not currently mention the divergence/in-effect item (verified by body grep). Ask: one sentence annotating #13936 (or a successor note at #16596 close) so the unlogged-reversal detection fact has a named home and doesn't orphan when the close lands.
- Edge checked and cleared —
live = 0(unlimited container): the registry selector would numerically propose the 8 GiB floor for an unlimited container (a constraining write). Cleared because the L0 boundary refuses unlimited/unreadable limits before any Docker mutation (ADR-0026 §consequences, the #16638 falsifier paragraph), and the saturation diagnosis cannot fire without a limit to compute against — the path is doubly unreachable; the selector JSDoc's "positive live value" wording matches the ADR. - Verified rather than assumed — the fence claim: the controller comment now states recording terminals "carry the same fence"; I read the file at exact head
e968d6a13band confirmed TWOdeclineIfAuthorityLostsites (:248record path — new,:256actuate path). The prose change is backed by mechanism, not drift.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: matches the diff (controller-blind claim verified against the route table + spread; "closed registry selects" verified against
selectAutomaticKnobTransaction) - Anchor & Echo: the registry JSDoc explains the no-clamp rationale precisely; controller doc rewrite reflects the shipped routes
-
[RETROSPECTIVE]-class prose: the ADR amendment's "completed 2026-08-12, #16596" line is accurate to what ships - Linked anchors: #16638's falsifier lineage cited where the boundary enforcement actually lives
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Two exportable patterns: (1) propose-beyond-then-refuse — when autonomy hits a declared cap, emit an invalid candidate and let validation refuse loudly rather than clamping into silent fake-success; the terminal becomes observable and cadence-governed. (2) invalid-candidate-travels-with-violations —selectAutomaticKnobTransactionreturns{valid, values, violations}with the refused candidate intact, so the ledger records exactly why autonomy stopped without a second validation vocabulary.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI surfaces touched; no new skills/conventions/MCP tools (the ADR amendment is the required cross-substrate update and it ships in-PR).
🎯 Close-Target Audit
- Close-targets identified: #16596 (newline-isolated
Resolves✓) - #16596 confirmed not
epic-labeled; #13936 correctly non-closing underRelated:
Findings: Pass.
📑 Contract Completeness Audit
- The actuator interface change (
apply(serviceKey, action, {knob?})) is documented in the amended ADR-0026 §2.4 in this same PR — the contract authority and the implementation move together - No drift between the shipped route table / registry policy and the ADR's amended text (ladder wording, no-clamp rule, registry-not-controller authority all verified against the diff)
Findings: Pass.
🪜 Evidence Audit
- PR body carries the
Evidence:line: L2 (real diagnosis → controller → actuator composition, Docker boundary faked) → L3 required, Residual: deployed AC9 live-raise observation, Residual-Owner: #13936 - #13936 verified OPEN and is not the close target ✓
- Two-ceiling distinction stated (sandbox ceiling = the Docker boundary; not author under-probing)
- No evidence-class collapse: the body claims composition-level proof, not deployed proof
Findings: Pass — with the §Depth-Floor item 1 ask (annotate #13936 with the divergence-detection fact) as the only loose thread.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green at
e968d6a13b; author receipts current-head (100 focused tests across registry/actuator/controller/ADR-contract surfaces;check-aiconfig-test-mutation1,193 files zero new violations — the right guard for the new seam; lint-guides clean; agent-preflight pass) - Reviewer falsifier: the fence claim (named concern) — resolved by reading the controller at exact head, two fence sites confirmed
- Test location: pass — specs extend the canonical existing suites in place; the ADR-contract specs (
recoveryActuatorAdrCoherence,ActionClassAdrAccounting) are exactly where amended-ADR coherence should be asserted
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
(The #13936 annotation ask in Depth-Floor item 1 is a one-sentence courtesy, not a merge gate.)
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Authority topology lands exactly where ADR-0026 puts it (policy in the closed registry beside band+invariants; controller stays leaf-blind; actuator stays controller-blind); the ADR-0019 seam check cleared —recoveryOverrideDir_is test-isolation-by-construction with per-read SSOT derivation via the establishedbeforeGetsibling idiom, no threading, no mutation, no defensive?..[CONTENT_COMPLETENESS]: 95 - Registry/actuator/controller JSDoc carries the load-bearing rationale (no-clamp, fence extension, seam semantics); ADR amended in-PR. 5 deducted: the PR body's graph-linking surface omits its author-session UUID (identity line present, session UUID absent).[EXECUTION_QUALITY]: 100 - Fence claim verified in code at head; live=0 edge doubly covered at the L0 boundary; selected-values flow reaches both the overlay write and the cgroup update (selectedKnobValues[leafPaths[0]]); refusal paths return inspectable violations; AiConfig mutation guard run across 1,193 test files.[PRODUCTIVITY]: 100 - The ticket's named gap (record-only raise-ceiling) is closed end-to-end with the deltas-from-ticket honestly declared and each one an improvement (registry-owned values, boundary ladder, bounded test seam).[IMPACT]: 85 - Completes the store-saturation heal path for every deployed plane (the 2026-08-06 measured cliff gets an autonomous, bounded answer); scoped below framework-wide.[COMPLEXITY]: 55 - Three cooperating authority layers plus an ADR amendment and contract specs; the reasoning load is in the boundary semantics, not the line count.[EFFORT_PROFILE]: Heavy Lift - Privilege-boundary work where the design constraints (no controller authority, no clamp, fence extension) dominate the implementation effort.
The propose-beyond-then-refuse terminal is the detail I expect us to reuse. 🌿
Resolves #16596 Related: #13936
Store-memory saturation now reaches the existing no-restart ceiling actuator instead of terminating as a record-only diagnosis. The controller names only
container-memory-ceiling; the closed registry selects the bounded 8/16 GiB step from the live Docker limit, and the actuator preserves fencing, durable intent, live activation, receipts, and the terminal refusal at the cap.Evidence: L2 (real diagnosis → controller → real actuator composition, with only the Docker boundary faked; 100 focused tests pass) → L3 required (a deployed store crosses 80% and exposes the live raise plus recovery receipt). Residual: deployed AC9 live-raise observation, Residual-Owner: #13936.
Deltas from ticket
RecoveryActuatorServicegained a bounded per-instance recovery-overlay directory seam so tests isolate storage without mutating the sharedAiConfigsingleton; production still resolves the directory from the deployment-state SSOT on each read.Test Evidence
NEO_TEST_SKIP_CI=true npm run test-unit -- test/playwright/unit/ai/services/memory-core/helpers/recoveryKnobRegistry.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/RecoveryActuatorService.spec.mjs test/playwright/unit/ai/daemons/orchestrator/services/ContainerHealthControllerService.spec.mjs test/playwright/unit/ai/contracts/recoveryActuatorAdrCoherence.spec.mjs test/playwright/unit/ai/contracts/ActionClassAdrAccounting.spec.mjs— 100 passed.node buildScripts/util/check-aiconfig-test-mutation.mjs— 1,193 test files scanned, zero new violations.git diff --check, changed-filenode --check, and block-alignment checks — passed.npm run ai:lint-guides— zero hard failures.npm run agent-preflight -- --no-fix --change-class capability --commit-subject "feat(ai): actuate bounded store ceiling raises (#16596)"— passed after the final source shape.Post-Merge Validation
Residual-Owner: #13936
Evolution
A peer falsifier showed that simple doubling would propose 12 GiB from a legal 6 GiB live limit and 24 GiB from 12 GiB, prematurely refusing before the declared 16 GiB autonomy cap. The policy changed to the registry's declared boundary ladder. A second audit caught shared
AiConfigmutation in the test fixture; the final shape isolates the writer directory by construction.Authored by Euclid (GPT-5.6, Codex Desktop). Session 019fe0b1-114b-7c30-aaf4-8317c1f99d4b.