Skip to content

feat(boot): surface oldest-paused age + cliff in cross_passage#440

Merged
eris-ths merged 1 commit into
mainfrom
feat/boot-oldest-suspended-alarm
Jun 18, 2026
Merged

feat(boot): surface oldest-paused age + cliff in cross_passage#440
eris-ths merged 1 commit into
mainfrom
feat/boot-oldest-suspended-alarm

Conversation

@eris-ths

Copy link
Copy Markdown
Owner

Why

A bare suspended count in gate boot's cross_passage reads the same whether the oldest pause is two hours or two months old — so a long-forgotten thread hides inside the count. The PassageOrientationSummary type comment already named this gap: "records must also be findable on re-entry... substrate that exists on disk but isn't surfaced at orientation might as well be silent." The count surfaces existence, but not staleness, and staleness is the cue an agent needs.

Found by dogfood: an agora play sat suspended 39 days with its conclusion fully intact (a four-move discussion that had reached a decision), because every re-entry only ever saw agora: ... (3 paused) and skimmed past it. The thread wasn't lost — it was uncountable as stale.

What

Add two optional fields to each passage's orientation summary (null when nothing is paused):

  • oldest_suspended_age_days — whole days since the longest-paused record was suspended
  • oldest_suspended_cliff — that record's one-line closing cliff

This turns boot into a forgotten-thread alarm. Text mode renders an alarm line under the passage when the oldest pause is at least a day old:

agora: 4 open (3 paused); last 2026-06-18-001 [suspended]
  ↳ oldest paused 39d ago: <cliff prose>

Full cliff/invitation prose still lives at each passage's own read verbs (agora show); orientation carries only the single line that lets an agent decide resume-now vs leave-paused without walking the records — consistent with the existing "count + recency cues, detail stays at read verbs" split.

Changes

  • PassageOrientation — two optional fields, documented as the staleness cue the count can't carry
  • agora orientation — pick the longest-paused play (oldest last-suspension timestamp), expose its age in whole days + closing cliff
  • bootRender — emit the alarm line under the passage (≥ 1 day threshold; clean board stays silent — voice budget)
  • schema — extend the cross_passage entry-shape contract (schema-as-contract)
  • tests — assert the fields populate when paused and stay null when clean (both branches of crossPassageBoot.test.ts)

Design notes

  • Closes the other half of records-outlive-writers: records must be findable on re-entry, not merely countable.
  • Fields are optional on the shared type so passages that don't model suspensions (e.g. ctx) simply omit them.
  • The renderer threshold (≥ 1 day) keeps a freshly-suspended thread from adding noise to the same session that paused it.

Tests

New assertions in crossPassageBoot.test.ts pass (tsc clean). Pre-existing failures in this working tree (lore-scope.sh, #239 --executor deprecation) are unrelated to this change — they touch neither the orientation path nor the renderer, and reproduce on main without this branch.

A bare `suspended` count in cross_passage reads the same whether the
oldest pause is hours or months old, so a long-forgotten thread hides
inside the count. Add `oldest_suspended_age_days` and
`oldest_suspended_cliff` to each passage orientation summary (null when
nothing is paused), turning boot into a forgotten-thread alarm. Text
mode renders an `↳ oldest paused Nd ago: <cliff>` line when the oldest
pause is at least a day old.

Found by dogfood: an agora play sat suspended 39 days with its
conclusion intact, because re-entry only ever saw the count. This closes
the other half of records-outlive-writers — records must also be
*findable* on re-entry, not merely countable (the PassageOrientation
type comment already flagged this gap).

- PassageOrientation: optional age + cliff fields, documented as the
  staleness cue the count can't carry
- agora orientation: pick the longest-paused play (oldest last-suspension
  timestamp), expose its age in whole days + closing cliff
- bootRender: emit the alarm line under the passage (>= 1 day threshold)
- schema: extend cross_passage entry-shape contract
- tests: assert fields populate when paused, stay null when clean
@eris-ths eris-ths merged commit 52bb345 into main Jun 18, 2026
5 checks passed
@eris-ths eris-ths deleted the feat/boot-oldest-suspended-alarm branch June 18, 2026 06:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant