ai4kanban 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -0
- package/bin/ai4kanban.mjs +379 -0
- package/package.json +37 -0
- package/skill/SKILL.md +253 -0
- package/skill/config.md +32 -0
- package/skill/kanban.mjs +1670 -0
- package/skill/references/add-task.md +79 -0
- package/skill/references/auto-refine.md +32 -0
- package/skill/references/document-feature.md +31 -0
- package/skill/references/local-ui.md +34 -0
- package/skill/references/module-map.md +29 -0
- package/skill/references/presets/indie-hacker.md +24 -0
- package/skill/references/presets/validate-on-reddit.md +82 -0
- package/skill/references/propose.md +67 -0
- package/skill/references/prune-memory.md +29 -0
- package/skill/references/recurring-task.md +93 -0
- package/skill/references/refine.md +69 -0
- package/skill/references/resolve.md +56 -0
- package/skill/references/update.md +70 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Add a task
|
|
2
|
+
|
|
3
|
+
Turn an idea into a card on the board.
|
|
4
|
+
|
|
5
|
+
1. **Resolve the modules.** If the modules are not explicitly given, infer them
|
|
6
|
+
yourself: read `docs/kanban/modules.md` and decide which modules the idea
|
|
7
|
+
touches. Never ask the user which modules to use.
|
|
8
|
+
If no module fits, repair `modules.md` according to `references/module-map.md`.
|
|
9
|
+
2. **Scaffold, then write the body.** Run `create --title "..." --track <track>
|
|
10
|
+
--modules <the step-1 modules>` plus any other meta flags (see "The script" in
|
|
11
|
+
`SKILL.md`) writes the file, its frontmatter, and the README entry.
|
|
12
|
+
|
|
13
|
+
## Tightly coupled tasks go in one group
|
|
14
|
+
|
|
15
|
+
If the request needs several tasks that only make sense together, make them a **group
|
|
16
|
+
task** instead of loose cards.
|
|
17
|
+
|
|
18
|
+
Example: "build a plugin system with a Slack and a Notion
|
|
19
|
+
demo plugin" → 4 ids: a group root for the plugin system + a subtask for the
|
|
20
|
+
system + a subtask for the Slack plugin + a subtask for the Notion plugin.
|
|
21
|
+
|
|
22
|
+
See "## Group task" in `SKILL.md` for the folder layout and how to allocate the ids.
|
|
23
|
+
Cards that stand on their own stay loose.
|
|
24
|
+
|
|
25
|
+
## Don't split off near-duplicates
|
|
26
|
+
|
|
27
|
+
If the new card is mostly a tweak, reframe, or extra detail on an upstream card that
|
|
28
|
+
**isn't built yet**, update the upstream card instead. A card earns its own id only
|
|
29
|
+
for genuinely separate work — a different file, system, or deliverable.
|
|
30
|
+
|
|
31
|
+
## Scaffold the card
|
|
32
|
+
|
|
33
|
+
Every meta field comes from a `create` flag. The frontmatter is not hand-editable — pass
|
|
34
|
+
the fields to `${KB} create`:
|
|
35
|
+
|
|
36
|
+
`--blocked-by` and `--related` are optional, based on the task dependencies.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
${KB} create --title "Continue a run's conversation instead of copying its id" \
|
|
40
|
+
--track features --priority med --roi med --modules local-ui
|
|
41
|
+
|
|
42
|
+
${KB} create --title "Stop saving a card's implementing stage" --track features \
|
|
43
|
+
--priority med --roi high --modules local-ui,skill --related 58
|
|
44
|
+
|
|
45
|
+
${KB} create --title "Add a GitHub Projects storage backend for the board" \
|
|
46
|
+
--track features --priority low --roi med --modules skill,local-ui \
|
|
47
|
+
--blocked-by 55,61 --related 57
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
A new card carries no open questions — that's refine's job (`references/refine.md`).
|
|
51
|
+
|
|
52
|
+
Got a field wrong, or learned something after the fact? `${KB} update <id> --priority low`
|
|
53
|
+
— never an editor.
|
|
54
|
+
|
|
55
|
+
## Write the card's body
|
|
56
|
+
|
|
57
|
+
Replace the template — the summary line, `## Scope`, and `## Todo` only.
|
|
58
|
+
|
|
59
|
+
The body is what you write. The shape is rough, not a strict form. Keep lines short and
|
|
60
|
+
plain — a non-native reader skimming should get each line in one pass. Add any section
|
|
61
|
+
that helps; drop any that doesn't.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
<one short line: what to do and why it matters.>
|
|
65
|
+
|
|
66
|
+
## Scope
|
|
67
|
+
- <the concrete steps>
|
|
68
|
+
|
|
69
|
+
## Todo
|
|
70
|
+
- [ ] <one step you can check off>
|
|
71
|
+
- [ ] <…>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- **title** lives in the frontmatter — one source of truth, so no `#` H1 in the body.
|
|
75
|
+
- **Todo** (REQUIRED): the scope split into single-line steps you can check off, in order.
|
|
76
|
+
- **Pushback** — add a `## Pushback` section only if something feels off: too much
|
|
77
|
+
work for the value, not worth doing now, or a risk to users.
|
|
78
|
+
|
|
79
|
+
This isn't a full plan, just enough to start.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Auto-refine
|
|
2
|
+
|
|
3
|
+
Loop refining a card (`references/refine.md`) **and resolving its open questions** (`references/resolve.md`),
|
|
4
|
+
until any of the conditions is met:
|
|
5
|
+
1. status !== "todo"
|
|
6
|
+
2. all todos checked
|
|
7
|
+
3. questions.length > 0 && every question tag === "user"
|
|
8
|
+
|
|
9
|
+
## Question tags
|
|
10
|
+
|
|
11
|
+
Each open question in the card's `questions` frontmatter carries a tag saying who owns it:
|
|
12
|
+
|
|
13
|
+
- **`[user]`** — a judgment call the agent must not guess: taste, priorities, money,
|
|
14
|
+
product direction.
|
|
15
|
+
- **untagged** — freshly raised, not yet triaged. These are what a pass works through.
|
|
16
|
+
|
|
17
|
+
Set tags with the script — never hand-edit frontmatter:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
${KB} tag <id> 1,2,3 user # tag several questions at once (comma-separated)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## The loop
|
|
24
|
+
|
|
25
|
+
Never pause to ask the user.
|
|
26
|
+
|
|
27
|
+
1. Run `references/refine.md`.
|
|
28
|
+
2. If questions is not empty, spawn a subagent and hand it the card and the whole batch
|
|
29
|
+
of untagged questions at once. Questions should be answered with a fresh context.
|
|
30
|
+
It researches and decides according to `references/resolve.md`:
|
|
31
|
+
If answering surfaces new questions, add them untagged and run one more subagent for
|
|
32
|
+
the new batch.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Document a change
|
|
2
|
+
|
|
3
|
+
A shipped change nobody can find is a change that doesn't exist. So every card that ships
|
|
4
|
+
something a user can **see or do** carries todos to update the docs it touches, and it
|
|
5
|
+
isn't done until they're written. Pick the surfaces the change actually touches — most
|
|
6
|
+
touch one, some touch none. If it touches none, say why on the card.
|
|
7
|
+
|
|
8
|
+
Write each doc update as its own todo, so it's checked off before the card is archived.
|
|
9
|
+
|
|
10
|
+
## Surfaces
|
|
11
|
+
|
|
12
|
+
Map the change to the reference docs your project keeps (see the skill's Configuration).
|
|
13
|
+
Common surfaces — use the ones you have:
|
|
14
|
+
|
|
15
|
+
- **User-facing docs / guides** — how a user does the thing. Add or update a guide when
|
|
16
|
+
the change gives the user a **new action, setting, or step**. Without this the user
|
|
17
|
+
never learns the capability is there. This is the default surface: most user-visible
|
|
18
|
+
changes need it.
|
|
19
|
+
- **Landing / marketing copy** — what a **prospect is shown or promised**. Update it when
|
|
20
|
+
the change adds a capability worth advertising, a new surface, or a headline claim.
|
|
21
|
+
Write the change **into the doc only** — don't touch the landing page code unless the
|
|
22
|
+
card says to. The user reviews the doc first, then decides whether to ship it.
|
|
23
|
+
- **Pricing / plans / limits** — update when the change **moves what a tier offers** — a
|
|
24
|
+
new limit, a feature moved between tiers, a new plan, or any price change. Keep the doc
|
|
25
|
+
in sync with what the code actually enforces.
|
|
26
|
+
- **Roadmap / direction** — update only for a **direction-level shift** (positioning, the
|
|
27
|
+
core layers, monetization). A normal change does not belong here; reach for it only when
|
|
28
|
+
the direction itself moves.
|
|
29
|
+
|
|
30
|
+
If your project keeps none of these docs, this step is a no-op — note that on the card and
|
|
31
|
+
move on.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Run the board locally (ai4kanban-ui)
|
|
2
|
+
|
|
3
|
+
An optional Next.js app that shows the board and drives the work from buttons instead of the
|
|
4
|
+
terminal. The board works fully without it; set it up only when you want the buttons. The
|
|
5
|
+
markdown files in `docs/kanban/` stay the single source of truth.
|
|
6
|
+
|
|
7
|
+
**This page is setup only — how to get it running.** Using it (what each button does, group
|
|
8
|
+
tasks, the Configuration dialog) is documented with the app itself:
|
|
9
|
+
<https://www.npmjs.com/package/ai4kanban-ui>, or `kanban-ui/README.md` in its repo.
|
|
10
|
+
|
|
11
|
+
## Run it
|
|
12
|
+
|
|
13
|
+
From your repo root (the folder that holds `docs/kanban/`):
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
npx ai4kanban-ui # http://localhost:7420
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Localhost only. It ships a prebuilt server (nothing to compile) and finds the board by
|
|
20
|
+
walking up to the first `docs/kanban/todo/`. Options:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
npx ai4kanban-ui --board ../my-repo # a board elsewhere (or set KANBAN_BOARD_DIR)
|
|
24
|
+
npx ai4kanban-ui --port 4000 # a different port
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
There's nothing to install — `npx` fetches the package and caches it. To pick up a newer
|
|
28
|
+
release, run it once as `npx ai4kanban-ui@latest`; later plain `npx ai4kanban-ui` runs
|
|
29
|
+
reuse that. (Prefer a permanent command? `npm install -g ai4kanban-ui`, then run
|
|
30
|
+
`ai4kanban-ui`, and `npm update -g ai4kanban-ui` to upgrade.)
|
|
31
|
+
|
|
32
|
+
Nothing else to set up: the app keeps its own settings next to the board, and creates them
|
|
33
|
+
when it first needs them. What those settings are, and what the buttons do, is in the app's
|
|
34
|
+
guide (linked above).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# The module map
|
|
2
|
+
|
|
3
|
+
Write and repair `docs/kanban/modules.md` — a plain list of the project's modules.
|
|
4
|
+
|
|
5
|
+
A module is anything maintained in the codebase that grows independently. Judged by
|
|
6
|
+
meaning, not by folder; a handful of lines, not one per folder. (Not a track: a track
|
|
7
|
+
is a kind of effort, a module is a part of the product — a task has both.)
|
|
8
|
+
|
|
9
|
+
## Example
|
|
10
|
+
|
|
11
|
+
A repo with `server/`, `packages/core/`, `web/`, `cli/`, and `docs/` might map to:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
If a line here disagrees with the repo you just read, fix the line.
|
|
15
|
+
|
|
16
|
+
- **api** — the backend server and its shared core. `server/`, `packages/core/`.
|
|
17
|
+
- **web-app** — the browser app users sign into. `web/`.
|
|
18
|
+
- **cli** — the command-line client. `cli/`.
|
|
19
|
+
- **docs** — the public documentation site. `docs/`.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Five folders, four modules — the server and its core always change together, so they
|
|
23
|
+
are one line.
|
|
24
|
+
|
|
25
|
+
## Repair
|
|
26
|
+
|
|
27
|
+
Whoever reads the map and sees it disagree with the repo fixes it in the same run: add
|
|
28
|
+
the missing line, delete or rename the dead one, fix a stale path. If the user says the
|
|
29
|
+
map is wrong, rebuild from scratch.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Preset: indie-hacker
|
|
2
|
+
|
|
3
|
+
For a solo or small-team product you're trying to launch and grow. Replaces the default
|
|
4
|
+
tracks with a growth-weighted three-track model, and adds two review gates (moat, trust)
|
|
5
|
+
plus a market-validation method.
|
|
6
|
+
|
|
7
|
+
To use this preset, set `PRESET: indie-hacker` in `docs/kanban/config.md` and copy the
|
|
8
|
+
three track values below into the `TRACKS` field.
|
|
9
|
+
|
|
10
|
+
## The three tracks
|
|
11
|
+
|
|
12
|
+
- **growth (50%)** — get in front of users: SEO posts, outreach DMs, posts on
|
|
13
|
+
X / Reddit / LinkedIn / 小红书, YouTube, Product Hunt, G2. Suggest growth methods worth
|
|
14
|
+
trying. If you keep a content pipeline, draft a writer-ready plan first.
|
|
15
|
+
- **validation (30%)** — check the market wants a feature before building deep. Use it for
|
|
16
|
+
roadmap features not built yet, and for built features uncommon in the market. Method:
|
|
17
|
+
post an honest, unbiased question on Reddit / X, or share a free trial on a
|
|
18
|
+
build-in-public community. To run a Reddit validation, follow
|
|
19
|
+
`references/presets/validate-on-reddit.md`. Save results to `docs/validations/<name>.md`
|
|
20
|
+
(or wherever you keep them). Skip subjective tests ("ask your mom").
|
|
21
|
+
- **building (20%)** — stay at MVP; don't over-build. Build when it: scales internal work
|
|
22
|
+
an agent can own, strengthens product positioning, or is strongly demanded by users.
|
|
23
|
+
Building is the trust load-bearer — without it you can't convert, so building blockers
|
|
24
|
+
gate the launch.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Validate a move on Reddit
|
|
2
|
+
|
|
3
|
+
Use for a **validation** task that says to test a product decision, feature, or
|
|
4
|
+
move by posting to Reddit before building.
|
|
5
|
+
|
|
6
|
+
You draft the Reddit posts and scaffold the results doc. The user posts manually
|
|
7
|
+
and pastes replies back; then you write the verdict.
|
|
8
|
+
|
|
9
|
+
## Steps
|
|
10
|
+
|
|
11
|
+
1. **State the goal** — what decision the replies should inform. Soft criteria
|
|
12
|
+
are fine; judge the verdict yourself when replies come in.
|
|
13
|
+
2. **Follow the post style** (below).
|
|
14
|
+
3. **Draft the probes** that fit. Common ones:
|
|
15
|
+
- **Discovery** — unbiased question, no product mention, no links. Reveals
|
|
16
|
+
what they actually do.
|
|
17
|
+
- **Reaction** — share the product, force a choice between the option under
|
|
18
|
+
test and its nearest alternative.
|
|
19
|
+
One probe or several, whatever fits the goal.
|
|
20
|
+
4. **Scaffold** `docs/validations/<slug>.md` (or wherever you keep validation
|
|
21
|
+
write-ups): Goal, each probe, a Results table each, empty Verdict. Raw posts go in
|
|
22
|
+
``` blocks.
|
|
23
|
+
5. **Write the Verdict** from the pasted replies.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- Ask which subreddits the account can post in. Suggest, but don't assume.
|
|
28
|
+
- Don't pad the verdict — if signal is thin or negative, say so.
|
|
29
|
+
- Don't invent replies.
|
|
30
|
+
|
|
31
|
+
## Post writing style
|
|
32
|
+
|
|
33
|
+
<!-- Expand with examples of posts that landed and flopped, per subreddit. -->
|
|
34
|
+
|
|
35
|
+
### Voice
|
|
36
|
+
|
|
37
|
+
- Write like a quick comment typed in the moment, not edited copy. Casual, no marketing tone,
|
|
38
|
+
no hype words.
|
|
39
|
+
- Short: a title under ~10 words and 2–4 plain sentences. Long posts read as ads.
|
|
40
|
+
- Title is one plain question. No em-dashes,
|
|
41
|
+
no slashes, no "X — do you A or B?" headline construction. Just the question.
|
|
42
|
+
- Imperfect on purpose: the odd sentence fragment, drop the wind-up. This is
|
|
43
|
+
genuine casual voice — NOT faked typos or misspellings. Don't manufacture
|
|
44
|
+
errors; just stop polishing.
|
|
45
|
+
- First person. State the situation plainly, list the options you're considering
|
|
46
|
+
if that helps, then ask what they usually do and what they last tried. Avoid
|
|
47
|
+
invented backstory and dramatic self-talk like "part of me..." or "I'm torn..."
|
|
48
|
+
because it reads staged. Don't narrate what "some people" do — that reads like
|
|
49
|
+
a survey.
|
|
50
|
+
- Open straight with the situation or the question. Cut "I've been thinking
|
|
51
|
+
about…", "curious what people think", and every other warm-up line.
|
|
52
|
+
|
|
53
|
+
### Background
|
|
54
|
+
|
|
55
|
+
- Ground it in one concrete situation, not a generic framing. "same complaint
|
|
56
|
+
keeps coming up from users" beats "when problems arise in your business."
|
|
57
|
+
- Give only enough for someone to answer from experience. Skip the rest — no
|
|
58
|
+
paragraph of setup, no explaining why you're asking.
|
|
59
|
+
|
|
60
|
+
### The question
|
|
61
|
+
|
|
62
|
+
- One specific question answerable from experience ("what's the last one you
|
|
63
|
+
actually made?") beats a vague "what do you think?".
|
|
64
|
+
- Ask what they *did*, not what they *think*.
|
|
65
|
+
|
|
66
|
+
### Probe A — unbiased
|
|
67
|
+
|
|
68
|
+
- No product mention, no links.
|
|
69
|
+
- List the options flat and neutral so you don't lead the answer.
|
|
70
|
+
|
|
71
|
+
### Probe B — reaction
|
|
72
|
+
|
|
73
|
+
- One line on what the product does, then the link. Say it's yours — don't hide
|
|
74
|
+
that you built it.
|
|
75
|
+
- Force a choice between the thing under test and its nearest alternative.
|
|
76
|
+
|
|
77
|
+
### Gets a post removed
|
|
78
|
+
|
|
79
|
+
- Self-promo in a no-promo sub, or "I'm doing research" survey framing.
|
|
80
|
+
- Low-karma / new accounts can't post in many subs (AutoModerator checks age and
|
|
81
|
+
karma before a human sees it) — ask first.
|
|
82
|
+
- Read each sub's rules; they differ. Same post pasted across subs reads as spam.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Propose new tasks
|
|
2
|
+
|
|
3
|
+
Pick a module, then propose **3 new tasks inside it**. New work, not picks from the
|
|
4
|
+
board — tasks in one focus close a gap; scattered ideas just skim the product.
|
|
5
|
+
|
|
6
|
+
## 1. Pick the module
|
|
7
|
+
|
|
8
|
+
**Ask the user to pick one or more modules from the map.** If they leave it open, pick
|
|
9
|
+
one yourself — the one where memory says users stumble most.
|
|
10
|
+
|
|
11
|
+
Once you have a focus module, its memory set lives at `docs/kanban/memory/<module>/` (keyed
|
|
12
|
+
by its bolded name in `modules.md`) — the four files described in "The memory set" in
|
|
13
|
+
`SKILL.md`. Read that path, not the whole board, so the notes you work from are that
|
|
14
|
+
module's: `readme.md` for what already shipped (links to the published docs),
|
|
15
|
+
`decisions.md` for settled answers you needn't re-open, and
|
|
16
|
+
`redesign.md` / `rejected.md` to avoid wrong designs and re-proposals. For the long-term
|
|
17
|
+
goal, the horizon, and the roadmap, read `docs/kanban/memory/goal.md` — the board root's
|
|
18
|
+
copy is the only one, and it covers the whole project, not this module. While it's
|
|
19
|
+
open, re-judge its `reviewed:` field and fix a stale value by editing that one line
|
|
20
|
+
(the test is under "The memory set" in `SKILL.md`). For a shipped
|
|
21
|
+
behavior's detail, follow `readme.md`'s links into the module's **published docs** — the
|
|
22
|
+
docs are the record, memory only indexes them. A module with no folder yet has no notes.
|
|
23
|
+
With no focus module or no module map, read the project-wide set at `docs/kanban/memory/`
|
|
24
|
+
instead.
|
|
25
|
+
|
|
26
|
+
**List the cards already tagged with the focus module.** Grep the board for cards whose
|
|
27
|
+
`modules:` field names it — `grep -rl 'modules:.*<module>' docs/kanban/todo/` — and read
|
|
28
|
+
them, so you don't re-propose planned work and you see where the module already has effort.
|
|
29
|
+
|
|
30
|
+
## 2. Walk it as a user
|
|
31
|
+
|
|
32
|
+
Ideas come from a walkthrough, not a feature list. Play one real user story in the
|
|
33
|
+
focus, step by step. At each step ask: what can't they see or find? what do they wait
|
|
34
|
+
on, guess at, or redo by hand? Every stumble is a task idea.
|
|
35
|
+
|
|
36
|
+
Then check the focus's written sources — the code, roadmap doc, user-facing docs
|
|
37
|
+
(Configuration, where shipped behavior is recorded), `todo/`, `rejected.md`, and the focus
|
|
38
|
+
module's memory (from step 1, `readme.md` included) — to catch promised work and stop
|
|
39
|
+
re-proposals.
|
|
40
|
+
|
|
41
|
+
## 3. Propose 3 tasks
|
|
42
|
+
|
|
43
|
+
All inside the focus; none already on the board, already shipped (in the published docs or
|
|
44
|
+
`readme.md`), or in `rejected.md` (unsure one is already done? run the Value check in
|
|
45
|
+
`references/refine.md`). Write each
|
|
46
|
+
with the "Add a task" flow in `SKILL.md`.
|
|
47
|
+
|
|
48
|
+
### Boldness
|
|
49
|
+
|
|
50
|
+
How big a move each of the 3 is. Whoever asks for the run picks one; **normal** unless
|
|
51
|
+
they say otherwise. It changes the size of the idea, never the count — 3 either way.
|
|
52
|
+
|
|
53
|
+
- **safe** — polish a rough edge, or fill a gap in something that already works. No new
|
|
54
|
+
surface: the user's story is the one they play today, just without the stumble.
|
|
55
|
+
- **normal** — a feature each: one card a session can finish. The default size.
|
|
56
|
+
- **bold** — a big leap each: a whole new capability for the module, something the user
|
|
57
|
+
can't do today at all. Judge it against the long-term goal in
|
|
58
|
+
`docs/kanban/memory/goal.md`, not against the current rough edges — a bold task is a
|
|
59
|
+
step toward the horizon. A task this big is normally broad enough to split into
|
|
60
|
+
subtasks that need splitting again, so write it as a **group task** (see "Group task"
|
|
61
|
+
in `SKILL.md`); write it as one card only if the split truly doesn't earn its folder.
|
|
62
|
+
|
|
63
|
+
Boldness is a size, not a licence: a bold task still has to be new (not on the board, not
|
|
64
|
+
shipped, not in `rejected.md`) and still gets written with the "Add a task" flow.
|
|
65
|
+
|
|
66
|
+
A propose run writes no memory. `readme.md` is the finish flow's record — a scan reads
|
|
67
|
+
it and leaves it alone.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Prune the memory set
|
|
2
|
+
|
|
3
|
+
Prune every file in the memory set (see "The memory set" in `SKILL.md`). Prune whichever
|
|
4
|
+
copy you're compressing: the project-wide one at `docs/kanban/memory/` or a module's at
|
|
5
|
+
`docs/kanban/memory/<module>/`. `goal.md` is not in the set — it's user-owned, leave it alone.
|
|
6
|
+
|
|
7
|
+
One principle for all files: they exist to stop us re-proposing work, re-making a
|
|
8
|
+
design mistake, or re-asking a settled question. Rewrite each as **topics** — areas of
|
|
9
|
+
the product — with plain-language takeaways under each. Keep only what helps future
|
|
10
|
+
planning; drop code detail, dates, task ids, step-by-step stories, and the reasoning
|
|
11
|
+
behind settled decisions. Merge lines that say the same thing. Rewrite, don't just cut.
|
|
12
|
+
|
|
13
|
+
On top of that, per file:
|
|
14
|
+
|
|
15
|
+
- `rejected.md` — one line per idea: what not to propose and why. "Already done" is a
|
|
16
|
+
shipped fact, not a rejection — it belongs in the published doc (with a `readme.md`
|
|
17
|
+
line pointing at it), not here; drop it from `rejected.md`.
|
|
18
|
+
- `redesign.md` — one line per entry: the mistake, then the design to use. Drop an
|
|
19
|
+
entry once that design is the obvious default.
|
|
20
|
+
- `readme.md` — one line per shipped user-facing behavior. Where a published doc covers
|
|
21
|
+
it, the line is just a link to that doc's path. **Replace a prose entry with a link
|
|
22
|
+
only after you have confirmed the doc covers that behavior** — search the docs first;
|
|
23
|
+
no doc yet means the prose line stays: `readme.md` is the only record until we
|
|
24
|
+
document it. Anything else — watermarks, a last focus, open gaps, internal detail —
|
|
25
|
+
doesn't belong here; drop it.
|
|
26
|
+
- `decisions.md` — one line per live decision, in plain user-facing words. Drop anything
|
|
27
|
+
that fails its bar in SKILL.md ("The memory set"): a call about code detail, or one the
|
|
28
|
+
published docs now cover. Drop a decision once the question no longer arises or
|
|
29
|
+
`redesign.md` states it as a rule.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Run a recurring task
|
|
2
|
+
|
|
3
|
+
A recurring task is a job we repeat on a cadence. Unlike a one-shot task, it never
|
|
4
|
+
archives — each pass is a **run**, and the card gets sharper each run until a run needs
|
|
5
|
+
no human. This guide covers running one and improving it.
|
|
6
|
+
|
|
7
|
+
## The card shape
|
|
8
|
+
|
|
9
|
+
A recurring card lives in `todo/recurring/`, its own folder parallel to `blockers/` and
|
|
10
|
+
the track folders (see your tracks in Configuration). Its frontmatter marks the track:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
---
|
|
14
|
+
title: …
|
|
15
|
+
track: recurring
|
|
16
|
+
priority: …
|
|
17
|
+
roi: …
|
|
18
|
+
blocked_by: []
|
|
19
|
+
related: []
|
|
20
|
+
questions: []
|
|
21
|
+
---
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
It adds two sections beyond a normal card:
|
|
25
|
+
|
|
26
|
+
- `## Process` — the in-order steps of one run, each tagged by how it runs today.
|
|
27
|
+
- `## Runs` — a pointer to the per-run open-questions files.
|
|
28
|
+
|
|
29
|
+
### The `## Process` ladder
|
|
30
|
+
|
|
31
|
+
Every step carries one tag:
|
|
32
|
+
|
|
33
|
+
- `[script]` — a command anyone can run as-is. The most automatic; include the exact
|
|
34
|
+
command.
|
|
35
|
+
- `[agent]` — a plain-language instruction the agent follows without asking the user.
|
|
36
|
+
- `[ask]` — a step that still needs the user (a judgement call, an approval, missing
|
|
37
|
+
data).
|
|
38
|
+
|
|
39
|
+
The whole point of the recurring type is to **move steps up the ladder** over runs:
|
|
40
|
+
`[ask]` → `[agent]` → `[script]`. A run where every step is `[script]` or `[agent]` needs
|
|
41
|
+
no human. Keep the tags honest — only mark a step `[script]` once the command actually
|
|
42
|
+
exists and works.
|
|
43
|
+
|
|
44
|
+
## One run, start to finish
|
|
45
|
+
|
|
46
|
+
1. **Read the card**, especially `## Process` and the newest run file under `runs/`.
|
|
47
|
+
2. **Do the steps in order**, following each tag. A `[script]` step: run its command. An
|
|
48
|
+
`[agent]` step: do it yourself. An `[ask]` step: ask the user, and hold the answer for
|
|
49
|
+
step 5.
|
|
50
|
+
3. **Record the run:**
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
${KB} run <id>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This adds +1 to `completed` in `metrics.csv` and **keeps the card** — no archive, no
|
|
57
|
+
README edit. It refuses if the card isn't under `todo/recurring/`.
|
|
58
|
+
4. **Self-improve `## Process`.** Rewrite it so the next run needs less human effort:
|
|
59
|
+
- An `[ask]` you answered the same way it could be derived → rewrite as an `[agent]`
|
|
60
|
+
instruction.
|
|
61
|
+
- An `[agent]` step you did the same mechanical way every run → write a small script
|
|
62
|
+
and change it to `[script]` with the command.
|
|
63
|
+
- A step that broke or was ambiguous → tighten the wording.
|
|
64
|
+
Do the smallest real improvement each run; don't invent automation you didn't just do.
|
|
65
|
+
5. **Log what still needed a human.** For each `[ask]` this run, write the question and
|
|
66
|
+
the user's answer to:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
docs/kanban/todo/recurring/<id>-<slug>/runs/<YYYY-MM-DD>-open-questions.md
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
(Create the `<id>-<slug>/runs/` folder next to the card if it doesn't exist.) Before
|
|
73
|
+
the next run, fold answered questions back into `## Process` and delete them from the
|
|
74
|
+
run file. A run file that empties out is the signal that step is now automatic.
|
|
75
|
+
|
|
76
|
+
## Open-questions file shape
|
|
77
|
+
|
|
78
|
+
Keep it plain — the question, the answer, and whether it can be automated next time:
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
# 49 — run 2026-07-10 open questions
|
|
82
|
+
|
|
83
|
+
- **Which topic this run?** → "cold email reply rates" (user picked).
|
|
84
|
+
Next: could a script rank sources by pain count and propose the top one? → move to [agent].
|
|
85
|
+
- **Byline author?** → Jane. Stable across runs → fold into Process as a default.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## What not to do
|
|
89
|
+
|
|
90
|
+
- Don't archive a recurring task or record it as shipped behavior. It has no end state.
|
|
91
|
+
- Don't mark a step `[script]` before the script exists.
|
|
92
|
+
- Don't let run files pile up unread — their whole value is being folded back into
|
|
93
|
+
`## Process` and then emptied.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Refine
|
|
2
|
+
|
|
3
|
+
Take one task one step forward — from vague to concrete. First **check** the card, then
|
|
4
|
+
**rewrite it or raise a question**. **Gate:** a card whose `questions` frontmatter isn't
|
|
5
|
+
empty can't be refined — resolve them first (`references/resolve.md`).
|
|
6
|
+
|
|
7
|
+
## 1. Check
|
|
8
|
+
|
|
9
|
+
Each line below is one plain question. Answer yes or no; a no needs one line saying
|
|
10
|
+
what's wrong. Flag real problems, not hypotheticals.
|
|
11
|
+
|
|
12
|
+
- **Format — is it written like a card?**
|
|
13
|
+
- **On topic**: does the body do what the title says? Anything else is another task.
|
|
14
|
+
- **Plain language**: is every line plain and short ("Writing style" in `SKILL.md`)?
|
|
15
|
+
- **No meta**: free of planning notes and meta-todos ("Card format" in `SKILL.md`)?
|
|
16
|
+
- **A build plan**: is it split into `## Todo` boxes, one step of real work each?
|
|
17
|
+
- **Value — should this task exist at all?**
|
|
18
|
+
- **Direction**: does it move the project toward the long-term goal and roadmap in
|
|
19
|
+
`docs/kanban/memory/goal.md`? Suggest rejection in `questions` on a task that's off-goal.
|
|
20
|
+
- **Already shipped**: is it built already? Code → search the codebase; content → search
|
|
21
|
+
where that content lives (your reference docs); research → check past write-ups.
|
|
22
|
+
- **Duplicate**: does another card already own the idea? Then update it, not this one.
|
|
23
|
+
- **Scope — is the plan the right size for the goal?**
|
|
24
|
+
- **Goal fit**: would the goal still be met with this piece cut? Then it's scope creep.
|
|
25
|
+
The goal is the title and its "so the user can ..." line, not what the summary grew
|
|
26
|
+
into; on topic doesn't mean needed. Common drift: the goal is "find a run's log", the
|
|
27
|
+
plan builds "a history of all runs".
|
|
28
|
+
- **Missing updates/verification**: does the plan skip work it implies — tests, a review pass, landing
|
|
29
|
+
copy? If a user can see the change, it carries doc-update todos so it isn't hidden
|
|
30
|
+
after it ships (`references/document-feature.md`); none needs a why.
|
|
31
|
+
- **Over-complication**: is the design more machinery than the value justifies?
|
|
32
|
+
- **Grouping**: does this card only make sense with another one? Then they're one group.
|
|
33
|
+
- **Design — will the plan work?**
|
|
34
|
+
- **Actionable**: could someone start on it tomorrow, or is it still a rough idea? If
|
|
35
|
+
the how isn't obvious, are the options laid out with one recommended?
|
|
36
|
+
- **Unambiguous**: can it be built without guessing? Code detail isn't needed; an open
|
|
37
|
+
requirement is.
|
|
38
|
+
- **Full user flow**: does the design cover the full user flow, not just the piece the title
|
|
39
|
+
names? For example, auth isn't just login — sign-up and log-out too.
|
|
40
|
+
- **Edge cases**: does the design hold up on them? Re-check the decisions the card
|
|
41
|
+
states — written doesn't mean right. E.g. tasks kept in memory are lost on restart.
|
|
42
|
+
- **Status — does the card match what's already built?**
|
|
43
|
+
- **Stale todos**: is each unchecked todo really still undone? Work lands without the
|
|
44
|
+
box getting ticked.
|
|
45
|
+
- **Finished**: are all the todos done **and** the goal met? Then it's not refinable.
|
|
46
|
+
|
|
47
|
+
## 2. Rewrite, or raise a question
|
|
48
|
+
|
|
49
|
+
Every NO turns into exactly one move below; a card with no problems skips them.
|
|
50
|
+
**Never write the review notes into the card** The card holds the plan and nothing else.
|
|
51
|
+
Read the "Card format" and "Writing style" of `SKILL.md`.
|
|
52
|
+
|
|
53
|
+
- **Rewrite.** Fix the issues while maintaining a minimal task spec.
|
|
54
|
+
- **Reject.** A failed Value check. "Reject an idea" in `SKILL.md`: a line in
|
|
55
|
+
`rejected.md`, then `${KB} reject <id>`. Unsure the value is real? Raise a question.
|
|
56
|
+
- **Add a card.** A side idea, an unplanned, separate concern that doesn't
|
|
57
|
+
belong to this card. "Add a task" in `SKILL.md`, minding `references/add-task.md`'s rule
|
|
58
|
+
against near-duplicate splits.
|
|
59
|
+
- **Group.** Cards that only make sense together: "Group task" in `SKILL.md` and "Tightly
|
|
60
|
+
coupled tasks go in one group" in `references/add-task.md`.
|
|
61
|
+
- **Archive.** Everything done and the goal met: "Finish a task" in `SKILL.md`.
|
|
62
|
+
- **Raise a question** instead of rewriting when the call is the user's (taste, priorities,
|
|
63
|
+
money, product direction), or a **spec-level** problem is significant and you can't
|
|
64
|
+
settle it — is this what the user wants, which of two shapes should the feature take,
|
|
65
|
+
what's the rule in a case the card never names. Record it with `${KB} update <id>
|
|
66
|
+
--question ".."` (repeat the flag), leave that part alone; small calls, make them.
|
|
67
|
+
- **Mark it ready.** A concrete plan and no open questions finishes the card: `${KB} update
|
|
68
|
+
<id> --status ready` — only if this refine stopped at the code level, not one stage
|
|
69
|
+
short. The user scans for the `ready` pill to pick what to build next.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Resolve open questions
|
|
2
|
+
|
|
3
|
+
## Try to answer each question yourself
|
|
4
|
+
|
|
5
|
+
Research first — the module's code, the board, the memory set of any module the card
|
|
6
|
+
names (`docs/kanban/memory/<module>/`), and your reference docs. Many questions are
|
|
7
|
+
already settled, shipped, or rejected once you look.
|
|
8
|
+
|
|
9
|
+
Judgment calls — taste, priorities, money, product direction — get the same pass:
|
|
10
|
+
the trail of past `decisions.md`, `rejected.md`, `redesign.md`, and the board root's
|
|
11
|
+
`goal.md` often shows the user already made this call, or one close enough to decide from.
|
|
12
|
+
|
|
13
|
+
Decide yourself when the evidence gives you confidence. Note the decision and reason
|
|
14
|
+
under `## Decided by the agent` (read "Card format" in `SKILL.md`).
|
|
15
|
+
|
|
16
|
+
## Ask the user the rest
|
|
17
|
+
|
|
18
|
+
Ask when the evidence isn't enough. Write the options
|
|
19
|
+
and your recommendation into the question text itself. Keep it plain and short: one
|
|
20
|
+
line the user can answer at a glance.
|
|
21
|
+
|
|
22
|
+
> Where should the board live? (a) local files — simple; (b) GitHub Projects — syncs
|
|
23
|
+
> with issues. Recommend (a).
|
|
24
|
+
|
|
25
|
+
Run `${KB} tag <id> 1,2,3 user` for these questions.
|
|
26
|
+
|
|
27
|
+
## Update the frontmatter
|
|
28
|
+
|
|
29
|
+
- All answered → `${KB} update <id> --clear-questions`
|
|
30
|
+
- Some answered → `${KB} update <id> --drop-question 1,3` — the 1-based numbers of
|
|
31
|
+
the answered ones. The rest stay untouched, tags included.
|
|
32
|
+
|
|
33
|
+
## Fold the answers into the card
|
|
34
|
+
|
|
35
|
+
Rewrite, don't append. Follow SKILL.md's "Card format" and "Writing style": keep the
|
|
36
|
+
card a minimal task spec. Merge answers on the same topic into one entry — not necessarily one
|
|
37
|
+
entry per question. Cut what the spec no longer needs.
|
|
38
|
+
|
|
39
|
+
An answer sometimes creates work the `## Todo` list doesn't cover — append it as new
|
|
40
|
+
unchecked todos, even when every box is ticked: an open question meant the card wasn't
|
|
41
|
+
finished, so the answers are the remaining work.
|
|
42
|
+
|
|
43
|
+
## Record lasting decisions
|
|
44
|
+
|
|
45
|
+
Append the user's calls to `memory/<module>/decisions.md`, under the topic that fits —
|
|
46
|
+
add a topic, or a subtopic under an existing one, when none does.
|
|
47
|
+
|
|
48
|
+
- **Only what the user decided.** Agent's own calls stay on the card (read "Card format" in
|
|
49
|
+
`SKILL.md`). This file is what the human settled.
|
|
50
|
+
- **Skip** implementation-level and non-user-facing calls.
|
|
51
|
+
- **One plain line each**, written as `**<key>**: <call>` — the key is the question the
|
|
52
|
+
call settles, or a short title for it. Give the call, not the reasoning, but keep it
|
|
53
|
+
clear to someone planning another card:
|
|
54
|
+
`**Where does a finished card go?**: to .archive/, kept in git. A rejected card is deleted.`
|
|
55
|
+
- **A new call replaces the old.** Rewrite the line it contradicts, never leave both. If
|
|
56
|
+
you can't tell which one the user holds, change nothing and ask with a `[user]` question.
|