Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions .codearbiter/specs/commit-gate-board-sync.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ commit-gate expect and stage the flip, and to add a backstop sweep for any flip
## Atomicity rules (from ADR-0008, for reference)

- **done-flip** `[~]`→`[x]` rides the **completing** commit; reverts on abandonment (self-correcting).
- **start-flip** `[ ]`→`[~]` rides the **first** work commit; reverts on abandonment.
- **start-flip** `[ ]`→`[~]` rides the **first** work commit; it may also mint the
task's single valid dotted ID at pick-up, and reverts on abandonment.
- **raise-new** add `[ ]` rides the work commit (harvest pre-commit), **contingent default**; a
follow-up that must survive abandonment is filed as a **GitHub issue**, not a board-only side commit.

Expand All @@ -48,11 +49,15 @@ pattern already used by `test_ux_conversion.py`.
change is one entry flipping `[~]`+started-date → `[x]`+done-date, the `_taskboardlib` transition
classifier returns *is-transition*.
2. **Classifier — start-flip and add positive.** It returns *is-transition* for (a) a clean start-flip
`[ ]`→`[~]` with a stamped started-date and no other change, and (b) an appended queued
`- [ ] <desc>` entry with no other change.
`[ ]`→`[~]` with a stamped started-date and no other change except the optional single valid
dotted ID minted for an ID-less task at pick-up, and (b) an appended queued `- [ ] <desc>` entry
with no other change. When the writer's requested section is absent, (b) may also append exactly
that one level-two section heading immediately before the queued entry.
3. **Classifier — arbitrary-edit negative.** It returns *not-transition* when the diff includes any
change beyond a state-cell flip, its stamped date, or a single appended queued entry — e.g. a
reworded description, a deleted entry, or an edit to a non-target line.
change beyond a state-cell flip, its stamped date, the start-flip's optional minted ID, or a
single appended queued entry and its necessary new section heading — e.g. a reworded
description, a deleted entry, free-form content beside a new section, or an edit to a non-target
line.
4. **Phase 6 exemption (prose).** commit-gate `SKILL.md` Phase 6 states that an `open-tasks.md` edit the
classifier marks *is-transition* is retained (not flagged as scope creep), while any other board edit
still flags — and names the classifier as the test.
Expand Down
4 changes: 3 additions & 1 deletion .codearbiter/specs/task-board-lifecycle.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,9 @@ stage-blocking). MVP ships without any of them.

- **D-1 — Transition writer surface.** New `/ca:task` (add/start/done) vs. extend
`/ca:standup`/`/ca:status` vs. manual edit. MVP ships with the schema + counters +
nudge; transitions are hand-edited until decided. Gates AC-11.
nudge; transitions are hand-edited until decided. Gates AC-11. **Resolved
post-MVP:** `/ca:task` now enforces `[ ]`→`[~]`→`[x]`; `done` rejects a queued task
and tells the caller to `start` it first (see `task-writer-harvest.md`).
- **D-2 — Archival sweep owner + cutoff.** Which command runs the confirmed
done→`done-tasks.md` sweep, and the "long-settled" age (done >N days). Archival is
post-MVP.
Expand Down
31 changes: 21 additions & 10 deletions .codearbiter/specs/task-writer-harvest.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,17 @@ its origin, under confirmation.
section="## In-flight") -> str` — append a queued entry. ID-LESS by default:
`- [ ] <desc> (from <origin>)`. When `group`+`type` are given, mints
`<group>.<type>.<NNNN>` via `next_seq`. Result is lint-clean; creates `section`
if absent.
if absent. The description must be nonblank and single-line; the section must
be one canonical level-two heading; origin and boundary values must be
single-line. Invalid input returns the original text unchanged.
- `set_state(text, target, state, today, *, assign=None) -> str` — flip a task's
marker (`target` = a dotted id, or the title of an ID-less item). `in_progress`
ALWAYS stamps `(started <today>)`; `done` stamps `(done <today>)`. When `assign`
= `group.type` and the target is ID-less, mints its dotted ID at the same time
(the "ID on pick-up" path).
marker (`target` = a dotted id, or the title of an ID-less item). Valid target
states are only `in_progress` and `done`; `queued` remains a parse/add state,
never a transition target. `in_progress` accepts a queued task and ALWAYS stamps
`(started <today>)`; `done` accepts an in-progress task and stamps `(done
<today>)`. A direct queued-to-done transition is rejected unchanged. When
`assign` = `group.type` and the target is ID-less, mints its dotted ID at the
same time (the "ID on pick-up" path).
- `already_promoted(text, origin) -> bool` — True iff an open (non-done) entry
carries `(from <origin>)`.
- **Three pure extractors** (artifact text + origin → candidate list):
Expand Down Expand Up @@ -87,15 +92,21 @@ suite; reuses existing vocab (`NEEDS-TRIAGE`, DEFERRABLE, `[CONFIRM-NN]`).
desc="X", origin="checkpoint-2026-06-13#H-2")` appends
`- [ ] X (from checkpoint-2026-06-13#H-2)` under `## In-flight`; `count_in_flight`
+1 and `lint_board` clean. Given `group="v2", type="followup"` it instead appends
`- [ ] v2.followup.0001 - X (from …)`.
3. **AC-03 — start/done transitions are dated.** `set_state(board, "v2.api.0001",
"in_progress", date(2026,6,21))` flips `[ ]`→`[~]` and adds `(started 2026-06-21)`;
`"done"` flips to `[x]` and adds `(done 2026-06-21)`. A re-`done` is a safe no-op.
`- [ ] v2.followup.0001 - X (from …)`. Blank or multiline descriptions,
non-heading/multiline sections, multiline origins, and multiline boundary values
are rejected unchanged; the CLI reports the invalid field before writing.
3. **AC-03 — start/done transitions are ordered and dated.** `set_state(board,
"v2.api.0001", "in_progress", date(2026,6,21))` flips `[ ]`→`[~]` and adds
`(started 2026-06-21)`; applying `"done"` to that in-progress result flips
`[~]`→`[x]` and adds `(done 2026-06-21)`. Applying `done` directly to a queued
task is rejected unchanged, and the writer tells the caller to `start` it first.
A re-`done` is a safe no-op.
4. **AC-04 — start of an ID-less item mints + dates** (the pick-up path, D-1 hole
closed): `set_state(board, "<title>", "in_progress", date(2026,6,21),
assign="v2.api")` assigns the next `v2.api.NNNN` dotted ID AND stamps
`(started 2026-06-21)`; `undated_in_progress` on the result is empty and the item
validates.
validates. A malformed `assign`/`--as` namespace (extra or empty component,
whitespace, or a character outside the ID grammar) is rejected before write.
5. **AC-05 — set_state on a missing target** returns the text unchanged and signals
not-found (no silent partial write, no raise).
6. **AC-06 — dedup by origin.** `already_promoted(board, origin)` is True once an open
Expand Down
Loading
Loading