dist/workflows/skills/report/SKILL.md
Story writing, PR creation, and release readiness assessment for branch reporting.
npx skillsauth add qmu/workaholic reportInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guidelines for generating branch stories, creating pull requests, and assessing release readiness.
This skill works on any Agent-Skills-compatible agent. The two Claude-Code mechanisms used below are enhancements, not requirements:
general-purpose subagents to run parts concurrently (the carry-over judge, the overview/section-review/release-readiness workers, the PR and release-note writers), that is the Claude Code optimization. On other agents, perform those parts sequentially in the same session; the inputs and outputs are identical.AskUserQuestion, use the agent's native way of presenting a multiple-choice question (or ask in plain chat). The decision points are mandatory; only the prompt mechanism varies.Context-aware report orchestration. Auto-detects whether the caller is in a drive or trip workflow and routes accordingly.
bash branching/scripts/check-workspace.sh
Parse the JSON output. If clean is true, proceed silently to Step 1.
If clean is false, display the summary to the user and ask via AskUserQuestion with selectable options:
If the user selects "Stop", end the command immediately.
bash branching/scripts/detect-context.sh
Parse the JSON output. Route to the appropriate workflow based on context.
context: "work")Route by mode from detect-context output:
mode: "drive")bash branching/scripts/check-version-bump.sh; if already_bumped is true, skip this step).## Write Story → ### Orchestration, Phases 0–6) directly in this command (main-agent) context. The command itself spawns the leaf general-purpose subagents — there is no intermediate story-writer subagent..workaholic/stories/<branch-name>.md and output the entire Markdown content so the developer can review inline.mode: "trip")bash branching/scripts/check-version-bump.sh; if already_bumped is true, skip this step).## Write Story → ### Orchestration, Phases 0–6) directly in this command (main-agent) context. The command itself spawns the leaf general-purpose subagents — there is no intermediate story-writer subagent..workaholic/stories/<branch-name>.md and output the entire Markdown content so the developer can review inline.mode: "hybrid")Both trip artifacts and drive-style tickets exist on this branch. Drive Mode and Trip Mode run the identical Write Story orchestration, so follow Drive Mode. The orchestration captures the full narrative including any trip origin.
context: "worktree")Not on a work branch, but worktrees exist.
bash branching/scripts/list-worktrees.shhas_pr is false (unreported work)context: "unknown")Ask the user: "Could not determine development context from branch '<branch>'. Are you working on a drive or trip?" using AskUserQuestion with options "Drive" and "Trip". Route accordingly.
Generate a branch story that serves as the single source of truth for PR content.
Generate the story file, then create the PR and release note. The /report command (main agent) runs this orchestration directly: it executes the bash/Read/Write steps inline and spawns each leaf worker as a subagent_type: "general-purpose" Task whose prompt preloads a core skill and runs one section. There is no intermediate subagent — the command does all fan-out, so the fan-out stays one level deep (a subagent cannot spawn further subagents).
Gather all context by running bash gather/scripts/git-context.sh. Returns: branch, base_branch, repo_url, archived_tickets, git_log.
Run before the parallel agent batch so the verdicts flow into section-reviewer's input. Skip silently if .workaholic/concerns/ is empty or absent.
Spawn a carry-over judge as subagent_type: "general-purpose" (model: "opus") in a single Task call. The prompt instructs it to preload report, follow the ### Judge Carry-Overs section with the given branch name and base branch, and return {verdicts: [...]}.
Apply verdicts: Write the returned verdicts array to /tmp/carryover-verdicts.json, then run:
cat /tmp/carryover-verdicts.json | bash report/scripts/apply-carryover-verdicts.sh
Files marked resolved have status: flipped to resolved, resolved_by_pr / resolved_by_commit recorded, and are then moved to .workaholic/concerns/archive/. Files marked still_active stay in .workaholic/concerns/.
Spawn 3 subagent_type: "general-purpose" leaf subagents in parallel (single message with 3 Task calls). Each prompt names the skill to preload, the section to run, the inputs, and the expected return schema:
model: "opus"): preload report, run ## Assess Release Readiness, return the releasability JSON. Pass archived tickets list and branch name.model: "haiku"): preload report, run ### Overview Generation, return the overview JSON. Pass branch name and base branch.model: "haiku"): preload review-sections, run it, return the sections 4-7 JSON (Outcome, Historical Analysis, Concerns, Successful Development Patterns). Pass branch name, archived tickets list, and the carryover verdicts file path /tmp/carryover-verdicts.json. The section-reviewer prepends still_active verdicts to section 6.Wait for all 3 to complete. Track which succeeded and which failed.
.workaholic/tickets/archive/<branch-name>/*.md. Extract frontmatter (commit_hash, category) and content (Overview, Final Report)..workaholic/stories/README.md.git add .workaholic/stories/ .workaholic/concerns/git commit -m "Add branch story for <branch-name>" (the same commit captures any carry-over archive moves from Phase 1, keeping audit history coherent)git push -u origin <branch-name>Spawn sequentially (PR first so its URL flows into the release note):
subagent_type: "general-purpose" (model: "opus") preloading report and running ## Create PR. It reads the story file, derives the title, and runs the gh CLI operations. Capture the PR created/updated: <URL> line from its response.subagent_type: "general-purpose" (model: "haiku") preloading write-release-note and running it end-to-end. Pass the PR URL obtained in step 1. It reads the story file, generates concise release notes, and writes .workaholic/release-notes/<branch-name>.md.Capture the PR URL from step 1 for final output.
git add .workaholic/release-notes/git commit -m "Add release notes for <branch-name>"git pushOnce orchestration completes, the report is described by:
{
"story_file": ".workaholic/stories/<branch-name>.md",
"release_note_file": ".workaholic/release-notes/<branch-name>.md",
"pr_url": "<PR-URL>",
"workers": {
"overview_writer": { "status": "success" | "failed", "error": "..." },
"section_reviewer": { "status": "success" | "failed", "error": "..." },
"release_readiness": { "status": "success" | "failed", "error": "..." },
"release_note_writer": { "status": "success" | "failed", "error": "..." },
"pr_creator": { "status": "success" | "failed", "error": "..." }
}
}
Story sections are populated from the parallel leaf subagents' outputs (each is a general-purpose subagent running the named role):
| Worker role | Sections | Fields |
| ----------- | -------- | ------ |
| overview-writer | 1, 2, 3 (journey preamble) | overview, highlights[], motivation, journey.mermaid, journey.summary |
| section-reviewer | 4, 5, 6, 7 | outcome, historical_analysis, concerns, development_patterns |
| release-readiness | 8 | verdict, concerns[], instructions.pre_release[], instructions.post_release[] |
| release-note-writer | (separate file) | Writes to .workaholic/release-notes/<branch>.md |
Section 3 (Changes) comes from archived tickets, prefaced by journey content from the overview-writer role. Section 9 (Notes) is optional context.
Run by the Phase 1 carry-over judge (a general-purpose subagent that preloads this skill). Inputs: branch name and base branch (usually main).
List active carry-overs:
bash report/scripts/list-active-carryovers.sh
If the JSON output is [], return {"verdicts": []} and stop.
For each carry-over in the list, judge whether the work that landed on the current branch (since the carry-over's origin_commit) has resolved it.
Available evidence:
git log --oneline <origin_commit>..HEAD to see commits that landed after the carry-over was filedgit diff <origin_commit>..HEAD -- <file mentioned in body> to inspect changes to referenced filesin)git log --oneline --grep='<keyword>' <origin_commit>..HEAD)Heuristics for resolved:
Heuristics for still_active:
origin_commit.When in doubt, prefer still_active — false positives (marking resolved when it isn't) lose institutional memory; false negatives (keeping active when it's done) merely re-surface in the next story.
The corpus can grow large (a backfill from N historical stories produces O(N × items-per-story) items). To stay within reasonable tool-use budgets:
origin_branch first. Items from the same branch tend to reference the same files — cluster them so you can inspect each file once per cluster, not once per item.cat plus one git log -- <path> is enough evidence for every bullet that points at that path.git log --oneline <origin_commit>..HEAD once per cluster, not per item — the commit list is the same for every bullet that shares an origin commit.{verdicts: [...]} JSON object.backfill-carryover.sh, expect a high proportion of resolved verdicts — the items predate the codebase's current structure significantly. This is normal; still-active items remain in .workaholic/concerns/ as passive notes for future judging.Return a JSON object with the verdicts array:
{
"verdicts": [
{
"path": ".workaholic/concerns/42-foo.md",
"verdict": "resolved",
"resolved_by_pr": 47,
"resolved_by_commit": "abc1234",
"rationale": "Commit abc1234 removed the inline shell logic this concern flagged."
},
{
"path": ".workaholic/concerns/42-bar.md",
"verdict": "still_active",
"rationale": "No commits modified the area this carry-over targets."
}
]
}
Include resolved_by_pr and resolved_by_commit only for resolved verdicts. The orchestrator feeds this to apply-carryover-verdicts.sh (Phase 1) and to the section-reviewer worker so still-active items appear in the new story.
Generate the four fields consumed by sections 1, 2, and 3 (overview, highlights, motivation, journey) by analyzing commit history for the branch. The overview-writer role (a general-purpose subagent) runs this generation in parallel with the release-readiness and section-reviewer roles.
Run the bundled script to collect commit information:
bash report/scripts/collect-commits.sh [base-branch]
Default base branch is main.
{
"commits": [
{
"hash": "abc1234",
"subject": "Add feature X",
"body": "Detailed description of the change...",
"timestamp": "2026-01-15T10:30:00+09:00"
}
],
"count": 15,
"base_branch": "main"
}
Generate JSON with four components:
A 2-3 sentence summary capturing the branch essence: main goal, approach taken, what was achieved. Past tense; synthesize from commit subjects.
Array of 3-5 meaningful changes: extracted from commit subjects, related commits grouped into single highlights, focused on user-visible or architecturally significant changes, ordered by importance not chronology.
A paragraph synthesizing the "why": what problem or opportunity started this work, why this approach was chosen, what constraints shaped it. Narrative prose, not a list.
Two parts:
flowchart LR
subgraph Phase1[Initial Setup]
direction TB
a1[First step] --> a2[Second step]
end
subgraph Phase2[Core Work]
direction TB
b1[Third step] --> b2[Fourth step]
end
Phase1 --> Phase2
flowchart LR for horizontal timelinedirection TB inside each subgraph for vertical flowReturn JSON:
{
"overview": "2-3 sentence summary capturing the branch essence",
"highlights": [
"First meaningful change",
"Second meaningful change",
"Third meaningful change"
],
"motivation": "Paragraph synthesizing the 'why' from commit context",
"journey": {
"mermaid": "flowchart LR\n subgraph Phase1[Initial Work]\n direction TB\n a1[Step 1] --> a2[Step 2]\n end\n ...",
"summary": "50-100 word summary of the development journey"
}
}
The story content (this IS the PR description):
## 1. Overview
[Content from overview-writer `overview` field: 2-3 sentence summary capturing the branch essence.]
**Highlights:**
1. [From overview-writer `highlights[0]}]
2. [From overview-writer `highlights[1]`]
3. [From overview-writer `highlights[2]`]
## 2. Motivation
[Content from overview-writer `motivation` field: paragraph synthesizing the "why" from commit context.]
## 3. Changes
[Content from overview-writer `journey.mermaid` for the flowchart and `journey.summary` for the prose below it.]
```mermaid
[Content from overview-writer `journey.mermaid`]
[Content from overview-writer journey.summary]
Flowchart Guidelines:
flowchart LR for horizontal timeline (subgraphs arranged left-to-right)direction TB inside each subgraph for vertical item flowid[Description] syntaxOne subsection per ticket, in chronological order:
<1-3 sentence summary of what this ticket changed and why. Focus on the intent and scope of the change rather than enumerating individual files.>
<1-3 sentence summary of what this ticket changed and why.>
Changes Guidelines:
(abc1234) or (<hash>)([abc1234](<repo-url>/commit/abc1234))### 3-N. <Title> ([hash](<repo-url>/commit/<hash>))[Summarize what was accomplished. Reference key tickets for details.]
[Context from related past work. What similar problems were solved before? What patterns emerge from the Related History sections of tickets? If no related tickets exist, write "No related historical context."]
[Risks, trade-offs, limitations, and forward-looking suggestions discovered during implementation. Each concern is one insight framed as a title, a description of the problem, and how to fix it. This structure is parsed verbatim by extract-carryover.sh on /ship, so follow it exactly.]
Format (one ### block per concern, or "None"):
### <Concise title>
- **Severity:** moderate
- **Description:** <what the problem/risk is> (see [hash](<repo-url>/commit/<hash>) in path/to/file.ext)
- **How to Fix:** <the concrete fix or improvement>
Example:
### Inline shell invocations in drive
- **Severity:** moderate
- **Description:** `drive` still calls `ls -1` inline, violating the Shell Script Principle (see [7eab801](<repo-url>/commit/7eab801) in `plugins/core/skills/drive/SKILL.md`)
- **How to Fix:** Extract the inline invocations into dedicated navigator scripts under the drive skill's `scripts/` directory
Guidelines:
urgent (act now), moderate (should fix), or low (nice-to-have). Default moderate.still_active verdicts) are prepended here as ### blocks, with their title prefixed (carried from PR #N) and their original severity preserved.[Effective patterns discovered during this branch's development that are worth preserving as institutional knowledge.]
Format: Bullet list with pattern description and context.
Example:
Guidelines:
Verdict: [Ready for release / Needs attention before release]
**Release-readiness input:**
The release-readiness JSON is produced by the release-readiness role — a `general-purpose` subagent the command spawns in parallel during Phase 2. The JSON contains:
```json
{
"releasable": true/false,
"verdict": "Ready for release" / "Needs attention before release",
"concerns": [],
"instructions": {
"pre_release": [],
"post_release": []
}
}
Format this JSON into section 8.
## 9. Notes
Additional context for reviewers or future reference.
Create .workaholic/stories/<branch-name>.md with YAML frontmatter:
---
branch: <branch-name>
tickets_completed: <count of tickets>
---
Update .workaholic/stories/README.md to include the new story:
- [<branch-name>.md](<branch-name>.md) - Brief description of the branch workCreate or update a GitHub pull request using the story file as PR content.
Extract the first item from the Summary section of the story file:
## 1. Summary
1. First meaningful change
Use that first item as the title. If multiple items exist, append "etc" (e.g., "Add dark mode toggle etc").
Run the bundled script:
bash report/scripts/create-or-update.sh <branch-name> "<title>"
strip-frontmatter.sh from .workaholic/stories/<branch-name>.md/tmp/pr-body.mdA reusable script for removing YAML frontmatter from any markdown file:
bash report/scripts/strip-frontmatter.sh <file>
Outputs clean markdown body to stdout. Handles files with frontmatter, without frontmatter (pass-through), and empty files. Only strips frontmatter starting on line 1 -- content --- separators elsewhere are preserved.
Exactly one line:
PR created: <URL>
or
PR updated: <URL>
This output format is required by the story command.
Analyze a branch to determine if it's ready for release.
Review code changes: Check git diff main..HEAD for:
Check for blocking issues:
Identify actionable items (not theoretical concerns):
Return JSON:
{
"releasable": true,
"verdict": "Ready for release",
"concerns": [],
"instructions": {
"pre_release": [],
"post_release": []
}
}
Or if issues found:
{
"releasable": false,
"verdict": "Needs attention before release",
"concerns": [
"Found TODO comment in src/foo.ts",
"Tests failing in commands/drive.md"
],
"instructions": {
"pre_release": ["Fix failing tests", "Remove TODO comments"],
"post_release": []
}
}
documentation
Release note content structure and guidelines for GitHub Releases.
testing
Ship workflow - merge PR, deploy via CLAUDE.md, and verify production.
development
Generate branch-story sections 4-7 (Outcome, Historical Analysis, Concerns, Successful Development Patterns) from archived tickets and carry-over verdicts. Used by the report workflow when assembling a PR story.
business
Implementation workflow, approval flow, final report, archive, and frontmatter update for drive sessions.