requirements-as-code 0.7.1__tar.gz → 0.7.3__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 (180) hide show
  1. {requirements_as_code-0.7.1/requirements_as_code.egg-info → requirements_as_code-0.7.3}/PKG-INFO +148 -1
  2. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/README.md +147 -0
  3. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-016-relationships-as-structural-references.md +2 -0
  4. requirements_as_code-0.7.3/planning/prompt/rac-agent-compression.md +12 -0
  5. requirements_as_code-0.7.3/planning/prompt/rac-agent-instructions.md +24 -0
  6. requirements_as_code-0.7.3/planning/prompt/rac-agent-release-gate-major.md +261 -0
  7. requirements_as_code-0.7.3/planning/prompt/rac-agent-release-gate-minor.md +23 -0
  8. requirements_as_code-0.7.3/planning/prompt/rac-agent-session-start.md +23 -0
  9. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/artifacts.py +6 -0
  10. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/cli.py +69 -7
  11. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/outputs.py +135 -1
  12. requirements_as_code-0.7.3/rac/portfolio.py +250 -0
  13. requirements_as_code-0.7.3/rac/relationships.py +544 -0
  14. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3/requirements_as_code.egg-info}/PKG-INFO +148 -1
  15. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/requirements_as_code.egg-info/SOURCES.txt +29 -0
  16. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/adr.md +13 -0
  17. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/design.md +17 -0
  18. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/prompt.md +17 -0
  19. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/req.md +17 -0
  20. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/roadmap.md +9 -0
  21. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/all_types/unknown.md +3 -0
  22. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/broken_rels/source.md +13 -0
  23. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/invalid_known/req-no-title.md +19 -0
  24. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/unknown_only/unknown.md +3 -0
  25. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/valid_clean/adr-001.md +25 -0
  26. requirements_as_code-0.7.3/tests/fixtures/portfolio_summary/valid_clean/req-001.md +26 -0
  27. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/ambiguous_target/adr-004-alt.md +13 -0
  28. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/ambiguous_target/adr-004.md +13 -0
  29. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/ambiguous_target/req-001.md +13 -0
  30. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/broken/search.md +13 -0
  31. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/duplicate/adr-004-alt.md +13 -0
  32. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/duplicate/adr-004.md +13 -0
  33. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/resolved/adr-004.md +17 -0
  34. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/resolved/req-001.md +13 -0
  35. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/resolved/roadmap-q3.md +17 -0
  36. requirements_as_code-0.7.3/tests/fixtures/relationship_validation/self_reference/adr-004.md +17 -0
  37. requirements_as_code-0.7.3/tests/test_portfolio.py +328 -0
  38. requirements_as_code-0.7.3/tests/test_relationship_validation.py +265 -0
  39. requirements_as_code-0.7.1/rac/relationships.py +0 -241
  40. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/.github/workflows/python-publish.yml +0 -0
  41. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/.gitignore +0 -0
  42. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/LICENSE +0 -0
  43. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/examples/example_dashboard_v1.md +0 -0
  44. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/examples/example_dashboard_v2.md +0 -0
  45. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-001-markdown-first.md +0 -0
  46. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-002-ai-optional.md +0 -0
  47. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-003-structured-outputs-first.md +0 -0
  48. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-004-artifact-model.md +0 -0
  49. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-005-cli-first.md +0 -0
  50. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-006-ingest-over-rewrite.md +0 -0
  51. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-007-json-contract-stability.md +0 -0
  52. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-008-agent-ready-architecture.md +0 -0
  53. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-009-ai-assisted-development.md +0 -0
  54. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-010-documents-are-not-artifacts.md +0 -0
  55. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-011-file-first-pipeline.md +0 -0
  56. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-012-open-core-strategy.md +0 -0
  57. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-013-leverage-existing-source-control-systems.md +0 -0
  58. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-014-viewer-agnostic-knowledge-artifacts.md +0 -0
  59. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-015-explorer-as-consumer.md +0 -0
  60. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/adr/adr-017-rac-managed-knowledge-not-work.md +0 -0
  61. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-command-surface.md +0 -0
  62. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-first-run-experience.md +0 -0
  63. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-health-model.md +0 -0
  64. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-import-workflow.md +0 -0
  65. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-knowledge-graph.md +0 -0
  66. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/designs/explorer-visual-system.md +0 -0
  67. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/future/v1.0-workspace-analysis.md +0 -0
  68. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/future/v1.1-review-engine.md +0 -0
  69. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/future/v1.2-mcp-server.md +0 -0
  70. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/future/v1.4-claude-skills.md +0 -0
  71. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/future/v1.4-python-sdk.md +0 -0
  72. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/archive/v0.5-decisions.md +0 -0
  73. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/archive/v0.7-prompts.md +0 -0
  74. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.2-stats.md +0 -0
  75. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.3-ingest.md +0 -0
  76. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.3.1-formats.md +0 -0
  77. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.4-inspect.md +0 -0
  78. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.4.1-expansion.md +0 -0
  79. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.4.1-inspect-expansion.md +0 -0
  80. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.4.2-decision-metadata.md +0 -0
  81. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.5.0-artifact-improvement.md +0 -0
  82. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.5.1-guided-improvement.md +0 -0
  83. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.5.2-schema.md +0 -0
  84. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.6.0-roadmap-artifacts.md +0 -0
  85. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.6.1-roadmap-improvement.md +0 -0
  86. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.6.2-prompt-artifact.md +0 -0
  87. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.6.3-design-artifacts.md +0 -0
  88. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.7.0-relationship-metadata.md +0 -0
  89. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.7.1-relationship-inspection.md +0 -0
  90. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.7.2-relationship-validation.md +0 -0
  91. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.7.3-repo-intelligence.md +0 -0
  92. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.7.4-repo-indexing.md +0 -0
  93. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.8.0-service-api.md +0 -0
  94. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.8.1-repository-model.md +0 -0
  95. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.8.2-interactive-runtime-readiness.md +0 -0
  96. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.8.3-integration-freeze.md +0 -0
  97. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.9.0-explorer-foundation.md +0 -0
  98. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.9.1-explorer-experience.md +0 -0
  99. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.9.2-knowledge-operations.md +0 -0
  100. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/planning/roadmap/v0.9.3-intelligence-views.md +0 -0
  101. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/pyproject.toml +0 -0
  102. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/__init__.py +0 -0
  103. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/classification.py +0 -0
  104. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/diff.py +0 -0
  105. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/fs.py +0 -0
  106. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/improve.py +0 -0
  107. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/ingest.py +0 -0
  108. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/inspect.py +0 -0
  109. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/models.py +0 -0
  110. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/parser.py +0 -0
  111. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/schema.py +0 -0
  112. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/stats.py +0 -0
  113. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/rac/validate.py +0 -0
  114. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/requirements_as_code.egg-info/dependency_links.txt +0 -0
  115. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/requirements_as_code.egg-info/entry_points.txt +0 -0
  116. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/requirements_as_code.egg-info/requires.txt +0 -0
  117. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/requirements_as_code.egg-info/top_level.txt +0 -0
  118. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/setup.cfg +0 -0
  119. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/conftest.py +0 -0
  120. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/bad_category.md +0 -0
  121. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/bad_status.md +0 -0
  122. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/minimal.md +0 -0
  123. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/portfolio/01_accepted_arch.md +0 -0
  124. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/portfolio/02_proposed_process.md +0 -0
  125. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/portfolio/03_no_metadata.md +0 -0
  126. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/decision/with_metadata.md +0 -0
  127. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/design/minimal.md +0 -0
  128. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/design/missing_constraints.md +0 -0
  129. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/design/valid.md +0 -0
  130. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/diff/new.md +0 -0
  131. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/diff/old.md +0 -0
  132. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/ingest/sample.md +0 -0
  133. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/inspect/ambiguous.md +0 -0
  134. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/inspect/decision.md +0 -0
  135. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/inspect/nested/another_requirement.md +0 -0
  136. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/inspect/requirement.md +0 -0
  137. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/duplicate_ids.md +0 -0
  138. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/empty_req_text.md +0 -0
  139. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/malformed_id.md +0 -0
  140. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/missing_id.md +0 -0
  141. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/missing_problem.md +0 -0
  142. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/missing_requirements.md +0 -0
  143. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/missing_title.md +0 -0
  144. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/invalid/multiple_titles.md +0 -0
  145. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/no_relationships/decision.md +0 -0
  146. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/no_relationships/requirement.md +0 -0
  147. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/portfolio/broken.md +0 -0
  148. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/portfolio/feature_a.md +0 -0
  149. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/portfolio/feature_b.md +0 -0
  150. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/portfolio/sub/feature_c.md +0 -0
  151. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/prompt/minimal.md +0 -0
  152. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/prompt/missing_output.md +0 -0
  153. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/prompt/valid.md +0 -0
  154. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/relationships/decision_with_links.md +0 -0
  155. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/relationships/design_with_links.md +0 -0
  156. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/relationships/prompt_with_links.md +0 -0
  157. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/relationships/requirement_with_links.md +0 -0
  158. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/relationships/roadmap_with_links.md +0 -0
  159. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/roadmap/minimal.md +0 -0
  160. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/roadmap/missing_initiatives.md +0 -0
  161. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/roadmap/valid.md +0 -0
  162. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/valid/bullet_requirements.md +0 -0
  163. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/valid/feature.md +0 -0
  164. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/valid/minimal.md +0 -0
  165. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/fixtures/valid/warnings.md +0 -0
  166. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_cli.py +0 -0
  167. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_decision_metadata.py +0 -0
  168. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_design.py +0 -0
  169. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_diff.py +0 -0
  170. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_improve.py +0 -0
  171. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_ingest.py +0 -0
  172. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_inspect.py +0 -0
  173. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_parser.py +0 -0
  174. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_prompt.py +0 -0
  175. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_relationships.py +0 -0
  176. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_relationships_cmd.py +0 -0
  177. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_roadmap.py +0 -0
  178. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_schema.py +0 -0
  179. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_stats.py +0 -0
  180. {requirements_as_code-0.7.1 → requirements_as_code-0.7.3}/tests/test_validate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: requirements-as-code
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: RAC — lint and diff product requirements written in Markdown.
5
5
  Author: tcballard
6
6
  License-Expression: MIT
@@ -935,6 +935,153 @@ Notes:
935
935
 
936
936
  ---
937
937
 
938
+ ## Portfolio
939
+
940
+ A single-command repository intelligence summary: artifact counts, validation
941
+ health, completeness, relationship integrity, actionable attention items, and an
942
+ overall health score — without manually combining output from multiple commands.
943
+
944
+ ```bash
945
+ rac portfolio ./docs
946
+ rac portfolio ./docs --json
947
+ rac portfolio ./docs --top-level # don't recurse into subdirectories
948
+ ```
949
+
950
+ ```text
951
+ Repository Summary
952
+ ==================
953
+
954
+ Directory: ./docs
955
+ Artifacts: 42
956
+
957
+ By Type
958
+ -------
959
+
960
+ Requirement 18
961
+ Decision 12
962
+ Roadmap 5
963
+ Prompt 4
964
+ Design 2
965
+ Unknown 1
966
+
967
+ Validation
968
+ ----------
969
+
970
+ Valid: 40
971
+ Invalid: 2
972
+
973
+ Completeness
974
+ ------------
975
+
976
+ 78% (94 / 120 recommended slots filled)
977
+
978
+ Relationships
979
+ -------------
980
+
981
+ Total: 65
982
+ Valid: 63
983
+ Broken: 2
984
+ Orphaned: 4
985
+ Coverage: 71%
986
+
987
+ Attention (4 items)
988
+ ----------
989
+
990
+ ✗ search
991
+ Validation errors: missing-requirements
992
+ ! adr-004
993
+ Missing recommended sections: Alternatives Considered
994
+ ! q3-roadmap
995
+ Related Requirements references missing artifact: REQ-999
996
+ ! req-041
997
+ Missing recommended sections: Risks
998
+
999
+ Health Score
1000
+ ------------
1001
+
1002
+ 87 / 100
1003
+ ```
1004
+
1005
+ `--json` returns the stable machine contract (all fields present regardless of
1006
+ content, versioned with `schema_version`):
1007
+
1008
+ ```json
1009
+ {
1010
+ "schema_version": "1",
1011
+ "directory": "./docs",
1012
+ "recursive": true,
1013
+ "artifacts": {
1014
+ "total": 42,
1015
+ "by_type": {
1016
+ "requirement": 18,
1017
+ "decision": 12,
1018
+ "roadmap": 5,
1019
+ "prompt": 4,
1020
+ "design": 2,
1021
+ "unknown": 1
1022
+ }
1023
+ },
1024
+ "validation": { "valid": 40, "invalid": 2 },
1025
+ "completeness": { "recommended_slots": 120, "filled": 94, "ratio": 0.7833 },
1026
+ "relationships": {
1027
+ "total": 65,
1028
+ "valid": 63,
1029
+ "broken": 2,
1030
+ "orphaned": 4,
1031
+ "coverage": 0.7143
1032
+ },
1033
+ "attention": [
1034
+ {
1035
+ "path": "requirements/search.md",
1036
+ "identifier": "search",
1037
+ "severity": "error",
1038
+ "code": "invalid-artifact",
1039
+ "message": "Validation errors: missing-requirements"
1040
+ },
1041
+ {
1042
+ "path": "roadmaps/q3-roadmap.md",
1043
+ "identifier": "q3-roadmap",
1044
+ "severity": "warning",
1045
+ "code": "broken-relationship",
1046
+ "message": "Related Requirements references missing artifact: REQ-999"
1047
+ }
1048
+ ],
1049
+ "health": { "score": 87 }
1050
+ }
1051
+ ```
1052
+
1053
+ **Health score formula** (deterministic, no AI):
1054
+
1055
+ ```
1056
+ score = round(100 × (0.5 × validity + 0.25 × completeness + 0.25 × rel_integrity))
1057
+ ```
1058
+
1059
+ where each sub-score is a simple ratio that defaults to `1.0` when its
1060
+ denominator is zero, so an empty repository always scores 100.
1061
+
1062
+ Notes:
1063
+
1064
+ - **Advisory command.** `rac portfolio` always exits `0` when a summary is
1065
+ produced (`2` for usage errors — not a directory). For CI hard gates, use
1066
+ `rac relationships --validate` (exits `1` on broken refs).
1067
+ - **Attention severity.** `error` means the artifact is structurally invalid;
1068
+ `warning` means it is valid but needs attention (missing recommended sections
1069
+ or a stale relationship reference). Items are ordered errors-first, then by
1070
+ path, then by code — deterministically.
1071
+ - **`identifier`** is the artifact's canonical identifier (the same one
1072
+ `rac relationships --validate` resolves against): an explicit `## ID`, else a
1073
+ recognised `TYPE-NNN` filename prefix, else the filename stem.
1074
+ - **`rac stats` vs `rac portfolio`.** `rac stats` provides per-feature
1075
+ requirement and metric breakdowns for requirement-focused portfolios.
1076
+ `rac portfolio` provides a whole-repository intelligence rollup across all
1077
+ artifact types.
1078
+ - **Orphaned** means no other artifact holds a resolved inbound reference to
1079
+ it — the artifact may still declare outbound relationships.
1080
+ - **Coverage** is the fraction of known (non-unknown) artifacts that declare
1081
+ at least one outbound relationship section.
1082
+
1083
+ ---
1084
+
938
1085
  ## Review (Planned)
939
1086
 
940
1087
  AI-assisted product review.
@@ -895,6 +895,153 @@ Notes:
895
895
 
896
896
  ---
897
897
 
898
+ ## Portfolio
899
+
900
+ A single-command repository intelligence summary: artifact counts, validation
901
+ health, completeness, relationship integrity, actionable attention items, and an
902
+ overall health score — without manually combining output from multiple commands.
903
+
904
+ ```bash
905
+ rac portfolio ./docs
906
+ rac portfolio ./docs --json
907
+ rac portfolio ./docs --top-level # don't recurse into subdirectories
908
+ ```
909
+
910
+ ```text
911
+ Repository Summary
912
+ ==================
913
+
914
+ Directory: ./docs
915
+ Artifacts: 42
916
+
917
+ By Type
918
+ -------
919
+
920
+ Requirement 18
921
+ Decision 12
922
+ Roadmap 5
923
+ Prompt 4
924
+ Design 2
925
+ Unknown 1
926
+
927
+ Validation
928
+ ----------
929
+
930
+ Valid: 40
931
+ Invalid: 2
932
+
933
+ Completeness
934
+ ------------
935
+
936
+ 78% (94 / 120 recommended slots filled)
937
+
938
+ Relationships
939
+ -------------
940
+
941
+ Total: 65
942
+ Valid: 63
943
+ Broken: 2
944
+ Orphaned: 4
945
+ Coverage: 71%
946
+
947
+ Attention (4 items)
948
+ ----------
949
+
950
+ ✗ search
951
+ Validation errors: missing-requirements
952
+ ! adr-004
953
+ Missing recommended sections: Alternatives Considered
954
+ ! q3-roadmap
955
+ Related Requirements references missing artifact: REQ-999
956
+ ! req-041
957
+ Missing recommended sections: Risks
958
+
959
+ Health Score
960
+ ------------
961
+
962
+ 87 / 100
963
+ ```
964
+
965
+ `--json` returns the stable machine contract (all fields present regardless of
966
+ content, versioned with `schema_version`):
967
+
968
+ ```json
969
+ {
970
+ "schema_version": "1",
971
+ "directory": "./docs",
972
+ "recursive": true,
973
+ "artifacts": {
974
+ "total": 42,
975
+ "by_type": {
976
+ "requirement": 18,
977
+ "decision": 12,
978
+ "roadmap": 5,
979
+ "prompt": 4,
980
+ "design": 2,
981
+ "unknown": 1
982
+ }
983
+ },
984
+ "validation": { "valid": 40, "invalid": 2 },
985
+ "completeness": { "recommended_slots": 120, "filled": 94, "ratio": 0.7833 },
986
+ "relationships": {
987
+ "total": 65,
988
+ "valid": 63,
989
+ "broken": 2,
990
+ "orphaned": 4,
991
+ "coverage": 0.7143
992
+ },
993
+ "attention": [
994
+ {
995
+ "path": "requirements/search.md",
996
+ "identifier": "search",
997
+ "severity": "error",
998
+ "code": "invalid-artifact",
999
+ "message": "Validation errors: missing-requirements"
1000
+ },
1001
+ {
1002
+ "path": "roadmaps/q3-roadmap.md",
1003
+ "identifier": "q3-roadmap",
1004
+ "severity": "warning",
1005
+ "code": "broken-relationship",
1006
+ "message": "Related Requirements references missing artifact: REQ-999"
1007
+ }
1008
+ ],
1009
+ "health": { "score": 87 }
1010
+ }
1011
+ ```
1012
+
1013
+ **Health score formula** (deterministic, no AI):
1014
+
1015
+ ```
1016
+ score = round(100 × (0.5 × validity + 0.25 × completeness + 0.25 × rel_integrity))
1017
+ ```
1018
+
1019
+ where each sub-score is a simple ratio that defaults to `1.0` when its
1020
+ denominator is zero, so an empty repository always scores 100.
1021
+
1022
+ Notes:
1023
+
1024
+ - **Advisory command.** `rac portfolio` always exits `0` when a summary is
1025
+ produced (`2` for usage errors — not a directory). For CI hard gates, use
1026
+ `rac relationships --validate` (exits `1` on broken refs).
1027
+ - **Attention severity.** `error` means the artifact is structurally invalid;
1028
+ `warning` means it is valid but needs attention (missing recommended sections
1029
+ or a stale relationship reference). Items are ordered errors-first, then by
1030
+ path, then by code — deterministically.
1031
+ - **`identifier`** is the artifact's canonical identifier (the same one
1032
+ `rac relationships --validate` resolves against): an explicit `## ID`, else a
1033
+ recognised `TYPE-NNN` filename prefix, else the filename stem.
1034
+ - **`rac stats` vs `rac portfolio`.** `rac stats` provides per-feature
1035
+ requirement and metric breakdowns for requirement-focused portfolios.
1036
+ `rac portfolio` provides a whole-repository intelligence rollup across all
1037
+ artifact types.
1038
+ - **Orphaned** means no other artifact holds a resolved inbound reference to
1039
+ it — the artifact may still declare outbound relationships.
1040
+ - **Coverage** is the fraction of known (non-unknown) artifacts that declare
1041
+ at least one outbound relationship section.
1042
+
1043
+ ---
1044
+
898
1045
  ## Review (Planned)
899
1046
 
900
1047
  AI-assisted product review.
@@ -506,3 +506,5 @@ Review after the first v0.7.x relationship implementation, or before introducing
506
506
  * Explorer relationship visualisation
507
507
  * workflow-like dependency management
508
508
  * relationship scoring
509
+
510
+ **v0.7.3 note:** `rac portfolio` introduces a health score that includes relationship integrity as one of four weighted factors (0.25 weight). This is the first instance of relationship scoring in RAC Core. The formula is fully deterministic, documented in `rac/portfolio.py`, and uses only counts already produced by `summarize_relationships`. This ADR was reviewed before v0.7.3 implementation; no architectural objections were raised.
@@ -0,0 +1,12 @@
1
+ Create a compact handoff for a fresh coding session.
2
+
3
+ Include only:
4
+ - goal
5
+ - approved scope
6
+ - files changed or likely touched
7
+ - architecture constraints
8
+ - tests required
9
+ - commands to run
10
+ - unresolved questions
11
+
12
+ Do not include conversation history.
@@ -0,0 +1,24 @@
1
+ # RAC Agent Instructions
2
+
3
+ Before coding:
4
+ - Refresh from origin/main unless told otherwise.
5
+ - Read the target roadmap file and relevant ADRs.
6
+ - Produce a plan before implementation.
7
+ - Do not expand release scope beyond the roadmap.
8
+
9
+ Release discipline:
10
+ - Work on a feature branch, not main.
11
+ - Do not include Claude attribution in commits.
12
+ - After GitHub merge, refresh local main.
13
+ - Prune merged branches when asked.
14
+
15
+ Architecture:
16
+ - Prefer schema-driven artifact behavior.
17
+ - Do not add artifact-specific validation paths if a generic path can handle it.
18
+ - Keep classification separate from validation.
19
+ - Invalid but recognizable artifacts may still classify as their artifact type.
20
+
21
+ Testing:
22
+ - Add negative boundary tests for each new artifact type.
23
+ - Test that adjacent artifact types do not misclassify as each other.
24
+ - Run pytest before commit.
@@ -0,0 +1,261 @@
1
+ We are preparing a major release for RAC.
2
+
3
+ Your job is to run a release gate review, not to implement changes yet.
4
+
5
+ Context:
6
+ - RAC is a Markdown-first CLI for requirements-as-code.
7
+ - The system supports typed product artifacts such as Requirements, Decisions, Roadmaps, Designs, and related schema/template/improve/inspect/stats behavior.
8
+ - The product goal is deterministic artifact recognition, structural validation, useful CLI feedback, and stable JSON contracts.
9
+ - The release must not drift into project management, UI rendering, semantic scoring, AI interpretation, collaboration workflows, databases, accounts, or web-app behavior unless explicitly approved.
10
+
11
+ Review the current repository against these gates:
12
+
13
+ ## 1. Product scope gate
14
+
15
+ Identify anything in this release that exceeds the intended product boundary.
16
+
17
+ Check for:
18
+ - behavior that interprets artifact quality instead of validating structure
19
+ - workflow/project-management behavior
20
+ - semantic relationship analysis
21
+ - UI/design-token/rendering behavior
22
+ - hidden AI-like inference
23
+ - new concepts not documented in roadmap, ADRs, or release notes
24
+ - CLI behavior that surprises the user
25
+
26
+ Return:
27
+ - PASS / BLOCK
28
+ - exact files or commands involved
29
+ - required scope cuts before release
30
+
31
+ ## 2. Architecture consistency gate
32
+
33
+ Review whether the artifact model is still coherent.
34
+
35
+ Check:
36
+ - whether classification, validation, stats, schema, templates, inspect, and improve use shared artifact metadata where possible
37
+ - whether any artifact has special-case logic that should be generalized
38
+ - whether Roadmap, Design, Decision, and Requirement behavior follow the same architectural pattern
39
+ - whether new code duplicates existing artifact handling
40
+ - whether any module is becoming too large or too coupled
41
+ - whether public contracts are separated from implementation details
42
+
43
+ Return:
44
+ - PASS / BLOCK
45
+ - duplicated paths
46
+ - special cases that should be removed
47
+ - proposed simplification before release
48
+
49
+ ## 3. Duplication and deletion gate
50
+
51
+ This is a hard simplification review.
52
+
53
+ Answer these directly:
54
+
55
+ - What code became obsolete during this release?
56
+ - What can be deleted before release?
57
+ - What logic was copied instead of shared?
58
+ - Which artifact-specific branches can be collapsed into generic artifact-spec-driven behavior?
59
+ - Did any file grow past a size where it should be split?
60
+ - Are there old fixtures, examples, or docs that now contradict the current model?
61
+ - Are there stale branches, stale roadmap files, or stale TODOs that should be cleaned up?
62
+
63
+ Return:
64
+ - required deletions
65
+ - optional cleanup
66
+ - changes that should wait until after release
67
+
68
+ ## 4. CLI contract gate
69
+
70
+ Review every public command affected by this release.
71
+
72
+ Commands to check:
73
+ - rac validate
74
+ - rac diff
75
+ - rac stats
76
+ - rac inspect
77
+ - rac improve
78
+ - rac schema
79
+ - rac ingest, if touched
80
+
81
+ For each affected command, verify:
82
+ - human output is stable and understandable
83
+ - JSON output is stable and documented
84
+ - exit codes are intentional
85
+ - invalid input behavior is clear
86
+ - warnings vs errors are consistent
87
+ - unsupported artifact behavior is explicit
88
+ - examples in README/docs still work
89
+
90
+ Return a table:
91
+
92
+ Command | Changed? | Human output ok? | JSON ok? | Exit codes ok? | Docs ok? | Blockers
93
+
94
+ ## 5. Classification boundary gate
95
+
96
+ Review artifact classification behavior.
97
+
98
+ Check:
99
+ - Requirements do not classify as Design
100
+ - Designs do not classify as Requirements
101
+ - Roadmaps classify by approved structure, not loose title matching alone except where explicitly intended
102
+ - UI/design-themed titles alone do not classify as Design
103
+ - invalid but recognizable artifacts classify correctly, then fail validation separately
104
+ - incomplete artifacts behave according to the spec
105
+ - mixed documents do not produce surprising classifications
106
+ - negative fixtures exist for adjacent artifact types
107
+
108
+ Return:
109
+ - PASS / BLOCK
110
+ - missing boundary tests
111
+ - risky classification rules
112
+ - recommended fixture additions
113
+
114
+ ## 6. Validation and schema gate
115
+
116
+ Check that validation behavior and schema output agree.
117
+
118
+ Verify:
119
+ - required sections match the artifact specs
120
+ - recommended and optional sections are consistent across schema, templates, validation, and docs
121
+ - metadata vocabularies are enforced consistently
122
+ - missing required sections produce clear errors
123
+ - invalid metadata values produce clear errors
124
+ - schema JSON is stable and documented
125
+ - template output follows canonical section order
126
+
127
+ Return:
128
+ - mismatches
129
+ - missing tests
130
+ - release blockers
131
+
132
+ ## 7. Test and verification gate
133
+
134
+ Do not accept “tests pass” as enough.
135
+
136
+ Run or identify the exact commands needed to verify the release.
137
+
138
+ Check:
139
+ - unit tests for changed behavior
140
+ - CLI smoke tests
141
+ - classification boundary tests
142
+ - negative fixtures
143
+ - JSON output snapshots or equivalent assertions
144
+ - docs examples manually or automatically verified
145
+ - packaging/build check
146
+ - import check from a clean environment, if practical
147
+
148
+ Return:
149
+ - exact commands run
150
+ - exact commands still needed
151
+ - failures
152
+ - missing test files
153
+ - blockers
154
+
155
+ If tests are missing for new behavior, mark the release BLOCKED.
156
+
157
+ ## 8. Documentation gate
158
+
159
+ Review documentation from a new user’s point of view.
160
+
161
+ Check:
162
+ - README reflects current commands
163
+ - artifact docs match implementation
164
+ - examples use current output
165
+ - release notes or changelog entry exists
166
+ - ADRs are not contradicted
167
+ - roadmap item is updated or marked complete
168
+ - install/publish instructions are still accurate
169
+ - known limitations are explicit
170
+
171
+ Return:
172
+ - stale docs
173
+ - missing docs
174
+ - docs that overpromise behavior
175
+
176
+ ## 9. Release hygiene gate
177
+
178
+ Check repository and release state.
179
+
180
+ Verify:
181
+ - working tree is clean
182
+ - release branch is based on current origin/main
183
+ - merged branches are pruned or listed for pruning
184
+ - version number is updated consistently
185
+ - package metadata is correct
186
+ - no generated Claude attribution appears in commits, PR text, release notes, or docs
187
+ - CI is green
188
+ - build artifacts are not accidentally committed
189
+ - no credentials or local paths leaked
190
+
191
+ Return:
192
+ - PASS / BLOCK
193
+ - exact commands to confirm state
194
+ - required cleanup
195
+
196
+ ## 10. Backward compatibility and migration gate
197
+
198
+ Identify anything that could break existing users.
199
+
200
+ Check:
201
+ - command names
202
+ - arguments and flags
203
+ - JSON field names
204
+ - exit codes
205
+ - artifact classification behavior
206
+ - validation strictness
207
+ - package extras
208
+ - import paths
209
+ - documented examples
210
+
211
+ Return:
212
+ - breaking changes
213
+ - whether each breaking change is intentional
214
+ - migration note required
215
+ - release blocker if undocumented
216
+
217
+ ## Output format
218
+
219
+ Return the review in this structure:
220
+
221
+ # Major Release Gate Review
222
+
223
+ ## Decision
224
+ PASS or BLOCK
225
+
226
+ ## Release blockers
227
+ List only issues that must be fixed before release.
228
+
229
+ ## Required simplifications
230
+ List duplication, deletion, or extraction work required before release.
231
+
232
+ ## Test evidence
233
+ List commands run and results. If not run, say NOT RUN.
234
+
235
+ ## Product scope issues
236
+ List any behavior that exceeds the intended boundary.
237
+
238
+ ## Architecture issues
239
+ List duplicated or inconsistent implementation paths.
240
+
241
+ ## CLI contract issues
242
+ List command/output/JSON/exit-code problems.
243
+
244
+ ## Documentation issues
245
+ List stale, missing, or overpromising docs.
246
+
247
+ ## Release hygiene issues
248
+ List branch/version/CI/commit/publishing concerns.
249
+
250
+ ## Safe to defer
251
+ List cleanup that is real but not release-blocking.
252
+
253
+ ## Exact next actions
254
+ Give a short checklist of the next changes to make.
255
+
256
+ Important rules:
257
+ - Do not implement anything in this pass.
258
+ - Do not invent test results. If you did not run a command, mark it NOT RUN.
259
+ - Cite exact files and commands.
260
+ - Treat missing tests for new public behavior as a blocker.
261
+ - Treat duplicated artifact-specific
@@ -0,0 +1,23 @@
1
+ # Minor Release Gate
2
+
3
+ Before completing any 0.x.n release:
4
+
5
+ ## Duplication
6
+ - Did this release add artifact-specific classification logic?
7
+ - Did it duplicate validation, schema, template, stats, or improve behavior?
8
+ - Can new behavior be expressed through ArtifactSpec instead?
9
+ - Are there two sources of truth for sections, metadata, or guidance?
10
+
11
+ ## Simplification
12
+ - What code became obsolete?
13
+ - What branch or special case can be removed?
14
+ - Did any file grow past the agreed limit?
15
+ - Should a helper be extracted?
16
+ - Did this release increase the number of artifact-specific conditionals?
17
+
18
+ ## Verification
19
+ - Are there negative classification tests?
20
+ - Are adjacent artifact types tested against each other?
21
+ - Are incomplete-but-recognizable artifacts tested?
22
+ - Are CLI human and JSON outputs tested?
23
+ - Was pytest run before commit?
@@ -0,0 +1,23 @@
1
+ We are working on RAC, a Python CLI for requirements-as-code.
2
+
3
+ RAC models product-management Markdown artifacts as deterministic, typed artifacts.
4
+ Current artifact families include Requirements, Decisions, Roadmaps, Prompts, and Design.
5
+
6
+ Core principles:
7
+ - Markdown-first.
8
+ - Deterministic classification.
9
+ - Structural validation, not semantic scoring unless explicitly planned.
10
+ - CLI contracts matter: human output, JSON output, exit codes, and templates must be specified.
11
+ - Version numbers are scope fences.
12
+ - Prefer schema/artifact-spec-driven behavior over artifact-specific branches.
13
+ - Invalid but recognizable artifacts may still classify as their artifact type, then fail validation.
14
+
15
+ Before coding:
16
+ 1. Refresh from `origin/main`.
17
+ 2. Confirm branch state.
18
+ 3. Read the relevant roadmap item.
19
+ 4. Check against ADRs.
20
+ 5. Produce an implementation contract.
21
+ 6. Wait for approval.
22
+
23
+ Do not implement until I approve the plan.
@@ -50,6 +50,12 @@ class ArtifactSpec:
50
50
  # matching, so synonyms contribute to confidence. Matching is deterministic
51
51
  # (dict lookup) and case-insensitive (headings are normalized first).
52
52
  synonyms: dict[str, str] = field(default_factory=dict)
53
+ # Canonical-identifier section (v0.7.2 relationship validation): the normalized
54
+ # section name whose value is this artifact type's identifier, consulted by
55
+ # ``rac.relationships.artifact_identifier`` before falling back to the filename
56
+ # stem. A forward hook — no spec sets it today; relationship resolution works
57
+ # from the ``## ID`` section and filename stem until a type opts in.
58
+ id_field: str | None = None
53
59
 
54
60
  @property
55
61
  def expected(self) -> tuple[str, ...]: