project-planner skill
This skill turns a free-form goal ("what's next for project X?", "land these
three bugs as work items", "I want to start working on FLNKA-21") into real
rows in the user's FastLinkIt Projects board. It uses three loops:
| Mode |
Trigger |
What happens |
| Plan |
"what's next for X?" / "plan some work for X" |
List projects → fetch context → propose ranked items → confirm → POST plan |
| Pickup |
"start working on FLNKA-N" |
Open agent run → move item to in-progress column |
| Wrap-up |
"I'm done with FLNKA-N" / agent finishes natural unit of work |
Close agent run → move item to review/done column → narrative summary |
| Bug |
"log a bug", "bug:", "I just hit X", "this looks broken" |
Draft a single bug item with structured repro steps → confirm → POST as standalone work item |
| Scan |
"what's on my plate?", "anything assigned to me?", "pick up the next one", "resume what I was doing" |
Filter recentItems to items where assignee matches the agent identifier → group by status → suggest pickup / resume |
Required env
Before invoking, ensure these env vars are set in the calling shell (or in a
local .env the user sources):
| Var |
Default |
Notes |
FLNKIT_API_KEY |
— required — |
API key with the projects scope. Generate at /Account/Manage/ApiKeys. |
FLNKIT_API_BASE |
https://flnk.it |
Override for local dev: https://fastlinkit.dev.localhost:7152. |
FLNKIT_AGENT_ID |
claude-code |
Free-form identifier the server stamps onto the run row. |
If FLNKIT_API_KEY is missing, stop immediately and instruct the user to
generate one with the projects scope ticked.
Plan mode
When the user asks "what's next for X?" or similar:
Run lib/flnk-plan.ps1 list (Windows) / lib/flnk-plan.sh list (POSIX) to
list projects. Identify the target project from the user's wording —
match by name fuzzily, or ask if multiple match.
Run ... context <project-id> to load the methodology + Kanban columns +
allowed work-item types + recent items. Read the response carefully:
- methodology dictates allowed item types. Kanban →
task / bug.
Agile → epic / feature / story / task / bug / subtask.
Waterfall → task / bug.
- columns dictates valid
initial_status values — use the key field,
not label.
- recentItems shows existing work — avoid duplicates, parent new items
to existing epics/features when relevant.
Read the repo's CLAUDE.md (and any PROJECTS.md if present) for project
conventions: story format, AC structure, sizing convention.
Structure the plan to match the project's methodology. This is the
default behaviour — only flatten if the human explicitly asks ("just give
me a flat task list", "no epic, just stories"):
- Agile: produce a hierarchy. For a non-trivial goal, propose one
epic as the root, 2-5 feature rows under it (each
parent_local_id = the epic), then story rows under each feature
(each parent = its feature). Granular engineering chunks land as
task or subtask under the relevant story. Bugs use bug and sit
wherever they belong in the tree. For tiny goals (one cohesive
change), skip the epic and produce 1-3 stories directly.
- Waterfall: produce phase-shaped task chains. Use
task rows with
parent_local_id references to model the workstream. Set
depends_on_local_ids on the FinishToStart edges so the Gantt and
critical-path scheduler render correctly.
- Kanban: flat list of
task / bug rows. No hierarchy beyond
parent_local_id where two items genuinely belong together.
Whatever the methodology, write each item to its convention (stories
need acceptance_criteria, bugs need repro_steps, etc. — see the
"Conventions" section below).
Surface the structured plan to the human before doing anything
else. Render shape per methodology:
Agile — indent so the tree is visible at a glance:
I propose for the FastLinkIt Agile project:
1. EPIC Customer onboarding overhaul (no estimate)
2. FEATURE Sign-up flow refresh (likely: 16h)
3. STORY As a new user I want to sign up via Google … (likely: 6h)
4. STORY As a new user I want a guided first-link tour … (likely: 8h)
5. FEATURE Welcome email sequence (likely: 12h)
6. STORY As a new user I want a 3-email welcome drip … (likely: 4h)
7. TASK Wire welcome drip into IMailingSequenceService (likely: 4h)
Push these to the FastLinkIt board? (y / N)
Waterfall — number the items, list dependencies in a "depends on"
column so the human sees the chain at a glance:
I propose for the Q3 platform migration project:
# Type Title Likely Depends on
1 TASK Schema audit + migration plan 12h —
2 TASK Stand up replica DB 8h #1
3 TASK Backfill replica from prod snapshot 16h #2
4 TASK Cutover dry-run 6h #3
5 TASK Production cutover window 4h #4
6 TASK Decommission legacy DB 2h #5
Push these to the FastLinkIt board? (y / N)
Kanban — flat numbered table with type, priority, and est:
I propose for the FastLinkIt Kanban project:
# Type Priority Title Likely
1 TASK high WIP-limit enforcement on board columns 4h
2 TASK normal Assignee avatars on Kanban cards 2h
3 BUG normal Drag handle hint on hover (cards look static) 1h
4 TASK low Dark-mode column-tint cleanup 1h
Push these to the FastLinkIt board? (y / N)
Whatever the methodology, always show the item type explicitly so
the human can spot a wrong-shaped item before confirming.
Always wait for explicit "yes" / "y" before POSTing. A "let's see"
or "looks good" without confirmation is NOT consent.
On confirmation, build the JSON envelope (see schema below) and call
... plan <project-id> <plan.json>. Report back the created item numbers
from the response so the human can click them.
Pickup mode
When the user says "start working on FLNKA-N" / "pick up the next one":
- Resolve the work item id by listing items (or the user gave one explicitly).
- Call
... start <project-id> <work-item-id> with an optional summary
("I'll handle the FK migration first, then refactor"). The server:
- Opens a
WorkItemAgentRun row with the agent identifier (from
FLNKIT_AGENT_ID, default claude-code).
- Moves the item to the in-progress column.
- Sets the assignee to the agent identifier when the work item
was previously unassigned — so the row clearly shows "Claude Code"
in the Assignee column on the board / list. If a human was already
assigned, the assignee is left alone (the run row still tracks the
pickup; the audit trail remains intact).
- Returns a
runId — store this in the conversation; you'll need
it to close out.
- Print the response so the human sees "moved from to ".
Wrap-up mode
When the agent finishes the work or the user says "done":
- Call
... complete <project-id> <work-item-id> <run-id> with a narrative
describing what was done (key files touched, follow-up items spawned, any
gotchas). Server moves the item to the review (or done) column.
- If the completed work needs human verification, list the smoke tests
in the wrap-up response AND offer to create them as test tasks parented
to the completed item. See "Test tasks at wrap-up" below.
- If something blocks progress and you can't finish, call
... block <project-id> <work-item-id> <run-id> "<reason>" instead.
The reason is mandatory — no silent failures.
Test tasks at wrap-up
Smoke tests are verification tasks generated at wrap-up time — they
describe steps the human needs to take to confirm the work is correct.
They're distinct from acceptance_criteria on the parent story (which are
conditions baked into the story itself); test tasks are a follow-up
checklist that lives on the board so the verification step is tracked
across sessions.
When to offer test tasks:
- The work touched real code or configuration that benefits from manual
smoke-testing (UI changes, migration scripts, new endpoints, integration
with external systems).
- You can't 100% prove it works from the workspace — the user needs to
reload a page, click through a flow, run a query, etc.
- The number of smoke-test steps is genuinely 2+. Don't create a single
test task with one bullet — that's a comment in the narrative, not a
trackable item.
When NOT to offer test tasks:
- The work was pure refactor / rename / docs and the existing tests cover it.
- The acceptance_criteria on the parent story already enumerates the
verification steps — no need to duplicate them as separate items.
- The wrap-up was a
block (Blocked / Failed runs aren't ready for
verification yet).
The ask after complete_task:
Moved FLNKA-23 to Review.
Suggested smoke tests for you to run:
1. <verification step 1>
2. <verification step 2>
3. <verification step 3>
Want me to create these as test tasks parented to FLNKA-23? (y / N)
On the user's "yes": make a single-item plan POST per test (or one
multi-item plan with the three) using these defaults:
type = "task" (works in all methodologies — Kanban / Agile / Waterfall).
parent_local_id = the just-completed item, so the test sits in the
parent's tree.
title = "Test: <one-line description>" or "Smoke test: <…>".
description = the verification steps, formatted as a numbered list +
expected outcome per step.
tags = ["test", "smoke-test"] plus any area tags inherited from the
parent (e.g. board, mailing, payments).
priority = normal by default; high only if the user signals
urgency or it's a regression-blocking test.
initial_status = "backlog" — tests sit in the queue until the user
picks them up to run.
After creating, report the new item numbers + titles, and remind the user
the parent is now in Review awaiting their verification:
Created FLNKA-30, FLNKA-31, FLNKA-32 (test tasks under FLNKA-23).
FLNKA-23 stays in Review until the test tasks are closed — pick one up
when you're ready to verify.
Bug-report mode
When the user reports a bug ("log a bug", "bug:", "I just hit X", "this
looks broken", "create a bug for Y") OR you discover a bug while working on
something else:
Don't ask 5 questions. Draft the bug from what the user gave you and
ask ONE clarifying question only if a critical field is genuinely missing
(e.g. "what page were you on?" when they said "the dropdown is broken"
with no surface context). Trust your code-reading — if you can infer the
affected file from the description, do so without asking.
Compose the work item with these defaults:
type = "bug"
priority = "normal" — escalate to "high" if the user said "blocking" /
"broken in prod" / "data loss"; "highest" only on explicit request.
initial_status = "backlog" (use the actual column key from
get_project_context).
repro_steps is mandatory. Use this template, filled from the
user's description:
**Repro steps:**
1. <step 1>
2. <step 2>
…
**Expected:** <what should happen>
**Actual:** <what happens instead>
**Affected:** <page / component / file path>
**Environment:** <browser / OS / theme — only when relevant>
description carries any extra narrative: what you were trying when
it surfaced, recent commits in the area, related code references,
hypothesis. Markdown OK.
tags: always include bug plus area tags inferred from the
description (board, wiki, mailing, links, payments, etc.).
Auto-parent when the bug surfaces mid-pickup. If you're in the middle
of an active start_task run on FLNKA-X and notice an unrelated bug in
the surrounding code, default parent_local_id to the same parent
feature as FLNKA-X (one hop up the tree). The bug nests next to the
work that exposed it. User can override with "no, log it standalone" —
in which case omit parent_local_id.
Surface the proposed bug to the user for confirmation, same gate as Plan
mode — show the rendered repro steps so they can spot a misread:
I propose:
BUG Resize handle loses drag state on Blazor thead re-render
priority: normal · tags: bug, board, ux
parent: FLNKA-22 (Worktree-based execution sandbox)
Repro steps:
1. Open /projects/{id} list view
2. Drag a column resize handle
3. Trigger a Blazor render that replaces the thead (filter change, sort
toggle)
4. Try to resize again
Expected: drag continues to work after the re-render
Actual: handle no longer responds; pointerdown doesn't fire
Affected: Components/Pages/ProjectDetail.razor + projects-table-resize.js
Environment: Edge 131 / Win 11
Push to FLNKA? (y / N)
After the user's "yes", POST a single-item plan to
/api/projects/{id}/plan (the same endpoint Plan mode uses — Bug mode
is a one-item special-case). Report back the new FLNKA-N + the
/projects/{id} URL.
If the user pasted screenshots / files, attach them to the new
work item AFTER the create call:
Each pasted image lands at a real disk path (Claude Code surfaces
these in the conversation as [Image: source: <path>]).
List the files in the proposal preview BEFORE the confirmation gate
so the user knows what'll be attached:
BUG Resize handle pushes preview off-screen
priority: normal · tags: bug, board, ux
📎 Attachments: screenshot-2026-05-09-bug.png (442 KB)
Push to FLNKA + upload 1 attachment? (y / N)
On the user's "yes", call ... attach <work-item-id> <file-path>
for each file after the plan POST succeeds. The server's allowlist
rejects executables silently — just report what landed.
If an attachment upload fails, surface the failure but don't roll
back the create — the work item is still useful without the
screenshot. Suggest re-attaching manually via the UI.
Optional pickup chain: if it's clear the user wants to start fixing
the bug right now, ask "Want me to pick it up now? (y / N)" — on yes,
chain straight into Pickup mode with the new item id. Don't auto-pickup
without asking.
If the bug came up while you were already in the middle of a pickup on
FLNKA-X, the original run stays open — log the bug as a side action, then
return your attention to FLNKA-X (or call block on FLNKA-X if the bug
literally blocks the work).
Scan mode
When the user asks "what's on my plate?", "anything assigned to me?",
"what should I resume?", or similar — they want to see the work already
queued for the agent, not propose new items.
Run ... assigned <project-id> (helper script) or call
get_project_context with assignee = <FLNKIT_AGENT_ID, default "claude-code"> (MCP tool). The server returns recentItems
filtered to items where AssigneeUserId matches the agent
identifier, with the cap lifted to 200.
Group by status using the project's column keys, prioritising
what the human probably wants to see first:
- In progress items first — these may have an open
WorkItemAgentRun
that didn't get closed in a previous session. Surface them with a
"resume?" suggestion.
- Review / Blocked items next — work the agent has already done
that's waiting for human action; mention but don't propose to do
anything.
- Backlog / To do items last — these are ready to pick up. Sort
by
priority desc, then by Number.
Render the response as a grouped list, with the status column the
item's in:
You have 4 items assigned to claude-code on FastLinkIt Agile project:
In progress (1)
- FLNKA-22 Worktree-based execution sandbox (likely 28h)
⚠ run from previous session may still be open
Backlog (2)
- FLNKA-23 As an AI agent, I want a git worktree… (priority: high)
- FLNKA-26 As a project owner, I want per-run cost ceilings… (priority: high)
Review (1)
- FLNKA-27 Surface cost progress in AI activity panel (waiting for human review)
Want me to resume FLNKA-22, or pick up FLNKA-23 next? (or "neither")
Don't auto-resume / auto-pickup. Always ask first. If the user
says "resume FLNKA-22", chain into Pickup mode (the existing
start_task call rejects with 409 Conflict if there's already an
active run — useful guard, surface the message).
If the user says "pick up the next one" without naming an item, take
the highest-priority backlog item from the list and confirm BEFORE
calling start_task.
"Pick up the next one" shortcut. When the user phrases the trigger
as "pick up the next one" / "give me the next task" / "what's next",
skip the grouped list — go straight to the highest-priority backlog
item and propose it as a Pickup-mode confirmation.
Session-start passive mention (optional, low-key): on the FIRST
user turn in a fresh session in this repo, if Scan finds in-progress
items assigned to the agent, mention once: "I notice 1 item still in
progress assigned to me from a previous session — say 'resume FLNKA-22'
to continue." No auto-resume. Skip the mention entirely when nothing
is assigned (don't add noise to every session start).
If the user has multiple projects, default to scanning the project they
mentioned most recently in this conversation; otherwise scan all of them
and group by project.
Plan JSON envelope
The plan endpoint accepts the same shape Anthropic's submit_plan tool emits.
Each item carries:
{
"summary": "Optional one-line description of the plan",
"items": [
{
"local_id": 1,
"title": "Add WIP limit enforcement to Kanban columns",
"type": "task",
"description": "Markdown body. The KanbanColumn.WipLimit field exists in the schema but no UI surfaces it...",
"acceptance_criteria": "- Column header shows 'N / Limit' when limit set\n- Drop blocked when over limit\n- Admin override available",
"initial_status": "backlog",
"priority": "normal",
"parent_local_id": null,
"estimate_optimistic_hours": 2.0,
"estimate_likely_hours": 4.0,
"estimate_pessimistic_hours": 8.0,
"depends_on_local_ids": [],
"tags": ["kanban", "ux"]
}
]
}
local_id is a within-this-plan integer. Use parent_local_id and
depends_on_local_ids to wire hierarchy + FinishToStart dependencies — they
resolve to real Guids on the server in topological order, so you don't have
to materialise parents first.
Conventions to follow
- Stories — write the title as a user story when type is
story:
"As a I want so that ". Always supply
acceptance_criteria as a bullet list of testable conditions.
- Bugs — supply
repro_steps (numbered list), expected vs actual, and
the affected component / page.
- Epics / Features — keep the description short; treat them as containers.
Children carry the detail.
- Tasks — engineering work, no story ceremony required.
- Estimates — three-point PERT (
optimistic / likely / pessimistic).
When uncertain, follow the team's convention from PROJECTS.md or CLAUDE.md.
- Tags — reuse existing tags from
recentItems where they fit; otherwise
use lowercase short names (kanban, ux, api, bug, etc.).
Things this skill does NOT do
- Auto-merge code changes (Phase 1c, separate scoping doc).
- Bypass the human confirmation gate. Ever.
- Pick the project for the user without asking when more than one matches.
- Push items without first running
context to validate types + columns.
- Modify or delete existing items. (Use the web UI for those.)
1---2name: project-planner3description: Plan work for FastLinkIt Projects (a Kanban / Agile / Waterfall RCL) from a Claude Code session — list projects, fetch context, propose a methodology-aware plan, push items as work items, and update item status as work progresses (Pending → In progress → Done / Blocked).4---56# project-planner skill78This skill turns a free-form goal ("what's next for project X?", "land these9three bugs as work items", "I want to start working on FLNKA-21") into real10rows in the user's FastLinkIt Projects board. It uses three loops:1112| Mode | Trigger | What happens |13|---|---|---|14| **Plan** | "what's next for X?" / "plan some work for X" | List projects → fetch context → propose ranked items → confirm → POST plan |15| **Pickup** | "start working on FLNKA-N" | Open agent run → move item to in-progress column |16| **Wrap-up** | "I'm done with FLNKA-N" / agent finishes natural unit of work | Close agent run → move item to review/done column → narrative summary |17| **Bug** | "log a bug", "bug:", "I just hit X", "this looks broken" | Draft a single bug item with structured repro steps → confirm → POST as standalone work item |18| **Scan** | "what's on my plate?", "anything assigned to me?", "pick up the next one", "resume what I was doing" | Filter recentItems to items where assignee matches the agent identifier → group by status → suggest pickup / resume |1920## Required env2122Before invoking, ensure these env vars are set in the calling shell (or in a23local `.env` the user sources):2425| Var | Default | Notes |26|---|---|---|27| `FLNKIT_API_KEY` | — required — | API key with the `projects` scope. Generate at `/Account/Manage/ApiKeys`. |28| `FLNKIT_API_BASE` | `https://flnk.it` | Override for local dev: `https://fastlinkit.dev.localhost:7152`. |29| `FLNKIT_AGENT_ID` | `claude-code` | Free-form identifier the server stamps onto the run row. |3031If `FLNKIT_API_KEY` is missing, **stop immediately** and instruct the user to32generate one with the `projects` scope ticked.3334## Plan mode3536When the user asks "what's next for X?" or similar:37381. Run `lib/flnk-plan.ps1 list` (Windows) / `lib/flnk-plan.sh list` (POSIX) to39 list projects. Identify the target project from the user's wording —40 match by name fuzzily, or ask if multiple match.412. Run `... context <project-id>` to load the methodology + Kanban columns +42 allowed work-item types + recent items. Read the response carefully:43 - **methodology** dictates allowed item types. Kanban → `task` / `bug`.44 Agile → `epic` / `feature` / `story` / `task` / `bug` / `subtask`.45 Waterfall → `task` / `bug`.46 - **columns** dictates valid `initial_status` values — use the `key` field,47 not `label`.48 - **recentItems** shows existing work — avoid duplicates, parent new items49 to existing epics/features when relevant.503. Read the repo's `CLAUDE.md` (and any `PROJECTS.md` if present) for project51 conventions: story format, AC structure, sizing convention.524. **Structure the plan to match the project's methodology.** This is the53 default behaviour — only flatten if the human explicitly asks ("just give54 me a flat task list", "no epic, just stories"):5556 - **Agile**: produce a hierarchy. For a non-trivial goal, propose **one57 `epic`** as the root, **2-5 `feature` rows** under it (each58 `parent_local_id` = the epic), then `story` rows under each feature59 (each parent = its feature). Granular engineering chunks land as60 `task` or `subtask` under the relevant story. Bugs use `bug` and sit61 wherever they belong in the tree. For tiny goals (one cohesive62 change), skip the epic and produce 1-3 stories directly.63 - **Waterfall**: produce phase-shaped task chains. Use `task` rows with64 `parent_local_id` references to model the workstream. Set65 `depends_on_local_ids` on the FinishToStart edges so the Gantt and66 critical-path scheduler render correctly.67 - **Kanban**: flat list of `task` / `bug` rows. No hierarchy beyond68 parent_local_id where two items genuinely belong together.6970 Whatever the methodology, write each item to its convention (stories71 need `acceptance_criteria`, bugs need `repro_steps`, etc. — see the72 "Conventions" section below).73745. **Surface the structured plan to the human** before doing anything75 else. Render shape per methodology:7677 **Agile** — indent so the tree is visible at a glance:7879 ```80 I propose for the FastLinkIt Agile project:8182 1. EPIC Customer onboarding overhaul (no estimate)83 2. FEATURE Sign-up flow refresh (likely: 16h)84 3. STORY As a new user I want to sign up via Google … (likely: 6h)85 4. STORY As a new user I want a guided first-link tour … (likely: 8h)86 5. FEATURE Welcome email sequence (likely: 12h)87 6. STORY As a new user I want a 3-email welcome drip … (likely: 4h)88 7. TASK Wire welcome drip into IMailingSequenceService (likely: 4h)8990 Push these to the FastLinkIt board? (y / N)91 ```9293 **Waterfall** — number the items, list dependencies in a "depends on"94 column so the human sees the chain at a glance:9596 ```97 I propose for the Q3 platform migration project:9899 # Type Title Likely Depends on100 1 TASK Schema audit + migration plan 12h —101 2 TASK Stand up replica DB 8h #1102 3 TASK Backfill replica from prod snapshot 16h #2103 4 TASK Cutover dry-run 6h #3104 5 TASK Production cutover window 4h #4105 6 TASK Decommission legacy DB 2h #5106107 Push these to the FastLinkIt board? (y / N)108 ```109110 **Kanban** — flat numbered table with type, priority, and est:111112 ```113 I propose for the FastLinkIt Kanban project:114115 # Type Priority Title Likely116 1 TASK high WIP-limit enforcement on board columns 4h117 2 TASK normal Assignee avatars on Kanban cards 2h118 3 BUG normal Drag handle hint on hover (cards look static) 1h119 4 TASK low Dark-mode column-tint cleanup 1h120121 Push these to the FastLinkIt board? (y / N)122 ```123124 Whatever the methodology, always show the item **type** explicitly so125 the human can spot a wrong-shaped item before confirming.1261276. **Always wait for explicit "yes" / "y" before POSTing.** A "let's see"128 or "looks good" without confirmation is NOT consent.1297. On confirmation, build the JSON envelope (see schema below) and call130 `... plan <project-id> <plan.json>`. Report back the created item numbers131 from the response so the human can click them.132133## Pickup mode134135When the user says "start working on FLNKA-N" / "pick up the next one":1361371. Resolve the work item id by listing items (or the user gave one explicitly).1382. Call `... start <project-id> <work-item-id>` with an optional summary139 ("I'll handle the FK migration first, then refactor"). The server:140 - Opens a `WorkItemAgentRun` row with the agent identifier (from141 `FLNKIT_AGENT_ID`, default `claude-code`).142 - Moves the item to the in-progress column.143 - **Sets the assignee** to the agent identifier when the work item144 was previously unassigned — so the row clearly shows "Claude Code"145 in the Assignee column on the board / list. If a human was already146 assigned, the assignee is left alone (the run row still tracks the147 pickup; the audit trail remains intact).148 - Returns a `runId` — **store this** in the conversation; you'll need149 it to close out.1503. Print the response so the human sees "moved from <old> to <new>".151152## Wrap-up mode153154When the agent finishes the work or the user says "done":1551561. Call `... complete <project-id> <work-item-id> <run-id>` with a narrative157 describing what was done (key files touched, follow-up items spawned, any158 gotchas). Server moves the item to the review (or done) column.1592. **If the completed work needs human verification**, list the smoke tests160 in the wrap-up response AND offer to create them as test tasks parented161 to the completed item. See "Test tasks at wrap-up" below.1623. If something blocks progress and you can't finish, call163 `... block <project-id> <work-item-id> <run-id> "<reason>"` instead.164 The reason is mandatory — no silent failures.165166### Test tasks at wrap-up167168Smoke tests are **verification tasks** generated at wrap-up time — they169describe steps the human needs to take to confirm the work is correct.170They're distinct from `acceptance_criteria` on the parent story (which are171conditions baked into the story itself); test tasks are a *follow-up172checklist* that lives on the board so the verification step is tracked173across sessions.174175**When to offer test tasks:**176177- The work touched real code or configuration that benefits from manual178 smoke-testing (UI changes, migration scripts, new endpoints, integration179 with external systems).180- You can't 100% prove it works from the workspace — the user needs to181 reload a page, click through a flow, run a query, etc.182- The number of smoke-test steps is genuinely 2+. Don't create a single183 test task with one bullet — that's a comment in the narrative, not a184 trackable item.185186**When NOT to offer test tasks:**187188- The work was pure refactor / rename / docs and the existing tests cover it.189- The acceptance_criteria on the parent story already enumerates the190 verification steps — no need to duplicate them as separate items.191- The wrap-up was a `block` (Blocked / Failed runs aren't ready for192 verification yet).193194**The ask after `complete_task`:**195196```197Moved FLNKA-23 to Review.198199Suggested smoke tests for you to run:2001. <verification step 1>2012. <verification step 2>2023. <verification step 3>203204Want me to create these as test tasks parented to FLNKA-23? (y / N)205```206207**On the user's "yes":** make a single-item plan POST per test (or one208multi-item plan with the three) using these defaults:209210- `type = "task"` (works in all methodologies — Kanban / Agile / Waterfall).211- `parent_local_id` = the just-completed item, so the test sits in the212 parent's tree.213- `title` = `"Test: <one-line description>"` or `"Smoke test: <…>"`.214- `description` = the verification steps, formatted as a numbered list +215 expected outcome per step.216- `tags = ["test", "smoke-test"]` plus any area tags inherited from the217 parent (e.g. `board`, `mailing`, `payments`).218- `priority` = `normal` by default; `high` only if the user signals219 urgency or it's a regression-blocking test.220- `initial_status = "backlog"` — tests sit in the queue until the user221 picks them up to run.222223After creating, report the new item numbers + titles, and remind the user224the parent is now in Review awaiting their verification:225226```227Created FLNKA-30, FLNKA-31, FLNKA-32 (test tasks under FLNKA-23).228FLNKA-23 stays in Review until the test tasks are closed — pick one up229when you're ready to verify.230```231232## Bug-report mode233234When the user reports a bug ("log a bug", "bug:", "I just hit X", "this235looks broken", "create a bug for Y") OR you discover a bug while working on236something else:2372381. **Don't ask 5 questions.** Draft the bug from what the user gave you and239 ask ONE clarifying question only if a critical field is genuinely missing240 (e.g. "what page were you on?" when they said "the dropdown is broken"241 with no surface context). Trust your code-reading — if you can infer the242 affected file from the description, do so without asking.2432442. Compose the work item with these defaults:245 - `type = "bug"`246 - `priority = "normal"` — escalate to `"high"` if the user said "blocking" /247 "broken in prod" / "data loss"; `"highest"` only on explicit request.248 - `initial_status = "backlog"` (use the actual column key from249 `get_project_context`).250 - `repro_steps` is **mandatory**. Use this template, filled from the251 user's description:252253 ```254 **Repro steps:**255 1. <step 1>256 2. <step 2>257 …258259 **Expected:** <what should happen>260 **Actual:** <what happens instead>261262 **Affected:** <page / component / file path>263 **Environment:** <browser / OS / theme — only when relevant>264 ```265266 - `description` carries any extra narrative: what you were trying when267 it surfaced, recent commits in the area, related code references,268 hypothesis. Markdown OK.269 - `tags`: always include `bug` plus area tags inferred from the270 description (`board`, `wiki`, `mailing`, `links`, `payments`, etc.).2712723. **Auto-parent when the bug surfaces mid-pickup.** If you're in the middle273 of an active `start_task` run on FLNKA-X and notice an unrelated bug in274 the surrounding code, default `parent_local_id` to the **same parent275 feature** as FLNKA-X (one hop up the tree). The bug nests next to the276 work that exposed it. User can override with "no, log it standalone" —277 in which case omit `parent_local_id`.2782794. Surface the proposed bug to the user for confirmation, same gate as Plan280 mode — show the rendered repro steps so they can spot a misread:281282 ```283 I propose:284285 BUG Resize handle loses drag state on Blazor thead re-render286 priority: normal · tags: bug, board, ux287 parent: FLNKA-22 (Worktree-based execution sandbox)288289 Repro steps:290 1. Open /projects/{id} list view291 2. Drag a column resize handle292 3. Trigger a Blazor render that replaces the thead (filter change, sort293 toggle)294 4. Try to resize again295296 Expected: drag continues to work after the re-render297 Actual: handle no longer responds; pointerdown doesn't fire298299 Affected: Components/Pages/ProjectDetail.razor + projects-table-resize.js300 Environment: Edge 131 / Win 11301302 Push to FLNKA? (y / N)303 ```3043055. After the user's "yes", POST a single-item plan to306 `/api/projects/{id}/plan` (the same endpoint Plan mode uses — Bug mode307 is a one-item special-case). Report back the new FLNKA-N + the308 `/projects/{id}` URL.3093106. **If the user pasted screenshots / files**, attach them to the new311 work item AFTER the create call:312 - Each pasted image lands at a real disk path (Claude Code surfaces313 these in the conversation as `[Image: source: <path>]`).314 - List the files in the proposal preview BEFORE the confirmation gate315 so the user knows what'll be attached:316317 ```318 BUG Resize handle pushes preview off-screen319 priority: normal · tags: bug, board, ux320 📎 Attachments: screenshot-2026-05-09-bug.png (442 KB)321322 Push to FLNKA + upload 1 attachment? (y / N)323 ```324325 - On the user's "yes", call `... attach <work-item-id> <file-path>`326 for each file after the plan POST succeeds. The server's allowlist327 rejects executables silently — just report what landed.328 - If an attachment upload fails, surface the failure but don't roll329 back the create — the work item is still useful without the330 screenshot. Suggest re-attaching manually via the UI.3313327. **Optional pickup chain**: if it's clear the user wants to start fixing333 the bug right now, ask "Want me to pick it up now? (y / N)" — on yes,334 chain straight into Pickup mode with the new item id. Don't auto-pickup335 without asking.336337If the bug came up while you were already in the middle of a pickup on338FLNKA-X, the original run stays open — log the bug as a side action, then339return your attention to FLNKA-X (or call `block` on FLNKA-X if the bug340literally blocks the work).341342## Scan mode343344When the user asks "what's on my plate?", "anything assigned to me?",345"what should I resume?", or similar — they want to see the work already346queued for the agent, not propose new items.3473481. Run `... assigned <project-id>` (helper script) or call349 `get_project_context` with `assignee = <FLNKIT_AGENT_ID, default350 "claude-code">` (MCP tool). The server returns `recentItems`351 filtered to items where `AssigneeUserId` matches the agent352 identifier, with the cap lifted to 200.3533542. **Group by status** using the project's column keys, prioritising355 what the human probably wants to see first:356357 - **In progress** items first — these may have an open `WorkItemAgentRun`358 that didn't get closed in a previous session. Surface them with a359 "resume?" suggestion.360 - **Review / Blocked** items next — work the agent has already done361 that's waiting for human action; mention but don't propose to do362 anything.363 - **Backlog / To do** items last — these are ready to pick up. Sort364 by `priority` desc, then by `Number`.3653663. Render the response as a grouped list, with the status column the367 item's in:368369 ```370 You have 4 items assigned to claude-code on FastLinkIt Agile project:371372 In progress (1)373 - FLNKA-22 Worktree-based execution sandbox (likely 28h)374 ⚠ run from previous session may still be open375376 Backlog (2)377 - FLNKA-23 As an AI agent, I want a git worktree… (priority: high)378 - FLNKA-26 As a project owner, I want per-run cost ceilings… (priority: high)379380 Review (1)381 - FLNKA-27 Surface cost progress in AI activity panel (waiting for human review)382383 Want me to resume FLNKA-22, or pick up FLNKA-23 next? (or "neither")384 ```3853864. **Don't auto-resume / auto-pickup.** Always ask first. If the user387 says "resume FLNKA-22", chain into Pickup mode (the existing388 `start_task` call rejects with `409 Conflict` if there's already an389 active run — useful guard, surface the message).390 If the user says "pick up the next one" without naming an item, take391 the highest-priority backlog item from the list and confirm BEFORE392 calling `start_task`.3933945. **"Pick up the next one" shortcut.** When the user phrases the trigger395 as "pick up the next one" / "give me the next task" / "what's next",396 skip the grouped list — go straight to the highest-priority backlog397 item and propose it as a Pickup-mode confirmation.3983996. **Session-start passive mention** (optional, low-key): on the FIRST400 user turn in a fresh session in this repo, if Scan finds in-progress401 items assigned to the agent, mention once: *"I notice 1 item still in402 progress assigned to me from a previous session — say 'resume FLNKA-22'403 to continue."* No auto-resume. Skip the mention entirely when nothing404 is assigned (don't add noise to every session start).405406If the user has multiple projects, default to scanning the project they407mentioned most recently in this conversation; otherwise scan all of them408and group by project.409410## Plan JSON envelope411412The plan endpoint accepts the same shape Anthropic's `submit_plan` tool emits.413Each item carries:414415```json416{417 "summary": "Optional one-line description of the plan",418 "items": [419 {420 "local_id": 1,421 "title": "Add WIP limit enforcement to Kanban columns",422 "type": "task",423 "description": "Markdown body. The KanbanColumn.WipLimit field exists in the schema but no UI surfaces it...",424 "acceptance_criteria": "- Column header shows 'N / Limit' when limit set\n- Drop blocked when over limit\n- Admin override available",425 "initial_status": "backlog",426 "priority": "normal",427 "parent_local_id": null,428 "estimate_optimistic_hours": 2.0,429 "estimate_likely_hours": 4.0,430 "estimate_pessimistic_hours": 8.0,431 "depends_on_local_ids": [],432 "tags": ["kanban", "ux"]433 }434 ]435}436```437438`local_id` is a within-this-plan integer. Use `parent_local_id` and439`depends_on_local_ids` to wire hierarchy + FinishToStart dependencies — they440resolve to real Guids on the server in topological order, so you don't have441to materialise parents first.442443## Conventions to follow444445- **Stories** — write the title as a user story when type is `story`:446 "As a <role> I want <capability> so that <outcome>". Always supply447 `acceptance_criteria` as a bullet list of testable conditions.448- **Bugs** — supply `repro_steps` (numbered list), expected vs actual, and449 the affected component / page.450- **Epics / Features** — keep the description short; treat them as containers.451 Children carry the detail.452- **Tasks** — engineering work, no story ceremony required.453- **Estimates** — three-point PERT (`optimistic` / `likely` / `pessimistic`).454 When uncertain, follow the team's convention from PROJECTS.md or CLAUDE.md.455- **Tags** — reuse existing tags from `recentItems` where they fit; otherwise456 use lowercase short names (`kanban`, `ux`, `api`, `bug`, etc.).457458## Things this skill does NOT do459460- Auto-merge code changes (Phase 1c, separate scoping doc).461- Bypass the human confirmation gate. Ever.462- Pick the project for the user without asking when more than one matches.463- Push items without first running `context` to validate types + columns.464- Modify or delete existing items. (Use the web UI for those.)