IW-715: review-state update creates the card when none exists #717

Merged
mph merged 14 commits from IW-715 into main 2026-10-05 12:17:51 +00:00
Member

Summary

iw review-state update creates the card when the default card does not exist. A workflow step now says only what state it wants; it does not choose between update and write, and it needs no path.

Changes

  • update creates a missing default card — it merges onto an empty valid card (version 2, issue_id, artifacts: [], last_updated) and writes it, parent directories included. Output says created or updated.
  • Tracked in-tree card is moved first, then merged into — checkpoints, artifacts and badges survive (no overwrite).
  • Explicit --input that does not exist still fails — exit 1, names --input, writes nothing.
  • --append-artifact is keyed by path — a second append of the same path replaces the entry in place. The key lives in the shared merge, so phase-start, phase-pr, phase-merge, phase-advance and ci-gate dedupe the same way. This closes the artifacts part of #200.
  • Declarations and docs — update and write declaration texts, regenerated docs/commands/review-state.md, and docs/review-state-cards.md.

Main files: core/commands/ReviewState.scala (applyUpdate, writeCard), core/model/ReviewStateUpdater.scala (baseCard, path key).

Testing

  • Unit: ReviewStateUpdaterTest (+4, 1 changed).
  • Harness: ReviewStateHarnessTest (+6, tracked-card move test extended).
  • E2E: test/review-state.bats (+1 create-on-fresh-repo, 1 extended).
  • Phase PR #716 merged after CI; pre-push checks passed on this branch.

Review packet: project-management/issues/IW-715/review-packet.md.

Release notes

Úkol: IW-715
Datum: 5. 10. 2026

Zaznamenat stav práce na stavové kartě úkolu je teď jeden krok. Dosud musel každý krok pracovního postupu nejprve zjistit, zda karta už existuje, a podle toho zvolit, zda ji vytvoří, nebo upraví. Od doby, kdy karta neleží v pracovním adresáři, to ale krok spolehlivě zjistit nemohl. Při chybném odhadu mohl kartu přepsat celou a ztratit záznamy o dokončených fázích, odkazy na dokumenty i štítky. Nástroj teď o tomto rozhoduje sám: krok jen řekne, jaký stav chce zapsat.

Příkaz iw review-state update nyní kartu vytvoří, když pro daný úkol ještě žádná neexistuje. Nová karta obsahuje jen základní údaje o úkolu a k nim zadané změny, takže ji kontrola formátu přijme bez dalších úprav. Když karta už existuje, změny se do ní doplní jako dosud a vše ostatní na ní zůstane beze změny. Pokud větev ještě drží kartu ve starém umístění v pracovním adresáři, nástroj ji nejprve přesune a změny doplní do ní, takže se nic neztratí. Výpis po dokončení rozlišuje, zda byla karta vytvořena, nebo upravena.

Opakované přidání téhož dokumentu na kartu už nevytváří duplicitní záznamy. Dokument se pozná podle své cesty: když už na kartě je, jeho záznam se nahradí na stejném místě. Totéž platí pro kroky, které zakládají, odevzdávají a slučují jednotlivé fáze.

Pokud uživatel výslovně zadá cestu ke kartě a soubor na ní neexistuje, příkaz dál skončí chybou a nic nezapíše. Taková cesta se vždy použije přesně tak, jak byla zadána, a vytváří se jen výchozí karta úkolu. Příkaz pro úplné přepsání karty zůstává beze změny a slouží jen k nahrazení celé karty. Postupy, které dosud volily mezi vytvořením a úpravou karty, mohou tuto volbu vynechat a používat jen úpravu.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ

Closes #715

