Skip to content

LCORE-1576: Document feature design process: howtos, templates, skills & CLI tool#1399

Open
max-svistunov wants to merge 9 commits intolightspeed-core:mainfrom
max-svistunov:lcore-1576-feature-design-process
Open

LCORE-1576: Document feature design process: howtos, templates, skills & CLI tool#1399
max-svistunov wants to merge 9 commits intolightspeed-core:mainfrom
max-svistunov:lcore-1576-feature-design-process

Conversation

@max-svistunov
Copy link
Contributor

@max-svistunov max-svistunov commented Mar 25, 2026

LCORE-1576: Document feature design process

Documents the end-to-end process for taking a feature from proposal to filed implementation tickets.

What's in this PR

Contributing guide update (docs/contributing_guide.md):

  • New "Feature design process" section linking to the howtos and templates

Howtos (docs/contributing/):

Templates (docs/contributing/templates/):

AI agent skills (.claude/commands/):

  • /spike — run a design spike
  • /spec-doc — create a feature spec doc
  • /file-jiras — parse proposed JIRAs from a spike doc and file them

JIRA filing tool (dev-tools/file-jiras.sh):

  • Parses JIRA sections from a spike doc
  • Interactive TUI: view, edit, drop, file tickets
  • Duplicate detection before filing
  • Converts markdown to Atlassian Document Format (ADF)

Context

