specfact-cli 0.15.3__tar.gz → 0.16.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/.gitignore +7 -1
  2. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/PKG-INFO +56 -1
  3. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/README.md +55 -0
  4. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/pyproject.toml +1 -1
  5. specfact_cli-0.16.1/resources/templates/persona/architect.md.j2 +211 -0
  6. specfact_cli-0.16.1/resources/templates/persona/developer.md.j2 +240 -0
  7. specfact_cli-0.16.1/resources/templates/persona/product-owner.md.j2 +233 -0
  8. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/__init__.py +1 -1
  9. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/__init__.py +1 -1
  10. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/cli.py +8 -0
  11. specfact_cli-0.16.1/src/specfact_cli/commands/__init__.py +46 -0
  12. specfact_cli-0.16.1/src/specfact_cli/commands/contract_cmd.py +477 -0
  13. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/enforce.py +14 -5
  14. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/generate.py +81 -35
  15. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/import_cmd.py +38 -0
  16. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/plan.py +349 -89
  17. specfact_cli-0.16.1/src/specfact_cli/commands/project_cmd.py +1518 -0
  18. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/sdd.py +17 -10
  19. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/sync.py +140 -69
  20. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/__init__.py +3 -1
  21. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/contract_generator.py +29 -0
  22. specfact_cli-0.16.1/src/specfact_cli/generators/persona_exporter.py +338 -0
  23. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/speckit_converter.py +26 -7
  24. specfact_cli-0.16.1/src/specfact_cli/merge/__init__.py +11 -0
  25. specfact_cli-0.16.1/src/specfact_cli/merge/resolver.py +429 -0
  26. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/__init__.py +5 -0
  27. specfact_cli-0.16.1/src/specfact_cli/models/contract.py +151 -0
  28. specfact_cli-0.16.1/src/specfact_cli/models/persona_template.py +86 -0
  29. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/plan.py +62 -3
  30. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/project.py +12 -1
  31. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/sdd.py +24 -4
  32. specfact_cli-0.16.1/src/specfact_cli/parsers/__init__.py +9 -0
  33. specfact_cli-0.16.1/src/specfact_cli/parsers/persona_importer.py +465 -0
  34. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/acceptance_criteria.py +7 -11
  35. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/git.py +15 -6
  36. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/sdd_discovery.py +31 -30
  37. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/structure.py +35 -74
  38. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/structured_io.py +3 -0
  39. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/__init__.py +3 -0
  40. specfact_cli-0.16.1/src/specfact_cli/validators/agile_validation.py +329 -0
  41. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/contract_validator.py +34 -3
  42. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/schema.py +11 -0
  43. specfact_cli-0.15.3/src/specfact_cli/commands/__init__.py +0 -22
  44. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/LICENSE.md +0 -0
  45. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/node-async.yaml +0 -0
  46. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/python-async.yaml +0 -0
  47. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/mappings/speckit-default.yaml +0 -0
  48. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/shared/cli-enforcement.md +0 -0
  49. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.01-import.md +0 -0
  50. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.02-plan.md +0 -0
  51. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.03-review.md +0 -0
  52. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.04-sdd.md +0 -0
  53. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.05-enforce.md +0 -0
  54. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.06-sync.md +0 -0
  55. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.07-contracts.md +0 -0
  56. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.compare.md +0 -0
  57. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/prompts/specfact.validate.md +0 -0
  58. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/deviation.schema.json +0 -0
  59. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/plan.schema.json +0 -0
  60. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/schemas/protocol.schema.json +0 -0
  61. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/github-action.yml.j2 +0 -0
  62. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/plan.bundle.yaml.j2 +0 -0
  63. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/pr-template.md.j2 +0 -0
  64. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/protocol.yaml.j2 +0 -0
  65. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/resources/templates/telemetry.yaml.example +0 -0
  66. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/__init__.py +0 -0
  67. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/analyze_agent.py +0 -0
  68. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/base.py +0 -0
  69. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/plan_agent.py +0 -0
  70. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/registry.py +0 -0
  71. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/agents/sync_agent.py +0 -0
  72. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/__init__.py +0 -0
  73. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
  74. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
  75. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
  76. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
  77. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
  78. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/graph_analyzer.py +0 -0
  79. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/relationship_mapper.py +0 -0
  80. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
  81. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
  82. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/analyze.py +0 -0
  83. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/bridge.py +0 -0
  84. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/drift.py +0 -0
  85. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/implement.py +0 -0
  86. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/init.py +0 -0
  87. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/migrate.py +0 -0
  88. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/repro.py +0 -0
  89. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/run.py +0 -0
  90. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/commands/spec.py +0 -0
  91. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/__init__.py +0 -0
  92. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/logger_setup.py +0 -0
  93. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/logging_utils.py +0 -0
  94. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/text_utils.py +0 -0
  95. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/common/utils.py +0 -0
  96. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/comparators/__init__.py +0 -0
  97. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/comparators/plan_comparator.py +0 -0
  98. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
  99. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
  100. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/openapi_extractor.py +0 -0
  101. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/plan_generator.py +0 -0
  102. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/protocol_generator.py +0 -0
  103. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/report_generator.py +0 -0
  104. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/task_generator.py +0 -0
  105. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/test_to_openapi.py +0 -0
  106. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/generators/workflow_generator.py +0 -0
  107. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/__init__.py +0 -0
  108. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/importers/speckit_scanner.py +0 -0
  109. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/integrations/__init__.py +0 -0
  110. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/integrations/specmatic.py +0 -0
  111. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/migrations/__init__.py +0 -0
  112. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/migrations/plan_migrator.py +0 -0
  113. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/bridge.py +0 -0
  114. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/deviation.py +0 -0
  115. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/enforcement.py +0 -0
  116. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/protocol.py +0 -0
  117. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/quality.py +0 -0
  118. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/source_tracking.py +0 -0
  119. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/models/task.py +0 -0
  120. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/__init__.py +0 -0
  121. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/detector.py +0 -0
  122. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/modes/router.py +0 -0
  123. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/async.yml +0 -0
  124. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/code-quality.yml +0 -0
  125. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/resources/semgrep/feature-detection.yml +0 -0
  126. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/runtime.py +0 -0
  127. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/__init__.py +0 -0
  128. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_probe.py +0 -0
  129. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_sync.py +0 -0
  130. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/bridge_watch.py +0 -0
  131. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/change_detector.py +0 -0
  132. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/code_to_spec.py +0 -0
  133. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/drift_detector.py +0 -0
  134. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/repository_sync.py +0 -0
  135. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/spec_to_code.py +0 -0
  136. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/spec_to_tests.py +0 -0
  137. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/speckit_sync.py +0 -0
  138. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/watcher.py +0 -0
  139. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/sync/watcher_enhanced.py +0 -0
  140. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/telemetry.py +0 -0
  141. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/__init__.py +0 -0
  142. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/bridge_templates.py +0 -0
  143. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/templates/specification_templates.py +0 -0
  144. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/__init__.py +0 -0
  145. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/bundle_loader.py +0 -0
  146. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/console.py +0 -0
  147. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/context_detection.py +0 -0
  148. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/enrichment_context.py +0 -0
  149. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/enrichment_parser.py +0 -0
  150. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/feature_keys.py +0 -0
  151. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/github_annotations.py +0 -0
  152. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/ide_setup.py +0 -0
  153. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/incremental_check.py +0 -0
  154. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/optional_deps.py +0 -0
  155. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/performance.py +0 -0
  156. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/progress.py +0 -0
  157. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/progressive_disclosure.py +0 -0
  158. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/prompts.py +0 -0
  159. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/source_scanner.py +0 -0
  160. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/suggestions.py +0 -0
  161. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/utils/yaml_utils.py +0 -0
  162. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/cli_first_validator.py +0 -0
  163. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/fsm.py +0 -0
  164. {specfact_cli-0.15.3 → specfact_cli-0.16.1}/src/specfact_cli/validators/repro_checker.py +0 -0
@@ -117,4 +117,10 @@ reports/
117
117
 
118
118
  # Jekyll bundle
119
119
  vendor/
120
- _site/
120
+ _site/
121
+
122
+ # specfact-cli artifacts (note: these should be generated in /tmp/)
123
+ findings.json
124
+ answers.json
125
+ questions.json
126
+ docs/project-plans/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfact-cli
3
- Version: 0.15.3
3
+ Version: 0.16.1
4
4
  Summary: Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions.
5
5
  Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
6
6
  Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
@@ -332,6 +332,16 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
332
332
 
333
333
  **For teams that can't afford production bugs during migration.**
334
334
 
335
+ ### 🎯 Built for Real-World Agile Teams
336
+
337
+ SpecFact isn't just a technical tool—it's designed for **real-world agile/scrum teams** with role-based workflows:
338
+
339
+ - 👤 **Product Owners** → Export backlog with DoR checklists, prioritization, dependencies, and sprint planning
340
+ - 🏗️ **Architects** → Export technical constraints, protocols, contracts, architectural decisions, and risk assessments
341
+ - 💻 **Developers** → Export implementation tasks, code mappings, test scenarios, and Definition of Done criteria
342
+
343
+ **Each role works in their own Markdown files** (no YAML editing), and SpecFact syncs everything together automatically. Perfect for teams using agile/scrum practices with clear role separation.
344
+
335
345
  ---
336
346
 
337
347
  ## Why SpecFact?
@@ -360,6 +370,8 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
360
370
 
361
371
  ## 💡 Key Capabilities
362
372
 
373
+ ### Technical Capabilities
374
+
363
375
  - ✅ **Reverse engineer legacy code** → Extract specs automatically from existing code
364
376
  - ✅ **Runtime contract enforcement** → Prevent regressions during modernization
365
377
  - ✅ **Symbolic execution** → Discover hidden edge cases with CrossHair
@@ -367,6 +379,47 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
367
379
  - ✅ **Works offline** → No cloud required, fully local
368
380
  - ✅ **CLI integrations** → Works seamlessly with VS Code, Cursor, GitHub Actions, and any agentic workflow
369
381
 
382
+ ### Team Collaboration Capabilities
383
+
384
+ - ✅ **Persona-based workflows** → Product Owners, Architects, and Developers work in parallel on their own sections
385
+ - ✅ **Agile/scrum alignment** → Definition of Ready (DoR), story points, dependencies, prioritization, sprint planning
386
+ - ✅ **Role-specific exports** → Each persona gets a tailored Markdown view with only what they need
387
+ - ✅ **Git-native collaboration** → Conflicts resolved in human-readable Markdown, not brittle YAML
388
+ - ✅ **Real-world templates** → Templates designed by agile coaches to match actual team expectations
389
+
390
+ ---
391
+
392
+ ## 👥 Team Collaboration: Persona-Based Workflows
393
+
394
+ SpecFact enables **real-world agile/scrum teams** to work together seamlessly with role-based workflows:
395
+
396
+ ```bash
397
+ # Product Owner: Export backlog for sprint planning
398
+ specfact project export --bundle legacy-api --persona product-owner
399
+ # → Exports: DoR checklists, prioritization, dependencies, business value, sprint planning
400
+
401
+ # Architect: Export technical design
402
+ specfact project export --bundle legacy-api --persona architect
403
+ # → Exports: Technical constraints, protocols, contracts, architectural decisions, NFRs
404
+
405
+ # Developer: Export implementation details
406
+ specfact project export --bundle legacy-api --persona developer
407
+ # → Exports: Tasks, code mappings, test scenarios, Definition of Done
408
+
409
+ # Each role edits their Markdown, then imports back
410
+ specfact project import --bundle legacy-api --persona product-owner --source backlog.md
411
+ ```
412
+
413
+ **Why this matters:**
414
+
415
+ - ✅ **No YAML editing** → Everyone works in familiar Markdown
416
+ - ✅ **Parallel workflows** → Product Owners, Architects, and Developers work simultaneously
417
+ - ✅ **Git-native** → Conflicts resolved in Markdown (human-readable), not YAML
418
+ - ✅ **Agile/scrum ready** → Built-in DoR validation, dependency tracking, sprint planning
419
+ - ✅ **Real-world templates** → Designed by agile coaches to match actual team expectations
420
+
421
+ 👉 **[Agile/Scrum Workflows Guide](docs/guides/agile-scrum-workflows.md)** - Complete guide to persona-based team collaboration
422
+
370
423
  ---
371
424
 
372
425
  ## 🔌 CLI Integrations
@@ -403,6 +456,8 @@ We ran SpecFact CLI **on itself** to prove it works with legacy code:
403
456
 
404
457
  **New to SpecFact?** Start with the [Getting Started Guide](docs/getting-started/README.md)
405
458
 
459
+ **Working with a team?** See [Agile/Scrum Workflows](docs/guides/agile-scrum-workflows.md) - Persona-based team collaboration with Product Owners, Architects, and Developers
460
+
406
461
  **Want to see integrations?** Check out [Integration Showcases](docs/examples/integration-showcases/) - Real bugs fixed via VS Code, Cursor, GitHub Actions
407
462
 
408
463
  **Tried Spec-Kit?** See [How SpecFact Compares to Spec-Kit](docs/guides/speckit-comparison.md) and [The Journey: From Spec-Kit to SpecFact](docs/guides/speckit-journey.md)
@@ -57,6 +57,16 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
57
57
 
58
58
  **For teams that can't afford production bugs during migration.**
59
59
 
60
+ ### 🎯 Built for Real-World Agile Teams
61
+
62
+ SpecFact isn't just a technical tool—it's designed for **real-world agile/scrum teams** with role-based workflows:
63
+
64
+ - 👤 **Product Owners** → Export backlog with DoR checklists, prioritization, dependencies, and sprint planning
65
+ - 🏗️ **Architects** → Export technical constraints, protocols, contracts, architectural decisions, and risk assessments
66
+ - 💻 **Developers** → Export implementation tasks, code mappings, test scenarios, and Definition of Done criteria
67
+
68
+ **Each role works in their own Markdown files** (no YAML editing), and SpecFact syncs everything together automatically. Perfect for teams using agile/scrum practices with clear role separation.
69
+
60
70
  ---
61
71
 
62
72
  ## Why SpecFact?
@@ -85,6 +95,8 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
85
95
 
86
96
  ## 💡 Key Capabilities
87
97
 
98
+ ### Technical Capabilities
99
+
88
100
  - ✅ **Reverse engineer legacy code** → Extract specs automatically from existing code
89
101
  - ✅ **Runtime contract enforcement** → Prevent regressions during modernization
90
102
  - ✅ **Symbolic execution** → Discover hidden edge cases with CrossHair
@@ -92,6 +104,47 @@ A brownfield-first CLI that **reverse engineers your legacy code** into document
92
104
  - ✅ **Works offline** → No cloud required, fully local
93
105
  - ✅ **CLI integrations** → Works seamlessly with VS Code, Cursor, GitHub Actions, and any agentic workflow
94
106
 
107
+ ### Team Collaboration Capabilities
108
+
109
+ - ✅ **Persona-based workflows** → Product Owners, Architects, and Developers work in parallel on their own sections
110
+ - ✅ **Agile/scrum alignment** → Definition of Ready (DoR), story points, dependencies, prioritization, sprint planning
111
+ - ✅ **Role-specific exports** → Each persona gets a tailored Markdown view with only what they need
112
+ - ✅ **Git-native collaboration** → Conflicts resolved in human-readable Markdown, not brittle YAML
113
+ - ✅ **Real-world templates** → Templates designed by agile coaches to match actual team expectations
114
+
115
+ ---
116
+
117
+ ## 👥 Team Collaboration: Persona-Based Workflows
118
+
119
+ SpecFact enables **real-world agile/scrum teams** to work together seamlessly with role-based workflows:
120
+
121
+ ```bash
122
+ # Product Owner: Export backlog for sprint planning
123
+ specfact project export --bundle legacy-api --persona product-owner
124
+ # → Exports: DoR checklists, prioritization, dependencies, business value, sprint planning
125
+
126
+ # Architect: Export technical design
127
+ specfact project export --bundle legacy-api --persona architect
128
+ # → Exports: Technical constraints, protocols, contracts, architectural decisions, NFRs
129
+
130
+ # Developer: Export implementation details
131
+ specfact project export --bundle legacy-api --persona developer
132
+ # → Exports: Tasks, code mappings, test scenarios, Definition of Done
133
+
134
+ # Each role edits their Markdown, then imports back
135
+ specfact project import --bundle legacy-api --persona product-owner --source backlog.md
136
+ ```
137
+
138
+ **Why this matters:**
139
+
140
+ - ✅ **No YAML editing** → Everyone works in familiar Markdown
141
+ - ✅ **Parallel workflows** → Product Owners, Architects, and Developers work simultaneously
142
+ - ✅ **Git-native** → Conflicts resolved in Markdown (human-readable), not YAML
143
+ - ✅ **Agile/scrum ready** → Built-in DoR validation, dependency tracking, sprint planning
144
+ - ✅ **Real-world templates** → Designed by agile coaches to match actual team expectations
145
+
146
+ 👉 **[Agile/Scrum Workflows Guide](docs/guides/agile-scrum-workflows.md)** - Complete guide to persona-based team collaboration
147
+
95
148
  ---
96
149
 
97
150
  ## 🔌 CLI Integrations
@@ -128,6 +181,8 @@ We ran SpecFact CLI **on itself** to prove it works with legacy code:
128
181
 
129
182
  **New to SpecFact?** Start with the [Getting Started Guide](docs/getting-started/README.md)
130
183
 
184
+ **Working with a team?** See [Agile/Scrum Workflows](docs/guides/agile-scrum-workflows.md) - Persona-based team collaboration with Product Owners, Architects, and Developers
185
+
131
186
  **Want to see integrations?** Check out [Integration Showcases](docs/examples/integration-showcases/) - Real bugs fixed via VS Code, Cursor, GitHub Actions
132
187
 
133
188
  **Tried Spec-Kit?** See [How SpecFact Compares to Spec-Kit](docs/guides/speckit-comparison.md) and [The Journey: From Spec-Kit to SpecFact](docs/guides/speckit-journey.md)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "specfact-cli"
7
- version = "0.15.3"
7
+ version = "0.16.1"
8
8
  description = "Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,211 @@
1
+ # Project Plan: {{ bundle_name }} - Architect View
2
+
3
+ **Persona**: Architect
4
+ **Bundle**: `{{ bundle_name }}`
5
+ **Created**: {{ created_at }}
6
+ **Status**: {{ status }}
7
+ **Last Updated**: {{ updated_at }}
8
+
9
+ {% if features %}
10
+ ## Technical Constraints & Requirements *(mandatory)*
11
+
12
+ {% for feature_key, feature in features.items() %}
13
+ ### {{ feature.key }}: {{ feature.title }}
14
+
15
+ {% if feature.constraints %}
16
+ #### Technical Constraints - {{ feature.key }}
17
+
18
+ {% for constraint in feature.constraints %}
19
+ - {{ constraint }}
20
+ {% endfor %}
21
+ {% else %}
22
+ *[ACTION REQUIRED: Define technical constraints for this feature]*
23
+ {%- endif %}
24
+ {% if feature.contract %}
25
+ #### API Contract
26
+
27
+ **Contract Path**: `{{ feature.contract }}`
28
+
29
+ {% if contracts and feature.key in contracts %}
30
+ **Contract Details**: See Contracts section below.
31
+ {%- endif %}
32
+ {%- endif %}
33
+ {% if feature.protocol %}
34
+ #### State Machine Protocol
35
+
36
+ **Protocol Path**: `{{ feature.protocol }}`
37
+
38
+ {% if protocols and feature.key in protocols %}
39
+ **Protocol Details**: See Protocols & State Machines section below.
40
+ {%- endif %}
41
+ {%- endif %}
42
+ {% if feature.priority or feature.rank or feature.business_value_score %}
43
+ #### Feature Prioritization
44
+
45
+ {% if feature.priority %}
46
+ - **Priority**: {{ feature.priority }}
47
+ {% endif %}
48
+ {% if feature.rank %}
49
+ - **Backlog Rank**: {{ feature.rank }} (1 = highest priority)
50
+ {% endif %}
51
+ {% if feature.business_value_score %}
52
+ - **Business Value Score**: {{ feature.business_value_score }}/100
53
+ {% endif %}
54
+ {% if feature.target_release %}
55
+ - **Target Release**: {{ feature.target_release }}
56
+ {%- endif %}
57
+ {%- endif %}
58
+ {% if feature.depends_on_features or feature.blocks_features %}
59
+ #### Feature Dependencies
60
+
61
+ {% if feature.depends_on_features %}
62
+ - **Depends On**: {{ feature.depends_on_features | join(', ') }}
63
+ {% endif %}
64
+ {% if feature.blocks_features %}
65
+ - **Blocks**: {{ feature.blocks_features | join(', ') }}
66
+ {%- endif %}
67
+ {%- endif %}
68
+ {% if feature.estimated_story_points %}
69
+ #### Story Point Estimation
70
+
71
+ - **Total Estimated Story Points**: {{ feature.estimated_story_points }}
72
+ {%- endif %}
73
+
74
+ {%- endfor %}
75
+ {% else %}
76
+ ## Technical Constraints & Requirements *(mandatory)*
77
+
78
+ *[ACTION REQUIRED: Define technical constraints and requirements for features]*
79
+ {%- endif %}
80
+
81
+ {% if protocols %}
82
+ ## Protocols & State Machines *(mandatory)*
83
+
84
+ {% for protocol_name, protocol_data in protocols.items() %}
85
+ ### {{ protocol_name }}
86
+
87
+ {% if protocol_data.states %}
88
+ **States**: {{ protocol_data.states | join(', ') }}
89
+ {%- endif %}
90
+
91
+ {%- if protocol_data.transitions %}
92
+ **Transitions**:
93
+
94
+ {% for transition in protocol_data.transitions %}
95
+ - `{{ transition.from_state }}` → `{{ transition.to_state }}`{% if transition.event %} (on: `{{ transition.event }}`){% endif %}
96
+ {% endfor %}
97
+ {%- endif %}
98
+
99
+ {%- if protocol_data.initial_state %}
100
+ **Initial State**: `{{ protocol_data.initial_state }}`
101
+ {%- endif %}
102
+
103
+ {%- if protocol_data.final_states %}
104
+ **Final States**: {{ protocol_data.final_states | join(', ') }}
105
+ {%- endif %}
106
+
107
+ {%- if protocol_data.validation_rules %}
108
+ **Validation Rules**:
109
+
110
+ {% for rule in protocol_data.validation_rules %}
111
+ - {{ rule }}
112
+ {% endfor %}
113
+ {%- endif %}
114
+
115
+ ---
116
+
117
+ {% endfor %}
118
+ {% else %}
119
+ ## Protocols & State Machines *(mandatory)*
120
+
121
+ *[ACTION REQUIRED: Define protocols and state machines]*
122
+
123
+ **Note**: Protocols should be defined in `.specfact/projects/{{ bundle_name }}/protocols/*.protocol.yaml` files.
124
+ {% endif %}
125
+
126
+ {% if contracts %}
127
+ ## Contracts *(mandatory)*
128
+
129
+ {% for contract_name, contract_data in contracts.items() %}
130
+ ### {{ contract_name }}
131
+
132
+ {% if contract_data.info %}
133
+ **Info**:
134
+
135
+ - **Title**: {{ contract_data.info.title if contract_data.info.title else 'N/A' }}
136
+ - **Version**: {{ contract_data.info.version if contract_data.info.version else 'N/A' }}
137
+ - **Description**: {{ contract_data.info.description if contract_data.info.description else 'N/A' }}
138
+ {%- endif %}
139
+
140
+ {%- if contract_data.openapi %}
141
+ **OpenAPI Version**: {{ contract_data.openapi }}
142
+ {%- endif %}
143
+
144
+ {%- if contract_data.asyncapi %}
145
+ **AsyncAPI Version**: {{ contract_data.asyncapi }}
146
+ {%- endif %}
147
+
148
+ {%- if contract_data.servers %}
149
+ **Servers**:
150
+
151
+ {% for server in contract_data.servers %}
152
+ - {{ server.url }}{% if server.description %} - {{ server.description }}{% endif %}
153
+ {% endfor %}
154
+ {%- endif %}
155
+
156
+ {%- if contract_data.paths %}
157
+ **Endpoints**:
158
+
159
+ {% for path, methods in contract_data.paths.items() %}
160
+ - `{{ path }}`:
161
+ {% for method, details in methods.items() %}
162
+ - `{{ method.upper() }}`: {{ details.summary if details.summary else 'N/A' }}
163
+ {% endfor %}
164
+ {% endfor %}
165
+ {%- endif %}
166
+
167
+ {%- if contract_data.components and contract_data.components.schemas %}
168
+ **Schemas**:
169
+
170
+ {% for schema_name, schema_def in contract_data.components.schemas.items() %}
171
+ - `{{ schema_name }}`: {{ schema_def.type if schema_def.type else 'object' }}
172
+ {% endfor %}
173
+ {%- endif %}
174
+
175
+ ---
176
+
177
+ {%- endfor %}
178
+ {% else %}
179
+ ## Contracts *(mandatory)*
180
+
181
+ *[ACTION REQUIRED: Define contracts (OpenAPI, AsyncAPI, etc.)]*
182
+
183
+ **Note**: Contracts should be defined in `.specfact/projects/{{ bundle_name }}/contracts/*.openapi.yaml` or `*.asyncapi.yaml` files.
184
+ {%- endif %}
185
+
186
+ ## Ownership & Locks
187
+
188
+ {% if locks %}
189
+ **Locked Sections**:
190
+
191
+ {% for lock in locks %}
192
+ - `{{ lock.section }}` - Locked by {{ lock.owner }} ({{ lock.locked_at }})
193
+ {% endfor %}
194
+ {% else %}
195
+ No sections currently locked
196
+ {% endif %}
197
+
198
+ ## Validation Checklist
199
+
200
+ - [ ] All features have technical constraints defined
201
+ - [ ] Protocols/state machines are documented
202
+ - [ ] Contracts are defined and validated
203
+ - [ ] Architecture decisions are documented
204
+ - [ ] Non-functional requirements are specified
205
+ - [ ] Risk assessment is complete
206
+ - [ ] Deployment architecture is documented
207
+
208
+ ## Notes
209
+
210
+ *Use this section for architectural decisions, trade-offs, or technical clarifications.*
211
+
@@ -0,0 +1,240 @@
1
+ # Project Plan: {{ bundle_name }} - Developer View
2
+
3
+ **Persona**: Developer
4
+ **Bundle**: `{{ bundle_name }}`
5
+ **Created**: {{ created_at }}
6
+ **Status**: {{ status }}
7
+ **Last Updated**: {{ updated_at }}
8
+
9
+ {% if features %}
10
+ ## Acceptance Criteria & Implementation Details *(mandatory)*
11
+
12
+ {%- for feature_key, feature in features.items() -%}
13
+ ### {{ feature.key }}: {{ feature.title }}
14
+
15
+ {% if feature.acceptance %}
16
+ #### Acceptance Criteria - {{ feature.key }}
17
+
18
+ {%- for criterion in feature.acceptance %}
19
+ {% set criterion_clean = criterion.replace('\r\n', '\n').replace('\r', '\n').strip() %}
20
+ {% if '\n' in criterion_clean %}
21
+ {% set criterion_lines = criterion_clean.split('\n') %}
22
+ {% for line in criterion_lines %}
23
+ {% if line.strip() %}
24
+ - [ ] {{ line.strip() }}
25
+ {% endif %}
26
+ {% endfor %}
27
+ {% else %}
28
+ - [ ] {{ criterion_clean }}
29
+ {%- endif -%}
30
+ {%- endfor -%}
31
+ {% else %}
32
+ *[ACTION REQUIRED: Define acceptance criteria for this feature]*
33
+ {%- endif %}
34
+ {% if feature.stories %}
35
+ #### User Stories
36
+
37
+ {% for story in feature.stories %}
38
+ **{{ story.key }}**: {{ story.title }}
39
+
40
+ {% if story.story_points or story.value_points or story.priority or story.target_sprint or story.target_release or story.depends_on_stories or story.blocks_stories %}
41
+ **Sprint Context**:
42
+
43
+ {% if story.story_points %}
44
+ - **Story Points**: {{ story.story_points }} (complexity)
45
+ {% endif %}
46
+ {% if story.value_points %}
47
+ - **Value Points**: {{ story.value_points }} (business value)
48
+ {% endif %}
49
+ {% if story.priority %}
50
+ - **Priority**: {{ story.priority }}
51
+ {% endif %}
52
+ {% if story.rank %}
53
+ - **Backlog Rank**: {{ story.rank }} (1 = highest priority)
54
+ {% endif %}
55
+ {% if story.target_sprint %}
56
+ - **Target Sprint**: {{ story.target_sprint }}
57
+ {% endif %}
58
+ {% if story.target_release %}
59
+ - **Target Release**: {{ story.target_release }}
60
+ {% endif %}
61
+ {% if story.due_date %}
62
+ - **Due Date**: {{ story.due_date }}
63
+ {% endif %}
64
+ {% if story.depends_on_stories %}
65
+ - **Depends On**: {{ story.depends_on_stories | join(', ') }}
66
+ {% endif %}
67
+ {% if story.blocks_stories %}
68
+ - **Blocks**: {{ story.blocks_stories | join(', ') }}
69
+ {%- endif %}
70
+ {%- endif %}
71
+ {% if story.acceptance %}
72
+ **Acceptance Criteria**:
73
+
74
+ {% for criterion in story.acceptance %}
75
+ {% set criterion_clean = criterion.replace('\r\n', '\n').replace('\r', '\n').strip() %}
76
+ {% if '\n' in criterion_clean %}
77
+ {% set criterion_lines = criterion_clean.split('\n') %}
78
+ {% for line in criterion_lines %}
79
+ {% if line.strip() %}
80
+ - [ ] {{ line.strip() }}
81
+ {% endif %}
82
+ {% endfor %}
83
+ {% else %}
84
+ - [ ] {{ criterion_clean }}
85
+ {% endif %}
86
+ {% endfor %}
87
+ {%- endif %}
88
+ {% if story.tasks %}
89
+ **Implementation Tasks**:
90
+
91
+ {% for task in story.tasks %}
92
+ - [ ] {{ task }}
93
+ {% endfor %}
94
+ {%- endif %}
95
+ {% if story.contracts %}
96
+ **API Contracts**:
97
+
98
+ {% for contract_type, contract_data in story.contracts.items() %}
99
+ **{{ contract_type }}**:
100
+
101
+ {% if contract_data is mapping %}
102
+ {% if contract_data.parameters %}
103
+ **Parameters**:
104
+ {% for param_name, param_info in contract_data.parameters.items() %}
105
+ - `{{ param_name }}`: {{ param_info.type if param_info.type else 'Any' }}{% if param_info.description %} - {{ param_info.description }}{% endif %}
106
+ {% endfor %}
107
+ {% endif %}
108
+ {% if contract_data.return_type %}
109
+ **Return Type**: `{{ contract_data.return_type }}`
110
+ {% endif %}
111
+ {% if contract_data.preconditions %}
112
+ **Preconditions**:
113
+ {% for precondition in contract_data.preconditions %}
114
+ - {{ precondition }}
115
+ {% endfor %}
116
+ {% endif %}
117
+ {% if contract_data.postconditions %}
118
+ **Postconditions**:
119
+ {% for postcondition in contract_data.postconditions %}
120
+ - {{ postcondition }}
121
+ {% endfor %}
122
+ {% endif %}
123
+ {% if contract_data.error_contracts %}
124
+ **Error Contracts**:
125
+ {% for error_type, error_info in contract_data.error_contracts.items() %}
126
+ - `{{ error_type }}`: {{ error_info.description if error_info.description else error_info }}
127
+ {% endfor %}
128
+ {% endif %}
129
+ {% else %}
130
+ ```python
131
+ {{ contract_data }}
132
+ ```
133
+ {% endif %}
134
+ {% endfor %}
135
+ {%- endif %}
136
+ {% if story.scenarios %}
137
+ **Test Scenarios**:
138
+
139
+ {% if story.scenarios.primary %}
140
+ **Primary**:
141
+ {% for scenario in story.scenarios.primary %}
142
+ - {{ scenario }}
143
+ {% endfor %}
144
+ {% endif %}
145
+ {% if story.scenarios.alternate %}
146
+ **Alternate**:
147
+ {% for scenario in story.scenarios.alternate %}
148
+ - {{ scenario }}
149
+ {% endfor %}
150
+ {% endif %}
151
+ {% if story.scenarios.exception %}
152
+ **Exception**:
153
+ {% for scenario in story.scenarios.exception %}
154
+ - {{ scenario }}
155
+ {% endfor %}
156
+ {% endif %}
157
+ {% if story.scenarios.recovery %}
158
+ **Recovery**:
159
+ {% for scenario in story.scenarios.recovery %}
160
+ - {{ scenario }}
161
+ {% endfor %}
162
+ {%- endif %}
163
+ {%- endif %}
164
+ {% if story.source_functions or story.test_functions %}
165
+ **Code Mappings**:
166
+
167
+ {% if story.source_functions %}
168
+ **Source Functions**:
169
+ {% for func in story.source_functions %}
170
+ - `{{ func }}`
171
+ {% endfor %}
172
+ {% endif %}
173
+ {% if story.test_functions %}
174
+ **Test Functions**:
175
+ {% for func in story.test_functions %}
176
+ - `{{ func }}`
177
+ {% endfor %}
178
+ {%- endif %}
179
+ {%- endif %}
180
+ {% if story.definition_of_ready %}
181
+ **Definition of Ready Status**:
182
+
183
+ {% for item, status in story.definition_of_ready.items() %}
184
+ - [{% if status %}x{% else %} {% endif %}] {{ item.replace('_', ' ').title() }}
185
+ {% endfor %}
186
+ {%- endif %}
187
+
188
+ **Definition of Done**:
189
+
190
+ - [ ] Code implemented and reviewed
191
+ - [ ] Unit tests written (100% coverage for critical paths)
192
+ - [ ] Integration tests passing
193
+ - [ ] API documentation updated
194
+ - [ ] Performance requirements met
195
+ - [ ] Security requirements met
196
+
197
+ ---
198
+
199
+ {% endfor %}
200
+ {%- endif %}
201
+ {% if feature.implementation %}
202
+ #### Implementation Notes
203
+
204
+ {{ feature.implementation }}
205
+ {%- endif -%}
206
+ {%- endfor -%}
207
+ {% else %}
208
+ ## Acceptance Criteria & Implementation Details *(mandatory)*
209
+
210
+ *[ACTION REQUIRED: Define acceptance criteria and implementation details for features]*
211
+ {%- endif -%}
212
+
213
+ ## Ownership & Locks
214
+
215
+ {% if locks %}
216
+ **Locked Sections**:
217
+
218
+ {% for lock in locks %}
219
+ - `{{ lock.section }}` - Locked by {{ lock.owner }} ({{ lock.locked_at }})
220
+ {% endfor %}
221
+ {% else %}
222
+ No sections currently locked
223
+ {% endif %}
224
+
225
+ ## Validation Checklist
226
+
227
+ - [ ] All features have acceptance criteria defined
228
+ - [ ] Acceptance criteria are testable
229
+ - [ ] Implementation tasks are documented
230
+ - [ ] API contracts are defined
231
+ - [ ] Test scenarios are documented
232
+ - [ ] Code mappings are complete
233
+ - [ ] Edge cases are considered
234
+ - [ ] Testing strategy is defined
235
+ - [ ] Definition of Done criteria are met
236
+
237
+ ## Notes
238
+
239
+ *Use this section for implementation questions, technical notes, or development clarifications.*
240
+