Skip to content

docs: normalize feature callouts and sync PROGRESS#129

Merged
phuongnse merged 3 commits into
mainfrom
cursor/docs-sync-maintenance-faea
May 26, 2026
Merged

docs: normalize feature callouts and sync PROGRESS#129
phuongnse merged 3 commits into
mainfrom
cursor/docs-sync-maintenance-faea

Conversation

@phuongnse

@phuongnse phuongnse commented May 26, 2026

Copy link
Copy Markdown
Owner

Summary

Audit-driven documentation sync after recent F02/F04 and E05/E06 retrofit work. All 29 feature files now use scannable Wireframes and Implementation status tables instead of cramped inline blockquotes. PROGRESS.md, E01 README, and system diagrams are aligned with the codebase (React 19, E06 DB/migrations, F02/F04 backend complete). Adds scripts/normalize-feature-docs.py with --check mode (wired into check-doc-drift.sh), a copy-paste US template, and documented layer-status conventions so agents do not misread epic-level API ✅ vs per-US gaps.

Follow-up review fixes in this PR iteration:

  • Fixed Markdown link-check issue in docs/epics/README.md command table row.
  • Fixed duplicate ## Wireframes section in E01 F01 and normalized deferred label formats to Deferred (PR #N follow-up) where applicable.
  • Split deferred note from Gaps vs spec into a standalone deferred line in E01 F02.
  • Updated normalize-feature-docs.py so deprecated-format detection reflects post-normalization state during write mode.

Linked spec

Cross-cutting — docs governance (docs/epics/README.md, docs/playbooks/docs-style.md, docs/PROGRESS.md, docs/epics/**/features/*.md, docs/epics/_template-feature-us.md).

Requirements & rules followed

  • Spec → code — docs-only PR; status callouts aligned with shipped endpoints from the audit
  • Gate 0 — N/A (no application code)
  • Gate 1 — N/A (docs-only)
  • Gate 2 — US callouts, epic README (E01), PROGRESS, docs-style, agent-checklist, CONTRIBUTING, docs/README, drift script updated; ./scripts/check-doc-drift.sh green (includes normalize-feature-docs.py --check)
  • Gate 3 — durable rules: feature file table layout, layer-status semantics, template file, CI enforcement via drift script
  • Workarounds — N/A
  • No new TODO/FIXME/stub — N/A (docs + script only)
Open in Web Open in Cursor 

Summary by CodeRabbit

  • Documentation

    • Clarified implementation-status across epics with consistent tables and expanded “gaps/decisions” notes.
    • Standardized feature docs and wireframe presentation; added a feature-US template and contributor guidance plus automated formatting checks for epic feature docs.
  • Infrastructure

    • Updated architecture and diagram text to reflect React 19.

Review Change Stack

- Table layout for wireframes and Implementation status (29 feature files)
- Add scripts/normalize-feature-docs.py + drift guard for deprecated format
- Sync PROGRESS.md (React 19, E06 infra, F02/F04 backend, retrofit status)
- Document layer-status conventions in epics/README and docs-style.md
- Regenerate system/container diagrams for React 19

Co-authored-by: Phuong Nguyen <phuongnse@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR standardizes epic feature documentation formatting across 50+ markdown files by introducing a template, documenting formatting rules, building a normalization script, and integrating it into CI checks. Additionally, it updates frontend stack references from React 18 to React 19 in diagrams and progress tracking.

Changes

Epic Feature Documentation Format Standards and Enforcement

Layer / File(s) Summary
Documentation Standards Definition & Template
docs/playbooks/docs-style.md, docs/epics/_template-feature-us.md, docs/README.md, docs/epics/README.md
Defines standardized layout for epic feature files including required wireframes table structure, implementation-status table format (per-layer rows: Domain/Application/Infrastructure/API/Frontend), and layer-symbol legend. Creates a reusable template scaffold and documents wireframe/feature-file organization in the docs README.
Normalization Script Implementation
scripts/normalize-feature-docs.py
Implements a Python CLI tool that transforms feature markdown files to enforce wireframes-table and implementation-status-table formatting, detects and reports deprecated patterns (single-line status, inline wireframe blockquotes), and supports --check mode for non-destructive validation. Includes helpers for Excalidraw slug derivation, layer sorting by fixed order, and deterministic content substitutions.
CI Check Integration & Developer Workflow
scripts/check-doc-drift.sh, CONTRIBUTING.md, docs/playbooks/agent-checklist.md
Integrates normalize-feature-docs.py --check into check-doc-drift.sh to enforce formatting on changed feature files; updates contributor guidelines and agent checklists to document the new requirement when docs/epics/ changes.
Epic Feature Files Formatting (E01–E06)
docs/epics/E0[1-6]-*/README.md, docs/epics/E0[1-6]-*/features/F0[0-9]-*.md
Applies standardized wireframes-table and implementation-status-table formatting across Platform Foundation (E01), Identity & Access (E02), Data Modeling (E03), Workflow Builder (E04), Form Builder (E05), and Workflow Engine (E06) feature documentation. Updates E01 README implementation-status table and docs/epics/README layer-symbols guidance.

Frontend Stack Version Update (React 18 → 19)

Layer / File(s) Summary
Diagram & Progress Documentation Updates
docs/diagrams/container.excalidraw, docs/diagrams/system-context.excalidraw, docs/diagrams/generate-diagrams.mjs, docs/PROGRESS.md
Updates React version references from 18 to 19 in Excalidraw diagram text labels and the diagram-generation script; updates PROGRESS.md Frontend Foundation section to reflect React 19 as the documented frontend stack.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • phuong-labs/axis#33: Overlaps on E01 epic docs (wireframe and status formatting updates).
  • phuong-labs/axis#49: Changes to doc-drift / CONTRIBUTING guidance and CI checks touching the same enforcement path.
  • phuong-labs/axis#28: Related to the wireframe callout convention and generation workflow used by feature docs.

Poem

🐰 Hop along the docs with glee,
Tables neat for all to see,
Wireframes lined and statuses clear,
React 19 hops drawing near,
A tiny script trims the stray — hooray, hooray, hooray!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'docs: normalize feature callouts and sync PROGRESS' clearly and specifically summarizes the main changes—standardizing documentation formatting and updating progress tracking.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/docs-sync-maintenance-faea

Comment @coderabbitai help to get the list of available commands and usage tips.

- Fix epics/README link to docs-style (lychee was failing)
- Add docs/epics/_template-feature-us.md with valid example paths
- normalize-feature-docs.py --check for CI via check-doc-drift.sh
- Restore docs/README.md; document template in navigation table
- Update CONTRIBUTING and agent-checklist for normalize workflow

Co-authored-by: Phuong Nguyen <phuongnse@users.noreply.github.com>
@phuongnse phuongnse marked this pull request as ready for review May 26, 2026 07:18

@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: 15

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (13)
docs/epics/README.md-16-16 (1)

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

Escape pipes in inline code inside the table cell.

Line 16 uses | characters inside backticks within a table row, which breaks column parsing in many Markdown renderers and linters (MD056). Escape the pipes (\|) or move the command out of the table.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/README.md` at line 16, The table row contains inline code with
unescaped pipe characters which breaks Markdown table parsing; update the inline
code in the row (the grep command string `grep -rE "\| Application \| ⚠️|\|
Infrastructure \| ⚠️|\| API \| ⚠️" docs/epics/`) to escape each pipe as `\|` (or
alternatively move the command out of the table into a fenced code block), so
replace the inline snippet in the README table row with an escaped-pipe version
to satisfy MD056.
docs/epics/E02-identity-access/features/F02-user-management.md-99-100 (1)

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

Add explicit Deferred (PR #N follow-up) lines for pending work.

These sections mark work as pending/not started, but the callouts do not include a dedicated deferred line. Please add one per deferred item to keep status semantics explicit.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 139-140, 176-177

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E02-identity-access/features/F02-user-management.md` around lines
99 - 100, The doc currently lists pending items (session sign-in after accept,
platform-wide email check, and related notes) without explicit deferral markers;
update the feature callouts to include a "Deferred (PR `#N` follow-up)" line for
each deferred/not-started item (e.g., where you mention Invitation.Accept(),
ValidationException handling, AcceptInvitationHandler calling
user.VerifyEmail(), and the session sign-in/API auth concern) so the
implementation status explicitly records these as deferred and not marked ✅.
docs/epics/E01-platform-foundation/features/F01-tenant-registration.md-154-154 (1)

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

Normalize deferred follow-up format to include PR number.

Use Deferred (PR #N follow-up) instead of Deferred (PR follow-up) to match the documented convention.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E01-platform-foundation/features/F01-tenant-registration.md` at
line 154, Replace the ambiguous "Deferred (PR follow-up)" callout text with the
standardized format including the PR number (e.g., "Deferred (PR `#123`
follow-up)") wherever the exact string "Deferred (PR follow-up)" appears in the
implementation status callout; update the specific line containing "**Deferred
(PR follow-up): external paging integration for platform alerts (critical log is
the MVP signal).**" to "Deferred (PR `#N` follow-up): ..." with the correct PR
number and ensure the callout is not marked as completed (remove any ✅ status)
so the deferred work follows the documented convention.
docs/epics/E01-platform-foundation/features/F04-subscription-plans.md-105-105 (1)

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

Use the required deferred label pattern.

Please rewrite this to Deferred (PR #N follow-up): ... so it matches the docs standard.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E01-platform-foundation/features/F04-subscription-plans.md` at
line 105, Replace the callout line that currently reads "Deferred (follow-up
PR): atomic check-and-consume for monthly execution starts (race can briefly
exceed cap under concurrency); fail-closed when usage counter/Redis unavailable
(today logs warning and treats usage as 0)." with the standardized pattern
"Deferred (PR `#N` follow-up): atomic check-and-consume for monthly execution
starts (race can briefly exceed cap under concurrency); fail-closed when usage
counter/Redis unavailable (today logs warning and treats usage as 0)." so it
matches the docs standard and include a placeholder PR number (PR `#N`) to be
updated when the follow-up PR is created.
docs/epics/E02-identity-access/features/F03-role-management.md-89-90 (1)

89-90: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Call out deferred items explicitly in each affected status block.

Where work is marked pending in Gaps vs spec, add a standalone Deferred (PR #N follow-up): ... line to keep the implementation status format consistent and auditable.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 127-128, 163-164

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E02-identity-access/features/F03-role-management.md` around lines
89 - 90, Update the implementation status callouts in the role-management
feature doc so any "pending" item in the "Gaps vs spec" blocks is accompanied by
a standalone "Deferred (PR `#N` follow-up): <short description>" line;
specifically, locate the "Gaps vs spec" callouts that currently say "403
permission check requires JWT identity from API layer — pending" (and the other
two occurrences) and add a Deferred line after each pending note that references
a follow-up PR placeholder (PR `#N`) and a brief action (e.g., "implement
API-layer JWT identity check and 403 enforcement"). Ensure the new Deferred
lines are separate sentences/lines in the same status callout so the
implementation status format remains consistent and auditable.
docs/epics/E01-platform-foundation/features/F01-tenant-registration.md-16-16 (1)

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

Remove duplicate ## Wireframes heading.

There are two identical section headings in the same file, which triggers duplicate-heading lint and makes the doc structure ambiguous.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E01-platform-foundation/features/F01-tenant-registration.md` at
line 16, The file contains a duplicated section heading "## Wireframes"; remove
the redundant "## Wireframes" occurrence so only a single "## Wireframes"
heading remains (locate the two identical headings in F01-tenant-registration.md
and delete the extra one), then verify the document structure still flows
correctly and re-run the markdown linter to ensure the duplicate-heading warning
is resolved.
docs/epics/E01-platform-foundation/features/F02-organization-management.md-143-143 (1)

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

Split deferred content into its own Deferred line.

Deferred (PR #127 follow-up) is currently embedded in Gaps vs spec; move it to a standalone deferred line in the callout for consistency with the format standard.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E01-platform-foundation/features/F02-organization-management.md`
at line 143, The callout line containing "Gaps vs spec: Deferred (PR `#127`
follow-up): ..." should be split so that "Deferred (PR `#127` follow-up):
marketing-page redirect + forced sign-out after schedule (Frontend/session);
..." is its own standalone Deferred line; locate the callout containing the
"Gaps vs spec:" text and remove the embedded "Deferred (PR `#127` follow-up)"
portion from that line, then add a separate line starting with "Deferred (PR
`#127` follow-up):" containing the deferred items (including the reference to
docs/WORKAROUNDS.md#org-hard-delete-modulith-cancellers), and ensure the
implementation status callout follows the guideline of adding a Deferred line
rather than silently marking incomplete work as ✅.
docs/epics/E03-data-modeling/features/F01-model-definition.md-168-168 (1)

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

Use the required deferred follow-up format.

Please rewrite this as Deferred (PR #N follow-up): ... so the handoff is trackable and consistent with the docs standard.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E03-data-modeling/features/F01-model-definition.md` at line 168,
Replace the current "Deferred:" line with the required format "Deferred (PR `#N`
follow-up): ..." so the handoff is trackable; specifically update the
implementation status callout in the feature doc (the line currently reading
"Deferred: DataModeling relation fields on other models flagged broken when
target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped
via `ModelDeletedHandler` (Kafka).") to use the exact phrasing "Deferred (PR `#N`
follow-up): ..." and include the PR number placeholder, preserving the rest of
the explanation and references to WorkflowBuilder and ModelDeletedHandler.
docs/epics/E04-workflow-builder/features/F01-workflow-definition.md-79-90 (1)

79-90: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Status tables should not show ✅ where API work is still pending.

These sections list unresolved backend/API work in “Gaps vs spec” but still mark API as complete. Please make the API status non-complete until those gaps are closed.

As per coding guidelines, "never silently mark incomplete work as ✅".

Also applies to: 114-125, 149-160

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F01-workflow-definition.md` around
lines 79 - 90, Update the implementation status tables so the API row is not
marked as complete: change the API cell from "✅" to "⏳" (or another non-complete
symbol) in the "Implementation status" table at the current block and the other
occurrences referenced (around the sections covering lines 114-125 and 149-160)
to reflect the "Gaps vs spec" notes about status-tab filter and
last-execution-date/backend polish; ensure the table text remains aligned and
the "Gaps vs spec" note clearly corresponds to the API being in-progress.
docs/epics/E02-identity-access/features/F04-permissions.md-91-103 (1)

91-103: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align API status with listed pending work.

Both callouts mark API as ✅ while the same blocks say policy middleware/authorization work is still pending. Please switch those API statuses to a non-complete state and keep the gap note, so progress isn’t overstated.

As per coding guidelines, "never silently mark incomplete work as ✅".

Also applies to: 128-139

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E02-identity-access/features/F04-permissions.md` around lines 91 -
103, Update the "Implementation status" table under the "Implementation status"
heading so the API row is not marked ✅ (use a non-complete marker like ⏳ or ⚠️)
and keep the "Gaps vs spec:" note about policy-based authorization middleware
and the `[RequirePermission]` attribute; also locate and update the second
identical status table later in the document (the other "Implementation status"
block) to match this change so the API progress isn’t overstated while
preserving the existing gap/decision text.
docs/epics/E02-identity-access/features/F05-password-security.md-53-65 (1)

53-65: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Status tables currently over-report completion for API work.

These sections list API/backend gaps but still mark API as ✅. Please mark API as incomplete until those items are shipped, then flip to ✅.

As per coding guidelines, "never silently mark incomplete work as ✅".

Also applies to: 92-104, 131-143

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E02-identity-access/features/F05-password-security.md` around
lines 53 - 65, The Implementation status table under the "**Implementation
status**" heading currently marks the API as ✅ despite listed API/backend gaps;
update the API row (the cell showing "API | ✅") to an incomplete state (e.g., ⏳
or ❌) and do the same for the other two occurrences referenced (the sections
around lines 92-104 and 131-143) so the docs don't silently report incomplete
work as done; keep the Domain/Application/Infrastructure/Frontend statuses
unchanged and ensure a brief note next to the API row can indicate "gaps: rate
limiting, auto sign-in after reset" if you want immediate clarity.
docs/epics/E03-data-modeling/features/F04-data-records.md-245-245 (1)

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

Convert this deferral note to the mandated follow-up line format.

Please add a dedicated Deferred (PR #N follow-up): ... line in the implementation-status callout instead of inline “deferred” wording.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E03-data-modeling/features/F04-data-records.md` at line 245,
Update the implementation-status callout so the inline text "async export for
>5,000 records deferred" is removed and replaced by a dedicated follow-up line
reading exactly "Deferred (PR `#N` follow-up): async export for >5,000 records —
pending Wolverine background job + in-app notification infrastructure"; edit the
file's implementation-status block in
docs/epics/E03-data-modeling/features/F04-data-records.md and locate the
sentence containing "async export for >5,000 records deferred" to convert it
into the new Deferred (PR `#N` follow-up) line, leaving the rest of the CSV export
streaming note intact and using a placeholder PR number to be filled when
creating the follow-up PR.
docs/epics/E04-workflow-builder/features/F02-visual-canvas.md-155-161 (1)

155-161: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Normalize layer-status symbols to the required scheme.

These callouts use N/A/, but the doc rule requires layer statuses expressed with or ⚠️. Please convert to the approved symbols and keep the explanatory note for client-only scope.

As per coding guidelines, "Include an Implementation status callout ... with layer status (✅ or ⚠️)".

Also applies to: 189-195

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F02-visual-canvas.md` around lines
155 - 161, The "Implementation status" callout uses the wrong symbols—replace
the table values so layer statuses use the approved symbols (use ✅ for
implemented/covered and ⚠️ for client-only or pending) by editing the markdown
table under the "Implementation status" header (replace "N/A" with ✅/⚠️ as
appropriate and replace the ⏳ with ⚠️ for Frontend), preserve the explanatory
note about client-only scope immediately below the table, and apply the same
replacements to the other occurrence of the same "Implementation status" table
later in the file.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/epics/E04-workflow-builder/features/F03-step-types.md`:
- Around line 45-57: The Implementation status callouts that list incomplete
work (e.g., the one noting "Frontend ⏳" and gaps like "form picker UI, assignee
expression evaluation, and timeout enforcement pending Frontend + E06") must
include an explicit deferred-tracking line; add a line reading "Deferred (PR `#N`
follow-up)" under each Implementation status table entry that is not complete so
the pending work is tracked, and repeat this change for the other Implementation
status callouts referenced in the comment (the similar tables at the other
sections). Ensure you place the exact text "Deferred (PR `#N` follow-up)" beneath
the callout so it follows the project guideline.

In `@docs/epics/E04-workflow-builder/features/F04-triggers.md`:
- Around line 43-55: The "Implementation status" callouts in the F04-triggers
doc mark some layers as deferred/⏳ but omit the required deferred tracking line;
update each "Implementation status" callout block (the ones showing
Domain/Application/Infrastructure/API/Frontend statuses) to include a line
"Deferred (PR `#N` follow-up)" for any layer not completed (⏳), ensuring every
deferred status block contains that exact tracking line; apply this change to
the three other callouts referenced (the blocks around lines 83-94, 122-133,
162-173) so no incomplete work is silently marked as ✅.

In `@docs/epics/E04-workflow-builder/features/F05-branching.md`:
- Around line 42-54: The implementation status callout currently marks
incomplete work without an explicit deferred-followup note; update the
Implementation status table(s) in this document (the main "Implementation
status" callout and the other similar callouts referenced later) so that any
layer not finished (e.g., Frontend ⏳ and any other non-✅ entries) includes a
line reading "Deferred (PR `#N` follow-up)"; ensure you add that deferred line for
each deferred layer rather than leaving it silently incomplete and keep the
existing status symbols and text intact.

In `@docs/epics/E04-workflow-builder/features/F06-parallel-execution.md`:
- Around line 44-55: Update the "Implementation status" callouts to explicitly
annotate any pending/incomplete work with the mandated deferred note: add a line
"Deferred (PR `#N` follow-up)" inside each callout that currently lists gaps
(e.g., the callout around "canvas container node rendering and step nesting UI
pending Frontend" and the other callouts referenced at 81-92 and 115-126), and
ensure no incomplete item is marked with a definitive ✅; replace or augment any
ambiguous status entries so the callout contains the exact deferred annotation.

In `@docs/epics/E04-workflow-builder/features/F07-import-export.md`:
- Around line 42-54: The "Implementation status" callout blocks that list
Layer|Status (the tables showing Domain/Application/Infrastructure/API/Frontend
and the related callouts) are missing the required deferred follow-up tag; for
each callout that currently shows unfinished work (e.g., the Frontend ⏳ or other
deferred notes in the same callout), append a line "Deferred (PR `#N` follow-up)"
immediately under the callout text so each deferred implementation status
includes that exact follow-up marker; apply the same change to the other two
matching callouts in this document (the blocks around the other "Implementation
status" callouts).

In `@docs/epics/E05-form-builder/features/F01-form-definition.md`:
- Around line 42-54: Update each "Implementation status" callout in the document
to append a deferred follow-up note for any layer that is not fully implemented:
for every status table where a layer shows pending work (e.g., the Frontend
marked ⏳), add a new line "Deferred (PR `#N` follow-up)" immediately after the
table; ensure you update the three other callouts referenced (lines 78-90,
114-126, 150-162) as well so no incomplete work remains marked solely as ✅. Use
the same phrasing "Deferred (PR `#N` follow-up)" and place it directly under the
Implementation status table for the sections that have pending work.

In `@docs/epics/E05-form-builder/features/F02-form-fields.md`:
- Around line 47-59: Update the "Implementation status" callout blocks so any
non-complete layer shows a deferred follow-up line; specifically, for the four
status blocks in this doc (the block showing
Domain/Application/Infrastructure/API/Frontend and the other three mentioned at
lines ~86-97, ~121-133, ~157-169), append a line "Deferred (PR `#N` follow-up)"
for each layer that is not final/complete (e.g., where Frontend is ⏳ or gaps are
listed). Ensure you keep the existing status symbols and add the deferred note
consistently across all four blocks and replace N with the actual PR number when
known.

In `@docs/epics/E05-form-builder/features/F03-workflow-integration.md`:
- Around line 44-56: The implementation status tables are missing explicit
deferred tracking entries; update each "Frontend | ⏳" (and any other non-✅ rows)
in the "Implementation status" callouts to append a line like "Deferred (PR `#N`
follow-up)" so deferred work is tied to a follow-up PR, and ensure the same
change is applied to the other callouts referenced (around the second and third
tables); keep the descriptive notes about GetFormPickerQuery and
IsReferencedByWorkflowAsync untouched, only add the Deferred (PR `#N` follow-up)
lines to the deferred status entries.

In `@docs/epics/E05-form-builder/features/F04-form-submission.md`:
- Around line 45-56: The "Implementation status" callout(s) currently list
incomplete layers (e.g., Application, API, Frontend) but omit the required
follow-up marker; update each "Implementation status" callout by adding a new
line reading "Deferred (PR `#N` follow-up)" for every deferred/incomplete layer
(replace `#N` with the appropriate PR number), and ensure you apply this same
change to all other "Implementation status" callouts in the document (the other
occurrences that show pending/⏳/⚠️ statuses) so every deferred item is
explicitly tracked.

In `@docs/epics/E06-workflow-engine/features/F01-execution-management.md`:
- Around line 46-57: Update every "Implementation status" callout that lists
incomplete layers to include a deferred follow-up line; specifically add a line
like "Deferred (PR `#N` follow-up): describe remaining work" under each block that
currently shows ⏳ (e.g., the callout showing API and Frontend as ⏳ in the
existing Implementation status and the similar callouts around the other
sections referenced). Ensure the message names the PR placeholder "PR `#N`" and a
brief description of what's deferred (e.g., "trigger HTTP endpoint,
schedule/webhook/event trigger handlers, stale-PENDING recovery job") so no
incomplete work is silently marked, and apply the same change to the other
Implementation status blocks noted in the comment.

In `@docs/epics/E06-workflow-engine/features/F02-step-handlers.md`:
- Around line 100-114: Update the "Implementation status" callout block to
explicitly list the deferred follow-up by adding a line like "Deferred (PR `#N`
follow-up)" under the status/gaps content (near the other bullet points about
gaps vs spec), so the callout that begins with "**Implementation status**" and
the subsequent "**Gaps vs spec:**" section includes a clear Deferred entry
indicating which PR will follow up on the unfinished work.

In `@docs/epics/E06-workflow-engine/features/F03-error-handling.md`:
- Around line 44-55: In the "Implementation status" callout and the two other
deferred callouts that omit follow-ups, add explicit follow-up lines using the
exact format "Deferred (PR `#N` follow-up): <brief next-step>" so each deferred
item (e.g., the Application-layer notification dispatch handler, wiring
ExecutionFailed event to channels, and pending email/in-app/webhook dispatch +
rate-limiting work) documents the PR number and next action; locate the three
callouts by the "Implementation status" table and the two other deferred
callouts in this feature doc and append a "Deferred (PR `#N` follow-up): ..." line
to each deferred entry.

In `@docs/epics/E06-workflow-engine/features/F04-execution-history.md`:
- Around line 45-57: Update each "Implementation status" callout that lists
deferred work to include a "Deferred (PR `#N` follow-up)" line; specifically add
this to the callout that mentions Filter UI, date/trigger query params, and
running-first sort pending API + Frontend (the block that references
GetExecutionsByWorkflowHandler and GetAllExecutionsHandler using
IExecutionRepository.GetPagedByWorkflowAsync/GetPagedAsync), and likewise add
the same deferred line to the other two implementation-status callouts
referenced in the comment (around the blocks at lines 83-94 and 118-129) so no
incomplete work is marked as ✅ without a follow-up PR reference.

In `@docs/epics/E06-workflow-engine/features/F05-manual-retry.md`:
- Around line 47-59: Update each "Implementation status" callout that contains
any incomplete work to include a deferred follow-up note: add the exact line
"Deferred (PR `#N` follow-up)" beneath the status table for the callout shown (the
callout starting with "**Implementation status**" and its status table), and do
the same for the two other matching callouts later in the document (the other
"**Implementation status**" sections referenced). Ensure the deferred line
appears whenever a non-✅ item or pending work is present (e.g., Frontend ⏳,
archived-definition warning), keeping the table and surrounding wording
unchanged except for inserting the Deferred (PR `#N` follow-up) line.

In `@scripts/normalize-feature-docs.py`:
- Around line 230-243: The script collects deprecated_issues by calling
check_deprecated_format(path) before process_file(path), causing exit_code to be
set even when process_file normalizes the file; update the loop that iterates
over ROOT.glob(FEATURE_GLOB) to run process_file(path, check_only=args.check)
first and only call check_deprecated_format(path) afterward (or re-run
check_deprecated_format only when args.check is true) so deprecated_issues
reflects the post-normalization state; reference the loop, deprecated_issues,
check_deprecated_format, and process_file to locate and change the call order or
conditional logic.

---

Minor comments:
In `@docs/epics/E01-platform-foundation/features/F01-tenant-registration.md`:
- Line 154: Replace the ambiguous "Deferred (PR follow-up)" callout text with
the standardized format including the PR number (e.g., "Deferred (PR `#123`
follow-up)") wherever the exact string "Deferred (PR follow-up)" appears in the
implementation status callout; update the specific line containing "**Deferred
(PR follow-up): external paging integration for platform alerts (critical log is
the MVP signal).**" to "Deferred (PR `#N` follow-up): ..." with the correct PR
number and ensure the callout is not marked as completed (remove any ✅ status)
so the deferred work follows the documented convention.
- Line 16: The file contains a duplicated section heading "## Wireframes";
remove the redundant "## Wireframes" occurrence so only a single "## Wireframes"
heading remains (locate the two identical headings in F01-tenant-registration.md
and delete the extra one), then verify the document structure still flows
correctly and re-run the markdown linter to ensure the duplicate-heading warning
is resolved.

In `@docs/epics/E01-platform-foundation/features/F02-organization-management.md`:
- Line 143: The callout line containing "Gaps vs spec: Deferred (PR `#127`
follow-up): ..." should be split so that "Deferred (PR `#127` follow-up):
marketing-page redirect + forced sign-out after schedule (Frontend/session);
..." is its own standalone Deferred line; locate the callout containing the
"Gaps vs spec:" text and remove the embedded "Deferred (PR `#127` follow-up)"
portion from that line, then add a separate line starting with "Deferred (PR
`#127` follow-up):" containing the deferred items (including the reference to
docs/WORKAROUNDS.md#org-hard-delete-modulith-cancellers), and ensure the
implementation status callout follows the guideline of adding a Deferred line
rather than silently marking incomplete work as ✅.

In `@docs/epics/E01-platform-foundation/features/F04-subscription-plans.md`:
- Line 105: Replace the callout line that currently reads "Deferred (follow-up
PR): atomic check-and-consume for monthly execution starts (race can briefly
exceed cap under concurrency); fail-closed when usage counter/Redis unavailable
(today logs warning and treats usage as 0)." with the standardized pattern
"Deferred (PR `#N` follow-up): atomic check-and-consume for monthly execution
starts (race can briefly exceed cap under concurrency); fail-closed when usage
counter/Redis unavailable (today logs warning and treats usage as 0)." so it
matches the docs standard and include a placeholder PR number (PR `#N`) to be
updated when the follow-up PR is created.

In `@docs/epics/E02-identity-access/features/F02-user-management.md`:
- Around line 99-100: The doc currently lists pending items (session sign-in
after accept, platform-wide email check, and related notes) without explicit
deferral markers; update the feature callouts to include a "Deferred (PR `#N`
follow-up)" line for each deferred/not-started item (e.g., where you mention
Invitation.Accept(), ValidationException handling, AcceptInvitationHandler
calling user.VerifyEmail(), and the session sign-in/API auth concern) so the
implementation status explicitly records these as deferred and not marked ✅.

In `@docs/epics/E02-identity-access/features/F03-role-management.md`:
- Around line 89-90: Update the implementation status callouts in the
role-management feature doc so any "pending" item in the "Gaps vs spec" blocks
is accompanied by a standalone "Deferred (PR `#N` follow-up): <short description>"
line; specifically, locate the "Gaps vs spec" callouts that currently say "403
permission check requires JWT identity from API layer — pending" (and the other
two occurrences) and add a Deferred line after each pending note that references
a follow-up PR placeholder (PR `#N`) and a brief action (e.g., "implement
API-layer JWT identity check and 403 enforcement"). Ensure the new Deferred
lines are separate sentences/lines in the same status callout so the
implementation status format remains consistent and auditable.

In `@docs/epics/E02-identity-access/features/F04-permissions.md`:
- Around line 91-103: Update the "Implementation status" table under the
"Implementation status" heading so the API row is not marked ✅ (use a
non-complete marker like ⏳ or ⚠️) and keep the "Gaps vs spec:" note about
policy-based authorization middleware and the `[RequirePermission]` attribute;
also locate and update the second identical status table later in the document
(the other "Implementation status" block) to match this change so the API
progress isn’t overstated while preserving the existing gap/decision text.

In `@docs/epics/E02-identity-access/features/F05-password-security.md`:
- Around line 53-65: The Implementation status table under the "**Implementation
status**" heading currently marks the API as ✅ despite listed API/backend gaps;
update the API row (the cell showing "API | ✅") to an incomplete state (e.g., ⏳
or ❌) and do the same for the other two occurrences referenced (the sections
around lines 92-104 and 131-143) so the docs don't silently report incomplete
work as done; keep the Domain/Application/Infrastructure/Frontend statuses
unchanged and ensure a brief note next to the API row can indicate "gaps: rate
limiting, auto sign-in after reset" if you want immediate clarity.

In `@docs/epics/E03-data-modeling/features/F01-model-definition.md`:
- Line 168: Replace the current "Deferred:" line with the required format
"Deferred (PR `#N` follow-up): ..." so the handoff is trackable; specifically
update the implementation status callout in the feature doc (the line currently
reading "Deferred: DataModeling relation fields on other models flagged broken
when target model deleted. WorkflowBuilder `record.*` trigger broken flags
shipped via `ModelDeletedHandler` (Kafka).") to use the exact phrasing "Deferred
(PR `#N` follow-up): ..." and include the PR number placeholder, preserving the
rest of the explanation and references to WorkflowBuilder and
ModelDeletedHandler.

In `@docs/epics/E03-data-modeling/features/F04-data-records.md`:
- Line 245: Update the implementation-status callout so the inline text "async
export for >5,000 records deferred" is removed and replaced by a dedicated
follow-up line reading exactly "Deferred (PR `#N` follow-up): async export for
>5,000 records — pending Wolverine background job + in-app notification
infrastructure"; edit the file's implementation-status block in
docs/epics/E03-data-modeling/features/F04-data-records.md and locate the
sentence containing "async export for >5,000 records deferred" to convert it
into the new Deferred (PR `#N` follow-up) line, leaving the rest of the CSV export
streaming note intact and using a placeholder PR number to be filled when
creating the follow-up PR.

In `@docs/epics/E04-workflow-builder/features/F01-workflow-definition.md`:
- Around line 79-90: Update the implementation status tables so the API row is
not marked as complete: change the API cell from "✅" to "⏳" (or another
non-complete symbol) in the "Implementation status" table at the current block
and the other occurrences referenced (around the sections covering lines 114-125
and 149-160) to reflect the "Gaps vs spec" notes about status-tab filter and
last-execution-date/backend polish; ensure the table text remains aligned and
the "Gaps vs spec" note clearly corresponds to the API being in-progress.

In `@docs/epics/E04-workflow-builder/features/F02-visual-canvas.md`:
- Around line 155-161: The "Implementation status" callout uses the wrong
symbols—replace the table values so layer statuses use the approved symbols (use
✅ for implemented/covered and ⚠️ for client-only or pending) by editing the
markdown table under the "Implementation status" header (replace "N/A" with ✅/⚠️
as appropriate and replace the ⏳ with ⚠️ for Frontend), preserve the explanatory
note about client-only scope immediately below the table, and apply the same
replacements to the other occurrence of the same "Implementation status" table
later in the file.

In `@docs/epics/README.md`:
- Line 16: The table row contains inline code with unescaped pipe characters
which breaks Markdown table parsing; update the inline code in the row (the grep
command string `grep -rE "\| Application \| ⚠️|\| Infrastructure \| ⚠️|\| API \|
⚠️" docs/epics/`) to escape each pipe as `\|` (or alternatively move the command
out of the table into a fenced code block), so replace the inline snippet in the
README table row with an escaped-pipe version to satisfy MD056.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5888b654-3bd0-43d5-8471-4706ef62d619

📥 Commits

Reviewing files that changed from the base of the PR and between c79eb3a and a238bae.

⛔ Files ignored due to path filters (2)
  • docs/diagrams/container.svg is excluded by !**/*.svg
  • docs/diagrams/system-context.svg is excluded by !**/*.svg
📒 Files selected for processing (42)
  • CONTRIBUTING.md
  • docs/PROGRESS.md
  • docs/README.md
  • docs/diagrams/container.excalidraw
  • docs/diagrams/generate-diagrams.mjs
  • docs/diagrams/system-context.excalidraw
  • docs/epics/E01-platform-foundation/README.md
  • docs/epics/E01-platform-foundation/features/F01-tenant-registration.md
  • docs/epics/E01-platform-foundation/features/F02-organization-management.md
  • docs/epics/E01-platform-foundation/features/F03-tenant-isolation.md
  • docs/epics/E01-platform-foundation/features/F04-subscription-plans.md
  • docs/epics/E02-identity-access/features/F01-authentication.md
  • docs/epics/E02-identity-access/features/F02-user-management.md
  • docs/epics/E02-identity-access/features/F03-role-management.md
  • docs/epics/E02-identity-access/features/F04-permissions.md
  • docs/epics/E02-identity-access/features/F05-password-security.md
  • docs/epics/E03-data-modeling/features/F01-model-definition.md
  • docs/epics/E03-data-modeling/features/F02-field-types.md
  • docs/epics/E03-data-modeling/features/F03-data-classes.md
  • docs/epics/E03-data-modeling/features/F04-data-records.md
  • docs/epics/E04-workflow-builder/features/F01-workflow-definition.md
  • docs/epics/E04-workflow-builder/features/F02-visual-canvas.md
  • docs/epics/E04-workflow-builder/features/F03-step-types.md
  • docs/epics/E04-workflow-builder/features/F04-triggers.md
  • docs/epics/E04-workflow-builder/features/F05-branching.md
  • docs/epics/E04-workflow-builder/features/F06-parallel-execution.md
  • docs/epics/E04-workflow-builder/features/F07-import-export.md
  • docs/epics/E05-form-builder/features/F01-form-definition.md
  • docs/epics/E05-form-builder/features/F02-form-fields.md
  • docs/epics/E05-form-builder/features/F03-workflow-integration.md
  • docs/epics/E05-form-builder/features/F04-form-submission.md
  • docs/epics/E06-workflow-engine/features/F01-execution-management.md
  • docs/epics/E06-workflow-engine/features/F02-step-handlers.md
  • docs/epics/E06-workflow-engine/features/F03-error-handling.md
  • docs/epics/E06-workflow-engine/features/F04-execution-history.md
  • docs/epics/E06-workflow-engine/features/F05-manual-retry.md
  • docs/epics/README.md
  • docs/epics/_template-feature-us.md
  • docs/playbooks/agent-checklist.md
  • docs/playbooks/docs-style.md
  • scripts/check-doc-drift.sh
  • scripts/normalize-feature-docs.py

Comment on lines +45 to 57
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** form picker UI, assignee expression evaluation, and timeout enforcement pending Frontend + E06.
> **Decisions:** step config (formId, assignee, timeout) stored as JSONB dict in `steps` column. `StepType` enum includes `Start` and `End` values.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add required deferred follow-up lines to each Implementation status callout.

These callouts document pending work but do not include the required Deferred (PR #N follow-up) line. Please add it for each deferred gap so incomplete items are explicitly tracked per guideline.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 86-97, 124-135, 164-175, 204-215

🧰 Tools
🪛 LanguageTool

[grammar] ~45-~45: Ensure spelling is correct
Context: ...onse) — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F03-step-types.md` around lines 45 -
57, The Implementation status callouts that list incomplete work (e.g., the one
noting "Frontend ⏳" and gaps like "form picker UI, assignee expression
evaluation, and timeout enforcement pending Frontend + E06") must include an
explicit deferred-tracking line; add a line reading "Deferred (PR `#N` follow-up)"
under each Implementation status table entry that is not complete so the pending
work is tracked, and repeat this change for the other Implementation status
callouts referenced in the comment (the similar tables at the other sections).
Ensure you place the exact text "Deferred (PR `#N` follow-up)" beneath the callout
so it follows the project guideline.

Comment on lines +43 to 55
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** input variable prompt dialog and `POST /workflows/{id}/executions` endpoint pending API + E06.
> **Decisions:** trigger config (input variable definitions) stored as JSONB in `triggers` column; domain guards against duplicate trigger type per workflow (AddTrigger returns Conflict on second call for same type). `TriggerConfig` is a value object (no `id`, owned by `WorkflowDefinition`).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Implementation status sections are missing the mandatory deferred tracking line.

Each callout includes pending gaps but omits Deferred (PR #N follow-up). Add that line in every deferred status block.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 83-94, 122-133, 162-173

🧰 Tools
🪛 LanguageTool

[grammar] ~43-~43: Ensure spelling is correct
Context: ...ic; covered in E07. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F04-triggers.md` around lines 43 -
55, The "Implementation status" callouts in the F04-triggers doc mark some
layers as deferred/⏳ but omit the required deferred tracking line; update each
"Implementation status" callout block (the ones showing
Domain/Application/Infrastructure/API/Frontend statuses) to include a line
"Deferred (PR `#N` follow-up)" for any layer not completed (⏳), ensuring every
deferred status block contains that exact tracking line; apply this change to
the three other callouts referenced (the blocks around lines 83-94, 122-133,
162-173) so no incomplete work is silently marked as ✅.

Comment on lines +42 to 54
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** canvas branch label rendering pending Frontend; branch evaluation at execution time pending E06.
> **Decisions:** cycle detection implemented in domain (DFS reachability check in AddTransition). `Transition` is a value object (only `fromStepId`, `toStepId`, `condition` — no identity or ordering fields).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Please add explicit deferred follow-up lines in all status callouts.

Pending items are noted, but the required Deferred (PR #N follow-up) line is missing in each Implementation status callout.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 81-92, 116-127

🧰 Tools
🪛 LanguageTool

[grammar] ~42-~42: Ensure spelling is correct
Context: ...are blocked in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F05-branching.md` around lines 42 -
54, The implementation status callout currently marks incomplete work without an
explicit deferred-followup note; update the Implementation status table(s) in
this document (the main "Implementation status" callout and the other similar
callouts referenced later) so that any layer not finished (e.g., Frontend ⏳ and
any other non-✅ entries) includes a line reading "Deferred (PR `#N` follow-up)";
ensure you add that deferred line for each deferred layer rather than leaving it
silently incomplete and keep the existing status symbols and text intact.

Comment on lines +44 to 55
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** canvas container node rendering and step nesting UI pending Frontend; parallel group represented via step config in existing JSONB storage. `ParallelGroup` and `JoinType` are Phase 2 — shown as planned (dashed) in diagram.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Status callouts need the mandated deferred annotation.

For each pending implementation gap, add Deferred (PR #N follow-up) in the callout; it is currently missing in all three sections.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 81-92, 115-126

🧰 Tools
🪛 LanguageTool

[grammar] ~44-~44: Ensure spelling is correct
Context: ...time) — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F06-parallel-execution.md` around
lines 44 - 55, Update the "Implementation status" callouts to explicitly
annotate any pending/incomplete work with the mandated deferred note: add a line
"Deferred (PR `#N` follow-up)" inside each callout that currently lists gaps
(e.g., the callout around "canvas container node rendering and step nesting UI
pending Frontend" and the other callouts referenced at 81-92 and 115-126), and
ensure no incomplete item is marked with a definitive ✅; replace or augment any
ambiguous status entries so the callout contains the exact deferred annotation.

Comment on lines +42 to 54
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** broken-reference `"broken": true` flag pending E03/E05 integration; export notice and broken-reference warning UI pending Frontend.
> **Decisions:** credential scrubbing in `ExportWorkflowHandler` — keys matching token/api_key/apikey/secret/password/authorization/auth_token/hmac_secret/client_secret/private_key/bearer/access_token/refresh_token replaced with `[REDACTED]` (OrdinalIgnoreCase).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add Deferred (PR #N follow-up) to each deferred implementation status block.

All three callouts indicate unfinished work but omit the required deferred follow-up line.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 83-94, 117-128

🧰 Tools
🪛 LanguageTool

[grammar] ~42-~42: Ensure spelling is correct
Context: ...BPMN) — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E04-workflow-builder/features/F07-import-export.md` around lines
42 - 54, The "Implementation status" callout blocks that list Layer|Status (the
tables showing Domain/Application/Infrastructure/API/Frontend and the related
callouts) are missing the required deferred follow-up tag; for each callout that
currently shows unfinished work (e.g., the Frontend ⏳ or other deferred notes in
the same callout), append a line "Deferred (PR `#N` follow-up)" immediately under
the callout text so each deferred implementation status includes that exact
follow-up marker; apply the same change to the other two matching callouts in
this document (the blocks around the other "Implementation status" callouts).

Comment on lines +100 to +114
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ⚠️ |
> | API | ⏳ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:**
> - AC "concurrent delivery: second detects Running and exits" — spec wording updated in decision below; concurrent-duplicate protection is implemented via `UseXminAsConcurrencyToken()` on `execution_steps` rows. The second concurrent writer receives a `DbUpdateConcurrencyException` (translated to `ConcurrencyException`), logs, and exits gracefully. The "Running guard" approach was deliberately rejected — see Decisions.
> - Engine-level 5-minute step timeout not yet implemented (E06 F03 scope).
> - `IScriptExecutor` and `INotificationSender` are stubs returning empty/success; real JS sandbox engine and email/webhook dispatch are deferred.
> Decisions: `ExecutionStep.IsTerminal` covers Completed/Failed/Cancelled. `Skipped` is a pre-start terminal state set by the Condition handler for rejected branches. `StepType` is an enum (Start, End, Form, HttpRequest, Condition, Script, Notification). `WorkflowSnapshot` is a local read model populated from `WorkflowPublished` domain events — WorkflowEngine never queries WorkflowBuilder's DB. Concurrent-duplicate protection uses PostgreSQL `xmin` system column (`UseXminAsConcurrencyToken()` on the owned `execution_steps` table) — no migration required. All step handlers and `StepCompletedHandler`/`StepFailedHandler` catch `ConcurrencyException` from `IUnitOfWork.SaveChangesAsync` and exit gracefully, letting the winning instance complete the step. The Running guard (`if step.Status == Running → skip`) was rejected because `ExecuteNextStepHandler` always starts a step (→ Running) before dispatching; a Running guard would block all normal first-delivery executions.
> **Decisions:** `ExecutionStep.IsTerminal` covers Completed/Failed/Cancelled. `Skipped` is a pre-start terminal state set by the Condition handler for rejected branches. `StepType` is an enum (Start, End, Form, HttpRequest, Condition, Script, Notification). `WorkflowSnapshot` is a local read model populated from `WorkflowPublished` domain events — WorkflowEngine never queries WorkflowBuilder's DB. Concurrent-duplicate protection uses PostgreSQL `xmin` system column (`UseXminAsConcurrencyToken()` on the owned `execution_steps` table) — no migration required. All step handlers and `StepCompletedHandler`/`StepFailedHandler` catch `ConcurrencyException` from `IUnitOfWork.SaveChangesAsync` and exit gracefully, letting the winning instance complete the step. The Running guard (`if step.Status == Running → skip`) was rejected because `ExecuteNextStepHandler` always starts a step (→ Running) before dispatching; a Running guard would block all normal first-delivery executions.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add the required deferred follow-up line to this status callout.

This block lists deferred work but does not include Deferred (PR #N follow-up). Please add it explicitly under the status/gaps content.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

🧰 Tools
🪛 LanguageTool

[grammar] ~100-~100: Ensure spelling is correct
Context: ...users — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E06-workflow-engine/features/F02-step-handlers.md` around lines
100 - 114, Update the "Implementation status" callout block to explicitly list
the deferred follow-up by adding a line like "Deferred (PR `#N` follow-up)" under
the status/gaps content (near the other bullet points about gaps vs spec), so
the callout that begins with "**Implementation status**" and the subsequent
"**Gaps vs spec:**" section includes a clear Deferred entry indicating which PR
will follow up on the unfinished work.

Comment on lines +44 to 55
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ⚠️ |
> | Infrastructure | ✅ |
> | API | ⏳ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** no Application-layer notification dispatch handler; `ExecutionFailed` domain event raised but notification channels not wired; email/in-app/webhook dispatch and rate-limiting pending Application layer + a future cross-cutting notification service (outside WorkflowEngine Infrastructure, which is complete).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Track deferred scope explicitly with Deferred (PR #N follow-up) lines.

All three callouts defer implementation but omit the required deferred-follow-up line. Please add a Deferred (PR #N follow-up): ... entry in each one.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 81-92, 118-129

🧰 Tools
🪛 LanguageTool

[grammar] ~44-~44: Ensure spelling is correct
Context: ...tions — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E06-workflow-engine/features/F03-error-handling.md` around lines
44 - 55, In the "Implementation status" callout and the two other deferred
callouts that omit follow-ups, add explicit follow-up lines using the exact
format "Deferred (PR `#N` follow-up): <brief next-step>" so each deferred item
(e.g., the Application-layer notification dispatch handler, wiring
ExecutionFailed event to channels, and pending email/in-app/webhook dispatch +
rate-limiting work) documents the PR number and next action; locate the three
callouts by the "Implementation status" table and the two other deferred
callouts in this feature doc and append a "Deferred (PR `#N` follow-up): ..." line
to each deferred entry.

Comment on lines +45 to 57
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** `GET /api/executions` and per-workflow paged list ✅. Filter UI, date/trigger query params, and running-first sort pending API + Frontend.
> **Decisions:** `GetExecutionsByWorkflowHandler` and `GetAllExecutionsHandler` use `IExecutionRepository.GetPagedByWorkflowAsync`/`GetPagedAsync` — server-side pagination with `pageSize` clamped to 100. Status filter forwarded to repository. Date range filter and trigger type filter deferred to API layer query parameters.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add deferred follow-up entries to each Implementation status section.

These callouts include pending work but don’t add the mandated Deferred (PR #N follow-up) line. Please add it for each deferred block.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 83-94, 118-129

🧰 Tools
🪛 LanguageTool

[grammar] ~45-~45: Ensure spelling is correct
Context: ...ends) — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E06-workflow-engine/features/F04-execution-history.md` around
lines 45 - 57, Update each "Implementation status" callout that lists deferred
work to include a "Deferred (PR `#N` follow-up)" line; specifically add this to
the callout that mentions Filter UI, date/trigger query params, and
running-first sort pending API + Frontend (the block that references
GetExecutionsByWorkflowHandler and GetAllExecutionsHandler using
IExecutionRepository.GetPagedByWorkflowAsync/GetPagedAsync), and likewise add
the same deferred line to the other two implementation-status callouts
referenced in the comment (around the blocks at lines 83-94 and 118-129) so no
incomplete work is marked as ✅ without a follow-up PR reference.

Comment on lines +47 to 59
> **Implementation status**
>
> | Layer | Status |
> |-------|--------|
> | Domain | ✅ |
> | Application | ✅ |
> | Infrastructure | ✅ |
> | API | ✅ |
> | Frontend | ⏳ |
>
> **Gaps vs spec:** `POST /api/executions/{id}/retry` and retry-with-context ✅. Retry UI and archived-definition warning pending Frontend.
> **Decisions:** `CreateRetry()` produces a new `WorkflowExecution` with `RetryOfExecutionId` set; context is copied from original at time of retry.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Include Deferred (PR #N follow-up) for deferred items in all three status callouts.

Each section marks work as pending but omits the required deferred follow-up line. Please add explicit deferred tracking entries to these callouts.

As per coding guidelines, "Add a Deferred (PR #N follow-up) line in the implementation status callout when deferring work; never silently mark incomplete work as ✅".

Also applies to: 84-95, 121-133

🧰 Tools
🪛 LanguageTool

[grammar] ~47-~47: Ensure spelling is correct
Context: ...tion) — not in MVP. > Implementation status > > | Layer | Status | > |-------|--------|...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E06-workflow-engine/features/F05-manual-retry.md` around lines 47
- 59, Update each "Implementation status" callout that contains any incomplete
work to include a deferred follow-up note: add the exact line "Deferred (PR `#N`
follow-up)" beneath the status table for the callout shown (the callout starting
with "**Implementation status**" and its status table), and do the same for the
two other matching callouts later in the document (the other "**Implementation
status**" sections referenced). Ensure the deferred line appears whenever a
non-✅ item or pending work is present (e.g., Frontend ⏳, archived-definition
warning), keeping the table and surrounding wording unchanged except for
inserting the Deferred (PR `#N` follow-up) line.

Comment thread scripts/normalize-feature-docs.py
Co-authored-by: Phuong Nguyen <phuongnse@users.noreply.github.com>

@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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/epics/E03-data-modeling/features/F01-model-definition.md`:
- Line 168: Replace the literal placeholder "PR `#N`" in the deferred note with a
concrete tracking reference: either the actual follow-up PR number (e.g., "PR
`#1234`") if that PR exists or a tracking issue ID (e.g., "ISSUE-567") if the work
will be created later; update the sentence mentioning ModelDeletedHandler and
WorkflowBuilder `record.*` trigger so it reads e.g. "Deferred (follow-up: PR
`#1234`)" or "Deferred (tracking: ISSUE-567)" to make the follow-up unambiguous
and searchable.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 49881429-0c61-4a41-910e-fa9de25238ca

📥 Commits

Reviewing files that changed from the base of the PR and between a238bae and d122bd6.

📒 Files selected for processing (6)
  • docs/epics/E01-platform-foundation/features/F01-tenant-registration.md
  • docs/epics/E01-platform-foundation/features/F02-organization-management.md
  • docs/epics/E01-platform-foundation/features/F04-subscription-plans.md
  • docs/epics/E03-data-modeling/features/F01-model-definition.md
  • docs/epics/README.md
  • scripts/normalize-feature-docs.py
✅ Files skipped from review due to trivial changes (3)
  • docs/epics/E01-platform-foundation/features/F04-subscription-plans.md
  • docs/epics/E01-platform-foundation/features/F02-organization-management.md
  • docs/epics/E01-platform-foundation/features/F01-tenant-registration.md

> | Frontend | ⏳ |
>
> **Gaps vs spec:** workflow reference check pending E04; form Relation Picker refs blocked/flagged via FormBuilder `ModelDeletedEvent` consumer (US-033 partial); 30-day purge background job pending.
> **Deferred (PR #N follow-up):** DataModeling relation fields on other models flagged broken when target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped via `ModelDeletedHandler` (Kafka).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Replace placeholder "PR #N" with actual future PR number or tracking mechanism.

The deferred work notation uses a literal "PR #N" placeholder instead of a concrete reference. This makes it unclear how to track when this work will be completed. As per coding guidelines, when deferring work, you should reference a specific follow-up PR number or create a tracking issue.

📝 Suggested approaches

Option 1: If the follow-up PR doesn't exist yet, create a tracking issue:

-> **Deferred (PR `#N` follow-up):** DataModeling relation fields...
+> **Deferred (Issue `#NNN` follow-up):** DataModeling relation fields...

Option 2: If you plan to address this in a known upcoming PR, reference it:

-> **Deferred (PR `#N` follow-up):** DataModeling relation fields...
+> **Deferred (PR `#130` follow-up):** DataModeling relation fields...
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
> **Deferred (PR #N follow-up):** DataModeling relation fields on other models flagged broken when target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped via `ModelDeletedHandler` (Kafka).
> **Deferred (Issue `#NNN` follow-up):** DataModeling relation fields on other models flagged broken when target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped via `ModelDeletedHandler` (Kafka).
Suggested change
> **Deferred (PR #N follow-up):** DataModeling relation fields on other models flagged broken when target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped via `ModelDeletedHandler` (Kafka).
> **Deferred (PR `#130` follow-up):** DataModeling relation fields on other models flagged broken when target model deleted. WorkflowBuilder `record.*` trigger broken flags shipped via `ModelDeletedHandler` (Kafka).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/epics/E03-data-modeling/features/F01-model-definition.md` at line 168,
Replace the literal placeholder "PR `#N`" in the deferred note with a concrete
tracking reference: either the actual follow-up PR number (e.g., "PR `#1234`") if
that PR exists or a tracking issue ID (e.g., "ISSUE-567") if the work will be
created later; update the sentence mentioning ModelDeletedHandler and
WorkflowBuilder `record.*` trigger so it reads e.g. "Deferred (follow-up: PR
`#1234`)" or "Deferred (tracking: ISSUE-567)" to make the follow-up unambiguous
and searchable.

@phuongnse phuongnse merged commit 1de8470 into main May 26, 2026
8 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.

2 participants