invar-tools 1.8.0__tar.gz → 1.11.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.
- invar_tools-1.11.0/.claude/hooks/PostToolUse.sh +10 -0
- invar_tools-1.11.0/.claude/hooks/PreToolUse.sh +10 -0
- invar_tools-1.11.0/.claude/hooks/Stop.sh +10 -0
- invar_tools-1.11.0/.claude/hooks/UserPromptSubmit.sh +10 -0
- invar_tools-1.11.0/.claude/skills/acceptance/SKILL.md +383 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/skills/develop/SKILL.md +56 -4
- invar_tools-1.11.0/.claude/skills/invar-onboard/SKILL.md +448 -0
- invar_tools-1.11.0/.claude/skills/invar-onboard/patterns/python.md +347 -0
- invar_tools-1.11.0/.claude/skills/invar-onboard/patterns/typescript.md +452 -0
- invar_tools-1.11.0/.claude/skills/invar-onboard/templates/assessment.md.jinja +214 -0
- invar_tools-1.11.0/.claude/skills/invar-onboard/templates/roadmap.md.jinja +168 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/skills/investigate/SKILL.md +55 -0
- invar_tools-1.11.0/.claude/skills/review/SKILL.md +325 -0
- invar_tools-1.11.0/.claude/skills/security/SKILL.md +382 -0
- invar_tools-1.11.0/.claude/skills/security/patterns/_common.yaml +126 -0
- invar_tools-1.11.0/.claude/skills/security/patterns/python.yaml +155 -0
- invar_tools-1.11.0/.claude/skills/security/patterns/typescript.yaml +194 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.github/workflows/ci.yml +9 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.gitignore +6 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/context.md +8 -8
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.11.0/.invar}/examples/README.md +2 -0
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.11.0/.invar}/examples/conftest.py +1 -1
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.11.0/.invar}/examples/contracts.py +81 -4
- invar_tools-1.11.0/.invar/examples/core_shell.py +227 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/examples/functional.py +165 -2
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.pre-commit-config.yaml +9 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/CLAUDE.md +19 -2
- {invar_tools-1.8.0 → invar_tools-1.11.0}/INVAR.md +101 -37
- {invar_tools-1.8.0 → invar_tools-1.11.0}/PKG-INFO +336 -12
- {invar_tools-1.8.0 → invar_tools-1.11.0}/README.md +334 -11
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/design.md +32 -2
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/index.html +88 -2
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-62-proactive-reference-reading.md +11 -1
- invar_tools-1.11.0/docs/proposals/DX-74-experiment-report.md +1585 -0
- invar_tools-1.11.0/docs/proposals/DX-75-attention-aware-framework.md +959 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/LX-04-pi-agent-support.md +20 -14
- invar_tools-1.11.0/docs/proposals/LX-07-extension-skills.md +1561 -0
- invar_tools-1.11.0/docs/proposals/LX-08-extension-skills-future.md +67 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-39-workflow-efficiency.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-41-automatic-review-orchestration.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-42-workflow-auto-routing.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-50-workflow-enforcement.md +4 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-51-workflow-phase-visibility.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-52-venv-dependency-injection.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-67-explicit-skill-invocation.md +1 -1
- invar_tools-1.11.0/docs/proposals/completed/DX-70-review-isolation.md +185 -0
- invar_tools-1.11.0/docs/proposals/completed/DX-71-skill-command-simplification.md +152 -0
- invar_tools-1.11.0/docs/proposals/completed/DX-72-mandatory-self-review-detection.md +140 -0
- invar_tools-1.11.0/docs/proposals/completed/DX-74-tiered-attention-defense.md +913 -0
- invar_tools-1.11.0/docs/proposals/completed/DX-76-structured-document-query.md +451 -0
- invar_tools-1.11.0/docs/proposals/completed/DX-77-mcp-doc-tools-enhancements.md +404 -0
- invar_tools-1.11.0/docs/proposals/completed/LX-05-language-agnostic-protocol.md +1237 -0
- invar_tools-1.11.0/docs/proposals/completed/LX-06-appendix-guard-comparison.md +499 -0
- invar_tools-1.11.0/docs/proposals/completed/LX-06-typescript-tooling.md +920 -0
- invar_tools-1.11.0/docs/proposals/completed/LX-09-legacy-onboarding.md +1290 -0
- invar_tools-1.11.0/docs/proposals/completed/LX-10-typescript-size-limits.md +267 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/index.md +85 -12
- {invar_tools-1.8.0 → invar_tools-1.11.0}/pyproject.toml +13 -4
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/__init__.py +1 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/contracts.py +78 -11
- invar_tools-1.11.0/scripts/embed_node_tools.py +219 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/__init__.py +8 -0
- invar_tools-1.11.0/src/invar/core/doc_edit.py +187 -0
- invar_tools-1.11.0/src/invar/core/doc_parser.py +563 -0
- invar_tools-1.11.0/src/invar/core/language.py +88 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/models.py +106 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/detector.py +6 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/p0_exhaustive.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/p0_literal.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/p0_newtype.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/p0_nonempty.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/p0_validation.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/registry.py +5 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/types.py +5 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/property_gen.py +4 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/rules.py +84 -18
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/sync_helpers.py +27 -1
- invar_tools-1.11.0/src/invar/core/ts_parsers.py +286 -0
- invar_tools-1.11.0/src/invar/core/ts_sig_parser.py +310 -0
- invar_tools-1.11.0/src/invar/mcp/handlers.py +408 -0
- invar_tools-1.11.0/src/invar/mcp/server.py +500 -0
- invar_tools-1.11.0/src/invar/node_tools/MANIFEST +7 -0
- invar_tools-1.11.0/src/invar/node_tools/__init__.py +51 -0
- invar_tools-1.11.0/src/invar/node_tools/fc-runner/cli.js +77 -0
- invar_tools-1.11.0/src/invar/node_tools/quick-check/cli.js +28 -0
- invar_tools-1.11.0/src/invar/node_tools/ts-analyzer/cli.js +480 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/claude_hooks.py +35 -12
- invar_tools-1.11.0/src/invar/shell/commands/doc.py +409 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/guard.py +41 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/init.py +154 -16
- invar_tools-1.11.0/src/invar/shell/commands/perception.py +251 -0
- invar_tools-1.11.0/src/invar/shell/commands/skill.py +187 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/template_sync.py +65 -13
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/uninstall.py +60 -12
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/update.py +6 -14
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/contract_coverage.py +1 -0
- invar_tools-1.11.0/src/invar/shell/doc_tools.py +459 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/fs.py +67 -13
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/pi_hooks.py +6 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/prove/crosshair.py +3 -0
- invar_tools-1.11.0/src/invar/shell/prove/guard_ts.py +902 -0
- invar_tools-1.11.0/src/invar/shell/skill_manager.py +355 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/template_engine.py +28 -4
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/templates.py +4 -4
- invar_tools-1.11.0/src/invar/templates/claude-md/python/critical-rules.md +33 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/python/quick-reference.md +24 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/typescript/critical-rules.md +40 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/typescript/quick-reference.md +24 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/universal/check-in.md +25 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/universal/skills.md +73 -0
- invar_tools-1.11.0/src/invar/templates/claude-md/universal/workflow.md +55 -0
- invar_tools-1.8.0/src/invar/templates/commands/audit.md → invar_tools-1.11.0/src/invar/templates/commands/audit.md.jinja +18 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/config/AGENT.md.jinja +58 -0
- invar_tools-1.11.0/src/invar/templates/config/CLAUDE.md.jinja +51 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/config/context.md.jinja +19 -0
- {invar_tools-1.8.0/.invar/examples → invar_tools-1.11.0/src/invar/templates/examples/python}/README.md +4 -0
- invar_tools-1.11.0/src/invar/templates/examples/python/conftest.py +3 -0
- {invar_tools-1.8.0/.invar/examples → invar_tools-1.11.0/src/invar/templates/examples/python}/contracts.py +81 -4
- invar_tools-1.11.0/src/invar/templates/examples/python/core_shell.py +227 -0
- invar_tools-1.11.0/src/invar/templates/examples/python/functional.py +613 -0
- invar_tools-1.11.0/src/invar/templates/examples/python/workflow.md +81 -0
- invar_tools-1.11.0/src/invar/templates/examples/typescript/README.md +31 -0
- invar_tools-1.11.0/src/invar/templates/examples/typescript/contracts.ts +163 -0
- invar_tools-1.11.0/src/invar/templates/examples/typescript/core_shell.ts +374 -0
- invar_tools-1.11.0/src/invar/templates/examples/typescript/functional.ts +601 -0
- invar_tools-1.11.0/src/invar/templates/examples/typescript/workflow.md +95 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/PostToolUse.sh.jinja +10 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/PreToolUse.sh.jinja +38 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/Stop.sh.jinja +1 -1
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/UserPromptSubmit.sh.jinja +7 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/pi/invar.ts.jinja +9 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/manifest.toml +7 -6
- invar_tools-1.11.0/src/invar/templates/onboard/assessment.md.jinja +214 -0
- invar_tools-1.11.0/src/invar/templates/onboard/patterns/python.md +347 -0
- invar_tools-1.11.0/src/invar/templates/onboard/patterns/typescript.md +452 -0
- invar_tools-1.11.0/src/invar/templates/onboard/roadmap.md.jinja +168 -0
- invar_tools-1.11.0/src/invar/templates/protocol/INVAR.md.jinja +51 -0
- invar_tools-1.11.0/src/invar/templates/protocol/python/architecture-examples.md +41 -0
- invar_tools-1.11.0/src/invar/templates/protocol/python/contracts-syntax.md +56 -0
- invar_tools-1.11.0/src/invar/templates/protocol/python/markers.md +44 -0
- invar_tools-1.11.0/src/invar/templates/protocol/python/tools.md +24 -0
- invar_tools-1.11.0/src/invar/templates/protocol/python/troubleshooting.md +38 -0
- invar_tools-1.11.0/src/invar/templates/protocol/typescript/architecture-examples.md +52 -0
- invar_tools-1.11.0/src/invar/templates/protocol/typescript/contracts-syntax.md +73 -0
- invar_tools-1.11.0/src/invar/templates/protocol/typescript/markers.md +48 -0
- invar_tools-1.11.0/src/invar/templates/protocol/typescript/tools.md +65 -0
- invar_tools-1.11.0/src/invar/templates/protocol/typescript/troubleshooting.md +104 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/architecture.md +36 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/completion.md +14 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/contracts-concept.md +37 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/header.md +17 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/session.md +17 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/six-laws.md +10 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/usbv.md +14 -0
- invar_tools-1.11.0/src/invar/templates/protocol/universal/visible-workflow.md +25 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/skills/develop/SKILL.md.jinja +85 -3
- invar_tools-1.11.0/src/invar/templates/skills/extensions/_registry.yaml +93 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/acceptance/SKILL.md +383 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/invar-onboard/SKILL.md +448 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/invar-onboard/patterns/python.md +347 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +452 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +214 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +168 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/security/SKILL.md +382 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/security/patterns/_common.yaml +126 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/security/patterns/python.yaml +155 -0
- invar_tools-1.11.0/src/invar/templates/skills/extensions/security/patterns/typescript.yaml +194 -0
- invar_tools-1.11.0/src/invar/templates/skills/review/SKILL.md.jinja +325 -0
- invar_tools-1.11.0/tests/experiments/conftest.py +7 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/README.md +150 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/RESULTS.md +75 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/RESULTS_V2.md +342 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/RESULTS_V4.md +710 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/ground_truth.yaml +428 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/prompts.yaml +105 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/api_client.py +105 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/auth_service.py +89 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/config_manager.py +141 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/data_processor.py +119 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/file_handler.py +134 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario/utils.py +156 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/analytics_engine.py +829 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/ground_truth.yaml +282 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/inventory_manager.py +731 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/notification_service.py +737 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/order_processor.py +760 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/payment_gateway.py +636 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v2/user_service.py +701 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/README.md +60 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/cache_service.py +324 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/calculator.py +328 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/data_processor.py +338 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/ground_truth.yaml +454 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/user_manager.py +353 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v3/validator.py +347 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/.serena/.gitignore +1 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/.serena/project.yml +84 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/README.md +83 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/config_manager.py +244 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/data_service.py +306 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/ground_truth.yaml +530 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/math_utils.py +294 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/report_generator.py +346 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v4/user_auth.py +319 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/api_gateway.py +284 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/auth_service.py +279 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/cache_handler.py +270 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/config_loader.py +247 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/data_validator.py +283 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/ground_truth.yaml +888 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/metrics_collector.py +266 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/notification_service.py +261 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/payment_processor.py +344 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/report_builder.py +336 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/task_scheduler.py +295 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/user_manager.py +270 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v5/utils.py +308 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/api_gateway.py +269 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/auth_service.py +264 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/cache_handler.py +257 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/config_loader.py +238 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/data_validator.py +270 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/ground_truth.yaml +888 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/metrics_collector.py +256 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/notification_service.py +251 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/payment_processor.py +327 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/report_builder.py +324 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/task_scheduler.py +284 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/user_manager.py +256 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v6/utils.py +308 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/api_service.py +712 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/auth_manager.py +600 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/data_processor.py +601 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/ground_truth.yaml +239 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/report_engine.py +904 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/storage_handler.py +819 -0
- invar_tools-1.11.0/tests/experiments/dx74_attention_drift/scenario_v7/utils.py +417 -0
- invar_tools-1.11.0/tests/integration/test_lx05_detection.py +131 -0
- invar_tools-1.11.0/tests/integration/test_lx05_integration.py +496 -0
- invar_tools-1.11.0/tests/integration/test_lx05_templates.py +228 -0
- invar_tools-1.11.0/tests/integration/test_lx06_typescript.py +409 -0
- invar_tools-1.11.0/tests/integration/test_lx07_skills.py +494 -0
- invar_tools-1.11.0/tests/integration/test_mcp_doc_tools.py +536 -0
- invar_tools-1.11.0/typescript/.gitignore +27 -0
- invar_tools-1.11.0/typescript/README.md +105 -0
- invar_tools-1.11.0/typescript/package.json +34 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/package.json +38 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/index.ts +61 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/rules/no-any-in-schema.ts +47 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/rules/no-io-in-core.ts +108 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/rules/require-jsdoc-example.ts +75 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/rules/require-schema-validation.ts +202 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/src/rules/shell-result-type.ts +166 -0
- invar_tools-1.11.0/typescript/packages/eslint-plugin/tsconfig.json +8 -0
- invar_tools-1.11.0/typescript/packages/fc-runner/package.json +42 -0
- invar_tools-1.11.0/typescript/packages/fc-runner/src/cli.ts +150 -0
- invar_tools-1.11.0/typescript/packages/fc-runner/src/index.ts +328 -0
- invar_tools-1.11.0/typescript/packages/fc-runner/tsconfig.json +8 -0
- invar_tools-1.11.0/typescript/packages/quick-check/package.json +47 -0
- invar_tools-1.11.0/typescript/packages/quick-check/src/cli.ts +123 -0
- invar_tools-1.11.0/typescript/packages/quick-check/src/index.ts +279 -0
- invar_tools-1.11.0/typescript/packages/quick-check/tsconfig.json +8 -0
- invar_tools-1.11.0/typescript/packages/ts-analyzer/package.json +42 -0
- invar_tools-1.11.0/typescript/packages/ts-analyzer/src/cli.ts +131 -0
- invar_tools-1.11.0/typescript/packages/ts-analyzer/src/index.ts +622 -0
- invar_tools-1.11.0/typescript/packages/ts-analyzer/tsconfig.json +8 -0
- invar_tools-1.11.0/typescript/pnpm-workspace.yaml +2 -0
- invar_tools-1.11.0/typescript/scripts/bundle.mjs +65 -0
- invar_tools-1.11.0/typescript/tsconfig.base.json +24 -0
- invar_tools-1.11.0/typescript/vitest.config.ts +13 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/uv.lock +126 -1
- invar_tools-1.8.0/.claude/hooks/PostToolUse.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/PreToolUse.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/Stop.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/UserPromptSubmit.sh +0 -3
- invar_tools-1.8.0/.claude/skills/review/SKILL.md +0 -352
- invar_tools-1.8.0/.invar/examples/conftest.py +0 -3
- invar_tools-1.8.0/.invar/examples/core_shell.py +0 -127
- invar_tools-1.8.0/.invar/examples/workflow.md +0 -258
- invar_tools-1.8.0/src/invar/mcp/server.py +0 -355
- invar_tools-1.8.0/src/invar/shell/commands/perception.py +0 -127
- invar_tools-1.8.0/src/invar/templates/config/CLAUDE.md.jinja +0 -244
- invar_tools-1.8.0/src/invar/templates/examples/core_shell.py +0 -127
- invar_tools-1.8.0/src/invar/templates/protocol/INVAR.md +0 -310
- invar_tools-1.8.0/src/invar/templates/skills/review/SKILL.md.jinja +0 -353
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.aider.conf.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/commands/audit.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/commands/guard.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/hooks/invar.PostToolUse.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/hooks/invar.PreToolUse.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/hooks/invar.Stop.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/hooks/invar.UserPromptSubmit.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.claude/skills/propose/SKILL.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.cursorrules +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.github/workflows/publish.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/archive/sessions-2025-12.md +0 -0
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.11.0/.invar}/examples/workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/mcp-setup.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/project-additions.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.invar/proposals/TEMPLATE.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.mcp.json +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.serena/.gitignore +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/.serena/project.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/LICENSE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/LICENSE-GPL +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/NOTICE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/.nojekyll +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/agents.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/diagrams.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guide.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/aider.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/cline.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/continue.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/cursor.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/multi-agent.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/guides/pi.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/decisions-2024.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/feedback/compliance-analysis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/feedback/feedback-memo.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/feedback/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/original-vision.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/protocol-evolution.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/history/research/cruxeval-quick-validation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/logo.svg +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-23-entry-point-detection.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-25-functional-patterns.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-29-pure-content-detection.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-38-contract-quality-rules.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-60-structured-rules-ssot.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-61-functional-pattern-guidance.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-61-implementation-design.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/DX-68-agent-behavior-optimization.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/LX-01-multi-language-feasibility.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2024-12-21-guard-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2024-12-21-language-inspired-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2024-12-21-test-first-enhancement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2025-12-21-dx-improvements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2025-12-23-dx-20-property-testing-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/2025-12-23-dx-21-package-and-init.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/AGENT-IMPROVEMENTS.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-11-documentation-restructure.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-12-hypothesis-fallback.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-13-incremental-prove.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-14-expanded-prove-usage.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-16-agent-tool-enforcement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-17-workflow-enforcement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-22-verification-strategy.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-24-mechanism-documentation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-26-guard-simplification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-27-system-prompt-protocol.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-28-semantic-verification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-30-visible-workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-31-adversarial-reviewer.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-32-workflow-iteration.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-33-verification-blind-spots.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-34-review-cycle.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-35-workflow-phase-separation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-36-documentation-restructuring.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-37-coverage-integration.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-40-smart-tool-redirect-hook.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-43-cross-platform-distribution.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-45-template-consistency.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-46-documentation-audit.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-47-command-skill-naming.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-48-code-structure-reorganization.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-49-protocol-distribution-unification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-53-review-loop-effectiveness.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-54-agent-native-context-management.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-55-claude-init-conflict-resolution.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-56-template-sync-unification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-57-claude-code-hooks.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-58-document-structure-optimization.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/DX-63-contracts-first-enforcement.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-64-version-display-unification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-65-single-file-guard.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-66-escape-hatch-visibility.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-69-project-uninstall.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/DX-70-init-simplification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.11.0/docs/proposals/completed}/LX-02-agent-portability-analysis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/proposals/completed/LX-03-multi-agent-support.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/agent-information-hierarchy.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/architecture/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/contracts/advanced.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/contracts/completeness.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/contracts/doctests.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/contracts/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/contracts/pre-post.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/documentation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/proposal-workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/rules/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/rules/severity.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/verification/crosshair-vs-hypothesis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/verification/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/verification/smart-routing.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/workflow/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/workflow/session-start.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/reference/workflow/usbv.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/terminal-gif-guide.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/test-reports/DX-55-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/test-reports/DX-56-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/test-reports/DX-58-test-scenario.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/testing/v1.5.0-stress-test.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/testing/v1.5.0-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/testing/v1.5.0-workflow-compliance.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/docs/vision.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/LICENSE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/README.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/pyproject.toml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/decorators.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/invariant.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/relations.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/runtime/src/invar_runtime/resource.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/scripts/smart-guard.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/core/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/contracts.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/entry_points.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/extraction.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/format_specs.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/format_strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/formatter.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/hypothesis_strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/inspect.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/lambda_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/must_use.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/parser.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/patterns/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/postcondition_scope.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/purity.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/purity_heuristics.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/references.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/review_trigger.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/rule_meta.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/shell_analysis.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/shell_architecture.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/suggestions.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/tautology.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/template_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/template_parser.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/timeout_inference.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/trivial_detection.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/utils.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/core/verification_routing.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/mcp/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/mcp/__main__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/py.typed +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/hooks.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/merge.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/mutate.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/sync_self.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/commands/test.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/config.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/coverage.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/git.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/guard_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/guard_output.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/mcp_config.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/mutation.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/pattern_integration.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/property_tests.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/prove/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/prove/accept.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/prove/cache.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/prove/hypothesis.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/subprocess_env.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/shell/testing.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/CLAUDE.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/commands/guard.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/config/pre-commit.yaml.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/context.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/hooks/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/proposal.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/skills/investigate/SKILL.md.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/invar/templates/skills/propose/SKILL.md.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/src/shell/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/conftest.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/integration/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/integration/test_cli_flags.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/integration/test_dx55_regression.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/integration/test_dx56_sync.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.11.0}/tests/test_subprocess_env.py +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.PostToolUse.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.PreToolUse.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.Stop.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.UserPromptSubmit.sh" "$@"
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
<!--invar:skill-->
|
|
2
|
+
# /acceptance — Requirements Acceptance Review
|
|
3
|
+
|
|
4
|
+
> Extension Skill | Tier: T0 | Isolation: Default
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Verify implementation satisfies requirements with adversarial rigor. This skill performs PRD alignment review, checking that all requirements are implemented and edge cases are handled.
|
|
9
|
+
|
|
10
|
+
## Triggers
|
|
11
|
+
|
|
12
|
+
Use this skill when user says: "acceptance", "check requirements", "PRD alignment", "acceptance review", "verify requirements"
|
|
13
|
+
|
|
14
|
+
## Relationship to Core Skills
|
|
15
|
+
|
|
16
|
+
- `/review` = Code quality (bugs, contracts, security)
|
|
17
|
+
- `/acceptance` = Feature completeness (requirements coverage)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Core Principles
|
|
22
|
+
|
|
23
|
+
| Principle | Description |
|
|
24
|
+
|-----------|-------------|
|
|
25
|
+
| **Skeptical by default** | Assume feature is NOT implemented until proven otherwise |
|
|
26
|
+
| **Evidence required** | "Implemented" requires file:line proof, not intuition |
|
|
27
|
+
| **Deep challenge** | Every requirement gets adversarial scenarios, no shortcuts |
|
|
28
|
+
| **Graceful degradation** | Works without Invar contracts (falls back to code analysis) |
|
|
29
|
+
| **Polluter pays** | External verification must restore state, or use dry-run |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Depth Levels
|
|
34
|
+
|
|
35
|
+
| Level | Scope | Use Case |
|
|
36
|
+
|-------|-------|----------|
|
|
37
|
+
| `--quick` | P0 (Must-have) only, skip NFR/UI | Fast feedback, CI gates |
|
|
38
|
+
| `--standard` | P0 + P1, sample challenges | Normal development |
|
|
39
|
+
| `--deep` (default) | ALL requirements, full challenge, external verify | Release readiness |
|
|
40
|
+
|
|
41
|
+
**Default is `--deep`** — thorough verification is the norm.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Workflow
|
|
46
|
+
|
|
47
|
+
### Step 0: Isolation Check
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Parse depth: --quick / --standard / --deep (default)
|
|
51
|
+
|
|
52
|
+
If --deep (default):
|
|
53
|
+
┌─────────────────────────────────────────────────────────┐
|
|
54
|
+
│ SPAWN ISOLATED AGENT │
|
|
55
|
+
│ │
|
|
56
|
+
│ Collect inputs: │
|
|
57
|
+
│ • PRD path (smart search or user-provided) │
|
|
58
|
+
│ • Design paths (if found) │
|
|
59
|
+
│ • Code scope (files/directories to review) │
|
|
60
|
+
│ │
|
|
61
|
+
│ Spawn Task agent with: │
|
|
62
|
+
│ • QA Acceptance Reviewer persona (see below) │
|
|
63
|
+
│ • NO conversation history │
|
|
64
|
+
│ • Only the collected inputs │
|
|
65
|
+
│ │
|
|
66
|
+
│ → Isolated agent executes steps 1-5 below │
|
|
67
|
+
│ → Returns structured report │
|
|
68
|
+
└─────────────────────────────────────────────────────────┘
|
|
69
|
+
|
|
70
|
+
If --quick or --standard:
|
|
71
|
+
└─ Continue in same context with persona switch
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Step 1: Entry
|
|
75
|
+
|
|
76
|
+
- Detect Invar (Enhanced/Standalone mode)
|
|
77
|
+
- Locate PRD: smart search or user-provided path
|
|
78
|
+
- Locate Design: design/, mockups/, figma/ (if exists)
|
|
79
|
+
|
|
80
|
+
**Invar Detection:**
|
|
81
|
+
- File-based: `INVAR.md` exists OR `.invar/` directory exists
|
|
82
|
+
- Context-based: `invar_guard` tool available in session
|
|
83
|
+
- Enhanced Mode → Use invar_guard, invar_sig, invar_map
|
|
84
|
+
- Standalone Mode → Use Read, Grep, Glob, Bash only
|
|
85
|
+
|
|
86
|
+
### Step 2: Parse — Extract Requirements
|
|
87
|
+
|
|
88
|
+
Read PRD and extract:
|
|
89
|
+
- **FR (Functional):** What system must DO
|
|
90
|
+
- **NFR (Non-Functional):** Performance, security, UX
|
|
91
|
+
- **EC (Edge Case):** Explicitly mentioned scenarios
|
|
92
|
+
- **UI (UI/UX):** Visual/interaction requirements (if any)
|
|
93
|
+
|
|
94
|
+
**Output format:**
|
|
95
|
+
```markdown
|
|
96
|
+
| ID | Type | Requirement | Priority |
|
|
97
|
+
|-------|------|--------------------------|----------|
|
|
98
|
+
| FR-1 | FR | User can login with email| Must |
|
|
99
|
+
| NFR-1 | NFR | Response time < 200ms | Should |
|
|
100
|
+
| UI-1 | UI | Login button is blue #007| Could |
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Step 3: Map — Link to Implementation (Skeptical)
|
|
104
|
+
|
|
105
|
+
**DEFAULT STATUS: ❌ Missing** (upgrade only with evidence)
|
|
106
|
+
|
|
107
|
+
**Evidence Sources (priority order):**
|
|
108
|
+
1. Invar contracts (@pre/@post matching requirement)
|
|
109
|
+
2. Type signatures + docstrings
|
|
110
|
+
3. Test cases covering the requirement
|
|
111
|
+
4. Code implementation (read and verify)
|
|
112
|
+
|
|
113
|
+
**Enhanced Mode:**
|
|
114
|
+
- `invar_sig` to find functions + contracts
|
|
115
|
+
- Cross-reference contracts with requirements
|
|
116
|
+
|
|
117
|
+
**Standalone Mode (no contracts):**
|
|
118
|
+
- Grep for requirement keywords
|
|
119
|
+
- Read docstrings, type hints, comments
|
|
120
|
+
- Trace code flow to verify implementation
|
|
121
|
+
|
|
122
|
+
**Output format:**
|
|
123
|
+
```markdown
|
|
124
|
+
| ID | Requirement | Evidence | Status |
|
|
125
|
+
|------|--------------|--------------------| ------------|
|
|
126
|
+
| FR-1 | User login | auth.py:45 @post | ✅ Complete |
|
|
127
|
+
| FR-2 | Password reset| - | ❌ Missing |
|
|
128
|
+
| FR-3 | Email verify | email.py:30 (partial)| ⚠️ Partial|
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Step 4: Challenge — Deep Adversarial Scenarios
|
|
132
|
+
|
|
133
|
+
For **EVERY** requirement (no shortcuts):
|
|
134
|
+
|
|
135
|
+
**Functional (FR):**
|
|
136
|
+
- "What if input is empty/null/malformed?"
|
|
137
|
+
- "What if user lacks permission?"
|
|
138
|
+
- "What if dependent service fails?"
|
|
139
|
+
- "What if called twice/concurrently?"
|
|
140
|
+
|
|
141
|
+
**Non-Functional (NFR):**
|
|
142
|
+
- "Is there evidence this is measured?"
|
|
143
|
+
- "What's the worst-case scenario?"
|
|
144
|
+
- "How does it degrade under load?"
|
|
145
|
+
|
|
146
|
+
**Edge Cases (EC):**
|
|
147
|
+
- "Is boundary explicitly handled?"
|
|
148
|
+
- "What's the error message?"
|
|
149
|
+
- "Is it tested?"
|
|
150
|
+
|
|
151
|
+
**UI/UX (UI):**
|
|
152
|
+
- "Does implementation match design spec?"
|
|
153
|
+
- "Are design tokens correct (colors, spacing)?"
|
|
154
|
+
- "Is interaction behavior as specified?"
|
|
155
|
+
|
|
156
|
+
**Output format:**
|
|
157
|
+
```markdown
|
|
158
|
+
| Scenario | Expected | Actual | Gap? |
|
|
159
|
+
|-----------------------|--------------|---------|------|
|
|
160
|
+
| Wrong password 5x | Lock account | No lock | ❌ |
|
|
161
|
+
| Empty email | Error msg | Crash | ❌ |
|
|
162
|
+
| Concurrent login | Queue/reject | Race bug| ❌ |
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Step 5: Verify — External Tool Validation
|
|
166
|
+
|
|
167
|
+
**POLLUTER PAYS PRINCIPLE:**
|
|
168
|
+
```
|
|
169
|
+
Before running external verification:
|
|
170
|
+
1. Can state be restored? (snapshot, rollback, reset)
|
|
171
|
+
→ YES: Run freely, restore after
|
|
172
|
+
→ NO: Must use dry-run / read-only mode
|
|
173
|
+
|
|
174
|
+
Examples:
|
|
175
|
+
• DB: Use transaction + rollback, or test DB
|
|
176
|
+
• Files: Backup → run → restore
|
|
177
|
+
• API: Use sandbox/test endpoint
|
|
178
|
+
• Destructive: MUST dry-run (--dry-run, --whatif)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Web Projects:**
|
|
182
|
+
- Playwright/Puppeteer for E2E flows
|
|
183
|
+
- curl/httpie for API endpoints
|
|
184
|
+
- Lighthouse for performance NFRs
|
|
185
|
+
|
|
186
|
+
**CLI Projects:**
|
|
187
|
+
- Actually invoke commands with test inputs
|
|
188
|
+
- Verify exit codes and output format
|
|
189
|
+
|
|
190
|
+
**Library Projects:**
|
|
191
|
+
- Run existing test suite
|
|
192
|
+
- Execute doctest examples
|
|
193
|
+
|
|
194
|
+
**NFR Benchmarks:**
|
|
195
|
+
```bash
|
|
196
|
+
# Response Time
|
|
197
|
+
time curl -s http://localhost:8000/api/endpoint
|
|
198
|
+
hyperfine 'curl -s http://localhost:8000/api/endpoint'
|
|
199
|
+
|
|
200
|
+
# Load Testing
|
|
201
|
+
wrk -t4 -c100 -d30s http://localhost:8000/api/endpoint
|
|
202
|
+
|
|
203
|
+
# Memory
|
|
204
|
+
/usr/bin/time -v python script.py
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**UI/UX Deep Verification (4 levels):**
|
|
208
|
+
1. **Level 1: Design Tokens** — Colors, Typography, Spacing
|
|
209
|
+
2. **Level 2: Layout** — Flexbox/Grid alignment, Responsive breakpoints
|
|
210
|
+
3. **Level 3: Interaction** — Hover/focus states, Animation, Keyboard nav
|
|
211
|
+
4. **Level 4: Visual Regression** — Screenshot comparison (if baseline exists)
|
|
212
|
+
|
|
213
|
+
### Step 6: Report — Coverage Matrix + Integration
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
## Validation Report
|
|
217
|
+
|
|
218
|
+
**PRD:** docs/requirements.md
|
|
219
|
+
**Design:** design/mockups/ (if found)
|
|
220
|
+
**Mode:** Enhanced (Invar detected) / Standalone
|
|
221
|
+
|
|
222
|
+
### Coverage Summary
|
|
223
|
+
| Status | Count | Percent |
|
|
224
|
+
|-------------|-------|---------|
|
|
225
|
+
| ✅ Complete | 7 | 58% |
|
|
226
|
+
| ⚠️ Partial | 3 | 25% |
|
|
227
|
+
| ❌ Missing | 2 | 17% |
|
|
228
|
+
|
|
229
|
+
### Critical Gaps
|
|
230
|
+
1. FR-2: Password reset — Not implemented
|
|
231
|
+
2. NFR-1: Response time — Not measured
|
|
232
|
+
|
|
233
|
+
### Adversarial Findings
|
|
234
|
+
| Finding | Severity | Location |
|
|
235
|
+
|----------------------------|----------|---------------|
|
|
236
|
+
| Account lockout missing | High | auth.py |
|
|
237
|
+
| Input validation incomplete| Medium | forms.py:23 |
|
|
238
|
+
|
|
239
|
+
### UI/UX Discrepancies (if applicable)
|
|
240
|
+
| Element | Design | Actual | Action |
|
|
241
|
+
|--------------|-----------|-----------|--------------|
|
|
242
|
+
| Login button | #0070f3 | #007bff | Update color |
|
|
243
|
+
|
|
244
|
+
### NFR Verification Results
|
|
245
|
+
| Requirement | Target | Measured | Status |
|
|
246
|
+
|-------------------|----------|----------|-----------|
|
|
247
|
+
| Response time | < 200ms | 145ms | ✅ Pass |
|
|
248
|
+
| Memory usage | < 100MB | 89MB | ✅ Pass |
|
|
249
|
+
|
|
250
|
+
### Suggested /develop Tasks
|
|
251
|
+
|
|
252
|
+
**High Priority (Must-have gaps):**
|
|
253
|
+
1. FR-2: Password reset
|
|
254
|
+
- Scope: auth/ module
|
|
255
|
+
- Estimate: ~80 LOC, 2 new functions
|
|
256
|
+
|
|
257
|
+
2. Account lockout (adversarial finding)
|
|
258
|
+
- Scope: auth/session.py
|
|
259
|
+
- Estimate: ~30 LOC
|
|
260
|
+
|
|
261
|
+
### Next Actions
|
|
262
|
+
1. [ ] Implement FR-2 (use /develop)
|
|
263
|
+
2. [ ] Add account lockout (use /develop)
|
|
264
|
+
3. [ ] Run load test for NFR verification
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## PRD Smart Search
|
|
270
|
+
|
|
271
|
+
When user says "PRD" without path:
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
Search order:
|
|
275
|
+
1. docs/prd.md, docs/PRD.md, docs/requirements.md
|
|
276
|
+
2. *.prd.md, *requirements*.md, *spec*.md
|
|
277
|
+
3. README.md (Requirements section)
|
|
278
|
+
4. .invar/prd.md
|
|
279
|
+
|
|
280
|
+
If multiple → ask user to select
|
|
281
|
+
If none → ask user for path
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Design File Detection
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
Search order:
|
|
290
|
+
1. design/, mockups/, figma/
|
|
291
|
+
2. *.fig, *.sketch (metadata only)
|
|
292
|
+
3. docs/design/, docs/ui/
|
|
293
|
+
4. .invar/design/
|
|
294
|
+
|
|
295
|
+
If found → enable UI/UX verification
|
|
296
|
+
If not → skip UI checks, note in report
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Contract Fallback Strategy
|
|
302
|
+
|
|
303
|
+
When Invar contracts are not available:
|
|
304
|
+
|
|
305
|
+
| Fallback Level | Evidence Source | Confidence |
|
|
306
|
+
|----------------|-----------------|------------|
|
|
307
|
+
| 1. Type hints | `def login(email: str) -> User` | Medium |
|
|
308
|
+
| 2. Docstrings | `"""Returns user if valid credentials."""` | Medium |
|
|
309
|
+
| 3. Test cases | `test_login_success()` exists | High |
|
|
310
|
+
| 4. Code trace | Read implementation, verify logic | Low |
|
|
311
|
+
|
|
312
|
+
**Important:** Without contracts, increase skepticism. Code that "looks implemented" may have subtle bugs.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## QA Acceptance Reviewer Persona
|
|
317
|
+
|
|
318
|
+
Used in `--deep` mode (isolated agent):
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
You are an independent QA Acceptance Reviewer.
|
|
322
|
+
|
|
323
|
+
CRITICAL RULES:
|
|
324
|
+
1. You have NEVER seen this code before
|
|
325
|
+
2. You do NOT know what the developer intended
|
|
326
|
+
3. Assume NOTHING works until you verify evidence
|
|
327
|
+
4. Your job is to FIND GAPS, not confirm success
|
|
328
|
+
5. Be adversarial — challenge every claim
|
|
329
|
+
|
|
330
|
+
INPUT YOU WILL RECEIVE:
|
|
331
|
+
- PRD/Requirements document
|
|
332
|
+
- Code files to review
|
|
333
|
+
- Design specs (optional)
|
|
334
|
+
|
|
335
|
+
INPUT YOU WILL NOT RECEIVE:
|
|
336
|
+
- Development conversation history
|
|
337
|
+
- Developer's explanations
|
|
338
|
+
- Prior context about design decisions
|
|
339
|
+
|
|
340
|
+
OUTPUT: Structured Validation Report (see Step 6)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## CLI Override
|
|
346
|
+
|
|
347
|
+
Override isolation level per-invocation:
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
/acceptance → Uses --deep (default, spawns isolated agent)
|
|
351
|
+
/acceptance --quick → Same context, persona hint only
|
|
352
|
+
/acceptance --standard → Same context, persona switch
|
|
353
|
+
/acceptance --deep → Spawns isolated agent (explicit)
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**No external configuration required.** Defaults are in this SKILL.md.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Installation
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# Via CLI
|
|
364
|
+
invar skill add acceptance
|
|
365
|
+
|
|
366
|
+
# Manual copy
|
|
367
|
+
cp -r /path/to/extensions/acceptance .claude/skills/
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
*Extension Skill v1.0 — LX-07*
|
|
373
|
+
<!--/invar:skill--><!--invar:extensions-->
|
|
374
|
+
<!-- ========================================================================
|
|
375
|
+
EXTENSIONS REGION - USER EDITABLE
|
|
376
|
+
Add project-specific extensions here. This section is preserved on update.
|
|
377
|
+
|
|
378
|
+
Examples of what to add:
|
|
379
|
+
- Custom acceptance criteria templates
|
|
380
|
+
- Project-specific requirement categories
|
|
381
|
+
- Domain-specific validation rules
|
|
382
|
+
======================================================================== -->
|
|
383
|
+
<!--/invar:extensions-->
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: develop
|
|
3
3
|
description: Implementation phase following USBV workflow. Use when task is clear and actionable - "add", "implement", "create", "fix", "update", "build", "write". Requires Check-In at start and Final at end.
|
|
4
4
|
_invar:
|
|
5
|
-
version: "5.
|
|
5
|
+
version: "5.1"
|
|
6
6
|
managed: skill
|
|
7
7
|
---
|
|
8
8
|
<!--invar:skill-->
|
|
@@ -92,10 +92,11 @@ If task appears simple (4+ signals: single file, clear target, additive change,
|
|
|
92
92
|
|
|
93
93
|
### 2. SPECIFY
|
|
94
94
|
|
|
95
|
-
- **Contracts FIRST:** Write
|
|
96
|
-
- **
|
|
95
|
+
- **Contracts FIRST:** Write contracts before implementation
|
|
96
|
+
- **Examples:** Add examples for expected behavior
|
|
97
97
|
- **Design:** Decompose complex tasks into sub-functions
|
|
98
98
|
|
|
99
|
+
|
|
99
100
|
```python
|
|
100
101
|
# SPECIFY before BUILD:
|
|
101
102
|
@pre(lambda x: x > 0)
|
|
@@ -108,6 +109,7 @@ def calculate(x: int) -> int:
|
|
|
108
109
|
... # Implementation comes in BUILD
|
|
109
110
|
```
|
|
110
111
|
|
|
112
|
+
|
|
111
113
|
#### Function-Level Gates (DX-63)
|
|
112
114
|
|
|
113
115
|
When creating new modules, use **incremental development**:
|
|
@@ -187,6 +189,52 @@ Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
187
189
|
- All TodoWrite items complete
|
|
188
190
|
- Integration works (if applicable)
|
|
189
191
|
|
|
192
|
+
#### Isolation Requirement (DX-75)
|
|
193
|
+
|
|
194
|
+
**For non-trivial implementations (>3 functions OR >200 lines), VALIDATE requires isolation:**
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
198
|
+
│ VALIDATE with Isolation │
|
|
199
|
+
│ ───────────────────────────────────────────────────────────│
|
|
200
|
+
│ │
|
|
201
|
+
│ Why: You (the builder) have context contamination. │
|
|
202
|
+
│ You "know" what the code is supposed to do. │
|
|
203
|
+
│ You cannot objectively verify your own work. │
|
|
204
|
+
│ │
|
|
205
|
+
│ Steps: │
|
|
206
|
+
│ 1. Main Agent: Run invar_guard() — mechanical checks │
|
|
207
|
+
│ │
|
|
208
|
+
│ 2. Spawn Isolated VALIDATOR (Task tool, model=opus): │
|
|
209
|
+
│ ┌─────────────────────────────────────────────────┐ │
|
|
210
|
+
│ │ RECEIVES: │ │
|
|
211
|
+
│ │ - Implementation files │ │
|
|
212
|
+
│ │ - Contracts (@pre/@post) │ │
|
|
213
|
+
│ │ - Original task description │ │
|
|
214
|
+
│ │ │ │
|
|
215
|
+
│ │ DOES NOT RECEIVE: │ │
|
|
216
|
+
│ │ - Development conversation │ │
|
|
217
|
+
│ │ - Your reasoning or decisions │ │
|
|
218
|
+
│ │ - Previous iterations │ │
|
|
219
|
+
│ │ │ │
|
|
220
|
+
│ │ TASK: "Does this implementation satisfy the │ │
|
|
221
|
+
│ │ contracts? Are there gaps or edge cases?" │ │
|
|
222
|
+
│ └─────────────────────────────────────────────────┘ │
|
|
223
|
+
│ │
|
|
224
|
+
│ 3. If VALIDATOR finds issues: │
|
|
225
|
+
│ - Main agent fixes │
|
|
226
|
+
│ - Spawn NEW validator (never reuse) │
|
|
227
|
+
│ - Repeat until PASS │
|
|
228
|
+
│ │
|
|
229
|
+
│ Exit: Guard PASS + Isolated Validator PASS │
|
|
230
|
+
└─────────────────────────────────────────────────────────────┘
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Skip isolation when:**
|
|
234
|
+
- Simple changes (<3 functions AND <200 lines)
|
|
235
|
+
- Pure refactoring (no behavior change)
|
|
236
|
+
- Documentation-only changes
|
|
237
|
+
|
|
190
238
|
## Task Batching
|
|
191
239
|
|
|
192
240
|
For multiple tasks:
|
|
@@ -211,6 +259,7 @@ For multiple tasks:
|
|
|
211
259
|
|
|
212
260
|
Quick reference for resolving common Guard errors:
|
|
213
261
|
|
|
262
|
+
|
|
214
263
|
| Error | Cause | Quick Fix |
|
|
215
264
|
|-------|-------|-----------|
|
|
216
265
|
| `forbidden_import: io` | I/O library in Core | Use `iter(s.splitlines())` not `io.StringIO` |
|
|
@@ -230,6 +279,7 @@ Check the "Suggested:" line in Guard output.
|
|
|
230
279
|
**Note:** Use `from deal import pre, post` for lambda-based contracts.
|
|
231
280
|
`invar_runtime.pre/post` are for Contract objects like `NonEmpty`.
|
|
232
281
|
|
|
282
|
+
|
|
233
283
|
## Timeout Handling
|
|
234
284
|
|
|
235
285
|
| Threshold | Duration | Action |
|
|
@@ -355,6 +405,7 @@ Agent:
|
|
|
355
405
|
|
|
356
406
|
@pre(lambda source, path: len(source.strip()) > 0)
|
|
357
407
|
|
|
408
|
+
|
|
358
409
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
359
410
|
📍 /develop → BUILD (3/4)
|
|
360
411
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
@@ -369,7 +420,8 @@ Agent:
|
|
|
369
420
|
|
|
370
421
|
✓ Final: guard PASS | 0 errors, 1 warning
|
|
371
422
|
```
|
|
372
|
-
<!--/invar:skill
|
|
423
|
+
<!--/invar:skill-->
|
|
424
|
+
<!--invar:extensions-->
|
|
373
425
|
<!-- ========================================================================
|
|
374
426
|
EXTENSIONS REGION - USER EDITABLE
|
|
375
427
|
Add project-specific extensions here. This section is preserved on update.
|