Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
206 commits
Select commit Hold shift + click to select a range
700c360
perf: optimize startup performance with metadata tracking and update …
djm81 Jan 27, 2026
4b167dd
Merge branch 'main' into dev
djm81 Jan 27, 2026
e4782ea
fix: add missing ADO field mappings and assignee display (#145)
djm81 Jan 27, 2026
a2f6ac7
Merge branch 'main' into dev
djm81 Jan 27, 2026
c74a773
fix: mitigate code scanning vulnerabilities (#148)
djm81 Jan 27, 2026
af030dc
fix: detect GitHub remotes using ssh:// and git:// URLs
djm81 Jan 27, 2026
db827a0
chore: bump version to 0.26.9 and update changelog
djm81 Jan 27, 2026
1ade334
Merge branch 'main' into dev
djm81 Jan 27, 2026
5c1cb41
fix: compare GitHub SSH hostnames case-insensitively
djm81 Jan 27, 2026
68cc345
Merge branch 'main' into dev
djm81 Jan 27, 2026
dfeb7ca
Add openspec and workflow commands for transparency
djm81 Jan 27, 2026
9e1f22d
Add specs from openspec
djm81 Jan 27, 2026
115e402
Remove aisp change which wasn't implemented
djm81 Jan 27, 2026
2675361
Fix openspec gitignore pattern
djm81 Jan 27, 2026
573fb7b
Update gitignore
djm81 Jan 27, 2026
907501e
Update contribution standards to use openspec for SDD
djm81 Jan 27, 2026
568000c
Merge branch 'main' into dev
djm81 Jan 27, 2026
fe082f6
Migrate to new opsx openspec commands
djm81 Jan 27, 2026
036afbe
Migrate workflow and openspec config
djm81 Jan 28, 2026
5a1493f
fix: bump version to 0.26.10 for PyPI publish
djm81 Jan 28, 2026
da606a1
Update version and changelog
djm81 Jan 28, 2026
608f317
Add canonical user-friendly workitem url for ado workitems
djm81 Jan 28, 2026
719256c
Update to support OSPX
djm81 Jan 28, 2026
1f94d7c
Merge branch 'main' into dev
djm81 Jan 28, 2026
bbf730a
feat(backlog): implement refine --import-from-tmp and fix type-check …
djm81 Jan 28, 2026
080743a
Merge branch 'main' into dev
djm81 Jan 28, 2026
5ab46a5
Merge branch 'main' into dev
djm81 Jan 28, 2026
1cdfc66
feat: debug logs under ~/.specfact/logs and release 0.26.13 (#159)
djm81 Jan 29, 2026
6bd9d7f
Potential fix for pull request finding 'Empty except'
djm81 Jan 29, 2026
d7d194b
Fix unused variable review
djm81 Jan 29, 2026
39563fc
Fix unused variable review
djm81 Jan 29, 2026
d15485a
Fix type and test errors
djm81 Jan 29, 2026
6c9c9b9
Merge branch 'main' into dev
djm81 Jan 29, 2026
bd9b96a
Finalize change
djm81 Jan 29, 2026
c7e4546
Change for debug logs archived
djm81 Jan 29, 2026
09e8040
Merge branch 'main' into dev
djm81 Jan 29, 2026
642e1a9
fix: improve ADO backlog refine error logging and user-facing error U…
djm81 Jan 29, 2026
64365db
Merge branch 'main' into dev
djm81 Jan 29, 2026
0d0abba
feat: backlog refine --ignore-refined and --id, startup docs (fixes #…
djm81 Jan 30, 2026
aad02cd
Add change proposals for full scrum support
djm81 Jan 30, 2026
a3c3fb4
Merge branch 'main' into dev
djm81 Jan 30, 2026
1f054c5
Add support for systematic, structured issue creation with copilot help
djm81 Jan 30, 2026
899b9c2
feat(backlog): daily standup defaults, iteration/sprint, unassigned i…
djm81 Feb 3, 2026
b596766
Issue 179 resolution (#180)
djm81 Feb 3, 2026
bb7214f
Merge branch 'main' into dev
djm81 Feb 3, 2026
61a820c
fix(backlog): address CodeQL/Codex PR 181 findings
djm81 Feb 3, 2026
10fee30
Update openspec enforcement rules
djm81 Feb 3, 2026
8e770dc
Structure openspec changes
djm81 Feb 3, 2026
5782860
Fix ruff finding
djm81 Feb 3, 2026
05c592d
Fix linter issues with StrEnum and parameters
djm81 Feb 3, 2026
f7e3d0f
Fix tests and depcreation warnings
djm81 Feb 3, 2026
15d710b
Improve sync script
djm81 Feb 3, 2026
b223161
Merge branch 'main' into dev
djm81 Feb 3, 2026
870db6a
Add change for modular command registry
djm81 Feb 3, 2026
5404c18
Fix review finding on dev sync script
djm81 Feb 3, 2026
e4650dd
Update modular change proposal
djm81 Feb 4, 2026
c44013e
feat: CLI modular command registry and lazy load (arch-01) (#196)
djm81 Feb 4, 2026
542183c
docs: document CLI modules design; sync version and cleanup
djm81 Feb 4, 2026
c4b10d8
Archive modular change and specs
djm81 Feb 4, 2026
a7a83c2
Merge branch 'main' into dev
djm81 Feb 4, 2026
2faf547
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 4, 2026
b5d2680
Fix banner display on help screen
djm81 Feb 4, 2026
077ff3f
Improve action runner on main
djm81 Feb 4, 2026
7567149
Merge branch 'main' into dev
djm81 Feb 4, 2026
8a0a38f
Setup claude skills and instructions
djm81 Feb 5, 2026
336efb5
feat: module package separation for command implementations (#200)
djm81 Feb 6, 2026
ad023f5
Merge branch 'main' into dev
djm81 Feb 6, 2026
8b4adcb
fix: address CodeQL and Codex review findings from PR #201
djm81 Feb 6, 2026
b44ce9c
Merge branch 'main' into dev
djm81 Feb 6, 2026
a6b9d32
feat: module lifecycle management, init split, and interactive module…
djm81 Feb 6, 2026
de89bba
archived change for module improvements
djm81 Feb 6, 2026
b4edcfb
Merge branch 'main' into dev
djm81 Feb 6, 2026
bc71080
fix: address review feedback in init and boundary tests
djm81 Feb 6, 2026
e5d7002
Fix test setup for tmpfiles
djm81 Feb 6, 2026
c97080b
Merge branch 'main' into dev
djm81 Feb 6, 2026
46b1357
docs: add openspec change arch-05 bridge registry (#210)
djm81 Feb 8, 2026
20410a6
docs: add openspec change arch-06 manifest security (#211)
djm81 Feb 8, 2026
04aba4b
feat: Core Contracts and Module Interface Formalization (#209)
djm81 Feb 8, 2026
0f492f6
Update specs and archive arch-04 change
djm81 Feb 8, 2026
7656d7c
Fix changelog format
djm81 Feb 8, 2026
b826fb6
docs: align arch-05 scope with protocol migration cleanup (#212)
djm81 Feb 8, 2026
c8ec9bb
docs: add OpenSpec changes for module marketplace phases
djm81 Feb 9, 2026
b6e1fe1
feat: apply arch-05 bridge registry implementation (#216)
djm81 Feb 10, 2026
f10e14e
Archive arch-05 change after implementation
djm81 Feb 10, 2026
285a9ff
Merge branch 'main' into dev
djm81 Feb 10, 2026
5075d0c
fix: address post-merge review findings and restore lazy registration
djm81 Feb 10, 2026
31e6924
fix: refresh project console per invocation in tests
djm81 Feb 10, 2026
d7ca6af
fix: detect runtime interface protocol ops in source scan
djm81 Feb 10, 2026
0e5463f
fix: harden project console refresh and protocol source scan
djm81 Feb 10, 2026
57c729b
fix: refresh import command console for each invocation
djm81 Feb 10, 2026
e270e09
fix: resolve type-check errors and harden protocol scanning
djm81 Feb 10, 2026
7cc1c48
fix: stabilize module protocol scan and project console lifecycle
djm81 Feb 10, 2026
5996a1d
Merge branch 'main' into dev
djm81 Feb 10, 2026
81527a5
Refine pending changes for new modular ecosystem and marketplace inte…
djm81 Feb 10, 2026
6fd151a
fix: update stale spec-delta paths in tasks.md after change renames
djm81 Feb 10, 2026
22640fa
docs: rewrite CHANGE_ORDER.md for module-scoped changes and full depe…
djm81 Feb 10, 2026
e7d69d6
Merge branch 'main' into dev
djm81 Feb 10, 2026
9a7f9f6
feat(backlog): daily/refine comment context, interactive standup post…
djm81 Feb 11, 2026
e61d56b
fix(backlog): satisfy interactive daily adapter typing
djm81 Feb 11, 2026
fff65e9
fix(backlog): bypass default daily limit for issue-window flags
djm81 Feb 11, 2026
b2a8ab5
Merge branch 'main' into dev
djm81 Feb 11, 2026
88ea93c
fix: parse backlog refine writeback fields and refactor refine comman…
djm81 Feb 12, 2026
f3c5759
fix: avoid raw label fallback when description block is missing
djm81 Feb 12, 2026
f9f2fcc
Merge branch 'main' into dev
djm81 Feb 12, 2026
1870cfe
fix: harden backlog refine prompt scaffold and mixed-format parsing (…
djm81 Feb 12, 2026
16db526
Finish change
djm81 Feb 12, 2026
a3e8ff2
chore: bump version to 0.30.4 and update changelog
djm81 Feb 12, 2026
1bdcbc9
Merge branch 'main' into dev
djm81 Feb 12, 2026
998ab59
Add MEMORY.md for claude code
djm81 Feb 12, 2026
bedf75c
Archive backlog writeback field split change
djm81 Feb 12, 2026
6e66806
Archived flask support sidecar change
djm81 Feb 12, 2026
7d6c550
feat: add backlog-core module β€” dependency analysis and command suite…
djm81 Feb 13, 2026
4d1f950
Merge branch 'main' into dev
djm81 Feb 13, 2026
47ea3f4
fix(backlog-core): remove unused module io contract global
djm81 Feb 13, 2026
2509412
Fixed conflict
djm81 Feb 14, 2026
d8d17a5
fix: rename LICENSE.md to LICENSE for GitHub license detection (#233)
djm81 Feb 14, 2026
100c94f
fix: restore standard Apache 2.0 license text for GitHub detection (#…
djm81 Feb 14, 2026
002cf19
Merge branch 'main' into dev
djm81 Feb 14, 2026
ee0b766
Add openspec changes for architecture level enhancement
djm81 Feb 15, 2026
540c96a
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 15, 2026
ea430ab
Merge branch 'main' into dev
djm81 Feb 15, 2026
6dc73ca
Merge branch 'main' into dev
djm81 Feb 16, 2026
d621e91
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 16, 2026
1b06427
feat(ci): attach test and repro log artifacts to PR orchestrator runs…
djm81 Feb 16, 2026
0bc52a5
feat: enhanced module manifest security and integrity (arch-06) (#263)
djm81 Feb 16, 2026
3f09ee7
feat: Schema Extension System for Modular ProjectBundle Extensions (a…
djm81 Feb 16, 2026
e959e61
Merge branch 'main' into dev
djm81 Feb 16, 2026
ba08744
Fix codeql findings
djm81 Feb 16, 2026
a3a3b6a
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 16, 2026
87a499f
Merge branch 'main' into dev
djm81 Feb 17, 2026
faf3b2e
feat(workflow): standardize worktree-first development flow (#268)
djm81 Feb 17, 2026
5c72c9f
Fix review finding
djm81 Feb 17, 2026
c51e96e
Merge branch 'main' into dev
djm81 Feb 17, 2026
deb176a
feat: implement policy-engine-01 unified policy framework (#270)
djm81 Feb 18, 2026
22a19a9
fix: harden policy module imports and snapshot path resolution
djm81 Feb 18, 2026
2724dbd
Merge branch 'main' into dev
djm81 Feb 18, 2026
1970266
Update backlog core change to cover workspace level modules
djm81 Feb 18, 2026
806f765
feat(init): align init module discovery with registry (backlog-core-0…
djm81 Feb 18, 2026
87dafba
feat: add thorough codebase validation (validation-01, #163) (#272)
djm81 Feb 18, 2026
1aac44f
feat: add patch apply (local + --write with confirmation) [#177] (#273)
djm81 Feb 18, 2026
d835ffb
feat: add bundle-mapper module (bundle-mapper-01, #121) (#274)
djm81 Feb 18, 2026
85576de
Archive finished changes
djm81 Feb 18, 2026
94a8ed1
fix: implement verification-01 wave1 delta closure (#277)
djm81 Feb 18, 2026
0f4a77c
Archive delta validation change and update specs
djm81 Feb 18, 2026
e2c93d1
Update patch version
djm81 Feb 18, 2026
c1c41f5
Potential fix for pull request finding 'Empty except'
djm81 Feb 19, 2026
27063ba
apply review fixes
djm81 Feb 19, 2026
6350aa8
Merge branch 'main' into dev
djm81 Feb 19, 2026
767d5b8
Add cli validation changes
djm81 Feb 19, 2026
3f4e1a3
Merge branch 'main' into dev
djm81 Feb 19, 2026
4f4b2ff
feat: launch central module marketplace lifecycle (#287)
djm81 Feb 21, 2026
78ddf06
Merge branch 'main' into dev
djm81 Feb 21, 2026
6772f0a
fix: resolve bundle-mapper review defects with TDD evidence (#290)
djm81 Feb 22, 2026
4529df1
feat:Add architecture review docs and findings to mitigate
djm81 Feb 22, 2026
cc50388
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 22, 2026
53a0fce
feat(backlog): add backlog add for interactive issue creation (#289)
djm81 Feb 22, 2026
c651c42
chore(openspec): archive completed changes and align architecture doc…
djm81 Feb 22, 2026
d7e8199
docs(change): Archive architecture discrepancy remediation change
djm81 Feb 22, 2026
aa4a9fb
fix(codeql): preserve module contract marker and document fallback ex…
djm81 Feb 22, 2026
176cd09
Merge branch 'main' into dev
djm81 Feb 22, 2026
30e2bbe
fix(backlog): restore installed-runtime discovery parity and add back…
djm81 Feb 23, 2026
9f479e4
fix(version): sync manifests to 0.36.1 and archive backlog-core-04 (#…
djm81 Feb 23, 2026
37a4a30
Merge branch 'main' into dev
djm81 Feb 23, 2026
991d568
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 23, 2026
15194b8
fix: harden module lifecycle bootstrap and signing workflows (#299)
djm81 Feb 24, 2026
a819852
test: simplify monkeypatch callables in module_security tests
djm81 Feb 24, 2026
67cd7e9
Merge branch 'main' into dev
djm81 Feb 24, 2026
078012f
Fix duplicate with statement
djm81 Feb 24, 2026
fa0604a
Merge branch 'main' into dev
djm81 Feb 24, 2026
c3f5bb6
chore(release): bump to v0.37.1 and harden signature gates
djm81 Feb 24, 2026
c0692e9
test: fix init command regression assertions
djm81 Feb 24, 2026
7787ba7
Merge branch 'main' into dev
djm81 Feb 24, 2026
db8d153
fix: release v0.37.2 with runtime crypto deps
djm81 Feb 24, 2026
cce4cf7
fix: address signature-backend warning and module version drift
djm81 Feb 24, 2026
297fb6c
fix: use hatch build in PyPI publish workflow script (#304)
djm81 Feb 24, 2026
e63669c
Merge branch 'main' into dev
djm81 Feb 24, 2026
dad2381
fix: resolve startup module freshness home path dynamically (#306)
djm81 Feb 24, 2026
0e1ac55
Merge branch 'main' into dev
djm81 Feb 24, 2026
764e5c9
Merge branch 'main' into dev
djm81 Feb 24, 2026
fa8708c
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 24, 2026
5d90ced
fix: harden module signing workflow and reduce startup log noise
djm81 Feb 24, 2026
276830e
test: align module migration compatibility with decoupled module vers…
djm81 Feb 24, 2026
effd96f
fix: fail fast on invalid base ref in changed-only module signing
djm81 Feb 24, 2026
798fc1a
fix: stabilize module precedence and backlog github mapping flow
djm81 Feb 25, 2026
f72d6e8
merge: resolve main into dev and retain module/backlog updates
djm81 Feb 25, 2026
c6a05f5
fix(module-registry): persist disables and correct bundled availability
djm81 Feb 25, 2026
c9db837
Re-sign module registry and fix / ignore local temp artifacts
djm81 Feb 25, 2026
db4da83
bump module registry version to 0.1.3
djm81 Feb 25, 2026
48ae89b
fix(registry): restore protocol reporting logs in debug mode
djm81 Feb 25, 2026
c87c2d0
Merge branch 'main' into dev
djm81 Feb 25, 2026
619f2a3
fix(backlog): harden refine writeback, prompts, and any-filter semant…
djm81 Feb 25, 2026
818dd32
fix(hooks,ado): correct format gate and enforce iteration on direct
djm81 Feb 25, 2026
954ff76
Apply review findings and fix tests
djm81 Feb 26, 2026
9825acd
Merge branch 'main' into dev
djm81 Feb 26, 2026
27b4078
Pin virtualenv < 21 to avoid incaopatibility failure
djm81 Feb 26, 2026
f9e9d74
Merge branch 'main' into dev
djm81 Feb 26, 2026
567a303
fix: finalize backlog-core-06 ado comment API versioning (#314)
djm81 Feb 26, 2026
a95e89f
feat: Advanced marketplace features (marketplace-02) - dependency res…
djm81 Feb 27, 2026
4a0620a
Merge branch 'main' into dev
djm81 Feb 27, 2026
c5635c9
fix: complete marketplace publish registry PR flow and bump (#320)
djm81 Feb 27, 2026
4ec9bdc
Merge branch 'main' into dev
djm81 Feb 27, 2026
f48631d
fix: update init ide hint and repair publish workflow
djm81 Feb 27, 2026
37d8475
Merge branch 'main' into dev
djm81 Feb 27, 2026
8be301e
feat(backlog): normalize daily summarize Markdown output (#323)
djm81 Feb 27, 2026
a6dcab0
Update version
djm81 Feb 27, 2026
0b99c6c
Merge branch 'dev' of https://github.com/nold-ai/specfact-cli into dev
djm81 Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ All notable changes to this project will be documented in this file.
**Important:** Changes need to be documented below this block as this is the header section. Each section should be separated by a horizontal rule. Newer changelog entries need to be added on top of prior ones to keep the history chronological with most recent changes first.


---

## [0.38.2] - 2026-02-27

### Added

- **Daily standup summarize: Markdown-only output** (OpenSpec change `backlog-scrum-05-summarize-markdown-output`): `specfact backlog ceremony standup --summarize` and `--summarize-to <path>` now normalize backlog item bodies and comments to Markdown-only text (no raw HTML tags or entities from ADO/GitHub). In an interactive TTY, the summarize prompt is rendered with Rich Markdown; in CI or non-interactive environments, plain Markdown is emitted. Ensures standup summary prompts are readable for humans and LLMs.

### Changed

- Tutorial and agile guide docs updated to describe Markdown-only normalization and interactive vs CI behavior for `--summarize` / `--summarize-to`.

---

## [0.38.1] - 2026-02-27
Expand Down
28 changes: 28 additions & 0 deletions docs/adapters/github.md
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,34 @@ When validation completes, results are automatically reported to GitHub Issues:

## CLI Usage

### Export OpenSpec change to GitHub (create issue + Source Tracking)

To create a GitHub issue from an OpenSpec change and have the issue number/URL written back into `proposal.md` (Source Tracking section), run from the repository that contains `openspec/changes/`:

```bash
# Export one or more changes; creates issues and updates proposal.md Source Tracking
specfact sync bridge --adapter github --mode export-only \
--repo . \
--repo-owner nold-ai \
--repo-name specfact-cli \
--change-ids <change-id>

# Example: export backlog-scrum-05-summarize-markdown-output
specfact sync bridge --adapter github --mode export-only \
--repo . \
--repo-owner nold-ai \
--repo-name specfact-cli \
--change-ids backlog-scrum-05-summarize-markdown-output
```

- **`--repo .`**: Path to the repo with `openspec/changes/` (default is current directory).
- **`--repo-owner` / `--repo-name`**: Target GitHub repo for new issues.
- **`--change-ids`**: Comma-separated change IDs to export (omit to export all active proposals).

After a successful run, each change’s `openspec/changes/<change-id>/proposal.md` will contain a **Source Tracking** block with the new issue number and URL. Use that section to link the PR and keep backlog in sync.

For public repos, add `--sanitize` when exporting so content is sanitized before creating issues. See [DevOps Adapter Integration](../guides/devops-adapter-integration.md) and the [sync bridge command reference](../reference/commands.md#sync-bridge).

### Updating Archived Change Proposals

When you improve comment logic or branch detection, use `--include-archived` to update existing GitHub issues for archived proposals:
Expand Down
17 changes: 11 additions & 6 deletions docs/getting-started/tutorial-daily-standup-sprint-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ Preferred command path is `specfact backlog ceremony standup ...`. The legacy `s
the adapter supports fetching comments
- Use **`--summarize`** or **`--summarize-to <path>`** to output a **prompt** (instruction + filter context
+ standup data) for a slash command (e.g. `specfact.daily`) or copy-paste to Copilot to **generate a
standup summary**; add **`--comments`**/**`--annotations`** to include comment annotations in the prompt
standup summary**; add **`--comments`**/**`--annotations`** to include comment annotations in the prompt.
The prompt content is always **normalized to Markdown-only text** (no raw HTML tags or HTML entities) so
ADO-style HTML descriptions/comments and GitHub/Markdown content render consistently.
- Use the **`specfact.backlog-daily`** (or `specfact.daily`) slash prompt for interactive walkthrough with the DevOps team story-by-story (focus, issues, open questions, discussion notes as comments)
- Filter by **`--assignee`**, **`--sprint`** / **`--iteration`**, **`--search`**, **`--release`**, **`--id`**, **`--first-issues`** / **`--last-issues`**, **`--blockers-first`**, and optional **`--suggest-next`**

Expand Down Expand Up @@ -142,18 +144,21 @@ the standup table (state, assignee, limit, etc.).
To get a **prompt** you can paste into Copilot or feed to a slash command (e.g. `specfact.daily`) so an AI can **generate a short standup summary** (e.g. "Today: 3 in progress, 1 blocked, 2 pending commitment"):

```bash
# Print prompt to stdout (copy-paste to Copilot)
# Print prompt to stdout (copy-paste to Copilot). In an interactive terminal, SpecFact renders a
# Markdown-formatted view; in CI/non-interactive environments the same normalized Markdown is printed
# without ANSI formatting.
specfact backlog ceremony standup github --summarize --comments

# Write prompt to a file (e.g. for slash command)
# Write prompt to a file (e.g. for slash command). The file always contains plain Markdown-only content
# (no raw HTML, no ANSI control codes), suitable for IDE slash commands or copy/paste into Copilot.
specfact backlog ceremony standup github --summarize-to ./standup-prompt.md --comments
```

The output includes an instruction to generate a standup summary, the applied filter context (adapter,
state, sprint, assignee, limit), and the same per-item data as `--copilot-export`. With
`--comments`/`--annotations`, the prompt includes comment annotations when supported. Use it with the
**`specfact.backlog-daily`** slash prompt for interactive team walkthrough (story-by-story, current focus,
issues/open questions, discussion notes as comments).
`--comments`/`--annotations`, the prompt includes normalized descriptions and comment annotations when
supported. Use it with the **`specfact.backlog-daily`** slash prompt for interactive team walkthrough
(story-by-story, current focus, issues/open questions, discussion notes as comments).

---

Expand Down
10 changes: 6 additions & 4 deletions docs/guides/agile-scrum-workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,10 @@ SpecFact CLI supports real-world agile/scrum practices through:
to show suggested next item by value score (business_value / (story_points Γ— priority)).
**Copilot export**: Use `--copilot-export <path>` to write a summarized Markdown file of each story for
Copilot. Add `--comments` (alias `--annotations`) to include descriptions and comment annotations in
`--copilot-export` and `--summarize` outputs when the adapter supports `get_comments` (GitHub, ADO). Use
`--first-comments N` or `--last-comments N` to scope comment volume when needed (default: include all).
`--copilot-export` and `--summarize` outputs when the adapter supports `get_comments` (GitHub, ADO). All
summarize/copilot-export content is **normalized to Markdown-only text** (no raw HTML tags or entities)
so ADO-style HTML fields and Markdown-native fields render consistently. Use `--first-comments N` or
`--last-comments N` to scope comment volume when needed (default: include all).
Use `--first-issues N` or `--last-issues N` (mutually exclusive) to scope daily output to oldest/newest
items by numeric issue/work-item ID.
**Kanban**: omit iteration/sprint and use state + limit; unassigned = pullable work. **Scrum/SAFe**: use
Expand Down Expand Up @@ -158,8 +160,8 @@ specfact backlog ceremony standup github --interactive # step-through; detail
# or
specfact backlog ceremony standup github --copilot-export ./standup.md --comments --last-comments 5
# or
specfact backlog ceremony standup github --summarize --comments # prompt to stdout for AI to generate standup summary
specfact backlog ceremony standup github --summarize-to ./standup-prompt.md
specfact backlog ceremony standup github --summarize --comments # prompt to stdout for AI to generate standup summary (Markdown-only)
specfact backlog ceremony standup github --summarize-to ./standup-prompt.md # plain Markdown file (no HTML/ANSI)
```

Use the **`specfact.backlog-daily`** (or `specfact.daily`) slash prompt for interactive walkthrough with the
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-02-27
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Change Validation Report: backlog-scrum-05-summarize-markdown-output

**Validation Date**: 2026-02-27T13:01:44+01:00
**Change Proposal**: [proposal.md](./proposal.md)
**Validation Method**: Dry-run dependency analysis and OpenSpec strict validation (post-implementation)

## Executive Summary

- **Breaking Changes**: 0 detected
- **Dependent Files**: 2 affected (implementation and tests; both updated in same change)
- **Impact Level**: Low
- **Validation Result**: Pass
- **User Decision**: Proceed (implementation completed)

## Breaking Changes Detected

None. All changes are additive or internal:

- **`_normalize_markdown_text(text: str) -> str`**: New private helper in `commands.py`; no public API change.
- **`_is_interactive_tty() -> bool`**: New private helper; no public API change.
- **`_build_summarize_prompt_content(...)`**: Signature unchanged; behavior change is internal (normalization of body/comment strings before inclusion). All call sites (same module and unit tests) remain compatible.

## Dependencies Affected

### Critical Updates Required

None.

### Recommended Updates

- **`src/specfact_cli/modules/backlog/src/commands.py`**: Already updated (normalization, TTY detection, Rich Markdown rendering).
- **`tests/unit/commands/test_backlog_daily.py`**: Already updated (HTML normalization tests, existing summarize tests still pass).

### Optional

- **`docs/getting-started/tutorial-daily-standup-sprint-review.md`**: Updated to describe Markdown-only and interactive vs CI behavior.
- **`docs/guides/agile-scrum-workflows.md`**: Updated to note normalized Markdown-only summarize/copilot-export content.

## Impact Assessment

- **Code Impact**: Single module (`modules/backlog/src/commands.py`); new helpers and wiring inside existing summarize path.
- **Test Impact**: New unit tests for HTML normalization; existing summarize tests unchanged in contract.
- **Documentation Impact**: Tutorial and agile guide updated.
- **Release Impact**: Patch (backward-compatible behavior change; output format improved, not contracted).

## User Decision

**Decision**: Proceed
**Rationale**: Implementation completed; no breaking changes; OpenSpec validation passed.
**Next Steps**: Merge via PR from feature worktree to `dev`; optionally run `/opsx:archive` after merge.

## Format Validation

- **proposal.md Format**: Pass
- Required sections present: Why, What Changes, Capabilities, Impact
- Capabilities section lists new capability and modified daily-standup
- **tasks.md Format**: Pass
- Numbered sections and checkbox task format per config
- All tasks completed except 4.3 (now completed by this validation)
- **specs Format**: Pass
- ADDED/MODIFIED requirements with scenarios (When/Then)
- **design.md Format**: Pass
- Context, Goals/Non-Goals, Decisions, Risks documented
- **Config.yaml Compliance**: Pass

## OpenSpec Validation

- **Status**: Pass
- **Validation Command**: `openspec validate backlog-scrum-05-summarize-markdown-output --strict`
- **Issues Found**: 0
- **Issues Fixed**: 0
- **Re-validated**: N/A

## Validation Artifacts

- Dependency search: `_normalize_markdown_text`, `_is_interactive_tty`, `_build_summarize_prompt_content` usages confined to `commands.py` and `test_backlog_daily.py`.
- No temporary workspace created; validation performed in-repo post-implementation.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
## TDD Evidence for backlog-scrum-05-summarize-markdown-output

### Failing-before run (new summarize normalization tests)

- **Command:**

```bash
hatch test --cover -v tests/unit/commands/test_backlog_daily.py -k "summarize_prompt_normalizes_html"
```

- **Timestamp:** 2026-02-27 (see CI logs / local shell history for exact time)

- **Failure summary:**
- `test_summarize_prompt_normalizes_html_description_to_markdown`:
- Expected HTML `<p>` / `<br />` and `&amp;` entities to be removed from summarize prompt output.
- Actual output still contained raw `<p>Line 1<br />Line 2 &amp; more</p>` in the Description section.
- `test_summarize_prompt_normalizes_html_comments_to_markdown`:
- Expected HTML `<div>` and `<br>` plus `&amp;` entities in comments to be removed.
- Actual output still contained raw `<div>Comment &amp; note<br>next line</div>` in the Comments section.

These failures confirm current behavior violates the new spec delta: summarize prompts include raw HTML and entities from ADO-style bodies and comments instead of normalized Markdown-only content.

### Passing-after run (summarize normalization implemented)

- **Command:**

```bash
hatch test --cover -v tests/unit/commands/test_backlog_daily.py -k "summarize_prompt_normalizes_html"
```

- **Result:** βœ… 2 passed (normalization tests), remaining tests deselected in this targeted run.

- **Behavior summary:**
- `_build_summarize_prompt_content` now:
- Normalizes HTML-based `body_markdown` values to Markdown-friendly text (no `<p>`, `<br>` tags or `&amp;` entities).
- Normalizes HTML comments before including them under the "Comments (annotations)" section.
- New helper `_normalize_markdown_text` (with `@beartype` and `@ensure`) enforces that the returned text does not contain raw HTML tags, satisfying the updated `daily-standup` summarize requirements.


Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
## Context

`specfact backlog daily` already supports a `--summarize` / `--summarize-to` flow that builds a prompt-ready view of the current standup scope (filters, per-item data, body, comments). When used against ADO, the underlying work item body and comments are often stored as HTML, while GitHub and some ADO comments use Markdown. Today the summarize builder can emit raw HTML fragments and entities into the prompt, which is noisy for both humans and LLMs and inconsistent with Markdown-centric flows elsewhere in SpecFact.

At the same time, SpecFact needs to support both interactive, rich terminal sessions (for humans running standup from a shell) and non-interactive / CI environments where summarize output is consumed by other tools or stored as artifacts.

## Goals / Non-Goals

**Goals:**

- Normalize all descriptions and comments included in summarize output into clean Markdown text, regardless of provider format.
- Ensure summarize prompts never contain raw HTML tags or HTML entities.
- Provide a Markdown-aware, readable view of the summarize content in interactive terminals (e.g. Rich Markdown rendering), while keeping the underlying Markdown text stable and prompt-ready.
- Preserve existing summarize semantics: same filters, same per-item data fields, same `--summarize` vs `--summarize-to` behavior.

**Non-Goals:**

- Do not change which items are included in standup or summarize scope (filters and selection logic remain as defined in `daily-standup`).
- Do not change how comments or bodies are stored in providers; normalization is applied only at summarize/export time.
- Do not introduce a hard dependency on any particular HTML-to-Markdown library that would block offline usage; implementation must remain Python-only and bundle-safe.

## Decisions

- Introduce a small normalization utility (e.g. in the backlog module package) that:
- Accepts raw body/comment text and a hint about source format (HTML vs Markdown when known).
- Converts HTML to Markdown using a deterministic, testable strategy.
- Always returns Markdown-only text suitable for inclusion in prompts.
- Extend the summarize builder for `backlog daily` so that:
- Before assembling the per-item section, it passes body and comment text through the normalization utility.
- It treats GitHub/Markdown-native content as Markdown but still routes through the same normalization path for consistency.
- Add a simple environment/TTY detection layer around summarize output:
- If running in an interactive TTY and not explicitly in CI mode, render the normalized Markdown using Rich (or an equivalent Markdown-capable view) for the user.
- If output is redirected, piped, or CI mode is detected, emit plain Markdown text without terminal control codes.

## Risks / Trade-offs

- HTML-to-Markdown conversion can be lossy if not carefully tuned; we must verify typical ADO HTML patterns (paragraphs, lists, bold, links) produce acceptable Markdown for standup prompts.
- Rich or similar libraries must be used in a way that does not leak ANSI control codes into `--summarize-to` files or CI logs; separation between rendered view and underlying text needs to be clear in implementation.
- Normalization adds a processing step per item/comment; for very large backlogs this can affect performance, so implementation should be efficient and optionally short-circuit when input is already clean Markdown.

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Change: Normalize daily summarize Markdown output

## Why



The current `specfact backlog daily --summarize/--summarize-to` output often contains raw HTML fragments and entities from ADO work item comments, mixed with Markdown-formatted text from GitHub and ADO. This makes the standup summary prompt hard to read for humans and noisy for LLMs, even though the underlying data is correct.

## What Changes



- Normalize backlog comments and descriptions used by `specfact backlog daily --summarize/--summarize-to` so that:
- HTML-formatted content is converted into clean Markdown before it is included in the prompt.
- Existing Markdown content is preserved as Markdown (no lossy reformatting).
- For interactive terminal sessions:
- Render the summarized standup prompt using a Markdown-aware terminal view (e.g. Rich Markdown rendering) so users see a readable, formatted view instead of raw Markdown or HTML.
- For non-interactive / CI environments and plain terminals:
- Fall back to emitting structured Markdown text directly (never raw HTML), preserving prompt-ready formatting for copy/paste into Copilot or slash commands.
- Ensure the summarize output logic can distinguish between:
- Interactive rich terminal usage (formatted view, still based on the same Markdown text).
- Non-interactive/CI usage (plain Markdown text, no color/control codes).

## Capabilities
### New Capabilities
- `backlog-daily-markdown-normalization`: Normalize backlog item bodies and comments into Markdown-only text for daily standup summarize prompts, with environment-aware rendering (rich Markdown view in interactive terminals, plain Markdown in CI/non-interactive mode).

### Modified Capabilities
- `daily-standup`: Clarify that the `--summarize/--summarize-to` scenarios must:
- Include only Markdown (no raw HTML fragments or entities) in per-item body/comment fields.
- Prefer a Markdown-formatted view in interactive terminals while keeping the underlying output prompt-ready for LLMs.


---

## Source Tracking

<!-- source_repo: nold-ai/specfact-cli -->
- **GitHub Issue**: #324
- **Issue URL**: <https://github.com/nold-ai/specfact-cli/issues/324>
- **Last Synced Status**: proposed
- **Sanitized**: false
<!-- content_hash: da76bac5d7da3752 -->
Loading
Loading