mapify-cli 3.15.2__tar.gz → 3.16.0__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 (409) hide show
  1. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/PKG-INFO +3 -3
  2. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/README.md +2 -2
  3. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/pyproject.toml +1 -1
  4. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/__init__.py +1 -1
  5. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/schemas.py +37 -0
  6. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +345 -3
  7. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +13 -9
  8. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +345 -3
  9. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +13 -9
  10. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_artifact_schemas.py +15 -0
  11. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_map_step_runner.py +175 -0
  12. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/.claude/hooks/README.md +0 -0
  13. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/.claude/skills/README.md +0 -0
  14. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/.gitignore +0 -0
  15. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/LICENSE +0 -0
  16. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/_locking.py +0 -0
  17. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/cli_ui.py +0 -0
  18. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/config/__init__.py +0 -0
  19. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/config/mcp.py +0 -0
  20. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/config/project_config.py +0 -0
  21. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/config/settings.py +0 -0
  22. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/__init__.py +0 -0
  23. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
  24. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/codex_copier.py +0 -0
  25. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/file_copier.py +0 -0
  26. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
  27. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/providers.py +0 -0
  28. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
  29. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/dependency_graph.py +0 -0
  30. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/intent_detector.py +0 -0
  31. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/memory/__init__.py +0 -0
  32. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/memory/capture.py +0 -0
  33. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/memory/digest_schema.py +0 -0
  34. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/memory/finalize.py +0 -0
  35. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/memory/recall.py +0 -0
  36. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/ralph_state.py +0 -0
  37. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/repo_insight.py +0 -0
  38. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skill_ir.py +0 -0
  39. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
  40. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
  41. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
  42. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
  43. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
  44. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
  45. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
  46. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
  47. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/runner.py +0 -0
  48. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
  49. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/.gitignore +0 -0
  50. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
  51. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/actor.md +0 -0
  52. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/debate-arbiter.md +0 -0
  53. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
  54. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
  55. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
  56. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/monitor.md +0 -0
  57. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
  58. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
  59. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
  60. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/synthesizer.md +0 -0
  61. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
  62. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
  63. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
  64. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
  65. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/researcher.toml +0 -0
  66. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/config.toml +0 -0
  67. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
  68. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
  69. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
  70. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
  71. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
  72. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
  73. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
  74. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
  75. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/README.md +0 -0
  76. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
  77. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
  78. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
  79. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
  80. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
  81. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
  82. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
  83. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
  84. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
  85. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
  86. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
  87. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
  88. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +0 -0
  89. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +0 -0
  90. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
  91. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
  92. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +0 -0
  93. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
  94. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
  95. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
  96. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
  97. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
  98. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
  99. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
  100. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
  101. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
  102. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
  103. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
  104. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
  105. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
  106. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
  107. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
  108. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
  109. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
  110. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
  111. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
  112. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
  113. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
  114. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
  115. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/settings.json +0 -0
  116. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/README.md +0 -0
  117. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
  118. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
  119. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
  120. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
  121. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
  122. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
  123. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
  124. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
  125. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
  126. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
  127. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
  128. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
  129. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
  130. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
  131. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
  132. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
  133. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
  134. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
  135. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
  136. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
  137. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
  138. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
  139. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
  140. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
  141. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
  142. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
  143. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
  144. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
  145. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
  146. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
  147. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
  148. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
  149. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
  150. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
  151. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
  152. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
  153. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
  154. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
  155. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -0
  156. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
  157. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
  158. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
  159. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
  160. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
  161. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
  162. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
  163. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -0
  164. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
  165. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
  166. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
  167. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
  168. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +0 -0
  169. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
  170. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
  171. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
  172. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
  173. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
  174. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
  175. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
  176. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
  177. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
  178. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
  179. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
  180. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
  181. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
  182. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
  183. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
  184. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
  185. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
  186. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
  187. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
  188. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
  189. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
  190. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
  191. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +0 -0
  192. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +0 -0
  193. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
  194. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
  195. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +0 -0
  196. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
  197. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
  198. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
  199. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
  200. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
  201. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
  202. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
  203. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
  204. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
  205. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
  206. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
  207. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
  208. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
  209. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
  210. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
  211. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
  212. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
  213. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
  214. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
  215. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
  216. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
  217. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
  218. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
  219. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
  220. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
  221. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
  222. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
  223. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
  224. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
  225. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
  226. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
  227. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
  228. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
  229. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
  230. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
  231. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
  232. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
  233. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
  234. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
  235. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
  236. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
  237. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
  238. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
  239. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
  240. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
  241. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
  242. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
  243. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
  244. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
  245. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
  246. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
  247. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
  248. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
  249. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
  250. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
  251. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
  252. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
  253. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
  254. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
  255. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/token_budget.py +0 -0
  256. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/tools/__init__.py +0 -0
  257. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
  258. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/verification_recorder.py +0 -0
  259. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/workflow_finalizer.py +0 -0
  260. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/workflow_logger.py +0 -0
  261. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/src/mapify_cli/workflow_state.py +0 -0
  262. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/__init__.py +0 -0
  263. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/conftest.py +0 -0
  264. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/fixtures/claude/escalation-matrix.md +0 -0
  265. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/fixtures/codex/config.toml +0 -0
  266. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
  267. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/hooks/test_end_of_turn.py +0 -0
  268. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
  269. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/hooks/test_safety_guardrails.py +0 -0
  270. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/__init__.py +0 -0
  271. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/blueprint.json +0 -0
  272. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/code_review.md +0 -0
  273. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/plan_handoff.json +0 -0
  274. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/spec.md +0 -0
  275. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
  276. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
  277. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/task_plan.md +0 -0
  278. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/fixtures/verification_summary.md +0 -0
  279. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
  280. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
  281. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/README.md +0 -0
  282. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
  283. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
  284. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
  285. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
  286. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
  287. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
  288. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
  289. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
  290. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
  291. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
  292. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
  293. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
  294. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
  295. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
  296. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
  297. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
  298. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
  299. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
  300. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
  301. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
  302. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
  303. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
  304. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
  305. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
  306. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
  307. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
  308. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
  309. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
  310. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
  311. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
  312. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
  313. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
  314. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
  315. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
  316. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
  317. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
  318. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
  319. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
  320. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
  321. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
  322. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
  323. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
  324. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
  325. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
  326. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
  327. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
  328. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
  329. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
  330. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
  331. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
  332. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
  333. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
  334. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
  335. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
  336. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
  337. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
  338. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
  339. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
  340. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
  341. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
  342. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
  343. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
  344. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
  345. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
  346. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
  347. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
  348. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
  349. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
  350. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
  351. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
  352. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
  353. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
  354. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_agent_cli_correctness.py +0 -0
  355. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_agent_frontmatter.py +0 -0
  356. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_bump_version.py +0 -0
  357. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_decomposition.py +0 -0
  358. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_dependency_graph.py +0 -0
  359. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_diagnostics.py +0 -0
  360. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_digest_schema.py +0 -0
  361. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_file_copier.py +0 -0
  362. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_hook_patterns.py +0 -0
  363. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_init_import_graph.py +0 -0
  364. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_intent_detector.py +0 -0
  365. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
  366. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_jinja2_dep.py +0 -0
  367. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_locking.py +0 -0
  368. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_managed_file_copier.py +0 -0
  369. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_map_orchestrator.py +0 -0
  370. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_map_token_meter.py +0 -0
  371. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_map_utils_sanitize.py +0 -0
  372. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_mapify_cli.py +0 -0
  373. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_memory_capture.py +0 -0
  374. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_memory_finalize.py +0 -0
  375. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_memory_integration.py +0 -0
  376. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_memory_recall.py +0 -0
  377. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_memory_review_fixes.py +0 -0
  378. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_post_compact_context.py +0 -0
  379. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_ralph_hooks.py +0 -0
  380. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_ralph_state.py +0 -0
  381. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_repo_insight.py +0 -0
  382. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_schemas.py +0 -0
  383. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skill_ir.py +0 -0
  384. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills.py +0 -0
  385. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_consistency.py +0 -0
  386. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_aggregator.py +0 -0
  387. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_apply.py +0 -0
  388. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_cli_optimize.py +0 -0
  389. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
  390. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
  391. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_fixtures.py +0 -0
  392. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_optimizer.py +0 -0
  393. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
  394. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_proposer.py +0 -0
  395. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_runner.py +0 -0
  396. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_schema.py +0 -0
  397. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_skills_eval_viewer.py +0 -0
  398. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_sofa_client.py +0 -0
  399. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_sofa_search.py +0 -0
  400. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_template_render.py +0 -0
  401. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_token_budget.py +0 -0
  402. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_validate_dependencies.py +0 -0
  403. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_validate_spec_citations.py +0 -0
  404. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_verification_recorder.py +0 -0
  405. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_workflow_context_injector.py +0 -0
  406. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_workflow_finalizer.py +0 -0
  407. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_workflow_gate.py +0 -0
  408. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_workflow_logger.py +0 -0
  409. {mapify_cli-3.15.2 → mapify_cli-3.16.0}/tests/test_workflow_state.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapify-cli
