okstra 0.113.0 → 0.115.0

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 (348) hide show
  1. package/README.kr.md +2 -2
  2. package/README.md +2 -2
  3. package/docs/for-ai/README.md +2 -2
  4. package/docs/for-ai/skills/{okstra-brief.md → okstra-brief-gen.md} +3 -3
  5. package/docs/for-ai/skills/okstra-inspect.md +1 -1
  6. package/docs/kr/architecture.md +11 -11
  7. package/docs/kr/cli.md +1 -1
  8. package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
  9. package/docs/project-structure-overview.md +2 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +1 -0
  13. package/runtime/prompts/lead/context-loader.md +2 -2
  14. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  15. package/runtime/prompts/profiles/_common-contract.md +3 -3
  16. package/runtime/prompts/profiles/implementation-planning.md +1 -1
  17. package/runtime/prompts/profiles/requirements-discovery.md +2 -2
  18. package/runtime/python/okstra_ctl/fix_cycles.py +1 -1
  19. package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
  20. package/runtime/python/okstra_ctl/report_views.py +151 -12
  21. package/runtime/python/okstra_ctl/run.py +24 -24
  22. package/runtime/python/okstra_ctl/wizard.py +3 -3
  23. package/runtime/python/okstra_ctl/worktree.py +1 -1
  24. package/runtime/python/okstra_token_usage/claude.py +58 -19
  25. package/runtime/python/okstra_token_usage/collect.py +3 -1
  26. package/runtime/python/okstra_vendor/__init__.py +3 -0
  27. package/runtime/schemas/final-report-v1.0.schema.json +20 -0
  28. package/runtime/skills/{okstra-brief → okstra-brief-gen}/SKILL.md +6 -6
  29. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/reporter-confirmations.md +1 -1
  30. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/tracker-recursion.md +1 -1
  31. package/runtime/skills/okstra-inspect/SKILL.md +2 -2
  32. package/runtime/templates/reports/brief.template.md +2 -2
  33. package/runtime/templates/reports/final-report.template.md +14 -0
  34. package/runtime/templates/reports/i18n/en.json +23 -12
  35. package/runtime/templates/reports/i18n/ko.json +23 -12
  36. package/runtime/templates/reports/report.css +55 -0
  37. package/runtime/templates/reports/report.js +53 -1
  38. package/runtime/validators/validate-brief.py +5 -5
  39. package/runtime/validators/validate-brief.sh +1 -1
  40. package/src/commands/lifecycle/uninstall.mjs +2 -1
  41. package/src/lib/skill-catalog.mjs +2 -1
  42. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  43. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
  44. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
  45. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
  46. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
  47. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
  57. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
  59. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
  60. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
  61. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
  62. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
  63. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
  64. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
  66. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
  67. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
  68. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
  69. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
  70. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
  71. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
  72. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
  73. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
  74. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
  75. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
  76. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
  77. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
  78. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
  80. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
  81. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
  82. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
  83. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
  84. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
  85. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
  86. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
  87. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
  88. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
  89. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
  90. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
  91. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
  92. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
  93. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
  94. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
  95. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
  96. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
  97. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
  99. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
  101. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
  103. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
  104. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
  105. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
  106. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
  107. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
  108. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
  109. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
  110. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
  111. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
  112. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
  113. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
  114. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
  115. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
  117. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
  118. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
  119. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
  120. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
  121. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
  122. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
  124. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
  125. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
  126. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
  127. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
  128. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
  129. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
  130. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
  131. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
  137. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
  138. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
  139. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
  140. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
  147. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
  148. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
  149. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
  150. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
  151. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
  152. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
  153. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
  154. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
  155. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
  157. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
  158. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
  159. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
  161. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
  162. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
  163. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
  164. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
  166. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
  167. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
  168. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
  169. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
  170. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
  171. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
  173. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
  174. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
  175. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
  176. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
  177. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
  178. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
  179. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
  180. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
  181. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
  182. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
  183. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
  184. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
  185. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
  186. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
  187. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
  188. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
  189. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
  190. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
  191. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
  192. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
  193. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
  194. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
  195. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
  196. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
  197. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
  198. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
  199. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
  200. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
  201. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
  202. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
  203. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
  204. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
  205. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
  206. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
  207. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
  208. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
  209. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
  210. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
  211. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
  212. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
  213. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
  214. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
  215. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
  216. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
  217. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
  218. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
  219. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
  220. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
  221. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
  222. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
  223. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
  224. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
  225. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
  226. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
  227. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
  228. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
  229. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
  231. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
  232. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
  233. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
  234. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
  235. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
  237. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
  238. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
  239. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
  240. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
  241. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
  242. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
  243. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  244. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
  245. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
  246. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
  247. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
  248. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
  249. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
  250. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
  251. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
  252. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
  253. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
  254. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
  255. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
  256. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
  257. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
  258. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
  259. package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
  260. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  261. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  262. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  263. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  264. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  265. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  266. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  267. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
  268. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
  269. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
  270. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
  271. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
  272. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
  273. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  274. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
  275. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
  276. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
  277. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
  278. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
  279. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
  280. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
  281. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
  282. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
  283. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
  284. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
  285. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
  286. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
  287. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
  288. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
  289. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
  290. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
  291. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
  292. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
  293. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
  294. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
  295. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
  296. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
  297. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
  298. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
  299. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
  300. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
  301. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
  302. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  303. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
  304. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
  305. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
  306. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
  307. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
  308. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
  309. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
  310. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  311. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
  312. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
  313. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
  314. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
  315. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  316. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
  317. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
  318. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
  319. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
  320. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
  321. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
  322. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
  323. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
  324. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
  325. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
  326. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
  327. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  328. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
  329. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
  330. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
  331. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
  332. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
  333. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
  334. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
  335. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
  336. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
  337. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
  338. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  339. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
  340. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
  341. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
  342. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
  343. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
  344. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
  345. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
  346. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
  347. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
  348. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +0 -55
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: okstra-inspect
3
3
  description: >-
