Repository navigation
feat(planning): detect an interview page server older than the page it serves #9718
Copy link
Copy link
Open
Open
Copy link
Labels
agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.Fully specified and briefed; eligible for autonomous pickup from the frontier.needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.Human-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.Triaged, unblocked, and fully specified; eligible to pick up.
Description
Parent
Refs #5796
Depends on
- none: on the frontier now
Outcome
A page server started before a plugin update is detected and restarted instead of silently running old logic
(gap G10; not done on main: no /api/state field reports the server's plugin version).
/api/statereports the server's plugin version and a hash of its own source, taken at start.- The page compares them with its embedded version and shows "This page's server is older than the page. Run
ensure-running to restart." round.sh ensure-runningrestarts a running server whose recorded version differs from the installed one.watch.shprints anote:line when it sees the mismatch.
Key interfaces
- Interview page:
plugins/planning/surface/index.html; page server:plugins/planning/surface/server.py
(record(),derive_states); round CLI:plugins/planning/surface/round.pybehindround.sh;
exporters:plugins/planning/surface/exporters.py. - The interview skill's surface contract,
plugins/planning/skills/interview/context/surface.md, documents
every new op, field, setting and refusal. plugins/planning/surface/watch.sh.
Done when
- A server test reads
/api/stateand finds the plugin version and source hash fields. - A test starts a server with a recorded version different from the manifest's, runs
ensure-running, and finds a new server PID serving the manifest version. - A page test with a mismatched version shows the banner.
-
bash plugins/planning/surface/watch.test.shexits 0 with a case asserting thenote:line. -
scripts/run-test-file.sh plugins/planning/surface/test_server.pyexits 0. -
scripts/run-test-file.sh plugins/planning/surface/test_round.pyexits 0. -
bash plugins/planning/surface/surface.test.shexits 0, so a data dir without the new fields still loads, renders and exports. -
scripts/check-changelog-fragments.sh --check-required origin/mainexits 0.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.Fully specified and briefed; eligible for autonomous pickup from the frontier.needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.Human-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.Triaged, unblocked, and fully specified; eligible to pick up.
Type
Fields
No fields configured for Feature.
Activity
melodic-automation-lanes commentedon Oct 24, 2026
The work-resolve-issue run that
agent-readystarted failed or was cancelled before it reported, or it stopped or the token broker refused it because its workflow files differ from main's. work-unblock removed and addedagent-readyback to start a fresh run on main's workflow files. It does this once per version of those files, so if this run fails the same way, a person looks at it.melodic-automation-lanes commentedon Oct 24, 2026
The work-resolve-issue run that
agent-readystarted ended over 3 hours ago with no report and no pull request. work-unblock already re-fired it once on these lane workflow files, so it no longer does, and the issue would hold a place in the issue lane's queue with nothing running. It addedneeds-human. To try again, removeneeds-human, then removeagent-readyand add it back.