3
- Version: 3.15.2
3
+ Version: 3.16.0
4
4
  Summary: MAP Framework installer - Modular Agentic Planner for Claude Code
5
5
  Project-URL: Homepage, https://github.com/azalio/map-framework
6
6
  Project-URL: Repository, https://github.com/azalio/map-framework.git
@@ -211,9 +211,9 @@ These flows maintain branch-scoped artifacts under `.map/<branch>/` — `bluepri
211
211
  - **Mutation boundary constraints** — write-capable Claude and Codex surfaces tell agents not to edit unrelated files, add or upgrade dependencies, or refactor neighboring code unless the current subtask requires it. Broader scope is reported as a blocker or tradeoff instead of silently expanding the diff.
212
212
  - **Context-first prompt envelopes** — high-context `/map-plan`, `/map-efficient`, `/map-debug`, and `/map-review` prompts wrap branch artifacts in XML-style `<documents>`, then state the `<task>` and `<expected_output>`, so specs, diffs, logs, and schemas stay separated for the model.
213
213
  - **Contract-sized subtasks** — blueprints require `expected_diff_size`, `concern_type`, `one_logical_step`, `hard_constraints`, `soft_constraints`, and `coverage_map`. Hard constraints must be owned in `coverage_map` and cited in the owning subtask; soft constraints can be traded off only with explicit `tradeoff_rationale`.
214
- - **Token budget report** — Actor and review prompt builders append active-path budget decisions to `.map/<branch>/token_budget.json` (before/after estimated tokens, clipped sections, source artifacts). The operator breadcrumb for diagnosing missing context.
214
+ - **Token budget and research ROI reports** — Actor and review prompt builders append active-path budget decisions to `.map/<branch>/token_budget.json`, while `token_accounting.json` and `/map-tokenreport` separate research-agent/researcher cost from Actor/Monitor cost so operators can see whether delegated research paid for itself.
215
215
  - **Clean retry quarantine** — after repeated Monitor rejection, write-capable workflows switch the next attempt into clean-retry mode using `.map/<branch>/retry_quarantine.json` (constraints, required evidence, do-not-repeat feedback) instead of raw failed-session context.
216
- - **Run health report** — workflows write `.map/<branch>/run_health_report.json` during closeout: terminal status, step progress, retry counters, artifact presence, hook-injection status. CI can fail inconsistent closeouts with `python3 .map/scripts/map_step_runner.py validate_run_health_report`.
216
+ - **Run health report** — workflows write `.map/<branch>/run_health_report.json` during closeout: terminal status, step progress, retry counters, artifact presence, hook-injection status, and advisory research artifact/ROI signals. CI can fail inconsistent closeouts with `python3 .map/scripts/map_step_runner.py validate_run_health_report`.
217
217
  - **Compact recovery surface** — `/map-resume` keeps the active recovery flow short and moves low-frequency notes to `resume-reference.md`, so recovery after `/clear` or context exhaustion gives the next checkpoint action without loading the whole appendix.
218
218
  - **Skill IR audit** — release checks lower shipped Claude and Codex `SKILL.md` files into a typed `SkillIR`, verify content hashes, catch unsupported frontmatter, reject missing supporting-file links, and block injection-like instructions before `mapify init` copies surfaces into user repos.
219
219
 
@@ -167,9 +167,9 @@ These flows maintain branch-scoped artifacts under `.map/<branch>/` — `bluepri
167
167
  - **Mutation boundary constraints** — write-capable Claude and Codex surfaces tell agents not to edit unrelated files, add or upgrade dependencies, or refactor neighboring code unless the current subtask requires it. Broader scope is reported as a blocker or tradeoff instead of silently expanding the diff.
