fix(w6): restore dead operator surfaces — preferences, team-templates, skills route order, live profile pill (rows ②③⑤)#56
Merged
Conversation
…plates route, skills route order, live profile pill
W6 rows ②③⑤ — all restorations of shipped-but-unwired behavior, no new
features:
Row ② /api/preferences 404 end-to-end: components/evy/preferences.ts
(v2.8.1) shipped complete but server.ts never mounted its HTTP surface,
and tools/preferences.ts was never registered. Mount GET /preferences,
POST/DELETE /preferences/<cat>/<key>, POST /preferences/reset (gated on
{confirm:true}) — the exact wire shape the dashboard proxy + Preferences
tab were built against — and register evy_get_preferences /
evy_set_preference in the tool registry.
Row ③ /api/team-templates 404: components/evy/team-templates.ts (v2.8.0)
and the Templates tab both shipped, route never mounted. Mount GET
/api/team-templates (listTemplates → {ok,templates,errors}) and GET
/api/team-templates/<name> (loadTemplate → {ok,template}, 404 on miss).
Row ③ /api/skills/categorized 400: the GET /api/skills/(.+) catch-all
predated the v2.8.1 categorized + evy/* routes and sat ABOVE them, so
"categorized" parsed as a one-segment skill id → 400, and
/api/skills/evy/<name> GETs never reached their handler. Catch-all moved
to the end of the /api/skills section; behavior for real skill ids
unchanged.
Row ⑤ profile-pill staleness: the pill opened its own one-shot
EventSource on /api/master/events with no reconnect — the first drop
(master restart, sleep/wake) killed its real-time path until page
reload. It now rides the canonical connect() lifecycle in tabs/chat.js
via lazy module-scope hooks: profile_swapped frames paint instantly, and
every SSE [re]connect re-fetches /api/profile. 30s poll fallback stays.
Gates: bun test dashboard/__tests__/ 196 pass / 0 fail; preferences +
team-templates suites 47 pass / 0 fail. Curl-proven on a scratch
master+dashboard pair (18788/18787): all previously-4xx endpoints 200
with the tab-expected payloads; skills catch-all regression-checked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.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.
W6-B v3 slice (worker w6-restore, orchestrator-verified).
/api/preferences404 → mounted the never-mounted preferences module incomponents/evy/server.ts(GET/POST/DELETE/reset, exact wire shape the tab was built against) + registered both evy preference tools (boot tool count 79→81)./api/team-templates404 → routes mounted onto the existing v2.8.0 TOML-roster module (list + detail, 5 seeded templates prove out)./api/skills/categorized400 → route existed but was shadowed by the/api/skills/(.+)catch-all; catch-all moved to section end (also un-shadows/api/skills/evy/<name>).connect()lifecycle:profile_swappedframes paint instantly, every SSE (re)open re-fetches/api/profile; 30s poll fallback retained.Orchestrator verification: dashboard suite 196/0 + touched-module suites 47/0 reproduced in clean worktree; zero merge conflicts vs main (incl. W6-C); hunk ranges disjoint from tier1 block. Worker's end-to-end curl proofs ran on scratch servers (18787/18788, scratch config); live re-proof lands at W6 wave close after service restart. 3 found-latents closet-logged (#423–425).
Release stamping at W6 wave close.
🤖 Generated with Claude Code