mapify-cli 3.15.1__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.
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/PKG-INFO +3 -3
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/README.md +2 -2
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/pyproject.toml +1 -1
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/__init__.py +1 -1
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/schemas.py +37 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/researcher.toml +28 -14
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py +345 -3
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md +13 -9
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/researcher.toml.jinja +28 -14
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_step_runner.py.jinja +345 -3
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-tokenreport/SKILL.md.jinja +13 -9
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_artifact_schemas.py +15 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_map_step_runner.py +175 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills.py +78 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/.claude/hooks/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/.claude/skills/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/.gitignore +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/LICENSE +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/_locking.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/cli_ui.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/config/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/config/mcp.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/config/project_config.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/config/settings.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/agent_generator.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/codex_copier.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/file_copier.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/managed_file_copier.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/providers.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/delivery/template_renderer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/dependency_graph.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/intent_detector.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/memory/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/memory/capture.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/memory/digest_schema.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/memory/finalize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/memory/recall.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/ralph_state.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/repo_insight.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skill_ir.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/aggregator.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/apply_patcher.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/assertions.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/description_optimizer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/dispatcher.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/eval_schema.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/proposer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/runner.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/skills_eval/viewer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/.gitignore +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/CLAUDE.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/actor.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/debate-arbiter.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/documentation-reviewer.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/evaluator.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/final-verifier.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/monitor.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/predictor.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/reflector.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/research-agent.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/synthesizer.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/agents/task-decomposer.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/AGENTS.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/decomposer.toml +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/monitor.toml +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/config.toml +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/hooks.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-efficient/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-efficient/efficient-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/skills/map-plan/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/context-meter.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/detect-clarification-triggers.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/end-of-turn.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-capture.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-endmark.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-finalize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-memory-recall.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/map-token-meter.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/post-compact-context.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/pre-compact-save-transcript.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/ralph-context-pruner.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/ralph-iteration-logger.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/safety-guardrails.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/workflow-context-injector.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/hooks/workflow-gate.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/diagnostics.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_orchestrator.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_utils.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/sofa_client.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/validate_spec_citations.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/analyze.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/common.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/go.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/python.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/rust.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/static-analysis/handlers/typescript.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/ralph-loop-config.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/bash-guidelines.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/decomposition-examples.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/escalation-matrix.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/hook-patterns.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/host-paths.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-json-output-contracts.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-output-examples.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/map-xml-prompt-envelopes.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/mcp-usage-examples.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/step-state-schema.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/references/workflow-state-schema.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/rules/learned/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/settings.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-check/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-check/check-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-debug/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-efficient/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-efficient/efficient-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-explain/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-fast/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/example-rules.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-unconditional.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-learn/templates/rules-with-paths.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-memory-now/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-plan/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-plan/plan-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-release/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-resume/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-resume/resume-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-review/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-review/review-reference.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-skill-eval/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-so-search/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-so-search/scripts/sofa_search.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/check-complete.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/get-plan-path.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/init-session.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/scripts/show-focus.sh +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/findings.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/iteration_history.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/progress.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-state/templates/task_plan.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-task/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-tdd/SKILL.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/skill-rules.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/workflow-rules.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/.gitignore.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/CLAUDE.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/actor.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/debate-arbiter.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/documentation-reviewer.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/evaluator.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/final-verifier.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/monitor.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/predictor.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/reflector.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/research-agent.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/synthesizer.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/agents/task-decomposer.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/AGENTS.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/decomposer.toml.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/agents/monitor.toml.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/config.toml.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/hooks.json.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-efficient/efficient-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/codex/skills/map-plan/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/README.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/context-meter.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/detect-clarification-triggers.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/end-of-turn.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-capture.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-endmark.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-finalize.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-memory-recall.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/map-token-meter.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/post-compact-context.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/pre-compact-save-transcript.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/ralph-context-pruner.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/ralph-iteration-logger.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/safety-guardrails.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/workflow-context-injector.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/hooks/workflow-gate.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/diagnostics.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_orchestrator.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/map_utils.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/sofa_client.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/scripts/validate_spec_citations.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/analyze.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/common.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/go.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/python.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/rust.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/map/static-analysis/handlers/typescript.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/ralph-loop-config.json.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/bash-guidelines.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/decomposition-examples.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/escalation-matrix.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/hook-patterns.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/host-paths.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-json-output-contracts.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-output-examples.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/map-xml-prompt-envelopes.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/mcp-usage-examples.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/step-state-schema.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/references/workflow-state-schema.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/rules/learned/README.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/settings.json.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/README.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-check/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-check/check-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-debug/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-efficient/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-efficient/efficient-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-explain/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-fast/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/example-rules.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-unconditional.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-learn/templates/rules-with-paths.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-memory-now/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-plan/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-plan/plan-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-release/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-resume/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-resume/resume-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-review/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-review/review-reference.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-skill-eval/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-so-search/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-so-search/scripts/sofa_search.py.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/check-complete.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/get-plan-path.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/init-session.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/scripts/show-focus.sh.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/findings.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/iteration_history.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/progress.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-state/templates/task_plan.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-task/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/map-tdd/SKILL.md.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/skills/skill-rules.json.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates_src/workflow-rules.json.jinja +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/token_budget.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/tools/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/tools/validate_dependencies.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/verification_recorder.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/workflow_finalizer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/workflow_logger.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/workflow_state.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/conftest.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/fixtures/claude/escalation-matrix.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/fixtures/codex/config.toml +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/hooks/test_detect_clarification_triggers.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/hooks/test_end_of_turn.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/hooks/test_hook_inventory_smoke.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/hooks/test_safety_guardrails.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/code_review.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/plan_handoff.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/spec.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/step_state_initialized.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/step_state_plan_complete.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/task_plan.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/fixtures/verification_summary.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/test_e2e_artifact_contracts.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/integration/test_e2e_claude_sdk.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/README.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_check_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_debug_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_debug_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_efficient_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_explain_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_fast_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_learn_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_memory_now_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_plan_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_release_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_resume_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_review_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_skill_eval_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_state_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_task_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_tdd_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/map_tokenreport_optimize_eval_set.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/src/utils.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_blocker/repo/tests/test_compute.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/hidden/test_calc_full.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/src/calc.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc/repo/tests/test_calc_basic.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/hidden/test_calc_full.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/src/calc.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_calc_vague/repo/tests/test_calc_basic.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/config.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/src/utils.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_pressure/repo/tests/test_price.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/config.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/src/utils.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_scope_trap/repo/tests/test_utils.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/src/semver.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver/repo/tests/test_semver.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/hidden/test_semver_full.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/src/semver.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_vague/repo/tests/test_semver_basic.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/hidden/test_semver_full.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/manifest.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/blueprint.json +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/.map/main/task_plan_main.md +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/__init__.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/src/semver.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/fixtures/whole_skill/map_task_semver_weakgate/repo/tests/test_semver_basic.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/skills_eval/whole_skill/spike_runner.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_agent_cli_correctness.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_agent_frontmatter.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_bump_version.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_decomposition.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_dependency_graph.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_diagnostics.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_digest_schema.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_file_copier.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_hook_patterns.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_init_import_graph.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_intent_detector.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_inv1_no_anthropic_optimize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_jinja2_dep.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_locking.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_managed_file_copier.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_map_orchestrator.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_map_token_meter.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_map_utils_sanitize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_mapify_cli.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_memory_capture.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_memory_finalize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_memory_integration.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_memory_recall.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_memory_review_fixes.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_post_compact_context.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_ralph_hooks.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_ralph_state.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_repo_insight.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_schemas.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skill_ir.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_consistency.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_aggregator.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_apply.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_cli_optimize.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_dispatcher_env.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_dispatcher_timeout.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_fixtures.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_optimizer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_optimizer_isolation.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_proposer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_runner.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_schema.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_skills_eval_viewer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_sofa_client.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_sofa_search.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_template_render.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_token_budget.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_validate_dependencies.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_validate_spec_citations.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_verification_recorder.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_workflow_context_injector.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_workflow_finalizer.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_workflow_gate.py +0 -0
- {mapify_cli-3.15.1 → mapify_cli-3.16.0}/tests/test_workflow_logger.py +0 -0
- {mapify_cli-3.15.1 → 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.
|
|
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
|
|
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
|
|
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
|
|
|
@@ -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": {
|
{mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/codex/agents/researcher.toml
RENAMED
|
@@ -8,13 +8,18 @@ You are a research agent. Your job is to explore the codebase and gather actiona
|
|
|
8
8
|
findings for downstream agents (decomposer, actor). You do NOT implement anything.
|
|
9
9
|
You observe, summarize, and report.
|
|
10
10
|
|
|
11
|
-
## OUTPUT FORMAT (STRICT JSON)
|
|
11
|
+
## OUTPUT FORMAT (STRICT RESEARCH EVIDENCE JSON)
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
For `/map-efficient` subtask RESEARCH and any task that names `save_research`,
|
|
14
|
+
write ONLY one JSON object to the findings file specified in your task. Do not
|
|
14
15
|
wrap it in markdown or prose. The downstream `validate_research` gate rejects
|
|
15
16
|
malformed JSON, missing confidence, missing line ranges, unsafe paths, and more
|
|
16
17
|
than 5 locations.
|
|
17
18
|
|
|
19
|
+
This is the same ResearchEvidence contract used by Claude `research-agent`.
|
|
20
|
+
Codex may use provider-specific commands to inspect files, but the saved
|
|
21
|
+
artifact has the same downstream semantics.
|
|
22
|
+
|
|
18
23
|
```
|
|
19
24
|
{
|
|
20
25
|
"confidence": 0.85,
|
|
@@ -42,6 +47,13 @@ than 5 locations.
|
|
|
42
47
|
|
|
43
48
|
Status values: `OK`, `PARTIAL_RESULTS`, `NO_RESULTS`, `SEARCH_FAILED`.
|
|
44
49
|
|
|
50
|
+
Search method values: `glob_grep` or `grep_read`.
|
|
51
|
+
|
|
52
|
+
`search_stats` fields:
|
|
53
|
+
- `files_scanned`: total files examined during search.
|
|
54
|
+
- `total_matches_found`: all matches before truncating to the top locations.
|
|
55
|
+
- `results_truncated`: true if more results exist than returned.
|
|
56
|
+
|
|
45
57
|
## RULES
|
|
46
58
|
|
|
47
59
|
1. Target: under 1500 tokens in the findings file.
|
|
@@ -52,21 +64,23 @@ Status values: `OK`, `PARTIAL_RESULTS`, `NO_RESULTS`, `SEARCH_FAILED`.
|
|
|
52
64
|
6. Focus on WHAT EXISTS, not what should be built.
|
|
53
65
|
7. If the task mentions external libraries, note their current usage patterns in the codebase.
|
|
54
66
|
8. Write the findings file once at the end — do not stream partial results.
|
|
67
|
+
9. Add `has_intent: true|false` for every location after checking the cited line range for `# Intent:` comments.
|
|
68
|
+
10. If a planning task explicitly asks for a non-JSON discovery artifact, follow that task's requested format; do not reuse that markdown as a `save_research` artifact.
|
|
55
69
|
|
|
56
70
|
## SEARCH STRATEGY
|
|
57
71
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
Use the provider-neutral Glob/Grep/Read search protocol even when Codex exposes
|
|
73
|
+
those operations through shell-backed commands:
|
|
74
|
+
|
|
75
|
+
1. Glob-equivalent file discovery: find likely directories and file patterns.
|
|
76
|
+
2. Grep-equivalent content search: locate exact symbols, imports, and keywords.
|
|
77
|
+
3. Read-equivalent narrow inspection: open only the most relevant files and cite
|
|
78
|
+
function signatures, class definitions, imports, and inclusive line ranges.
|
|
79
|
+
4. AAG-filter results against the requested Actor/Action/Goal when provided.
|
|
80
|
+
5. Intent-inspect each returned range for `# Intent:` comments and set
|
|
81
|
+
`has_intent` accordingly.
|
|
82
|
+
6. Use git history only when the task explicitly asks for recent-change or
|
|
83
|
+
regression context; never substitute history for file-line evidence.
|
|
70
84
|
|
|
71
85
|
## DO NOT
|
|
72
86
|
|
{mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/map/scripts/map_step_runner.py
RENAMED
|
@@ -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
|
-
(
|
|
996
|
-
(
|
|
997
|
-
(
|
|
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")
|
{mapify_cli-3.15.1 → mapify_cli-3.16.0}/src/mapify_cli/templates/skills/map-tokenreport/SKILL.md
RENAMED
|
@@ -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
|
|
52
|
-
estimated cost. It is idempotent and read-only
|
|
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-
|
|
57
|
-
|
|
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,
|
|
66
|
-
estimated cost. Call out the most expensive subtask or
|
|
67
|
-
cache-hit ratio
|
|
68
|
-
|
|
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
|
|