Scope (split from PAN-4259, S7 of PAN-4249)
PAN-4259 was planned on 2026-10-03 and split to keep its plan within the plan-surface limit. PAN-4259 keeps the cost ledger, sessions.json, the pan cost effort report, native-agent rows on the Agents page, and pan status / pan show. This issue takes the remaining display surfaces:
- Issue view agent rows. Add
effort and effortSource to SessionNode (packages/contracts/src/types.ts :686-717), fill them from the agent's state.json in src/dashboard/server/routes/command-deck.ts (:358-361, next to model: state.model || 'unknown'), carry them through AgentRowModel (src/dashboard/frontend/src/components/issue-view/types.ts ~:88-90, built in useIssueView.ts ~:211-236), and render them next to the model in AgentStepRow.tsx (cockpit ~:753, rail ~:816).
- Conversation rows.
ConversationList.tsx already declares effort?: string | null (:56-57) but nothing renders it. Render it next to the model in ConversationRow.tsx (:603-609).
- Agents page conversation entries.
DirectoryConversationRow (src/dashboard/server/services/agent-directory.ts ~:83-95) has no effort, so conversation entries on the Agents page show none. Select the conversation's stored effort and set DirectoryEntry.effort on conversation entries (the optional effort/effortSource fields land in PAN-4259).
Use the effort label helper that PAN-4259 adds to src/dashboard/frontend/src/components/chat/effortChip.ts so every surface renders effort the same way.
The conversation panel already shows the effective effort and its source in the composer effort chip (PAN-4255), so the conversation header needs no second display.
Acceptance criteria
- A unit test shows an issue-view agent row renders the agent's effort and source, and renders nothing for a legacy agent whose
state.json has no effort.
- A unit test shows a
ConversationRow renders the conversation's effort next to its model.
- A server test shows a conversation entry from
buildDirectoryEntries carries the conversation's stored effort.
configuration/effort.mdx "What honors it today" lists the issue view and conversation rows.
Blocked by #4259 (it adds the shared label helper and the optional DirectoryEntry.effort fields).
Rules: effort defaults stay high and never xhigh/max (sync-sources/rules/effort-high-default.md). Do not add a new ?? 'high' fallback or an effort-level enum copy; npm run lint:effort ratchets both.
Scope (split from PAN-4259, S7 of PAN-4249)
PAN-4259 was planned on 2026-10-03 and split to keep its plan within the plan-surface limit. PAN-4259 keeps the cost ledger,
sessions.json, thepan cost effortreport, native-agent rows on the Agents page, andpan status/pan show. This issue takes the remaining display surfaces:effortandeffortSourcetoSessionNode(packages/contracts/src/types.ts:686-717), fill them from the agent's:358-361, next tostate.jsoninsrc/dashboard/server/routes/command-deck.ts(model: state.model || 'unknown'), carry them throughAgentRowModel(src/dashboard/frontend/src/components/issue-view/types.ts~:88-90, built inuseIssueView.ts~:211-236), and render them next to the model inAgentStepRow.tsx(cockpit ~:753, rail ~:816).ConversationList.tsxalready declareseffort?: string | null(:56-57) but nothing renders it. Render it next to the model in:603-609).ConversationRow.tsx(DirectoryConversationRow(src/dashboard/server/services/agent-directory.ts~:83-95) has no effort, so conversation entries on the Agents page show none. Select the conversation's stored effort and setDirectoryEntry.efforton conversation entries (the optionaleffort/effortSourcefields land in PAN-4259).Use the effort label helper that PAN-4259 adds to
src/dashboard/frontend/src/components/chat/effortChip.tsso every surface renders effort the same way.The conversation panel already shows the effective effort and its source in the composer effort chip (PAN-4255), so the conversation header needs no second display.
Acceptance criteria
state.jsonhas no effort.ConversationRowrenders the conversation's effort next to its model.buildDirectoryEntriescarries the conversation's stored effort.configuration/effort.mdx"What honors it today" lists the issue view and conversation rows.Blocked by #4259 (it adds the shared label helper and the optional
DirectoryEntry.effortfields).Rules: effort defaults stay
highand neverxhigh/max(sync-sources/rules/effort-high-default.md). Do not add a new?? 'high'fallback or an effort-level enum copy;npm run lint:effortratchets both.