These were developed alongside the LCORE-1311 conversation compaction spike (PR #1328). The spike served as the first use of this process, and examples throughout the howtos reference it.

Closes # LCORE-1576

Summary by CodeRabbit

  • New Features

    • Added an interactive CLI to parse spike documents into per-ticket drafts, validate outputs, and optionally file JIRA sub-tickets.
  • Documentation

    • Added a standardized spike workflow, step-by-step run guide, and PoC organization best practices.
    • Added spec and spike authoring guides plus templates for spec docs, spike PRs, and JIRA tickets.
    • Updated contributing guide with the feature-design process.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 25, 2026

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e90e2a6e-1f1e-4629-ba57-c40fc1457d8d

📥 Commits

Reviewing files that changed from the base of the PR and between b389e03 and c6eadce.

📒 Files selected for processing (1)
  • docs/contributing/templates/spike-pr-template.md
✅ Files skipped from review due to trivial changes (1)
  • docs/contributing/templates/spike-pr-template.md

Walkthrough

Adds Claude command definitions and templates for spikes/specs, contributor how‑tos for running spikes and organizing PoC output, a new dev-tools/file-jiras.sh CLI to parse spike docs and interactively file JIRA sub‑tickets, and updates the contributing guide to link these pieces.

Changes

Cohort / File(s) Summary
Claude Workflow Commands
.claude/commands/spike.md, .claude/commands/spec-doc.md, .claude/commands/file-jiras.md
New Claude command/spec documents describing spike workflows, spec doc generation, and how to parse/file JIRA sub‑tickets from spike docs.
JIRA Automation Script
dev-tools/file-jiras.sh
New CLI that parses a spike markdown into per‑ticket files under /tmp/jiras/, provides interactive view/edit/drop/file commands, converts markdown to Jira ADF, checks for duplicate summaries, and POSTs issues to the Jira REST API (links created to parent).
Spike & PoC How‑Tos
docs/contributing/howto-run-a-spike.md, docs/contributing/howto-organize-poc-output.md
Guides that standardize running time‑boxed spikes, required outputs (spike/spec/optional PoC), PoC artifact organization/naming, and merge‑prep rules.
Spec Authoring Guide
docs/contributing/howto-write-a-spec-doc.md
Adds a spec‑doc how‑to with required sections, architecture/implementation guidance, template usage, and relation to spike docs.
Templates
docs/contributing/templates/spike-template.md, docs/contributing/templates/spec-doc-template.md, docs/contributing/templates/spike-pr-template.md, docs/contributing/templates/jira-ticket-template.md
Adds templates for spike docs, spec docs, spike PRs, and JIRA tickets, including placeholders and agentic/instruction snippets.
Contributing Guide Update
docs/contributing_guide.md
Adds a "Feature design process" section linking spikes, spec docs, templates, and the dev-tools/file-jiras.sh workflow.

Sequence Diagram(s)

sequenceDiagram
    actor Developer
    participant CLI as "file-jiras.sh"
    participant SpikeDoc as "Spike Document (/tmp/jiras/*)"
    participant Editor as "Editor ($EDITOR)"
    participant JIRA as "JIRA REST API"

    Developer->>CLI: sh dev-tools/file-jiras.sh <spike-doc.md> <parent-ticket>
    CLI->>SpikeDoc: parse spike doc -> create `/tmp/jiras/NN-title.md`
    Developer->>CLI: use view/edit/drop commands
    CLI->>Editor: open selected file in $EDITOR
    Developer->>CLI: select `file` to create issues
    CLI->>JIRA: search for duplicates (by summary)
    JIRA-->>CLI: return search results
    CLI->>Developer: prompt about duplicates
    Developer->>CLI: confirm
    CLI->>JIRA: POST /rest/api/3/issue (ADF payload)
    JIRA-->>CLI: 201 Created + issue key
    CLI->>Developer: print created issue URL/key
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately and specifically describes the main change: documenting the feature design process with howtos, templates, agent skills, and a CLI tool.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

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

@max-svistunov
Copy link
Contributor Author

@tisnik Could you PTAL?

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 12

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@dev-tools/file-jiras.sh`:
- Line 1: Replace the POSIX shell shebang with a Bash shebang (e.g. change
"#!/bin/sh" to "#!/usr/bin/env bash") because the script uses Bash-only features
like local declarations (several "local" variables throughout the script);
update the first line accordingly so functions and locales using "local" (and
any other Bash-specific constructs) run under Bash rather than dash.
- Around line 152-169: The duplicate-detection Python snippet in
dev-tools/file-jiras.sh currently swallows all errors and writes '0' to the
count file, treating failures as "no duplicates"; change the exception handler
in the python3 -c block so it writes '-1' to count_file instead of '0', and then
update the shell logic that reads dup_count_file (the check that currently only
tests count > 0) to detect '-1' as an error and abort/raise a visible failure
before proceeding; reference the python snippet, variables
count_file/dup_count_file/dup_check and the surrounding shell check that gates
creating new JIRAs.
- Around line 146-149: The dup_check curl invocation (dup_check=$(curl ...))
currently lacks timeouts and fail handling; update that curl to include -sS
--fail --connect-timeout 10 --max-time 30 so failures surface and the call can't
hang, and also update the other Jira API curl used for ticket creation/status
checking (the second curl in the script that performs the create/request and
whose result is later inspected) to include -sS --connect-timeout 10 --max-time
30 to add timeout protection (and --fail on the create call if you want it to
error on non-2xx responses).
- Around line 292-310: The inline Python payload generation (the payload
variable created by the python3 -c call) embeds shell variables ($title,
$adf_desc) inside a triple-quoted Python string which breaks when titles contain
quotes (e.g., '''), so change the invocation to pass the values as safe
arguments (or via stdin) and consume them in Python via sys.argv (or sys.stdin)
before calling json.dumps; update references to $title and $adf_desc to be
passed as arguments to the python3 process and use sys.argv[1], sys.argv[2] (and
PARENT_TICKET passed similarly or read from env) inside the Python snippet to
build the dict, ensuring proper JSON serialization without embedding unescaped
content into the Python source.

In `@docs/contributing_guide.md`:
- Around line 121-151: Add the new "Feature design process" section to the
top-level Table of Contents by inserting a TOC entry that links to the "##
Feature design process" heading (use the heading text or its generated anchor),
ensuring the entry appears in the same format and position as other section
links; update the TOC block near the top of contributing_guide.md so navigation
includes this section and run any TOC generation/formatting tooling or adjust
anchor syntax to match existing links.

In `@docs/contributing/howto-organize-poc-output.md`:
- Around line 14-23: The fenced code block showing the poc-results directory
tree is missing a language tag; update the block that begins with ``` and
contains the directory tree to use a language hint (e.g., ```text) so markdown
renderers treat it as plain text, by replacing the opening fence with ```text
for the directory-tree block.

In `@docs/contributing/howto-run-a-spike.md`:
- Around line 119-121: Two fenced code blocks in howto-run-a-spike.md (the block
containing the github URL and the checklist block later) are missing a language
identifier which triggers MD040; update each opening triple-backtick to include
a language (e.g., change ``` to ```text) so the URL block (the snippet showing
https://github.com/ORG/REPO/...) and the checklist block (the checklist starting
with "[ ] Branch created off upstream/main") are labeled as text.

In `@docs/contributing/templates/jira-ticket-template.md`:
- Around line 15-18: The fenced code block that contains the lines starting
"Read the \"[section]\" section in docs/design/<feature>/<feature>.md." should
include a language identifier (e.g., use ```text) to satisfy MD040 and improve
editor rendering; update the opening fence from ``` to ```text in the template
snippet so the block becomes a text code fence.

In `@docs/contributing/templates/spec-doc-template.md`:
- Around line 40-42: Replace the language-less fenced code block containing
"TODO: flow diagram" with a language-specified block (for example change the
opening ``` to ```text) so the block reads ```text followed by "TODO: flow
diagram" and closing ```, which will satisfy MD040 and remove the lint warning.

In `@docs/contributing/templates/spike-pr-template.md`:
- Around line 28-29: The footer uses ambiguous GitHub-style syntax "Closes #
LCORE-XXXX" and "Related Issue # LCORE-XXXX"; update the template to avoid
accidental GitHub auto-closing by replacing those lines with an explicit,
unambiguous format such as "Closes: LCORE-XXXX (Jira)" and "Related: LCORE-XXXX
(Jira)" or "Jira: https://<your-jira-host>/browse/LCORE-XXXX" so the intent and
tracker are clear (replace LCORE-XXXX with the actual ticket key).

In `@docs/contributing/templates/spike-template.md`:
- Around line 57-60: The untyped fenced code block in
docs/contributing/templates/spike-template.md (the block containing `Read the
"[section]" section in docs/design/<feature>/<feature>.md.` and `Key files:
[files].`) triggers MD040; update that fenced block to declare a language (e.g.,
change the opening ``` to ```text) so the code fence is typed, keeping the block
content unchanged.
- Around line 68-70: The lone hyphen under the "**Important**: The PoC
diverges..." line is being parsed as a setext underline; locate that heading
text and replace the single "-" placeholder with a non-heading-safe placeholder
such as an explicit bullet like "- (list PoC divergences here)" or an HTML
comment/escaped character (e.g., "<!-- placeholder -->" or "\-") so the line is
not interpreted as a setext heading underline.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a0b0ae59-4620-40ea-81f9-9d43550e14a3

📥 Commits

Reviewing files that changed from the base of the PR and between f5f0ed7 and cbe1ffe.

📒 Files selected for processing (12)
  • .claude/commands/file-jiras.md
  • .claude/commands/spec-doc.md
  • .claude/commands/spike.md
  • dev-tools/file-jiras.sh
  • docs/contributing/howto-organize-poc-output.md
  • docs/contributing/howto-run-a-spike.md
  • docs/contributing/howto-write-a-spec-doc.md
  • docs/contributing/templates/jira-ticket-template.md
  • docs/contributing/templates/spec-doc-template.md
  • docs/contributing/templates/spike-pr-template.md
  • docs/contributing/templates/spike-template.md
  • docs/contributing_guide.md

Comment on lines +28 to +29
Closes # LCORE-XXXX
Related Issue # LCORE-XXXX
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Issue-closing footer syntax is ambiguous for Jira keys.

Closes # LCORE-XXXX looks like GitHub issue syntax but uses a Jira key format.

Proposed fix
-Closes # LCORE-XXXX
-Related Issue # LCORE-XXXX
+Closes LCORE-XXXX
+Related: LCORE-XXXX
📝 Committable suggestion

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

Suggested change
Closes # LCORE-XXXX
Related Issue # LCORE-XXXX
Closes LCORE-XXXX
Related: LCORE-XXXX
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/contributing/templates/spike-pr-template.md` around lines 28 - 29, The
footer uses ambiguous GitHub-style syntax "Closes # LCORE-XXXX" and "Related
Issue # LCORE-XXXX"; update the template to avoid accidental GitHub auto-closing
by replacing those lines with an explicit, unambiguous format such as "Closes:
LCORE-XXXX (Jira)" and "Related: LCORE-XXXX (Jira)" or "Jira:
https://<your-jira-host>/browse/LCORE-XXXX" so the intent and tracker are clear
(replace LCORE-XXXX with the actual ticket key).

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (1)
dev-tools/file-jiras.sh (1)

146-149: ⚠️ Potential issue | 🟠 Major

Duplicate check can still fail open on Jira/API errors.

At Line 148, || echo "{}" turns request failures into “no duplicates”, so the guard at Line 175 won’t trigger and duplicates can be filed.

Suggested fix
-    dup_check=$(curl -sS --connect-timeout 10 --max-time 30 \
+    if ! dup_check=$(curl -sS --fail --connect-timeout 10 --max-time 30 \
         -u "$JIRA_EMAIL:$JIRA_TOKEN" \
-        "$JIRA_INSTANCE/rest/api/3/search/jql?jql=project%3D${project_key}%20AND%20summary~%22${url_title}%22&fields=key,summary&maxResults=5" 2>/dev/null || echo "{}")
+        "$JIRA_INSTANCE/rest/api/3/search/jql?jql=project%3D${project_key}%20AND%20summary~%22${url_title}%22&fields=key,summary&maxResults=5" 2>/dev/null); then
+        echo "  Duplicate check request failed; skipping ticket for safety." >&2
+        return 1
+    fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dev-tools/file-jiras.sh` around lines 146 - 149, The current curl call that
populates dup_check swallows errors with "|| echo \"{}\"", causing API failures
to be treated as "no duplicates"; change this so failures don't fail open:
remove the "|| echo \"{}\"" fallback, capture curl's exit status (e.g., run curl
into dup_check and check $? or use a temp file), and if curl fails log the error
and exit non-zero (or set an explicit error flag) instead of proceeding to the
duplicate-creation guard; reference the dup_check variable and the duplicate
guard logic that checks dup_check to ensure API errors abort or are handled as
failures rather than as "no duplicates."
🧹 Nitpick comments (1)
dev-tools/file-jiras.sh (1)

106-106: Replace ls-based parsing to address SC2012 and improve robustness.

Line 106 (ls ... | wc -l) and Line 133 (ls ... | sed -n) are brittle; use find + sort for deterministic and safe handling.

Suggested fix
-TICKET_COUNT=$(ls "$JIRA_DIR"/*.md 2>/dev/null | wc -l)
+TICKET_COUNT=$(find "$JIRA_DIR" -maxdepth 1 -type f -name '*.md' | wc -l)
@@
 get_file_by_number() {
-    ls "$JIRA_DIR"/*.md 2>/dev/null | sed -n "${1}p"
+    find "$JIRA_DIR" -maxdepth 1 -type f -name '*.md' | sort | sed -n "${1}p"
 }

Also applies to: 133-133

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dev-tools/file-jiras.sh` at line 106, Replace brittle ls parsing: for
TICKET_COUNT assignment (and the later listing logic around the code that uses
sed -n) use find with -maxdepth 1 and -type f -name '*.md' to robustly discover
files, pipe through sort for deterministic ordering before counting or
processing, and then use wc -l (or handle null-delimited output where
appropriate) instead of relying on ls output; update the TICKET_COUNT assignment
and the listing/sed-using block to use find ... | sort so filenames with
spaces/newlines or edge cases are handled safely.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@dev-tools/file-jiras.sh`:
- Around line 393-404: The call to launch the editor uses an unquoted expansion
of the files variable which breaks on filenames with spaces/special chars; in
the block that builds files via get_file_by_number and variable files, either
change files to be an array (e.g., append each resolved f to an array and invoke
$editor "${files[@]}") or, if keeping a single string, quote the expansion when
invoking the editor (use "$files") and ensure filenames are joined with proper
spacing/escaping; update the invocation in the branch containing files and the
surrounding logic that populates files (references: files variable,
get_file_by_number, and $editor) so filenames with spaces are preserved.
- Around line 120-125: The loop over "$JIRA_DIR"/*.md can break when no files
match because the glob expands to a literal string under set -euo pipefail;
update the logic used by show_summary (and the loop using JIRA_DIR and head -1)
to handle an empty directory: either enable and later disable nullglob around
the loop (shopt -s nullglob/shopt -u nullglob) or build an array from the glob,
check if its length is zero and skip printing; ensure the code checks for no
matches before calling head -1/printf so the script doesn’t exit when all .md
files are dropped.

---

Duplicate comments:
In `@dev-tools/file-jiras.sh`:
- Around line 146-149: The current curl call that populates dup_check swallows
errors with "|| echo \"{}\"", causing API failures to be treated as "no
duplicates"; change this so failures don't fail open: remove the "|| echo
\"{}\"" fallback, capture curl's exit status (e.g., run curl into dup_check and
check $? or use a temp file), and if curl fails log the error and exit non-zero
(or set an explicit error flag) instead of proceeding to the duplicate-creation
guard; reference the dup_check variable and the duplicate guard logic that
checks dup_check to ensure API errors abort or are handled as failures rather
than as "no duplicates."

---

Nitpick comments:
In `@dev-tools/file-jiras.sh`:
- Line 106: Replace brittle ls parsing: for TICKET_COUNT assignment (and the
later listing logic around the code that uses sed -n) use find with -maxdepth 1
and -type f -name '*.md' to robustly discover files, pipe through sort for
deterministic ordering before counting or processing, and then use wc -l (or
handle null-delimited output where appropriate) instead of relying on ls output;
update the TICKET_COUNT assignment and the listing/sed-using block to use find
... | sort so filenames with spaces/newlines or edge cases are handled safely.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f27c2d1a-4ea8-43e5-9e1b-ae7cdd2a5dc2

📥 Commits

Reviewing files that changed from the base of the PR and between cbe1ffe and 6bc3f81.

📒 Files selected for processing (1)
  • dev-tools/file-jiras.sh

Comment on lines +393 to +404
files=""
for n in $(echo "$args" | tr ',' ' '); do
f=$(get_file_by_number "$n")
if [ -n "$f" ]; then
files="$files $f"
else
echo " No ticket #$n"
fi
done
if [ -n "$files" ]; then
$editor $files
fi
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

cd dev-tools && head -410 file-jiras.sh | tail -30 | cat -n

Repository: lightspeed-core/lightspeed-stack

Length of output: 1212


🏁 Script executed:

# Find the exact file and verify lines 393-404
git ls-files | grep -E 'file-jiras\.sh$'

Repository: lightspeed-core/lightspeed-stack

Length of output: 99


🏁 Script executed:

# Read the specific lines to verify
sed -n '393,404p' dev-tools/file-jiras.sh | cat -n

Repository: lightspeed-core/lightspeed-stack

Length of output: 585


🏁 Script executed:

# Get more context - read lines 380-410 to understand the function better
sed -n '380,410p' dev-tools/file-jiras.sh | cat -n

Repository: lightspeed-core/lightspeed-stack

Length of output: 1266


Unquoted file list in editor call breaks with filenames containing spaces or special characters (SC2086).

At line 403, $editor $files expands without quotes, causing word-splitting that breaks edge-case filenames. The "all" case on line 388 correctly quotes the glob pattern ("$JIRA_DIR"/*.md), but this branch lacks the same protection.

Suggested fix
-                files=""
+                files=()
                 for n in $(echo "$args" | tr ',' ' '); do
                     f=$(get_file_by_number "$n")
                     if [ -n "$f" ]; then
-                        files="$files $f"
+                        files+=("$f")
                     else
                         echo "  No ticket #$n"
                     fi
                 done
-                if [ -n "$files" ]; then
-                    $editor $files
+                if [ ${`#files`[@]} -gt 0 ]; then
+                    $editor "${files[@]}"
                 fi
🧰 Tools
🪛 GitHub Actions: Shell check

[warning] 403-403: ShellCheck (SC2086): Double quote to prevent globbing and word splitting. Suggestion: "$editor "$files"".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dev-tools/file-jiras.sh` around lines 393 - 404, The call to launch the
editor uses an unquoted expansion of the files variable which breaks on
filenames with spaces/special chars; in the block that builds files via
get_file_by_number and variable files, either change files to be an array (e.g.,
append each resolved f to an array and invoke $editor "${files[@]}") or, if
keeping a single string, quote the expansion when invoking the editor (use
"$files") and ensure filenames are joined with proper spacing/escaping; update
the invocation in the branch containing files and the surrounding logic that
populates files (references: files variable, get_file_by_number, and $editor) so
filenames with spaces are preserved.

Copy link
Contributor

@tisnik tisnik left a comment

Choose a reason for hiding this comment

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

LGTM

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
dev-tools/file-jiras.sh (1)

269-271: Code block parsing strips language specifier incorrectly.

para.strip("")removes all leading/trailing backticks character-by-character. For a block like `` ```python\ncode\n``` ``, the result ispython\ncodeinstead of justcode`, including the language specifier in the code text.

This is a minor limitation for the current use case (simple JIRA descriptions), but worth noting if code blocks with language specs are common in spike docs.

Potential fix (optional)
     # Code block
     if para.startswith("```"):
-        code = para.strip("`").strip()
+        lines = para.split('\n')
+        # Remove opening fence (```lang) and closing fence (```)
+        code_lines = lines[1:-1] if lines[-1].strip().startswith("```") else lines[1:]
+        code = '\n'.join(code_lines)
         return {"type": "codeBlock", "content": [{"type": "text", "text": code}]}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dev-tools/file-jiras.sh` around lines 269 - 271, The codeBlock parsing
currently uses para.strip("`") which removes backticks and can leave the
language specifier (e.g., "python") in the captured code; change the logic in
the para.startswith("```") branch to split para into lines, drop the first line
(the opening fence, which may include a language token) and drop the final fence
if present, then join the remaining lines into code and assign to the existing
code variable before returning the {"type":"codeBlock"...} object; update the
code variable creation (referencing para and code) so opening/closing fences and
any language token are removed rather than stripped character-by-character.
docs/contributing/templates/spike-template.md (1)

37-41: Heading level jump (h1→h3) is intentional for tooling compatibility, consider documenting.

The ### LCORE-???? heading on line 41 jumps from h1 (# Proposed JIRAs) to h3, triggering MD001. This is intentional—dev-tools/file-jiras.sh parses exactly ^### (LCORE-\?{4}.*?)$ to extract JIRA sections.

Options:

  1. Add a markdown lint disable comment to suppress the warning
  2. Add a brief HTML comment explaining the h3 is required by the filing tool
Option 1: Suppress lint
 # Proposed JIRAs

 TODO: One subsection per JIRA. Each JIRA's agentic tool instruction should point to the spec doc (the permanent reference), not this spike doc.

+<!-- markdownlint-disable-next-line MD001 -->
 ### LCORE-???? TODO fill in title
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/contributing/templates/spike-template.md` around lines 37 - 41, The
h1→h3 heading jump under "# Proposed JIRAs" (the line with "### LCORE-???? TODO
fill in title") intentionally triggers MD001 because dev-tools/file-jiras.sh
expects exact "### (LCORE-????...)" headings; fix by adding either a
markdownlint disable comment (e.g., <!-- markdownlint-disable MD001 --> before
the h3 and re-enable after) or a brief HTML comment immediately above the h3
documenting that the h3 is required by dev-tools/file-jiras.sh so reviewers and
linters understand the exception; update the template near the "### LCORE-????"
line accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@dev-tools/file-jiras.sh`:
- Around line 269-271: The codeBlock parsing currently uses para.strip("`")
which removes backticks and can leave the language specifier (e.g., "python") in
the captured code; change the logic in the para.startswith("```") branch to
split para into lines, drop the first line (the opening fence, which may include
a language token) and drop the final fence if present, then join the remaining
lines into code and assign to the existing code variable before returning the
{"type":"codeBlock"...} object; update the code variable creation (referencing
para and code) so opening/closing fences and any language token are removed
rather than stripped character-by-character.

In `@docs/contributing/templates/spike-template.md`:
- Around line 37-41: The h1→h3 heading jump under "# Proposed JIRAs" (the line
with "### LCORE-???? TODO fill in title") intentionally triggers MD001 because
dev-tools/file-jiras.sh expects exact "### (LCORE-????...)" headings; fix by
adding either a markdownlint disable comment (e.g., <!-- markdownlint-disable
MD001 --> before the h3 and re-enable after) or a brief HTML comment immediately
above the h3 documenting that the h3 is required by dev-tools/file-jiras.sh so
reviewers and linters understand the exception; update the template near the
"### LCORE-????" line accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ca42ead3-aea1-4cc4-ac87-bd56eece1518

📥 Commits

Reviewing files that changed from the base of the PR and between 6bc3f81 and 00077af.

📒 Files selected for processing (8)
  • dev-tools/file-jiras.sh
  • docs/contributing/howto-organize-poc-output.md
  • docs/contributing/howto-run-a-spike.md
  • docs/contributing/howto-write-a-spec-doc.md
  • docs/contributing/templates/jira-ticket-template.md
  • docs/contributing/templates/spec-doc-template.md
  • docs/contributing/templates/spike-template.md
  • docs/contributing_guide.md
✅ Files skipped from review due to trivial changes (6)
  • docs/contributing/templates/jira-ticket-template.md
  • docs/contributing_guide.md
  • docs/contributing/howto-organize-poc-output.md
  • docs/contributing/templates/spec-doc-template.md
  • docs/contributing/howto-write-a-spec-doc.md
  • docs/contributing/howto-run-a-spike.md

Copy link
Contributor

@anik120 anik120 left a comment

Choose a reason for hiding this comment

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

Great stuff 👍🏽


**Description**: TODO

**Scope**: TODO
Copy link
Contributor

Choose a reason for hiding this comment

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

What do we expect to write in Scope, that is not already written in Description?

Or is this section supposed to be Out of Scope to explicitly state what's out of scope for this task?

I don't see this section in the example compaction-conversation.md doc either.


```text
Read the "[section]" section in docs/design/<feature>/<feature>.md.
Key files: [files].
Copy link
Contributor

Choose a reason for hiding this comment

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

Is this "key files in the project" or something else?

@anik120 anik120 mentioned this pull request Mar 25, 2026
19 tasks
Copy link
Contributor

Choose a reason for hiding this comment

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

what type of ticket is this template is supposed to be applied to? Feature? Epic? Story?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants