Phase 8: Generated docs and skill #539

Merged
mph merged 7 commits from IW-463-phase-08 into IW-463 2026-09-07 08:35:47 +00:00
Owner

Phase 08 implementation for IW-463.

Files

Browse changed files: https://code.iterative.works/iterative-works/iw-cli/-/blob/IW-463-phase-08/

Phase 08 implementation for IW-463. ### Files Browse changed files: https://code.iterative.works/iterative-works/iw-cli/-/blob/IW-463-phase-08/
Moves everything docs/commands/review-state.md and docs/commands/rm.md carry
that no CommandDeclaration can express — the schema contract, backward
compatibility, common workflows, troubleshooting, what `rm` refuses beyond its
exit codes, and the dashboard's Remove control — into two new companion pages
at docs/ root: docs/review-state-cards.md and docs/worktree-removal.md.

Committed on its own, before either docs/commands/ page is regenerated
(Phase 8 Step 3, Risks 2's containment): a single commit that both moved prose
and regenerated a page would hide any loss it caused. Nothing is deleted here;
the two docs/commands/ pages and their README.md links are re-pointed in the
next commit, once these companions exist to receive the content leaving them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WehHdHp9MRKJkrhGFiKNxa
- iw command-docs writes docs/commands/ from the declaration registry; --check gates drift
- review-state.md and rm.md are generated; their unexpressible prose moved to companions first
- build-iw-cli-skills reads the registry: its roster, categories, exclusion and Known-State block deleted
- a docs/commands/* arm in change-scope.sh makes a hand edit to a generated page pay the code gate
- two review iterations closed 5 criticals; the symlink write path is guarded behind CommandEnv
chore(IW-463): register phase 8 review artifacts
Some checks failed
CI / changes (pull_request) Successful in 4s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 10s
CI / lint (pull_request) Successful in 10s
CI / compile (pull_request) Successful in 1m41s
CI / dashboard-build (pull_request) Successful in 1m38s
CI / test (pull_request) Failing after 17m29s
c888dcaf22
fix(dashboard): close() waits for the poll in flight
Some checks failed
CI / changes (pull_request) Successful in 3s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 8s
CI / lint (pull_request) Successful in 9s
CI / compile (pull_request) Successful in 1m25s
CI / dashboard-build (pull_request) Successful in 1m48s
CI / test (pull_request) Failing after 16m3s
f48fd685c4
IssuePoller.close() called shutdownNow() and returned, so the poller
thread could still be inside a write while the caller deleted what it
had written. IssuePollerTest's tempDir fixture does exactly that, which
is why CI failed with DirectoryNotEmptyException on a run whose diff
touched no dashboard code.

close() now follows shutdownNow() with a bounded awaitTermination, so
"closed" means the poller has let go of its files. The bound keeps a
wedged poll from holding a shutdown open; an interrupt during the wait
restores the interrupt flag.

The test pins the guarantee: a poll that rides out its interrupt must
have finished by the time close() returns. It fails against the old
body.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WehHdHp9MRKJkrhGFiKNxa
fix(dashboard): a started server can be stopped
All checks were successful
CI / changes (pull_request) Successful in 3s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 8s
CI / lint (pull_request) Successful in 8s
CI / compile (pull_request) Successful in 1m24s
CI / dashboard-build (pull_request) Successful in 1m21s
CI / test (pull_request) Successful in 17m56s
6325d59d69
CaskServer.start ran a server and returned nothing, so nothing could
stop one. Every test in CaskServerTest leaked a running server with two
live pollers, and each test's finally deleted the state directory those
pollers were still writing — which is why CI failed with
DirectoryNotEmptyException on a run whose diff touched no dashboard code.

start now returns a RunningServer that stops the listener and closes the
server; close() closes both pollers. PullRequestPoller.close() gained the
same bounded awaitTermination IssuePoller.close() has, so closing a
server means both its writers have let go.

CaskServerTest records each server by the state path it writes and stops
it at the head of every teardown, before anything is deleted. The other
three call sites discard the handle explicitly.

The PullRequestPoller test fails against the old close(): a poll that
rides out its interrupt must have finished by the time close() returns.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WehHdHp9MRKJkrhGFiKNxa
chore(IW-463): update review-state for phase 08
All checks were successful
CI / changes (pull_request) Successful in 3s
CI / contract (pull_request) Has been skipped
CI / format (pull_request) Successful in 13s
CI / lint (pull_request) Successful in 12s
CI / compile (pull_request) Successful in 1m36s
CI / dashboard-build (pull_request) Successful in 1m30s
CI / test (pull_request) Successful in 18m27s
b2e31c075e
mph merged commit c28cac71d5 into IW-463 2026-09-07 08:35:47 +00:00
mph deleted branch IW-463-phase-08 2026-09-07 08:35:47 +00:00
Sign in to join this conversation.
No description provided.