xrefkit 0.7.2__tar.gz → 0.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. {xrefkit-0.7.2/xrefkit.egg-info → xrefkit-0.7.4}/PKG-INFO +1 -1
  2. {xrefkit-0.7.2 → xrefkit-0.7.4}/pyproject.toml +1 -1
  3. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_ci_workflow_invariants.py +35 -0
  4. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_cli.py +7 -1
  5. xrefkit-0.7.4/tests/test_compact_skill_logs.py +190 -0
  6. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/__init__.py +1 -1
  7. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/catalog.py +8 -0
  8. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/startup_contract_pack.py +16 -1
  9. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/000_agent_entry.md +15 -0
  10. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skillrun.py +50 -30
  11. {xrefkit-0.7.2 → xrefkit-0.7.4/xrefkit.egg-info}/PKG-INFO +1 -1
  12. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit.egg-info/SOURCES.txt +1 -0
  13. {xrefkit-0.7.2 → xrefkit-0.7.4}/LICENSE +0 -0
  14. {xrefkit-0.7.2 → xrefkit-0.7.4}/README.md +0 -0
  15. {xrefkit-0.7.2 → xrefkit-0.7.4}/setup.cfg +0 -0
  16. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_artifact_selected_family.py +0 -0
  17. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_attention_pet.py +0 -0
  18. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_attention_pet_client_protocol.py +0 -0
  19. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_attention_pet_codex_session.py +0 -0
  20. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_attention_pet_fit.py +0 -0
  21. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_azure_connection.py +0 -0
  22. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_azure_import.py +0 -0
  23. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_azure_recovery.py +0 -0
  24. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_azure_update_candidate.py +0 -0
  25. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_azure_writer.py +0 -0
  26. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_boundary_analysis.py +0 -0
  27. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_brownfield_csharp_structure_definitions.py +0 -0
  28. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_brownfield_file_editing_protocol.py +0 -0
  29. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_business_intake_conversation_definitions.py +0 -0
  30. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_business_intake_definition.py +0 -0
  31. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_calibration_lint.py +0 -0
  32. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_catalog_preparation_definition.py +0 -0
  33. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_check_skill_knowledge_xids.py +0 -0
  34. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_code_constraint_definition.py +0 -0
  35. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_collect_analyzer_sarif.py +0 -0
  36. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_constraint_derivation_family_definition.py +0 -0
  37. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_constraint_derivation_selected_family.py +0 -0
  38. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_contribution_adoption_bytes.py +0 -0
  39. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_contribution_returns.py +0 -0
  40. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_convert_to_xrefkit_skill.py +0 -0
  41. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_cs_scope_probe.py +0 -0
  42. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_csharp_commonality.py +0 -0
  43. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_csharp_naming_profile.py +0 -0
  44. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_ctx.py +0 -0
  45. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_cutover_readiness.py +0 -0
  46. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_dashboard.py +0 -0
  47. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_database_batch_definition_migration.py +0 -0
  48. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_decision_trace.py +0 -0
  49. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_design_business_intake_selected_family.py +0 -0
  50. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_design_planning_definition_migration.py +0 -0
  51. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_dotnet_definition_candidate.py +0 -0
  52. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_editorial_family_definition.py +0 -0
  53. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_editorial_intake_definition.py +0 -0
  54. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_editorial_selected_family.py +0 -0
  55. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_embedded_startup_pack.py +0 -0
  56. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_error_policy_audit.py +0 -0
  57. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_error_policy_locator.py +0 -0
  58. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_execution_binding.py +0 -0
  59. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_existing_skill_definition_batch.py +0 -0
  60. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_final_skilldefinition_batch.py +0 -0
  61. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_flow_selected_family.py +0 -0
  62. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_fm_multiroot.py +0 -0
  63. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_gate.py +0 -0
  64. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_gateway.py +0 -0
  65. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_gateway_mcp.py +0 -0
  66. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_gateway_skill_adapter.py +0 -0
  67. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_gateway_work_items.py +0 -0
  68. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_goal_desired_state.py +0 -0
  69. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_governance_entry.py +0 -0
  70. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_host_precheck.py +0 -0
  71. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_human_evaluation.py +0 -0
  72. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_implementation_flow_definition.py +0 -0
  73. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_implementation_review_selected_family.py +0 -0
  74. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_inbound_uploads.py +0 -0
  75. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_instruction_workflow.py +0 -0
  76. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_knowledge_relations_validator.py +0 -0
  77. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_language_review_definition.py +0 -0
  78. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_legacy_guidance.py +0 -0
  79. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_legacy_migration.py +0 -0
  80. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_legacy_resources.py +0 -0
  81. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_mcp_package_routing.py +0 -0
  82. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_mcp_setup.py +0 -0
  83. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_mcp_subagent_startup.py +0 -0
  84. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_mcp_subagent_startup_integration.py +0 -0
  85. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_ontology_assessment_validator.py +0 -0
  86. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_os_family_definition.py +0 -0
  87. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_os_knowledge_family_definition.py +0 -0
  88. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_os_selected_family.py +0 -0
  89. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_ownership.py +0 -0
  90. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_packmeta.py +0 -0
  91. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_plan_markdown.py +0 -0
  92. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_plan_observation.py +0 -0
  93. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_project_quality_baseline.py +0 -0
  94. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_qa_report_definition.py +0 -0
  95. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_reporting_profiles.py +0 -0
  96. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_reporting_quality.py +0 -0
  97. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_repository_skill_adoption.py +0 -0
  98. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_repository_startup_pack.py +0 -0
  99. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_resource_provider.py +0 -0
  100. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_runtime_contracts.py +0 -0
  101. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_sarif_to_locator.py +0 -0
  102. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_security_definition_migration.py +0 -0
  103. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_site_release_metadata.py +0 -0
  104. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_definition.py +0 -0
  105. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_definition_governance.py +0 -0
  106. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_definition_mcp.py +0 -0
  107. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_definition_runtime.py +0 -0
  108. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_edits.py +0 -0
  109. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_maturity_return.py +0 -0
  110. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_release_compatibility.py +0 -0
  111. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skill_runtime_audit.py +0 -0
  112. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skillmeta.py +0 -0
  113. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_skills_sync.py +0 -0
  114. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_source_analysis_fragments.py +0 -0
  115. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_structure_catalog.py +0 -0
  116. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_subagent_startup.py +0 -0
  117. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_subagent_startup_boundaries.py +0 -0
  118. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_wbs.py +0 -0
  119. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_work_management.py +0 -0
  120. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_work_packages.py +0 -0
  121. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_workflow_family_definition.py +0 -0
  122. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xref.py +0 -0
  123. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xrefkit_instance.py +0 -0
  124. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xrefkit_tools.py +0 -0
  125. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xrefkit_v2_discovery.py +0 -0
  126. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xrefkit_v2_models.py +0 -0
  127. {xrefkit-0.7.2 → xrefkit-0.7.4}/tests/test_xrefkit_v2_pipeline.py +0 -0
  128. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/__main__.py +0 -0
  129. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/__init__.py +0 -0
  130. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/__main__.py +0 -0
  131. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/client.py +0 -0
  132. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/client_protocol.py +0 -0
  133. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/codex_session.py +0 -0
  134. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/evaluator.py +0 -0
  135. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/model.py +0 -0
  136. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/presentation.py +0 -0
  137. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/profiles.py +0 -0
  138. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/scenarios.py +0 -0
  139. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/server.py +0 -0
  140. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/attention_pet/store.py +0 -0
  141. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/azure_connection.py +0 -0
  142. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/azure_import.py +0 -0
  143. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/azure_recovery.py +0 -0
  144. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/azure_update_candidate.py +0 -0
  145. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/azure_writer.py +0 -0
  146. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/boundary_analysis.py +0 -0
  147. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/catalog_cli.py +0 -0
  148. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/cli.py +0 -0
  149. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/contracts.py +0 -0
  150. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/ctx.py +0 -0
  151. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/dashboard.py +0 -0
  152. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/decision_trace.py +0 -0
  153. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/discovery.py +0 -0
  154. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/execution_binding.py +0 -0
  155. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/execution_binding_cli.py +0 -0
  156. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/gate.py +0 -0
  157. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/gateway.py +0 -0
  158. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/goalstate.py +0 -0
  159. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/governance_entry.py +0 -0
  160. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/governance_entry_cli.py +0 -0
  161. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/hashing.py +0 -0
  162. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/host_precheck.py +0 -0
  163. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/import_skill.py +0 -0
  164. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/instance.py +0 -0
  165. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/loaders.py +0 -0
  166. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/__init__.py +0 -0
  167. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/audit.py +0 -0
  168. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/bootstrap.py +0 -0
  169. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/cli.py +0 -0
  170. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/client_cache.py +0 -0
  171. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/client_flow.py +0 -0
  172. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/context_registry.py +0 -0
  173. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/context_token.py +0 -0
  174. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/contracts.py +0 -0
  175. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/contribution_adoption.py +0 -0
  176. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/contribution_returns.py +0 -0
  177. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/dist.py +0 -0
  178. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/gateway.py +0 -0
  179. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/governed_overlays.py +0 -0
  180. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/inbound_uploads.py +0 -0
  181. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/knowledge_edits.py +0 -0
  182. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/legacy_guidance.py +0 -0
  183. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/legacy_migration.py +0 -0
  184. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/legacy_resources.py +0 -0
  185. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/ownership.py +0 -0
  186. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/repository.py +0 -0
  187. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/schemas.py +0 -0
  188. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/server.py +0 -0
  189. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/setup.py +0 -0
  190. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/skill_edits.py +0 -0
  191. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/skill_maturity.py +0 -0
  192. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/subagent_startup.py +0 -0
  193. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp/update_gate_intake.py +0 -0
  194. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/mcp_tools.py +0 -0
  195. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/__init__.py +0 -0
  196. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/common.py +0 -0
  197. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/effective_bundle.py +0 -0
  198. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/human_evaluation.py +0 -0
  199. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/local_manifest.py +0 -0
  200. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/package_manifest.py +0 -0
  201. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/run_log.py +0 -0
  202. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/server_config.py +0 -0
  203. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/models/skill_definition.py +0 -0
  204. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/operations_cli.py +0 -0
  205. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/ownership.py +0 -0
  206. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/packmeta.py +0 -0
  207. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/plan_markdown.py +0 -0
  208. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/plan_observation.py +0 -0
  209. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/registry.py +0 -0
  210. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/reporting.py +0 -0
  211. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/reporting_profiles.py +0 -0
  212. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/repository_skills.py +0 -0
  213. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resolver.py +0 -0
  214. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resource_provider.py +0 -0
  215. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/attention_pet/client-state.schema.json +0 -0
  216. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/attention_pet/pet.css +0 -0
  217. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/attention_pet/pet.html +0 -0
  218. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/attention_pet/pet.js +0 -0
  219. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/contracts.json +0 -0
  220. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/current.json +0 -0
  221. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/generations/7a682a5272907354/contracts.json +0 -0
  222. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/generations/7a682a5272907354/model_body.md +0 -0
  223. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/generations/9929294385ccb7b0/contracts.json +0 -0
  224. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/generations/9929294385ccb7b0/model_body.md +0 -0
  225. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/model_body.md +0 -0
  226. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/011_startup_xref_routing.md +0 -0
  227. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/015_shared_memory_operations.md +0 -0
  228. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/016_uncertainty_protocol.md +0 -0
  229. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/017_base_and_xref_layering.md +0 -0
  230. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/053_context_direction_security_guard.md +0 -0
  231. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/base/startup_sources/yomiyasu_LICENSE.txt +0 -0
  232. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/docs/guides/062_legacy_flow_skill_migration_guide.md +0 -0
  233. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/knowledge/operations/130_legacy_flow_skill_migration_rules.md +0 -0
  234. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/knowledge/organization/160_context_direction_guard_rules.md +0 -0
  235. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/SKILL.v1.md +0 -0
  236. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/skills/os/legacy_flow_skill_migration/references/legacy_flow_skill_migration_template.md +0 -0
  237. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/skills/repository_adoption.json +0 -0
  238. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/resources/migration/tools/migrate_legacy_flow_skill.py +0 -0
  239. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/runlog.py +0 -0
  240. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skill_definition.py +0 -0
  241. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skill_definition_catalog.py +0 -0
  242. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skill_definition_governance.py +0 -0
  243. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skillmeta.py +0 -0
  244. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/skills_sync.py +0 -0
  245. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/structure_catalog.py +0 -0
  246. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/subagent_startup.py +0 -0
  247. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/tools/__init__.py +0 -0
  248. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/tools/__main__.py +0 -0
  249. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/v2_cli.py +0 -0
  250. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/wbs.py +0 -0
  251. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/work_management.py +0 -0
  252. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/work_management_view.py +0 -0
  253. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/workspace.py +0 -0
  254. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit/xref.py +0 -0
  255. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit.egg-info/dependency_links.txt +0 -0
  256. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit.egg-info/entry_points.txt +0 -0
  257. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit.egg-info/requires.txt +0 -0
  258. {xrefkit-0.7.2 → xrefkit-0.7.4}/xrefkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xrefkit
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: Portable XID, Skill, Knowledge, workflow, and MCP runtime for XRefKit
5
5
  Author: synthaicode
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "xrefkit"
7
- version = "0.7.2"
7
+ version = "0.7.4"
8
8
  description = "Portable XID, Skill, Knowledge, workflow, and MCP runtime for XRefKit"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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("- rule: available and selected brownfield domain knowledge is recorded by XID only", text)
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]
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.7.2"
5
+ __version__ = "0.7.4"
@@ -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",
@@ -29,7 +29,7 @@ EMBEDDED_STARTUP_SOURCE_PATHS = {
29
29
  # reports the pack as stale when they diverge, so a hand-maintained copy can
30
30
  # no longer drift silently.
31
31
  EMBEDDED_BASED_ON_HASHES = {
32
- "0B5C58B5E5B2": "e7e87d6cafcd6dad3819c3186d42cb3985be9160ccb6b841e1b5b6ff19273a72",
32
+ "0B5C58B5E5B2": "67cfd78c24b8a7d0ff4a5e86a055b06bd020cc8920ebe25bf54a2087a83686be",
33
33
  "5A1C8E4D2F90": "b4cc94e25ff8373d13bbe23beb9ad418fa9745d3e99506bcc8015c98a1c14b0a",
34
34
  "6C0B62D6366A": "c4de2227516494e4112045a7b5dbf2a4c14285c1520c1f82a5013e22df1ecc5e",
35
35
  "8A666C1FD121": "d03931f9892b6af13cd2b0fa7bc2112e06ed5a7f04bea6b9bd530594b516c4d0",
@@ -93,6 +93,16 @@ artifact. Review the draft before sending; no named invocation is required.
93
93
  changes concretely; do not describe existing behavior as a newly completed change.
94
94
  Preserve the source's polite or plain style unless a change is requested.
95
95
  Do not vary endings merely for variety or strengthen advice into obligation.
96
+ - Before shortening an explanation, identify its main point and develop a
97
+ concrete explanation for the reader. Then remove repetition while retaining
98
+ actors, actions, reasons, and applicable conditions. Keep conditions beside
99
+ the statements they qualify. If the length limit would obscure meaning,
100
+ narrow the topic or revise the structure.
101
+ - Prefer actionable affirmative instructions. Retain negation when it carries
102
+ a prohibition, exception, limitation, or necessary comparison.
103
+ - Read the shortened explanation on its own. Restore missing context or
104
+ rebuild the explanation when it remains unclear; show the finished text
105
+ without the intermediate draft unless requested.
96
106
  - Make subjects, predicates, objects, modifiers, pronouns, conditions, and
97
107
  parallel clauses correspond clearly. Supply omitted words only when supported
98
108
  by the source or conversation; do not resolve material ambiguity by guessing.
@@ -131,6 +141,11 @@ Source: nanaism/yomiyasu v2.1.3, commit
131
141
  Copyright (c) 2026 nanaism. Repository source snapshot and license:
132
142
  `sources/web/yomiyasu/SKILL.md` and `sources/web/yomiyasu/LICENSE`.
133
143
 
144
+ Additional explanation-first guidance: Kazuki Ota,
145
+ [Explain Before Shorten](https://zenn.dev/microsoft/articles/explain-before-shorten),
146
+ consulted 2026-10-31. The guidance above is a concise adaptation of its writing
147
+ approach, not an installation of the article's Skill or invocation rules.
148
+
134
149
  ## Protocol boundary and runtime routing
135
150
 
136
151
  The live get_startup_context response returns prompt_flow_protocol,
@@ -62,6 +62,16 @@ artifact. Review the draft before sending; no named invocation is required.
62
62
  changes concretely; do not describe existing behavior as a newly completed change.
63
63
  Preserve the source's polite or plain style unless a change is requested.
64
64
  Do not vary endings merely for variety or strengthen advice into obligation.
65
+ - Before shortening an explanation, identify its main point and develop a
66
+ concrete explanation for the reader. Then remove repetition while retaining
67
+ actors, actions, reasons, and applicable conditions. Keep conditions beside
68
+ the statements they qualify. If the length limit would obscure meaning,
69
+ narrow the topic or revise the structure.
70
+ - Prefer actionable affirmative instructions. Retain negation when it carries
71
+ a prohibition, exception, limitation, or necessary comparison.
72
+ - Read the shortened explanation on its own. Restore missing context or
73
+ rebuild the explanation when it remains unclear; show the finished text
74
+ without the intermediate draft unless requested.
65
75
  - Make subjects, predicates, objects, modifiers, pronouns, conditions, and
66
76
  parallel clauses correspond clearly. Supply omitted words only when supported
67
77
  by the source or conversation; do not resolve material ambiguity by guessing.
@@ -100,6 +110,11 @@ Source: nanaism/yomiyasu v2.1.3, commit
100
110
  Copyright (c) 2026 nanaism. Repository source snapshot and license:
101
111
  `sources/web/yomiyasu/SKILL.md` and `sources/web/yomiyasu/LICENSE`.
102
112
 
113
+ Additional explanation-first guidance: Kazuki Ota,
114
+ [Explain Before Shorten](https://zenn.dev/microsoft/articles/explain-before-shorten),
115
+ consulted 2026-10-31. The guidance above is a concise adaptation of its writing
116
+ approach, not an installation of the article's Skill or invocation rules.
117
+
103
118
  ## How to reference (fixed procedure)
104
119
 
105
120
  1. Read skill routing entry: `skills/_index.md`
@@ -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
- - rule: do not open or execute the Skill procedure until this runtime envelope exists
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
- - rule: checker responsibility is assigned by the runtime workflow protocol, not repeated in Skill meta
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
- - rule: derive and persist the runtime binding from the current instruction and work-item state; model_requirements remains a separate model-eligibility input
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
- - 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
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
- - rule: available and selected brownfield domain knowledge is recorded by XID only; load full bodies through XID resolution, not local paths
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
- - rule: record actually consulted domain knowledge XIDs as runtime artifacts or evidence before handoff
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
- - rule: bind this Skill Run to one MCP session with `xrefkit skill correlate` after `bind_skill_run` returns
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
- - rule: record search queries, hits, misses, and fallback decisions with `xrefkit skill knowledge --action search`
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
- - rule: record each XID body actually loaded into model context with `xrefkit skill knowledge --action load`
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
- - rule: link each applied XID to a judgment or artifact with `xrefkit skill knowledge --action apply`
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
- - rule: record human acceptance, correction, or rejection with `xrefkit skill feedback --kind human`
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
- - 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`
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
- - rule: record downstream outcome evidence with `xrefkit skill feedback --kind outcome`
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
- - rule: task-specific work items must be added with `xrefkit skill workitem` and closed as `done` or `escalated`
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
- - rule: outputs, evidence, checks, judgments, sources, and handoff links must be added with `xrefkit skill artifact`
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
- - 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
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
- - rule: unknowns, missing evidence, risks, and unsupported assumptions must remain explicit and must be resolved, escalated, or linked before closure
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
- - rule: close only after execution, check, log, unknown/risk, and handoff rows are complete or explicitly escalated
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
- - rule: record outputs, unresolved items, next owner, and human decision points
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
- - rule: record tokens consumed by this skill run with `xrefkit skill tokens` (informational; does not gate closure)
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"}: