You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The dashboard for the skills architecture, from #1768. This issue is the plan and the questions. Nothing is built yet.
What exists. One React app inside the framework package, served by the daemon with an SPA fallback. Seven routes: the Overview, a project's launcher, a run's page, /tickets, a ticket's page, a ticket's plan, and /settings. The sidebar has Overview, Tickets, Projects and Settings as literal rows. Every skill's data reaches the browser through the framework's own RPCs, and every skill's page or card is the framework's code. Nothing in the UI, the daemon or the registry says which skills a project uses: the four skills are hard dependencies of the framework, always linked into every checkout, always on every agent's PATH.
What is decided. From Dashboard architecture #1768: one page per skill (/tickets for the tickets, /agents for the logs), a hook for cards on the Overview (the dashboard's / page), and modularity over UX paper cuts. From the skills round: no skill imports another, the framework is the caller, and a skill is picked per repository by committing its files.
The questions. I need your call on six things. Each has its options in the plan below.
Q1, where a skill's dashboard code lives: inside the framework, one directory per skill behind a registry; or exported by the skill package; or a sibling package per skill.
Q2, how the dashboard knows which skills a project picked: the committed skills directory, package.json, a setting in the daemon's registry, or the data's presence.
Q3, the Overview, the dashboard's / page: each skill contributes one card and the framework keeps its own, or the Overview is framework-only with the skill pages one click away.
Q4, the pages, and the buttons that need two skills: the ticket page's Queue button, the hot tickets' queue lane, a claim's link to its run.
Q5, the runs when the logs skill is not picked: the run page is the framework's while a run lives; the finished run is the logs skill's, and without it the run is gone with its worktree. No second archive.
Q6, the order: logs first, since the framework already reads runs only through the skill's library, or tickets first, since its pages exist.
Names. Today's names, skill-<x>, <x>. /agents is your name for the logs page. A rename to skills-<x> changes nothing below.
PR shape is my call after the answers. No FEATURES-SPEC.md, SPEC or LOGIC files: main has none since the clean slate.
🤖 curated · Fable 5.1 — the plan, as the agent wrote it after reading every page, route, component and RPC of the dashboard on main (5c8d41d); I read it and I stand behind the questions above.
The plan
What it is. The dashboard today is one app that knows every skill. The skills are standalone packages now, and a repository picks the ones it wants. The dashboard has to show a page, a card or a control only for the skills that repository picked, and the code has to be arranged so that one skill's page is one skill's directory. This plan says what the code does now, where each surface belongs, and what has to change, question by question.
Where every surface belongs today. Paths under packages/framework/, dashboard/ is the browser, src/ is the daemon.
tickets; queue for the Queue buttons (TicketsPage.tsx:127,145,168, TicketDetailPage.tsx:41); logs for a claim's link (TicketsPanel.tsx:162-165, TicketPlanPage.tsx:46)
the queue
AiQueue.tsx, lib/queue-entry.ts, DocsPanel.tsx
queue; no page of its own; only TicketsPage.tsx:127 calls onQueue directly
19 of the 33 reads and 9 of the 17 controls go through a skill library; the joins are in src/dashboard/overview.ts, dashboard.ts, tickets.ts:48-55, interventions.ts
the server
src/dashboard/server.ts:224-274 one bundle dir, static.ts:43 SPA fallback, bundle.ts:20 one path
framework
the daemon
src/daemon.ts:212-250 wires the daemon's closures; src/daemon-runtime.ts:116-120 PATH, :127-131 the linked skills, marked temporary
framework
What "absent" means today. Two different things, and the plan keeps them apart:
The package is absent. Impossible: packages/framework/package.json:50-53 depends on all four, the daemon drains the queue through @gemstack/skill-queue, claims through @gemstack/skill-tickets, records through @gemstack/skill-logs, makes checkouts through @gemstack/skill-branches. The framework is the caller; it keeps every library.
The data is absent. This is what the UI handles already: no tickets/ on the branch gives an empty list (TicketsPage.tsx:386), no queue file gives "Nothing queued." (AiQueue.tsx:150), no runs give "No agents yet." (AgentHistory.tsx:270), a claim whose agent is not in the records is shown as written (src/dashboard/tickets.ts:53), the right rail offers a tab only when its read came back non-empty (RightRail.tsx:105-112).
So "the user did not pick the skill" is a third state that nothing knows. The one flag that exists is hasTickets (src/dashboard/dashboard.ts:17-21), the presence of a ticket file, read by the onboarding checklist alone (OnboardingChecklist.tsx:150). The sidebar's Tickets row has a prop that would hide it (AgentHistory.tsx:84-86,211), and the shell always passes it (App.tsx:420).
How a skill is picked, per the install tool. A skill package's skills are materialized as real, committed files under the repository's skills directory, .agents/skills/<name>/ by default or whichever */skills/ directories already exist, each with a source.json naming the package and version; never a link into node_modules (use-npm-skills 0.1.0, its DECISIONS.md "Materialize each skill"). The install here today: .agents/skills/logic-driven-development/ plus skills-lock.json. The four skills are not in any project's skills directory yet: the daemon links them into each checkout's .claude/skills and .agents/skills (src/daemon-runtime.ts:127-131, packages/skill-branches/src/skill-links.ts:20,59-70), git-excluded, and the project root gets none.
The join points, the reads that need two skills:
src/dashboard/overview.ts:288-342 (buildOverview): live runs, cloud runs from the records, the queue count.
src/dashboard/overview.ts:225-267 (buildHotTickets): tickets, the open queue entries, the live runs' tickets.
src/dashboard/dashboard.ts:48-72 (buildDashboard): the queue once, the overview, hasTickets per project. One RPC feeds three Overview cards.
src/dashboard/tickets.ts:48-55 (resolveHolders): a claim's holder matched against the records, named through branches.
src/dashboard/interventions.ts:87-184: open PRs on agent-* branches, parked runs, unpushed branches from the records.
src/dashboard-rpc/control.ts:351-382: queue a ticket, queue its plan.
Q1: where a skill's dashboard code lives
Story. You open packages/skill-tickets/. Today it holds the command, the library, SKILL.md and DECISIONS.md. The ticket pages, 2,200 lines, sit in packages/framework/dashboard/components/ beside the composer and the settings page, and their RPCs sit in src/dashboard-rpc/reads.ts beside the bridge's. Someone reads the tickets package to review its design, and does not find its UI. Someone reads the dashboard to remove tickets, and has to know which 12 files are the tickets'.
Options.
A. Inside the framework, one directory per skill, behind a registry.dashboard/skills/tickets/ holds the pages, cards and client stubs; src/dashboard-skills/tickets/ holds the RPC module and the reads. One registry file lists the four entries: name, nav row, routes, Overview card. The shell, the sidebar and the Overview read the registry and nothing else. The framework's build makes one bundle as today. The skill package stays what it is.
B. Exported by the skill package.@gemstack/skill-tickets/dashboard exports the same pages, React as an optional peer dependency; the framework's build imports the export and composes the bundle. This is the "super package": one package, the skill and its dashboard extension. The RPC side stays in the framework, since the handlers act through the daemon's context (src/dashboard/rpc-serve.ts:50-75), or moves too, behind a plugin contract for the daemon.
C. A sibling package per skill, @gemstack/skill-tickets-dashboard. Same as B with the React code out of the agent's install.
What A costs: the skill's UI lives outside the skill's package, and a third-party skill cannot bring a page. What B costs: a CLI package that carries React code and a design system, a contract for what a page may use (the RPC transport, the shell's navigation, the UI primitives at dashboard/components/ui/), and a daemon contract if the RPCs move too. Under B and C the framework still bundles every page, because it depends on every skill: the modularity the user sees is Q2's, not the package boundary's.
🤖 recommends A now. The four pages are first-party, and the contract a page needs is exactly what building four of them behind one registry teaches. B is a directory move once that contract is known, and the registry entry becomes the export. Nothing in A is thrown away by B.
Q2: how the dashboard knows which skills a project picked
Story. You register two repositories. One picked all four skills. The other runs on Claude Code Web and picked tickets and logs only. You open the Overview. Which cards show? You open the second project's launcher: does the run page offer "Remove worktree"? Today both projects show everything, and the daemon links all four skills into both.
Options.
A. The committed skills directory. Per project, the daemon lists <root>/.agents/skills/*/ (or whichever */skills/ directories the tool used) and keeps the names that are ours: branches, tickets, queue, logs. One read per registry poll, on ProjectSummary. A fresh clone answers the same on every machine, since the files are committed. This is the install tool's own model and the "conventions are the only glue" rule.
B. package.json. The project depends on @gemstack/skill-tickets. Committed too, and true here today (root package.json:25-28). False for a skill installed from GitHub with the skills CLI, which writes no dependency.
C. A setting in the daemon's registry, the-framework.json, per project, on the settings page. Per machine, not in git; two machines can disagree; the agent's checkout does not read it.
D. The data's presence.tickets/ on the branch means tickets, as hasTickets does today. Wrong for a picked skill with no data yet, and for logs, whose data appears after the first run only.
Whatever the pick, the shell takes the union over registered projects for the sidebar rows and the Overview cards, and the project's own set for its pages and its run page's controls.
🤖 recommends A. One mechanism, the tool's, read from git. Until the four skills are materialized into a project (step 0 in Q6), the read finds none of them and the dashboard shows all four, as today: no second code path, one line saying "no skills directory means every skill".
Q3: the Overview, the dashboard's / page
Story. The Overview has seven sections in a fixed order: the onboarding checklist, usage, the Human Queue, the agents working now, the AI Queue, the routines, the hot tickets (DashboardPage.tsx:54-82). Four of the seven are a skill's. Someone who did not pick the queue sees a card saying "Nothing queued." and an onboarding step asking them to populate a queue. Someone who did not pick tickets sees "Nothing in progress, queued, or high priority."
Options.
A. Each skill contributes one card through the registry. Logs gives the agents working now (today's Agents.tsx, fed by the live runs and the records), queue gives the AI Queue, tickets gives the hot tickets. Branches gives none: its facts already sit inside the Human Queue's unpushed rows. The framework keeps the checklist, usage, the Human Queue and the routines. A card renders only when some registered project picked its skill. The checklist's two skill steps (OnboardingChecklist.tsx:140-156) hide the same way. The composite RPC onDashboard splits: each card polls its own read, as the hot tickets already do (HotTickets.tsx:63).
B. A framework-only Overview. Usage, the Human Queue, the agents working now, the routines. Every skill is a sidebar row and a page, nothing more. Fewer joins, one less RPC, and the at-a-glance backlog is a click away.
🤖 recommends A. The hook you asked for is the registry entry's card. The cards exist; the work is the split of onDashboard and the pick check.
Q4: the pages, and the buttons that need two skills
Story. A ticket's page has a Queue button (TicketDetailPage.tsx:41). The tickets list has two bulk actions that read the queue before writing it (TicketsPage.tsx:127-168). The hot tickets have a lane that is the queue (HotTickets.tsx:49-53). A claimed ticket links to the run that holds it (TicketsPanel.tsx:162-165), and a plan links to the run that wrote it (TicketPlanPage.tsx:46). Someone picked tickets and not the queue. What does the Queue button do?
does not exist: the runs live in the sidebar (AgentHistory.tsx:233-270) and the run page. The page is the cross-project list the command prints: every run, newest first, with its ticket, branch, PR, status and cost, filters by ticket and branch, each row opening the run page
queue
/queue, or none
the AI Queue card is the whole surface today (every project's entries with a start button). A page adds room for the priority sections and the entry text; the card stays the summary
branches
none
its UI is the run page's controls: branch, dirty, PR, push, merge, remove worktree, and the launcher's git bar
The buttons. Every cross-skill control follows the same rule as the tickets SKILL.md, which says "when the repository has the queue skill": the control renders only when the project picked both skills. The Queue button, the two bulk actions and the queue lane need queue; the claim's link and the plan's row need logs; the run page's branch controls need branches. Without the second skill the button is not there, the lane is empty, the holder is shown as written. This is the behavior the empty states already have; the pick check adds the case where the data could exist but the skill was not wanted.
The joins on the daemon side stay where they are, in the framework's read modules, since the framework is the caller and may read two skills; each join already yields an empty part when one side has no data.
🤖 recommends: tickets as they are; /agents as the runs list; no queue page this round (the card is the surface, a page when someone misses it); branches without a page; the both-picked rule for every cross-skill control.
Q5: the runs when the logs skill is not picked
Story. You start an agent. Its page streams the live file from its checkout (src/store/agent-checkout.ts:46-55), the composer sends messages, the gates ask you. The run ends. The daemon records it through the logs library (src/store/agent-store.ts:921) and, once the branch is pushed, reclaims the checkout. Tomorrow you open the run: the page replays the diary (AgentView.tsx:90, src/store/agent-store.ts:1055), the sidebar lists it from the records (:866-870). Now the same day in a project that did not pick logs.
Options.
A. Live is the framework's, finished is the logs skill's. The run page, the feed, the composer, the gates, the browser panel and the stop stay framework and read the checkout while it exists. Without logs the daemon records nothing, the finished run drops out of the list when its checkout is reclaimed (the live list reads .branches/*/.the-framework/agent.json, src/store/agent-store.ts:1028-1041), and the page says "This agent is gone" (App.tsx:341-348). The Human Queue loses its unpushed rows, which come from the records (src/dashboard/interventions.ts:167). A continue of a reclaimed run is impossible without its record, which is already true.
B. The framework keeps a local archive as the fallback. The transient copy under .the-framework/agents/ (src/store/agent-store.ts:851) becomes the no-logs store, so finished runs survive on the machine that ran them. Two stores, two readers, the situation the logs skill just ended.
🤖 recommends A. Modularity over paper cuts: a project that did not want the logs does not get them.
Q6: the order
Story. Four skills, one registry, one pick read, one new page. Which goes first decides what the second PR inherits.
Options.
A. Logs first. Step 0, the four skills materialized into the projects with the install tool, so the pick read has something to read; its layout is the tool's, not ours. Then the registry with the pick read and the sidebar rows hidden by pick. Then the logs entry: the /agents page, the agents card, the sidebar's recorded rows. Then tickets: the pages move under their directory, the hot tickets card, the checklist step, the both-picked buttons. Then queue: the AI Queue card, the Docs section's queue file (src/dashboard/docs.ts:57) and the rail's Docs tab as the queue's. Then branches: the run page's controls behind the pick. The framework reads runs only through the logs library since The agent logs as their own skill: @gemstack/skill-logs, command logs; agents-logs folded onto agent-data #1771, so the logs move touches no store.
B. Tickets first. The pages exist, so the first PR is the largest move and proves the registry on the most code. Logs second.
🤖 recommends A. Your example in #1768 was /agents, and the tickets move is mechanical once the registry stands.
PR shape
One PR per step above, each one skill's directory plus the registry line that mounts it; the first PR carries the registry and the pick read alone. Step 0 is a cutover by hand, per project, once the skills' package layout matches the install tool's. No package is published by this work. FEATURES-SPEC.md, SPEC and LOGIC files are not touched: main has none since the clean slate.
Not in this round
A page brought by a third-party skill. Presets as skills (#1770). Routines as a skill. The skills-<x> rename. The chrome extension. The design gallery (dashboard/design/), a manual list of previews that gains a line per new card.
The dashboard for the skills architecture, from #1768. This issue is the plan and the questions. Nothing is built yet.
What exists. One React app inside the framework package, served by the daemon with an SPA fallback. Seven routes: the Overview, a project's launcher, a run's page,
/tickets, a ticket's page, a ticket's plan, and/settings. The sidebar has Overview, Tickets, Projects and Settings as literal rows. Every skill's data reaches the browser through the framework's own RPCs, and every skill's page or card is the framework's code. Nothing in the UI, the daemon or the registry says which skills a project uses: the four skills are hard dependencies of the framework, always linked into every checkout, always on every agent's PATH.What is decided. From Dashboard architecture #1768: one page per skill (
/ticketsfor the tickets,/agentsfor the logs), a hook for cards on the Overview (the dashboard's/page), and modularity over UX paper cuts. From the skills round: no skill imports another, the framework is the caller, and a skill is picked per repository by committing its files.The questions. I need your call on six things. Each has its options in the plan below.
package.json, a setting in the daemon's registry, or the data's presence./page: each skill contributes one card and the framework keeps its own, or the Overview is framework-only with the skill pages one click away.Names. Today's names,
skill-<x>,<x>./agentsis your name for the logs page. A rename toskills-<x>changes nothing below.PR shape is my call after the answers. No FEATURES-SPEC.md, SPEC or LOGIC files: main has none since the clean slate.
🤖 curated · Fable 5.1 — the plan, as the agent wrote it after reading every page, route, component and RPC of the dashboard on
main(5c8d41d); I read it and I stand behind the questions above.The plan
What it is. The dashboard today is one app that knows every skill. The skills are standalone packages now, and a repository picks the ones it wants. The dashboard has to show a page, a card or a control only for the skills that repository picked, and the code has to be arranged so that one skill's page is one skill's directory. This plan says what the code does now, where each surface belongs, and what has to change, question by question.
Where every surface belongs today. Paths under
packages/framework/,dashboard/is the browser,src/is the daemon.dashboard/App.tsx:276-377,dashboard/lib/route.ts:19,30,37ticketsis a reserved worddashboard/components/AgentHistory.tsx:198-215nav rows,:233-270the runs/pagedashboard/components/DashboardPage.tsx:54-82dashboard/components/ProjectHome.tsx:51-66src/dashboard/docs.ts:57)dashboard/components/AgentView.tsx:90,97,206-224:90); branch controls from branches (AgentHandoff.tsx:182-231,AgentActionsMenu.tsx:204-220,GitStatusBar.tsx:60)TicketsPage.tsx,TicketDetailPage.tsx,TicketPlanPage.tsx,TicketsPanel.tsx,TicketFilterBar.tsx,HotTickets.tsx,lib/ticket-filter.tsTicketsPage.tsx:127,145,168,TicketDetailPage.tsx:41); logs for a claim's link (TicketsPanel.tsx:162-165,TicketPlanPage.tsx:46)AiQueue.tsx,lib/queue-entry.ts,DocsPanel.tsxTicketsPage.tsx:127callsonQueuedirectlyRoutineWork.tsx:91,136,165SettingsPage.tsx,Bridge*.tsx,DevicesSettings.tsx,DiscordDialogs.tsx,Quota.tsx,CloudAgentNotice.tsx,OpenQuestions.tsx,Composer.tsx,PresetsMenu.tsxsrc/dashboard-rpc/reads.ts,control.tssrc/dashboard/overview.ts,dashboard.ts,tickets.ts:48-55,interventions.tssrc/dashboard/server.ts:224-274one bundle dir,static.ts:43SPA fallback,bundle.ts:20one pathsrc/daemon.ts:212-250wires the daemon's closures;src/daemon-runtime.ts:116-120PATH,:127-131the linked skills, marked temporaryWhat "absent" means today. Two different things, and the plan keeps them apart:
packages/framework/package.json:50-53depends on all four, the daemon drains the queue through@gemstack/skill-queue, claims through@gemstack/skill-tickets, records through@gemstack/skill-logs, makes checkouts through@gemstack/skill-branches. The framework is the caller; it keeps every library.tickets/on the branch gives an empty list (TicketsPage.tsx:386), no queue file gives "Nothing queued." (AiQueue.tsx:150), no runs give "No agents yet." (AgentHistory.tsx:270), a claim whose agent is not in the records is shown as written (src/dashboard/tickets.ts:53), the right rail offers a tab only when its read came back non-empty (RightRail.tsx:105-112).So "the user did not pick the skill" is a third state that nothing knows. The one flag that exists is
hasTickets(src/dashboard/dashboard.ts:17-21), the presence of a ticket file, read by the onboarding checklist alone (OnboardingChecklist.tsx:150). The sidebar's Tickets row has a prop that would hide it (AgentHistory.tsx:84-86,211), and the shell always passes it (App.tsx:420).How a skill is picked, per the install tool. A skill package's skills are materialized as real, committed files under the repository's skills directory,
.agents/skills/<name>/by default or whichever*/skills/directories already exist, each with asource.jsonnaming the package and version; never a link intonode_modules(use-npm-skills 0.1.0, its DECISIONS.md "Materialize each skill"). The install here today:.agents/skills/logic-driven-development/plusskills-lock.json. The four skills are not in any project's skills directory yet: the daemon links them into each checkout's.claude/skillsand.agents/skills(src/daemon-runtime.ts:127-131,packages/skill-branches/src/skill-links.ts:20,59-70), git-excluded, and the project root gets none.The join points, the reads that need two skills:
src/dashboard/overview.ts:288-342(buildOverview): live runs, cloud runs from the records, the queue count.src/dashboard/overview.ts:225-267(buildHotTickets): tickets, the open queue entries, the live runs' tickets.src/dashboard/dashboard.ts:48-72(buildDashboard): the queue once, the overview,hasTicketsper project. One RPC feeds three Overview cards.src/dashboard/tickets.ts:48-55(resolveHolders): a claim's holder matched against the records, named through branches.src/dashboard/interventions.ts:87-184: open PRs onagent-*branches, parked runs, unpushed branches from the records.src/dashboard-rpc/control.ts:351-382: queue a ticket, queue its plan.Q1: where a skill's dashboard code lives
Story. You open
packages/skill-tickets/. Today it holds the command, the library,SKILL.mdandDECISIONS.md. The ticket pages, 2,200 lines, sit inpackages/framework/dashboard/components/beside the composer and the settings page, and their RPCs sit insrc/dashboard-rpc/reads.tsbeside the bridge's. Someone reads the tickets package to review its design, and does not find its UI. Someone reads the dashboard to remove tickets, and has to know which 12 files are the tickets'.Options.
dashboard/skills/tickets/holds the pages, cards and client stubs;src/dashboard-skills/tickets/holds the RPC module and the reads. One registry file lists the four entries: name, nav row, routes, Overview card. The shell, the sidebar and the Overview read the registry and nothing else. The framework's build makes one bundle as today. The skill package stays what it is.@gemstack/skill-tickets/dashboardexports the same pages, React as an optional peer dependency; the framework's build imports the export and composes the bundle. This is the "super package": one package, the skill and its dashboard extension. The RPC side stays in the framework, since the handlers act through the daemon's context (src/dashboard/rpc-serve.ts:50-75), or moves too, behind a plugin contract for the daemon.@gemstack/skill-tickets-dashboard. Same as B with the React code out of the agent's install.What A costs: the skill's UI lives outside the skill's package, and a third-party skill cannot bring a page. What B costs: a CLI package that carries React code and a design system, a contract for what a page may use (the RPC transport, the shell's navigation, the UI primitives at
dashboard/components/ui/), and a daemon contract if the RPCs move too. Under B and C the framework still bundles every page, because it depends on every skill: the modularity the user sees is Q2's, not the package boundary's.🤖 recommends A now. The four pages are first-party, and the contract a page needs is exactly what building four of them behind one registry teaches. B is a directory move once that contract is known, and the registry entry becomes the export. Nothing in A is thrown away by B.
Q2: how the dashboard knows which skills a project picked
Story. You register two repositories. One picked all four skills. The other runs on Claude Code Web and picked tickets and logs only. You open the Overview. Which cards show? You open the second project's launcher: does the run page offer "Remove worktree"? Today both projects show everything, and the daemon links all four skills into both.
Options.
<root>/.agents/skills/*/(or whichever*/skills/directories the tool used) and keeps the names that are ours:branches,tickets,queue,logs. One read per registry poll, onProjectSummary. A fresh clone answers the same on every machine, since the files are committed. This is the install tool's own model and the "conventions are the only glue" rule.package.json. The project depends on@gemstack/skill-tickets. Committed too, and true here today (rootpackage.json:25-28). False for a skill installed from GitHub with theskillsCLI, which writes no dependency.the-framework.json, per project, on the settings page. Per machine, not in git; two machines can disagree; the agent's checkout does not read it.tickets/on the branch means tickets, ashasTicketsdoes today. Wrong for a picked skill with no data yet, and for logs, whose data appears after the first run only.Whatever the pick, the shell takes the union over registered projects for the sidebar rows and the Overview cards, and the project's own set for its pages and its run page's controls.
🤖 recommends A. One mechanism, the tool's, read from git. Until the four skills are materialized into a project (step 0 in Q6), the read finds none of them and the dashboard shows all four, as today: no second code path, one line saying "no skills directory means every skill".
Q3: the Overview, the dashboard's
/pageStory. The Overview has seven sections in a fixed order: the onboarding checklist, usage, the Human Queue, the agents working now, the AI Queue, the routines, the hot tickets (
DashboardPage.tsx:54-82). Four of the seven are a skill's. Someone who did not pick the queue sees a card saying "Nothing queued." and an onboarding step asking them to populate a queue. Someone who did not pick tickets sees "Nothing in progress, queued, or high priority."Options.
Agents.tsx, fed by the live runs and the records), queue gives the AI Queue, tickets gives the hot tickets. Branches gives none: its facts already sit inside the Human Queue's unpushed rows. The framework keeps the checklist, usage, the Human Queue and the routines. A card renders only when some registered project picked its skill. The checklist's two skill steps (OnboardingChecklist.tsx:140-156) hide the same way. The composite RPConDashboardsplits: each card polls its own read, as the hot tickets already do (HotTickets.tsx:63).🤖 recommends A. The hook you asked for is the registry entry's
card. The cards exist; the work is the split ofonDashboardand the pick check.Q4: the pages, and the buttons that need two skills
Story. A ticket's page has a Queue button (
TicketDetailPage.tsx:41). The tickets list has two bulk actions that read the queue before writing it (TicketsPage.tsx:127-168). The hot tickets have a lane that is the queue (HotTickets.tsx:49-53). A claimed ticket links to the run that holds it (TicketsPanel.tsx:162-165), and a plan links to the run that wrote it (TicketPlanPage.tsx:46). Someone picked tickets and not the queue. What does the Queue button do?The pages.
/tickets,/{project}/tickets/{slug},/{project}/tickets/{slug}/plan/agentsAgentHistory.tsx:233-270) and the run page. The page is the cross-project list the command prints: every run, newest first, with its ticket, branch, PR, status and cost, filters by ticket and branch, each row opening the run page/queue, or noneThe buttons. Every cross-skill control follows the same rule as the tickets
SKILL.md, which says "when the repository has thequeueskill": the control renders only when the project picked both skills. The Queue button, the two bulk actions and the queue lane need queue; the claim's link and the plan's row need logs; the run page's branch controls need branches. Without the second skill the button is not there, the lane is empty, the holder is shown as written. This is the behavior the empty states already have; the pick check adds the case where the data could exist but the skill was not wanted.The joins on the daemon side stay where they are, in the framework's read modules, since the framework is the caller and may read two skills; each join already yields an empty part when one side has no data.
🤖 recommends: tickets as they are;
/agentsas the runs list; no queue page this round (the card is the surface, a page when someone misses it); branches without a page; the both-picked rule for every cross-skill control.Q5: the runs when the logs skill is not picked
Story. You start an agent. Its page streams the live file from its checkout (
src/store/agent-checkout.ts:46-55), the composer sends messages, the gates ask you. The run ends. The daemon records it through the logs library (src/store/agent-store.ts:921) and, once the branch is pushed, reclaims the checkout. Tomorrow you open the run: the page replays the diary (AgentView.tsx:90,src/store/agent-store.ts:1055), the sidebar lists it from the records (:866-870). Now the same day in a project that did not pick logs.Options.
.branches/*/.the-framework/agent.json,src/store/agent-store.ts:1028-1041), and the page says "This agent is gone" (App.tsx:341-348). The Human Queue loses its unpushed rows, which come from the records (src/dashboard/interventions.ts:167). A continue of a reclaimed run is impossible without its record, which is already true..the-framework/agents/(src/store/agent-store.ts:851) becomes the no-logs store, so finished runs survive on the machine that ran them. Two stores, two readers, the situation the logs skill just ended.🤖 recommends A. Modularity over paper cuts: a project that did not want the logs does not get them.
Q6: the order
Story. Four skills, one registry, one pick read, one new page. Which goes first decides what the second PR inherits.
Options.
/agentspage, the agents card, the sidebar's recorded rows. Then tickets: the pages move under their directory, the hot tickets card, the checklist step, the both-picked buttons. Then queue: the AI Queue card, the Docs section's queue file (src/dashboard/docs.ts:57) and the rail's Docs tab as the queue's. Then branches: the run page's controls behind the pick. The framework reads runs only through the logs library since The agent logs as their own skill:@gemstack/skill-logs, commandlogs;agents-logsfolded ontoagent-data#1771, so the logs move touches no store.🤖 recommends A. Your example in #1768 was
/agents, and the tickets move is mechanical once the registry stands.PR shape
One PR per step above, each one skill's directory plus the registry line that mounts it; the first PR carries the registry and the pick read alone. Step 0 is a cutover by hand, per project, once the skills' package layout matches the install tool's. No package is published by this work. FEATURES-SPEC.md, SPEC and LOGIC files are not touched: main has none since the clean slate.
Not in this round
A page brought by a third-party skill. Presets as skills (#1770). Routines as a skill. The
skills-<x>rename. The chrome extension. The design gallery (dashboard/design/), a manual list of previews that gains a line per new card.