agent-tune-kit 2.4.0__tar.gz → 2.4.2__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 (190) hide show
  1. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/.codex-plugin/plugin.json +1 -1
  2. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/PKG-INFO +10 -6
  3. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/README.en.md +9 -5
  4. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/README.md +9 -5
  5. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/__init__.py +1 -1
  6. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/store.py +33 -7
  7. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/app.js +27 -18
  8. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/page.html +1 -2
  9. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/styles.css +13 -2
  10. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/traces/app.js +9 -4
  11. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/trace.py +3 -1
  12. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/shared-versioning-and-confirmation.md +3 -1
  13. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-dashboard-design.md +6 -6
  14. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-swimlane-design.md +7 -2
  15. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-tuning.md +45 -13
  16. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/pyproject.toml +1 -1
  17. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/check-release.py +8 -8
  18. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/publish-pypi.sh +1 -1
  19. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/publish-release.py +1 -1
  20. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/release-version.py +10 -8
  21. agent_tune_kit-2.4.2/scripts/release-version.sh +7 -0
  22. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/validate_skill_pack.py +1 -1
  23. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-capture/SKILL.md +1 -1
  24. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-detect/SKILL.md +16 -15
  25. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-diagnose/SKILL.md +12 -10
  26. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-init/SKILL.md +7 -7
  27. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-optimize/SKILL.md +18 -11
  28. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-trace-verify/SKILL.md +2 -2
  29. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-visualize-trace/SKILL.md +5 -1
  30. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_install_plugin.py +1 -1
  31. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_release_scripts.py +17 -19
  32. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_scroll_layout.py +29 -0
  33. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_store.py +62 -0
  34. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_visualize_trace.py +30 -0
  35. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-dashboard.cjs +11 -1
  36. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-event-layout.cjs +18 -6
  37. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-fragments.cjs +39 -4
  38. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-scroll-layout.cjs +24 -0
  39. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-stage-cards.cjs +19 -1
  40. agent_tune_kit-2.4.0/scripts/release-version.sh +0 -6
  41. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/.gitignore +0 -0
  42. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/__init__.py +0 -0
  43. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/__main__.py +0 -0
  44. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/dataset.py +0 -0
  45. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/evaluation.py +0 -0
  46. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/main.py +0 -0
  47. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/output.py +0 -0
  48. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/results.py +0 -0
  49. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/trace.py +0 -0
  50. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/cli/visualize.py +0 -0
  51. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/datasets/__init__.py +0 -0
  52. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/datasets/prepare.py +0 -0
  53. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/datasets/truth.py +0 -0
  54. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/datasets/updates.py +0 -0
  55. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/datasets/validation.py +0 -0
  56. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/errors.py +0 -0
  57. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/__init__.py +0 -0
  58. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/calibration.py +0 -0
  59. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/logs.py +0 -0
  60. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/rules.py +0 -0
  61. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/runner.py +0 -0
  62. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/runtime.py +0 -0
  63. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/execution/tracing.py +0 -0
  64. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/installer.py +0 -0
  65. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/__init__.py +0 -0
  66. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/assessment.py +0 -0
  67. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/evidence.py +0 -0
  68. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/judgments.py +0 -0
  69. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/summary.py +0 -0
  70. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/results/versions.py +0 -0
  71. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/__init__.py +0 -0
  72. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/archive.py +0 -0
  73. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/capture.py +0 -0
  74. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/categories.py +0 -0
  75. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/langfuse.py +0 -0
  76. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/migrate.py +0 -0
  77. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/progress.py +0 -0
  78. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/projects.py +0 -0
  79. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/query.py +0 -0
  80. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/records.py +0 -0
  81. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/traces/segments.py +0 -0
  82. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/utils/__init__.py +0 -0
  83. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/utils/csv_io.py +0 -0
  84. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/utils/files.py +0 -0
  85. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/__init__.py +0 -0
  86. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/dataset/app.js +0 -0
  87. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/dataset/page.html +0 -0
  88. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/dataset/styles.css +0 -0
  89. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/dataset/vendor/echarts.min.js +0 -0
  90. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/failures/app.js +0 -0
  91. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/failures/page.html +0 -0
  92. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/failures/styles.css +0 -0
  93. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/shared/base.css +0 -0
  94. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/lanes.js +0 -0
  95. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/vendor/markdown-it.LICENSE +0 -0
  96. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/trace/vendor/markdown-it.min.js +0 -0
  97. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/traces/page.html +0 -0
  98. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/assets/traces/styles.css +0 -0
  99. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/dataset.py +0 -0
  100. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/failures.py +0 -0
  101. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/fields.py +0 -0
  102. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/history.py +0 -0
  103. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/render.py +0 -0
  104. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/timeline.py +0 -0
  105. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/visualize/traces.py +0 -0
  106. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/agent_tune_kit/workspace.py +0 -0
  107. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/agent_tune_kit_evaluation.png +0 -0
  108. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/agent_tune_kit_trace.png +0 -0
  109. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/arch-en.png +0 -0
  110. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/arch.png +0 -0
  111. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/architecture.en.svg +0 -0
  112. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/assets/architecture.svg +0 -0
  113. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/ato-atk-project-boundary-recommendation-2026-11-05.md +0 -0
  114. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/cli-skill-modularization-plan.md +0 -0
  115. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/codex_agent_tuning_prd.md +0 -0
  116. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/execution-evidence-and-tracing-plan.md +0 -0
  117. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/ground-truth-and-grading-assessment-2026-10-25.md +0 -0
  118. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/local-context.md +0 -0
  119. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/skill-template-pack-usage.md +0 -0
  120. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/surginame-atk-capability-review-2026-10-27.md +0 -0
  121. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-change-verification-readability-diagnosis.md +0 -0
  122. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-project-attribution-design.md +0 -0
  123. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/trace-tuning-validation.md +0 -0
  124. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/docs/truth-and-assessment.md +0 -0
  125. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/dev-refresh-install.sh +0 -0
  126. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/scripts/install_plugin.py +0 -0
  127. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-dataset/SKILL.md +0 -0
  128. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-dataset/scripts/update_dataset.py +0 -0
  129. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-diagnose/SKILL.md +0 -0
  130. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-eval/SKILL.md +0 -0
  131. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-init/SKILL.md +0 -0
  132. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-optimize/SKILL.md +0 -0
  133. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-report/SKILL.md +0 -0
  134. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-visualize-dataset/SKILL.md +0 -0
  135. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-visualize-dataset/scripts/generate_dataset_browser.py +0 -0
  136. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-visualize-failures/SKILL.md +0 -0
  137. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/skills/atk-visualize-failures/scripts/generate_failure_browser.py +0 -0
  138. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/templates/.atk/runner/eval_runner.py.md +0 -0
  139. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/templates/.atk/runner/failure_rule.py.md +0 -0
  140. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/templates/.atk/runner/import_evidence.py.md +0 -0
  141. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/templates/.gitkeep +0 -0
  142. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/__init__.py +0 -0
  143. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/conftest.py +0 -0
  144. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/fixtures/legacy_eval_runner.py.txt +0 -0
  145. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/fixtures/managed_v1.py.md +0 -0
  146. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_assessment_contract.py +0 -0
  147. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_atk_init_contract.py +0 -0
  148. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_cli_workflow.py +0 -0
  149. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_dataset_updates.py +0 -0
  150. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_diagnosis.py +0 -0
  151. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_evidence_import.py +0 -0
  152. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_evidence_judgments.py +0 -0
  153. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_evidence_packaging.py +0 -0
  154. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_evidence_versions.py +0 -0
  155. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_execution_evidence.py +0 -0
  156. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_execution_outcomes.py +0 -0
  157. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_execution_tracing.py +0 -0
  158. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_generate_dataset_browser.py +0 -0
  159. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_generate_failure_browser.py +0 -0
  160. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_judge_calibration.py +0 -0
  161. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_local_context.py +0 -0
  162. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_plugin_cache.py +0 -0
  163. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_runner_output_columns.py +0 -0
  164. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_runner_template_row_logging.py +0 -0
  165. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_runtime_contracts.py +0 -0
  166. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_snapshot_reads.py +0 -0
  167. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_capture.py +0 -0
  168. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_categories.py +0 -0
  169. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_cli.py +0 -0
  170. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_event_list.py +0 -0
  171. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_langfuse.py +0 -0
  172. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_progress.py +0 -0
  173. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_projects.py +0 -0
  174. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_query.py +0 -0
  175. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_records.py +0 -0
  176. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_trace_segments.py +0 -0
  177. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_truth_browser.py +0 -0
  178. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_truth_cli.py +0 -0
  179. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_truth_contract.py +0 -0
  180. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_truth_runner.py +0 -0
  181. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_v2_progress.py +0 -0
  182. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/test_visualize_traces.py +0 -0
  183. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-controls.cjs +0 -0
  184. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-event-detail.cjs +0 -0
  185. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-event-list.cjs +0 -0
  186. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-event-wheel.cjs +0 -0
  187. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-issue-cards.cjs +0 -0
  188. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-preview-scroll.cjs +0 -0
  189. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-projects.cjs +0 -0
  190. {agent_tune_kit-2.4.0 → agent_tune_kit-2.4.2}/tests/trace-selection-reason.cjs +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-tune-kit",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "description": "Local Codex plugin for batch Agent evaluation and session trace tuning with evidence-backed issues, focused changes, verification and offline review.",
5
5
  "author": {
6
6
  "name": "hustyichi",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agent-tune-kit
3
- Version: 2.4.0
3
+ Version: 2.4.2
4
4
  Summary: Local Codex plugin for iterative Agent tuning with guided Skills, reusable runner templates, versioned results, and static validation.
5
5
  Project-URL: Homepage, https://github.com/hustyichi/agent-tune-kit
6
6
  Project-URL: Repository, https://github.com/hustyichi/agent-tune-kit
@@ -154,16 +154,18 @@ Run `atk trace --help` to check whether your CLI supports trace tuning. If the c
154
154
  - **Langfuse v4**. Use `$atk-trace-init` to record project settings and configure read-only access on first setup. Configuration references credentials by environment-variable name. Then send `$atk-trace-capture Download session <session-id> from <start time> to <end time>`.
155
155
  - **Local files**. Send `$atk-trace-capture Import traces for session <session-id> from <file path>, with source <source>`. You can also provide files with verifiable ties to the session during analysis and let detection import them. Analyze an already archived session directly.
156
156
 
157
- The capture step downloads or imports data. Before saving, decide which content to retain and which fields to redact. ATK adds `.atk/traces/` to the project's `.gitignore`.
157
+ The capture step downloads or imports data. Before saving, decide which content to retain and which fields to redact. ATK checks whether Git ignores `.atk/traces/` and adds a rule to the project's `.gitignore` if needed.
158
+
159
+ `$atk-trace-init` infers and saves the tuning scope from project documents and implementation; later detection, diagnosis, repair and verification use it. No manual configuration is required. You can also say "For this run, focus on this project or component." When you skip initialization, analysis fills in the necessary context and explains any unresolved boundaries.
158
160
 
159
161
  ### 2. Analyze and Review Evidence
160
162
 
161
163
  ```text
162
- $atk-trace-detect Check whether session <session-id> completed its task correctly. List issues, evidence, and what you did not inspect.
164
+ $atk-trace-detect Analyze session <session-id> for issues actionable within this project. List evidence and what you did not inspect.
163
165
  $atk-visualize-trace Open the execution lanes for session <session-id> and jump from issues to the relevant trace segments and evidence fields.
164
166
  ```
165
167
 
166
- Detection retains issues with serious impact, recurrence, direct relevance to your stated focus, or a concrete implementation improvement lead, and explains the retention reason, evidence and inspection scope. Implementation leads include code, configuration, tool contracts, Prompt and Skill; an unresolved cause can proceed to diagnosis. Minor observations with none of these reasons are not saved separately. No retained issues does not prove the session was correct.
168
+ By default, detection retains evidence-backed issues worth pursuing that have a project mechanism, an improvement direction and a minimal verification approach; the root cause may still be uncertain. It explains out-of-scope findings and missing actionability evidence, and still calls attention to serious problems. You can explicitly request a comprehensive quality audit or investigation of a specific symptom without an existing improvement lead. No retained issues does not prove the session was correct.
167
169
 
168
170
  The capture, detect, diagnose, optimize and verify Skills generate or update `.atk/traces/<session_id>/preview.html` at stage end without opening a browser. Use `$atk-visualize-trace` when you want to open it; refresh an already open page after the file changes. Initialization has no session trace and does not generate an empty page.
169
171
 
@@ -176,11 +178,13 @@ Use Trace IDs to locate evidence within the session and open issue details to re
176
178
  ```text
177
179
  $atk-trace-diagnose Investigate session <session-id> and propose repair and verification plans.
178
180
  $atk-trace-diagnose Investigate ISSUE-001 in session <session-id> and propose a repair and verification plan.
179
- $atk-trace-optimize Implement the selected plan for ISSUE-001 in session <session-id>.
181
+ $atk-trace-optimize Prepare a detailed implementation plan for ISSUE-001 in session <session-id>, then implement after confirmation.
180
182
  $atk-trace-verify Verify the candidate for ISSUE-001 in session <session-id> and check relevant behavior that should still work.
181
183
  ```
182
184
 
183
- Without specified issues, diagnosis reviews all available session traces and works through existing and newly found issues, prioritizing causes directly related to project code, configuration, tool contracts, Prompt or Skill. Findings established as unrelated to the existing implementation may be skipped with an explanation. Findings with uncertain relevance remain open for investigation. Specified issues or concrete symptoms limit the investigation scope. You can start directly with diagnosis without a separate detection invocation.
185
+ `$atk-trace-optimize` first lists the files, exact modification locations, before/after behavior and supporting checks in Codex. Discuss adjustments in chat; only after you confirm the final version does it save the detailed plan and edit the code. Material scope expansion requires another confirmation; an unchanged confirmed plan does not. Draft discussion stays in chat by default, while the session preview shows the final plan and actual changes.
186
+
187
+ Without specified issues, diagnosis reviews all available session traces, selects new issues within the tuning scope and reviews each existing issue. Findings established as unrelated to the implementation may be excluded with their reasons and history preserved; existing issues with uncertain relevance are not simply deleted. Specified issues or concrete symptoms define the investigation scope, and a temporary focus does not permanently exclude other issues. You can start directly with diagnosis without a separate detection invocation.
184
188
 
185
189
  Diagnoses and verification conclusions are saved per issue. If the evidence cannot establish which candidate loaded or whether key verification conditions were met, the verification outcome is `inconclusive`. Investigation results identify unread ranges and evidence gaps. As new issues surface, work through them individually or start another analysis with a new session trace.
186
190
 
@@ -140,16 +140,18 @@ Run `atk trace --help` to check whether your CLI supports trace tuning. If the c
140
140
  - **Langfuse v4**. Use `$atk-trace-init` to record project settings and configure read-only access on first setup. Configuration references credentials by environment-variable name. Then send `$atk-trace-capture Download session <session-id> from <start time> to <end time>`.
141
141
  - **Local files**. Send `$atk-trace-capture Import traces for session <session-id> from <file path>, with source <source>`. You can also provide files with verifiable ties to the session during analysis and let detection import them. Analyze an already archived session directly.
142
142
 
143
- The capture step downloads or imports data. Before saving, decide which content to retain and which fields to redact. ATK adds `.atk/traces/` to the project's `.gitignore`.
143
+ The capture step downloads or imports data. Before saving, decide which content to retain and which fields to redact. ATK checks whether Git ignores `.atk/traces/` and adds a rule to the project's `.gitignore` if needed.
144
+
145
+ `$atk-trace-init` infers and saves the tuning scope from project documents and implementation; later detection, diagnosis, repair and verification use it. No manual configuration is required. You can also say "For this run, focus on this project or component." When you skip initialization, analysis fills in the necessary context and explains any unresolved boundaries.
144
146
 
145
147
  ### 2. Analyze and Review Evidence
146
148
 
147
149
  ```text
148
- $atk-trace-detect Check whether session <session-id> completed its task correctly. List issues, evidence, and what you did not inspect.
150
+ $atk-trace-detect Analyze session <session-id> for issues actionable within this project. List evidence and what you did not inspect.
149
151
  $atk-visualize-trace Open the execution lanes for session <session-id> and jump from issues to the relevant trace segments and evidence fields.
150
152
  ```
151
153
 
152
- Detection retains issues with serious impact, recurrence, direct relevance to your stated focus, or a concrete implementation improvement lead, and explains the retention reason, evidence and inspection scope. Implementation leads include code, configuration, tool contracts, Prompt and Skill; an unresolved cause can proceed to diagnosis. Minor observations with none of these reasons are not saved separately. No retained issues does not prove the session was correct.
154
+ By default, detection retains evidence-backed issues worth pursuing that have a project mechanism, an improvement direction and a minimal verification approach; the root cause may still be uncertain. It explains out-of-scope findings and missing actionability evidence, and still calls attention to serious problems. You can explicitly request a comprehensive quality audit or investigation of a specific symptom without an existing improvement lead. No retained issues does not prove the session was correct.
153
155
 
154
156
  The capture, detect, diagnose, optimize and verify Skills generate or update `.atk/traces/<session_id>/preview.html` at stage end without opening a browser. Use `$atk-visualize-trace` when you want to open it; refresh an already open page after the file changes. Initialization has no session trace and does not generate an empty page.
155
157
 
@@ -162,11 +164,13 @@ Use Trace IDs to locate evidence within the session and open issue details to re
162
164
  ```text
163
165
  $atk-trace-diagnose Investigate session <session-id> and propose repair and verification plans.
164
166
  $atk-trace-diagnose Investigate ISSUE-001 in session <session-id> and propose a repair and verification plan.
165
- $atk-trace-optimize Implement the selected plan for ISSUE-001 in session <session-id>.
167
+ $atk-trace-optimize Prepare a detailed implementation plan for ISSUE-001 in session <session-id>, then implement after confirmation.
166
168
  $atk-trace-verify Verify the candidate for ISSUE-001 in session <session-id> and check relevant behavior that should still work.
167
169
  ```
168
170
 
169
- Without specified issues, diagnosis reviews all available session traces and works through existing and newly found issues, prioritizing causes directly related to project code, configuration, tool contracts, Prompt or Skill. Findings established as unrelated to the existing implementation may be skipped with an explanation. Findings with uncertain relevance remain open for investigation. Specified issues or concrete symptoms limit the investigation scope. You can start directly with diagnosis without a separate detection invocation.
171
+ `$atk-trace-optimize` first lists the files, exact modification locations, before/after behavior and supporting checks in Codex. Discuss adjustments in chat; only after you confirm the final version does it save the detailed plan and edit the code. Material scope expansion requires another confirmation; an unchanged confirmed plan does not. Draft discussion stays in chat by default, while the session preview shows the final plan and actual changes.
172
+
173
+ Without specified issues, diagnosis reviews all available session traces, selects new issues within the tuning scope and reviews each existing issue. Findings established as unrelated to the implementation may be excluded with their reasons and history preserved; existing issues with uncertain relevance are not simply deleted. Specified issues or concrete symptoms define the investigation scope, and a temporary focus does not permanently exclude other issues. You can start directly with diagnosis without a separate detection invocation.
170
174
 
171
175
  Diagnoses and verification conclusions are saved per issue. If the evidence cannot establish which candidate loaded or whether key verification conditions were met, the verification outcome is `inconclusive`. Investigation results identify unread ranges and evidence gaps. As new issues surface, work through them individually or start another analysis with a new session trace.
172
176
 
@@ -140,16 +140,18 @@ $atk-report
140
140
  - **Langfuse v4**。首次接入可用 `$atk-trace-init` 记录项目和只读来源配置。配置只引用凭据的环境变量名。然后发送 `$atk-trace-capture 下载 <session-id> 的会话,时间范围是 <开始时间> 到 <结束时间>`。
141
141
  - **本地文件**。发送 `$atk-trace-capture 从 <文件路径> 导入 <session-id> 的轨迹,来源是 <来源>`。也可在分析时提供可验证会话归属的文件,由分析流程导入。已归档的会话可直接分析。
142
142
 
143
- 采集步骤负责下载或导入。保存前确认哪些正文可以留存、哪些字段需要脱敏。`.atk/traces/` 会加入项目的 `.gitignore`。
143
+ 采集步骤负责下载或导入。保存前确认哪些正文可以留存、哪些字段需要脱敏。ATK 确保 Git 忽略 `.atk/traces/`,需要时会补写项目的 `.gitignore`。
144
+
145
+ `$atk-trace-init` 会根据项目说明和实现自动识别并保存调优范围,后续分析、诊断、修复和验证沿用该范围。无需手工配置;也可直接说明“本轮只看某个项目或组件”。跳过初始化时,分析流程会自动补齐必要上下文,无法确定的边界会明确说明。
144
146
 
145
147
  ### 2. 分析并查看证据
146
148
 
147
149
  ```text
148
- $atk-trace-detect 分析 <session-id> 的任务结果是否正确,列出问题、证据和未检查的范围。
150
+ $atk-trace-detect 分析 <session-id>,筛选当前项目可调优的问题,列出证据和未检查的范围。
149
151
  $atk-visualize-trace 打开 <session-id> 的执行泳道,从问题跳到相关轨迹片段和证据字段。
150
152
  ```
151
153
 
152
- 分析保留影响严重、反复出现、与你明确关注点相关,或有具体实现改进线索的问题,并说明保留理由、证据和检查范围。实现线索包括代码、配置、工具契约、Prompt 和 Skill;根因尚未确定也可进入后续诊断。轻微且无上述保留理由的观察不单独记录,没有保留问题不代表会话完全正确。
154
+ 分析默认保留有证据、值得投入,且能说明项目机制、改进方向和最小验证办法的问题;根因尚未确定也可进入后续诊断。范围外的问题说明未纳入原因,暂缺可处理性证据的问题说明缺口,严重问题仍会提示。需要全面质量审计或调查某个具体症状时可直接提出,不限于已有改进线索。没有保留问题不代表会话完全正确。
153
155
 
154
156
  采集、分析、诊断、修复和验证 Skill 在阶段结束后默认生成或更新 `.atk/traces/<session_id>/preview.html`,不自动打开浏览器。需要打开时使用 `$atk-visualize-trace`;已打开的页面在文件更新后需刷新。初始化没有会话轨迹,不生成空页面。
155
157
 
@@ -162,11 +164,13 @@ $atk-visualize-trace 打开 <session-id> 的执行泳道,从问题跳到相关
162
164
  ```text
163
165
  $atk-trace-diagnose 调查 <session-id>,给出修复和验证方案。
164
166
  $atk-trace-diagnose 调查 <session-id> 的 ISSUE-001,给出修复和验证方案。
165
- $atk-trace-optimize 实施 <session-id> 的 ISSUE-001 已选定的方案。
167
+ $atk-trace-optimize 为 <session-id> 的 ISSUE-001 准备详细修改方案,确认后实施。
166
168
  $atk-trace-verify 验证 <session-id> 的 ISSUE-001 对应候选,并检查相关正常行为。
167
169
  ```
168
170
 
169
- 未指定问题时,调查默认检查会话中可用的全部轨迹,逐项处理已记录和新发现的问题,优先定位与项目代码、配置、工具契约、Prompt 或 Skill 直接相关的原因。证据确认与现有实现无关的问题可以忽略,并说明理由。关联尚不明确的问题保留待查。指定问题或具体症状时,按指定范围调查。可以直接从调查开始,无需先单独执行检测。
171
+ `$atk-trace-optimize` 会先在 Codex 中列出具体文件、修改位置、前后行为和配套验证。你可以在对话中调整方案;确认最终版本后,才保存详细实施方案并修改代码。实质扩大范围时会再次确认,同一已确认方案无需重复确认。讨论稿默认保留在对话中;会话预览展示最终方案与实际修改。
172
+
173
+ 未指定问题时,调查默认检查会话中可用的全部轨迹,按调优范围筛选新问题,并逐项审阅已记录的问题。证据确认与现有实现无关的问题可以排除,并保留理由和历史;已记录但关联尚不明确的问题不会直接删除。指定问题或具体症状时,按指定范围调查,临时收窄范围不会永久排除其他问题。可以直接从调查开始,无需先单独执行检测。
170
174
 
171
175
  诊断和验证结论分别按问题保存。证据不足以确认实际加载的候选或关键验证条件时,验证效果记为 `inconclusive`(无法判断)。调查结果会说明未检查的范围和证据缺口。后续发现新的问题,可继续按问题处理,或用新会话的轨迹开始下一次分析。
172
176
 
@@ -1,3 +1,3 @@
1
1
  """Agent Tune Kit package."""
2
2
 
3
- __version__ = "2.4.0"
3
+ __version__ = "2.4.2"
@@ -4,6 +4,7 @@ import hashlib
4
4
  import json
5
5
  import os
6
6
  import re
7
+ import subprocess
7
8
  import uuid
8
9
  from contextlib import contextmanager
9
10
  from pathlib import Path
@@ -11,7 +12,7 @@ from urllib.parse import urlsplit
11
12
 
12
13
  from agent_tune_kit.errors import UserActionRequired
13
14
  from agent_tune_kit.results.evidence import digest_file, json_bytes, now, safe_path, write_manifest
14
- from agent_tune_kit.utils.files import write_text_atomic
15
+ from agent_tune_kit.utils.files import atomic_text_writer, write_text_atomic
15
16
 
16
17
  from . import archive
17
18
 
@@ -97,16 +98,41 @@ def trace_root(project_root):
97
98
  return safe_path(project, ".atk/traces")
98
99
 
99
100
 
101
+ def _trace_git_ignored(project):
102
+ try:
103
+ result = subprocess.run(
104
+ ["git", "check-ignore", "-q", "--no-index", "--", ".atk/traces/"],
105
+ cwd=project,
106
+ capture_output=True,
107
+ env={**os.environ, "LC_ALL": "C"},
108
+ check=False,
109
+ )
110
+ except FileNotFoundError:
111
+ return None
112
+ if result.returncode in {0, 1}:
113
+ return result.returncode == 0
114
+ if result.stderr.startswith((b"fatal: not a git repository", b"fatal: this operation must be run in a work tree")):
115
+ return None
116
+ raise UserActionRequired("Git could not check the Trace ignore rules. Check Git status in the project.")
117
+
118
+
100
119
  def ensure_workspace(project_root):
101
120
  project = Path(project_root).resolve()
102
121
  root = trace_root(project)
103
122
  ignore = safe_path(project, ".gitignore")
104
- text = ignore.read_text(encoding="utf-8") if ignore.exists() else ""
105
- # An explicit final rule also protects archives after a previous negated rule.
106
- rule = "/.atk/traces/"
107
- changed = not text.rstrip().endswith(rule)
108
- if changed:
109
- write_text_atomic(ignore, text + ("\n" if text and not text.endswith("\n") else "") + rule + "\n")
123
+ ignored = _trace_git_ignored(project)
124
+ changed = False
125
+ if ignored is not True:
126
+ text = ignore.read_bytes().decode("utf-8") if ignore.exists() else ""
127
+ rule = "/.atk/traces/"
128
+ changed = text.rstrip("\r\n").rsplit("\n", 1)[-1] != rule
129
+ if changed:
130
+ newline = "\r\n" if "\r\n" in text else "\n"
131
+ separator = newline if text and not text.endswith("\n") else ""
132
+ with atomic_text_writer(ignore, newline="") as handle:
133
+ handle.write(text + separator + rule + newline)
134
+ if ignored is False and not _trace_git_ignored(project):
135
+ raise UserActionRequired("Git still does not ignore .atk/traces/. Resolve the conflicting ignore rules.")
110
136
  root.mkdir(mode=0o700, parents=True, exist_ok=True)
111
137
  return root, changed
112
138
 
@@ -423,7 +423,7 @@
423
423
  const issue = item.record;
424
424
  openDrawer(`${issue.id} · ${issue.title || "问题详情"}`, "issue");
425
425
  const tabs = el("nav", undefined, "stage-tabs"); tabs.setAttribute("aria-label", "问题处理阶段");
426
- for (const [key, label] of [["issue", "问题与片段"], ["diagnoses", "诊断与方案"], ["changes", "修改候选"], ["verifications", "实际验证"]]) {
426
+ for (const [key, label] of [["issue", "问题详情"], ["diagnoses", "诊断与方案"], ["changes", "修改候选"], ["verifications", "实际验证"]]) {
427
427
  const tab = button(label, () => showIssue(item, key), key === stage ? "active" : "");
428
428
  tab.setAttribute("aria-pressed", String(key === stage)); tabs.append(tab);
429
429
  }
@@ -439,17 +439,6 @@
439
439
  }
440
440
  const segments = issue.segments || [];
441
441
  if (!segments.length) $("drawer-content").append(el("p", "该问题尚未圈定片段,可查看已记录的关联证据。", "muted"));
442
- if (segments.length) {
443
- const box = section("关联片段");
444
- segments.forEach((segment, index) => {
445
- const row = el("div", undefined, "detail-section");
446
- const title = `${segment.id || `S${index + 1}`} · ${segment.summary || "未命名片段"}`;
447
- row.append(button(title, () => startIssue(item, item.fragments.findIndex(part => part.id === segment.id || (!part.id && index === item.fragments.indexOf(part))))));
448
- appendReferences(row, segment.evidence || []);
449
- box.append(row);
450
- });
451
- $("drawer-content").append(box);
452
- }
453
442
  if ((issue.evidence || []).length) {
454
443
  const evidence = section(segments.length ? "额外证据" : "关联证据");
455
444
  appendReferences(evidence, issue.evidence);
@@ -631,16 +620,31 @@
631
620
  return (left.at ?? Infinity) - (right.at ?? Infinity) || left.track - right.track || a - b;
632
621
  });