4
- Use this for everything that happens AFTER a single okstra task has already run — inspecting it or light bookkeeping on it, never launching new work. The tell is usually a named task id (PROD-1623, dev-9184), often dropped without the word "okstra." Reach for it when the user wants one task's: status, current/next phase, blockers, or approval gate; its final report — where it is or whether it passed (결론·통과); its elapsed time (소요 시간) or context/read cost (컨텍스트 비용); its run history, re-run, or resume; to mark it done / in-progress / blocked / todo; or a failed run's error logs gathered into a report (에러 리포트). Also bundles cross-project okstra errors into an anonymized feedback zip (에러 환류). Use it even for a bare "mark it done" or "where's the report." NOT for starting a run (okstra-run), rollups/schedules (okstra-rollup / okstra-schedule), a brief (okstra-brief), setup (okstra-setup), or cross-project management (okstra-manager).
4
+ Use this for everything that happens AFTER a single okstra task has already run — inspecting it or light bookkeeping on it, never launching new work. The tell is usually a named task id (PROD-1623, dev-9184), often dropped without the word "okstra." Reach for it when the user wants one task's: status, current/next phase, blockers, or approval gate; its final report — where it is or whether it passed (결론·통과); its elapsed time (소요 시간) or context/read cost (컨텍스트 비용); its run history, re-run, or resume; to mark it done / in-progress / blocked / todo; or a failed run's error logs gathered into a report (에러 리포트). Also bundles cross-project okstra errors into an anonymized feedback zip (에러 환류). Use it even for a bare "mark it done" or "where's the report." NOT for starting a run (okstra-run), rollups/schedules (okstra-rollup / okstra-schedule), a brief (okstra-brief-gen), setup (okstra-setup), or cross-project management (okstra-manager).
5
5
  ---
6
6
 
7
7
  # OKSTRA Inspect
@@ -682,7 +682,7 @@ stdout JSON 을 파싱해 보고:
682
682
  | 프로젝트 수 | `projectCount` |
683
683
 
684
684
  - `unreachableRuns > 0` 이면 표면화한다(침묵 누락 금지).
685
- - 끝에 다음 단계를 안내한다: "이 zip 으로 okstra 자신을 고치려면 `/okstra-brief` 의 error-feedback variant 로 brief 를 만든 뒤 `okstra-run --task-type error-analysis` 를 okstra 레포에서 실행하세요."
685
+ - 끝에 다음 단계를 안내한다: "이 zip 으로 okstra 자신을 고치려면 `/okstra-brief-gen` 의 error-feedback variant 로 brief 를 만든 뒤 `okstra-run --task-type error-analysis` 를 okstra 레포에서 실행하세요."
686
686
 
687
687
  ---
688
688
 
