Skip to content

feat(temporal_spine): flip ingest writer default ON, hold lane (#1064) - #1111

Merged
github-actions[bot] merged 2 commits into
mainfrom
feat/issue-1064-writer-flip
Jul 6, 2026
Merged

feat(temporal_spine): flip ingest writer default ON, hold lane (#1064)#1111
github-actions[bot] merged 2 commits into
mainfrom
feat/issue-1064-writer-flip

Conversation

@robotrocketscience

Copy link
Copy Markdown
Owner

What

Flip the ingest-time temporal-spine writer default from OFF to ON
(is_temporal_spine_write_enabled False → True). The retrieval lane
(is_temporal_spine_enabled) is deliberately left default-OFF.

Operator-directed (2026-07-06): the temporal-spine flip (#1064) was split
so the write-side ships now while the read-side waits for the retrieval
cutover.

Why split the flip

Per #1107, the staged lanes — including use_temporal_spine — are wired
into retrieve_v2() only; the production retrieve() hook path does not
expose them until the cutover (garsecg's #1107, Phase 2). So flipping the
lane on now would change bench/eval consumers but not what a live
host retrieves.

The writer, by contrast, is on the live ingest path
(ingest.pywrite_temporal_spine), so flipping it default-ON:

Flipping the writer now lets stores accumulate a dense, production-proven
spine ahead of the read-side flip
, de-risking #1107 Phase 2 (temporal
spine is its pilot lane). No retrieval behaviour changes for live hosts
until that cutover.

Gates

Every pre-registered #1064 flip gate is satisfied: G1 (+14.6pp LoCoMo
coverage), G2 (production-budget trim survival + 1986/1986 top-rank
invariance), G3 (latency in-band), G5 (two-build determinism), and G4
migration (#1090, on main).

Blast radius

The writer flip is contained: a store with no TEMPORAL_NEXT edges is
unaffected, and the retrieval lane stays off so no ranking changes. Full
suite 5826 passed / 71 skipped / 75 xfailed. Per-flag opt-out
unchanged (AELFRICE_TEMPORAL_SPINE_WRITE=0 / [ingest] write_temporal_spine = false).

Tests updated to the default-on contract (resolver, ingest path, G4
auto-backfill gate), each with explicit opt-out coverage added; the
non-decisive env / malformed-TOML tests now assert against the
explicit=False lower rung so they still isolate non-decisiveness.

Relationship to #1092

This carves the writer half out of #1092 (the "flip both" HOLD draft).
After this merges, #1092 reduces to the lane-only flip, which folds
into #1107 Phase 2. Coordination note posted on #1092 and #1064.

Refs #1064. Does not close the umbrella (lane flip + #1107 cutover remain).

@robotrocketscience robotrocketscience added the author-Setr PR coordination mutex label Jul 6, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @robotrocketscience, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@robotrocketscience, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 21 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 80627b7c-d06e-4f33-9fd4-0d61efb978fc

📥 Commits

Reviewing files that changed from the base of the PR and between 55e2629 and 64f345c.

📒 Files selected for processing (5)
  • CHANGELOG/v3.md
  • docs/design/feature-temporal-spine.md
  • docs/user/CONFIG.md
  • src/aelfrice/temporal_spine.py
  • tests/test_temporal_spine.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/issue-1064-writer-flip

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

PR-size soft cap

This PR is over the advisory size threshold:

  • 140 changed lines (limit: 200)
  • 5 changed files (limit: 3)

Bigger PRs collide with more open work, which under the parallel-session workflow tends to produce repeated attn:merge-conflict cycles (see #602). When practical, split into smaller PRs that each touch a focused surface.

This is advisory only — nothing is blocked. If the size is intentional (large refactor, module removal, generated code), apply the size:override label and this comment will be removed on the next push.

Flip is_temporal_spine_write_enabled default False -> True. Every
pre-registered flip gate passed (G1 +14.6pp LoCoMo, G2 trim survival +
top-rank invariance, G3 latency, G5 determinism) and the G4 auto-once
backfill (#1090) is on main, so fresh ingests chain TEMPORAL_NEXT edges
by default and existing stores backfill on first `aelf setup` after
upgrade. Per-flag opt-out unchanged (AELFRICE_TEMPORAL_SPINE_WRITE=0 /
[ingest] write_temporal_spine=false).

The retrieval lane (is_temporal_spine_enabled) stays default-OFF: it is
wired into retrieve_v2 only and is inert on the production retrieve()
hook path until the #1107 cutover. Flipping the writer now lets stores
accumulate a dense, production-proven spine ahead of that read-side flip.

Tests updated to the default-on contract: resolver default, ingest path,
and the G4 auto-backfill gate now assert default-on, with explicit
opt-out (env/TOML off) coverage added for each; the non-decisive env /
malformed-TOML tests assert against the explicit=False lower rung so
they still isolate non-decisiveness. Full suite 5826 passed.
Reconcile the design doc Status line + flip-gate section, CONFIG.md
(inline [ingest] sample and the write_temporal_spine reference), and the
CHANGELOG [Unreleased] entry to the split posture: the ingest writer is
default-ON as of the v4.0 #1064 flip, while the retrieval lane
(use_temporal_spine) stays default-off until the retrieve_v2 production
cutover (#1107, its Phase 2). Correct the stale 'both flags flip
together at release time' claim in CONFIG.md.
@robotrocketscience
robotrocketscience force-pushed the feat/issue-1064-writer-flip branch from 52bbb16 to 64f345c Compare July 6, 2026 22:46
@robotrocketscience

Copy link
Copy Markdown
Owner Author

[claim:review:garsecg:2026-07-06T22:46:54Z]

@robotrocketscience

Copy link
Copy Markdown
Owner Author

Review: APPROVE (operator-authorized writer-half flip confirmed).

Reviewed all axes:

  • Source (temporal_spine.py): default fallback rung False → True; env > explicit-kwarg > toml > default precedence preserved. Writer only — retrieval lane (is_temporal_spine_enabled) untouched, stays default-OFF.
  • Tests: symmetric opt-out coverage — env=0 / toml=false both force off; ingest chains by default and is suppressed on opt-out; auto-backfill runs once by default and defers on opt-out. The two non-decisiveness tests correctly re-anchor to the explicit=False rung so they still isolate "env/toml did not decide" rather than passing by coincidence against the new default.
  • Docs: CHANGELOG + CONFIG.md accurately reflect writer default-ON, lane default-OFF (inert on the live retrieve() path until the epic(retrieval): converge production hook onto retrieve_v2 — staged lanes are not on the live path #1107 cutover).
  • Mechanics: FF-clean on main, both commits signed, discretion-clean, full CI green (pytest 3.12/3.13 pass, suite 5826 passed per body).

Blast radius contained: retrieval unchanged for live hosts; writer starts chaining TEMPORAL_NEXT and arms the G4 auto-once backfill. Merging via ready-to-merge.

@robotrocketscience robotrocketscience added the ready-to-merge Trigger merge-train: FF main to this PR's head label Jul 6, 2026
@robotrocketscience

Copy link
Copy Markdown
Owner Author

[release:review:garsecg:2026-07-06T22:49:54Z]

@github-actions
github-actions Bot merged commit 64f345c into main Jul 6, 2026
28 checks passed
@github-actions github-actions Bot removed the ready-to-merge Trigger merge-train: FF main to this PR's head label Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

merge-train: merged 64f345cmain via FF push.

robotrocketscience added a commit that referenced this pull request Jul 21, 2026
The #1107 lane graduations and the #769/#1111 flips left pre-flip prose in
the resolvers' own docstrings and CONFIG.md: temporal-spine writer + lane
(temporal_spine.py module/resolver/backfill docstrings, CONFIG.md
use_temporal_spine self-contradiction), entity-persist demotion (flag
comment + 'reachable only from retrieve_v2' claim, contradicted by the
#1107 shim), and type-aware compression (flag comment + retrieve()/
retrieve_with_tiers docstrings, default True since #769). Only the
default/reachability claims change; what each flag does is untouched.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

attn:review Needs review (PR open, awaiting reviewer) author-Setr PR coordination mutex

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant