Skip to content

docs(workflow): design and build a new PRD and task planning workflow - #370

Merged
NTCoding merged 40 commits into
mainfrom
issue-368-proposal-centralize-the-local-
May 5, 2026
Merged

NTCoding merged 40 commits into
mainfrom
issue-368-proposal-centralize-the-local-

Conversation

@NTCoding

@NTCoding NTCoding commented May 2, 2026 •

Copy link
Copy Markdown
Owner

New planning process designed from problem defintion to task definition using dev-workflow-v2:start-planning and `dev-workflow-v2:continue-planning

@coderabbitai

coderabbitai Bot commented May 2, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Reworks planning lifecycle into tools/dev-workflow-v2 (new planning commands, stages, docs), adds workflow PR creation (create-pr) with GH runner and event changes (pr-feedback-verification-failed), updates CLI routes/tests/fixtures, removes legacy .claude task/arch docs and scripts, and adjusts many docs/markers for new conventions.

Changes

Planning lifecycle & docs migration + PR creation

Layer / File(s) Summary
Data Shape / Types
tools/dev-workflow-v2/src/features/workflow/domain/workflow-types.ts, tools/dev-workflow-v2/src/features/workflow/domain/workflow-events.ts
Adds prFeedbackVerificationFailedReason?: string, new WorkflowOperation 'create-pr', and new event type pr-feedback-verification-failed with Zod schema; expands WorkflowEvent union.
Core Domain Logic
tools/dev-workflow-v2/src/features/workflow/domain/workflow.ts, .../fold.ts, .../states/awaiting-pr-feedback.ts, .../states/submitting-pr.ts
Adds Workflow.createPr(rawArgs), enforces PR-feedback failure events before BLOCKED transition, appends pr-feedback-verification-failed on polling/entry failures; updates state transition allowances and allowed operations.
Pull Request Parsing / Builders
tools/dev-workflow-v2/src/features/workflow/domain/pull-request-description.ts, .../pull-request-description.spec.ts
New parsing of CLI option/value pairs for create-pr; builds canonical PR title/body payload and validation with unit tests.
External GH client & wiring
tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts, .../create-pull-request.spec.ts, tools/dev-workflow-v2/src/shell/cli.ts, src/shell/opencode-plugin.ts
New createPullRequestCreator(runGh) that runs gh pr create/gh pr view, returns validated CreatedPullRequest; wired into workflow deps and CLI runtime; tests added.
CLI / Entrypoint / Routes
tools/dev-workflow-v2/src/features/workflow/entrypoint/workflow-cli.ts, tools/dev-workflow-v2/src/shell/cli.ts, tools/dev-workflow-v2/commands/workflow.md
Adds create-pr route forwarding rest args to w.createPr, adjusts argument quoting/escaping for CLI invocation.
Fixtures / Tests / Specs
.../fixtures/*, .../workflow-reviewing-submitting.spec.ts, workflow-pr-feedback-verification-events.spec.ts, workflow-feedback-reflecting.spec.ts, workflow-cli.spec.ts
Fixtures updated to stub createPullRequest; many tests added/updated to cover create-pr, event shape, polling failure behavior, and review JSON argument form.
State Machine / Event Tests
tools/dev-workflow-v2/src/features/workflow/domain/workflow-event-types.spec.ts
Unit test updated to include 'pr-feedback-verification-failed'.
Planning Commands & Stages (docs)
tools/dev-workflow-v2/commands/*.md, tools/dev-workflow-v2/planning-stages/*, tools/dev-workflow-v2/README.md, tools/dev-workflow-v2/commands/*
Adds comprehensive planning command docs (start-planning, planning-status, continue-planning, planning-stage specs: problem-definition, solution-exploration, prd-drafting, architecture-* , delivery-planning, task-creation, etc.) and documents bridge /dev-workflow-v2:choose-next-task.
Docs Migration / Removals
docs/workflow/task-workflow.md, .claude/commands/create-tasks.md, .claude/commands/arch-plan.md, CLAUDE.md, scripts/activate-prd.sh, scripts/archive-prd.sh
Removes old .claude command docs and activate script; rewrites task-workflow.md to point into tools/dev-workflow-v2; adjusts various doc paths/examples and archive script to new in-place marker approach.
Misc / Package & Manifest
tools/dev-workflow-v2/.claude-plugin/plugin.json, tools/dev-workflow-v2/package.json
Bumps plugin version and bumps several @nt-ai-lab/* dependency versions to 0.3.7.
Fixtures / CLI test helpers
tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-test-fixtures.ts, .../workflow-cli-state-steps-test-fixtures.ts
Refactors review-command test helpers to positional JSON argument (record-review <type> '<json>'), updates fixtures to match.

Sequence Diagram(s)

sequenceDiagram
    participant CLI as dev-workflow CLI
    participant Workflow as Workflow (domain)
    participant GHRunner as runGh (gh)
    participant GitHub as GitHub
    participant EventStore as Event store

    CLI->>Workflow: create-pr <args>
    Workflow->>Workflow: parse args -> build PR creation request
    Workflow->>GHRunner: gh pr create --title --body --json url
    GHRunner->>GitHub: create PR
    GitHub-->>GHRunner: {"url": "https://..."}
    GHRunner->>Workflow: readPullRequest(url) -> gh pr view --json number,url,isDraft
    GHRunner->>GitHub: view PR
    GitHub-->>GHRunner: {"number":42,"url":"...","isDraft":false}
    GHRunner-->>Workflow: {prNumber, prUrl, isDraft}
    alt isDraft == true
        Workflow-->>CLI: fail (draft PR rejected)
    else
        Workflow->>EventStore: append pr-recorded event
        Workflow-->>CLI: success (prNumber/prUrl)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

  • #368: Proposal: centralize the local PRD-to-implementation workflow in dev-workflow-v2 — This PR implements that proposal (planning commands, marker/PRD conventions, planning stages).
  • NTCoding/living-architecture#325 — Changes modify Workflow runtime and CLI boundaries, which overlap the issue’s objectives about workflow runtime/AI-CLI integration.

Possibly related PRs

Suggested labels

Review effort 4/5

"I hopped from doc to code and found the trail,
New stages planted, markers on the trail.
I pushed a PR with carrot-keen delight,
Verified feedback, kept the workflow light.
— a rabbit celebrates the planning night"

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-368-proposal-centralize-the-local-

@NTCoding NTCoding changed the title Centralize the local PRD-to-implementation workflow docs(workflow): centralize the local PRD-to-implementation workflow May 2, 2026
Comment thread .claude/commands/arch-plan.md Outdated
Comment thread .claude/commands/create-tasks.md Outdated
Comment thread tools/dev-workflow-v2/.claude-plugin/plugin.json Outdated
Comment thread tools/dev-workflow-v2/README.md Outdated
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented May 2, 2026 •

Copy link
Copy Markdown

Deploying living-architecture with  Cloudflare Pages  Cloudflare Pages

Latest commit: 49df67f
Status: ✅  Deploy successful!
Preview URL: https://2b5e54dd.living-architecture.pages.dev
Branch Preview URL: https://issue-368-proposal-centraliz.living-architecture.pages.dev

View logs

@NTCoding
NTCoding marked this pull request as ready for review May 2, 2026 10:28

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
tools/dev-workflow-v2/src/features/workflow/infra/persistence/workflow-definition.spec.ts (1)

11-35: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Make createPullRequest mock signature match the dependency contract.

The mock returns the right { prNumber, prUrl, isDraft } shape, but it currently declares createPullRequest: () => ... and ignores the input args. Updating it to explicitly accept the args parameter makes the contract clearer and avoids relying on TS function-parameter-compatibility behavior.

Suggested change
 function makeWorkflowDeps(): WorkflowDeps {
   return {
@@
-    createPullRequest: () => ({
+    createPullRequest: (_args: readonly string[]) => ({
       prNumber: 1,
       prUrl: 'https://github.com/example/repo/pull/1',
       isDraft: false,
     }),
     listSessionReviews: () => [],
     sleepMs: () => undefined,
     now: () => '2026-01-01T00:00:00Z',
   }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@tools/dev-workflow-v2/src/features/workflow/infra/persistence/workflow-definition.spec.ts`
around lines 11 - 35, The mock in makeWorkflowDeps defines createPullRequest as
createPullRequest: () => {...} but it should accept the same args as the real
dependency; change the mock signature to createPullRequest: (args) => ({
prNumber: 1, prUrl: 'https://github.com/example/repo/pull/1', isDraft: false })
(and add an explicit parameter type if needed) so the mock matches the
dependency contract used by functions calling createPullRequest.
tools/dev-workflow-v2/src/features/workflow/domain/states/submitting-pr.ts (1)

10-17: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update guard error text to include the new create-pr path.

After allowing create-pr on Line 10, the failure message on Line 16 is now misleading by only pointing to record-pr.

Suggested patch
-    if (!ctx.state.prNumber) return fail('prNumber not set. Run record-pr first.')
+    if (!ctx.state.prNumber) return fail('prNumber not set. Run create-pr or record-pr first.')
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/dev-workflow-v2/src/features/workflow/domain/states/submitting-pr.ts`
around lines 10 - 17, The transitionGuard's failure message is stale: when
allowedWorkflowOperations includes 'create-pr' the guard should reference both
paths; update the failure text in transitionGuard (the check on
ctx.state.prNumber that currently calls fail('prNumber not set. Run record-pr
first.')) to mention the new create-pr flow (e.g., "Run record-pr or create-pr
first.") so it accurately instructs users when ctx.state.prNumber is missing;
keep the existing fail()/pass() logic unchanged.
tools/dev-workflow-v2/commands/continue-planning.md (1)

15-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Define terminal behavior for planning-complete explicitly.

Line 22 introduces planning-complete, but the workflow doesn’t state what continue-planning does when the marker is already at that stage. Add an explicit no-op/stop rule to avoid divergent implementations.

Suggested doc patch
 ## Workflow

 1. Find the active planning marker in `docs/project/planning/*.yml`.
 2. Stop if there is no active marker.
 3. Stop if there is more than one active marker and list all of them.
 4. Read the current stage from the single active marker.
+5. If the current stage is `planning-complete`, print that planning is complete and stop.
-5. Check only the artifact for that stage.
-6. Advance the marker only when the current artifact passes its checks.
-7. Print blockers and keep the marker unchanged when the artifact fails its checks.
+6. Check only the artifact for that stage.
+7. Advance the marker only when the current artifact passes its checks.
+8. Print blockers and keep the marker unchanged when the artifact fails its checks.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/dev-workflow-v2/commands/continue-planning.md` around lines 15 - 23,
The workflow lacks an explicit terminal rule for the `planning-complete` stage:
update the `continue-planning` behavior to treat `planning-complete` as a
terminal/no-op state by adding a clear rule that if the current stage equals
`planning-complete` the command returns immediately (no transitions, no
side-effects) and documents this in the Stage order section next to
`planning-complete` so implementations follow the same stop behavior.
tools/dev-workflow-v2/src/features/workflow/domain/workflow-events.ts (1)

5-19: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Keep KNOWN_WORKFLOW_EVENT_TYPES aligned with the schema.

WORKFLOW_EVENT_SCHEMA accepts architecture-review-completed, code-review-completed, and bug-scanner-completed, but getKnownWorkflowEventTypes() still omits them. Anything using this helper as the canonical discriminator list can misclassify valid persisted events as unknown.

Suggested fix
 const KNOWN_WORKFLOW_EVENT_TYPES = [
   'session-started',
   'transitioned',
   'issue-recorded',
   'branch-recorded',
+  'architecture-review-completed',
+  'code-review-completed',
+  'bug-scanner-completed',
   'pr-recorded',
   'ci-completed',
   'feedback-checked',
   'feedback-addressed',
   'pr-feedback-verification-failed',
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/dev-workflow-v2/src/features/workflow/domain/workflow-events.ts` around
lines 5 - 19, KNOWN_WORKFLOW_EVENT_TYPES is missing event types that
WORKFLOW_EVENT_SCHEMA accepts; update the KNOWN_WORKFLOW_EVENT_TYPES array to
include 'architecture-review-completed', 'code-review-completed', and
'bug-scanner-completed' so getKnownWorkflowEventTypes() returns the full
canonical discriminator list; locate the KNOWN_WORKFLOW_EVENT_TYPES constant in
workflow-events.ts and add those three string literals (preserving the as const
typing) so the helper aligns with WORKFLOW_EVENT_SCHEMA.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tools/dev-workflow-v2/commands/planning-status.md`:
- Around line 10-18: Document explicit deterministic rules for deriving PRD and
architecture artifact paths from planningId (e.g., a formula or template such as
PRD path = `plans/{planningId}/prd.md` and architecture path =
`plans/{planningId}/architecture.md`) and add a clear stage→next-command mapping
table for the command output (list each stage name and the exact next CLI
command string to print). Update the planning-status command contract to
reference the planningId→path templates and the stage-to-next-command mapping so
implementations can deterministically compute and print planning topic, current
stage, PRD path, architecture path, tasks-created flag, next command, and
blockers; reference the planningId variable and the "next command" field in the
output spec when editing the doc.

In `@tools/dev-workflow-v2/commands/start-planning.md`:
- Around line 18-26: The current flow creates the PRD then the marker separately
which can leave an orphaned PRD if the marker write fails; change the
implementation that handles planningId/PRD/marker creation to either persist
both artifacts atomically (write to temp files and rename into place for both
docs/project/planning/<slug>.yml and the PRD path derived from planningId, then
atomically move) or, if atomic rename across those paths isn't possible, write
the marker first (initialized with planningId, stage: prd-drafting,
githubMilestone: null, githubIssuesCreated: false, githubIssueNumbers: []) and
only then write the PRD; additionally, add a failure handler so that if the
second write fails you delete the already-written artifact (cleanup the PRD if
marker failed or delete marker if PRD failed) and surface an error so retries
don't see inconsistent state.

In `@tools/dev-workflow-v2/src/features/workflow/domain/workflow.ts`:
- Around line 240-257: createPr currently only blocks --draft/-d but then calls
this.deps.createPullRequest(createArgs) which can launch an editor if
non-interactive required flags are missing; add a pre-check in createPr (after
parsing via CREATE_PR_ARGS_SCHEMA and before this.deps.createPullRequest) that
verifies the arg array contains either --fill OR (--title or -t) and at least
one of (--body or -b or --body-file) (treat --fill as satisfying both title and
body). If the check fails, return fail(...) with a clear message about required
non-interactive flags (e.g. "create-pr requires --fill or --title (-t) plus
--body/-b/--body-file for non-interactive use") so createPullRequest is only
invoked with deterministic, non-interactive arguments.

In
`@tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-test-fixtures.ts`:
- Around line 133-140: The code currently coerces any non-'FAIL' third tuple
entry to 'PASS', which masks malformed steps; update the validation around the
tuple in the block that references WorkflowStateError, reviewType and verdict
before calling runReviewCommand so that the third element (step[2]) must be
present and strictly equal to either 'PASS' or 'FAIL' — otherwise throw a
WorkflowStateError with a clear message about expected shape ['record-review',
<reviewType>, 'PASS'|'FAIL']; then pass the validated verdict to
runReviewCommand.

In `@tools/dev-workflow-v2/src/features/workflow/entrypoint/workflow-cli.spec.ts`:
- Around line 293-301: The test "blocks when draft flag is provided" should also
assert that no "pr-recorded" event was persisted: after calling runCommand(ctx,
['create-pr', '--draft']) and the existing exit/output assertions, add an
assertion against the test context (ctx) event store/published events (the same
test fixture used by setup()/progressToState()/runCommand()) to ensure there is
no event with type or name "pr-recorded" (e.g., expect the ctx's
persisted/published events not to include any item matching { type:
'pr-recorded' }); place this new assertion immediately after the existing expect
lines so the blocked path verifies no side-effect event was emitted.

In
`@tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts`:
- Around line 56-69: The current readPullRequestReference function relies on
brittle whitespace parsing; change the gh pr create invocation to include the
machine-readable flag (--json url) and update readPullRequestReference to parse
the JSON output and return the url field (e.g., JSON.parse(createOutput).url),
throwing PullRequestCreationError if parsing fails or url is missing; optionally
keep a robust fallback that extracts the first HTTP(S) URL via regex if JSON
parsing fails to maintain resilience.

In `@tools/dev-workflow-v2/states/reviewing.md`:
- Line 19: Update the checklist item so the CLI invocation for
/dev-workflow-v2:workflow record-review clearly instructs callers to pass a
compacted/one-line JSON string and to wrap it in quotes to avoid shell
splitting; specifically mention the command name "/dev-workflow-v2:workflow
record-review" and the "<review-json>" placeholder and give an explicit example
format such as quoting the JSON (e.g., '\"{...}\"' or using single quotes) or
piping a compacted JSON string, so consumers know to remove newlines/whitespace
and quote the argument to prevent broken invocations.

---

Outside diff comments:
In `@tools/dev-workflow-v2/commands/continue-planning.md`:
- Around line 15-23: The workflow lacks an explicit terminal rule for the
`planning-complete` stage: update the `continue-planning` behavior to treat
`planning-complete` as a terminal/no-op state by adding a clear rule that if the
current stage equals `planning-complete` the command returns immediately (no
transitions, no side-effects) and documents this in the Stage order section next
to `planning-complete` so implementations follow the same stop behavior.

In `@tools/dev-workflow-v2/src/features/workflow/domain/states/submitting-pr.ts`:
- Around line 10-17: The transitionGuard's failure message is stale: when
allowedWorkflowOperations includes 'create-pr' the guard should reference both
paths; update the failure text in transitionGuard (the check on
ctx.state.prNumber that currently calls fail('prNumber not set. Run record-pr
first.')) to mention the new create-pr flow (e.g., "Run record-pr or create-pr
first.") so it accurately instructs users when ctx.state.prNumber is missing;
keep the existing fail()/pass() logic unchanged.

In `@tools/dev-workflow-v2/src/features/workflow/domain/workflow-events.ts`:
- Around line 5-19: KNOWN_WORKFLOW_EVENT_TYPES is missing event types that
WORKFLOW_EVENT_SCHEMA accepts; update the KNOWN_WORKFLOW_EVENT_TYPES array to
include 'architecture-review-completed', 'code-review-completed', and
'bug-scanner-completed' so getKnownWorkflowEventTypes() returns the full
canonical discriminator list; locate the KNOWN_WORKFLOW_EVENT_TYPES constant in
workflow-events.ts and add those three string literals (preserving the as const
typing) so the helper aligns with WORKFLOW_EVENT_SCHEMA.

In
`@tools/dev-workflow-v2/src/features/workflow/infra/persistence/workflow-definition.spec.ts`:
- Around line 11-35: The mock in makeWorkflowDeps defines createPullRequest as
createPullRequest: () => {...} but it should accept the same args as the real
dependency; change the mock signature to createPullRequest: (args) => ({
prNumber: 1, prUrl: 'https://github.com/example/repo/pull/1', isDraft: false })
(and add an explicit parameter type if needed) so the mock matches the
dependency contract used by functions calling createPullRequest.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d0f18102-bdaa-4d6a-aa42-87ee34f2accb

📥 Commits

Reviewing files that changed from the base of the PR and between 9050ddd and 6511a56.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (36)
  • .claude/commands/arch-plan.md
  • .claude/commands/create-tasks.md
  • docs/project/planning/.gitkeep
  • docs/workflow/task-workflow.md
  • tools/dev-workflow-v2/.claude-plugin/plugin.json
  • tools/dev-workflow-v2/PRD-platform-cli-layer.md
  • tools/dev-workflow-v2/README.md
  • tools/dev-workflow-v2/commands/continue-planning.md
  • tools/dev-workflow-v2/commands/planning-status.md
  • tools/dev-workflow-v2/commands/start-implementation.md
  • tools/dev-workflow-v2/commands/start-planning.md
  • tools/dev-workflow-v2/commands/workflow.md
  • tools/dev-workflow-v2/package.json
  • tools/dev-workflow-v2/src/features/workflow/domain/fixtures/workflow-test-fixtures.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/fold.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/states/awaiting-pr-feedback.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/states/submitting-pr.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-event-types.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-events.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-feedback-reflecting.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-pr-feedback-verification-events.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-reviewing-submitting.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-types.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-state-steps-test-fixtures.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-test-fixtures.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/workflow-cli.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/workflow-cli.ts
  • tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts
  • tools/dev-workflow-v2/src/features/workflow/infra/persistence/workflow-definition.spec.ts
  • tools/dev-workflow-v2/src/shell/cli.ts
  • tools/dev-workflow-v2/src/shell/opencode-plugin.ts
  • tools/dev-workflow-v2/states/awaiting_pr_feedback.md
  • tools/dev-workflow-v2/states/reviewing.md
  • tools/dev-workflow-v2/states/submitting_pr.md
💤 Files with no reviewable changes (2)
  • .claude/commands/arch-plan.md
  • .claude/commands/create-tasks.md

Comment thread tools/dev-workflow-v2/commands/planning-status.md Outdated
Comment thread tools/dev-workflow-v2/commands/start-planning.md Outdated
Comment thread tools/dev-workflow-v2/src/features/workflow/domain/workflow.ts Outdated
Comment thread tools/dev-workflow-v2/states/reviewing.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
packages/riviere-role-enforcement/skills/plan-review.md (4)

99-109: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a concrete forbiddenImports/dependency checking checklist.

Step 6 states you should flag forbidden-import and forbidden-dependency violations, but it doesn’t describe how to “check” them from the plan text. Given this is pre-implementation, the annexer needs a repeatable method to avoid subjective interpretations.

Suggested minimal checklist to reduce interpretation drift
 ## Step 6: Detect Structural Concerns
 
 Review the plan for plan-level signals of architectural problems:
@@
 - **Wrong-layer code.** The plan proposes code in `entrypoint/` that imports `infra/persistence/`, or code in `domain/` that imports an external library — would violate `forbiddenImports`.
 - **Consumer-owned mapping proposed as a domain abstraction.** The plan puts an adapter, presenter, formatter, write port, bridge, or translator in `domain/` even though its only job is to reshape domain results for a specific consumer such as CLI output, workflow updates, or builder writes. Flag it and show the simpler alternative where the use case performs its own mapping.
 - **Cross-role coupling.** The plan proposes a `command-use-case` that depends on another `command-use-case` — forbidden by the role's `forbiddenDependencies`.
 - **Repository calling another repository.** Same pattern — forbidden.
 - **`cli-entrypoint` importing `aggregate-repository` directly.** Per `role-selection-guide.md` Section 2, only `command-use-case` should depend on `aggregate-repository`.
+
+**When you flag forbiddenImports/forbiddenDependencies, record enough evidence to reproduce the check:**
+- Which proposed import/dependency (source → target) is implied by the plan
+- Which location/role is being evaluated
+- Which `forbiddenImports` / `forbiddenDependencies` rule in the config is expected to reject it
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/riviere-role-enforcement/skills/plan-review.md` around lines 99 -
109, Add a concrete, repeatable checklist to Step 6 in plan-review.md that tells
annexers exactly how to detect forbidden imports/dependencies in
pre-implementation plans: enumerate checks for forbiddenImports (verify any
proposed file/module paths against the role's forbiddenImports list, flag if
plan text names or implies imports from those namespaces), forbiddenDependencies
(check for explicit or implied use-case-to-use-case or repository-to-repository
dependencies and flag), entrypoint/ vs domain/ vs infra/ violations (ensure
proposed file responsibilities map to allowed layer imports per
role-selection-guide.md), aggregate-repository access rules (ensure only
command-use-case mentions aggregate-repository), and consumer-mapping placement
(flag presenters/adapters placed in domain/); for each check require a one-line
evidence string from the plan (quoted text or path) and a binary pass/fail
decision so annexers follow a consistent, repeatable process.

184-193: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Make the “append annex to issue body” instructions newline-safe and explicit.

Step 9 describes fetching the current issue body, appending the annex, and calling gh issue edit, but it doesn’t specify how the append occurs (e.g., ensuring exactly one blank line separator, avoiding truncation, and not clobbering the original). Since it’s automation-oriented documentation, small clarification reduces real-world friction.

Suggested explicit append commands
 1. **GitHub issue input:** fetch the current body with `gh issue view <n> --json body -q '.body' > /tmp/issue-body.md`, append the annex to the file, then `gh issue edit <n> --body-file /tmp/issue-body.md`.
+   - Ensure there is a single blank line separator before the annex:
+     - append as: `printf '\n%s\n' "$(<annex>)" >> /tmp/issue-body.md` (or equivalent)
+   - Do not overwrite the existing body (only append).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/riviere-role-enforcement/skills/plan-review.md` around lines 184 -
193, Step 9's "append annex to issue body" is ambiguous and needs a
newline-safe, non-destructive procedure: update the instructions around the `gh
issue view ... > /tmp/issue-body.md` and `gh issue edit ... --body-file
/tmp/issue-body.md` flow to explicitly (1) fetch the current body into a temp
file (keep original intact), (2) ensure exactly one blank line separator is
inserted before the annex (describe using a guaranteed newline/blank-line append
operation to the temp file), (3) append the annex content to the temp file (not
overwrite), and (4) call `gh issue edit --body-file` with that temp file;
reference the commands (`gh issue view`, `/tmp/issue-body.md`, `gh issue edit
--body-file`) in the text so implementers know where to apply the safe append
behavior.

80-91: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Clarify what to do when the plan omits the “feature name” for location inference.

Step 5 says “use the feature name from the plan, not a guessed one.” If the plan omits it, the doc currently doesn’t spell out the expected behavior beyond LOWER confidence. Suggest adding an explicit rule: either (a) add a gap in Step 7, or (b) keep confidence low and record the missing prerequisite in Notes/Gaps so Step 9 doesn’t silently proceed with an invented location.

Suggested rule for missing feature name
 5. **Propose a location** by matching against the `locations` in the config. Use sublocation paths like `src/features/<feature>/commands/` — but use the feature name from the plan, not a guessed one.
 6. **Record confidence:**
    - **HIGH** — single clear match; target + flow + name all point to one role.
    - **MEDIUM** — two candidates, one stronger; or clear behavior but ambiguous location.
    - **LOW** — genuinely ambiguous; multiple roles could apply; plan lacks detail.
+
+If the plan does not contain the feature name needed to form the sublocation (or the feature is explicitly ambiguous), do not guess the path:
+- Set `Confidence = LOW`
+- Add the missing prerequisite to the row’s `Notes` and/or to Step 7’s `Gaps` with “Suggested Action” indicating the user must confirm the feature-to-sublocation mapping.

110-176: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make the “aggregate” blocker rule unambiguous in Step 7/8.

Step 8’s “New aggregate proposed” blocker relies on the annex having “Proposed Roles” rows with role exactly aggregate, but Step 7 doesn’t explicitly state when/how an aggregate should appear in that table (or whether aggregates should be entered differently vs other roles). This can lead to inconsistent annexes and missed blocker classification.

Suggested doc tweak (align Step 7 output semantics with Step 8)
 ### Proposed Roles and Locations
 
 | Proposed Element | Kind | Role | Sublocation | Confidence | Notes |
 |------------------|------|------|-------------|------------|-------|
 | `FooUseCase` | class | `command-use-case` | `src/features/foo/commands/` | HIGH | Single public method `apply(...)`; input `FooInput` → result `FooResult`. |
 | `buildX` | function | `domain-service` | `src/features/foo/domain/` | MEDIUM | Pure transformation; could also be inlined into the use case if only used once. |
 | ... | | | | | |
+
+**If the plan proposes an aggregate (holds state + enforces invariants via state-modifying methods), include an explicit row with Role = `aggregate`** (do not omit aggregates “because they look implied”). This ensures Step 8 can correctly detect “New aggregate proposed” blockers.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/riviere-role-enforcement/skills/plan-review.md` around lines 110 -
176, Step 7 is ambiguous about how aggregates should be represented in the
"Proposed Roles" table, causing Step 8's "New aggregate proposed" blocker to be
missed; update the Step 7 template so every aggregate must appear as a row in
"Proposed Roles" with role exactly `aggregate` and an extra column or note
indicating whether that aggregate is already approved (reference
`approvedInstances` entries in `.riviere/roles.ts` and the `userHasApproved`
flag); ensure the Step 7 text explicitly instructs implementers to list
unapproved aggregates as "aggregate" and mark them for user approval so Step 8's
blocker rule (the "New aggregate proposed" check) can unambiguously detect them.
♻️ Duplicate comments (2)
tools/dev-workflow-v2/commands/planning-status.md (1)

18-20: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Define how “tasks have been created” is computed.

The output list includes “whether tasks have been created”, but the doc doesn’t state the rule. Since the marker stores githubIssuesCreated and githubIssueNumbers, specify which field drives the output (e.g., githubIssuesCreated === true, or githubIssueNumbers.length > 0).

🛠️ Suggested doc clarification
6. Print:
   - planning topic
   - planningId
   - current stage
   - PRD path
   - architecture path
-  - whether tasks have been created
+  - whether tasks have been created (true iff marker `githubIssuesCreated` is `true`)
   - next command
   - blockers
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tools/dev-workflow-v2/commands/planning-status.md` around lines 18 - 20,
Clarify the rule that determines "whether tasks have been created" by updating
the doc to state which marker field is authoritative (e.g., use
githubIssuesCreated === true as the primary signal, or define that
githubIssueNumbers.length > 0 indicates created tasks); explicitly pick one rule
(or define precedence if both exist) and show the exact condition (for example:
"Tasks are considered created when githubIssuesCreated === true; alternatively,
if you use githubIssueNumbers, tasks are created when githubIssueNumbers.length
> 0") so readers know which field drives the output (referencing the
githubIssuesCreated and githubIssueNumbers marker fields).
tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts (1)

47-48: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve the created PR reference if the follow-up pr view call fails.

At Line 47 the workflow already has a validated PR URL from gh pr create. If Line 48 fails, the caller gets a generic creation failure even though the PR may already exist, which makes duplicate PRs and manual recovery more likely. Please wrap the second call and surface pullRequestUrl in the thrown error so the workflow can recover from this partial-success case.

Suggested fix
     const pullRequestUrl = readPullRequestUrl(createOutput)
-    return readPullRequest(runGh, pullRequestUrl)
+    try {
+      return readPullRequest(runGh, pullRequestUrl)
+    } catch (error) {
+      throw new PullRequestCreationOutputError(
+        `PR was created at ${pullRequestUrl}, but reading it back failed: ${String(error)}`,
+      )
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts`
around lines 47 - 48, The code currently calls readPullRequest(runGh,
pullRequestUrl) and if that call throws the function hides the validated
pullRequestUrl; wrap the readPullRequest call in a try/catch, and on error throw
or rethrow an Error that includes the original pullRequestUrl (either in the
message or as an error property) so callers can detect the partially-created PR;
update the block around readPullRequestUrl(createOutput) and
readPullRequest(...) accordingly (referencing readPullRequestUrl and
readPullRequest) to preserve and surface pullRequestUrl when the second call
fails.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tools/dev-workflow-v2/commands/start-planning.md`:
- Line 14: Update the sentence that currently reads "Stop if exactly one active
marker exists and tell the user to use `planning-status` or
`continue-planning`." to use a softer tone by replacing "tell the user" with
"ask the user" so it reads "Stop if exactly one active marker exists and ask the
user to use `planning-status` or `continue-planning`." This is the exact line to
change in the start-planning.md content.

In `@tools/dev-workflow-v2/README.md`:
- Around line 39-44: Combine and rephrase the three consecutive "If ..."
sentences into one or two concise sentences to avoid repetition: mention the
three cases (exactly one active marker — commands planning-status and
continue-planning use it; no active marker — those commands stop and
start-planning may create one; more than one active marker — commands stop and
report all) and reference the command names planning-status, continue-planning,
and start-planning so readers can quickly scan the behavior without repeated "If
..." clauses.

In
`@tools/dev-workflow-v2/src/features/workflow/domain/pull-request-description.spec.ts`:
- Around line 36-142: Add a regression test to pull-request-description.spec.ts
that verifies parsePullRequestDescriptionOptions correctly handles a value that
looks like a flag (e.g. pass ['--title', '--description', '--description',
'Actual description', ...other required options...]) so the parser does not
treat the value '--description' as a new option; call
parsePullRequestDescriptionOptions and assert the result is ok: true and that
input.title equals the literal value '--description' while the real
--description option is parsed into input.description (or use
VALID_PULL_REQUEST_DESCRIPTION_INPUT/VALID_CREATE_PR_OPTIONS as a template to
construct expected input). Ensure the new it() case names the intent (e.g.
"handles flag-like values in value positions") and includes all other required
options so parsing succeeds.

In
`@tools/dev-workflow-v2/src/features/workflow/domain/pull-request-description.ts`:
- Around line 184-197: The readRequiredOption function is vulnerable because
indexOf(optionName) can match a value token (e.g. a title equal to
"--description") and return a wrong index; change the lookup to scan tokens for
the option token only (match token === optionName among the argument tokens) and
then validate the next token exists and is not another option (e.g., does not
start with "--") before parsing; update the logic in readRequiredOption to use
this targeted find (or a simple loop over commandTokens) and return a clear
missing/invalid-value error when the next token is absent or looks like an
option.

---

Outside diff comments:
In `@packages/riviere-role-enforcement/skills/plan-review.md`:
- Around line 99-109: Add a concrete, repeatable checklist to Step 6 in
plan-review.md that tells annexers exactly how to detect forbidden
imports/dependencies in pre-implementation plans: enumerate checks for
forbiddenImports (verify any proposed file/module paths against the role's
forbiddenImports list, flag if plan text names or implies imports from those
namespaces), forbiddenDependencies (check for explicit or implied
use-case-to-use-case or repository-to-repository dependencies and flag),
entrypoint/ vs domain/ vs infra/ violations (ensure proposed file
responsibilities map to allowed layer imports per role-selection-guide.md),
aggregate-repository access rules (ensure only command-use-case mentions
aggregate-repository), and consumer-mapping placement (flag presenters/adapters
placed in domain/); for each check require a one-line evidence string from the
plan (quoted text or path) and a binary pass/fail decision so annexers follow a
consistent, repeatable process.
- Around line 184-193: Step 9's "append annex to issue body" is ambiguous and
needs a newline-safe, non-destructive procedure: update the instructions around
the `gh issue view ... > /tmp/issue-body.md` and `gh issue edit ... --body-file
/tmp/issue-body.md` flow to explicitly (1) fetch the current body into a temp
file (keep original intact), (2) ensure exactly one blank line separator is
inserted before the annex (describe using a guaranteed newline/blank-line append
operation to the temp file), (3) append the annex content to the temp file (not
overwrite), and (4) call `gh issue edit --body-file` with that temp file;
reference the commands (`gh issue view`, `/tmp/issue-body.md`, `gh issue edit
--body-file`) in the text so implementers know where to apply the safe append
behavior.
- Around line 110-176: Step 7 is ambiguous about how aggregates should be
represented in the "Proposed Roles" table, causing Step 8's "New aggregate
proposed" blocker to be missed; update the Step 7 template so every aggregate
must appear as a row in "Proposed Roles" with role exactly `aggregate` and an
extra column or note indicating whether that aggregate is already approved
(reference `approvedInstances` entries in `.riviere/roles.ts` and the
`userHasApproved` flag); ensure the Step 7 text explicitly instructs
implementers to list unapproved aggregates as "aggregate" and mark them for user
approval so Step 8's blocker rule (the "New aggregate proposed" check) can
unambiguously detect them.

---

Duplicate comments:
In `@tools/dev-workflow-v2/commands/planning-status.md`:
- Around line 18-20: Clarify the rule that determines "whether tasks have been
created" by updating the doc to state which marker field is authoritative (e.g.,
use githubIssuesCreated === true as the primary signal, or define that
githubIssueNumbers.length > 0 indicates created tasks); explicitly pick one rule
(or define precedence if both exist) and show the exact condition (for example:
"Tasks are considered created when githubIssuesCreated === true; alternatively,
if you use githubIssueNumbers, tasks are created when githubIssueNumbers.length
> 0") so readers know which field drives the output (referencing the
githubIssuesCreated and githubIssueNumbers marker fields).

In
`@tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts`:
- Around line 47-48: The code currently calls readPullRequest(runGh,
pullRequestUrl) and if that call throws the function hides the validated
pullRequestUrl; wrap the readPullRequest call in a try/catch, and on error throw
or rethrow an Error that includes the original pullRequestUrl (either in the
message or as an error property) so callers can detect the partially-created PR;
update the block around readPullRequestUrl(createOutput) and
readPullRequest(...) accordingly (referencing readPullRequestUrl and
readPullRequest) to preserve and surface pullRequestUrl when the second call
fails.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1262f91c-2ded-4166-80a4-d84dda4d9a38

📥 Commits

Reviewing files that changed from the base of the PR and between 6511a56 and e69026d.

📒 Files selected for processing (16)
  • packages/riviere-role-enforcement/skills/plan-review.md
  • tools/dev-workflow-v2/.claude-plugin/plugin.json
  • tools/dev-workflow-v2/README.md
  • tools/dev-workflow-v2/commands/planning-status.md
  • tools/dev-workflow-v2/commands/start-planning.md
  • tools/dev-workflow-v2/src/features/workflow/domain/pull-request-description.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/pull-request-description.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow-reviewing-submitting.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/domain/workflow.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-state-steps-test-fixtures.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/fixtures/workflow-cli-test-fixtures.ts
  • tools/dev-workflow-v2/src/features/workflow/entrypoint/workflow-cli.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.spec.ts
  • tools/dev-workflow-v2/src/features/workflow/infra/external-clients/github/create-pull-request.ts
  • tools/dev-workflow-v2/states/reviewing.md
  • tools/dev-workflow-v2/states/submitting_pr.md

Comment thread tools/dev-workflow-v2/commands/start-planning.md Outdated
Comment thread tools/dev-workflow-v2/README.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
scripts/archive-prd.sh (1)

37-46: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Milestone lookup uses the PRD folder slug instead of githubMilestone from marker.yml.

The marker schema (tools/dev-workflow-v2/README.md lines 47–55) stores githubMilestone as an explicit, separate field from planningId. Using $PRD_NAME (the folder slug) as the milestone title assumes githubMilestone == planningId slug — which is not guaranteed. If the milestone was created with a display-style title (e.g., "Phase 9 Launch" vs "phase-9-launch"), the select returns nothing, MILESTONE_NUMBER is empty, and the script prints "Warning: Milestone not found" and exits without closing the milestone. The archival commit still proceeds, leaving the milestone open with no hard error.

🛠️ Read `githubMilestone` from the marker before querying GitHub
+# Read milestone title from marker.yml
+GITHUB_MILESTONE=$(grep '^githubMilestone:' "$MARKER_FILE" | sed 's/^githubMilestone:[[:space:]]*//')
+
+if [[ -z "$GITHUB_MILESTONE" ]]; then
+    echo "Error: githubMilestone field not found in $MARKER_FILE" >&2
+    exit 1
+fi
+
-MILESTONE_NUMBER=$(gh api "repos/${REPO}/milestones" --jq ".[] | select(.title == \"$PRD_NAME\") | .number")
+MILESTONE_NUMBER=$(gh api "repos/${REPO}/milestones" --jq ".[] | select(.title == \"$GITHUB_MILESTONE\") | .number")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/archive-prd.sh` around lines 37 - 46, The script currently looks up
milestones by the PRD folder slug ($PRD_NAME); change it to read the
githubMilestone field from the marker (set a new variable like GITHUB_MILESTONE
by parsing marker.yml for githubMilestone) and use that when building the gh API
jq selector (replace uses of $PRD_NAME in the select(.title == ...) with
$GITHUB_MILESTONE); if githubMilestone is missing, fall back to $PRD_NAME, and
adjust the echo warnings/messages to reference the milestone title variable used
so failures are visible and the archival step can reliably close the correct
milestone.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/archive-prd.sh`:
- Line 34: The sed invocation using sed -i '' is macOS/BSD-specific and breaks
on GNU sed; update both occurrences (the sed call that edits MARKER_FILE and the
similar call around line 49) to use a portable pattern: invoke sed with an
inline backup suffix (e.g., sed -i.bak 's/^stage: .*/stage: planning-complete/'
"$MARKER_FILE") and then remove the .bak file (rm -f "$MARKER_FILE.bak") so the
edit works on both GNU and BSD sed; locate the sed calls in
scripts/archive-prd.sh to apply this change to the commands that modify
MARKER_FILE.

In `@tools/dev-workflow-v2/README.md`:
- Around line 31-88: The Commands section is being closed early because "##
Planning marker" and "## Planning stages" are h2 headings; change those two
headings to h3 (e.g., "### Planning marker" and "### Planning stages") so the
`continue-planning`, `choose-next-task`, `start-implementation`, and `Workflow
(internal)` entries remain nested under `## Commands`; make the same h3 change
for any subheadings that should stay within Commands so AI agents can discover
`continue-planning`, `/dev-workflow-v2:choose-next-task`, and
`/dev-workflow-v2:start-implementation` as command entries.

---

Outside diff comments:
In `@scripts/archive-prd.sh`:
- Around line 37-46: The script currently looks up milestones by the PRD folder
slug ($PRD_NAME); change it to read the githubMilestone field from the marker
(set a new variable like GITHUB_MILESTONE by parsing marker.yml for
githubMilestone) and use that when building the gh API jq selector (replace uses
of $PRD_NAME in the select(.title == ...) with $GITHUB_MILESTONE); if
githubMilestone is missing, fall back to $PRD_NAME, and adjust the echo
warnings/messages to reference the milestone title variable used so failures are
visible and the archival step can reliably close the correct milestone.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: b6cd3a45-6ee5-4645-9a1c-c683e0d2d0f9

📥 Commits

Reviewing files that changed from the base of the PR and between e69026d and b16334d.

📒 Files selected for processing (10)
  • .claude/agents/task-check.md
  • CLAUDE.md
  • docs/conventions/prd-track-format.md
  • packages/riviere-role-enforcement/skills/plan-review.md
  • scripts/activate-prd.sh
  • scripts/archive-prd.sh
  • tools/dev-workflow-v2/.claude-plugin/plugin.json
  • tools/dev-workflow-v2/README.md
  • tools/dev-workflow-v2/agents/task-check.md
  • tools/dev-workflow-v2/commands/choose-next-task.md
💤 Files with no reviewable changes (1)
  • scripts/activate-prd.sh

Comment thread scripts/archive-prd.sh Outdated
Comment thread tools/dev-workflow-v2/README.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/project/PRD/riviere-extraction-workflows-v1/solution-exploration.md (1)

84-99: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Keep the preserved context aligned with the V1 scope.

Line 84 still says the workflow can run in CI, but Line 98 explicitly says CI support is not a V1 hard success goal. That reads broader than the rest of the draft and can confuse approval scope.

Suggested wording tweak
-After this PRD, users can define a workflow once for their project and run that workflow whenever they want to recreate the Rivière graph, including during local exploration, in CI, or whenever the code changes.
+After this PRD, users can define a workflow once for their project and run that workflow whenever they want to recreate the Rivière graph during local exploration or whenever the code changes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/project/PRD/riviere-extraction-workflows-v1/solution-exploration.md`
around lines 84 - 99, The paragraph that currently claims workflows can run
"including during local exploration, in CI, or whenever the code changes"
conflicts with the later success signal that "V1 does not require a hard success
goal that workflows run in CI"; to align scope, edit the sentence in the block
starting "After this PRD, users can define a workflow..." (the sentence
containing "including during local exploration, in CI, or whenever the code
changes") to remove or qualify "in CI" (e.g., "including during local
exploration or whenever the code changes" or "including local exploration and
optionally in CI") so the wording matches the explicit V1 scope in the
"Previously captured success signals" section.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@tools/dev-workflow-v2/commands/choose-next-task.md`:
- Line 13: The current instructions run separate GH CLI queries for
label:"idea", label:"bug", and label:"tech improvement" which can return the
same issue multiple times; update the aggregation step that collects outputs
from the commands like `gh issue list --search 'label:"idea" no:milestone
state:open' --json number,title,assignees,body,labels'` (and the analogous `bug`
and `tech improvement` queries) to deduplicate results by the issue `number`
before counting or recommending tasks (e.g., merge JSON outputs and filter
unique `number` values using jq or a small script) so each issue is only counted
once.
- Around line 7-10: The discovery logic currently anchored to
docs/project/PRD/*/marker.yml misses markers stored at the canonical location
docs/project/planning/<slug>.yml; update the task-listing instructions so the
command scans the canonical planning-marker path (docs/project/planning/*.yml)
and/or both locations (docs/project/planning/*.yml and
docs/project/PRD/*/marker.yml) before reading githubMilestone from each marker
and then reading docs/project/PRD/<planningId>/delivery.md for folders that have
one (ensure references to scanning, reading githubMilestone, and reading
delivery.md in the choose-next-task command/docs reflect the new path(s)).
- Line 21: Replace occurrences of the inline secret pattern
`GITHUB_TOKEN=<token>` (seen around the examples at lines 12–13, 21, and 109)
with command-substitution or exporting the token to avoid leaking secrets;
specifically, use `GITHUB_TOKEN="$(gh auth token)"` for single-command
invocation or `export GITHUB_TOKEN="$(gh auth token)"` for a session, and update
the examples/instructions that mention `gh auth token` to show these safer forms
instead of pasting raw tokens.

In `@tools/dev-workflow-v2/commands/continue-planning.md`:
- Around line 58-84: The command currently discovers markers under
docs/project/PRD/*/marker.yml but the project contract expects per-topic markers
at docs/project/planning/<slug>.yml; update the discovery logic and
documentation in continue-planning to look for markers in
docs/project/planning/*.yml (matching the slug), keep the same active-marker
check (stage != planning-complete), and when exactly one active marker is found
derive sibling paths from that planning file's slug (use planningId/slug to form
docs/project/PRD/<planningId>/problem-definition.md, /solution-exploration.md,
/PRD.md, /ARCH.md, /delivery.md) so the command aligns with the specified
contract and can locate topic-based markers.

In `@tools/dev-workflow-v2/commands/start-planning.md`:
- Around line 61-65: The template header "Problem Definition: <title>" is
ambiguous about how <title> is derived; update the document text near the
skeleton/template to explicitly state the derivation rule (e.g., "use the
original planning topic", "use a title-cased slug of the topic", or "use an
explicit user-provided title") and give the chosen rule as the canonical
instruction so all generated Problem Definition artifacts are consistent;
reference the template header string "Problem Definition: <title>" when adding
this one-line clarification and an example showing the expected resulting title
form.

In `@tools/dev-workflow-v2/planning-stages/architecture-drafting.md`:
- Around line 417-420: The doc currently references a "Component Archetypes"
section for role archetype names (and uses the `custom:` prefix rule), but that
target section is missing; to fix, add a new "Component Archetypes" subsection
that enumerates allowed archetype names and examples (including the `custom:`
prefix usage and example `custom:bulk-copy-script`), or alternatively update the
note to point to the correct existing section (e.g., "Component naming
guidelines") if one already exists; ensure the note mentioning "role archetypes"
and the `custom:` prefix is synchronized with the new or corrected section so
the rule is resolvable during architecture option authoring.

In `@tools/dev-workflow-v2/planning-stages/parallelization.md`:
- Around line 3-5: The file uses the British spelling "parallelisation" in the
body while the stage/filename is "parallelization"; update all occurrences of
"parallelisation" (lines referencing the legacy note and the second sentence) to
"parallelization" so the content consistently matches the stage name and
improves searchability—ensure you change both instances shown in the diff and
verify no other occurrences remain in the document.

In `@tools/dev-workflow-v2/planning-stages/success-criteria.md`:
- Line 5: The sentence in success-criteria.md implies the document itself
approves the product concept; change the wording to state approval is an outcome
recorded in PRD after stakeholders approve the concept from
solution-exploration.md. Update the line to something like: "Once a product
concept is approved following solution-exploration.md, its success criteria
should be recorded in PRD.md; delivery verification belongs in delivery.md," and
ensure the phrasing clarifies approval is an outcome by stakeholders, not an
action performed by the file.

In `@tools/dev-workflow-v2/planning-stages/task-creation.md`:
- Around line 218-237: The docs currently instruct inlining raw tokens
(GITHUB_TOKEN=<token> ...) which can leak credentials; update the examples to
remove any inline GITHUB_TOKEN usage and instead instruct users to authenticate
via gh (e.g. run gh auth login / gh auth status) and then call gh repo view, gh
api, gh label list and gh label create directly; replace the three example
command lines that start with "GITHUB_TOKEN=<token> gh ..." and the two that
start with "GITHUB_TOKEN=<token> gh label ..." with the same commands but
without the prefixed GITHUB_TOKEN, and add a short note to run gh auth login /
gh auth status beforehand.
- Around line 169-209: The current Step 4 annex (the "## Architectural Annex"
block) does not enforce the required "Relevant Architecture Decisions" payload;
update the task template to include a mandatory "## Relevant Architecture
Decisions" section immediately after the annex header that requires: Decision
Name, Chosen Design, Boundaries (scope), Forbidden Alternatives (what was
rejected), and Verification Checks (how to validate the decision). Modify the
"## Architectural Annex" template in the Step 4 content so the new "Relevant
Architecture Decisions" subsection is present and clearly labeled as required
(e.g., a table or bulleted fields) and ensure any instructions around consulting
`.riviere/*` remain, so implementers must fill these four fields when creating
the issue.

In `@tools/dev-workflow-v2/planning-stages/terminology.md`:
- Line 5: Update the guidance in terminology.md so it explicitly mandates using
the canonical glossary file for all term definitions referenced in
solution-exploration.md, PRD.md, ARCH.md, delivery.md and any generated tasks:
change the routing rule on line 5 to instruct authors to add or update terms
only in docs/architecture/domain-terminology/contextive/definitions.glossary.yml
(and not create standalone terminology stages), and include a short note in
terminology.md pointing to that file as the single source of truth for domain
terms to prevent divergence.

---

Outside diff comments:
In `@docs/project/PRD/riviere-extraction-workflows-v1/solution-exploration.md`:
- Around line 84-99: The paragraph that currently claims workflows can run
"including during local exploration, in CI, or whenever the code changes"
conflicts with the later success signal that "V1 does not require a hard success
goal that workflows run in CI"; to align scope, edit the sentence in the block
starting "After this PRD, users can define a workflow..." (the sentence
containing "including during local exploration, in CI, or whenever the code
changes") to remove or qualify "in CI" (e.g., "including during local
exploration or whenever the code changes" or "including local exploration and
optionally in CI") so the wording matches the explicit V1 scope in the
"Previously captured success signals" section.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 253dc709-4b5e-4a88-8729-fd297c9cc0e2

📥 Commits

Reviewing files that changed from the base of the PR and between b16334d and 95b52dd.

📒 Files selected for processing (30)
  • docs/project/PRD/riviere-extraction-workflows-v1/PRD.md
  • docs/project/PRD/riviere-extraction-workflows-v1/marker.yml
  • docs/project/PRD/riviere-extraction-workflows-v1/problem-definition.md
  • docs/project/PRD/riviere-extraction-workflows-v1/solution-exploration.md
  • tools/dev-workflow-v2/.claude-plugin/plugin.json
  • tools/dev-workflow-v2/README.md
  • tools/dev-workflow-v2/commands/choose-next-task.md
  • tools/dev-workflow-v2/commands/continue-planning.md
  • tools/dev-workflow-v2/commands/planning-status.md
  • tools/dev-workflow-v2/commands/start-planning.md
  • tools/dev-workflow-v2/planning-stages/architecture-approval.md
  • tools/dev-workflow-v2/planning-stages/architecture-drafting.md
  • tools/dev-workflow-v2/planning-stages/architecture-handoff.md
  • tools/dev-workflow-v2/planning-stages/delivery-planning.md
  • tools/dev-workflow-v2/planning-stages/dependencies.md
  • tools/dev-workflow-v2/planning-stages/design-principles.md
  • tools/dev-workflow-v2/planning-stages/milestones.md
  • tools/dev-workflow-v2/planning-stages/open-questions.md
  • tools/dev-workflow-v2/planning-stages/parallelization.md
  • tools/dev-workflow-v2/planning-stages/prd-approval.md
  • tools/dev-workflow-v2/planning-stages/prd-drafting.md
  • tools/dev-workflow-v2/planning-stages/problem-definition.md
  • tools/dev-workflow-v2/planning-stages/problem-statement.md
  • tools/dev-workflow-v2/planning-stages/research-references.md
  • tools/dev-workflow-v2/planning-stages/solution-exploration.md
  • tools/dev-workflow-v2/planning-stages/success-criteria.md
  • tools/dev-workflow-v2/planning-stages/task-creation.md
  • tools/dev-workflow-v2/planning-stages/terminology.md
  • tools/dev-workflow-v2/planning-stages/what-we-are-building.md
  • tools/dev-workflow-v2/planning-stages/what-we-are-not-building.md

Comment thread tools/dev-workflow-v2/commands/choose-next-task.md
Comment thread tools/dev-workflow-v2/commands/choose-next-task.md Outdated
Comment thread tools/dev-workflow-v2/commands/choose-next-task.md Outdated
Comment thread tools/dev-workflow-v2/commands/continue-planning.md
Comment thread tools/dev-workflow-v2/commands/start-planning.md
Comment thread tools/dev-workflow-v2/planning-stages/parallelization.md
Comment thread tools/dev-workflow-v2/planning-stages/success-criteria.md Outdated
Comment thread tools/dev-workflow-v2/planning-stages/task-creation.md Outdated
Comment thread tools/dev-workflow-v2/planning-stages/task-creation.md Outdated
Comment thread tools/dev-workflow-v2/planning-stages/terminology.md Outdated
@NTCoding NTCoding changed the title docs(workflow): centralize the local PRD-to-implementation workflow docs(workflow): design and build a new PRD and task planning workflow May 5, 2026
@sonarqubecloud

sonarqubecloud Bot commented May 5, 2026

Copy link
Copy Markdown

@NTCoding
NTCoding merged commit a8eafea into main May 5, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant