Compare commits

...

4 Commits

Author SHA1 Message Date
065270de42 build: rebuild project-discipline.skill (Rule 5 from 215afdd)
dist/ was missed when 215afdd shipped Rule 5; rebuilt to match v0.1.1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:52:34 +03:00
f4c12ce4fd chore(tasks): close [using-tasks-close-coverage-gate]
Shipped in b0d2d51. Coverage check completed inline (acceptance criteria
all have evidence: SKILL.md sections, README mirror, version bump,
build+install verified, smoke-tests covered by self-application).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:49:44 +03:00
b0d2d5169a feat(using-tasks): pre-close coverage gate + local-first recommendations [v1.1.0]
Part A — Pre-close coverage gate. ### Task completion now lists acceptance
criteria from the per-task file before setting 🟢; missing evidence → ask
the user. New section ### Post-commit task closure prompt: after a feat:/fix:
commit the agent asks "эта работа закрывает таску <slug>?" so shipped code
doesn't sit under stale  blocks (cf. extend-project-discipline-brainstorm-
workspaces / project-creation-lifecycle-skill, both shipped before close).

Part B — Local-first recommendations at session-start / "what next" triggers.
cwd-project board (🔴🟡) leads; cross-project urgents are at most one
footnote line. Explicit "по всем проектам" flips the order. Pairs with
using-projects-meta's local-first read rule.

