feat(控制台): Console P4 操作者双生与配线架界面 - #52
Merged
Merged
Conversation
Workspace detail projects a fail-closed operator twin (计划 / 里程碑 / 阶段 / 谁在跑) and restyles the page as a one-level family patchbay. Version stays 0.7.8. Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Dandre126
marked this pull request as ready for review
August 20, 2026 22:23
Live ingest no longer replays an events prefix over the GET snapshot. Inspection binds twin rows to inventory. Tests invert each P0/P1 polarity. Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
Lock GET projected_seq and overlay_complete onto the first live page with inverted tests: a real >50-row overlay must supply the merge floor, and a truncated GET must fail-close before prefix merge. Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
workspace() config fallback returned empty_operator_twin unchanged with overlay_complete true, so a live prefix could invent 谁在跑 and 会审已落下. Default the empty twin fail-closed. Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Workspace detail now has a read-only operator twin of the line, and the Console page is restyled as a finished one-level family patchbay. Version stays 0.7.8. Do not merge this PR as a release cut.
Why
The operator sitting next to harness CLI needs one page that answers: what is this 开发线 family doing right now, and what one overlay decision should I leave? That is not a second IDE and not a command-center dump.
P4 product
On the existing workspace detail (no new top-level nav; hash stays
#w/<alias>and#w/<alias>/family|events|channel):objective_wavefills those lanes; unknown ids do not invent backlog.incomplete | complete | repair_requiredonly.task_statusmoves a known task only.in_progresstasks: executor, latestdispatchfacts, whether a matchingboardevent landed, plus one redacted latest ledger line.decision|contract|ack. Copy actions stay--dry-runwithout--yes.Missing or truncated wave / dispatch / board / ledger fail closed. Workspace GET does not create
.dyro/events.lockand does not appendevents.jsonlor ledger in place.Live merge (P0 + GET floor)
GET already projects the full overlay. The first SSE/poll page is the oldest 50 rows.
mergeTwinFromEventsapplies only rows newer than GETprojected_seq, and only when GEToverlay_completeis true. A truncated or missing tail fail-closes to the snapshot.empty_operator_twindefaultsoverlay_completefalse, so aworkspace()config fallback cannot treat an unread overlay as complete.Inverted locks:
_workspace_configraises.test_workspace_fallback_empty_twin_fail_closes_before_prefix_mergeasserts that GET twin isoverlay_completefalse, then feeds that exact GETdataplus a 50-row in_progress/board prefix throughrenderOperatorTwin+mergeTwinFromEvents. Expect no 谁在跑 / 会审已落下. Goes red ifempty_operator_twinkeepsoverlay_complete: Trueand_operator_twinreturns it unchanged.task_status→in_progress+board, inventorydone) must put that last seq onworkspace()["data"]["operator_twin"]["projected_seq"]. The live harness feeds that exact GETdatathroughtwinFromData/renderOperatorTwinand the first 50 events. Expectdone,running=[], no会审已落下.events.jsonl,project_operator_twinandworkspace()must reportoverlay_complete is False. The live case uses onlytwinFromData+renderOperatorTwin(no harness restubs) thenmergeTwinFromEventsof the prefix page.Token plan
Implemented from this palette (also in
styles.css):--bay#141A1F--chassis#1E272E--plate#2A343C--ticket#E4DDD0--mute#8E9388--filament#C9864AType:
ui-serifnameplates,ui-sans-serifbody,ui-monospaceIDs/CLI. Layout: overview is a quiet strip; workspace is a room with the family bay in camera focus, the twin as the now-reading, and inventory/proofs receded. Signature: one-level family graph as a living patchbay. One motion: edge light on merge/sync (and a brief wave-lane pulse).prefers-reduced-motionturns the filament off.No three.js, WebGL, npm UI kits, Google fonts, icon CDNs, WebSocket, or service worker. CSP +
textContentonly. New CSS/JS stay in the wheel manifest with digests.Tests lock
projected_seqis the live floor for a real >50-row overlayoverlay_completefalse; prefix merge cannot invent 谁在跑overlay_completefalse; prefix merge cannot invent 谁在跑board_landedrequires a matching board for that taskobjective_wavedoes not invent a lane; other-taskboarddoes not landin_progressevents.jsonlor ledger hashesWebSocket/serviceWorker/webgl(case-insensitive)family|events|channel--dry-runand never--yesCHANGELOG is under Unreleased only. Not merge-ready as a release cut.