xrefkit 0.7.2__tar.gz → 0.7.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {xrefkit-0.7.2/xrefkit.egg-info → xrefkit-0.7.3}/PKG-INFO +1 -1
- {xrefkit-0.7.2 → xrefkit-0.7.3}/pyproject.toml +1 -1
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_ci_workflow_invariants.py +35 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_cli.py +7 -1
- xrefkit-0.7.3/tests/test_compact_skill_logs.py +190 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/__init__.py +1 -1
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/catalog.py +8 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skillrun.py +50 -30
- {xrefkit-0.7.2 → xrefkit-0.7.3/xrefkit.egg-info}/PKG-INFO +1 -1
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit.egg-info/SOURCES.txt +1 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/LICENSE +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/README.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/setup.cfg +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_artifact_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_attention_pet.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_attention_pet_client_protocol.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_attention_pet_codex_session.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_attention_pet_fit.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_azure_connection.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_azure_import.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_azure_recovery.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_azure_update_candidate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_azure_writer.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_boundary_analysis.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_brownfield_csharp_structure_definitions.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_brownfield_file_editing_protocol.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_business_intake_conversation_definitions.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_business_intake_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_calibration_lint.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_catalog_preparation_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_check_skill_knowledge_xids.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_code_constraint_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_collect_analyzer_sarif.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_constraint_derivation_family_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_constraint_derivation_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_contribution_adoption_bytes.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_contribution_returns.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_convert_to_xrefkit_skill.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_cs_scope_probe.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_csharp_commonality.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_csharp_naming_profile.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_ctx.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_cutover_readiness.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_dashboard.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_database_batch_definition_migration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_decision_trace.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_design_business_intake_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_design_planning_definition_migration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_dotnet_definition_candidate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_editorial_family_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_editorial_intake_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_editorial_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_embedded_startup_pack.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_error_policy_audit.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_error_policy_locator.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_execution_binding.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_existing_skill_definition_batch.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_final_skilldefinition_batch.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_flow_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_fm_multiroot.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_gate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_gateway.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_gateway_mcp.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_gateway_skill_adapter.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_gateway_work_items.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_goal_desired_state.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_governance_entry.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_host_precheck.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_human_evaluation.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_implementation_flow_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_implementation_review_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_inbound_uploads.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_instruction_workflow.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_knowledge_relations_validator.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_language_review_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_legacy_guidance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_legacy_migration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_legacy_resources.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_mcp_package_routing.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_mcp_setup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_mcp_subagent_startup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_mcp_subagent_startup_integration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_ontology_assessment_validator.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_os_family_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_os_knowledge_family_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_os_selected_family.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_ownership.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_packmeta.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_plan_markdown.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_plan_observation.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_project_quality_baseline.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_qa_report_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_reporting_profiles.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_reporting_quality.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_repository_skill_adoption.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_repository_startup_pack.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_resource_provider.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_runtime_contracts.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_sarif_to_locator.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_security_definition_migration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_site_release_metadata.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_definition_governance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_definition_mcp.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_definition_runtime.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_edits.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_maturity_return.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_release_compatibility.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skill_runtime_audit.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skillmeta.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_skills_sync.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_source_analysis_fragments.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_structure_catalog.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_subagent_startup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_subagent_startup_boundaries.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_wbs.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_work_management.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_work_packages.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_workflow_family_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xref.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xrefkit_instance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xrefkit_tools.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xrefkit_v2_discovery.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xrefkit_v2_models.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/tests/test_xrefkit_v2_pipeline.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/__main__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/__init__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/__main__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/client.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/client_protocol.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/codex_session.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/evaluator.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/model.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/presentation.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/profiles.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/scenarios.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/server.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/attention_pet/store.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/azure_connection.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/azure_import.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/azure_recovery.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/azure_update_candidate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/azure_writer.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/boundary_analysis.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/catalog_cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/contracts.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/ctx.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/dashboard.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/decision_trace.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/discovery.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/execution_binding.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/execution_binding_cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/gate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/gateway.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/goalstate.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/governance_entry.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/governance_entry_cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/hashing.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/host_precheck.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/import_skill.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/instance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/loaders.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/__init__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/audit.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/bootstrap.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/client_cache.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/client_flow.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/context_registry.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/context_token.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/contracts.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/contribution_adoption.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/contribution_returns.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/dist.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/gateway.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/governed_overlays.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/inbound_uploads.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/knowledge_edits.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/legacy_guidance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/legacy_migration.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/legacy_resources.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/ownership.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/repository.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/schemas.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/server.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/setup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/skill_edits.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/skill_maturity.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/startup_contract_pack.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/subagent_startup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp/update_gate_intake.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/mcp_tools.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/__init__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/common.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/effective_bundle.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/human_evaluation.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/local_manifest.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/package_manifest.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/run_log.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/server_config.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/models/skill_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/operations_cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/ownership.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/packmeta.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/plan_markdown.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/plan_observation.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/registry.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/reporting.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/reporting_profiles.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/repository_skills.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resolver.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resource_provider.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/attention_pet/client-state.schema.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/attention_pet/pet.css +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/attention_pet/pet.html +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/attention_pet/pet.js +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/contracts.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/current.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/generations/7a682a5272907354/contracts.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/generations/7a682a5272907354/model_body.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/generations/9929294385ccb7b0/contracts.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/generations/9929294385ccb7b0/model_body.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/model_body.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/000_agent_entry.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/011_startup_xref_routing.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/015_shared_memory_operations.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/016_uncertainty_protocol.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/017_base_and_xref_layering.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/053_context_direction_security_guard.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/base/startup_sources/yomiyasu_LICENSE.txt +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/docs/guides/062_legacy_flow_skill_migration_guide.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/knowledge/operations/130_legacy_flow_skill_migration_rules.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/knowledge/organization/160_context_direction_guard_rules.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/SKILL.v1.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/references/legacy_flow_skill_migration_template.md +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/skills/repository_adoption.json +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/resources/migration/tools/migrate_legacy_flow_skill.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/runlog.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skill_definition.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skill_definition_catalog.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skill_definition_governance.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skillmeta.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/skills_sync.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/structure_catalog.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/subagent_startup.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/tools/__init__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/tools/__main__.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/v2_cli.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/wbs.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/work_management.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/work_management_view.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/workspace.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit/xref.py +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit.egg-info/dependency_links.txt +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit.egg-info/entry_points.txt +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit.egg-info/requires.txt +0 -0
- {xrefkit-0.7.2 → xrefkit-0.7.3}/xrefkit.egg-info/top_level.txt +0 -0
|
@@ -220,3 +220,38 @@ def test_shared_tools_trigger_only_consumers():
|
|
|
220
220
|
assert not accepts_changes(filename, "pull_request", ["tools/run_quality_gate.py"])
|
|
221
221
|
assert not accepts_changes("python-skill-csharp-package.yml", "pull_request", ["tools/run_import_smoke.py"])
|
|
222
222
|
assert not accepts_changes("xrefkit-skills-xddp-design.yml", "pull_request", ["xrefkit/cli.py"])
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def test_pages_deployment_is_main_only_and_release_dispatch_has_no_environment():
|
|
226
|
+
data = workflow("pages.yml")
|
|
227
|
+
deploy = data["jobs"]["deploy"]
|
|
228
|
+
condition = " ".join(deploy["if"].split())
|
|
229
|
+
assert condition.startswith("github.ref == 'refs/heads/main' && (")
|
|
230
|
+
assert deploy["environment"]["name"] == "github-pages"
|
|
231
|
+
route = data["jobs"]["dispatch-release"]
|
|
232
|
+
assert route["if"] == "github.event_name == 'release'"
|
|
233
|
+
assert "environment" not in route
|
|
234
|
+
assert route["permissions"] == {"contents": "read", "actions": "write"}
|
|
235
|
+
assert data["permissions"]["pages"] == "write"
|
|
236
|
+
step = route["steps"][0]
|
|
237
|
+
assert step["env"]["RELEASE_REPOSITORY"] == "${{ github.repository }}"
|
|
238
|
+
assert step["env"]["GH_TOKEN"] == "${{ github.token }}"
|
|
239
|
+
assert "github.event.release" not in step["run"]
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
@pytest.mark.parametrize("dispatch_exit", [0, 37])
|
|
243
|
+
def test_pages_release_dispatch_executes_fixed_main_target_and_preserves_failure(dispatch_exit):
|
|
244
|
+
bash = shutil.which("bash")
|
|
245
|
+
if Path("C:/Program Files/Git/bin/bash.exe").is_file():
|
|
246
|
+
bash = "C:/Program Files/Git/bin/bash.exe"
|
|
247
|
+
if not bash:
|
|
248
|
+
pytest.skip("Bash is required to execute the Pages dispatch block")
|
|
249
|
+
script = workflow("pages.yml")["jobs"]["dispatch-release"]["steps"][0]["run"]
|
|
250
|
+
mock = ('set -euo pipefail\nRELEASE_REPOSITORY=synthaicode/XRefKit\n'
|
|
251
|
+
'gh() { printf "<%s>\\n" "$@"; return ' + str(dispatch_exit) + '; }\n')
|
|
252
|
+
result = subprocess.run([bash, "-c", mock + script + "\necho dispatch-complete\n"],
|
|
253
|
+
capture_output=True, text=True)
|
|
254
|
+
assert result.returncode == dispatch_exit, result.stdout + result.stderr
|
|
255
|
+
assert result.stdout.splitlines()[:6] == ["<api>", "<--method>", "<POST>",
|
|
256
|
+
"<repos/synthaicode/XRefKit/actions/workflows/pages.yml/dispatches>", "<-f>", "<ref=main>"]
|
|
257
|
+
assert ("dispatch-complete" in result.stdout) == (dispatch_exit == 0)
|
|
@@ -1000,7 +1000,13 @@ class CliTests(unittest.TestCase):
|
|
|
1000
1000
|
)
|
|
1001
1001
|
text = out.read_text(encoding="utf-8")
|
|
1002
1002
|
self.assertIn("## Domain Knowledge Inputs", text)
|
|
1003
|
-
self.assertIn("-
|
|
1003
|
+
self.assertIn("- log_format: `compact_v1`", text)
|
|
1004
|
+
self.assertIn("- operating_contract_xid: `B7A2C94F0E61`", text)
|
|
1005
|
+
self.assertIn(
|
|
1006
|
+
"### Selected Knowledge Inputs\n\n- target_service_structure:\n"
|
|
1007
|
+
" - `LOCAL-SERVICE-MAP-001`\n - `LOCAL-DB-SCHEMA-001`",
|
|
1008
|
+
text,
|
|
1009
|
+
)
|
|
1004
1010
|
self.assertIn("- xid: `LOCAL-SERVICE-MAP-001`", text)
|
|
1005
1011
|
self.assertIn("content_hash: `sha256-service-map`", text)
|
|
1006
1012
|
self.assertIn("last_verified: `2026-07-04`", text)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from test_skill_definition_runtime import _open_run
|
|
4
|
+
from test_subagent_startup import command
|
|
5
|
+
from xrefkit.skillrun import _section_body
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@pytest.mark.parametrize("legacy", [False, True])
|
|
9
|
+
def test_compact_and_legacy_logs_keep_evidence_through_closure(tmp_path, legacy):
|
|
10
|
+
_, log = _open_run(tmp_path)
|
|
11
|
+
text = log.read_text(encoding="utf-8")
|
|
12
|
+
marker = "- log_format: `compact_v1`\n- operating_contract_xid: `B7A2C94F0E61`\n"
|
|
13
|
+
assert marker in text
|
|
14
|
+
assert "- rule:" not in text
|
|
15
|
+
if legacy:
|
|
16
|
+
text = text.replace(marker, "", 1)
|
|
17
|
+
text = text.replace(
|
|
18
|
+
"## Token Usage\n\n", "## Token Usage\n\n- rule: legacy token guidance\n", 1
|
|
19
|
+
)
|
|
20
|
+
log.write_text(text, encoding="utf-8")
|
|
21
|
+
|
|
22
|
+
def update(*args):
|
|
23
|
+
code, output = command("skill", *args, "--log", str(log))
|
|
24
|
+
assert code == 0, output
|
|
25
|
+
|
|
26
|
+
# User data that resembles omitted template lines must survive updates.
|
|
27
|
+
note = "literal evidence\n- rule: user supplied detail\n- log_format: `compact_v1`"
|
|
28
|
+
update("tokens", "--input", "120", "--output", "30", "--note", note)
|
|
29
|
+
update("workitem", "--item", "WI-1", "--completion-criterion", "report covers target", "--status", "done", "--role", "definition_sample:executor")
|
|
30
|
+
for artifact_id, kind, target in (
|
|
31
|
+
("OUT", "output", "report.md"), ("EVIDENCE", "evidence", "tests passed"),
|
|
32
|
+
):
|
|
33
|
+
update("artifact", "--artifact", artifact_id, "--kind", kind, "--target", target,
|
|
34
|
+
"--item", "WI-1", "--status", "done", "--role", "definition_sample:executor")
|
|
35
|
+
update("concern", "--concern", "RISK", "--kind", "risk", "--status", "resolved",
|
|
36
|
+
"--text", "Compatibility checked", "--target", "tests passed", "--role", "definition_sample:executor")
|
|
37
|
+
for phase in ("startup", "planning", "execution"):
|
|
38
|
+
update("phase", "--phase", phase, "--status", "done", "--role", "definition_sample:executor")
|
|
39
|
+
update("verify")
|
|
40
|
+
update("phase", "--phase", "handoff", "--status", "done", "--role", "definition_sample:handoff_owner")
|
|
41
|
+
update("close")
|
|
42
|
+
text = log.read_text(encoding="utf-8")
|
|
43
|
+
assert note in text
|
|
44
|
+
assert "Compatibility checked" in text
|
|
45
|
+
assert ("- rule: each work item requires" in text) is legacy
|
|
46
|
+
assert ("- rule: outputs, evidence" in text) is legacy
|
|
47
|
+
assert ("- rule: unknowns, missing evidence" in text) is legacy
|
|
48
|
+
assert "- total: `150`" in text
|
|
49
|
+
assert "- target: report.md" in text or "target=`report.md`" in text
|
|
50
|
+
assert "## Closure Gate\n\n- status: `done`" in text
|
|
51
|
+
assert ("- rule: record tokens consumed" in text) is legacy
|
|
52
|
+
for section in ("Worklist", "Quality Gate"):
|
|
53
|
+
body, _, _ = _section_body(text, section)
|
|
54
|
+
for heading in ("Status", "Result", "Checks Performed", "Evidence", "Open Items", "Handoff"):
|
|
55
|
+
assert f"### {heading}\n" in body
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_workflow_log_keeps_existing_format(tmp_path):
|
|
59
|
+
log = tmp_path / "work" / "workflow.md"
|
|
60
|
+
code, output = command(
|
|
61
|
+
"workflow", "run", "--root", str(tmp_path), "--task", "Inspect target",
|
|
62
|
+
"--completion-condition", "Target inspected", "--out", str(log),
|
|
63
|
+
)
|
|
64
|
+
assert code == 0, output
|
|
65
|
+
original = log.read_text(encoding="utf-8")
|
|
66
|
+
assert "log_format" not in original
|
|
67
|
+
assert "- rule: do not treat the instruction" in original
|
|
68
|
+
code, output = command("skill", "tokens", "--log", str(log), "--total", "20")
|
|
69
|
+
assert code == 0, output
|
|
70
|
+
assert "- rule: record tokens consumed" in log.read_text(encoding="utf-8")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_compaction_only_removes_template_rules_and_preserves_task(monkeypatch, tmp_path):
|
|
74
|
+
from xrefkit import skillrun
|
|
75
|
+
|
|
76
|
+
render = skillrun._render_log
|
|
77
|
+
captured = {}
|
|
78
|
+
|
|
79
|
+
def capture(**kwargs):
|
|
80
|
+
captured.update(kwargs)
|
|
81
|
+
return render(**kwargs)
|
|
82
|
+
|
|
83
|
+
monkeypatch.setattr(skillrun, "_render_log", capture)
|
|
84
|
+
_open_run(tmp_path)
|
|
85
|
+
captured["task"] = "Keep these literal lines:\n- rule: task requirement\n- log_format: `other`"
|
|
86
|
+
compact = render(**captured)
|
|
87
|
+
verbose = render(**{**captured, "compact": False})
|
|
88
|
+
assert captured["task"] in compact
|
|
89
|
+
assert len(compact.encode("utf-8")) < len(verbose.encode("utf-8")) * 0.8
|
|
90
|
+
|
|
91
|
+
# Every non-boilerplate line survives in the same order, including reports.
|
|
92
|
+
def data_lines(text):
|
|
93
|
+
return [line for line in text.splitlines() if line and not line.startswith((
|
|
94
|
+
"- rule:", "- log_format:", "- operating_contract_xid:",
|
|
95
|
+
))]
|
|
96
|
+
|
|
97
|
+
assert data_lines(compact) == data_lines(verbose)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_dashboard_payload_is_identical_for_compact_and_verbose_runs(monkeypatch, tmp_path):
|
|
101
|
+
import json
|
|
102
|
+
import os
|
|
103
|
+
from datetime import datetime, timezone
|
|
104
|
+
from itertools import count
|
|
105
|
+
from uuid import UUID
|
|
106
|
+
|
|
107
|
+
from xrefkit import dashboard, skillrun
|
|
108
|
+
|
|
109
|
+
render = skillrun._render_log
|
|
110
|
+
captured = {}
|
|
111
|
+
|
|
112
|
+
def capture(**kwargs):
|
|
113
|
+
captured.update(kwargs)
|
|
114
|
+
return render(**kwargs)
|
|
115
|
+
|
|
116
|
+
monkeypatch.setattr(skillrun, "_render_log", capture)
|
|
117
|
+
_, log = _open_run(tmp_path)
|
|
118
|
+
provenance = {"capability": {"origin": "explicit_input", "selected_value": "repository inspection"}}
|
|
119
|
+
|
|
120
|
+
class FixedDatetime(datetime):
|
|
121
|
+
@classmethod
|
|
122
|
+
def now(cls, tz=None):
|
|
123
|
+
fixed = cls(2026, 10, 25, 12, 0, tzinfo=timezone.utc)
|
|
124
|
+
return fixed.astimezone(tz) if tz else fixed.replace(tzinfo=None)
|
|
125
|
+
|
|
126
|
+
monkeypatch.setattr(skillrun, "datetime", FixedDatetime)
|
|
127
|
+
monkeypatch.setattr(dashboard, "datetime", FixedDatetime)
|
|
128
|
+
snapshots = []
|
|
129
|
+
for compact in (False, True):
|
|
130
|
+
event_ids = count(1)
|
|
131
|
+
monkeypatch.setattr(skillrun.uuid, "uuid4", lambda: UUID(int=next(event_ids)))
|
|
132
|
+
identity = {**captured["definition_identity"], "runtime_provenance": json.dumps(
|
|
133
|
+
provenance, sort_keys=True, separators=(",", ":") if compact else None,
|
|
134
|
+
)}
|
|
135
|
+
log.write_text(render(**{**captured, "definition_identity": identity, "compact": compact}), encoding="utf-8")
|
|
136
|
+
|
|
137
|
+
def snapshot():
|
|
138
|
+
# Compare the whole public payload, with no fields removed. The same
|
|
139
|
+
# file path and frozen clocks make file/observation timestamps equal.
|
|
140
|
+
os.utime(log, (1792929600, 1792929600))
|
|
141
|
+
return dashboard.build_payload(tmp_path, log.parent)
|
|
142
|
+
|
|
143
|
+
def update(*args):
|
|
144
|
+
code, output = command("skill", *args, "--log", str(log))
|
|
145
|
+
assert code == 0, output
|
|
146
|
+
|
|
147
|
+
initial = snapshot()
|
|
148
|
+
assert "token_usage" in {item["code"] for item in initial["runs"][0]["missing_information"]}
|
|
149
|
+
update("workitem", "--item", "WI-1", "--text", "Inspect target",
|
|
150
|
+
"--completion-criterion", "report covers target", "--status", "done", "--role", "definition_sample:executor")
|
|
151
|
+
for artifact_id, kind, target in (("OUT-1", "output", "report.md"), ("EVD-1", "evidence", "tests passed")):
|
|
152
|
+
update("artifact", "--artifact", artifact_id, "--kind", kind, "--target", target,
|
|
153
|
+
"--item", "WI-1", "--status", "done", "--role", "definition_sample:executor")
|
|
154
|
+
update("concern", "--concern", "RISK-1", "--kind", "risk", "--status", "resolved",
|
|
155
|
+
"--text", "Compatibility checked", "--target", "tests passed", "--role", "definition_sample:executor")
|
|
156
|
+
update("correlate", "--run-id", captured["run_id"], "--mcp-session-id", "mcp-1", "--repository-fingerprint", "repo-1")
|
|
157
|
+
update("routing", "--selected-skill", "definition_sample", "--candidate", "definition_sample", "--reason", "best match")
|
|
158
|
+
update("knowledge", "--action", "search", "--query", "service map", "--status", "hit", "--xid", "SERVICE123456")
|
|
159
|
+
update("knowledge", "--action", "load", "--xid", "SERVICE123456", "--content-hash", "hash-1")
|
|
160
|
+
update("knowledge", "--action", "apply", "--xid", "SERVICE123456", "--content-hash", "hash-1", "--target", "OUT-1")
|
|
161
|
+
update("feedback", "--kind", "human", "--status", "accepted", "--note", "accepted")
|
|
162
|
+
update("feedback", "--kind", "outcome", "--status", "successful", "--note", "successful")
|
|
163
|
+
update("tokens", "--input", "120", "--output", "30")
|
|
164
|
+
populated = snapshot()
|
|
165
|
+
run = populated["runs"][0]
|
|
166
|
+
assert run["missing_information"] == []
|
|
167
|
+
assert run["counts"]["work_items"] == 1
|
|
168
|
+
assert run["counts"]["artifacts"] == 2
|
|
169
|
+
assert run["counts"]["risks"] == 1
|
|
170
|
+
assert run["loaded_xids"] == run["used_xids"] == ["SERVICE123456"]
|
|
171
|
+
assert run["definition_format"] == "skill_definition_v1"
|
|
172
|
+
assert run["definition_xid"] == "ABCDEF123456"
|
|
173
|
+
assert run["definition_sha256"] == captured["definition_identity"]["sha256"]
|
|
174
|
+
assert run["capability"] == "repository inspection"
|
|
175
|
+
assert {event["event"] for event in run["observation_events"]} >= {
|
|
176
|
+
"skill.routed", "knowledge.search", "knowledge.loaded", "knowledge.applied", "human.feedback", "outcome.feedback",
|
|
177
|
+
}
|
|
178
|
+
for phase in ("startup", "planning", "execution"):
|
|
179
|
+
update("phase", "--phase", phase, "--status", "done", "--role", "definition_sample:executor")
|
|
180
|
+
update("verify")
|
|
181
|
+
update("phase", "--phase", "handoff", "--status", "done", "--role", "definition_sample:handoff_owner")
|
|
182
|
+
update("close")
|
|
183
|
+
closed = snapshot()
|
|
184
|
+
assert closed["runs"][0]["status"] == "closed"
|
|
185
|
+
text = log.read_text(encoding="utf-8")
|
|
186
|
+
assert json.loads(skillrun._log_field(text, "definition_runtime_provenance")) == provenance
|
|
187
|
+
assert skillrun._parse_token_usage(text) == {"status": "recorded", "input": "120", "output": "30", "total": "150"}
|
|
188
|
+
snapshots.append((initial, populated, closed))
|
|
189
|
+
|
|
190
|
+
assert snapshots[0] == snapshots[1]
|
|
@@ -3069,6 +3069,14 @@ def _reporting_protocol() -> dict[str, object]:
|
|
|
3069
3069
|
"when relevant, distinguish what evidence establishes from remaining human judgment and state the condition requiring reconsideration; keep supporting evidence reachable",
|
|
3070
3070
|
"a reader perspective must not imply unverified areas are safe to ignore, prior evaluations still apply without checking their conditions, or a plausible explanation proves correctness or understanding",
|
|
3071
3071
|
"reading guidance adds no approval gate or evaluation criterion; preserve unknowns instead of inventing reader purpose, authority, or a decision framework",
|
|
3072
|
+
"report a blocking circular decision or work dependency at identification and verified resolution in the task format; do not repeat unchanged alerts or use an always-visible Attention Pet, new Pet, or monitoring service",
|
|
3073
|
+
"show the closed dependency path, grounding each edge in original utterances or instructions with reachable references or short quotations; distinguish confirmed from inferred edges and label a cycle with an inferred edge as suspected",
|
|
3074
|
+
"identify the decisions or work stopped by the cycle and candidates to break it, naming the edge each candidate would remove or independently satisfy and any required decision or authority; a candidate is not an adopted premise",
|
|
3075
|
+
"distinguish blocking cycles from ambiguity, contradiction, repetition, and normal iterative improvement with an executable next step; do not invent missing edges",
|
|
3076
|
+
"after a premise or prerequisite changes, recheck the affected path against current instructions; fixing a value alone does not establish resolution",
|
|
3077
|
+
"report resolution only when the checked cycle is actually broken: name the removed or independently satisfied edge and the decision or work now able to proceed; preserve other open cycles and unknowns",
|
|
3078
|
+
"when resolution is conditional, say resolved under this assumption, name the assumption and the condition requiring rechecking; reuse the finding or task reference when available",
|
|
3079
|
+
"dependency evidence reconstructs available conversation and task records; do not claim access to the model's actual internal reference history",
|
|
3072
3080
|
"preserve evidence and open items",
|
|
3073
3081
|
"keep workflow status separate from domain gate verdict",
|
|
3074
3082
|
"do not use done to hide unresolved unknowns, risks, or handoff conditions",
|
|
@@ -519,6 +519,11 @@ def _start_decision_trace_checkpoint(
|
|
|
519
519
|
return checkpoint, None
|
|
520
520
|
|
|
521
521
|
|
|
522
|
+
def _is_compact_log(text: str) -> bool:
|
|
523
|
+
# Only the generated header selects formatting; task and note text cannot.
|
|
524
|
+
return text.startswith("# Skill Run Log\n\n- log_format: `compact_v1`\n")
|
|
525
|
+
|
|
526
|
+
|
|
522
527
|
def _render_log(
|
|
523
528
|
*,
|
|
524
529
|
run_id: str,
|
|
@@ -548,7 +553,15 @@ def _render_log(
|
|
|
548
553
|
decision_trace_checkpoint: dict[str, object] | None = None,
|
|
549
554
|
definition_identity: dict[str, str] | None = None,
|
|
550
555
|
runtime_binding_source: str = "legacy_meta_compatibility",
|
|
556
|
+
compact: bool = False,
|
|
551
557
|
) -> str:
|
|
558
|
+
def rule(body: str) -> str:
|
|
559
|
+
return "" if compact else f"- rule: {body}"
|
|
560
|
+
|
|
561
|
+
format_header = (
|
|
562
|
+
"- log_format: `compact_v1`\n- operating_contract_xid: `B7A2C94F0E61`\n"
|
|
563
|
+
if compact else ""
|
|
564
|
+
)
|
|
552
565
|
tier_label = model_tier or "unset"
|
|
553
566
|
quality_policy = "required" if model_tier in QUALITY_REQUIRED_TIERS else "optional"
|
|
554
567
|
contract_lines = "\n".join(f"- {key}: `{value}`" for key, value in os_contract.items())
|
|
@@ -660,7 +673,7 @@ def _render_log(
|
|
|
660
673
|
)
|
|
661
674
|
return f"""# Skill Run Log
|
|
662
675
|
|
|
663
|
-
- run_id: `{run_id}`
|
|
676
|
+
{format_header}- run_id: `{run_id}`
|
|
664
677
|
{flow_lines}
|
|
665
678
|
- mcp_session_id: `-`
|
|
666
679
|
- repository_fingerprint: `-`
|
|
@@ -678,7 +691,7 @@ def _render_log(
|
|
|
678
691
|
## Skill Load Gate
|
|
679
692
|
|
|
680
693
|
- status: `opened_by_xrefkit_skill_run`
|
|
681
|
-
|
|
694
|
+
{rule('do not open or execute the Skill procedure until this runtime envelope exists')}
|
|
682
695
|
|
|
683
696
|
## Runtime Role Assignment
|
|
684
697
|
|
|
@@ -703,7 +716,7 @@ def _render_log(
|
|
|
703
716
|
|
|
704
717
|
- workflow_protocol: `{workflow_protocol}`
|
|
705
718
|
- checker: `protocol-owned deterministic workflow-progression verification via xrefkit skill verify`
|
|
706
|
-
|
|
719
|
+
{rule('checker responsibility is assigned by the runtime workflow protocol, not repeated in Skill meta')}
|
|
707
720
|
|
|
708
721
|
## OS Contract
|
|
709
722
|
|
|
@@ -719,17 +732,17 @@ def _render_log(
|
|
|
719
732
|
- responsibility: `{runtime_responsibility}`
|
|
720
733
|
- execution_mode: `{execution_mode}`
|
|
721
734
|
- instruction_basis: `run.task`
|
|
722
|
-
|
|
735
|
+
{rule('derive and persist the runtime binding from the current instruction and work-item state; model_requirements remains a separate model-eligibility input')}
|
|
723
736
|
{legacy_runtime_binding_lines}
|
|
724
737
|
|
|
725
738
|
## Startup Inputs
|
|
726
739
|
|
|
727
|
-
|
|
740
|
+
{rule('when work starts from a prior handoff, the receiving startup must name the handoff source log and verify that its closure gate already passed')}
|
|
728
741
|
{handoff_source_lines}
|
|
729
742
|
|
|
730
743
|
## Domain Knowledge Inputs
|
|
731
744
|
|
|
732
|
-
|
|
745
|
+
{rule('available and selected brownfield domain knowledge is recorded by XID only; load full bodies through XID resolution, not local paths')}
|
|
733
746
|
- requirements:
|
|
734
747
|
{requirement_lines}
|
|
735
748
|
|
|
@@ -743,13 +756,13 @@ def _render_log(
|
|
|
743
756
|
|
|
744
757
|
### Used Knowledge Refs
|
|
745
758
|
|
|
746
|
-
|
|
759
|
+
{rule('record actually consulted domain knowledge XIDs as runtime artifacts or evidence before handoff')}
|
|
747
760
|
- none recorded yet
|
|
748
761
|
|
|
749
762
|
## MCP Correlation
|
|
750
763
|
|
|
751
764
|
- status: `pending`
|
|
752
|
-
|
|
765
|
+
{rule('bind this Skill Run to one MCP session with `xrefkit skill correlate` after `bind_skill_run` returns')}
|
|
753
766
|
|
|
754
767
|
## Skill Routing Trace
|
|
755
768
|
|
|
@@ -759,32 +772,32 @@ def _render_log(
|
|
|
759
772
|
## Knowledge Search Trace
|
|
760
773
|
|
|
761
774
|
- status: `pending`
|
|
762
|
-
|
|
775
|
+
{rule('record search queries, hits, misses, and fallback decisions with `xrefkit skill knowledge --action search`')}
|
|
763
776
|
|
|
764
777
|
## Loaded Knowledge Inputs
|
|
765
778
|
|
|
766
779
|
- status: `pending`
|
|
767
|
-
|
|
780
|
+
{rule('record each XID body actually loaded into model context with `xrefkit skill knowledge --action load`')}
|
|
768
781
|
|
|
769
782
|
## Knowledge Application Trace
|
|
770
783
|
|
|
771
784
|
- status: `pending`
|
|
772
|
-
|
|
785
|
+
{rule('link each applied XID to a judgment or artifact with `xrefkit skill knowledge --action apply`')}
|
|
773
786
|
|
|
774
787
|
## Human Feedback
|
|
775
788
|
|
|
776
789
|
- status: `pending`
|
|
777
|
-
|
|
790
|
+
{rule('record human acceptance, correction, or rejection with `xrefkit skill feedback --kind human`')}
|
|
778
791
|
|
|
779
792
|
## Human Evaluation
|
|
780
793
|
|
|
781
794
|
- status: `pending`
|
|
782
|
-
|
|
795
|
+
{rule('optional run-boundary evaluation; control returns to the human without waiting, and a subsequent request may record a human-confirmed relationship with `xrefkit skill evaluate`')}
|
|
783
796
|
|
|
784
797
|
## Outcome Feedback
|
|
785
798
|
|
|
786
799
|
- status: `pending`
|
|
787
|
-
|
|
800
|
+
{rule('record downstream outcome evidence with `xrefkit skill feedback --kind outcome`')}
|
|
788
801
|
|
|
789
802
|
## Worklist
|
|
790
803
|
|
|
@@ -823,12 +836,12 @@ The workflow protocol worklist has not started.
|
|
|
823
836
|
## Concrete Work Items
|
|
824
837
|
|
|
825
838
|
- status: `pending`
|
|
826
|
-
|
|
839
|
+
{rule('task-specific work items must be added with `xrefkit skill workitem` and closed as `done` or `escalated`')}
|
|
827
840
|
|
|
828
841
|
## Runtime Artifacts
|
|
829
842
|
|
|
830
843
|
- status: `pending`
|
|
831
|
-
|
|
844
|
+
{rule('outputs, evidence, checks, judgments, sources, and handoff links must be added with `xrefkit skill artifact`')}
|
|
832
845
|
|
|
833
846
|
## Execution Role
|
|
834
847
|
|
|
@@ -845,7 +858,7 @@ The workflow protocol worklist has not started.
|
|
|
845
858
|
- status: `pending`
|
|
846
859
|
- model_tier: `{tier_label}`
|
|
847
860
|
- policy: `{quality_policy}`
|
|
848
|
-
|
|
861
|
+
{rule('declare acceptance check items as `check`-kind artifacts at planning; an independent quality reviewer sets each to `done` (pass) or `blocked` (fail) with `xrefkit skill artifact`; domain reviews run as separate review Skills orchestrated by the main session and linked here. Required when model_tier is `standard` or `heavy`; optional otherwise')}
|
|
849
862
|
|
|
850
863
|
### Report
|
|
851
864
|
|
|
@@ -877,17 +890,17 @@ No quality checklist items have been recorded yet.
|
|
|
877
890
|
## Unknowns And Risks
|
|
878
891
|
|
|
879
892
|
- status: `pending`
|
|
880
|
-
|
|
893
|
+
{rule('unknowns, missing evidence, risks, and unsupported assumptions must remain explicit and must be resolved, escalated, or linked before closure')}
|
|
881
894
|
|
|
882
895
|
## Closure Gate
|
|
883
896
|
|
|
884
897
|
- status: `pending`
|
|
885
|
-
|
|
898
|
+
{rule('close only after execution, check, log, unknown/risk, and handoff rows are complete or explicitly escalated')}
|
|
886
899
|
|
|
887
900
|
## Handoff
|
|
888
901
|
|
|
889
902
|
- status: `pending`
|
|
890
|
-
|
|
903
|
+
{rule('record outputs, unresolved items, next owner, and human decision points')}
|
|
891
904
|
|
|
892
905
|
## Token Usage
|
|
893
906
|
|
|
@@ -895,7 +908,7 @@ No quality checklist items have been recorded yet.
|
|
|
895
908
|
- input: `-`
|
|
896
909
|
- output: `-`
|
|
897
910
|
- total: `-`
|
|
898
|
-
|
|
911
|
+
{rule('record tokens consumed by this skill run with `xrefkit skill tokens` (informational; does not gate closure)')}
|
|
899
912
|
"""
|
|
900
913
|
|
|
901
914
|
|
|
@@ -1570,8 +1583,9 @@ def _replace_concrete_work_items_section(text: str, items: list[dict[str, str]])
|
|
|
1570
1583
|
"## Concrete Work Items",
|
|
1571
1584
|
"",
|
|
1572
1585
|
f"- status: `{status}`",
|
|
1573
|
-
"- rule: each work item requires a completion criterion; use unknown, blocked, or escalated with a reason when the criterion cannot yet be defined",
|
|
1574
1586
|
]
|
|
1587
|
+
if not _is_compact_log(text):
|
|
1588
|
+
lines.append("- rule: each work item requires a completion criterion; use unknown, blocked, or escalated with a reason when the criterion cannot yet be defined")
|
|
1575
1589
|
lines.extend(_render_workitem_line(**item) for item in items)
|
|
1576
1590
|
new_body = "\n".join(lines) + "\n"
|
|
1577
1591
|
return text[:start] + new_body + text[end:]
|
|
@@ -1710,8 +1724,9 @@ def _replace_runtime_artifacts_section(text: str, artifacts: list[dict[str, str]
|
|
|
1710
1724
|
"## Runtime Artifacts",
|
|
1711
1725
|
"",
|
|
1712
1726
|
f"- status: `{status}`",
|
|
1713
|
-
"- rule: outputs, evidence, checks, judgments, sources, and handoff links must be added with `xrefkit skill artifact`",
|
|
1714
1727
|
]
|
|
1728
|
+
if not _is_compact_log(text):
|
|
1729
|
+
lines.append("- rule: outputs, evidence, checks, judgments, sources, and handoff links must be added with `xrefkit skill artifact`")
|
|
1715
1730
|
lines.extend(_render_artifact_line(**artifact) for artifact in artifacts)
|
|
1716
1731
|
new_body = "\n".join(lines) + "\n"
|
|
1717
1732
|
return text[:start] + new_body + text[end:]
|
|
@@ -1844,8 +1859,9 @@ def _replace_unknowns_and_risks_section(text: str, concerns: list[dict[str, str]
|
|
|
1844
1859
|
"## Unknowns And Risks",
|
|
1845
1860
|
"",
|
|
1846
1861
|
f"- status: `{_overall_concern_status(concerns)}`",
|
|
1847
|
-
"- rule: unknowns, missing evidence, risks, and unsupported assumptions must remain explicit and must be resolved, escalated, or linked before closure",
|
|
1848
1862
|
]
|
|
1863
|
+
if not _is_compact_log(text):
|
|
1864
|
+
lines.append("- rule: unknowns, missing evidence, risks, and unsupported assumptions must remain explicit and must be resolved, escalated, or linked before closure")
|
|
1849
1865
|
lines.extend(_render_concern_line(**concern) for concern in concerns)
|
|
1850
1866
|
new_body = "\n".join(lines) + "\n"
|
|
1851
1867
|
return text[:start] + new_body + text[end:]
|
|
@@ -2400,7 +2416,8 @@ def _parse_token_usage(text: str) -> dict[str, str] | None:
|
|
|
2400
2416
|
|
|
2401
2417
|
|
|
2402
2418
|
def _render_token_usage_section(
|
|
2403
|
-
*, input_value: str, output_value: str, total_value: str, note: str | None
|
|
2419
|
+
*, input_value: str, output_value: str, total_value: str, note: str | None,
|
|
2420
|
+
include_rule: bool = True,
|
|
2404
2421
|
) -> str:
|
|
2405
2422
|
lines = [
|
|
2406
2423
|
"## Token Usage",
|
|
@@ -2409,8 +2426,9 @@ def _render_token_usage_section(
|
|
|
2409
2426
|
f"- input: `{input_value}`",
|
|
2410
2427
|
f"- output: `{output_value}`",
|
|
2411
2428
|
f"- total: `{total_value}`",
|
|
2412
|
-
"- rule: record tokens consumed by this skill run with `xrefkit skill tokens` (informational; does not gate closure)",
|
|
2413
2429
|
]
|
|
2430
|
+
if include_rule:
|
|
2431
|
+
lines.append("- rule: record tokens consumed by this skill run with `xrefkit skill tokens` (informational; does not gate closure)")
|
|
2414
2432
|
if note:
|
|
2415
2433
|
lines.append(f"- note: {note}")
|
|
2416
2434
|
return "\n".join(lines) + "\n"
|
|
@@ -2900,6 +2918,7 @@ def update_token_usage(args) -> SkillRunResult:
|
|
|
2900
2918
|
output_value=str(output_tokens) if output_tokens is not None else "-",
|
|
2901
2919
|
total_value=str(total_tokens),
|
|
2902
2920
|
note=note,
|
|
2921
|
+
include_rule=not _is_compact_log(text),
|
|
2903
2922
|
)
|
|
2904
2923
|
text = _replace_token_usage_section(text, new_body)
|
|
2905
2924
|
text = _append_phase_event(
|
|
@@ -2968,7 +2987,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
2968
2987
|
definition_identity.update({
|
|
2969
2988
|
"adoption_path": adoption["path"], "adoption_sha256": adoption["sha256"],
|
|
2970
2989
|
"invocation_path": str(meta_arg or getattr(args, "definition", "")),
|
|
2971
|
-
"runtime_provenance": json.dumps(adapter["runtime"], sort_keys=True),
|
|
2990
|
+
"runtime_provenance": json.dumps(adapter["runtime"], sort_keys=True, separators=(",", ":")),
|
|
2972
2991
|
})
|
|
2973
2992
|
definition_maturity = "unassessed"
|
|
2974
2993
|
if adapter and "current_adoption" in adapter:
|
|
@@ -2977,7 +2996,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
2977
2996
|
return SkillRunResult(ok=False, skill_id=skill_id, skill_doc=str(meta_path), run_log=None,
|
|
2978
2997
|
errors=["explicit governance must match current repository adoption record"])
|
|
2979
2998
|
governance_arg = current["governance_path"]
|
|
2980
|
-
definition_identity["current_adoption_provenance"] = json.dumps(current, sort_keys=True)
|
|
2999
|
+
definition_identity["current_adoption_provenance"] = json.dumps(current, sort_keys=True, separators=(",", ":"))
|
|
2981
3000
|
if governance_arg:
|
|
2982
3001
|
governance_path = (root / governance_arg).resolve()
|
|
2983
3002
|
try:
|
|
@@ -3011,7 +3030,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3011
3030
|
**({"native_source": adapter["adoption"]} if native_adapter
|
|
3012
3031
|
else {"legacy_receipt": adapter["runtime"][key]})}
|
|
3013
3032
|
for key in RUNTIME_FIELDS
|
|
3014
|
-
}, sort_keys=True)
|
|
3033
|
+
}, sort_keys=True, separators=(",", ":"))
|
|
3015
3034
|
if not capability or not tuning or not responsibility or not execution_mode_arg:
|
|
3016
3035
|
return SkillRunResult(ok=False, skill_id=skill_id, skill_doc=str(meta_path), run_log=None,
|
|
3017
3036
|
errors=["definition-backed runs require --capability, --tuning, --responsibility, and --execution-mode"])
|
|
@@ -3021,7 +3040,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3021
3040
|
"role_responsibilities": [f"executor: {responsibility}"]})
|
|
3022
3041
|
if adapter and adapter.get("source_kind") != "native_v1":
|
|
3023
3042
|
parsed.update({key: receipt["value"] for key, receipt in adapter["legacy_runtime_policy"].items()})
|
|
3024
|
-
definition_identity["legacy_policy_provenance"] = json.dumps(adapter["legacy_runtime_policy"], sort_keys=True)
|
|
3043
|
+
definition_identity["legacy_policy_provenance"] = json.dumps(adapter["legacy_runtime_policy"], sort_keys=True, separators=(",", ":"))
|
|
3025
3044
|
else:
|
|
3026
3045
|
parsed = _parse_meta_lines(meta_path.read_text(encoding="utf-8"))
|
|
3027
3046
|
domain_knowledge, domain_knowledge_errors = _prepare_domain_knowledge_context(
|
|
@@ -3226,6 +3245,7 @@ def run_skill(args) -> SkillRunResult:
|
|
|
3226
3245
|
decision_trace_checkpoint=checkpoint,
|
|
3227
3246
|
definition_identity=definition_identity,
|
|
3228
3247
|
runtime_binding_source="instruction_derived" if definition_arg else "legacy_meta_compatibility",
|
|
3248
|
+
compact=True,
|
|
3229
3249
|
)
|
|
3230
3250
|
kickoff = None
|
|
3231
3251
|
if skill_id in {"skill_flow_authoring", "knowledge_ontology_management"}:
|
|
@@ -23,6 +23,7 @@ tests/test_ci_workflow_invariants.py
|
|
|
23
23
|
tests/test_cli.py
|
|
24
24
|
tests/test_code_constraint_definition.py
|
|
25
25
|
tests/test_collect_analyzer_sarif.py
|
|
26
|
+
tests/test_compact_skill_logs.py
|
|
26
27
|
tests/test_constraint_derivation_family_definition.py
|
|
27
28
|
tests/test_constraint_derivation_selected_family.py
|
|
28
29
|
tests/test_contribution_adoption_bytes.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|