@@ -7,7 +7,7 @@ source-type: <file | linear | jira | github | notion | url | user-input>
7
7
  task-group: <task-group>
8
8
  depth: 0 # 0=parent/single, 1=child, 2=grandchild, ...
9
9
  created: <YYYY-MM-DD>
10
- generator: okstra-brief
10
+ generator: okstra-brief-gen
11
11
  reporter-confirmations: <complete | partial | pending | skipped> # set by Step 6.5
12
12
  # codebase-scan variant frontmatter (omit for reporter-input briefs):
13
13
  scope: <reporter-input | codebase> # 'codebase' for codebase-scan variant; omit for reporter-input variant
@@ -19,7 +19,7 @@ candidate-cap: 8 # codebase-scan only: 1..12, de
19
19
 
20
20
  # Task Brief: <task_group>/<filename-without-ext>
21
21
 
22
- > Generated: okstra-brief · <YYYY-MM-DD>
22
+ > Generated: okstra-brief-gen · <YYYY-MM-DD>
23
23
  > Source type: <file | linear | jira | github | notion | url | user-input>
24
24
  > Tracker key (if any): <LIN-1234 | PROJ-42 | gh-repo-123 | notion-abcdef12>
25
25
  > Parent brief (child briefs only): <relative path>
@@ -67,6 +67,20 @@ implementation-option: {{ frontmatter.implementationOption | yaml_scalar }}
67
67
  | Approval Required? | `{% if verdictCard.approvalRequired %}yes — {{ t("verdictCard.approvalRequiredSuffix") }}{% else %}no{% endif %}` |
68
68
  | Next Step | {{ verdictCard.nextStep | mdcell }} |
69
69
 
70
+ {% if readerSummary %}
71
+ ## {{ t("readerSummary.heading") }}
72
+
73
+ {{ t("sectionIntro.readerSummary") }}
74
+
75
+ | {{ t("readerSummary.tableHeaderItem") }} | {{ t("readerSummary.tableHeaderValue") }} |
76
+ |------|----|
77
+ | {{ t("readerSummary.decisionLabel") }} | {{ readerSummary.decision | mdcell }} |
78
+ | {{ t("readerSummary.humanActionRequiredLabel") }} | {{ readerSummary.humanActionRequired | mdcell }} |
79
+ | {{ t("readerSummary.blockingItemsLabel") }} | {{ readerSummary.blockingItems | mdcell }} |
80
+ | {{ t("readerSummary.safeToSkipLabel") }} | {{ readerSummary.safeToSkip | mdcell }} |
81
+ | {{ t("readerSummary.recommendedCommandLabel") }} | `{{ readerSummary.recommendedCommand | mdcell }}` |
82
+
83
+ {% endif %}
70
84
  ## {{ t("rationale.heading") }}
71
85
 
72
86
  {{ t("rationale.intro") }}
@@ -44,13 +44,14 @@
44
44
  },
