Add sprint-report workflow with structured intake prompt#69
Add sprint-report workflow with structured intake prompt#69
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds a new "Sprint Health Report" workflow: configuration, README, skill spec and references, an HTML report template, and updated JSON schema docs. The workflow collects sprint context, ingests Jira or CSV data, computes eight health dimensions and anti-patterns, and emits Markdown/HTML artifacts under Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant Agent as Agent
participant SkillEngine as Skill Engine
participant DataSource as Jira / CSV
participant TemplateEngine as Template Engine
participant Artifacts as Artifacts
User->>Agent: start workflow
Agent->>User: startupPrompt — collect sprint/project/team context
User->>Agent: provide sprint/project/team info
Agent->>SkillEngine: read & execute `SKILL.md`
SkillEngine->>DataSource: fetch sprint issues (MCP API or CSV)
DataSource-->>SkillEngine: return issues (+ optional changelog)
SkillEngine->>SkillEngine: compute metrics, detect anti-patterns, score health
SkillEngine->>TemplateEngine: load `templates/report.html` and inject data
TemplateEngine-->>SkillEngine: rendered HTML
SkillEngine->>Artifacts: write Markdown and/or HTML to `artifacts/sprint-report/`
Artifacts-->>User: report artifacts available
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@workflows/sprint-report/FIELD_REFERENCE.md`:
- Around line 348-424: The "Complete Example" JSON contains unsupported fields
(hooks, environment, settings, metadata, and other non-processed entries) that
will produce non-functional configs; edit the example to remove those
unsupported keys and retain only the supported top-level fields (e.g., keep
"name", "description", "systemPrompt", "startupPrompt", and "results") so the
example becomes a minimal working configuration—locate the block labeled
"Complete Example" and update the JSON accordingly by deleting "hooks",
"environment", "settings", "metadata" (and any other non-processed entries)
while preserving "systemPrompt"/"startupPrompt"/"results" entries as shown.
- Around line 76-345: The FIELD_REFERENCE.md optional-fields section lists
fields (version, author, repository, tags, icon, displayName, license,
dependencies, environment, hooks, settings, metadata) that the platform does not
implement; update the document to avoid misleading users by either removing
these undocumented fields or clearly annotating each as "not implemented /
reserved for future use" (preferably add a one-line note next to each field
header and a short paragraph at the top of the Optional Fields section
referencing the canonical schema and the platform's implemented list: name,
description, systemPrompt, startupPrompt, results); ensure the wording mentions
the canonical schema behavior "Extra fields are ignored" and keep the results
field documentation unchanged.
In `@workflows/sprint-report/README.md`:
- Line 420: Update the "**Last Updated**: 2025-11-13" line in the README to the
actual modification date for this change (e.g., the PR date or today's date) so
the header reflects the current state; locate the literal "**Last Updated**:
2025-11-13" string and replace the date portion with the correct ISO date.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: b06bb2df-be35-4579-bd68-be2d62db3a4b
📒 Files selected for processing (12)
workflows/sprint-report/.ambient/ambient.jsonworkflows/sprint-report/.claude/agents/example-architect.mdworkflows/sprint-report/.claude/agents/example-engineer.mdworkflows/sprint-report/.claude/agents/example-product-manager.mdworkflows/sprint-report/.claude/commands/analyze.mdworkflows/sprint-report/.claude/commands/execute.mdworkflows/sprint-report/.claude/commands/init.mdworkflows/sprint-report/.claude/commands/plan.mdworkflows/sprint-report/.claude/commands/verify.mdworkflows/sprint-report/FIELD_REFERENCE.mdworkflows/sprint-report/README.mdworkflows/sprint-report/SPRINT ANALYZER.md
| ## Optional Fields | ||
|
|
||
| ### `results` (object) | ||
| **Output artifacts and their locations** | ||
|
|
||
| - Maps artifact names to file paths/glob patterns | ||
| - Helps users locate generated files | ||
| - Supports glob patterns (*, **) | ||
|
|
||
| **Structure:** | ||
| ```json | ||
| "results": { | ||
| "Artifact Name": "path/to/files/**/*.md", | ||
| "Another Artifact": "path/to/file.json" | ||
| } | ||
| ``` | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "results": { | ||
| "Feature Specification": "artifacts/specs/**/spec.md", | ||
| "Implementation Plan": "artifacts/specs/**/plan.md", | ||
| "Task Breakdown": "artifacts/specs/**/tasks.md", | ||
| "Test Results": "artifacts/test-results/**/*.xml" | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `version` (string) | ||
| **Semantic version of the workflow** | ||
|
|
||
| - Useful for tracking changes | ||
| - Follows semver format (MAJOR.MINOR.PATCH) | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "version": "1.2.3" | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `author` (string or object) | ||
| **Workflow author information** | ||
|
|
||
| **String format:** | ||
| ```json | ||
| "author": "Your Name" | ||
| ``` | ||
|
|
||
| **Object format:** | ||
| ```json | ||
| "author": { | ||
| "name": "Your Name", | ||
| "email": "you@example.com", | ||
| "organization": "Your Company" | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `repository` (string or object) | ||
| **Source repository for the workflow** | ||
|
|
||
| **String format:** | ||
| ```json | ||
| "repository": "https://github.com/org/workflow-repo" | ||
| ``` | ||
|
|
||
| **Object format:** | ||
| ```json | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/org/workflow-repo", | ||
| "branch": "main" | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `tags` (array of strings) | ||
| **Keywords or categories** | ||
|
|
||
| - Used for discovery and filtering | ||
| - Helps users find relevant workflows | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "tags": ["feature-development", "planning", "implementation"] | ||
| ``` | ||
|
|
||
| **Common tags:** | ||
| - `feature-development` | ||
| - `bug-fix` | ||
| - `code-review` | ||
| - `refactoring` | ||
| - `testing` | ||
| - `documentation` | ||
| - `deployment` | ||
| - `migration` | ||
|
|
||
| --- | ||
|
|
||
| ### `icon` (string) | ||
| **Emoji or icon identifier** | ||
|
|
||
| - Displayed in UI alongside workflow name | ||
| - Use single emoji | ||
|
|
||
| **Examples:** | ||
| ```json | ||
| "icon": "🔧" | ||
| "icon": "🐛" | ||
| "icon": "📝" | ||
| "icon": "🚀" | ||
| ``` | ||
|
|
||
| **Common icons:** | ||
| - 🔧 - Tools/Configuration | ||
| - 🐛 - Bug Fix | ||
| - 📝 - Documentation | ||
| - 🚀 - Deployment | ||
| - ⚡ - Performance | ||
| - 🔒 - Security | ||
| - 🎨 - Design/UI | ||
| - 🧪 - Testing | ||
|
|
||
| --- | ||
|
|
||
| ### `displayName` (string) | ||
| **Alternative display name** | ||
|
|
||
| - Can include emojis or special formatting | ||
| - Used instead of `name` if provided | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "displayName": "📋 Template Workflow" | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `license` (string) | ||
| **License type** | ||
|
|
||
| - Indicates how the workflow can be used | ||
| - Use standard SPDX license identifiers | ||
|
|
||
| **Examples:** | ||
| ```json | ||
| "license": "MIT" | ||
| "license": "Apache-2.0" | ||
| "license": "GPL-3.0" | ||
| "license": "Proprietary" | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `dependencies` (object or array) | ||
| **Required tools, libraries, or workflows** | ||
|
|
||
| **Object format (version constraints):** | ||
| ```json | ||
| "dependencies": { | ||
| "git": ">=2.0.0", | ||
| "node": ">=18.0.0", | ||
| "python": ">=3.9" | ||
| } | ||
| ``` | ||
|
|
||
| **Array format (simple list):** | ||
| ```json | ||
| "dependencies": ["git", "docker", "kubectl"] | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `environment` (object) | ||
| **Environment variables or configuration values** | ||
|
|
||
| - Default values for environment variables | ||
| - Configuration used by workflow scripts | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "environment": { | ||
| "ARTIFACTS_DIR": "artifacts", | ||
| "DEFAULT_BRANCH": "main", | ||
| "LOG_LEVEL": "info", | ||
| "MAX_RETRIES": "3" | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `hooks` (object) | ||
| **Lifecycle hooks** | ||
|
|
||
| - Scripts executed at specific workflow points | ||
| - Each value is a path to a script | ||
|
|
||
| **Available hooks:** | ||
| - `pre-init` - Before initialization | ||
| - `post-init` - After initialization | ||
| - `pre-execute` - Before execution | ||
| - `post-execute` - After execution | ||
| - `on-error` - On error/failure | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "hooks": { | ||
| "pre-init": "./scripts/hooks/pre-init.sh", | ||
| "post-init": "./scripts/hooks/post-init.sh", | ||
| "pre-execute": "./scripts/hooks/validate.sh", | ||
| "post-execute": "./scripts/hooks/cleanup.sh", | ||
| "on-error": "./scripts/hooks/on-error.sh" | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `settings` (object) | ||
| **Workflow-specific settings** | ||
|
|
||
| - Custom configuration for your workflow | ||
| - Can include any workflow-specific options | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "settings": { | ||
| "autoSave": true, | ||
| "verboseLogging": false, | ||
| "createBackups": true, | ||
| "templateDirectory": "./templates", | ||
| "scriptDirectory": "./scripts", | ||
| "maxConcurrentTasks": 5, | ||
| "timeoutMinutes": 30 | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### `metadata` (object) | ||
| **Arbitrary metadata** | ||
|
|
||
| - Custom data for tracking or analytics | ||
| - Freeform structure | ||
|
|
||
| **Example:** | ||
| ```json | ||
| "metadata": { | ||
| "created": "2025-01-15", | ||
| "lastUpdated": "2025-11-13", | ||
| "category": "development", | ||
| "maturity": "stable", | ||
| "estimatedDuration": "30-60 minutes", | ||
| "complexity": "intermediate", | ||
| "maintainer": "Platform Team" | ||
| } | ||
| ``` | ||
|
|
||
| **Common metadata fields:** | ||
| - `created` - Creation date | ||
| - `lastUpdated` - Last update date | ||
| - `category` - Workflow category | ||
| - `maturity` - Stability level (experimental, beta, stable) | ||
| - `estimatedDuration` - Time estimate | ||
| - `complexity` - Difficulty level (beginner, intermediate, advanced) | ||
| - `maintainer` - Who maintains the workflow | ||
|
|
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify which fields the platform actually uses from ambient.json
echo "=== Checking platform adapter for ambient.json field usage ==="
rg -n "ambient" --type py -C5 | head -100
echo ""
echo "=== Searching for any usage of hooks, environment, settings, metadata fields ==="
rg -n "(hooks|environment|settings|metadata)" --type py -C3 | grep -i ambient || echo "No usage found"Repository: ambient-code/workflows
Length of output: 540
🏁 Script executed:
#!/bin/bash
# Explore repository structure
echo "=== Repository structure ==="
ls -la
echo ""
echo "=== Find FIELD_REFERENCE.md and AMBIENT_JSON_SCHEMA.md ==="
find . -name "*FIELD_REFERENCE*" -o -name "*AMBIENT_JSON_SCHEMA*" -o -name "*.md" | head -20Repository: ambient-code/workflows
Length of output: 1963
🏁 Script executed:
#!/bin/bash
echo "=== Search for FIELD_REFERENCE.md ==="
find ./workflows -name "*FIELD_REFERENCE*"
echo ""
echo "=== List contents of workflows/sprint-report ==="
ls -la ./workflows/sprint-report/ 2>/dev/null || echo "Directory not found"
echo ""
echo "=== List all directories in workflows ==="
ls -la ./workflows/Repository: ambient-code/workflows
Length of output: 1421
🏁 Script executed:
#!/bin/bash
echo "=== Check size of AMBIENT_JSON_SCHEMA.md ==="
wc -l ./AMBIENT_JSON_SCHEMA.md
echo ""
echo "=== Read AMBIENT_JSON_SCHEMA.md ==="
cat -n ./AMBIENT_JSON_SCHEMA.md
echo ""
echo "=== Check size of FIELD_REFERENCE.md ==="
wc -l ./workflows/sprint-report/FIELD_REFERENCE.mdRepository: ambient-code/workflows
Length of output: 15971
🏁 Script executed:
#!/bin/bash
echo "=== Read FIELD_REFERENCE.md (lines 76-345 as mentioned in review) ==="
sed -n '76,345p' ./workflows/sprint-report/FIELD_REFERENCE.md | cat -n
echo ""
echo "=== Full file to count all fields ==="
wc -l ./workflows/sprint-report/FIELD_REFERENCE.md
cat -n ./workflows/sprint-report/FIELD_REFERENCE.mdRepository: ambient-code/workflows
Length of output: 22370
Documentation describes 12 fields the platform does not implement.
FIELD_REFERENCE.md documents optional fields (version, author, repository, tags, icon, displayName, license, dependencies, environment, hooks, settings, metadata) that are not part of the canonical schema in AMBIENT_JSON_SCHEMA.md. The platform only implements 5 fields: name, description, systemPrompt, startupPrompt, and results. According to AMBIENT_JSON_SCHEMA.md (line 264), "Extra fields are ignored"—these undocumented fields will be silently ignored by the platform, misleading workflow authors into configuring non-functional features.
Recommendations:
- Remove undocumented fields from FIELD_REFERENCE.md, or
- Clearly mark them as "reserved for future use" / "not yet implemented", or
- Implement platform support for these fields first
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 78-78: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 86-86: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 94-94: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 105-105: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 112-112: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 118-118: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 122-122: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 127-127: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 137-137: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 141-141: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 146-146: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 156-156: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 163-163: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 179-179: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 186-186: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 205-205: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 212-212: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 218-218: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 225-225: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 234-234: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 238-238: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 247-247: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 253-253: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 260-260: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 271-271: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 285-285: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 297-297: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 304-304: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
[warning] 318-318: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 325-325: Fenced code blocks should be surrounded by blank lines
(MD031, blanks-around-fences)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/FIELD_REFERENCE.md` around lines 76 - 345, The
FIELD_REFERENCE.md optional-fields section lists fields (version, author,
repository, tags, icon, displayName, license, dependencies, environment, hooks,
settings, metadata) that the platform does not implement; update the document to
avoid misleading users by either removing these undocumented fields or clearly
annotating each as "not implemented / reserved for future use" (preferably add a
one-line note next to each field header and a short paragraph at the top of the
Optional Fields section referencing the canonical schema and the platform's
implemented list: name, description, systemPrompt, startupPrompt, results);
ensure the wording mentions the canonical schema behavior "Extra fields are
ignored" and keep the results field documentation unchanged.
| ## Complete Example | ||
|
|
||
| ```json | ||
| { | ||
| "name": "Feature Development Workflow", | ||
| "description": "End-to-end workflow for planning, implementing, and deploying new features with comprehensive testing and documentation.", | ||
| "version": "2.1.0", | ||
| "icon": "🚀", | ||
| "displayName": "🚀 Feature Development", | ||
|
|
||
| "systemPrompt": "You are a feature development assistant specializing in spec-driven development. Follow these phases: 1) Specify requirements, 2) Design solution, 3) Implement with tests, 4) Review and deploy. Use /specify, /design, /implement, /review, /deploy commands. Create artifacts in artifacts/ directory.", | ||
|
|
||
| "startupPrompt": "Welcome to Feature Development Workflow! I'll guide you through:\n1. Requirements specification\n2. Solution design\n3. Implementation with tests\n4. Code review\n5. Deployment\n\nRun /specify [feature-description] to begin.", | ||
|
|
||
| "results": { | ||
| "Requirements": "artifacts/specs/**/*.md", | ||
| "Design Docs": "artifacts/design/**/*.md", | ||
| "Implementation": "artifacts/implementation/**/*", | ||
| "Tests": "artifacts/tests/**/*.test.ts", | ||
| "Documentation": "artifacts/docs/**/*.md" | ||
| }, | ||
|
|
||
| "author": { | ||
| "name": "Platform Engineering Team", | ||
| "email": "platform@company.com", | ||
| "organization": "ACME Corp" | ||
| }, | ||
|
|
||
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/acme/feature-workflow", | ||
| "branch": "main" | ||
| }, | ||
|
|
||
| "tags": [ | ||
| "feature-development", | ||
| "planning", | ||
| "implementation", | ||
| "testing", | ||
| "deployment" | ||
| ], | ||
|
|
||
| "license": "MIT", | ||
|
|
||
| "dependencies": { | ||
| "git": ">=2.0.0", | ||
| "node": ">=18.0.0" | ||
| }, | ||
|
|
||
| "environment": { | ||
| "ARTIFACTS_DIR": "artifacts", | ||
| "LOG_LEVEL": "info", | ||
| "DEFAULT_BRANCH": "main" | ||
| }, | ||
|
|
||
| "hooks": { | ||
| "post-init": "./scripts/setup-workspace.sh", | ||
| "pre-execute": "./scripts/validate-plan.sh", | ||
| "post-execute": "./scripts/run-tests.sh" | ||
| }, | ||
|
|
||
| "settings": { | ||
| "autoSave": true, | ||
| "verboseLogging": false, | ||
| "createBackups": true | ||
| }, | ||
|
|
||
| "metadata": { | ||
| "created": "2024-06-15", | ||
| "lastUpdated": "2025-11-13", | ||
| "category": "development", | ||
| "maturity": "stable", | ||
| "estimatedDuration": "2-4 hours", | ||
| "complexity": "intermediate" | ||
| } | ||
| } | ||
| ``` |
There was a problem hiding this comment.
Complete example includes unsupported fields.
The "Complete Example" section (lines 350-424) demonstrates a full configuration using fields like hooks, environment, settings, and metadata that the platform does not process. Users copying this example will have non-functional configuration.
Consider simplifying the complete example to only include fields that actually work:
Suggested minimal working example
-## Complete Example
+## Complete Example (Supported Fields Only)
```json
{
"name": "Feature Development Workflow",
"description": "End-to-end workflow for planning, implementing, and deploying new features with comprehensive testing and documentation.",
- "version": "2.1.0",
- "icon": "🚀",
- "displayName": "🚀 Feature Development",
"systemPrompt": "You are a feature development assistant specializing in spec-driven development. Follow these phases: 1) Specify requirements, 2) Design solution, 3) Implement with tests, 4) Review and deploy. Use /specify, /design, /implement, /review, /deploy commands. Create artifacts in artifacts/ directory.",
"startupPrompt": "Welcome to Feature Development Workflow! I'll guide you through:\n1. Requirements specification\n2. Solution design\n3. Implementation with tests\n4. Code review\n5. Deployment\n\nRun /specify [feature-description] to begin.",
"results": {
"Requirements": "artifacts/specs/**/*.md",
"Design Docs": "artifacts/design/**/*.md",
"Implementation": "artifacts/implementation/**/*",
"Tests": "artifacts/tests/**/*.test.ts",
"Documentation": "artifacts/docs/**/*.md"
- },
-
- "author": {...},
- "repository": {...},
- "tags": [...],
- "license": "MIT",
- "dependencies": {...},
- "environment": {...},
- "hooks": {...},
- "settings": {...},
- "metadata": {...}
+ }
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/FIELD_REFERENCE.md` around lines 348 - 424, The
"Complete Example" JSON contains unsupported fields (hooks, environment,
settings, metadata, and other non-processed entries) that will produce
non-functional configs; edit the example to remove those unsupported keys and
retain only the supported top-level fields (e.g., keep "name", "description",
"systemPrompt", "startupPrompt", and "results") so the example becomes a minimal
working configuration—locate the block labeled "Complete Example" and update the
JSON accordingly by deleting "hooks", "environment", "settings", "metadata" (and
any other non-processed entries) while preserving
"systemPrompt"/"startupPrompt"/"results" entries as shown.
workflows/sprint-report/README.md
Outdated
| --- | ||
|
|
||
| **Template Version**: 1.0.0 | ||
| **Last Updated**: 2025-11-13 |
There was a problem hiding this comment.
Update the "Last Updated" date.
The date shows 2025-11-13, which predates the PR creation by several months. Consider updating this to reflect the actual last modification date.
📅 Proposed fix
-**Last Updated**: 2025-11-13
+**Last Updated**: 2026-03-11📝 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.
| **Last Updated**: 2025-11-13 | |
| **Last Updated**: 2026-03-11 |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/README.md` at line 420, Update the "**Last Updated**:
2025-11-13" line in the README to the actual modification date for this change
(e.g., the PR date or today's date) so the header reflects the current state;
locate the literal "**Last Updated**: 2025-11-13" string and replace the date
portion with the correct ISO date.
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@workflows/sprint-report/.ambient/ambient.json`:
- Line 4: The template interpolation currently injects Jira-sourced fields
directly into templates (placeholders like {{TEAM_NAME}},
{{DELIVERY_RATE_VALUE}}, and repeating placeholders for issue summaries,
descriptions, assignee names, comments in templates/report.html) which allows
XSS; update the template-rendering/interpolation routine to HTML-escape all
untrusted text fields (escape &, <, >, " and ') before replacing placeholders
and only permit raw HTML for explicitly fixed-format internal values (e.g.,
CSS/JS snippets or controlled KPI numbers). Locate and change the code that
performs placeholder replacement (the template interpolation / render function
used for templates/report.html and any code that maps Jira CSV/query fields to
those placeholders) so every Jira-derived string is run through an HTML-escape
utility before insertion; ensure repeated components (issue rows/cards) also use
the escaped values.
In `@workflows/sprint-report/templates/report.html`:
- Around line 815-817: Update the health-rating thresholds in the report
template so the displayed ranges match the scoring spec: replace the current
"HEALTHY (0–2)", "MODERATE RISK (3–5)", and "HIGH RISK (6+)" labels with
"HEALTHY (0–3)", "MODERATE RISK (4–6)", and "HIGH RISK (7–10)" respectively in
the template lines that contain the literal strings "HEALTHY", "MODERATE RISK",
and "HIGH RISK".
- Line 1217: The anchor tag rendering the issue link (<a href="{{ITEM_URL}}"
target="_blank" class="issue-key">{{ITEM_KEY}}</a>) must include rel="noopener
noreferrer" to prevent tabnabbing; update that anchor in both report templates
so it becomes <a ... target="_blank" rel="noopener noreferrer" ...> (preserve
ITEM_URL, ITEM_KEY and class="issue-key") ensuring both occurrences are changed.
- Around line 1243-1256: The toggleKpiDetail function can throw a TypeError
because card (from document.querySelector('[data-kpi="' + kpiId + '"]')) may be
null for certain kpiId values like "health-rating"; update toggleKpiDetail to
null-check both panel and card before using classList: if panel is missing, do
nothing (or return); when removing/adding classes, only call classList methods
if the element exists; specifically guard before calling
panel.classList.contains, panel.classList.add, and card.classList.add to prevent
null dereference.
- Line 238: Replace undefined CSS custom properties --bg-card and --text-primary
with the existing defined tokens to fix invalid declarations: change occurrences
of var(--bg-card) to an appropriate defined background token (e.g., var(--bg) or
var(--bg-alt) depending on intended contrast) and change var(--text-primary) to
one of the defined text tokens (e.g., var(--text) or var(--text-secondary));
update the background and color declarations in the template where these
variables are used so they reference --bg | --bg-alt and --text |
--text-secondary | --text-muted consistently.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 76967547-bee3-4645-89a4-fc383362dab2
📒 Files selected for processing (2)
workflows/sprint-report/.ambient/ambient.jsonworkflows/sprint-report/templates/report.html
| { | ||
| "name": "Sprint Health Report", | ||
| "description": "Generates comprehensive sprint health reports from Jira data. Analyzes delivery metrics, detects anti-patterns, and produces actionable coaching recommendations in a 1-2 turn experience.", | ||
| "systemPrompt": "You are a Sprint Health Analyst. You produce comprehensive sprint health reports from Jira sprint data (CSV exports or direct Jira queries). Your reports include risk ratings, anti-pattern detection, coaching recommendations, and KPI dashboards.\n\nGOAL: Deliver a complete sprint health report in 1-2 turns. Do NOT build tools, scripts, or reusable infrastructure. Do NOT self-generate a feature backlog. Produce the report and stop.\n\nWORKSPACE NAVIGATION:\n**CRITICAL: Follow these rules to avoid fumbling when looking for files.**\n\nStandard file locations (from workflow root):\n- Config: .ambient/ambient.json (ALWAYS at this path)\n- Outputs: artifacts/sprint-report/\n\nTool selection rules:\n- Use Read for: Known paths, standard files, files you just created\n- Use Glob for: Discovery (finding multiple files by pattern)\n- Use Grep for: Content search\n\nNever glob for standard files:\n✅ DO: Read .ambient/ambient.json\n❌ DON'T: Glob **/ambient.json\n\nANALYSIS METHODOLOGY:\nOnce you have the user's answers from the startup questions, execute this pipeline in a SINGLE pass:\n\n1. INGEST DATA\n - Parse the CSV export OR query Jira via MCP (jira_search with sprint ID)\n - Extract: issue key, type, status, priority, assignee, story points, created/resolved dates, sprint field, acceptance criteria, flagged status, blockers\n\n2. COMPUTE METRICS (all 8 dimensions)\n - Commitment Reliability: delivery rate (points completed / committed), item completion rate\n - Scope Stability: items added/removed mid-sprint, scope change percentage\n - Flow Efficiency: cycle time (created to resolved), WIP count, status distribution\n - Story Sizing: point distribution, oversized items (>8 pts), unestimated items\n - Work Distribution: load per assignee, concentration risk, unassigned items\n - Blocker Analysis: flagged items, blocking/blocked relationships, impediment duration\n - Backlog Health: acceptance criteria coverage, priority distribution, definition of ready\n - Delivery Predictability: carryover count, zombie items (>2 sprints), aging analysis\n\n3. DETECT ANTI-PATTERNS\n - Overcommitment (committed > 2x historical velocity)\n - Perpetual carryover (items spanning 3+ sprints)\n - Missing Definition of Ready (0% AC coverage)\n - Work concentration (one person assigned >30% of items)\n - Mid-sprint scope injection without descoping\n - Zombie items (>60 days old, still open)\n - Item repurposing (summary/description changed mid-sprint)\n - Hidden work (items with no status transitions)\n\n4. GENERATE HEALTH RATING\n Risk score (0-10 scale):\n - Delivery rate: +3 (<50%), +2 (50-69%), +1 (70-84%), 0 (85%+)\n - AC coverage: +2 (<30%), +1 (30-69%), 0 (70%+)\n - Zombie items: +2 (3+), +1 (1-2), 0 (none)\n - Never started: +2 (>30%), +1 (15-30%), 0 (<15%)\n - Priority gaps: +1 (<30% prioritized), 0 (30%+)\n Rating: 0-3 = HEALTHY, 4-6 = MODERATE RISK, 7-10 = HIGH RISK\n\n5. PRODUCE REPORT\n Generate artifacts in artifacts/sprint-report/:\n - {SprintName}_Health_Report.md (full markdown report)\n - {SprintName}_Health_Report.html (styled HTML with KPI cards, progress bars, coaching notes)\n\nREPORT STRUCTURE:\n- Executive Summary (health rating, top 5 numbers, positive signals)\n- KPI Dashboard (delivery rate, WIP count, AC coverage, never-started items, cycle time, carryover)\n- Dimension Analysis (8 cards with observations, risks, root causes)\n- Anti-Pattern Detection (evidence-based pattern cards)\n- Top 5 Actions for Next Sprint (numbered, actionable)\n- Coaching Notes (retrospective facilitation, sprint planning, backlog refinement)\n- Appendix (per-item detail table with status, points, assignee, sprint history)\n\nHTML TEMPLATE:\nBefore generating the HTML report, Read the template at templates/report.html.\n- Use the exact CSS, HTML structure, and JavaScript from the template.\n- Replace all {{PLACEHOLDER}} markers with values computed from the sprint data.\n- For repeating components (dimension cards, KPI cards, anti-pattern cards, action cards, coaching cards, observation blocks, appendix rows), replicate the example pattern for each data item.\n- The template includes inline HTML comments describing how to repeat patterns and which CSS classes to use.\n- Do NOT modify the CSS or JavaScript sections.\n- Do NOT add features not present in the template (charts, trend graphs, etc.).\n- Preserve the sidebar table of contents and all section IDs for scroll-spy navigation.\n\nJIRA ENRICHMENT (optional, if MCP available):\nAfter the initial CSV analysis, batch-fetch the top 10-15 highest-risk issues via jira_get_issue to get changelogs and comments. Use a single jira_search with JQL `key in (...)` rather than individual fetches. Weave findings into the report.\n\nCRITICAL CONSTRAINTS:\n- Do NOT build Python scripts, CLI tools, or reusable analyzers\n- Do NOT implement features the user didn't ask for (dark mode, PDF export, trend charts, etc.)\n- Do NOT rewrite the report after enrichment -- integrate enrichment data on the first write\n- Batch tool calls wherever possible (parallel jira_get_issue calls, not serial)\n- If the user's answers are complete, produce the report without asking follow-up questions\n- Stick to the requested output format(s) -- don't produce both unless asked", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, check if the file exists and get its location
find . -name "ambient.json" -path "*/sprint-report/*" 2>/dev/null | head -20Repository: ambient-code/workflows
Length of output: 113
🏁 Script executed:
# Check for template files
find . -name "report.html" -o -name "*template*" | head -20Repository: ambient-code/workflows
Length of output: 1018
🏁 Script executed:
# Check the overall structure of the sprint-report workflow
ls -la workflows/sprint-report/ 2>/dev/null || echo "Directory not found"Repository: ambient-code/workflows
Length of output: 492
🏁 Script executed:
# Read the ambient.json file
cat -n workflows/sprint-report/.ambient/ambient.jsonRepository: ambient-code/workflows
Length of output: 7486
🏁 Script executed:
# Read the template file to see how placeholders are used
cat -n workflows/sprint-report/templates/report.html | head -100Repository: ambient-code/workflows
Length of output: 2874
🏁 Script executed:
# Continue reading the template to see how placeholders are used
cat -n workflows/sprint-report/templates/report.html | sed -n '100,200p'Repository: ambient-code/workflows
Length of output: 2976
🏁 Script executed:
# Search for all placeholder patterns in the template
grep -n "{{" workflows/sprint-report/templates/report.html | head -40Repository: ambient-code/workflows
Length of output: 3488
🏁 Script executed:
# Check if there's any escaping logic or mention of HTML escaping in the template
grep -i "escap\|sanitiz\|html" workflows/sprint-report/templates/report.html | head -20Repository: ambient-code/workflows
Length of output: 106
🏁 Script executed:
# Check if there are any other instructional files or examples
find workflows/sprint-report -type f | xargs ls -laRepository: ambient-code/workflows
Length of output: 1272
🏁 Script executed:
# Check the README to see if there's security guidance
cat workflows/sprint-report/README.md | head -100Repository: ambient-code/workflows
Length of output: 3432
🏁 Script executed:
# Get a broader view of the template to see data field examples
grep -A2 "{{TEAM_NAME}}\|{{HEALTH_RATING}}\|{{DELIVERY_RATE" workflows/sprint-report/templates/report.html | head -30Repository: ambient-code/workflows
Length of output: 970
Add mandatory HTML escaping for Jira-sourced data before template interpolation.
The systemPrompt instructs the agent to replace all {{PLACEHOLDER}} markers with values from Jira sprint data (summaries, descriptions, assignee names, comments). Currently, no escaping guidance exists. This allows XSS injection—malicious markup in Jira fields will execute when reports are opened or shared.
Require that untrusted text fields ({{TEAM_NAME}}, {{DELIVERY_RATE_VALUE}}, issue summaries, descriptions, assignee names, comments, etc.) are HTML-escaped (&, <, >, ", ') before interpolation. Only allow raw HTML for explicitly fixed-format internal values.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/.ambient/ambient.json` at line 4, The template
interpolation currently injects Jira-sourced fields directly into templates
(placeholders like {{TEAM_NAME}}, {{DELIVERY_RATE_VALUE}}, and repeating
placeholders for issue summaries, descriptions, assignee names, comments in
templates/report.html) which allows XSS; update the
template-rendering/interpolation routine to HTML-escape all untrusted text
fields (escape &, <, >, " and ') before replacing placeholders and only permit
raw HTML for explicitly fixed-format internal values (e.g., CSS/JS snippets or
controlled KPI numbers). Locate and change the code that performs placeholder
replacement (the template interpolation / render function used for
templates/report.html and any code that maps Jira CSV/query fields to those
placeholders) so every Jira-derived string is run through an HTML-escape utility
before insertion; ensure repeated components (issue rows/cards) also use the
escaped values.
| .kpi-detail { | ||
| display: none; | ||
| grid-column: 1 / -1; | ||
| background: var(--bg-card); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n workflows/sprint-report/templates/report.html | sed -n '230,270p'Repository: ambient-code/workflows
Length of output: 1392
🏁 Script executed:
rg '(--bg-card|--text-primary|--bg\b|--text\b)' --type css --type html --type jsRepository: ambient-code/workflows
Length of output: 4023
Replace undefined CSS custom properties with defined ones.
var(--bg-card) and var(--text-primary) are not defined; only --bg, --bg-alt, --text, --text-secondary, and --text-muted exist. This causes invalid declarations and styling inconsistency.
Proposed fix
- background: var(--bg-card);
+ background: var(--bg);
@@
- color: var(--text-primary);
+ color: var(--text);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/templates/report.html` at line 238, Replace undefined
CSS custom properties --bg-card and --text-primary with the existing defined
tokens to fix invalid declarations: change occurrences of var(--bg-card) to an
appropriate defined background token (e.g., var(--bg) or var(--bg-alt) depending
on intended contrast) and change var(--text-primary) to one of the defined text
tokens (e.g., var(--text) or var(--text-secondary)); update the background and
color declarations in the template where these variables are used so they
reference --bg | --bg-alt and --text | --text-secondary | --text-muted
consistently.
| 🟢 <strong>HEALTHY</strong> (0–2): Delivering predictably with good process discipline.<br> | ||
| 🟡 <strong>MODERATE RISK</strong> (3–5): Mostly on track but process gaps could compound over time.<br> | ||
| 🔴 <strong>HIGH RISK</strong> (6+): Significant delivery problems requiring focused attention. |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's find and read the template file
find . -name "report.html" -path "*/sprint-report/*" | head -5Repository: ambient-code/workflows
Length of output: 113
🏁 Script executed:
# Find the ambient.json file
find . -name "ambient.json" -path "*/sprint-report/*" | head -5Repository: ambient-code/workflows
Length of output: 113
🏁 Script executed:
# Read lines around 815-817 from report.html
sed -n '810,820p' ./workflows/sprint-report/templates/report.htmlRepository: ambient-code/workflows
Length of output: 862
🏁 Script executed:
# Read ambient.json to find health threshold definitions
cat ./workflows/sprint-report/.ambient/ambient.jsonRepository: ambient-code/workflows
Length of output: 7416
Align health-rating thresholds with workflow scoring spec.
The template displays HEALTHY (0–2), MODERATE RISK (3–5), HIGH RISK (6+), but the scoring specification in workflows/sprint-report/.ambient/ambient.json defines 0–3, 4–6, 7–10. Update the thresholds in the template to match the spec.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/templates/report.html` around lines 815 - 817, Update
the health-rating thresholds in the report template so the displayed ranges
match the scoring spec: replace the current "HEALTHY (0–2)", "MODERATE RISK
(3–5)", and "HIGH RISK (6+)" labels with "HEALTHY (0–3)", "MODERATE RISK (4–6)",
and "HIGH RISK (7–10)" respectively in the template lines that contain the
literal strings "HEALTHY", "MODERATE RISK", and "HIGH RISK".
| Sprint pills: use class "current" for the active sprint, plain for past sprints. | ||
| Link issue keys to the tracker URL (e.g. Jira). --> | ||
| <tr> | ||
| <td><a href="{{ITEM_URL}}" target="_blank" class="issue-key">{{ITEM_KEY}}</a></td> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, verify the file exists and check the line in question
if [ -f "workflows/sprint-report/templates/report.html" ]; then
echo "=== File exists ==="
# Get context around line 1217
sed -n '1210,1225p' "workflows/sprint-report/templates/report.html" | cat -n
else
echo "File not found at specified path"
# Try to find it
find . -name "report.html" -type f
fiRepository: ambient-code/workflows
Length of output: 1089
🏁 Script executed:
# Search for all target="_blank" occurrences in the report.html file to identify instances without rel
rg 'target="_blank"' "workflows/sprint-report/templates/report.html" -nRepository: ambient-code/workflows
Length of output: 163
🏁 Script executed:
# Search for target="_blank" links across the entire codebase to understand scope
rg 'target="_blank"' --type html -cRepository: ambient-code/workflows
Length of output: 154
🏁 Script executed:
# Check for target="_blank" links in the triage report template to see if they have rel attributes
rg 'target="_blank"' "workflows/triage/templates/report.html" -n -A 0 -B 0Repository: ambient-code/workflows
Length of output: 169
🏁 Script executed:
# Search for target="_blank" links across all HTML/template files and check which ones lack rel attributes
rg 'target="_blank"' --type html -n | grep -v 'rel=' | head -20Repository: ambient-code/workflows
Length of output: 352
🏁 Script executed:
# Get line count of both report.html files to understand their scope
wc -l "workflows/sprint-report/templates/report.html" "workflows/triage/templates/report.html"Repository: ambient-code/workflows
Length of output: 174
Add rel to target="_blank" links.
The template links opening in new tabs must include rel="noopener noreferrer" to prevent opener-based tabnabbing attacks.
Update both occurrences:
workflows/sprint-report/templates/report.htmlline 1217workflows/triage/templates/report.htmlline 529
Example fix for sprint-report
-<td><a href="{{ITEM_URL}}" target="_blank" class="issue-key">{{ITEM_KEY}}</a></td>
+<td><a href="{{ITEM_URL}}" target="_blank" rel="noopener noreferrer" class="issue-key">{{ITEM_KEY}}</a></td>📝 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.
| <td><a href="{{ITEM_URL}}" target="_blank" class="issue-key">{{ITEM_KEY}}</a></td> | |
| <td><a href="{{ITEM_URL}}" target="_blank" rel="noopener noreferrer" class="issue-key">{{ITEM_KEY}}</a></td> |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/templates/report.html` at line 1217, The anchor tag
rendering the issue link (<a href="{{ITEM_URL}}" target="_blank"
class="issue-key">{{ITEM_KEY}}</a>) must include rel="noopener noreferrer" to
prevent tabnabbing; update that anchor in both report templates so it becomes <a
... target="_blank" rel="noopener noreferrer" ...> (preserve ITEM_URL, ITEM_KEY
and class="issue-key") ensuring both occurrences are changed.
| function toggleKpiDetail(kpiId) { | ||
| var panel = document.getElementById('kpi-detail-' + kpiId); | ||
| var card = document.querySelector('[data-kpi="' + kpiId + '"]'); | ||
| var wasActive = panel.classList.contains('active'); | ||
| document.querySelectorAll('.kpi-detail.active').forEach(function(p) { | ||
| p.classList.remove('active'); | ||
| }); | ||
| document.querySelectorAll('.kpi-card.selected').forEach(function(c) { | ||
| c.classList.remove('selected'); | ||
| }); | ||
| if (!wasActive) { | ||
| panel.classList.add('active'); | ||
| card.classList.add('selected'); | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Read the specific lines mentioned in the review
sed -n '1243,1256p' workflows/sprint-report/templates/report.htmlRepository: ambient-code/workflows
Length of output: 603
🏁 Script executed:
# Search for KPI card elements with data-kpi attributes
rg 'data-kpi=' workflows/sprint-report/templates/report.html -A 1 -B 1Repository: ambient-code/workflows
Length of output: 1612
🏁 Script executed:
# Search for all toggleKpiDetail calls to see which KPI IDs are referenced
rg 'toggleKpiDetail' workflows/sprint-report/templates/report.htmlRepository: ambient-code/workflows
Length of output: 947
🏁 Script executed:
# Search for detail panel elements to see which exist
rg 'kpi-detail' workflows/sprint-report/templates/report.html | grep -i 'id='Repository: ambient-code/workflows
Length of output: 453
Prevent null dereference in toggleKpiDetail — health-rating card is missing.
The function is called with 'health-rating' but the corresponding KPI card element with data-kpi="health-rating" does not exist. This causes card to be null on line 1255, throwing a TypeError when attempting card.classList.add('selected').
Proposed fix
function toggleKpiDetail(kpiId) {
var panel = document.getElementById('kpi-detail-' + kpiId);
var card = document.querySelector('[data-kpi="' + kpiId + '"]');
+ if (!panel) return;
var wasActive = panel.classList.contains('active');
@@
if (!wasActive) {
panel.classList.add('active');
- card.classList.add('selected');
+ if (card) card.classList.add('selected');
}
}📝 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.
| function toggleKpiDetail(kpiId) { | |
| var panel = document.getElementById('kpi-detail-' + kpiId); | |
| var card = document.querySelector('[data-kpi="' + kpiId + '"]'); | |
| var wasActive = panel.classList.contains('active'); | |
| document.querySelectorAll('.kpi-detail.active').forEach(function(p) { | |
| p.classList.remove('active'); | |
| }); | |
| document.querySelectorAll('.kpi-card.selected').forEach(function(c) { | |
| c.classList.remove('selected'); | |
| }); | |
| if (!wasActive) { | |
| panel.classList.add('active'); | |
| card.classList.add('selected'); | |
| } | |
| function toggleKpiDetail(kpiId) { | |
| var panel = document.getElementById('kpi-detail-' + kpiId); | |
| var card = document.querySelector('[data-kpi="' + kpiId + '"]'); | |
| if (!panel) return; | |
| var wasActive = panel.classList.contains('active'); | |
| document.querySelectorAll('.kpi-detail.active').forEach(function(p) { | |
| p.classList.remove('active'); | |
| }); | |
| document.querySelectorAll('.kpi-card.selected').forEach(function(c) { | |
| c.classList.remove('selected'); | |
| }); | |
| if (!wasActive) { | |
| panel.classList.add('active'); | |
| if (card) card.classList.add('selected'); | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@workflows/sprint-report/templates/report.html` around lines 1243 - 1256, The
toggleKpiDetail function can throw a TypeError because card (from
document.querySelector('[data-kpi="' + kpiId + '"]')) may be null for certain
kpiId values like "health-rating"; update toggleKpiDetail to null-check both
panel and card before using classList: if panel is missing, do nothing (or
return); when removing/adding classes, only call classList methods if the
element exists; specifically guard before calling panel.classList.contains,
panel.classList.add, and card.classList.add to prevent null dereference.
Configure the sprint health report workflow for 1-2 turn agentic efficiency. The startup prompt gathers all required context (data source, team, audience, format, assumptions) upfront so the agent can produce a complete report without back-and-forth. Made-with: Cursor
- Delete unused template commands (init, analyze, plan, execute, verify) and agent personas (architect, engineer, product-manager) - Create sprint-report skill with full analysis methodology extracted from the systemPrompt (metrics, anti-patterns, health rating, report structure, HTML template instructions) - Slim down ambient.json systemPrompt to role + navigation + skill entry point - Rewrite startupPrompt as agent directive per updated platform semantics - Delete FIELD_REFERENCE.md (documented fields the platform ignores) - Replace generic template README with sprint-report-specific docs - Update AMBIENT_JSON_SCHEMA.md: add skills as preferred pattern, remove agent orchestration guidance, fix file organization, remove stale local paths and references, trim redundant examples Made-with: Cursor
3d05e78 to
116926e
Compare
Remove workspace navigation boilerplate and GOAL constraints that belong in the skill, not the systemPrompt. 254 chars, down from ~1500. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (4)
workflows/sprint-report/templates/report.html (4)
1243-1256:⚠️ Potential issue | 🔴 CriticalGuard
toggleKpiDetailagainst missing elements.Line 1255 can throw when
cardis null (e.g.,health-ratingdetail has no matchingdata-kpicard). A single click can break all subsequent toggles.Proposed fix
function toggleKpiDetail(kpiId) { var panel = document.getElementById('kpi-detail-' + kpiId); var card = document.querySelector('[data-kpi="' + kpiId + '"]'); + if (!panel) return; var wasActive = panel.classList.contains('active'); @@ if (!wasActive) { panel.classList.add('active'); - card.classList.add('selected'); + if (card) card.classList.add('selected'); } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@workflows/sprint-report/templates/report.html` around lines 1243 - 1256, toggleKpiDetail can throw when elements are missing (panel or card); add null checks to bail out or skip operations when getElementById('kpi-detail-' + kpiId) returns null or when querySelector('[data-kpi="' + kpiId + '"]') returns null. Specifically, in function toggleKpiDetail, check that panel exists before accessing panel.classList and that card exists before calling card.classList.add; still perform the loop removals (querySelectorAll) safely, and if panel is missing simply return early; this prevents a single missing element from breaking all subsequent toggles.
1217-1217:⚠️ Potential issue | 🟠 MajorAdd
relon external links opened in a new tab.Line 1217 uses
target="_blank"withoutrel="noopener noreferrer", which leaves the opener context exposed.Proposed fix
-<td><a href="{{ITEM_URL}}" target="_blank" class="issue-key">{{ITEM_KEY}}</a></td> +<td><a href="{{ITEM_URL}}" target="_blank" rel="noopener noreferrer" class="issue-key">{{ITEM_KEY}}</a></td>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@workflows/sprint-report/templates/report.html` at line 1217, The anchor that opens external links in a new tab (the <a> element with class "issue-key" using target="_blank" and templated values ITEM_URL/ITEM_KEY) must include rel="noopener noreferrer" to avoid exposing window.opener; update the anchor markup to add rel="noopener noreferrer" alongside target="_blank" so external links are opened safely.
235-239:⚠️ Potential issue | 🟡 MinorUse defined CSS tokens to avoid invalid declarations.
Line 238 and Line 266 reference
--bg-card/--text-primary, but those variables are not defined in:root. This leads to dropped declarations and inconsistent rendering.Proposed fix
- .kpi-detail { + .kpi-detail { display: none; grid-column: 1 / -1; - background: var(--bg-card); + background: var(--bg); @@ - .kpi-detail .kpi-detail-action { + .kpi-detail .kpi-detail-action { @@ - color: var(--text-primary); + color: var(--text);Also applies to: 263-267
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@workflows/sprint-report/templates/report.html` around lines 235 - 239, The CSS uses undefined custom properties (--bg-card and --text-primary) in the .kpi-detail rule (and elsewhere); add those variables to the :root selector with appropriate fallback values or replace usages with existing defined tokens to avoid dropped declarations—locate the :root block and either define --bg-card and --text-primary there (or change .kpi-detail/background and color to use existing tokens like --bg or --text) so the declarations become valid and rendering is consistent.
815-817:⚠️ Potential issue | 🟠 MajorAlign displayed health bands with the scoring spec.
Line 815–817 shows
0–2 / 3–5 / 6+, but the workflow scoring spec uses0–3 / 4–6 / 7–10. This creates contradictory guidance inside the generated report.Proposed fix
- 🟢 <strong>HEALTHY</strong> (0–2): ... - 🟡 <strong>MODERATE RISK</strong> (3–5): ... - 🔴 <strong>HIGH RISK</strong> (6+): ... + 🟢 <strong>HEALTHY</strong> (0–3): ... + 🟡 <strong>MODERATE RISK</strong> (4–6): ... + 🔴 <strong>HIGH RISK</strong> (7–10): ...🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@workflows/sprint-report/templates/report.html` around lines 815 - 817, Update the displayed health band ranges to match the workflow scoring spec: replace the numeric ranges shown next to the HEALTHY, MODERATE RISK, and HIGH RISK labels in the report template so that "HEALTHY" reads "0–3", "MODERATE RISK" reads "4–6", and "HIGH RISK" reads "7–10"; locate the three strings "<strong>HEALTHY</strong>", "<strong>MODERATE RISK</strong>", and "<strong>HIGH RISK</strong>" in report.html and change only their adjacent numeric ranges to the spec values.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@workflows/sprint-report/.claude/skills/sprint-report/SKILL.md`:
- Around line 120-123: The instructions conflict about whether to use
jira_search or jira_get_issue; fix by making a single clear flow: use
jira_search with an appropriate JQL to fetch the top 10–15 issue keys, then
batch-fetch full issue details (including changelogs and comments) via
jira_get_issue for those keys (or a provided batch variant) so enrichment always
uses one search step followed by targeted jira_get_issue calls; update the text
to reference both symbols: first call jira_search to obtain keys, then call
jira_get_issue for each selected key to retrieve changelogs/comments.
---
Duplicate comments:
In `@workflows/sprint-report/templates/report.html`:
- Around line 1243-1256: toggleKpiDetail can throw when elements are missing
(panel or card); add null checks to bail out or skip operations when
getElementById('kpi-detail-' + kpiId) returns null or when
querySelector('[data-kpi="' + kpiId + '"]') returns null. Specifically, in
function toggleKpiDetail, check that panel exists before accessing
panel.classList and that card exists before calling card.classList.add; still
perform the loop removals (querySelectorAll) safely, and if panel is missing
simply return early; this prevents a single missing element from breaking all
subsequent toggles.
- Line 1217: The anchor that opens external links in a new tab (the <a> element
with class "issue-key" using target="_blank" and templated values
ITEM_URL/ITEM_KEY) must include rel="noopener noreferrer" to avoid exposing
window.opener; update the anchor markup to add rel="noopener noreferrer"
alongside target="_blank" so external links are opened safely.
- Around line 235-239: The CSS uses undefined custom properties (--bg-card and
--text-primary) in the .kpi-detail rule (and elsewhere); add those variables to
the :root selector with appropriate fallback values or replace usages with
existing defined tokens to avoid dropped declarations—locate the :root block and
either define --bg-card and --text-primary there (or change
.kpi-detail/background and color to use existing tokens like --bg or --text) so
the declarations become valid and rendering is consistent.
- Around line 815-817: Update the displayed health band ranges to match the
workflow scoring spec: replace the numeric ranges shown next to the HEALTHY,
MODERATE RISK, and HIGH RISK labels in the report template so that "HEALTHY"
reads "0–3", "MODERATE RISK" reads "4–6", and "HIGH RISK" reads "7–10"; locate
the three strings "<strong>HEALTHY</strong>", "<strong>MODERATE RISK</strong>",
and "<strong>HIGH RISK</strong>" in report.html and change only their adjacent
numeric ranges to the spec values.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 3eeb59e2-3405-4740-826b-f5ff862c67e8
📒 Files selected for processing (5)
AMBIENT_JSON_SCHEMA.mdworkflows/sprint-report/.ambient/ambient.jsonworkflows/sprint-report/.claude/skills/sprint-report/SKILL.mdworkflows/sprint-report/README.mdworkflows/sprint-report/templates/report.html
…ings Add references/ directory with Jira field discovery and query pattern guidance. Rewrite SKILL.md to address all 13 issues from test review: Step 0 discovery-and-proposal flow, explicit query construction, data quality assessment with graceful degradation, systematic zombie detection, positive signal requirements, changelog analysis guidance, and template placeholder derivation rules. Update ambient.json to match the new proposal-based UX. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md`:
- Around line 11-13: The fenced code blocks around examples like the jira_search
call (jira_search("project = X AND sprint in openSprints() ORDER BY created
DESC", maxResults=1, fields="*all")) and the plain workflow line (New → Backlog
→ To Do → In Progress → Review → Done / Closed) need language identifiers to
satisfy markdownlint MD040; update each opening fence to include a language
token (e.g., ```text or ```sql/jql for the JIRA query block and ```text for
plain lines) so both the JQL example and the workflow line are fenced as
```<language> ... ``` blocks.
- Around line 12-13: The jira_search call using the query "project = X AND
sprint in openSprints() ORDER BY created DESC" can return zero results and block
custom-field discovery; update the logic around jira_search to try the
sprint-scoped query first (jira_search with sprint in openSprints()) and if it
returns no issues, fallback to a sprint-agnostic query such as "project = X
ORDER BY created DESC" (or a combined OR-style query) so field discovery still
proceeds for closed-sprint analysis; ensure this behavior is implemented where
jira_search is invoked so the fallback path runs automatically when no open
sprint issues are found.
In `@workflows/sprint-report/.claude/skills/sprint-report/SKILL.md`:
- Around line 45-55: The unlabeled fenced code blocks in SKILL.md should be
given a language tag to satisfy markdownlint MD040; update both the human-facing
example block (the summary/proposed plan snippet starting with "I found [Sprint
Name]...") and the code example block that shows the jira_get_sprint_issues(...)
call by changing their opening fences from ``` to ```text (or ```bash for the
jira example if you prefer); ensure both fenced blocks are updated consistently
so the snippets are labeled (e.g., ```text for the plain text summary and
```text or ```bash for the jira_get_sprint_issues call).
- Around line 264-340: The report generation (Step 5: Produce the Report)
currently runs before changelog enrichment (Step 6: Changelog Analysis), causing
missing changelog findings in the initial write; move or invoke the changelog
enrichment logic so that any required changelog fetch/parse (the conditional
path that does targeted jira_search with expand=changelog) completes before
rendering templates and writing the report, ensure the template
interpolation/placeholder filling (including anti-patterns and changelog-derived
sections) consumes the parsed changelog results so the first write contains
those findings, and keep the existing conditional behavior (skip/fetch only when
needed) intact while placing its outcome upstream of the HTML/Markdown
generation step.
🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 721ade52-9390-4e3a-b572-cdac1c87c562
📒 Files selected for processing (4)
workflows/sprint-report/.ambient/ambient.jsonworkflows/sprint-report/.claude/skills/sprint-report/SKILL.mdworkflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.mdworkflows/sprint-report/.claude/skills/sprint-report/references/jira-query-patterns.md
| ``` | ||
| jira_search("project = X AND sprint in openSprints() ORDER BY created DESC", maxResults=1, fields="*all") | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks (markdownlint MD040).
Line 11 and Line 90 open fenced blocks without a language, which is currently flagged by static analysis.
Suggested fix
-```
+```text
jira_search("project = X ORDER BY created DESC", maxResults=1, fields="*all")- +text
New → Backlog → To Do → In Progress → Review → Done / Closed
Also applies to: 90-92
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md`
around lines 11 - 13, The fenced code blocks around examples like the
jira_search call (jira_search("project = X AND sprint in openSprints() ORDER BY
created DESC", maxResults=1, fields="*all")) and the plain workflow line (New →
Backlog → To Do → In Progress → Review → Done / Closed) need language
identifiers to satisfy markdownlint MD040; update each opening fence to include
a language token (e.g., ```text or ```sql/jql for the JIRA query block and
```text for plain lines) so both the JQL example and the workflow line are
fenced as ```<language> ... ``` blocks.
| jira_search("project = X AND sprint in openSprints() ORDER BY created DESC", maxResults=1, fields="*all") | ||
| ``` |
There was a problem hiding this comment.
Use a sprint-agnostic fallback query for field discovery.
Line 12 ties discovery to openSprints(), which can return zero issues when no sprint is active. That blocks custom-field ID discovery for closed-sprint analysis.
Suggested fix
-jira_search("project = X AND sprint in openSprints() ORDER BY created DESC", maxResults=1, fields="*all")
+jira_search("project = X ORDER BY created DESC", maxResults=1, fields="*all")📝 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.
| jira_search("project = X AND sprint in openSprints() ORDER BY created DESC", maxResults=1, fields="*all") | |
| ``` | |
| jira_search("project = X ORDER BY created DESC", maxResults=1, fields="*all") |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md`
around lines 12 - 13, The jira_search call using the query "project = X AND
sprint in openSprints() ORDER BY created DESC" can return zero results and block
custom-field discovery; update the logic around jira_search to try the
sprint-scoped query first (jira_search with sprint in openSprints()) and if it
returns no issues, fallback to a sprint-agnostic query such as "project = X
ORDER BY created DESC" (or a combined OR-style query) so field discovery still
proceeds for closed-sprint analysis; ensure this behavior is implemented where
jira_search is invoked so the fallback path runs automatically when no open
sprint issues are found.
Replace generic custom field ID guesses with confirmed field IDs from redhat.atlassian.net, discovered from live tickets. Includes story points priority order (10028 → 10016 → role-specific), issue hierarchy (Feature → Epic → Story/Task/Bug), team field, target version, and sprint_count. Generic discovery instructions retained for other instances. Made-with: Cursor
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (2)
workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md (2)
26-28:⚠️ Potential issue | 🟠 MajorAddress missing language identifier and sprint-dependent query limitation.
Two issues remain from previous reviews:
- Missing language identifier: The fenced code block lacks a language specification (markdownlint MD040).
- Sprint-dependent query blocks field discovery: The query
sprint in openSprints()returns zero results when no active sprint exists, preventing custom field ID discovery for closed-sprint analysis.🔧 Proposed fix
-``` -jira_search("project = X AND sprint in openSprints() ORDER BY created DESC", maxResults=1, fields="*all") +```jql +jira_search("project = X ORDER BY created DESC", maxResults=1, fields="*all")</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md
around lines 26 - 28, The fenced code block is missing a language identifier and
the query uses sprint in openSprints(), which yields no results when no active
sprint exists; update the snippet that calls jira_search to use a project-wide
JQL (e.g., remove the sprint filter so it uses "project = X ORDER BY created
DESC") and mark the fenced block with the language identifier "jql" so linting
(MD040) passes and field discovery works for closed-sprint analysis; locate the
jira_search call in the snippet and apply these two changes.</details> --- `149-151`: _⚠️ Potential issue_ | _🟡 Minor_ **Add language identifier to fenced code block.** The code block is missing a language identifier, which is flagged by markdownlint MD040. <details> <summary>📝 Proposed fix</summary> ```diff -``` +```text New → Backlog → To Do → In Progress → Review → Done / Closed</details> <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md
around lines 149 - 151, The fenced code block containing "New → Backlog → To Do
→ In Progress → Review → Done / Closed" is missing a language identifier
(MD040); update the block start fromtotext so it becomes a ```text
fenced code block, preserving the inner line exactly to satisfy markdownlint and
improve linting/output rendering.</details> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against the current code and only fix it if needed.
Inline comments:
In
@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md:
- Around line 14-18: The fenced code block containing the calls to
jira_search_fields("story point"), jira_search_fields("sprint"), and
jira_search_fields("epic") is missing a language identifier; update the opening
backticks to include the language label (for example jql) so the block becomesthose jira_search_fields examples. - Around line 114-118: The fenced code block containing the Jira hierarchy lines (the triple-backtick block showing "Feature (hierarchy level 2) — RHAISTRAT project..." through "Story / Task / Bug (hierarchy level 0)") lacks a language identifier; update the opening fence from ``` to ```text (or another appropriate language label) so markdownlint MD040 is satisfied and the block is explicitly marked as plain text. --- Duplicate comments: In `@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md`: - Around line 26-28: The fenced code block is missing a language identifier and the query uses sprint in openSprints(), which yields no results when no active sprint exists; update the snippet that calls jira_search to use a project-wide JQL (e.g., remove the sprint filter so it uses "project = X ORDER BY created DESC") and mark the fenced block with the language identifier "jql" so linting (MD040) passes and field discovery works for closed-sprint analysis; locate the jira_search call in the snippet and apply these two changes. - Around line 149-151: The fenced code block containing "New → Backlog → To Do → In Progress → Review → Done / Closed" is missing a language identifier (MD040); update the block start from ``` to ```text so it becomes a ```text fenced code block, preserving the inner line exactly to satisfy markdownlint and improve linting/output rendering.🪄 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: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID:
8d2bfcac-252d-4cb9-a03c-2e5a085a0fff📒 Files selected for processing (1)
workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md
| ``` | ||
| jira_search_fields("story point") | ||
| jira_search_fields("sprint") | ||
| jira_search_fields("epic") | ||
| ``` |
There was a problem hiding this comment.
Add language identifier to fenced code block.
The code block is missing a language identifier, which is flagged by markdownlint MD040.
📝 Proposed fix
-```
+```jql
jira_search_fields("story point")
jira_search_fields("sprint")
jira_search_fields("epic")</details>
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 markdownlint-cli2 (0.22.0)</summary>
[warning] 14-14: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
<details>
<summary>🤖 Prompt for AI Agents</summary>
Verify each finding against the current code and only fix it if needed.
In
@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md
around lines 14 - 18, The fenced code block containing the calls to
jira_search_fields("story point"), jira_search_fields("sprint"), and
jira_search_fields("epic") is missing a language identifier; update the opening
backticks to include the language label (for example jql) so the block becomes
those jira_search_fields examples.
| ``` | ||
| Feature (hierarchy level 2) — RHAISTRAT project, via parent field | ||
| └── Epic (hierarchy level 1) — via parent field or Epic Link | ||
| └── Story / Task / Bug (hierarchy level 0) | ||
| ``` |
There was a problem hiding this comment.
Add language identifier to fenced code block.
The code block is missing a language identifier, which is flagged by markdownlint MD040.
📝 Proposed fix
-```
+```text
Feature (hierarchy level 2) — RHAISTRAT project, via parent field
└── Epic (hierarchy level 1) — via parent field or Epic Link
└── Story / Task / Bug (hierarchy level 0)</details>
<!-- suggestion_start -->
<details>
<summary>📝 Committable suggestion</summary>
> ‼️ **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.
```suggestion
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 114-114: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@workflows/sprint-report/.claude/skills/sprint-report/references/jira-fields.md`
around lines 114 - 118, The fenced code block containing the Jira hierarchy
lines (the triple-backtick block showing "Feature (hierarchy level 2) —
RHAISTRAT project..." through "Story / Task / Bug (hierarchy level 0)") lacks a
language identifier; update the opening fence from ``` to ```text (or another
appropriate language label) so markdownlint MD040 is satisfied and the block is
explicitly marked as plain text.
- Step 0a: explicitly forbid jira_get_all_projects; search directly for the identifier the user provided - Step 0b: lightweight preview with minimal fields (summary, status, assignee) only for item count; defer custom field discovery to Step 1 - Step 0c: clarify approval model — any affirmative response means continue immediately; do not stall or re-confirm - Step 1a: skip discovery for known instances (redhat.atlassian.net); use confirmed IDs from references - Step 1b: clarify this is a full re-fetch, not a duplicate of Step 0b Made-with: Cursor
…angelogs - Step 2: add cycle time calculation guidance using jira_get_issue_sla (pre-computed) and jira_get_issue_dates (status transitions) instead of raw date arithmetic - Step 6: use jira_batch_get_changelogs for targeted changelog fetches instead of expand=changelog on the main query - references/jira-query-patterns.md: document jira_get_issue_sla, jira_get_issue_dates, jira_batch_get_changelogs usage patterns; add "Tools to Avoid" section (jira_get_all_projects, fields=*all, expand=changelog on sprint queries) Made-with: Cursor
Fixes from two independent test runs (AgentOps Sprint 3 + AgentDev Sprint 11): - Fix reference file paths to use workflow-root-relative paths (.claude/skills/sprint-report/references/) instead of skill-relative - Add mixed-team sprint detection in Step 0c with filtering options - Add "Handling Large Responses" section with jq parsing example for when tool output exceeds limits (common with >20 items) - Replace "Do NOT build Python scripts" with realistic scripting policy allowing disposable analysis scripts - Make template usage MANDATORY with explicit chunked-read strategy and emphasis on why custom HTML is forbidden - Add progress bar point calculation guidance - Restructure changelog analysis (Step 6) with explicit when-to-skip and when-to-include criteria - Simplify cycle time to created→resolutiondate fallback as default; jira_get_issue_dates only for optional deep analysis on small sprints - Add issue type and priority fallback strategies to data quality step - Change reference read timing from "when needed" to "read in Step 1a" Made-with: Cursor
Summary
Add a sprint health report workflow that analyzes Jira sprint data across
8 metric dimensions, detects anti-patterns, and produces styled HTML/Markdown
reports with coaching recommendations.
How it works
sprint, team size, item count) and proposes a plan
scope stability, flow efficiency, story sizing, work distribution, blocker
analysis, backlog health, delivery predictability)
items, scope injection, work concentration, and more
coaching notes, and per-item appendix
Architecture
sprint-reportskill with the full analysis pipelineconfirmed Red Hat Jira field IDs)
jira_batch_get_changelogs,jira_get_issue_sla,jira_get_issue_dates) for efficient data retrievalTest plan
Custom Workflow fields
https://github.com/ambient-code/workflows.gitfeature/sprint-reportworkflows/sprint-reportTest scenarios
discover the board/sprint automatically and propose a plan
fields=*all)jira_batch_get_changelogsfor changelog data(not
expand=changelogon the main query)and data quality callout