feat(standup): enforce one-paragraph-per-item engineering format#8
Merged
Conversation
Kill the grouping global paragraph — the reader must see each work item
on its own line, never "all N specs closed this period" style summaries.
- Agent: `global` becomes an optional NON-grouping summary (default empty);
the per-spec paragraphs are the standup. Forbid grouping/counting phrases
in any field. Align the status lexicon ("is in review"). One work item,
one identifier-led paragraph, following the fixed grammar:
`<ID> is <STATUS>. <functional summary>. <review>. <blocker>.`
- Command: shape-gate now allows an empty `global`, and rejects grouping
shapes (all N specs / several / this period / N specs closed…) in every
field. Report prints the per-ticket paragraphs (Slack-ready) with the
optional global only as a trailing line.
Metadata reused as-is (needsUat, assignee, needs-attention reason); no
schema, no web change. PR/merge and structured "blocked-by <ticket>"
remain out of reach without a minimal `pr` field / `blocked-by` relation
(documented, not added).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Make the Standup view read like an engineering standup: each work item is a self-standing block, never grouped. - Left accent bar per row keyed to status (data-status → status palette), so state is scannable at a glance; needs-attention gets a stronger bar plus a tinted surface. - Identifier leads the block: ticket key as a real link (monospace, accent, hover/focus states) when linked, else the slug as the primary monospace identifier; the title drops to a muted subtitle. - The summary becomes the highest-contrast element (it is the standup content); header meta (period + counts) collapses to one inline line. - Focus-visible rings on the ticket link and retry; reuses existing tokens only (no new deps); verified in light and dark. Rebuilt web/dist and re-embedded into cli/internal/webui/dist. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #7. Addresses the core complaint that the digest still grouped work items in the global paragraph ("all seven specs closed this period"), which reads as a changelog, not a standup.
Changes
globalfield is now an optional non-grouping summary (default empty). The per-spec paragraphs are the standup — one work item per identifier-led paragraph.<IDENTIFIER> is <STATUS>. <functional summary>. <review>. <blocker>.review→ "is in review").all N specs,several,this period,N specs closed…) in every field, and allows an emptyglobal.globalonly as a trailing line.Reused metadata (no schema/web change)
needsUat,assignee, needs-attentionreason(the structured blocker carrier —detect-external-blocker-in-applywrites "what is pending + who unblocks + open PR ref" there).Documented gaps (not implemented — would need minimal additions)
pr {url,state}field onSpecState.depends_on/blocked-byedge (relatedTois cause→bug). Emitted only when thereasontext carries it. Would need ablocked-byrelation.Tests
Full Go suite green (10 packages), incl. golden
--jsongate and kit↔assets drift.🤖 Generated with Claude Code