45
45
  "sectionIntro": {
46
46
  "verdictCard": "At-a-glance verdict card — a summary that mirrors the values in `## 7. Final Verdict` and `## 3. Recommended Next Steps`.",
47
- "clarificationCarryIn": "Unresolved `Clarification Items` from the prior report, re-examined against new evidence and carried in with updated status.",
48
- "ticketCoverage": "Summary of the core problems, requirements, and verification targets this run covered.",
49
- "executionStatus": "At-a-glance table of each worker's status, assigned model, and key findings.",
50
- "sourceItemsRule": "The `Source items` column shows which worker items each consensus row was synthesised from, as `<worker>:<item-id>` pairs.",
51
- "planBodyVerification": "Per-item cross-verification of each plan-body item (option, stage, step, dependency, validation, rollback, requirement coverage) for whether it is executable as written and internally consistent. Whether each option actually *solves* the problem (requirement satisfaction) is judged separately under Requirement Coverage, not here.",
52
- "clarificationItems": "Items that need your answer or supporting material before the next step."
53
- },
47
+ "clarificationCarryIn": "Unresolved `Clarification Items` from the prior report, re-examined against new evidence and carried in with updated status.",
48
+ "ticketCoverage": "Summary of the core problems, requirements, and verification targets this run covered.",
49
+ "executionStatus": "At-a-glance table of each worker's status, assigned model, and key findings.",
50
+ "sourceItemsRule": "The `Source items` column shows which worker items each consensus row was synthesised from, as `<worker>:<item-id>` pairs.",
51
+ "planBodyVerification": "Per-item cross-verification of each plan-body item (option, stage, step, dependency, validation, rollback, requirement coverage) for whether it is executable as written and internally consistent. Whether each option actually *solves* the problem (requirement satisfaction) is judged separately under Requirement Coverage, not here.",
52
+ "clarificationItems": "Items that need your answer or supporting material before the next step.",
53
+ "readerSummary": "The shortest reader path: what was decided, what a human must do next, and which audit details can wait until a deeper review."
54
+ },
54
55
  "tokenSummary": {
55
56
  "heading": "Token Usage Summary",
56
57
  "tableHeaderItem": "Item",
@@ -62,11 +63,21 @@
62
63
  "verdictCard": {
63
64
  "tableHeaderLabel": "Item",
64
65
  "tableHeaderValue": "Value",
65
- "approvalRequiredSuffix": "frontmatter `approved` must be `true` to enter `implementation`",
66
- "rationaleLabel": "Rationale summary",
67
- "nextStepLabel": "Next step"
68
- },
69
- "rationale": {
66
+ "approvalRequiredSuffix": "frontmatter `approved` must be `true` to enter `implementation`",
67
+ "rationaleLabel": "Rationale summary",
68
+ "nextStepLabel": "Next step"
69
+ },
70
+ "readerSummary": {
71
+ "heading": "Reader Summary",
72
+ "tableHeaderItem": "Item",
73
+ "tableHeaderValue": "Value",
74
+ "decisionLabel": "Decision",
75
+ "humanActionRequiredLabel": "Human action required",
76
+ "blockingItemsLabel": "Blocking items",
77
+ "safeToSkipLabel": "Safe to skip on first read",
78
+ "recommendedCommandLabel": "Recommended command"
79
+ },
80
+ "rationale": {
70
81
  "heading": "Background and Rationale",
71
82
  "intro": "Why this work, what it changes, and why the chosen approach is sound — written so a reviewer can follow it. Each item cites its evidence (path:line, report ID, etc.).",
72
83
  "motivationLabel": "Why this work",
@@ -44,13 +44,14 @@
44
44
  },
45
45
  "sectionIntro": {
46
46
  "verdictCard": "한눈에 보는 결과 카드 — `## 7. Final Verdict` 와 `## 3. Recommended Next Steps` 의 값을 그대로 옮긴 요약입니다.",
47
- "clarificationCarryIn": "이전 보고서의 미해결 `Clarification Items` 를 새 증거로 재검토해 해소·갱신한 뒤 이어받은 항목입니다.",
48
- "ticketCoverage": "이 run 이 다룬 핵심 문제·요구사항·검증 대상 요약입니다.",
49
- "executionStatus": "각 worker 의 상태·배정 모델·핵심 finding 을 한눈에 보는 표입니다.",
50
- "sourceItemsRule": "`Source items` 열은 이 합의 항목이 어느 워커의 어느 항목에서 합성됐는지를 `<worker>:<item-id>` 형식으로 표기합니다.",
51
- "planBodyVerification": "계획 본문의 각 항목(옵션·스테이지·스텝·의존성·검증·롤백·요구사항 커버리지)이 적힌 대로 실행 가능하고 서로 모순이 없는지 워커들이 항목별로 교차 검증한 결과입니다. 각 옵션이 '문제를 실제로 푸는지'(요구사항 충족)는 여기가 아니라 Requirement Coverage 에서 별도로 판정합니다.",
52
- "clarificationItems": "다음 진행 전에 사용자의 답변이나 자료 첨부가 필요한 항목입니다."
53
- },
47
+ "clarificationCarryIn": "이전 보고서의 미해결 `Clarification Items` 를 새 증거로 재검토해 해소·갱신한 뒤 이어받은 항목입니다.",
48
+ "ticketCoverage": "이 run 이 다룬 핵심 문제·요구사항·검증 대상 요약입니다.",
49
+ "executionStatus": "각 worker 의 상태·배정 모델·핵심 finding 을 한눈에 보는 표입니다.",
50
+ "sourceItemsRule": "`Source items` 열은 이 합의 항목이 어느 워커의 어느 항목에서 합성됐는지를 `<worker>:<item-id>` 형식으로 표기합니다.",
51
+ "planBodyVerification": "계획 본문의 각 항목(옵션·스테이지·스텝·의존성·검증·롤백·요구사항 커버리지)이 적힌 대로 실행 가능하고 서로 모순이 없는지 워커들이 항목별로 교차 검증한 결과입니다. 각 옵션이 '문제를 실제로 푸는지'(요구사항 충족)는 여기가 아니라 Requirement Coverage 에서 별도로 판정합니다.",
52
+ "clarificationItems": "다음 진행 전에 사용자의 답변이나 자료 첨부가 필요한 항목입니다.",
53
+ "readerSummary": "가장 짧은 읽기 경로입니다. 무엇이 결정됐는지, 사람이 다음에 무엇을 해야 하는지, 어떤 감사 세부사항은 나중에 봐도 되는지 먼저 보여줍니다."
54
+ },
54
55
  "tokenSummary": {
55
56
  "heading": "토큰 사용량 요약",
56
57
  "tableHeaderItem": "항목",
@@ -62,11 +63,21 @@
62
63
  "verdictCard": {
63
64
  "tableHeaderLabel": "항목",
64
65
  "tableHeaderValue": "값",
65
- "approvalRequiredSuffix": "frontmatter `approved` 가 `true` 여야 `implementation` 진입 가능",
66
- "rationaleLabel": "근거 요약",
67
- "nextStepLabel": "다음 단계"
68
- },
69
- "rationale": {
66
+ "approvalRequiredSuffix": "frontmatter `approved` 가 `true` 여야 `implementation` 진입 가능",
67
+ "rationaleLabel": "근거 요약",
68
+ "nextStepLabel": "다음 단계"
69
+ },
70
+ "readerSummary": {
71
+ "heading": "Reader Summary",
72
+ "tableHeaderItem": "항목",
73
+ "tableHeaderValue": "값",
74
+ "decisionLabel": "Decision",
75
+ "humanActionRequiredLabel": "Human action required",
76
+ "blockingItemsLabel": "Blocking items",
77
+ "safeToSkipLabel": "Safe to skip on first read",
78
+ "recommendedCommandLabel": "Recommended command"
79
+ },
80
+ "rationale": {
70
81
  "heading": "작업 배경과 근거",
71
82
  "intro": "이 작업을 왜·무엇을·왜 그렇게 하는지 검토자가 따라갈 수 있도록 정리한다. 각 항목은 근거(파일:줄, 보고서 ID 등)를 인용한다.",
72
83
  "motivationLabel": "왜 이 작업을 하는가",
@@ -73,6 +73,61 @@ nav.toc li.toc-h3 { padding-left: 1.2em; font-size: 0.92em; }
73
73
  nav.toc a { color: inherit; text-decoration: none; }
74
74
  nav.toc a:hover { text-decoration: underline; }
75
75
 
76
+ .reader-dashboard {
77
+ margin: 0 0 1.5rem;
78
+ padding: 0.9rem 1rem;
79
+ border: 1px solid color-mix(in srgb, Highlight 45%, transparent);
80
+ border-radius: 6px;
81
+ background: color-mix(in srgb, Highlight 8%, Canvas);
82
+ }
83
+ .reader-dashboard-head {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: 1rem;
88
+ margin-bottom: 0.8rem;
89
+ }
90
+ .reader-dashboard h2 {
91
+ margin: 0;
92
+ border-bottom: none;
93
+ padding-bottom: 0;
94
+ }
95
+ .reader-mode-controls {
96
+ display: flex;
97
+ flex-wrap: wrap;
98
+ gap: 0.35rem;
99
+ }
100
+ .reader-mode-controls button[aria-pressed="true"] {
101
+ background: Highlight;
102
+ color: HighlightText;
103
+ border-color: Highlight;
104
+ }
105
+ .reader-summary-grid {
106
+ display: grid;
107
+ grid-template-columns: minmax(12ch, 0.28fr) 1fr;
108
+ gap: 0.45rem 0.9rem;
109
+ margin: 0;
110
+ }
111
+ .reader-summary-grid dt {
112
+ font-weight: 600;
113
+ color: color-mix(in srgb, CanvasText 72%, transparent);
114
+ }
115
+ .reader-summary-grid dd { margin: 0; }
116
+
117
+ html[data-reader-mode="action"] main > [data-reader-section="audit"],
118
+ html[data-reader-mode="action"] main > [data-reader-section="detail"] {
119
+ display: none;
120
+ }
121
+ html[data-reader-mode="audit"] main > [data-reader-section="detail"] {
122
+ display: none;
123
+ }
124
+
125
+ @media (max-width: 70ch) {
126
+ .reader-dashboard-head { align-items: flex-start; flex-direction: column; }
127
+ .reader-summary-grid { grid-template-columns: 1fr; }
128
+ .reader-summary-grid dt { margin-top: 0.45rem; }
129
+ }
130
+
76
131
  h1, h2, h3, h4, h5, h6 { line-height: 1.25; margin-top: 1.6em; margin-bottom: 0.4em; }
77
132
  h1 { font-size: 1.7rem; }
78
133
  h2 { font-size: 1.35rem; border-bottom: 1px solid GrayText; padding-bottom: 0.2em; }
@@ -230,6 +230,50 @@
230
230
  showDismiss(false);
231
231
  }
232
232
 
233
+ function readerSectionKind(text) {
234
+ if (/Reader Summary|Verdict Card|Clarification Items|Recommended Next Steps|Follow-up Tasks/.test(text)) {
235
+ return "action";
236
+ }
237
+ if (/Evidence|Cross Verification|Execution Status|Token Usage|Plan Body Verification|Round History/.test(text)) {
238
+ return "audit";
239
+ }
240
+ return "detail";
241
+ }
242
+
243
+ function markReaderSections() {
244
+ var main = document.querySelector("main");
245
+ if (!main) return;
246
+ var current = "action";
247
+ var nodes = main.children;
248
+ for (var i = 0; i < nodes.length; i++) {
249
+ var node = nodes[i];
250
+ if (node.classList && node.classList.contains("reader-dashboard")) {
251
+ node.setAttribute("data-reader-section", "action");
252
+ current = "action";
253
+ continue;
254
+ }
255
+ if (/^H[12]$/.test(node.tagName || "")) {
256
+ current = readerSectionKind(node.textContent || "");
257
+ }
258
+ node.setAttribute("data-reader-section", current);
259
+ }
260
+ }
261
+
262
+ function setReaderMode(mode) {
263
+ if (mode !== "action" && mode !== "audit" && mode !== "full") {
264
+ mode = "action";
265
+ }
266
+ document.documentElement.setAttribute("data-reader-mode", mode);
267
+ var buttons = document.querySelectorAll('button[data-action="set-reader-mode"]');
268
+ for (var i = 0; i < buttons.length; i++) {
269
+ var btn = buttons[i];
270
+ btn.setAttribute(
271
+ "aria-pressed",
272
+ btn.getAttribute("data-reader-mode") === mode ? "true" : "false"
273
+ );
274
+ }
275
+ }
276
+
233
277
  function bind() {
234
278
  var clickables = document.querySelectorAll("button[data-action]");
235
279
  for (var i = 0; i < clickables.length; i++) {
@@ -241,8 +285,15 @@
241
285
  btn.addEventListener("click", copyUserResponse);
242
286
  } else if (action === "dismiss-user-response") {
243
287
  btn.addEventListener("click", dismissUserResponse);
288
+ } else if (action === "set-reader-mode") {
289
+ btn.addEventListener("click", function (event) {
290
+ setReaderMode(event.currentTarget.getAttribute("data-reader-mode"));
291
+ });
244
292
  }
245
-
293
+ }
294
+ markReaderSections();
295
+ if (document.querySelector('button[data-action="set-reader-mode"]')) {
296
+ setReaderMode("action");
246
297
  }
247
298
  bindOtherInputToggle();
248
299
  }
