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.
- package/README.kr.md +2 -2
- package/README.md +2 -2
- package/docs/for-ai/README.md +2 -2
- package/docs/for-ai/skills/{okstra-brief.md → okstra-brief-gen.md} +3 -3
- package/docs/for-ai/skills/okstra-inspect.md +1 -1
- package/docs/kr/architecture.md +11 -11
- package/docs/kr/cli.md +1 -1
- package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
- package/docs/project-structure-overview.md +2 -2
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/report-writer-worker.md +1 -0
- package/runtime/prompts/lead/context-loader.md +2 -2
- package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +3 -3
- package/runtime/prompts/profiles/implementation-planning.md +1 -1
- package/runtime/prompts/profiles/requirements-discovery.md +2 -2
- package/runtime/python/okstra_ctl/fix_cycles.py +1 -1
- package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
- package/runtime/python/okstra_ctl/report_views.py +151 -12
- package/runtime/python/okstra_ctl/run.py +24 -24
- package/runtime/python/okstra_ctl/wizard.py +3 -3
- package/runtime/python/okstra_ctl/worktree.py +1 -1
- package/runtime/python/okstra_token_usage/claude.py +58 -19
- package/runtime/python/okstra_token_usage/collect.py +3 -1
- package/runtime/python/okstra_vendor/__init__.py +3 -0
- package/runtime/schemas/final-report-v1.0.schema.json +20 -0
- package/runtime/skills/{okstra-brief → okstra-brief-gen}/SKILL.md +6 -6
- package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/reporter-confirmations.md +1 -1
- package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/tracker-recursion.md +1 -1
- package/runtime/skills/okstra-inspect/SKILL.md +2 -2
- package/runtime/templates/reports/brief.template.md +2 -2
- package/runtime/templates/reports/final-report.template.md +14 -0
- package/runtime/templates/reports/i18n/en.json +23 -12
- package/runtime/templates/reports/i18n/ko.json +23 -12
- package/runtime/templates/reports/report.css +55 -0
- package/runtime/templates/reports/report.js +53 -1
- package/runtime/validators/validate-brief.py +5 -5
- package/runtime/validators/validate-brief.sh +1 -1
- package/src/commands/lifecycle/uninstall.mjs +2 -1
- package/src/lib/skill-catalog.mjs +2 -1
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
- package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
- package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
- package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
- package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
- package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
- package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
- package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
- package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
- package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
- package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
- package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
- package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
- package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
- package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
- 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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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:
|
|
@@ -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() {
|
|
File without changes
|
|
@@ -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
|