633
622
  }
634
- return candidates.filter(i => {
623
+ const rows = candidates.filter(i => {
635
624
  const n = currentCapture.nodes[i];
636
625
  if ((track !== null && n.track !== track) || (type && n.type !== type)) return false;
637
- if (mode === "error" && !eventState(n).failed) return false;
638
626
  if (query) {
639
627
  if (!searchable.has(n)) searchable.set(n, pretty(n).toLocaleLowerCase());
640
628
  return searchable.get(n).includes(query);
641
629
  }
642
630
  return true;
643
631
  });
632
+ // The failure switch shows its count before it is chosen, so count within every other active scope and filter.
633
+ const failed = rows.filter(i => eventState(currentCapture.nodes[i]).failed);
634
+ return {rows: mode === "error" ? failed : rows, total: rows.length, failed: failed.length};
635
+ }
636
+ function syncRecordMode(failed) {
637
+ const only = $("record-mode").value === "error";
638
+ $("record-all").setAttribute("aria-pressed", String(!only));
639
+ $("record-failed").setAttribute("aria-pressed", String(only));
640
+ $("record-failed-count").textContent = String(failed);
641
+ // Keep an active switch usable at zero so the selection stays visible; otherwise zero means nothing to look at.
642
+ $("record-failed").disabled = !only && failed === 0;
643
+ $("record-failed").title = failed || only ? `只看执行失败的事件(${failed} 条)` : "当前范围没有执行失败的事件";
644
+ }
645
+ function setRecordMode(mode) {
646
+ $("record-mode").value = mode;
647
+ renderTraces();
644
648
  }
645
649
  function eventState(n) {
646
650
  const out = n.output, input = n.input;
@@ -859,7 +863,7 @@
859
863
  if (state.failed) {
860
864
  row.classList.add("is-error");
861
865
  const icon = el("span", "⚠", "event-error-icon");
862
- icon.setAttribute("role", "img"); icon.setAttribute("aria-label", "执行异常"); icon.title = "执行异常";
866
+ icon.setAttribute("role", "img"); icon.setAttribute("aria-label", "执行失败"); icon.title = "执行失败";
863
867
  label.append(icon);
864
868
  }
865
869
  label.append(el("span", name, "node-name"));
@@ -963,9 +967,12 @@
963
967
  $("summary").textContent = notes.join(" · ");
964
968
  $("session-stats").textContent = `${native.length} Trace · ${order.length} 条事件 · ${data.issues.length} 问题`;
965
969
  scroller.parentElement.classList.toggle("single", tracks.length === 1 || displayedScope !== null);
966
- streamRows = filteredRows();
970
+ const filtered = filteredRows();
971
+ streamRows = filtered.rows;
972
+ syncRecordMode(filtered.failed);
967
973
  displayRows = buildDisplayRows(streamRows);
968
- $("trace-count").textContent = `${streamRows.length} 条`;
974
+ $("trace-count").textContent = $("record-mode").value === "error"
975
+ ? `失败 ${streamRows.length} / ${filtered.total} 条` : `${streamRows.length} 条`;
969
976
  if (eventFocus) $("trace-count").textContent = streamRows.length === eventFocus.indices.length
970
977
  ? `${streamRows.length} 条事件` : `${streamRows.length} / ${eventFocus.indices.length} 条事件`;
971
978
  const related = new Set((investigation?.item.fragments || []).filter(p => p.capture_id === currentCapture?.id).flatMap(p => p.anchors));
@@ -1289,7 +1296,9 @@
1289
1296
  if (currentCapture) $("capture-filter").value = currentCapture.id;
1290
1297
  $("capture-filter").onchange = () => { investigation = null; scopeBefore = null; railFilter = null; chooseCapture(); renderIssueRail(); renderTraces(); };
1291
1298
  $("trace-filter").onchange = () => focusTrace(scope());
1292
- for (const id of ["trace-search","type-filter","record-mode"]) $(id).addEventListener(id === "trace-search" ? "input" : "change", () => renderTraces());
1299
+ for (const id of ["trace-search","type-filter"]) $(id).addEventListener(id === "trace-search" ? "input" : "change", () => renderTraces());
1300
+ $("record-all").onclick = () => setRecordMode("");
1301
+ $("record-failed").onclick = () => setRecordMode("error");
1293
1302
  $("issue-search").oninput = () => { railFilter = null; renderIssueRail(); };
1294
1303
  const collapsed = localStorage.getItem(RAIL_KEY) === "1";
1295
1304
  document.body.classList.toggle("rail-collapsed", collapsed);
@@ -60,9 +60,8 @@
60
60
  </section>
61
61
  <section class="record-panel" aria-labelledby="records-title">
62
62
  <div class="records-heading">
63
- <div class="records-title"><h2 id="records-title">事件</h2><span id="event-range" class="muted" hidden></span><span id="trace-count" class="muted" aria-live="polite"></span><button id="event-reset" type="button" hidden>返回全部</button></div>
63
+ <div class="records-title"><h2 id="records-title">事件</h2><div class="record-mode" role="group" aria-label="事件范围"><input id="record-mode" type="hidden" value=""><button id="record-all" type="button" aria-pressed="true">全部</button><button id="record-failed" type="button" aria-pressed="false"><span class="record-failed-icon" aria-hidden="true">⚠</span>失败 <span id="record-failed-count" class="record-failed-count">0</span></button></div><span id="event-range" class="muted" hidden></span><span id="trace-count" class="muted" aria-live="polite"></span><button id="event-reset" type="button" hidden>返回全部</button></div>
64
64
  <div class="toolbar record-filters">
65
- <label><span class="sr-only">事件范围</span><select id="record-mode"><option value="">全部事件</option><option value="error">仅看异常</option></select></label>
66
65
  <label><span class="sr-only">类型</span><select id="type-filter"></select></label>
67
66
  <label class="search-label"><span class="sr-only">搜索事件</span><input id="trace-search" type="search" placeholder="搜索事件或输入输出"></label>
68
67
  </div>
@@ -153,13 +153,24 @@ body.rail-collapsed .rail-list { padding-inline: 4px }
153
153
  .toolbar { flex-wrap: wrap; gap: 8px }
154
154
  .record-filters { gap: 8px; max-width: 100% }
155
155
  .record-filters label { display: block; min-width: 0 }
156
- #record-mode { width: 104px }
156
+ /* Failure-only viewing is a visible two-state switch next to the title, not a dropdown, so the failure count shows
157
+ before anyone filters. */
158
+ .record-mode { display: inline-flex; flex-shrink: 0; border: 1px solid var(--line); border-radius: 6px; overflow: hidden; background: white }
159
+ .record-mode button { display: inline-flex; align-items: center; gap: 4px; min-height: 26px; padding: 2px 10px; border: 0; border-radius: 0; background: transparent; color: var(--muted); font-size: 12px; white-space: nowrap }
160
+ .record-mode button + button { border-left: 1px solid var(--line) }
161
+ .record-mode button:hover:not(:disabled) { background: var(--tint) }
162
+ .record-mode button[aria-pressed=true] { background: var(--tint); color: var(--accent); font-weight: 600 }
163
+ .record-mode #record-failed[aria-pressed=true] { background: #fff2f1; color: #b12c21; box-shadow: inset 0 -2px #c0392b }
164
+ .record-failed-icon, .record-failed-count { color: #b12c21 }
165
+ .record-failed-count { font-weight: 600; font-variant-numeric: tabular-nums }
166
+ .record-mode button:disabled { opacity: 1; color: #9aa8b2 }
167
+ .record-mode button:disabled :is(.record-failed-icon, .record-failed-count) { color: inherit; font-weight: 400 }
157
168
  #type-filter { width: 142px }
158
169
  #trace-search { width: 208px }
159
170
  .toolbar select:has(option:checked:not([value=""])) { border-color: #deb493; color: var(--accent) }
160
171
  @container (max-width: 650px) {
161
172
  .record-filters { display: grid; width: 100%; grid-template-columns: repeat(2,minmax(0,1fr)) }
162
- .record-filters :is(#record-mode,#type-filter,#trace-search) { width: 100% }
173
+ .record-filters :is(#type-filter,#trace-search) { width: 100% }
163
174
  .record-filters .search-label { grid-column: 1/-1 }
164
175
  }
165
176
  .stream { overflow: hidden; max-height: 100vh; max-height: 100dvh }
@@ -74,8 +74,13 @@
74
74
 
75
75
  // --- small building blocks ------------------------------------------------------------------------------------
76
76
  const countBy = issues => { const counts = new Map(); for (const issue of issues) counts.set(issue.progress, (counts.get(issue.progress) || 0) + 1); return counts; };
77
- const topProgress = counts => [...counts].sort((a, b) => b[1] - a[1] || ORDER.get(a[0]) - ORDER.get(b[0])).slice(0, 2).map(([key, n]) => `${LABEL.get(key)} ${n}`).join(" · ");
78
77
  const flag = (text, bad) => el("span", text, bad ? "flag bad" : "flag");
78
+ // Cards do not repeat routine progress (the state filter and drawers carry it); they only flag the same results the
79
+ // session attention notes call out: failed verification and inconclusive verdicts.
80
+ const attentionFlags = counts => [
81
+ ...(counts.get("fail") ? [flag(`验证失败 ${counts.get("fail")}`, true)] : []),
82
+ ...(counts.get("inconclusive") ? [flag(`无法判断 ${counts.get("inconclusive")}`)] : []),
83
+ ];
79
84
  const copyText = async text => {
80
85
  try { await navigator.clipboard.writeText(text); return true; } catch { /* file:// pages may refuse; fall back below */ }
81
86
  try {
@@ -262,7 +267,7 @@
262
267
  if (matched.length) {
263
268
  const counts = countBy(matched);
264
269
  const row = el("div", undefined, "card-count");
265
- row.append(el("strong", `${matched.length} 个问题`), el("span", topProgress(counts), "muted"));
270
+ row.append(el("strong", `${matched.length} 个问题`), ...attentionFlags(counts));
266
271
  card.append(row);
267
272
  } else card.append(el("div", "无保留问题(不代表会话正确)", "card-count muted"));
268
273
  const perCategory = new Map(); let none = 0;
@@ -308,9 +313,9 @@
308
313
  card.append(head, el("div", info ? info.definition : "分类词表中没有这条分类,按分类 ID 显示。", "card-definition"));
309
314
  const counts = countBy(items.map(item => item.issue));
310
315
  const row = el("div", undefined, "card-count");
311
- row.append(el("strong", `${new Set(items.map(item => item.s.dir)).size} 个会话 · ${items.length} 个问题`), el("span", latestOf(items) < 0 ? "发生时间未记录" : `最近发生 ${when(latestOf(items))}`, "muted"));
316
+ row.append(el("strong", `${new Set(items.map(item => item.s.dir)).size} 个会话 · ${items.length} 个问题`), el("span", latestOf(items) < 0 ? "发生时间未记录" : `最近发生 ${when(latestOf(items))}`, "muted"), ...attentionFlags(counts));
312
317
  card.append(projectLine(items.map(({issue}) => issue)));
313
- card.append(row, el("div", topProgress(counts), "card-meta"));
318
+ card.append(row);
314
319
  return card;
315
320
  }
316
321
  // The distinct projects behind a group of issues; each offered name narrows the issue view to that project.
@@ -251,7 +251,9 @@ def build_trace_data(project_root, *, session_id, source=None):
251
251
  display_refs = list(record.get("evidence", []))
252
252
  for segment in record.get("segments", []):
253
253
  display_refs.extend(segment.get("evidence", []))
254
- evidence = [references[_reference_key(ref)] for ref in display_refs if _reference_key(ref) in references]
254
+ # Shared evidence keeps one display index so it cannot reappear as an unclaimed point.
255
+ display_keys = dict.fromkeys(_reference_key(ref) for ref in display_refs)
256
+ evidence = [references[key] for key in display_keys if key in references]
255
257
  # Fragment refs index into this combined list (top-level + segment evidence).
256
258
  item["evidence"] = evidence
257
259
  segments = record.get("segments") or []
@@ -203,7 +203,9 @@ CSV-only judgments remain supported. Integrity is distinct from coverage, source
203
203
 
204
204
  ## Uncertainty confirmation pattern
205
205
 
206
- Each Skill should inspect repository files first, state the evidence it found, and ask a concise confirmation question only when acting without confirmation would likely corrupt data, write the wrong files, or misinterpret evaluation results.
206
+ Trace optimization additionally follows the [implementation plan confirmation workflow](trace-tuning.md): prepare the concrete file-level plan in chat, obtain confirmation, then save the final plan and modify the implementation. This applies even to reversible implementation edits; reuse an unchanged plan already confirmed in the conversation.
207
+
208
+ Outside that Trace implementation confirmation, each Skill should inspect repository files first, state the evidence it found, and ask a concise confirmation question only when acting without confirmation would likely corrupt data, write the wrong files, or misinterpret evaluation results.
207
209
 
208
210
  Ask before proceeding when any of these remain unresolved after inspection:
209
211
 
@@ -149,7 +149,7 @@
149
149
  | 会话卡片、分类卡片 | 与 `.issue-card` 相同:白底、`--line` 边框、8px 圆角;悬停时 `--tint` 底色和 `#e4b89b` 边框;选中时左侧 3px `--brand` 内描边 |
150
150
  | ID 文本 | `.issue-id-text`:`--accent` 色、等宽、12px 粗体 |
151
151
  | 分类标签 | `.seg-chip` 配色:`#fff8f1` 底、`--accent` 文字、4px 圆角 |
152
- | 进度条 | 不使用(2026-11-11 确认):页签顶部不展示通用进度条或概况指标块,会话卡片和分类卡片也不展示进度条,处理分布只用文字表达 |
152
+ | 进度条 | 不使用(2026-11-11 确认):页签顶部不展示通用进度条或概况指标块,会话卡片和分类卡片也不展示进度条或常规进度文字,只用提醒标记写验证失败和无法判断 |
153
153
  | 提醒 | 与 `.warning` 相同的黄底边框;卡片内使用紧凑版 |
154
154
  | 抽屉 | 同一 `.drawer`:右侧覆盖、非模态、默认 480px、可拖宽;窄屏从底部弹出;`Esc` 关闭。大盘的抽屉是进入会话页前的预览(2026-11-10 起):点击页面空白处、再次点击当前卡片或按 `Esc` 关闭,点击其他卡片直接切换;点击抽屉内、筛选、搜索、页签和链接不关闭;出现时有 0.18 秒滑入,系统要求减少动效时不播放。单会话页抽屉不变 |
155
155
  | 抽屉中的问题列表 | 行样式参照 `.trace-row`:40px 行高、`#edf0f3` 分隔线、悬停 `#f5f9fa`;进度用 `.progress-dot` |
@@ -172,7 +172,7 @@
172
172
 
173
173
  - **维度切换**:默认显示会话维度,当前维度写入 URL hash。
174
174
  - **顶栏统计**(2026-11-11 确认):只写会话数、问题数;所有会话环境相同时追加“环境 <environment>”。不写获取方式(`source.type`,如 `local` 本地导入),也不写页面生成时间。
175
- - **页签内容**(2026-11-11 确认):不展示四块概况指标或通用进度条。会话页只在存在无法判断、验证失败或记录读取失败时显示按会话去重的关注提示;问题页保留紧凑的处理状态筛选。下方卡片、卡片内文字形式的问题分布及详情抽屉保留。
175
+ - **页签内容**(2026-11-11 确认):不展示四块概况指标或通用进度条。会话页只在存在无法判断、验证失败或记录读取失败时显示按会话去重的关注提示;问题页保留紧凑的处理状态筛选。下方卡片及详情抽屉保留。卡片不重复常规进度(待诊断、已诊断、验证通过等),只在存在验证失败或无法判断时在数量行末加提醒标记,口径与会话页关注提示一致(2026-11-11 确认)。按状态查看用处理状态筛选,单个问题的进度在抽屉列表中显示。
176
176
  - **筛选**:搜索(Session ID、Issue ID、标题、分类名)和来源在两个维度间共享。处理状态和关联项目仅作用于问题页,切回时恢复选择;状态选项包含“全部”和数量不为 0 的状态,再次点击已选状态或选择“全部”取消状态筛选。项目有多个来源时才显示来源/环境下拉框。
177
177
  - **数量口径**:状态选项数量按搜索、来源及关联项目范围统计,便于切换状态;分类卡片、排序、未分类通栏及抽屉中的匹配数量按全部当前筛选计算。只有筛选生效时显示结果数量和“清除筛选”,该按钮清除当前维度生效的筛选。
178
178
 
@@ -183,7 +183,7 @@
183
183
  │ SES_…830912 ⧉ │ │ cb27cb0f-… ⧉ │
184
184
  │ 发生于 11-06 12:55 │ │ 发生于 11-09 15:01 │
185
185
  │ │ │ │
186
- │ 11 个问题 已诊断 8 · 待诊断 3 │ │ 3 个问题 待诊断 2 · 无法判断 1│
186
+ │ 11 个问题 │ │ 3 个问题 [无法判断 1] │
187
187
  │ │ │ ⚠ 预览需刷新 │
188
188
  │ 未分类 11 │ │ 未分类 3 │
189
189
  └──────────────────────────────┘ └──────────────────────────────┘
@@ -196,7 +196,7 @@
196
196
  | 会话身份 | 缩短的 Session ID,悬停显示全称,可复制 |
197
197
  | 发生时间 | 会话本身的开始时间:保留轨迹中最早的事件时间,悬停显示开始至结束;无可用事件时间时写“发生时间未记录”。不显示导入、检测、诊断、修复等处理时间,后者只用于判断预览是否需刷新。无时区的事件时间按运行 ATK 的机器时区解释,与单会话页一致 |
198
198
  | 来源 | 仅在存在多个来源时显示,写“环境 <environment>”;环境重名时追加实例,与来源下拉框同样的标签 |
199
- | 问题数与处理分布 | 问题数后用文字写数量最多的两档实际进度,不展示进度条 |
199
+ | 问题数与提醒 | 只写问题数;存在验证失败或无法判断时行末加“验证失败 N”(红色)或“无法判断 N”(黄色)标记。不展示进度条或常规进度 |
200
200
  | 主要分类 | 最多 3 个分类标签及数量,其余显示为 `+N`;点击标签切到问题维度并定位该分类 |
201
201
  | 提醒 | 仅在需要处理时出现:预览需刷新、记录读取失败 |
202
202
 
@@ -234,14 +234,14 @@
234
234
  │ Shell 路径/参数传递导致反复重试 │ │ 宣称完成但验收证据不足 │
235
235
  │ 工具调用因相对路径、stdin 或变量… │ │ 交付结论缺少同条件的行为验证… │
236
236
  │ 4 个会话 · 4 个问题 最近发生 11-09│ │ 3 个会话 · 5 个问题 最近发生 11-09│
237
- │ 已诊断 2 · 待诊断 2 │ │ 已诊断 3 · 待诊断 2 │
237
+ │ │ │ [验证失败 1] │
238
238
  └──────────────────────────────────┘ └──────────────────────────────────┘
239
239
  ┌ 未分类 · 37 个问题 · 相关会话下次检测时补充 ──────────────────────────────┐
240
240
  ```
241
241
 
242
242
  (示意。Magic 现有问题在补分类前都在“未分类”中。)
243
243
 
244
- - 分类卡片:分类名、一行定义(超出截断)、会话数与问题数、最近发生时间(所含会话中最晚的开始时间)、数量最多的两档进度文字。已弃用的分类加“已弃用”标记,排在正常分类之后。
244
+ - 分类卡片:分类名、一行定义(超出截断)、会话数与问题数、最近发生时间(所含会话中最晚的开始时间),以及与会话卡片相同的验证失败/无法判断提醒。已弃用的分类加“已弃用”标记,排在正常分类之后。
245
245
  - 排序:按筛选后涉及的会话数倒序,相同时依次按问题数、最近发生时间。
246
246
  - “未分类”是最后一条通栏,不与正常分类混排。
247
247
 
@@ -64,7 +64,11 @@
64
64
  - 默认按会话时间连续列出全部事件。被任意 Issue 引用的行,末尾显示窄标签(如 `001`),不单独占列。
65
65
  - 点击聚合刻痕后,列表只展示该刻痕包含的事件,标题显示所属 Trace、所选时段和事件数;无时间事件显示“时间未知”。列表仍可搜索和筛选,计数显示命中数与组内总数。所选事件集合固定,窗口缩放不会改变成员。
66
66
  - “返回全部”恢复进入前的选中事件、滚动位置和筛选;原先有筛选时标为“返回筛选结果”,从问题定位进入时标为“返回问题片段”或“返回问题上下文”。连续点击另一聚合刻痕只替换当前集合,返回目标保持不变。切换 Trace 或快照清除该集合。
67
- - 聚焦 Trace 后标题显示“事件 · T2”及当前事件数。事件工具栏仅保留事件范围、类型和搜索,只筛选列表;Trace 切换位于泳道上方。
67
+ - 聚焦 Trace 后标题显示“事件 · T2”及当前事件数。事件工具栏仅保留类型和搜索,只筛选列表;Trace 切换位于泳道上方。
68
+ - 事件范围(2026-11-11 确认):不用下拉框,在“事件”标题旁放分段切换 `全部 | ⚠ 失败 N`,用词与状态列的“失败”一致,判定口径与失败行标红相同。
69
+ - N 按当前 Trace 聚焦、聚合刻痕事件集合、类型和搜索统计,不含切换本身,选择前即可看到。
70
+ - N 为 0 且未选中时保留显示但不可点击,表明当前范围没有失败事件;已选中时始终可点,便于看清和取消。
71
+ - 选中时计数写“失败 N / M 条”,M 为同一范围内的事件总数。它与类型、搜索同属列表筛选:进入问题定位或聚合刻痕时清除,退出时按进入前状态恢复。
68
72
  - 选中 Issue 后:
69
73
  - 恢复完整会话范围,呈现跨 Trace 的所有问题片段;退出问题定位后恢复原来的 Trace 聚焦状态。
70
74
  - 范围内行加左侧色条,并插入段头行,显示片段摘要、事件数和时长。
@@ -97,9 +101,10 @@
97
101
 
98
102
  **问题详情**(从问题栏打开):
99
103
 
100
- - 顺序:描述与片段 → 诊断 → 修正 / 改动 → 验证。
104
+ - 顺序:问题详情 → 诊断与方案 → 修改候选 → 实际验证。
101
105
  - 正文中的 `ISSUE-001/S2` 是可点击链接,点击后主区定位该片段,抽屉保持打开。
102
106
  - 从问题证据进入事件后可返回原问题;问题入口保留在问题栏与片段导航中。
107
+ - “问题详情”展示问题描述、关联项目与保留理由,不重复列出全部关联片段。片段从左栏和主区导航;主区“片段证据(N)”按需在抽屉展示本段引用。无法放入片段的额外证据,以及无片段旧问题的关联证据,仍在问题详情中可访问。
103
108
 
104
109
  ### 导航与状态
105
110