Running-parents via live spawn edges, honest live tokens, always-live open panels (round N) #39

Merged
ClaudiuSchuster merged 1 commit from oss-oo/observatory-round-n-nkyn20260925 into main 2026-09-25 11:23:52 +00:00
Owner

Round N — three owner findings, all validated 23/23 green (fixture harness + fake live dispatchers + CDP; evidence in /tmp/pinky-polish4-evidence/).

1. Running sessions show no parent — root cause corrected forensically. The bell ledger DOES apply its edges in family_maps, but its records only exist once a child COMPLETES (dispatch.py ledgers at notify/bell-spawn time, not child-spawn time) — a running child has no record yet. The true spawn-time linkage lives on the child dispatcher command line: --notify-parent <sid> plus the session id in the --out result JSON. New live_spawn_parents() scans /proc for exactly those processes (new-child spawns only — steers/bells/notify resumes all carry --resume and never match), read-only, sid-shape-validated, parent must be a known session, never overriding an established parent (native parent_id wins). When the child completes, the dispatcher exits and the ledger record takes the edge over — same parent, seamless (verified live on the real system this round: my own session resolved its parent while running, the ledger carried it after completion).

2. Running sessions show 0/0 tokens — turn_usage rows only exist at completion. A running first turn now renders a mint "live" in the tokens cell (tooltip explains when the numbers land); real sums from earlier completed turns keep rendering as numbers. The optional partial-usage stretch was skipped: during a first turn there are no step-finish parts yet either, so "live" is the honest answer.

3. Open panel froze while the owner typed. Root cause: the response modal parks its 5 s poll once a session looks quiet (round-J design), but nothing ever RESUMED it — a bell ringing in later left the panel frozen at its last fetch while the dock badge (global 5 s poll) kept blinking, exactly the reported asymmetry. No typing-guard exists. Fix: the quiet-stop records a quiet baseline (last transcript activity); the global 3 s sessions refresh resumes the modal poll the moment activity passes it (or the session runs, a steer queues, a question pends). The resumed render re-parks instantly when quiet again — each new message renders within one 3 s cycle without a permanent poll on a static session. Bonus hardness for the same contract: follow-off/paused re-renders (drawer AND modal) now keep the exact scrollTop around the innerHTML rebuild (was left to browser scroll anchoring, which drifted the reading position — found by the new regression).

CDP regression added: open panel, park, type a draft, inject a doorbell → appended within one cycle, draft + focus preserved, follow-ON tail scroll, follow-OFF exact scroll position kept.

Gates: pinned Super-Linter slim v8.7.0 (pylint 10.00/10, ruff, markdown), py_compile, node --check.

Round N — three owner findings, all validated 23/23 green (fixture harness + fake live dispatchers + CDP; evidence in /tmp/pinky-polish4-evidence/). **1. Running sessions show no parent — root cause corrected forensically.** The bell ledger DOES apply its edges in family_maps, but its records only exist once a child COMPLETES (dispatch.py ledgers at notify/bell-spawn time, not child-spawn time) — a running child has no record yet. The true spawn-time linkage lives on the child dispatcher command line: `--notify-parent <sid>` plus the session id in the `--out` result JSON. New `live_spawn_parents()` scans /proc for exactly those processes (new-child spawns only — steers/bells/notify resumes all carry --resume and never match), read-only, sid-shape-validated, parent must be a known session, never overriding an established parent (native parent_id wins). When the child completes, the dispatcher exits and the ledger record takes the edge over — same parent, seamless (verified live on the real system this round: my own session resolved its parent while running, the ledger carried it after completion). **2. Running sessions show 0/0 tokens** — turn_usage rows only exist at completion. A running first turn now renders a mint "live" in the tokens cell (tooltip explains when the numbers land); real sums from earlier completed turns keep rendering as numbers. The optional partial-usage stretch was skipped: during a first turn there are no step-finish parts yet either, so "live" is the honest answer. **3. Open panel froze while the owner typed.** Root cause: the response modal parks its 5 s poll once a session looks quiet (round-J design), but nothing ever RESUMED it — a bell ringing in later left the panel frozen at its last fetch while the dock badge (global 5 s poll) kept blinking, exactly the reported asymmetry. No typing-guard exists. Fix: the quiet-stop records a quiet baseline (last transcript activity); the global 3 s sessions refresh resumes the modal poll the moment activity passes it (or the session runs, a steer queues, a question pends). The resumed render re-parks instantly when quiet again — each new message renders within one 3 s cycle without a permanent poll on a static session. Bonus hardness for the same contract: follow-off/paused re-renders (drawer AND modal) now keep the exact scrollTop around the innerHTML rebuild (was left to browser scroll anchoring, which drifted the reading position — found by the new regression). CDP regression added: open panel, park, type a draft, inject a doorbell → appended within one cycle, draft + focus preserved, follow-ON tail scroll, follow-OFF exact scroll position kept. Gates: pinned Super-Linter slim v8.7.0 (pylint 10.00/10, ruff, markdown), py_compile, node --check.
Running-parents via live spawn edges, honest live tokens, always-live open panels (round N)
All checks were successful
Checks / Functional checks (pull_request) Successful in 14s
647e5a9988
- live_spawn_parents(): a RUNNING child resolves its parent from its own
  dispatcher command line (--notify-parent + the session id in the --out
  result JSON) — the bell ledger only records the link at child
  completion, so running children had no parent; edges merge into
  family_maps with the never-guess/never-override rules (native wins),
  and the ledger takes over seamlessly when the child completes
- tokens cell of a running FIRST turn renders a mint 'live' instead of a
  misleading 0/0 (turn_usage rows only exist at completion); real sums
  from earlier turns keep rendering as numbers
- open response modal: the quiet-stop that parked the 5 s poll now
  records a quiet baseline, and the global 3 s refresh resumes the poll
  on any new activity (doorbell in, turn start, queued steer, pending
  question) — the open panel live-updates exactly like the dock badge;
  typed drafts and focus are never touched (input lives outside the
  re-rendered body)
- follow off/paused re-renders (drawer + modal) keep the exact
  scrollTop around the innerHTML rebuild (was left to browser scroll
  anchoring, which drifted the reading position)
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
OSS-Singularity/zcode-dispatch-observatory!39
No description provided.