## Summary `iw review-state update` creates the card when the default card does not exist. A workflow step now says only what state it wants; it does not choose between `update` and `write`, and it needs no path. ## Changes - **`update` creates a missing default card** — it merges onto an empty valid card (`version 2`, `issue_id`, `artifacts: []`, `last_updated`) and writes it, parent directories included. Output says `created` or `updated`. - **Tracked in-tree card is moved first, then merged into** — checkpoints, artifacts and badges survive (no overwrite). - **Explicit `--input` that does not exist still fails** — exit 1, names `--input`, writes nothing. - **`--append-artifact` is keyed by `path`** — a second append of the same path replaces the entry in place. The key lives in the shared `merge`, so `phase-start`, `phase-pr`, `phase-merge`, `phase-advance` and `ci-gate` dedupe the same way. This closes the artifacts part of #200. - **Declarations and docs** — `update` and `write` declaration texts, regenerated `docs/commands/review-state.md`, and `docs/review-state-cards.md`. Main files: `core/commands/ReviewState.scala` (`applyUpdate`, `writeCard`), `core/model/ReviewStateUpdater.scala` (`baseCard`, path key). ## Testing - Unit: `ReviewStateUpdaterTest` (+4, 1 changed). - Harness: `ReviewStateHarnessTest` (+6, tracked-card move test extended). - E2E: `test/review-state.bats` (+1 create-on-fresh-repo, 1 extended). - Phase PR #716 merged after CI; pre-push checks passed on this branch. Review packet: `project-management/issues/IW-715/review-packet.md`. ## Release notes **Úkol:** IW-715 **Datum:** 5. 10. 2026 Zaznamenat stav práce na stavové kartě úkolu je teď jeden krok. Dosud musel každý krok pracovního postupu nejprve zjistit, zda karta už existuje, a podle toho zvolit, zda ji vytvoří, nebo upraví. Od doby, kdy karta neleží v pracovním adresáři, to ale krok spolehlivě zjistit nemohl. Při chybném odhadu mohl kartu přepsat celou a ztratit záznamy o dokončených fázích, odkazy na dokumenty i štítky. Nástroj teď o tomto rozhoduje sám: krok jen řekne, jaký stav chce zapsat. Příkaz `iw review-state update` nyní kartu vytvoří, když pro daný úkol ještě žádná neexistuje. Nová karta obsahuje jen základní údaje o úkolu a k nim zadané změny, takže ji kontrola formátu přijme bez dalších úprav. Když karta už existuje, změny se do ní doplní jako dosud a vše ostatní na ní zůstane beze změny. Pokud větev ještě drží kartu ve starém umístění v pracovním adresáři, nástroj ji nejprve přesune a změny doplní do ní, takže se nic neztratí. Výpis po dokončení rozlišuje, zda byla karta vytvořena, nebo upravena. Opakované přidání téhož dokumentu na kartu už nevytváří duplicitní záznamy. Dokument se pozná podle své cesty: když už na kartě je, jeho záznam se nahradí na stejném místě. Totéž platí pro kroky, které zakládají, odevzdávají a slučují jednotlivé fáze. Pokud uživatel výslovně zadá cestu ke kartě a soubor na ní neexistuje, příkaz dál skončí chybou a nic nezapíše. Taková cesta se vždy použije přesně tak, jak byla zadána, a vytváří se jen výchozí karta úkolu. Příkaz pro úplné přepsání karty zůstává beze změny a slouží jen k nahrazení celé karty. Postupy, které dosud volily mezi vytvořením a úpravou karty, mohou tuto volbu vynechat a používat jen úpravu. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ Closes #715
review-state update creates the card when none exists

Artifacts:
- analysis.md
- issue.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Resolved:
- analysis.md: How --append-artifact identifies an artifact → key on path (Option B, IW-200 proposal); label key rejected for data loss (IW-436)

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
review-state update creates the card when none exists

Artifacts:
- tasks.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Issue: IW-715
Phase: 1 - update creates the card + artifact key on path + docs

This commit marks the checkpoint for phase 1 context generation.
Use wf-implement IW-715 to return to this point.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
update creates the card + artifact key on path + docs

Artifacts:
- phase-01-tasks.md

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
- review-state update creates a missing default card from an empty card for the key
- an explicit --input that names a missing file exits 1 and writes nothing
- artifacts appended with --append-artifact are keyed by path; a second append of a path replaces it in place
- declarations, generated command docs and review-state-cards.md describe the new behaviour
workflow(wf): Record phase-pr push follow-up for IW-715
All checks were successful
CI / changes (pull_request) Successful in 5s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 12s
CI / compile (pull_request) Successful in 1m44s
CI / dashboard-build (pull_request) Successful in 1m31s
CI / test (pull_request) Successful in 18m13s
0a7413a798
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
Reviewed-on: #716
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
workflow(wf): Review packet and release notes for IW-715
All checks were successful
CI / changes (pull_request) Successful in 5s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 11s
CI / lint (pull_request) Successful in 12s
CI / compile (pull_request) Successful in 1m41s
CI / dashboard-build (pull_request) Successful in 1m29s
CI / test (pull_request) Successful in 19m6s
a32f24d6e7
Follow-ups attached to #585 and #586; FOLLOW-UPS.md removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Peyjx7A56osGtX8LFGzakJ
mph merged commit 771e37ba2c into main 2026-10-05 12:17:51 +00:00
Sign in to join this conversation.
No description provided.