@@ -259,6 +310,7 @@
259
310
  collectEntries: collectEntries,
260
311
  collectApproval: collectApproval,
261
312
  exportUserResponse: exportUserResponse,
313
+ setReaderMode: setReaderMode,
262
314
  };
263
315
  }
264
316
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Validate brief markdown files produced by the okstra-brief skill.
2
+ """Validate brief markdown files produced by the okstra-brief-gen skill.
3
3
 
4
4
  Checks performed per brief file:
5
5
 
@@ -34,7 +34,7 @@ Checks performed per brief file:
34
34
  non-empty and Priority Lenses lists 1–4 values from the lens whitelist
35
35
  (`scripts/okstra_ctl/improvement_lenses.py` SSOT).
36
36
  12. When present, `Related Task Graph` is a markdown table with the canonical
37
- columns and relation/direction values from the okstra-brief contract.
37
+ columns and relation/direction values from the okstra-brief-gen contract.
38
38
  13. The requirement/objective section `## Desired Outcome` (required in every
39
39
  brief variant) exists and its body is not blank. `_(none)_` stays valid.
40
40
 
@@ -406,7 +406,7 @@ def check_requirement_section(text: str, errors: list[str]) -> None:
406
406
  """The requirement/objective section must exist and carry a non-blank body.
407
407
 
408
408
  `## Desired Outcome` is the "shape of success" required by every brief
409
- variant (okstra-brief SKILL.md Step 5 §"Required sections by variant").
409
+ variant (okstra-brief-gen SKILL.md Step 5 §"Required sections by variant").
410
410
  Without this check a brief that drops the heading — or wipes its body —
411
411
  still passes, letting implementation-planning report 100% Requirement
412
412
  Coverage against an empty objective. `_(none)_` stays valid: it is the
@@ -464,9 +464,9 @@ def validate_brief(path: Path, briefs_root: Path) -> list[str]:
464
464
  if fm.get("type") != "brief":
465
465
  errors.append(f"frontmatter type must be 'brief', got {fm.get('type')!r}")
466
466
 
467
- if fm.get("generator") != "okstra-brief":
467
+ if fm.get("generator") != "okstra-brief-gen":
468
468
  errors.append(
469
- f"frontmatter generator must be 'okstra-brief', got {fm.get('generator')!r}"
469
+ f"frontmatter generator must be 'okstra-brief-gen', got {fm.get('generator')!r}"
470
470
  )
471
471
 
472
472
  if fm.get("reporter-confirmations") not in REPORTER_CONFIRMATION_VALUES:
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  #
3
- # Validate brief markdown files produced by okstra-brief.
3
+ # Validate brief markdown files produced by okstra-brief-gen.
4
4
  #