168
168
  - **Context-first prompt envelopes** — high-context `/map-plan`, `/map-efficient`, `/map-debug`, and `/map-review` prompts wrap branch artifacts in XML-style `<documents>`, then state the `<task>` and `<expected_output>`, so specs, diffs, logs, and schemas stay separated for the model.
169
169
  - **Contract-sized subtasks** — blueprints require `expected_diff_size`, `concern_type`, `one_logical_step`, `hard_constraints`, `soft_constraints`, and `coverage_map`. Hard constraints must be owned in `coverage_map` and cited in the owning subtask; soft constraints can be traded off only with explicit `tradeoff_rationale`.
170
- - **Token budget report** — Actor and review prompt builders append active-path budget decisions to `.map/<branch>/token_budget.json` (before/after estimated tokens, clipped sections, source artifacts). The operator breadcrumb for diagnosing missing context.
170
+ - **Token budget and research ROI reports** — Actor and review prompt builders append active-path budget decisions to `.map/<branch>/token_budget.json`, while `token_accounting.json` and `/map-tokenreport` separate research-agent/researcher cost from Actor/Monitor cost so operators can see whether delegated research paid for itself.
171
171
  - **Clean retry quarantine** — after repeated Monitor rejection, write-capable workflows switch the next attempt into clean-retry mode using `.map/<branch>/retry_quarantine.json` (constraints, required evidence, do-not-repeat feedback) instead of raw failed-session context.
172
- - **Run health report** — workflows write `.map/<branch>/run_health_report.json` during closeout: terminal status, step progress, retry counters, artifact presence, hook-injection status. CI can fail inconsistent closeouts with `python3 .map/scripts/map_step_runner.py validate_run_health_report`.
172
+ - **Run health report** — workflows write `.map/<branch>/run_health_report.json` during closeout: terminal status, step progress, retry counters, artifact presence, hook-injection status, and advisory research artifact/ROI signals. CI can fail inconsistent closeouts with `python3 .map/scripts/map_step_runner.py validate_run_health_report`.
173
173
  - **Compact recovery surface** — `/map-resume` keeps the active recovery flow short and moves low-frequency notes to `resume-reference.md`, so recovery after `/clear` or context exhaustion gives the next checkpoint action without loading the whole appendix.
174
174
  - **Skill IR audit** — release checks lower shipped Claude and Codex `SKILL.md` files into a typed `SkillIR`, verify content hashes, catch unsupported frontmatter, reject missing supporting-file links, and block injection-like instructions before `mapify init` copies surfaces into user repos.
175
175
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mapify-cli"
3
- version = "3.15.2"
3
+ version = "3.16.0"
4
4
  description = "MAP Framework installer - Modular Agentic Planner for Claude Code"
5
5
  authors = [{ name = "MAP Framework Contributors" }]
6
6
  readme = "README.md"
@@ -23,7 +23,7 @@ Or install globally:
23
23
  mapify check
24
24
  """
25
25
 
26
- __version__ = "3.15.2"
26
+ __version__ = "3.16.0"
27
27
 
28
28
  import os
29
29
  import subprocess
@@ -963,6 +963,42 @@ _RUN_HEALTH_ARTIFACT_KEYS = [
963
963
  ]
964
964
 
965
965
 
966
+ _RUN_HEALTH_RESEARCH_SCHEMA = {
967
+ "type": "object",
968
+ "properties": {
969
+ "schema_version": {"type": "string"},
970
+ "artifact_count": {"type": "integer", "minimum": 0},
971
+ "valid_artifact_count": {"type": "integer", "minimum": 0},
972
+ "invalid_artifact_count": {"type": "integer", "minimum": 0},
973
+ "low_confidence_artifact_count": {"type": "integer", "minimum": 0},
974
+ "location_count": {"type": "integer", "minimum": 0},
975
+ "research_tokens": {"type": "integer", "minimum": 0},
976
+ "research_est_cost_usd": {"type": "number", "minimum": 0},
977
+ "actor_monitor_tokens": {"type": "integer", "minimum": 0},
978
+ "actor_monitor_est_cost_usd": {"type": "number", "minimum": 0},
979
+ "research_token_share": {"type": "number", "minimum": 0},
980
+ "by_subtask": {"type": "object"},
981
+ "warnings": {"type": "array", "items": {"type": "string"}},
982
+ },
983
+ "required": [
984
+ "schema_version",
985
+ "artifact_count",
986
+ "valid_artifact_count",
987
+ "invalid_artifact_count",
988
+ "low_confidence_artifact_count",
989
+ "location_count",
990
+ "research_tokens",
991
+ "research_est_cost_usd",
992
+ "actor_monitor_tokens",
993
+ "actor_monitor_est_cost_usd",
994
+ "research_token_share",
995
+ "by_subtask",
996
+ "warnings",
997
+ ],
998
+ "additionalProperties": False,
999
+ }
1000
+
1001
+
966
1002
  RUN_HEALTH_REPORT_SCHEMA = {
967
1003
  "$schema": "https://json-schema.org/draft/2020-12/schema",
968
1004
  "$id": "https://mapframework.dev/schemas/run-health-report.json",
@@ -992,6 +1028,7 @@ RUN_HEALTH_REPORT_SCHEMA = {
992
1028
  "required": _RUN_HEALTH_ARTIFACT_KEYS,
993
1029
  "additionalProperties": _RUN_HEALTH_ARTIFACT_ENTRY_SCHEMA,
994
1030
  },
1031
+ "research": _RUN_HEALTH_RESEARCH_SCHEMA,
995
1032
  "resiliency_signals": {
996
1033
  "type": "object",
997
1034
  "properties": {
@@ -711,6 +711,20 @@ def _coerce_token_int(value: object) -> int:
711
711
  return 0
712
712
 
713
713
 
714
+ def _coerce_token_float(value: object) -> float:
715
+ """Best-effort float from a cost/share field that may come from JSON."""
716
+ if isinstance(value, bool):
717
+ return 0.0
718
+ if isinstance(value, (int, float)):
719
+ return float(value)
720
+ if isinstance(value, str):
721
+ try:
722
+ return float(value)
723
+ except ValueError:
724
+ return 0.0
725
+ return 0.0
726
+
727
+
714
728
  def _usage_token_total(usage: Mapping[str, object]) -> int:
715
729
  """Sum of the four token fields for one usage record.
716
730
 
@@ -926,6 +940,104 @@ def _empty_token_bucket() -> dict[str, float]:
926
940
  return {field: 0 for field in _TOKEN_FIELDS}
927
941
 
928
942
 
943
+ _RESEARCH_AGENT_NAMES = frozenset({"research-agent", "researcher"})
944
+ _ACTOR_MONITOR_AGENT_NAMES = frozenset({"actor", "monitor"})
945
+ _RESEARCH_LOW_CONFIDENCE_THRESHOLD = 0.5
946
+
947
+
948
+ def _empty_token_counter_bucket() -> dict[str, float]:
949
+ return {**_empty_token_bucket(), "est_cost_usd": 0.0, "event_count": 0}
950
+
951
+
952
+ def _accumulate_token_bucket(
953
+ bucket: dict[str, float], usage: Mapping[str, object], row_cost: float
954
+ ) -> None:
955
+ for field in _TOKEN_FIELDS:
956
+ bucket[field] += _coerce_token_int(usage.get(field, 0))
957
+ bucket["est_cost_usd"] = round(bucket.get("est_cost_usd", 0.0) + row_cost, 6)
958
+ bucket["event_count"] = bucket.get("event_count", 0) + 1
959
+
960
+
961
+ def _token_bucket_total(bucket: Mapping[str, object]) -> int:
962
+ return sum(_coerce_token_int(bucket.get(field, 0)) for field in _TOKEN_FIELDS)
963
+
964
+
965
+ def _is_research_token_source(agent: str, phase: str) -> bool:
966
+ return agent in _RESEARCH_AGENT_NAMES or phase.upper() == "RESEARCH"
967
+
968
+
969
+ def _is_actor_monitor_token_source(agent: str, phase: str) -> bool:
970
+ return agent in _ACTOR_MONITOR_AGENT_NAMES or phase.upper() in {"ACTOR", "MONITOR"}
971
+
972
+
973
+ def _build_research_roi_summary(
974
+ research_by_subtask: Mapping[str, Mapping[str, object]],
975
+ actor_monitor_by_subtask: Mapping[str, Mapping[str, object]],
976
+ aggregate: Mapping[str, object],
977
+ ) -> dict[str, object]:
978
+ """Return advisory research cost vs downstream Actor/Monitor cost."""
979
+ aggregate_tokens = _token_bucket_total(aggregate)
980
+ total_research_tokens = sum(
981
+ _token_bucket_total(bucket) for bucket in research_by_subtask.values()
982
+ )
983
+ total_actor_monitor_tokens = sum(
984
+ _token_bucket_total(bucket) for bucket in actor_monitor_by_subtask.values()
985
+ )
986
+ total_research_cost = round(
987
+ sum(
988
+ _coerce_token_float(bucket.get("est_cost_usd", 0.0))
989
+ for bucket in research_by_subtask.values()
990
+ ),
991
+ 6,
992
+ )
993
+ total_actor_monitor_cost = round(
994
+ sum(
995
+ _coerce_token_float(bucket.get("est_cost_usd", 0.0))
996
+ for bucket in actor_monitor_by_subtask.values()
997
+ ),
998
+ 6,
999
+ )
1000
+
1001
+ by_subtask: dict[str, dict[str, object]] = {}
1002
+ for sid in sorted(set(research_by_subtask) | set(actor_monitor_by_subtask)):
1003
+ research_bucket = research_by_subtask.get(sid, {})
1004
+ downstream_bucket = actor_monitor_by_subtask.get(sid, {})
1005
+ research_tokens = _token_bucket_total(research_bucket)
1006
+ downstream_tokens = _token_bucket_total(downstream_bucket)
1007
+ comparable_tokens = research_tokens + downstream_tokens
1008
+ by_subtask[sid] = {
1009
+ "research_tokens": research_tokens,
1010
+ "research_est_cost_usd": round(
1011
+ _coerce_token_float(research_bucket.get("est_cost_usd", 0.0)), 6
1012
+ ),
1013
+ "research_event_count": _coerce_token_int(
1014
+ research_bucket.get("event_count", 0)
1015
+ ),
1016
+ "actor_monitor_tokens": downstream_tokens,
1017
+ "actor_monitor_est_cost_usd": round(
1018
+ _coerce_token_float(downstream_bucket.get("est_cost_usd", 0.0)), 6
1019
+ ),
1020
+ "actor_monitor_event_count": _coerce_token_int(
1021
+ downstream_bucket.get("event_count", 0)
1022
+ ),
1023
+ "research_token_share": round(research_tokens / comparable_tokens, 4)
1024
+ if comparable_tokens
1025
+ else 0.0,
1026
+ }
1027
+
1028
+ return {
1029
+ "schema_version": "1.0",
1030
+ "research_tokens": total_research_tokens,
1031
+ "research_est_cost_usd": total_research_cost,
1032
+ "actor_monitor_tokens": total_actor_monitor_tokens,
1033
+ "actor_monitor_est_cost_usd": total_actor_monitor_cost,
1034
+ "research_token_share": round(total_research_tokens / aggregate_tokens, 4)
1035
+ if aggregate_tokens
1036
+ else 0.0,
1037
+ "by_subtask": by_subtask,
1038
+ }
1039
+
1040
+
929
1041
  def _rebuild_token_accounting(branch: Optional[str] = None) -> dict[str, object]:
930
1042
  """Roll token_log.jsonl up into token_accounting.json.
931
1043
 
@@ -942,6 +1054,8 @@ def _rebuild_token_accounting(branch: Optional[str] = None) -> dict[str, object]
942
1054
  by_subtask: dict[str, dict[str, float]] = {}
943
1055
  by_agent: dict[str, dict[str, float]] = {}
944
1056
  by_phase: dict[str, dict[str, float]] = {}
1057
+ research_by_subtask: dict[str, dict[str, float]] = {}
1058
+ actor_monitor_by_subtask: dict[str, dict[str, float]] = {}
945
1059
  aggregate: dict[str, float] = _empty_token_bucket()
946
1060
  total_cost = 0.0
947
1061
  event_count = 0
@@ -991,10 +1105,13 @@ def _rebuild_token_accounting(branch: Optional[str] = None) -> dict[str, object]
991
1105
  }
992
1106
  row_cost = _token_cost(usage, model)
993
1107
  total_cost += row_cost
1108
+ subtask_id = str(row.get("subtask_id") or "unattributed")
1109
+ agent = str(row.get("agent") or "unknown")
1110
+ phase = str(row.get("phase") or "unknown")
994
1111
  for dim_key, dim in (
995
- (str(row.get("subtask_id") or "unattributed"), by_subtask),
996
- (str(row.get("agent") or "unknown"), by_agent),
997
- (str(row.get("phase") or "unknown"), by_phase),
1112
+ (subtask_id, by_subtask),
1113
+ (agent, by_agent),
1114
+ (phase, by_phase),
998
1115
  ):
999
1116
  bucket = dim.setdefault(
1000
1117
  dim_key, {**_empty_token_bucket(), "est_cost_usd": 0.0}
@@ -1007,6 +1124,23 @@ def _rebuild_token_accounting(branch: Optional[str] = None) -> dict[str, object]
1007
1124
  for field in _TOKEN_FIELDS:
1008
1125
  aggregate[field] += usage[field]
1009
1126
 
1127
+ if _is_research_token_source(agent, phase):
1128
+ _accumulate_token_bucket(
1129
+ research_by_subtask.setdefault(
1130
+ subtask_id, _empty_token_counter_bucket()
1131
+ ),
1132
+ usage,
1133
+ row_cost,
1134
+ )
1135
+ elif _is_actor_monitor_token_source(agent, phase):
1136
+ _accumulate_token_bucket(
1137
+ actor_monitor_by_subtask.setdefault(
1138
+ subtask_id, _empty_token_counter_bucket()
1139
+ ),
1140
+ usage,
1141
+ row_cost,
1142
+ )
1143
+
1010
1144
  cache_read = aggregate["cache_read"]
1011
1145
  cacheable = aggregate["input"] + cache_read
1012
1146
  aggregate["cache_hit_ratio"] = (
@@ -1023,6 +1157,9 @@ def _rebuild_token_accounting(branch: Optional[str] = None) -> dict[str, object]
1023
1157
  "by_subtask": by_subtask,
1024
1158
  "by_agent": by_agent,
1025
1159
  "by_phase": by_phase,
1160
+ "research_roi": _build_research_roi_summary(
1161
+ research_by_subtask, actor_monitor_by_subtask, aggregate
1162
+ ),
1026
1163
  }
1027
1164
  _write_json_file(get_branch_dir(branch_name) / TOKEN_ACCOUNTING_NAME, payload)
1028
1165
  return payload
@@ -1034,6 +1171,8 @@ def token_report(branch: Optional[str] = None) -> str:
1034
1171
  payload = _rebuild_token_accounting(branch_name)
1035
1172
  aggregate = cast(dict[str, float], payload["aggregate"])
1036
1173
  by_subtask = cast(dict[str, dict[str, float]], payload["by_subtask"])
1174
+ by_agent = cast(dict[str, dict[str, float]], payload["by_agent"])
1175
+ research_roi = cast(dict[str, object], payload.get("research_roi", {}))
1037
1176
 
1038
1177
  header = (
1039
1178
  f"{'subtask':<18}{'input':>13}{'output':>12}"
@@ -1061,6 +1200,24 @@ def token_report(branch: Optional[str] = None) -> str:
1061
1200
  rows.append(_fmt(sid, by_subtask[sid]))
1062
1201
  rows.append("-" * len(header))
1063
1202
  rows.append(_fmt("TOTAL", aggregate))
1203
+
1204
+ if by_agent:
1205
+ rows.extend(["", "By agent", header, "-" * len(header)])
1206
+ for agent in sorted(by_agent):
1207
+ rows.append(_fmt(agent, by_agent[agent]))
1208
+
1209
+ rows.append("")
1210
+ research_tokens = _coerce_token_int(research_roi.get("research_tokens", 0))
1211
+ actor_monitor_tokens = _coerce_token_int(
1212
+ research_roi.get("actor_monitor_tokens", 0)
1213
+ )
1214
+ research_share = _coerce_token_float(research_roi.get("research_token_share", 0.0)) * 100
1215
+ rows.append(
1216
+ "research ROI: "
1217
+ f"research {research_tokens:,} tokens / "
1218
+ f"actor+monitor {actor_monitor_tokens:,} tokens "
1219
+ f"({research_share:.1f}% of run tokens)"
1220
+ )
1064
1221
  rows.append("")
1065
1222
  ratio = float(aggregate.get("cache_hit_ratio", 0.0)) * 100
1066
1223
  rows.append(
@@ -3213,6 +3370,158 @@ def _run_health_artifact_inventory(
3213
3370
  }
3214
3371
 
3215
3372
 
3373
+ def _default_research_roi_summary() -> dict[str, object]:
3374
+ return {
3375
+ "schema_version": "1.0",
3376
+ "research_tokens": 0,
3377
+ "research_est_cost_usd": 0.0,
3378
+ "actor_monitor_tokens": 0,
3379
+ "actor_monitor_est_cost_usd": 0.0,
3380
+ "research_token_share": 0.0,
3381
+ "by_subtask": {},
3382
+ }
3383
+
3384
+
3385
+ def _research_filename_parts(path: Path) -> tuple[str, str]:
3386
+ if "__" not in path.stem:
3387
+ return (path.stem, "unknown")
3388
+ subtask_id, kind = path.stem.split("__", 1)
3389
+ return (subtask_id or "unknown", kind or "unknown")
3390
+
3391
+
3392
+ def _research_health_subtask_entry(
3393
+ by_subtask: dict[str, dict[str, object]], subtask_id: str
3394
+ ) -> dict[str, object]:
3395
+ return by_subtask.setdefault(
3396
+ subtask_id,
3397
+ {
3398
+ "artifact_count": 0,
3399
+ "valid_artifact_count": 0,
3400
+ "invalid_artifact_count": 0,
3401
+ "low_confidence_artifact_count": 0,
3402
+ "location_count": 0,
3403
+ "statuses": [],
3404
+ "kinds": [],
3405
+ "research_tokens": 0,
3406
+ "research_est_cost_usd": 0.0,
3407
+ "actor_monitor_tokens": 0,
3408
+ "actor_monitor_est_cost_usd": 0.0,
3409
+ "research_token_share": 0.0,
3410
+ },
3411
+ )
3412
+
3413
+
3414
+ def _append_unique_string(values: object, value: str) -> None:
3415
+ if isinstance(values, list) and value not in values:
3416
+ values.append(value)
3417
+
3418
+
3419
+ def _load_research_roi_for_health(branch_dir: Path, branch: str) -> dict[str, object]:
3420
+ token_log_path = branch_dir / TOKEN_LOG_NAME
3421
+ accounting_path = branch_dir / TOKEN_ACCOUNTING_NAME
3422
+ if token_log_path.is_file():
3423
+ accounting = _rebuild_token_accounting(branch)
3424
+ else:
3425
+ accounting = _read_json_file(accounting_path) or {}
3426
+ if not isinstance(accounting, Mapping):
3427
+ return _default_research_roi_summary()
3428
+ roi = accounting.get("research_roi")
3429
+ return dict(roi) if isinstance(roi, Mapping) else _default_research_roi_summary()
3430
+
3431
+
3432
+ def _research_health_summary(branch_dir: Path, branch: str) -> dict[str, object]:
3433
+ """Summarize research artifacts and advisory token ROI for run health."""
3434
+ research_dir = branch_dir / "research"
3435
+ project_dir = branch_dir.parents[1] if len(branch_dir.parents) > 1 else Path.cwd()
3436
+ paths = sorted(research_dir.glob("*.md")) if research_dir.is_dir() else []
3437
+ roi = _load_research_roi_for_health(branch_dir, branch)
3438
+ by_subtask: dict[str, dict[str, object]] = {}
3439
+
3440
+ roi_by_subtask = roi.get("by_subtask")
3441
+ if isinstance(roi_by_subtask, Mapping):
3442
+ for subtask_id, raw_entry in roi_by_subtask.items():
3443
+ if not isinstance(raw_entry, Mapping):
3444
+ continue
3445
+ entry = _research_health_subtask_entry(by_subtask, str(subtask_id))
3446
+ for key in (
3447
+ "research_tokens",
3448
+ "research_est_cost_usd",
3449
+ "actor_monitor_tokens",
3450
+ "actor_monitor_est_cost_usd",
3451
+ "research_token_share",
3452
+ ):
3453
+ if key in raw_entry:
3454
+ entry[key] = raw_entry[key]
3455
+
3456
+ artifact_count = 0
3457
+ valid_count = 0
3458
+ invalid_count = 0
3459
+ low_confidence_count = 0
3460
+ location_count = 0
3461
+ warnings: list[str] = []
3462
+
3463
+ for path in paths:
3464
+ artifact_count += 1
3465
+ subtask_id, kind = _research_filename_parts(path)
3466
+ entry = _research_health_subtask_entry(by_subtask, subtask_id)
3467
+ entry["artifact_count"] = _coerce_token_int(entry.get("artifact_count", 0)) + 1
3468
+ _append_unique_string(entry.get("kinds"), kind)
3469
+
3470
+ report = validate_research_artifact(path, project_dir=project_dir)
3471
+ if report.get("valid"):
3472
+ valid_count += 1
3473
+ entry["valid_artifact_count"] = (
3474
+ _coerce_token_int(entry.get("valid_artifact_count", 0)) + 1
3475
+ )
3476
+ else:
3477
+ invalid_count += 1
3478
+ entry["invalid_artifact_count"] = (
3479
+ _coerce_token_int(entry.get("invalid_artifact_count", 0)) + 1
3480
+ )
3481
+ errors = report.get("errors")
3482
+ if isinstance(errors, list) and errors:
3483
+ warnings.append(f"{path.name}: {errors[0]}")
3484
+
3485
+ status = report.get("research_status")
3486
+ if isinstance(status, str):
3487
+ _append_unique_string(entry.get("statuses"), status)
3488
+ if status in {"SEARCH_FAILED", "NO_RESULTS", "PARTIAL_RESULTS"}:
3489
+ warnings.append(f"{path.name}: research status {status}")
3490
+
3491
+ confidence = report.get("confidence")
3492
+ if isinstance(confidence, (int, float)) and not isinstance(confidence, bool):
3493
+ if float(confidence) < _RESEARCH_LOW_CONFIDENCE_THRESHOLD:
3494
+ low_confidence_count += 1
3495
+ entry["low_confidence_artifact_count"] = (
3496
+ _coerce_token_int(entry.get("low_confidence_artifact_count", 0)) + 1
3497
+ )
3498
+ warnings.append(f"{path.name}: low confidence {float(confidence):.2f}")
3499
+
3500
+ locations = _coerce_token_int(report.get("location_count", 0))
3501
+ location_count += locations
3502
+ entry["location_count"] = _coerce_token_int(entry.get("location_count", 0)) + locations
3503
+
3504
+ return {
3505
+ "schema_version": "1.0",
3506
+ "artifact_count": artifact_count,
3507
+ "valid_artifact_count": valid_count,
3508
+ "invalid_artifact_count": invalid_count,
3509
+ "low_confidence_artifact_count": low_confidence_count,
3510
+ "location_count": location_count,
3511
+ "research_tokens": _coerce_token_int(roi.get("research_tokens", 0)),
3512
+ "research_est_cost_usd": _coerce_token_float(
3513
+ roi.get("research_est_cost_usd", 0.0)
3514
+ ),
3515
+ "actor_monitor_tokens": _coerce_token_int(roi.get("actor_monitor_tokens", 0)),
3516
+ "actor_monitor_est_cost_usd": _coerce_token_float(
3517
+ roi.get("actor_monitor_est_cost_usd", 0.0)
3518
+ ),
3519
+ "research_token_share": _coerce_token_float(roi.get("research_token_share", 0.0)),
3520
+ "by_subtask": by_subtask,
3521
+ "warnings": warnings[:10],
3522
+ }
3523
+
3524
+
3216
3525
  def write_run_health_report(
3217
3526
  workflow: str = "map-efficient",
3218
3527
  terminal_status: str = "",
@@ -3245,6 +3554,7 @@ def write_run_health_report(
3245
3554
  retry_isolation_status = _as_dict(state.get("retry_isolation_status"))
3246
3555
  hook_injection = _as_dict(state.get("hook_injection"))
3247
3556
  artifact_inventory = _run_health_artifact_inventory(branch_dir, branch_name)
3557
+ research_summary = _research_health_summary(branch_dir, branch_name)
3248
3558
 
3249
3559
  payload: dict[str, object] = {
3250
3560
  "schema_version": "1.0",
@@ -3258,6 +3568,7 @@ def write_run_health_report(
3258
3568
  "completed_step_count": _count_step_entries(completed_steps),
3259
3569
  "pending_step_count": _count_step_entries(pending_steps),
3260
3570
  "artifacts": artifact_inventory,
3571
+ "research": research_summary,
3261
3572
  "resiliency_signals": {
3262
3573
  "hook_injection": hook_injection
3263
3574
  or {"status": "unknown", "reason": "not recorded"},
@@ -3342,6 +3653,7 @@ def _validate_run_health_report_shape(report: Mapping[str, object]) -> list[str]
3342
3653
  "current_step_id",
3343
3654
  "current_step_phase",
3344
3655
  "current_subtask_id",
3656
+ "research",
3345
3657
  }
3346
3658
  for key in sorted(RUN_HEALTH_REQUIRED_KEYS - set(report)):
3347
3659
  errors.append(f"missing required field: {key}")
@@ -3379,6 +3691,36 @@ def _validate_run_health_report_shape(report: Mapping[str, object]) -> list[str]
3379
3691
  if not _is_non_negative_int(size_bytes):
3380
3692
  errors.append(f"artifacts.{key}.size_bytes must be a non-negative integer")
3381
3693
 
3694
+ research = report.get("research")
3695
+ if "research" in report:
3696
+ if not isinstance(research, Mapping):
3697
+ errors.append("research must be an object")
3698
+ else:
3699
+ for key in (
3700
+ "artifact_count",
3701
+ "valid_artifact_count",
3702
+ "invalid_artifact_count",
3703
+ "low_confidence_artifact_count",
3704
+ "location_count",
3705
+ "research_tokens",
3706
+ "actor_monitor_tokens",
3707
+ ):
3708
+ if key in research and not _is_non_negative_int(research.get(key)):
3709
+ errors.append(f"research.{key} must be a non-negative integer")
3710
+ for key in (
3711
+ "research_est_cost_usd",
3712
+ "actor_monitor_est_cost_usd",
3713
+ "research_token_share",
3714
+ ):
3715
+ if key in research and not isinstance(research.get(key), (int, float)):
3716
+ errors.append(f"research.{key} must be a number")
3717
+ if "by_subtask" in research and not isinstance(
3718
+ research.get("by_subtask"), Mapping
3719
+ ):
3720
+ errors.append("research.by_subtask must be an object")
3721
+ if "warnings" in research and not isinstance(research.get("warnings"), list):
3722
+ errors.append("research.warnings must be an array")
3723
+
3382
3724
  signals = report.get("resiliency_signals")
3383
3725
  if not isinstance(signals, Mapping):
3384
3726
  errors.append("resiliency_signals must be an object")
@@ -29,6 +29,9 @@ appends attributed rows to `.map/<branch>/token_log.jsonl`, rolled up into
29
29
  caching is paying off.
30
30
  - Breakdowns by subtask, by agent (actor / monitor / research-agent /
31
31
  orchestrator / ...), and by phase.
32
+ - **research_roi** — research-agent / Codex researcher tokens and cost compared
33
+ with downstream Actor/Monitor tokens, so users can see whether delegated
34
+ exploration paid for itself.
32
35
 
33
36
  ## Steps
34
37
 
@@ -48,24 +51,25 @@ python3 .map/scripts/map_step_runner.py token_report "$BRANCH"
48
51
  ```
49
52
 
50
53
  `token_report` re-reads `token_log.jsonl`, rebuilds `token_accounting.json`,
51
- and prints a per-subtask table plus a TOTAL line with the cache-hit ratio and
52
- estimated cost. It is idempotent and read-only against your code.
54
+ and prints a per-subtask table, a per-agent table, research ROI, and a TOTAL
55
+ line with the cache-hit ratio and estimated cost. It is idempotent and read-only
56
+ against your code.
53
57
 
54
58
  ### Step 3: Optional — inspect the raw rollup
55
59
 
56
- For the per-agent / per-phase split (the table only shows per-subtask), read
57
- the JSON directly:
60
+ For the per-phase split or per-subtask research ROI details, read the JSON
61
+ directly:
58
62
 
59
63
  ```bash
60
- jq '{aggregate, by_agent, by_phase}' ".map/${BRANCH}/token_accounting.json"
64
+ jq '{aggregate, by_agent, by_phase, research_roi}' ".map/${BRANCH}/token_accounting.json"
61
65
  ```
62
66
 
63
67
  ### Step 4: Summarize
64
68
 
65
- Report the totals (input / output / cache), the cache-hit ratio, and the
66
- estimated cost. Call out the most expensive subtask or agent, and a low
67
- cache-hit ratio if present (it usually means prompt-cache churn worth
68
- investigating). Then STOP — do not change code from this skill.
69
+ Report the totals (input / output / cache), the cache-hit ratio, the research
70
+ token share, and the estimated cost. Call out the most expensive subtask or
71
+ agent, a low cache-hit ratio, or research cost that looks high relative to
72
+ Actor/Monitor. Then STOP — do not change code from this skill.
69
73
 
70
74
  ## Examples
71
75