specsmith 0.21.0.dev787__tar.gz → 0.22.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specsmith-0.21.0.dev787/src/specsmith.egg-info → specsmith-0.22.1}/PKG-INFO +50 -16
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/README.md +48 -12
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/pyproject.toml +5 -5
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/__init__.py +1 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/advanced_code_analysis.py +1 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/cleanup.py +2 -2
- specsmith-0.22.1/src/specsmith/chat_handoff.py +107 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/cli.py +145 -7
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/zoo_code.py +19 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/config.py +7 -4
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/context_orchestrator.py +5 -4
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/importer.py +3 -1
- specsmith-0.22.1/src/specsmith/improvement_tracker.py +186 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/warp.py +1 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/__init__.py +4 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m006_session_governance.py +1 -1
- specsmith-0.22.1/src/specsmith/migrations/m011_windows_skill_shell.py +64 -0
- specsmith-0.22.1/src/specsmith/migrations/m012_normalize_skill_shell.py +56 -0
- specsmith-0.22.1/src/specsmith/model_optimizer.py +182 -0
- specsmith-0.22.1/src/specsmith/model_registry.py +970 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/quality_report.py +5 -2
- specsmith-0.22.1/src/specsmith/release_guard.py +36 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session_store.py +82 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/__init__.py +55 -59
- specsmith-0.22.1/src/specsmith/skills/governance.py +523 -0
- specsmith-0.22.1/src/specsmith/skills/specsmith_core_commands.py +355 -0
- specsmith-0.22.1/src/specsmith/skills/specsmith_operations.py +67 -0
- specsmith-0.22.1/src/specsmith/skills/specsmith_skills.py +110 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/sync.py +34 -11
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/agents.md.j2 +1 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/contributing.md.j2 +16 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/gitignore.j2 +5 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/updater.py +24 -2
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs_commands.py +33 -14
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/wi_store.py +9 -2
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/workspace.py +1 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1/src/specsmith.egg-info}/PKG-INFO +50 -16
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/SOURCES.txt +20 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/requires.txt +1 -3
- specsmith-0.22.1/tests/test_branch_workflow.py +88 -0
- specsmith-0.22.1/tests/test_chat_handoff.py +80 -0
- specsmith-0.22.1/tests/test_docs_artifacts.py +19 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_enforcement.py +101 -2
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_license.py +12 -0
- specsmith-0.22.1/tests/test_improvement_tracker.py +242 -0
- specsmith-0.22.1/tests/test_migrations_skill_shell.py +58 -0
- specsmith-0.22.1/tests/test_model_registry.py +260 -0
- specsmith-0.22.1/tests/test_release_guard.py +41 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_scaffolder.py +3 -1
- specsmith-0.22.1/tests/test_session_events.py +53 -0
- specsmith-0.22.1/tests/test_updater.py +16 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_warp_parity_followup.py +25 -1
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_wi_lifecycle.py +14 -0
- specsmith-0.22.1/tests/test_windows_launcher.py +40 -0
- specsmith-0.21.0.dev787/src/specsmith/skills/governance.py +0 -1370
- specsmith-0.21.0.dev787/src/specsmith/skills/specsmith_skills.py +0 -29
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/LICENSE +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/setup.cfg +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/belief.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/certainty.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/py.typed +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/recovery.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/session.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/trace.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/__main__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_router.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/terminal_env.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/token_pricing.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/approvals.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/architect.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/auditor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/auth.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/block_export.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/channel.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/code_analysis.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/issues_policy.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/reporting.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compressor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/context_window.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/credits.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/dashboard.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/differ.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/doctor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/drive.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/editor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/efficiency.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/sqlite_store.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb_sweep.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb_writer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/executor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/exporter.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governed_pr.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/history_search.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/instinct.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/languages.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ledger.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/local_model.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m007_yaml_first.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m009_esdb_first.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/patent.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/paths.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/phase.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/plugins.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/policy.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/profiles.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/project_metrics.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/recover.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/releaser.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/requirements.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/risk.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/serve.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session_init.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/tools.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/trace.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/transcripts.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/validator.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_CMD_001.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_ai_client.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architect_interview.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architect_v2.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architecture.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_audit_governance.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_auditor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_benchmark_harness.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_broker_scope.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_channel.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cleanup_cmd.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli_regressions.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compliance.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compliance_governance.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compressor.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_deprecation_registry.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_dispatch.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_dual_write.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_efficiency.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_epistemic.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_backend_switch.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_integration.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_sqlite.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_status_integrity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_status_output.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_sweep.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_verify_chain_cli.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_writer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_golden_path.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_importer.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_init_modes.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations_warp.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_intelligence.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issue_policy_features.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issues_263_264.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_local_model.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_markdown_deprecation.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_mcp_client.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_mcp_server.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_metrics_flush.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_migration_direction.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_model_router.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_new_modules.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_nexus.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_parallel_agents.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_permissions.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_project_metrics.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_quality_report.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_rate_limits.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_releaser.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_repl.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_repl_extended.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_reporting_commands.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_req_248_262.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_req_358_359.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_resume_command.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_schema_migrations.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_smoke.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_sqlite_parity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_suggester.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_sync_reconcile.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_terminal_env.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_token_cost.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_tools.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_trace_vault_esdb.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_typing_guardrails.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_validator.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_vcs.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_warp_parity.py +0 -0
- {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_wi_lifecycle_extended.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.22.1
|
|
4
4
|
Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
|
|
5
5
|
Author: Layer1Labs Silicon, Inc.
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,6 +27,7 @@ Requires-Python: >=3.10
|
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
Requires-Dist: click>=8.1
|
|
30
|
+
Requires-Dist: cryptography>=42.0
|
|
30
31
|
Requires-Dist: jinja2>=3.1
|
|
31
32
|
Requires-Dist: pyyaml>=6.0
|
|
32
33
|
Requires-Dist: pydantic>=2.0
|
|
@@ -38,10 +39,8 @@ Requires-Dist: ruff>=0.4; extra == "dev"
|
|
|
38
39
|
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
39
40
|
Requires-Dist: pre-commit>=3.0; extra == "dev"
|
|
40
41
|
Requires-Dist: types-pyyaml>=6.0; extra == "dev"
|
|
41
|
-
Requires-Dist: cryptography>=42.0; extra == "dev"
|
|
42
42
|
Provides-Extra: esdb
|
|
43
43
|
Requires-Dist: chronomemory>=0.2.7; extra == "esdb"
|
|
44
|
-
Requires-Dist: cryptography>=42.0; extra == "esdb"
|
|
45
44
|
Provides-Extra: docs
|
|
46
45
|
Requires-Dist: mkdocs>=1.6; extra == "docs"
|
|
47
46
|
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
|
|
@@ -73,7 +72,6 @@ Requires-Dist: pytest-cov>=4.0; extra == "all"
|
|
|
73
72
|
Requires-Dist: ruff>=0.4; extra == "all"
|
|
74
73
|
Requires-Dist: mypy>=1.10; extra == "all"
|
|
75
74
|
Provides-Extra: license-verify
|
|
76
|
-
Requires-Dist: cryptography>=42.0; extra == "license-verify"
|
|
77
75
|
Dynamic: license-file
|
|
78
76
|
|
|
79
77
|
# specsmith
|
|
@@ -102,6 +100,8 @@ AI Agents / IDE Clients
|
|
|
102
100
|
## When to use / when not to use
|
|
103
101
|
|
|
104
102
|
- Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
|
|
103
|
+
- Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
|
|
104
|
+
- Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
|
|
105
105
|
- Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
|
|
106
106
|
|
|
107
107
|
## Comparison summary
|
|
@@ -124,8 +124,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
|
|
|
124
124
|
|
|
125
125
|
**Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
|
|
126
126
|
|
|
127
|
+
## Current Stats
|
|
128
|
+
|
|
129
|
+
- **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
|
|
130
|
+
- **127 canonical skills** available across all domains
|
|
131
|
+
- **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
|
|
132
|
+
- **Development mode** with improvement tracking and session analysis
|
|
133
|
+
|
|
134
|
+
See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
|
|
135
|
+
|
|
136
|
+
### Development Mode Features
|
|
137
|
+
|
|
138
|
+
When enabled in project configuration, development mode provides:
|
|
139
|
+
|
|
140
|
+
- **Enhanced logging** for all agent interactions and decision-making processes
|
|
141
|
+
- **Session analysis** that tracks what worked, what didn't, and improvement suggestions
|
|
142
|
+
- **Cost-per-correct-solution metrics** to measure efficiency
|
|
143
|
+
- **Automated improvement tracking** to identify patterns and areas for optimization
|
|
144
|
+
- **Session reports** that can be generated for review and analysis
|
|
145
|
+
|
|
146
|
+
To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
|
|
147
|
+
|
|
127
148
|
See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
|
|
128
149
|
|
|
150
|
+
**v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
|
|
151
|
+
other agents, while a mergeable JSONL session-event log keeps collaboration state
|
|
152
|
+
reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
|
|
153
|
+
stable-release validation before PyPI publishing.
|
|
154
|
+
|
|
129
155
|
**v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
|
|
130
156
|
|
|
131
157
|
**v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
|
|
@@ -148,6 +174,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
|
|
|
148
174
|
specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
|
|
149
175
|
specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
|
|
150
176
|
specsmith export # generate full compliance report
|
|
177
|
+
specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
|
|
151
178
|
|
|
152
179
|
# Update channels
|
|
153
180
|
specsmith channel set stable # pin to stable releases
|
|
@@ -215,17 +242,6 @@ specsmith phase list # list all phases
|
|
|
215
242
|
The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
|
|
216
243
|
of file/command criteria, recommended commands, and a readiness percentage.
|
|
217
244
|
|
|
218
|
-
## 1.0 release criteria status
|
|
219
|
-
|
|
220
|
-
| Criterion | Status | Source |
|
|
221
|
-
|---|---|---|
|
|
222
|
-
| Stable CLI core contract documented | In progress | `docs/stability.md` |
|
|
223
|
-
| Stable generated file schemas documented | In progress | `docs/stability.md` |
|
|
224
|
-
| Stable MCP tool schemas documented | In progress | `docs/stability.md` |
|
|
225
|
-
| Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
226
|
-
| Security threat model documented | In progress | `docs/security-threat-model.md` |
|
|
227
|
-
| Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
228
|
-
| Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
229
245
|
|
|
230
246
|
---
|
|
231
247
|
|
|
@@ -299,6 +315,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
|
|
|
299
315
|
pip install "specsmith[esdb]" # installs chronomemory from PyPI
|
|
300
316
|
# or if using pipx:
|
|
301
317
|
pipx inject specsmith "chronomemory>=0.2.0" # inject into the specsmith pipx venv
|
|
318
|
+
# The license verifier is included in base specsmith; no cryptography injection is needed.
|
|
302
319
|
|
|
303
320
|
# Step 2 — activate your license key
|
|
304
321
|
specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
@@ -353,6 +370,14 @@ specsmith phase # current phase + readiness %
|
|
|
353
370
|
specsmith audit # full governance health check
|
|
354
371
|
```
|
|
355
372
|
|
|
373
|
+
> **Session Bootstrap**: For a more streamlined session start, you can also use:
|
|
374
|
+
> ```bash
|
|
375
|
+
> specsmith load # run migrate, audit, sync, and checkpoint in sequence
|
|
376
|
+
> ```
|
|
377
|
+
> This command combines the essential bootstrap steps for a clean session start.
|
|
378
|
+
>
|
|
379
|
+
> **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
|
|
380
|
+
|
|
356
381
|
> **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
|
|
357
382
|
> Every utterance is preflighted automatically. Use `/why` to see the governance trace.
|
|
358
383
|
> For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
|
|
@@ -1130,6 +1155,16 @@ specsmith skill install specsmith-audit
|
|
|
1130
1155
|
|
|
1131
1156
|
Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
|
|
1132
1157
|
|
|
1158
|
+
### Skill Policy
|
|
1159
|
+
|
|
1160
|
+
If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
|
|
1161
|
+
|
|
1162
|
+
If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
|
|
1163
|
+
|
|
1164
|
+
If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
|
|
1165
|
+
|
|
1166
|
+
Do not hand-edit `.agents/skills/` as a canonical source.
|
|
1167
|
+
|
|
1133
1168
|
### Skill domains
|
|
1134
1169
|
|
|
1135
1170
|
| Domain | Count | Coverage |
|
|
@@ -1388,7 +1423,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
|
|
|
1388
1423
|
- [PyPI](https://pypi.org/project/specsmith/)
|
|
1389
1424
|
- [Documentation](https://specsmith.readthedocs.io)
|
|
1390
1425
|
- [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
|
|
1391
|
-
- [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
|
|
1392
1426
|
- [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
|
|
1393
1427
|
- [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
|
|
1394
1428
|
- [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
|
|
@@ -24,6 +24,8 @@ AI Agents / IDE Clients
|
|
|
24
24
|
## When to use / when not to use
|
|
25
25
|
|
|
26
26
|
- Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
|
|
27
|
+
- Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
|
|
28
|
+
- Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
|
|
27
29
|
- Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
|
|
28
30
|
|
|
29
31
|
## Comparison summary
|
|
@@ -46,8 +48,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
|
|
|
46
48
|
|
|
47
49
|
**Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
|
|
48
50
|
|
|
51
|
+
## Current Stats
|
|
52
|
+
|
|
53
|
+
- **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
|
|
54
|
+
- **127 canonical skills** available across all domains
|
|
55
|
+
- **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
|
|
56
|
+
- **Development mode** with improvement tracking and session analysis
|
|
57
|
+
|
|
58
|
+
See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
|
|
59
|
+
|
|
60
|
+
### Development Mode Features
|
|
61
|
+
|
|
62
|
+
When enabled in project configuration, development mode provides:
|
|
63
|
+
|
|
64
|
+
- **Enhanced logging** for all agent interactions and decision-making processes
|
|
65
|
+
- **Session analysis** that tracks what worked, what didn't, and improvement suggestions
|
|
66
|
+
- **Cost-per-correct-solution metrics** to measure efficiency
|
|
67
|
+
- **Automated improvement tracking** to identify patterns and areas for optimization
|
|
68
|
+
- **Session reports** that can be generated for review and analysis
|
|
69
|
+
|
|
70
|
+
To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
|
|
71
|
+
|
|
49
72
|
See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
|
|
50
73
|
|
|
74
|
+
**v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
|
|
75
|
+
other agents, while a mergeable JSONL session-event log keeps collaboration state
|
|
76
|
+
reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
|
|
77
|
+
stable-release validation before PyPI publishing.
|
|
78
|
+
|
|
51
79
|
**v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
|
|
52
80
|
|
|
53
81
|
**v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
|
|
@@ -70,6 +98,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
|
|
|
70
98
|
specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
|
|
71
99
|
specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
|
|
72
100
|
specsmith export # generate full compliance report
|
|
101
|
+
specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
|
|
73
102
|
|
|
74
103
|
# Update channels
|
|
75
104
|
specsmith channel set stable # pin to stable releases
|
|
@@ -137,17 +166,6 @@ specsmith phase list # list all phases
|
|
|
137
166
|
The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
|
|
138
167
|
of file/command criteria, recommended commands, and a readiness percentage.
|
|
139
168
|
|
|
140
|
-
## 1.0 release criteria status
|
|
141
|
-
|
|
142
|
-
| Criterion | Status | Source |
|
|
143
|
-
|---|---|---|
|
|
144
|
-
| Stable CLI core contract documented | In progress | `docs/stability.md` |
|
|
145
|
-
| Stable generated file schemas documented | In progress | `docs/stability.md` |
|
|
146
|
-
| Stable MCP tool schemas documented | In progress | `docs/stability.md` |
|
|
147
|
-
| Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
148
|
-
| Security threat model documented | In progress | `docs/security-threat-model.md` |
|
|
149
|
-
| Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
150
|
-
| Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
151
169
|
|
|
152
170
|
---
|
|
153
171
|
|
|
@@ -221,6 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
|
|
|
221
239
|
pip install "specsmith[esdb]" # installs chronomemory from PyPI
|
|
222
240
|
# or if using pipx:
|
|
223
241
|
pipx inject specsmith "chronomemory>=0.2.0" # inject into the specsmith pipx venv
|
|
242
|
+
# The license verifier is included in base specsmith; no cryptography injection is needed.
|
|
224
243
|
|
|
225
244
|
# Step 2 — activate your license key
|
|
226
245
|
specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
@@ -275,6 +294,14 @@ specsmith phase # current phase + readiness %
|
|
|
275
294
|
specsmith audit # full governance health check
|
|
276
295
|
```
|
|
277
296
|
|
|
297
|
+
> **Session Bootstrap**: For a more streamlined session start, you can also use:
|
|
298
|
+
> ```bash
|
|
299
|
+
> specsmith load # run migrate, audit, sync, and checkpoint in sequence
|
|
300
|
+
> ```
|
|
301
|
+
> This command combines the essential bootstrap steps for a clean session start.
|
|
302
|
+
>
|
|
303
|
+
> **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
|
|
304
|
+
|
|
278
305
|
> **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
|
|
279
306
|
> Every utterance is preflighted automatically. Use `/why` to see the governance trace.
|
|
280
307
|
> For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
|
|
@@ -1052,6 +1079,16 @@ specsmith skill install specsmith-audit
|
|
|
1052
1079
|
|
|
1053
1080
|
Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
|
|
1054
1081
|
|
|
1082
|
+
### Skill Policy
|
|
1083
|
+
|
|
1084
|
+
If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
|
|
1085
|
+
|
|
1086
|
+
If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
|
|
1087
|
+
|
|
1088
|
+
If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
|
|
1089
|
+
|
|
1090
|
+
Do not hand-edit `.agents/skills/` as a canonical source.
|
|
1091
|
+
|
|
1055
1092
|
### Skill domains
|
|
1056
1093
|
|
|
1057
1094
|
| Domain | Count | Coverage |
|
|
@@ -1310,7 +1347,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
|
|
|
1310
1347
|
- [PyPI](https://pypi.org/project/specsmith/)
|
|
1311
1348
|
- [Documentation](https://specsmith.readthedocs.io)
|
|
1312
1349
|
- [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
|
|
1313
|
-
- [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
|
|
1314
1350
|
- [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
|
|
1315
1351
|
- [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
|
|
1316
1352
|
- [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.22.1"
|
|
8
8
|
description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -37,6 +37,8 @@ classifiers = [
|
|
|
37
37
|
|
|
38
38
|
dependencies = [
|
|
39
39
|
"click>=8.1",
|
|
40
|
+
# `specsmith esdb enable` verifies Ed25519 license signatures in every install.
|
|
41
|
+
"cryptography>=42.0",
|
|
40
42
|
"jinja2>=3.1",
|
|
41
43
|
"pyyaml>=6.0",
|
|
42
44
|
"pydantic>=2.0",
|
|
@@ -54,7 +56,6 @@ dev = [
|
|
|
54
56
|
"mypy>=1.10",
|
|
55
57
|
"pre-commit>=3.0",
|
|
56
58
|
"types-pyyaml>=6.0",
|
|
57
|
-
"cryptography>=42.0", # needed for test_esdb_license.py signing helpers
|
|
58
59
|
]
|
|
59
60
|
# ESDB commercial backend — requires a valid license from licensing@layer1labs.ai
|
|
60
61
|
# Install: pip install specsmith[esdb]
|
|
@@ -62,7 +63,6 @@ dev = [
|
|
|
62
63
|
# Terms: https://github.com/layer1labs/specsmith/blob/develop/COMMERCIAL-LICENSE.md
|
|
63
64
|
esdb = [
|
|
64
65
|
"chronomemory>=0.2.7", # proprietary commercial — ChronoMemory terms only (not SQLite free tier)
|
|
65
|
-
"cryptography>=42.0",
|
|
66
66
|
]
|
|
67
67
|
docs = [
|
|
68
68
|
"mkdocs>=1.6",
|
|
@@ -95,8 +95,8 @@ all = [
|
|
|
95
95
|
"ruff>=0.4",
|
|
96
96
|
"mypy>=1.10",
|
|
97
97
|
]
|
|
98
|
-
# cryptography
|
|
99
|
-
license-verify = [
|
|
98
|
+
# Compatibility extra: cryptography is now part of every supported installation.
|
|
99
|
+
license-verify = []
|
|
100
100
|
|
|
101
101
|
[project.scripts]
|
|
102
102
|
specsmith = "specsmith.cli:main"
|
|
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
|
|
|
8
8
|
try:
|
|
9
9
|
__version__: str = _pkg_version("specsmith")
|
|
10
10
|
except PackageNotFoundError: # running from source without install
|
|
11
|
-
__version__ = "0.
|
|
11
|
+
__version__ = "0.22.1" # fallback: keep in sync with pyproject.toml
|
|
@@ -249,7 +249,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
|
|
|
249
249
|
reqs_yaml_dir = root / "docs" / "requirements"
|
|
250
250
|
reqs_yaml_dir.mkdir(parents=True, exist_ok=True)
|
|
251
251
|
consolidated.append("Consolidated requirements to YAML structure")
|
|
252
|
-
except Exception:
|
|
252
|
+
except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
|
|
253
253
|
pass
|
|
254
254
|
|
|
255
255
|
if tests_dir.exists() and tests_dir.is_dir():
|
|
@@ -258,7 +258,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
|
|
|
258
258
|
tests_yaml_dir = root / "docs" / "tests"
|
|
259
259
|
tests_yaml_dir.mkdir(parents=True, exist_ok=True)
|
|
260
260
|
consolidated.append("Consolidated tests to YAML structure")
|
|
261
|
-
except Exception:
|
|
261
|
+
except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
|
|
262
262
|
pass
|
|
263
263
|
|
|
264
264
|
return consolidated
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
|
|
3
|
+
"""Evidence-preserving chat compaction and portable agent handoffs (REQ-446)."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from datetime import datetime, timezone
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
SCHEMA_VERSION = 1
|
|
13
|
+
_MAX_EXCERPT = 280
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def build_handoff(
|
|
17
|
+
history: list[dict[str, Any]],
|
|
18
|
+
*,
|
|
19
|
+
work_item_ids: list[str] | None = None,
|
|
20
|
+
) -> dict[str, Any]:
|
|
21
|
+
"""Build an extractive, provenance-preserving envelope from chat turns.
|
|
22
|
+
|
|
23
|
+
This deliberately does not ask an LLM to invent a prose summary. Each
|
|
24
|
+
compacted claim remains a bounded excerpt linked to a deterministic turn ID,
|
|
25
|
+
allowing another agent to inspect the original history before relying on it.
|
|
26
|
+
"""
|
|
27
|
+
turns: list[dict[str, str]] = []
|
|
28
|
+
for index, turn in enumerate(history):
|
|
29
|
+
role = turn.get("role")
|
|
30
|
+
content = turn.get("content")
|
|
31
|
+
if not isinstance(role, str) or not isinstance(content, str) or not content.strip():
|
|
32
|
+
continue
|
|
33
|
+
canonical = json.dumps(
|
|
34
|
+
{"role": role, "content": content}, sort_keys=True, ensure_ascii=False
|
|
35
|
+
)
|
|
36
|
+
source_id = f"turn:{hashlib.sha256(canonical.encode('utf-8')).hexdigest()[:16]}"
|
|
37
|
+
turns.append(
|
|
38
|
+
{
|
|
39
|
+
"source_id": source_id,
|
|
40
|
+
"role": role,
|
|
41
|
+
"excerpt": content.strip()[:_MAX_EXCERPT],
|
|
42
|
+
"position": str(index),
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
payload = {
|
|
47
|
+
"schema_version": SCHEMA_VERSION,
|
|
48
|
+
"kind": "epistemic_chat_handoff",
|
|
49
|
+
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
50
|
+
"confidence": 1.0,
|
|
51
|
+
"uncertainty": "Extractive envelope; excerpts are not inferred claims.",
|
|
52
|
+
"work_item_ids": sorted(set(work_item_ids or [])),
|
|
53
|
+
"turns": turns,
|
|
54
|
+
}
|
|
55
|
+
fingerprint = json.dumps(payload, sort_keys=True, ensure_ascii=False)
|
|
56
|
+
digest = hashlib.sha256(fingerprint.encode("utf-8")).hexdigest()[:16].upper()
|
|
57
|
+
payload["id"] = f"HANDOFF-{digest}"
|
|
58
|
+
validate_handoff(payload)
|
|
59
|
+
return payload
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def validate_handoff(payload: dict[str, Any]) -> None:
|
|
63
|
+
"""Reject malformed or unsupported handoff claims before persistence/import."""
|
|
64
|
+
if (
|
|
65
|
+
payload.get("schema_version") != SCHEMA_VERSION
|
|
66
|
+
or payload.get("kind") != "epistemic_chat_handoff"
|
|
67
|
+
):
|
|
68
|
+
raise ValueError("unsupported handoff schema")
|
|
69
|
+
if not isinstance(payload.get("id"), str) or not payload["id"].startswith("HANDOFF-"):
|
|
70
|
+
raise ValueError("handoff must have a stable ID")
|
|
71
|
+
if payload.get("confidence") != 1.0:
|
|
72
|
+
raise ValueError("extractive handoffs must retain confidence 1.0")
|
|
73
|
+
for turn in payload.get("turns", []):
|
|
74
|
+
if not isinstance(turn, dict) or not isinstance(turn.get("source_id"), str):
|
|
75
|
+
raise ValueError("handoff turn is missing provenance")
|
|
76
|
+
if not isinstance(turn.get("excerpt"), str) or len(turn["excerpt"]) > _MAX_EXCERPT:
|
|
77
|
+
raise ValueError("handoff excerpt is invalid")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def render_handoff_context(payload: dict[str, Any]) -> str:
|
|
81
|
+
"""Render a bounded context entry that tells agents how to verify it."""
|
|
82
|
+
validate_handoff(payload)
|
|
83
|
+
excerpts = "\n".join(
|
|
84
|
+
f"- [{turn['source_id']}] {turn['role']}: {turn['excerpt']}" for turn in payload["turns"]
|
|
85
|
+
)
|
|
86
|
+
return (
|
|
87
|
+
f"[Epistemic handoff {payload['id']} | {len(payload['turns'])} extractive turns | "
|
|
88
|
+
"verify source IDs before treating excerpts as decisions]\n"
|
|
89
|
+
f"{excerpts}"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def store_handoff(root: Any, payload: dict[str, Any]) -> None:
|
|
94
|
+
"""Persist a validated handoff in the active ESDB backend."""
|
|
95
|
+
validate_handoff(payload)
|
|
96
|
+
from specsmith.esdb import SqliteRecord, open_default_store
|
|
97
|
+
|
|
98
|
+
with open_default_store(root) as store:
|
|
99
|
+
store.upsert(
|
|
100
|
+
SqliteRecord(
|
|
101
|
+
id=payload["id"],
|
|
102
|
+
kind="chat_handoff",
|
|
103
|
+
label="Epistemic chat handoff",
|
|
104
|
+
confidence=1.0,
|
|
105
|
+
data=payload,
|
|
106
|
+
),
|
|
107
|
+
)
|