5
5
  # Usage:
6
6
  # validators/validate-brief.sh <briefs-dir> [--briefs-root <dir>]
@@ -10,13 +10,14 @@ import {
10
10
  const FALLBACK_SKILL_NAMES = [
11
11
  "okstra",
12
12
  "okstra-setup",
13
- "okstra-brief",
13
+ "okstra-brief-gen",
14
14
  "okstra-run",
15
15
  "okstra-memory",
16
16
  "okstra-inspect",
17
17
  "okstra-schedule",
18
18
  "okstra-container-build",
19
19
  "okstra-container",
20
+ "okstra-brief",
20
21
  "okstra-context-loader",
21
22
  "okstra-team-contract",
22
23
  "okstra-convergence",
@@ -6,7 +6,7 @@
6
6
 
7
7
  export const USER_SKILL_NAMES = Object.freeze([
8
8
  "okstra-setup",
9
- "okstra-brief",
9
+ "okstra-brief-gen",
10
10
  "okstra-run",
11
11
  "okstra-manager",
12
12
  "okstra-memory",
@@ -29,6 +29,7 @@ export const OBSOLETE_SKILL_NAMES = Object.freeze([
29
29
  "okstra-report-writer",
30
30
  "okstra-coding-preflight",
31
31
  "okstra-container",
32
+ "okstra-brief",
32
33
  ]);
33
34
 
34
35
  export function userSkillNames() {
@@ -1,41 +0,0 @@
1
- import networkx as nx
2
- from networkx.algorithms.approximation import average_clustering
3
-
4
- # This approximation has to be exact in regular graphs
5
- # with no triangles or with all possible triangles.
6
-
7
-
8
- def test_petersen():
9
- # Actual coefficient is 0
10
- G = nx.petersen_graph()
11
- assert average_clustering(G, trials=len(G) // 2) == nx.average_clustering(G)
12
-
13
-
14
- def test_petersen_seed():
15
- # Actual coefficient is 0
16
- G = nx.petersen_graph()
17
- assert average_clustering(G, trials=len(G) // 2, seed=1) == nx.average_clustering(G)
18
-
19
-
20
- def test_tetrahedral():
21
- # Actual coefficient is 1
22
- G = nx.tetrahedral_graph()
23
- assert average_clustering(G, trials=len(G) // 2) == nx.average_clustering(G)
24
-
25
-
26
- def test_dodecahedral():
27
- # Actual coefficient is 0
28
- G = nx.dodecahedral_graph()
29
- assert average_clustering(G, trials=len(G) // 2) == nx.average_clustering(G)
30
-
31
-
32
- def test_empty():
33
- G = nx.empty_graph(5)
34
- assert average_clustering(G, trials=len(G) // 2) == 0
35
-
36
-
37
- def test_complete():
38
- G = nx.complete_graph(5)
39
- assert average_clustering(G, trials=len(G) // 2) == 1
40
- G = nx.complete_graph(7)
41
- assert average_clustering(G, trials=len(G) // 2) == 1
@@ -1,112 +0,0 @@
1
- """Unit tests for the :mod:`networkx.algorithms.approximation.clique` module."""
2
-
3
- import networkx as nx
4
- from networkx.algorithms.approximation import (
5
- clique_removal,
6
- large_clique_size,
7
- max_clique,
8
- maximum_independent_set,
9
- )
10
-
11
-
12
- def is_independent_set(G, nodes):
13
- """Returns True if and only if `nodes` is a clique in `G`.
14
-
15
- `G` is a NetworkX graph. `nodes` is an iterable of nodes in
16
- `G`.
17
-
18
- """
19
- return G.subgraph(nodes).number_of_edges() == 0
20
-
21
-
22
- def is_clique(G, nodes):
23
- """Returns True if and only if `nodes` is an independent set
24
- in `G`.
25
-
26
- `G` is an undirected simple graph. `nodes` is an iterable of
27
- nodes in `G`.
28
-
29
- """
30
- H = G.subgraph(nodes)
31
- n = len(H)
32
- return H.number_of_edges() == n * (n - 1) // 2
33
-
34
-
35
- class TestCliqueRemoval:
36
- """Unit tests for the
37
- :func:`~networkx.algorithms.approximation.clique_removal` function.
38
-
39
- """
40
-
41
- def test_trivial_graph(self):
42
- G = nx.trivial_graph()
43
- independent_set, cliques = clique_removal(G)
44
- assert is_independent_set(G, independent_set)
45
- assert all(is_clique(G, clique) for clique in cliques)
46
- # In fact, we should only have 1-cliques, that is, singleton nodes.
47
- assert all(len(clique) == 1 for clique in cliques)
48
-
49
- def test_complete_graph(self):
50
- G = nx.complete_graph(10)
51
- independent_set, cliques = clique_removal(G)
52
- assert is_independent_set(G, independent_set)
53
- assert all(is_clique(G, clique) for clique in cliques)
54
-
55
- def test_barbell_graph(self):
56
- G = nx.barbell_graph(10, 5)
57
- independent_set, cliques = clique_removal(G)
58
- assert is_independent_set(G, independent_set)
59
- assert all(is_clique(G, clique) for clique in cliques)
60
-
61
-
62
- class TestMaxClique:
63
- """Unit tests for the :func:`networkx.algorithms.approximation.max_clique`
64
- function.
65
-
66
- """
67
-
68
- def test_null_graph(self):
69
- G = nx.null_graph()
70
- assert len(max_clique(G)) == 0
71
-
72
- def test_complete_graph(self):
73
- graph = nx.complete_graph(30)
74
- # this should return the entire graph
75
- mc = max_clique(graph)
76
- assert 30 == len(mc)
77
-
78
- def test_maximal_by_cardinality(self):
79
- """Tests that the maximal clique is computed according to maximum
80
- cardinality of the sets.
81
-
82
- For more information, see pull request #1531.
83
-
84
- """
85
- G = nx.complete_graph(5)
86
- G.add_edge(4, 5)
87
- clique = max_clique(G)
88
- assert len(clique) > 1
89
-
90
- G = nx.lollipop_graph(30, 2)
91
- clique = max_clique(G)
92
- assert len(clique) > 2
93
-
94
-
95
- def test_large_clique_size():
96
- G = nx.complete_graph(9)
97
- nx.add_cycle(G, [9, 10, 11])
98
- G.add_edge(8, 9)
99
- G.add_edge(1, 12)
100
- G.add_node(13)
101
-
102
- assert large_clique_size(G) == 9
103
- G.remove_node(5)
104
- assert large_clique_size(G) == 8
105
- G.remove_edge(2, 3)
106
- assert large_clique_size(G) == 7
107
-
108
-
109
- def test_independent_set():
110
- # smoke test
111
- G = nx.Graph()
112
- assert len(maximum_independent_set(G)) == 0