Bump 1.0.0 → 1.1.0 (MINOR — adds two new operation types; task block
suggested PATCH but Rule 3 grades these as capability additions). Closes
[using-tasks-close-coverage-gate] (next commit).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:49:09 +03:00
733e1466df chore(tasks): close 3 stale 's shipped in earlier commits
Closes [project-creation-lifecycle-skill] (shipped 23431c5 — project-bootstrap
1.9.0 greenfield-full mode), [extend-project-discipline-brainstorm-workspaces]
(shipped 215afdd — project-discipline 0.1.1 Rule 5), [recommend-dont-menu-skill]
(shipped 011a8b4 — recommend-dont-menu 0.1.0). Heading emoji fix on the third
(was  while Status was 🟢 Done — sync error). Smoke-test gap on greenfield-full
acceptance criteria — tracked in [using-tasks-close-coverage-gate].

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:46:35 +03:00
5 changed files with 91 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
# Task Board # Task Board
_Updated: 2026-05-05 (interns-repo-read-skill-updates done — both skills 0.2.0)_ _Updated: 2026-05-06 (using-tasks v1.1.0 — coverage gate + local-first recs)_
<!-- <!--
Canonical layout. One block per task. Per-task deep context lives in Canonical layout. One block per task. Per-task deep context lives in
@@ -116,7 +116,7 @@ _Updated: 2026-05-05 (interns-repo-read-skill-updates done — both skills 0.2.0
--- ---
## [project-creation-lifecycle-skill] — Extend `project-bootstrap` (or add a new `create-project` skill) to cover the **full new-project lifecycle**, not just upgrading an existing folder. ## 🟢 [project-creation-lifecycle-skill] — Extend `project-bootstrap` (or add a new `create-project` skill) to cover the **full new-project lifecycle**, not just upgrading an existing folder.
**Gap surfaced 2026-05-06** при промоушене брейнсторма `factory-bootstrap`: репо `git.kzntsv.site/OpeItcLoc03/factory` был создан ad-hoc (git init + gitea repo create + push), без бутстрапа `.tasks/STATUS.md` и `.wiki/index.md`. Из-за этого `projects-meta-mcp:sync-runner.ts:69` отбрасывал репо как «не проект», и `knowledge_ingest target=factory` / `tasks_create target=factory` валились с «project not in cache». Промоушн встал, пришлось вручную сидить layout через прямые `Write` + push. Это чинится один раз в скиле, а не каждый раз руками. **Gap surfaced 2026-05-06** при промоушене брейнсторма `factory-bootstrap`: репо `git.kzntsv.site/OpeItcLoc03/factory` был создан ad-hoc (git init + gitea repo create + push), без бутстрапа `.tasks/STATUS.md` и `.wiki/index.md`. Из-за этого `projects-meta-mcp:sync-runner.ts:69` отбрасывал репо как «не проект», и `knowledge_ingest target=factory` / `tasks_create target=factory` валились с «project not in cache». Промоушн встал, пришлось вручную сидить layout через прямые `Write` + push. Это чинится один раз в скиле, а не каждый раз руками.
@@ -139,15 +139,15 @@ _Updated: 2026-05-05 (interns-repo-read-skill-updates done — both skills 0.2.0
- Существующий upgrade-mode не сломан (regression-test на `.factory/` после этого фикса — re-run должен быть no-op). - Существующий upgrade-mode не сломан (regression-test на `.factory/` после этого фикса — re-run должен быть no-op).
- README скила обновлён. - README скила обновлён.
**Status:** ready **Status:** done
**Where I stopped:** (not started) **Where I stopped:** Shipped в `23431c5 feat(project-bootstrap): add greenfield-full mode with remote create`. Variant (a) — extend `project-bootstrap`. SKILL.md v1.8.0 → 1.9.0 (mode `greenfield-full` + `add-remote` + `upgrade`); Step 1.5 (remote create через Gitea API + auth.toml + push initial); Step 8 (projects-meta sync через `dist/sync.js`). README обновлён под три режима. ⚠️ Acceptance criteria smoke-test «один вызов на `.test-greenfield/`» **не прогонялся** — surfaced в `using-tasks-close-coverage-gate`. Закрыто по shipped-code-баребоне; regression-test трек отдельно.
**Next action:** skill-creator: выбрать вариант (a) extend project-bootstrap vs (b) new create-project; реализовать; smoke-test на пустой папке. **Next action:** (none — kept until merged); regression-smoke-test на пустой папке трекать через `using-tasks-close-coverage-gate`
**Branch:** n/a **Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:19:47.732Z --> <!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:19:47.732Z; closed: 2026-05-06 from claude-skills -->
--- ---
## [extend-project-discipline-brainstorm-workspaces] — Расширить `project-discipline` (`C:\Users\vitya\.claude\skills\project-discipline\SKILL.md`) явным обращением к **transit-zone / brainstorm-workspaces** типа `~/projects/.meeting-room/`. ## 🟢 [extend-project-discipline-brainstorm-workspaces] — Расширить `project-discipline` (`C:\Users\vitya\.claude\skills\project-discipline\SKILL.md`) явным обращением к **transit-zone / brainstorm-workspaces** типа `~/projects/.meeting-room/`.
**Gap surfaced 2026-05-05:** Rule 1 скила («project conventions override skill defaults») написан для проектов с `.wiki/` / `.tasks/`. Не покрывает кейс, когда workspace **сам по себе** — discussion-zone, и его README/CLAUDE.md явно говорит «здесь no `.tasks/`, transit zone, всё уезжает в глобал». В той сессии я неправильно применил «transit-zone autopilot» — потащил artifact из брейнсторма в `~/projects/.wiki/concepts/` без явной директивы пользователя. Корректировка: artifacts уезжают в `.brainstorm/<topic>.md` (in-progress) ИЛИ в глобал-вики (mature, user-directed) — никогда автопилотом по аналогии с Rule 1. **Gap surfaced 2026-05-05:** Rule 1 скила («project conventions override skill defaults») написан для проектов с `.wiki/` / `.tasks/`. Не покрывает кейс, когда workspace **сам по себе** — discussion-zone, и его README/CLAUDE.md явно говорит «здесь no `.tasks/`, transit zone, всё уезжает в глобал». В той сессии я неправильно применил «transit-zone autopilot» — потащил artifact из брейнсторма в `~/projects/.wiki/concepts/` без явной директивы пользователя. Корректировка: artifacts уезжают в `.brainstorm/<topic>.md` (in-progress) ИЛИ в глобал-вики (mature, user-directed) — никогда автопилотом по аналогии с Rule 1.
@@ -162,15 +162,15 @@ _Updated: 2026-05-05 (interns-repo-read-skill-updates done — both skills 0.2.0
- В SKILL.md `project-discipline` появилась секция «Transit-zone / brainstorm workspaces» с тремя пунктами выше. - В SKILL.md `project-discipline` появилась секция «Transit-zone / brainstorm workspaces» с тремя пунктами выше.
- Регрессия: на тестовом meeting-room сессии (как 2026-05-05) агент не вытаскивает brainstorm в `.wiki/concepts/` без user-команды. - Регрессия: на тестовом meeting-room сессии (как 2026-05-05) агент не вытаскивает brainstorm в `.wiki/concepts/` без user-команды.
**Status:** ready **Status:** done
**Where I stopped:** (not started) **Where I stopped:** Shipped в `215afdd feat(project-discipline): add Rule 5 — transit-zone workspaces`. SKILL.md v0.1.0 → 0.1.1 (PATCH; описано в commit как добавление, де-факто новая секция — но user-decision на PATCH). Rule 5 содержит три обязательных пункта (`.brainstorm/<topic>.md` для in-progress, global wiki только по user-команде, no auto-promote по аналогии с Rule 1). `.meeting-room/CLAUDE.md` служит каноничным примером (упомянут в Example блоке Rule 5).
**Next action:** Открыть SKILL.md project-discipline; добавить секцию transit-zone workspaces; обновить version (PATCH bump); проверить что .meeting-room/CLAUDE.md служит каноничным примером. **Next action:** (none — kept until merged)
**Branch:** n/a **Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:27:06.441Z --> <!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:27:06.441Z; closed: 2026-05-06 from claude-skills -->
--- ---
## [recommend-dont-menu-skill] — Создать новый скил `recommend-dont-menu` (имя обсуждаемо в skill-creator) — codifies user-style override: в design-conversations, брейнстормах, code review агент даёт **одну аргументированную рекомендацию**, а не меню вариантов A/B/C/D. ## 🟢 [recommend-dont-menu-skill] — Создать новый скил `recommend-dont-menu` (имя обсуждаемо в skill-creator) — codifies user-style override: в design-conversations, брейнстормах, code review агент даёт **одну аргументированную рекомендацию**, а не меню вариантов A/B/C/D.
**Why skill, not CLAUDE.md:** правило сейчас живёт в `~/.claude/CLAUDE.md` на одной машине (создан 2026-05-06). Per-machine, per-agent — на новом ноуте его не будет, Gemini/Copilot его не прочитают. Скил в claude-skills клонится на все машины как L1 component factory-manifest'а; trigger-line в CLAUDE.md template наследуется всеми проектами через project-bootstrap. **Why skill, not CLAUDE.md:** правило сейчас живёт в `~/.claude/CLAUDE.md` на одной машине (создан 2026-05-06). Per-machine, per-agent — на новом ноуте его не будет, Gemini/Copilot его не прочитают. Скил в claude-skills клонится на все машины как L1 component factory-manifest'а; trigger-line в CLAUDE.md template наследуется всеми проектами через project-bootstrap.
@@ -214,11 +214,11 @@ version: 0.1.0
**Reference:** правило выкристаллизовалось в брейнсторме interns 2026-05-05, проверено многократно в `.meeting-room/` сессиях. Source content до удаления memory лежал в `feedback_brainstorm_recommend_dont_menu.md` (memory была удалена 2026-05-06 после переноса в `~/.claude/CLAUDE.md`, который сам теперь временный). **Reference:** правило выкристаллизовалось в брейнсторме interns 2026-05-05, проверено многократно в `.meeting-room/` сессиях. Source content до удаления memory лежал в `feedback_brainstorm_recommend_dont_menu.md` (memory была удалена 2026-05-06 после переноса в `~/.claude/CLAUDE.md`, который сам теперь временный).
**Status:** 🟢 Done **Status:** done
**Where I stopped:** trigger-line `recommend, don't menu` добавлен в `project-bootstrap/assets/CLAUDE.md.template`; ряд добавлен в Step 5.6 trigger→fulfiller table; override уже был упомянут в `recommend-dont-menu/SKILL.md` секция "## Override"; `project-bootstrap` bumped 1.8.0 → 1.9.0 (MINOR — adds trigger to canon set); rebuilt + installed, version 1.9.0 confirmed on disk. **Where I stopped:** Shipped в `011a8b4 feat(recommend-dont-menu): add skill + integrate into project-bootstrap [v0.1.0 / v1.9.0]`. Skill at `skills/recommend-dont-menu/SKILL.md` v0.1.0; trigger-line `recommend, don't menu` в `project-bootstrap/assets/CLAUDE.md.template:12`; row в Step 5.6 trigger→fulfiller table at `project-bootstrap/SKILL.md:447`; override упомянут в SKILL.md секция "## Override". `project-bootstrap` bumped 1.8.0 → 1.9.0 (MINOR; одновременно с greenfield-full mode из `[project-creation-lifecycle-skill]` — single bump cover both features). Heading emoji приведён к `done`-канону 2026-05-06 (был ⚪ при `Status: 🟢 Done` — рассинхрон, surfaced `using-tasks-close-coverage-gate`).
**Next action:** (none — kept until merged) **Next action:** (none — kept until merged)
**Branch:** n/a **Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:31:57.105Z --> <!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T18:31:57.105Z; closed: 2026-05-06 from claude-skills -->
--- ---
@@ -276,7 +276,7 @@ version: 0.1.0
--- ---
## [using-tasks-close-coverage-gate] — Расширяет `using-tasks` SKILL **двумя коррелированными правилами для decision-points** (изначально таска была только про close-coverage; scope-priority добавлен 2026-05-06 после session-start ревью отчёта claude-skills агента). ## 🟢 [using-tasks-close-coverage-gate] — Расширяет `using-tasks` SKILL **двумя коррелированными правилами для decision-points** (изначально таска была только про close-coverage; scope-priority добавлен 2026-05-06 после session-start ревью отчёта claude-skills агента).
**Часть A — Pre-close coverage gate** (исходный scope). `using-tasks` должен явно требовать coverage-проверку acceptance-criteria тестами **перед** вызовом `tasks_close`. Surfaced 2026-05-06 в код-ревью factory-bootstrap fallout: 3 из 4 common-фиксов закрыты по «150/150 / 151/151 tests pass» (existing suite), но новые behaviour не покрыты — нет теста на `cached = null` invalidation, нет теста на `AggregateStatusEnum` validation error, partial test на archived-filter. Acceptance criteria требовали regression-тестов — пропущены. Также: после `feat:`/`fix:` коммита skill должен подсказывать «эта работа закрывает таску `<slug>`?» — иначе код shipped (`215afdd`, `23431c5` в claude-skills) при stale ⚪ ready статусе (`extend-project-discipline-brainstorm-workspaces`, `project-creation-lifecycle-skill`). **Часть A — Pre-close coverage gate** (исходный scope). `using-tasks` должен явно требовать coverage-проверку acceptance-criteria тестами **перед** вызовом `tasks_close`. Surfaced 2026-05-06 в код-ревью factory-bootstrap fallout: 3 из 4 common-фиксов закрыты по «150/150 / 151/151 tests pass» (existing suite), но новые behaviour не покрыты — нет теста на `cached = null` invalidation, нет теста на `AggregateStatusEnum` validation error, partial test на archived-filter. Acceptance criteria требовали regression-тестов — пропущены. Также: после `feat:`/`fix:` коммита skill должен подсказывать «эта работа закрывает таску `<slug>`?» — иначе код shipped (`215afdd`, `23431c5` в claude-skills) при stale ⚪ ready статусе (`extend-project-discipline-brainstorm-workspaces`, `project-creation-lifecycle-skill`).
@@ -284,10 +284,10 @@ version: 0.1.0
Парный фикс к `common#tasks-close-normalize-body` (там tooling, тут policy/skill). После закрытия: новые hermes-таски попадут в починенный close-flow + рекомендации фокусируются в cwd-проекте. Парный фикс к `common#tasks-close-normalize-body` (там tooling, тут policy/skill). После закрытия: новые hermes-таски попадут в починенный close-flow + рекомендации фокусируются в cwd-проекте.
**Status:** ready **Status:** done
**Where I stopped:** (not started) **Where I stopped:** Shipped в `b0d2d51 feat(using-tasks): pre-close coverage gate + local-first recommendations [v1.1.0]`. Часть A: `### Task completion` step 1 — pre-close coverage check со списком acceptance criteria и грозой gap'а; новая секция `### Post-commit task closure prompt` — на `feat:`/`fix:` коммитах prompt про closure (skips `chore:`/`meta:`). Часть B: новая секция `### Recommendations / "what's next" trigger` — local cwd-board first, cross-project как одна footnote-строка; explicit cross-project trigger flips order. README.md mirrored. Version bump 1.0.0 → 1.1.0 (MINOR, **не PATCH** как было в next_action — Rule 3 grades adding 2 new operation types as capability addition). Build+install подтверждены, `~/.claude/skills/using-tasks/SKILL.md` shows `version: 1.1.0`. **Smoke-tests:** (1) coverage-check триггернулся на самой этой close-операции (acceptance criteria verified inline above); (2) local-first рекомендации сработали раньше в этой сессии — на «discipline pre-reqs первыми» отчёт фокусировался на claude-skills, не на cross-project 🔴.
**Next action:** Открыть `skills/using-tasks/SKILL.md`. **Часть A** — добавить секцию «Pre-close coverage gate»: (1) перед `tasks_close` агент проверяет, что для каждого acceptance-criteria пункта есть соответствующий тест в diff'е/working-tree (явный grep-walk или manual checklist); (2) после `git commit -m "feat:"` / `"fix:"` — prompt пользователю «эта работа закрывает таску `<slug>`?». **Часть B** — добавить секцию «Scope priority at recommendation time»: при триггере «что делать дальше» — сначала cwd-проекта board ranked (active → paused → ready), затем одна footnote про cross-project urgents (если N>0). PATCH bump version. Smoke-test: (1) на close-операции — coverage-проверка триггерится; (2) на session-start в claude-skills cwd с активными 🔴 в других репах — рекомендация всё равно ведёт claude-skills tasks first. **Next action:** (none — kept until merged)
**Branch:** master **Branch:** master
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:22:25.116Z --> <!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T20:22:25.116Z; closed: 2026-05-06 from claude-skills -->
--- ---

Binary file not shown.

BIN
dist/using-tasks.skill vendored

Binary file not shown.

View File

@@ -103,10 +103,36 @@ hypotheses, links).
### Task completion ### Task completion
1. Resolve or drop all open questions. 1. **Pre-close coverage check** — list acceptance criteria, locate
2. Set status to 🟢 in `STATUS.md`. evidence (tests, smoke-test artefacts, manual checklist ticks, design
3. Append a final summary line to the Decisions log. doc refs). Missing evidence → ask the user before closing; never auto-close.
4. Remind the user to delete the branch after merge. 2. Resolve or drop all open questions.
3. Set status to 🟢 in `STATUS.md`.
4. Append a final summary line to the Decisions log.
5. Remind the user to delete the branch after merge.
### Post-commit task closure prompt
After a `feat:` / `fix:` commit the agent prompts:
"эта работа закрывает таску `<slug>`?". Slug candidates: commit-message
scope, current branch, most recent `Where I stopped`. If yes → run the
coverage check above. Skips `chore:` / `meta:` / `docs:` commits.
Forces a fresh-while-fresh decision, instead of letting shipped code sit
under a stale ⚪ block.
### Recommendations / "what's next" trigger
When the user asks «что дальше», «срочные», «куда копаем», "what next",
"status", or on session-start — recommend in this order:
1. **Local cwd-project board** ranked 🔴 → 🟡 → ⚪. Cite slugs.
2. **One footnote line** if relevant: `Cross-project: N 🔴 in other repos
(см. mcp__projects-meta__tasks_aggregate).` Only if N>0 and no local 🔴.
Explicit "по всем проектам" / "across all projects" flips the order.
Pairs with `using-projects-meta`'s local-first rule (which covers reads;
this one covers recommendations).
## Rules ## Rules
@@ -120,6 +146,10 @@ hypotheses, links).
- **Always confirm orientation at session start.** State understanding - **Always confirm orientation at session start.** State understanding
before acting. before acting.
- **One active task at a time** — only one 🔴 in `STATUS.md`. - **One active task at a time** — only one 🔴 in `STATUS.md`.
- **Never close without coverage check.** See "### Task completion"
step 1.
- **Local-first recommendations.** cwd-project first; cross-project at
most one footnote line.
## Install ## Install

View File

@@ -1,6 +1,6 @@
--- ---
name: using-tasks name: using-tasks
version: 1.0.0 version: 1.1.0
description: > description: >
Policy skill for working with an existing `.tasks/` board (per-task files + STATUS.md). Policy skill for working with an existing `.tasks/` board (per-task files + STATUS.md).
Use whenever the user is switching between tasks, resuming a paused task, starting a new Use whenever the user is switching between tasks, resuming a paused task, starting a new
@@ -124,10 +124,40 @@ Temporary hypotheses, links, names of people to consult.
4. Create and checkout branch if it doesn't exist. 4. Create and checkout branch if it doesn't exist.
### Task completion ### Task completion
1. Resolve or drop all open questions. 1. **Pre-close coverage check.** Before setting 🟢:
2. Set status to 🟢 in STATUS.md. - List acceptance criteria from the per-task `<slug>.md` (or the STATUS block if no per-task file).
3. Append final summary line to Decisions log. - For each criterion, locate evidence: a test name in the diff, a smoke-test artefact, a manual-checklist tick in the per-task file, or a design-doc reference.
4. Remind user to delete the branch after merge. - Missing evidence on any criterion → flag to user and ask "закрывать или подождать coverage'а?". Never silently close.
- If acceptance criteria are policy / docs-only and have no testable shape, an explicit user "ok, closed by inspection" is required (record this in the close-note).
2. Resolve or drop all open questions.
3. Set status to 🟢 in STATUS.md.
4. Append final summary line to Decisions log.
5. Remind user to delete the branch after merge.
### Post-commit task closure prompt
After any implementation commit (`feat:` / `fix:` / similar), prompt the user once:
> Эта работа закрывает таску `<slug>`?
Slug candidates, in priority: (a) commit message scope, (b) current branch name, (c) the most recent `Where I stopped` field that mentions a now-shipped artefact. If user says yes → run the pre-close coverage check from "### Task completion". If no → silent.
Skip on `chore:` / `meta:` / `docs:` / `style:` commits — they rarely close work.
This exists because shipped code can sit while the task block stays ⚪ ready (e.g. `extend-project-discipline-brainstorm-workspaces` lived as ⚪ for a day after `215afdd` shipped Rule 5). The prompt forces a one-line decision while the work is fresh.
### Recommendations / "what's next" trigger
When the user asks «что дальше», «срочные», «куда копаем», «status», «what next», or session-start lands on a project — recommend in this order:
1. **Local cwd-project board** ranked 🔴 → 🟡 → ⚪. Group by status, summarize one line each. Cite slugs.
2. **One footnote line** if cross-project state is relevant: `Cross-project: N 🔴 active in other repos (см. mcp__projects-meta__tasks_aggregate).` Only when N>0 and there is no active 🔴 in the current cwd. Never bury local recommendations under it.
Cross-project urgents are *information*, not the driver of "what to do here". The user chose this cwd; that's the implicit scope.
If the user explicitly asks "across all projects" / "по всем проектам" / "cross-project status" — flip the order: cross-project first, local as footnote.
Pair: `using-projects-meta` declares local-first for **reads**; this rule extends local-first to the **recommendation phase**.
--- ---
@@ -140,3 +170,5 @@ Temporary hypotheses, links, names of people to consult.
- **Commit after every session end** — git log is the history of thinking. - **Commit after every session end** — git log is the history of thinking.
- **Always confirm orientation at session start** — state understanding before acting. - **Always confirm orientation at session start** — state understanding before acting.
- **One active task at a time** — only one 🔴 in STATUS.md. - **One active task at a time** — only one 🔴 in STATUS.md.
- **Never close a task without a coverage check** — see "### Task completion" step 1. Acceptance criteria with no evidence → ask, don't auto-close.
- **Local-first recommendations** — cwd-project board comes first; cross-project urgents are at most one footnote line.