mustflow 2.58.1 → 2.68.6

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 (47) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/commands/context.js +81 -6
  3. package/dist/cli/commands/quality.js +89 -0
  4. package/dist/cli/commands/skill.js +116 -0
  5. package/dist/cli/i18n/en.js +16 -0
  6. package/dist/cli/i18n/es.js +16 -0
  7. package/dist/cli/i18n/fr.js +16 -0
  8. package/dist/cli/i18n/hi.js +16 -0
  9. package/dist/cli/i18n/ko.js +16 -0
  10. package/dist/cli/i18n/zh.js +16 -0
  11. package/dist/cli/index.js +1 -0
  12. package/dist/cli/lib/agent-context.js +981 -8
  13. package/dist/cli/lib/command-registry.js +12 -0
  14. package/dist/cli/lib/local-index/constants.js +4 -5
  15. package/dist/cli/lib/local-index/freshness.js +5 -1
  16. package/dist/cli/lib/local-index/index.js +1 -1
  17. package/dist/cli/lib/repo-map.js +7 -1
  18. package/dist/cli/lib/validation/constants.js +3 -0
  19. package/dist/cli/lib/validation/index.js +41 -2
  20. package/dist/core/check-issues.js +5 -0
  21. package/dist/core/prompt-cache-rendering.js +19 -0
  22. package/dist/core/public-json-contracts.js +35 -0
  23. package/dist/core/quality-gaming.js +304 -0
  24. package/dist/core/skill-route-fixtures.js +173 -0
  25. package/dist/core/skill-route-resolution.js +398 -0
  26. package/dist/core/source-anchors.js +91 -5
  27. package/package.json +1 -1
  28. package/schemas/README.md +9 -1
  29. package/schemas/context-report.schema.json +442 -0
  30. package/schemas/quality-gaming-report.schema.json +96 -0
  31. package/schemas/route-fixture.schema.json +57 -0
  32. package/schemas/skill-route-report.schema.json +242 -0
  33. package/templates/default/common/.mustflow/config/commands.toml +34 -2
  34. package/templates/default/common/.mustflow/config/mustflow.toml +16 -10
  35. package/templates/default/i18n.toml +14 -8
  36. package/templates/default/locales/en/.mustflow/context/PROJECT.md +5 -3
  37. package/templates/default/locales/en/.mustflow/docs/agent-workflow.md +13 -9
  38. package/templates/default/locales/en/.mustflow/skills/INDEX.md +3 -2
  39. package/templates/default/locales/en/.mustflow/skills/llm-token-cost-control-review/SKILL.md +5 -2
  40. package/templates/default/locales/en/.mustflow/skills/quality-gaming-guard/SKILL.md +165 -0
  41. package/templates/default/locales/en/.mustflow/skills/router.toml +67 -0
  42. package/templates/default/locales/en/.mustflow/skills/routes.toml +6 -0
  43. package/templates/default/locales/en/AGENTS.md +15 -7
  44. package/templates/default/locales/ko/.mustflow/context/PROJECT.md +4 -2
  45. package/templates/default/locales/ko/.mustflow/docs/agent-workflow.md +18 -12
  46. package/templates/default/locales/ko/AGENTS.md +8 -6
  47. package/templates/default/manifest.toml +9 -1
@@ -0,0 +1,96 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/quality-gaming-report.schema.json",
4
+ "title": "mustflow quality-gaming report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "command",
10
+ "mode",
11
+ "scope",
12
+ "ok",
13
+ "mustflow_root",
14
+ "git_tracked",
15
+ "checked_files",
16
+ "risk_count",
17
+ "risky_files",
18
+ "issues"
19
+ ],
20
+ "properties": {
21
+ "schema_version": { "const": "1" },
22
+ "command": { "const": "quality" },
23
+ "mode": { "const": "check" },
24
+ "scope": { "enum": ["changed", "tracked"] },
25
+ "ok": { "type": "boolean" },
26
+ "mustflow_root": { "type": "string" },
27
+ "git_tracked": { "type": "boolean" },
28
+ "checked_files": { "type": "integer", "minimum": 0 },
29
+ "risk_count": { "type": "integer", "minimum": 0 },
30
+ "risky_files": {
31
+ "type": "array",
32
+ "items": { "$ref": "#/$defs/riskyFile" }
33
+ },
34
+ "issues": {
35
+ "type": "array",
36
+ "items": { "type": "string" }
37
+ }
38
+ },
39
+ "$defs": {
40
+ "metric": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["name", "value", "threshold"],
44
+ "properties": {
45
+ "name": { "type": "string" },
46
+ "value": { "type": "number" },
47
+ "threshold": { "type": "number" }
48
+ }
49
+ },
50
+ "risk": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["code", "severity", "path", "line", "detail", "metric"],
54
+ "properties": {
55
+ "code": {
56
+ "enum": [
57
+ "line_stuffing_added",
58
+ "multiple_statements_per_line_added",
59
+ "suppression_added",
60
+ "type_escape_added",
61
+ "test_bypass_marker_added",
62
+ "placeholder_added",
63
+ "empty_catch_swallow_added",
64
+ "generated_or_vendor_logic_added",
65
+ "large_helper_container_added"
66
+ ]
67
+ },
68
+ "severity": { "enum": ["medium", "high", "critical"] },
69
+ "path": { "type": "string" },
70
+ "line": { "type": ["integer", "null"], "minimum": 1 },
71
+ "detail": { "type": "string" },
72
+ "metric": {
73
+ "anyOf": [
74
+ { "$ref": "#/$defs/metric" },
75
+ { "type": "null" }
76
+ ]
77
+ }
78
+ }
79
+ },
80
+ "riskyFile": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "required": ["path", "checked_lines", "risk_count", "risks"],
84
+ "properties": {
85
+ "path": { "type": "string" },
86
+ "checked_lines": { "type": "integer", "minimum": 0 },
87
+ "risk_count": { "type": "integer", "minimum": 1 },
88
+ "risks": {
89
+ "type": "array",
90
+ "items": { "$ref": "#/$defs/risk" },
91
+ "minItems": 1
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/route-fixture.schema.json",
4
+ "title": "mustflow skill route fixture",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "cases"],
8
+ "properties": {
9
+ "schema_version": { "const": "1" },
10
+ "cases": {
11
+ "type": "array",
12
+ "items": { "$ref": "#/$defs/case" }
13
+ }
14
+ },
15
+ "$defs": {
16
+ "nonEmptyString": {
17
+ "type": "string",
18
+ "minLength": 1
19
+ },
20
+ "nonEmptyStringArray": {
21
+ "type": "array",
22
+ "minItems": 1,
23
+ "items": { "$ref": "#/$defs/nonEmptyString" }
24
+ },
25
+ "case": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["id", "paths", "reasons"],
29
+ "anyOf": [
30
+ { "required": ["required_main"] },
31
+ { "required": ["required_candidates"] },
32
+ { "required": ["required_adjuncts"] },
33
+ { "required": ["forbidden_candidates"] }
34
+ ],
35
+ "properties": {
36
+ "id": { "$ref": "#/$defs/nonEmptyString" },
37
+ "task": {
38
+ "oneOf": [
39
+ { "$ref": "#/$defs/nonEmptyString" },
40
+ { "type": "null" }
41
+ ]
42
+ },
43
+ "paths": { "$ref": "#/$defs/nonEmptyStringArray" },
44
+ "reasons": { "$ref": "#/$defs/nonEmptyStringArray" },
45
+ "max_candidates": {
46
+ "type": "integer",
47
+ "minimum": 1,
48
+ "maximum": 10
49
+ },
50
+ "required_main": { "$ref": "#/$defs/nonEmptyString" },
51
+ "required_candidates": { "$ref": "#/$defs/nonEmptyStringArray" },
52
+ "required_adjuncts": { "$ref": "#/$defs/nonEmptyStringArray" },
53
+ "forbidden_candidates": { "$ref": "#/$defs/nonEmptyStringArray" }
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,242 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://mustflow.github.io/schemas/skill-route-report.schema.json",
4
+ "title": "mustflow skill route report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "kind",
10
+ "input",
11
+ "signals",
12
+ "selected",
13
+ "candidates",
14
+ "source_files",
15
+ "gap_notes",
16
+ "command",
17
+ "action"
18
+ ],
19
+ "properties": {
20
+ "schema_version": { "const": "1" },
21
+ "kind": { "const": "skill_route_resolution" },
22
+ "command": { "const": "skill" },
23
+ "action": { "const": "route" },
24
+ "input": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["task_text_present", "paths", "reasons", "max_candidates"],
28
+ "properties": {
29
+ "task_text_present": { "type": "boolean" },
30
+ "paths": {
31
+ "type": "array",
32
+ "items": { "type": "string" }
33
+ },
34
+ "reasons": {
35
+ "type": "array",
36
+ "items": { "type": "string" }
37
+ },
38
+ "max_candidates": {
39
+ "type": "integer",
40
+ "minimum": 1,
41
+ "maximum": 10
42
+ }
43
+ }
44
+ },
45
+ "signals": {
46
+ "type": "object",
47
+ "additionalProperties": false,
48
+ "required": ["task_terms", "path_terms", "reasons", "read_shards"],
49
+ "properties": {
50
+ "task_terms": {
51
+ "type": "array",
52
+ "items": { "type": "string" }
53
+ },
54
+ "path_terms": {
55
+ "type": "array",
56
+ "items": { "type": "string" }
57
+ },
58
+ "reasons": {
59
+ "type": "array",
60
+ "items": { "type": "string" }
61
+ },
62
+ "read_shards": {
63
+ "type": "array",
64
+ "items": { "type": "string" }
65
+ }
66
+ }
67
+ },
68
+ "selected": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["main", "adjuncts"],
72
+ "properties": {
73
+ "main": {
74
+ "oneOf": [
75
+ { "$ref": "#/$defs/candidate" },
76
+ { "type": "null" }
77
+ ]
78
+ },
79
+ "adjuncts": {
80
+ "type": "array",
81
+ "items": { "$ref": "#/$defs/candidate" }
82
+ }
83
+ }
84
+ },
85
+ "candidates": {
86
+ "type": "array",
87
+ "items": { "$ref": "#/$defs/candidate" }
88
+ },
89
+ "read_plan": {
90
+ "type": "object",
91
+ "additionalProperties": false,
92
+ "required": [
93
+ "selection_limits",
94
+ "stable_kernel",
95
+ "selected_skill_paths",
96
+ "candidate_skill_paths",
97
+ "fallback_route_metadata",
98
+ "expanded_index",
99
+ "avoid_by_default",
100
+ "notes"
101
+ ],
102
+ "properties": {
103
+ "selection_limits": {
104
+ "type": "object",
105
+ "additionalProperties": false,
106
+ "required": ["candidates", "main", "adjuncts"],
107
+ "properties": {
108
+ "candidates": {
109
+ "type": "integer",
110
+ "minimum": 1,
111
+ "maximum": 10
112
+ },
113
+ "main": {
114
+ "type": "integer",
115
+ "minimum": 1,
116
+ "maximum": 1
117
+ },
118
+ "adjuncts": {
119
+ "type": "integer",
120
+ "minimum": 0,
121
+ "maximum": 2
122
+ }
123
+ }
124
+ },
125
+ "stable_kernel": {
126
+ "type": "array",
127
+ "items": { "type": "string" }
128
+ },
129
+ "selected_skill_paths": {
130
+ "type": "array",
131
+ "items": { "type": "string" }
132
+ },
133
+ "candidate_skill_paths": {
134
+ "type": "array",
135
+ "items": { "type": "string" }
136
+ },
137
+ "fallback_route_metadata": { "$ref": "#/$defs/readPlanFile" },
138
+ "expanded_index": { "$ref": "#/$defs/readPlanFile" },
139
+ "avoid_by_default": {
140
+ "type": "array",
141
+ "items": { "type": "string" }
142
+ },
143
+ "notes": {
144
+ "type": "array",
145
+ "items": { "type": "string" }
146
+ }
147
+ }
148
+ },
149
+ "source_files": {
150
+ "type": "array",
151
+ "items": { "type": "string" }
152
+ },
153
+ "gap_notes": {
154
+ "type": "array",
155
+ "items": { "type": "string" }
156
+ }
157
+ },
158
+ "$defs": {
159
+ "candidate": {
160
+ "type": "object",
161
+ "additionalProperties": false,
162
+ "required": [
163
+ "skill",
164
+ "skill_path",
165
+ "trigger",
166
+ "category",
167
+ "route_type",
168
+ "priority",
169
+ "applies_to_reasons",
170
+ "score",
171
+ "score_breakdown",
172
+ "selection_reasons",
173
+ "verification_intents"
174
+ ],
175
+ "properties": {
176
+ "skill": { "type": "string" },
177
+ "skill_path": { "type": "string" },
178
+ "trigger": { "type": "string" },
179
+ "category": {
180
+ "type": ["string", "null"],
181
+ "enum": [
182
+ "bug_failure",
183
+ "general_code",
184
+ "tests",
185
+ "docs_release",
186
+ "security_privacy",
187
+ "data_external",
188
+ "ui_assets",
189
+ "architecture_patterns",
190
+ "workflow_contracts",
191
+ null
192
+ ]
193
+ },
194
+ "route_type": { "type": "string" },
195
+ "priority": { "type": "integer" },
196
+ "applies_to_reasons": {
197
+ "type": "array",
198
+ "items": { "type": "string" }
199
+ },
200
+ "score": { "type": "number" },
201
+ "score_breakdown": {
202
+ "type": "object",
203
+ "additionalProperties": false,
204
+ "required": [
205
+ "reason_match",
206
+ "task_text_match",
207
+ "path_match",
208
+ "route_type_weight",
209
+ "priority_weight"
210
+ ],
211
+ "properties": {
212
+ "reason_match": { "type": "number" },
213
+ "task_text_match": { "type": "number" },
214
+ "path_match": { "type": "number" },
215
+ "route_type_weight": { "type": "number" },
216
+ "priority_weight": { "type": "number" }
217
+ }
218
+ },
219
+ "selection_reasons": {
220
+ "type": "array",
221
+ "items": { "type": "string" }
222
+ },
223
+ "verification_intents": {
224
+ "type": "array",
225
+ "items": { "type": "string" }
226
+ }
227
+ }
228
+ },
229
+ "readPlanFile": {
230
+ "type": "object",
231
+ "additionalProperties": false,
232
+ "required": ["path", "read_when"],
233
+ "properties": {
234
+ "path": { "type": "string" },
235
+ "read_when": {
236
+ "type": "array",
237
+ "items": { "type": "string" }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
@@ -127,6 +127,38 @@ network = false
127
127
  destructive = false
128
128
  required_after = ["line_ending_warning", "formatting_change"]
129
129
 
130
+ [intents.quality_gaming_check]
131
+ status = "configured"
132
+ kind = "mustflow_builtin"
133
+ lifecycle = "oneshot"
134
+ run_policy = "agent_allowed"
135
+ description = "Inspect changed files for AI quality-gaming patterns."
136
+ argv = ["mf", "quality", "check", "--json"]
137
+ cwd = "."
138
+ timeout_seconds = 120
139
+ stdin = "closed"
140
+ success_exit_codes = [0]
141
+ writes = []
142
+ network = false
143
+ destructive = false
144
+ required_after = ["code_change", "behavior_change", "test_change", "public_api_change", "performance_change", "unknown_change"]
145
+
146
+ [intents.prompt_cache_audit]
147
+ status = "configured"
148
+ kind = "mustflow_builtin"
149
+ lifecycle = "oneshot"
150
+ run_policy = "agent_allowed"
151
+ description = "Measure prompt-cache profile sizes and configured budget status read-only."
152
+ argv = ["mf", "context", "--json", "--cache-profile", "all", "--cache-audit"]
153
+ cwd = "."
154
+ timeout_seconds = 120
155
+ stdin = "closed"
156
+ success_exit_codes = [0]
157
+ writes = []
158
+ network = false
159
+ destructive = false
160
+ required_after = ["mustflow_config_change", "mustflow_docs_change", "public_api_change", "performance_change", "unknown_change"]
161
+
130
162
  [intents.line_endings_normalize]
131
163
  status = "manual_only"
132
164
  description = "Normalize tracked text files to the repository line-ending policy."
@@ -234,8 +266,8 @@ status = "configured"
234
266
  kind = "mustflow_builtin"
235
267
  lifecycle = "oneshot"
236
268
  run_policy = "agent_allowed"
237
- description = "Create or refresh the generated mustflow SQLite local index."
238
- argv = ["mf", "index"]
269
+ description = "Create or refresh the generated mustflow SQLite local index, including bounded source anchors."
270
+ argv = ["mf", "index", "--source"]
239
271
  cwd = "."
240
272
  timeout_seconds = 300
241
273
  stdin = "closed"
@@ -8,10 +8,12 @@ read_order = [
8
8
  ".mustflow/config/commands.toml",
9
9
  ".mustflow/config/preferences.toml",
10
10
  ".mustflow/config/technology.toml",
11
- ".mustflow/skills/INDEX.md",
11
+ ".mustflow/skills/router.toml",
12
12
  ]
13
13
  optional_read_order = [
14
14
  ".mustflow/context/INDEX.md",
15
+ ".mustflow/skills/routes.toml",
16
+ ".mustflow/skills/INDEX.md",
15
17
  "REPO_MAP.md",
16
18
  ]
17
19
 
@@ -19,6 +21,8 @@ optional_read_order = [
19
21
  primary_instruction = "AGENTS.md"
20
22
  repository_map = "REPO_MAP.md"
21
23
  skill_index = ".mustflow/skills/INDEX.md"
24
+ skill_router = ".mustflow/skills/router.toml"
25
+ skill_routes = ".mustflow/skills/routes.toml"
22
26
  command_contract = ".mustflow/config/commands.toml"
23
27
  workflow_preferences = ".mustflow/config/preferences.toml"
24
28
  technology_preferences = ".mustflow/config/technology.toml"
@@ -38,6 +42,8 @@ anchor_files = [
38
42
  ".mustflow/config/commands.toml",
39
43
  ".mustflow/config/preferences.toml",
40
44
  ".mustflow/config/technology.toml",
45
+ ".mustflow/skills/router.toml",
46
+ ".mustflow/skills/routes.toml",
41
47
  ".mustflow/skills/INDEX.md",
42
48
  "README.md",
43
49
  "PROJECT.md",
@@ -130,25 +136,24 @@ stable_prefix_policy = "hash_verified"
130
136
  prefer_references_when_unchanged = true
131
137
  exclude_volatile_state_from_prefix = true
132
138
  include_content_hashes = true
133
- max_stable_prefix_kb = 96
139
+ max_stable_prefix_kb = 48
134
140
  max_task_context_kb = 48
135
141
  max_volatile_suffix_kb = 24
136
142
 
137
143
  [prompt_cache.layers.stable]
144
+ target_kb = 32
138
145
  read = [
139
146
  "AGENTS.md",
140
- ".mustflow/docs/agent-workflow.md",
141
- ".mustflow/config/mustflow.toml",
142
- ".mustflow/config/commands.toml",
143
- ".mustflow/config/technology.toml",
144
- ".mustflow/skills/INDEX.md",
147
+ ".mustflow/skills/router.toml",
145
148
  ]
146
149
 
147
150
  [prompt_cache.layers.task]
148
151
  read_policy = "task_relevant_only"
149
152
  sources = [
150
153
  ".mustflow/context/INDEX.md",
151
- "REPO_MAP.md",
154
+ "skill_route_candidates",
155
+ "route_metadata_fallback",
156
+ "repo_map_navigation",
152
157
  "matching_skill",
153
158
  "relevant_source_files",
154
159
  ]
@@ -242,7 +247,7 @@ read = [
242
247
  method = "hash_check"
243
248
  read = [
244
249
  "AGENTS.md",
245
- ".mustflow/skills/INDEX.md",
250
+ ".mustflow/skills/router.toml",
246
251
  ]
247
252
 
248
253
  [refresh.levels.full]
@@ -254,7 +259,8 @@ read = [
254
259
  ".mustflow/config/commands.toml",
255
260
  ".mustflow/config/preferences.toml",
256
261
  ".mustflow/config/technology.toml",
257
- ".mustflow/skills/INDEX.md",
262
+ ".mustflow/skills/router.toml",
263
+ ".mustflow/skills/routes.toml",
258
264
  ]
259
265
 
260
266
  [compaction]
@@ -10,8 +10,8 @@ status_values = ["current", "stale", "needs_review", "missing"]
10
10
  [documents."agents.root"]
11
11
  source = "locales/en/AGENTS.md"
12
12
  source_locale = "en"
13
- revision = 15
14
- translations.ko = { path = "locales/ko/AGENTS.md", source_revision = 15, status = "current" }
13
+ revision = 17
14
+ translations.ko = { path = "locales/ko/AGENTS.md", source_revision = 17, status = "current" }
15
15
  translations.zh = { path = "locales/zh/AGENTS.md", source_revision = 11, status = "needs_review" }
16
16
  translations.es = { path = "locales/es/AGENTS.md", source_revision = 11, status = "needs_review" }
17
17
  translations.fr = { path = "locales/fr/AGENTS.md", source_revision = 11, status = "needs_review" }
@@ -30,8 +30,8 @@ translations.hi = { path = "locales/hi/.mustflow/context/INDEX.md", source_revis
30
30
  [documents."context.project"]
31
31
  source = "locales/en/.mustflow/context/PROJECT.md"
32
32
  source_locale = "en"
33
- revision = 1
34
- translations.ko = { path = "locales/ko/.mustflow/context/PROJECT.md", source_revision = 1, status = "current" }
33
+ revision = 3
34
+ translations.ko = { path = "locales/ko/.mustflow/context/PROJECT.md", source_revision = 3, status = "current" }
35
35
  translations.zh = { path = "locales/zh/.mustflow/context/PROJECT.md", source_revision = 1, status = "needs_review" }
36
36
  translations.es = { path = "locales/es/.mustflow/context/PROJECT.md", source_revision = 1, status = "needs_review" }
37
37
  translations.fr = { path = "locales/fr/.mustflow/context/PROJECT.md", source_revision = 1, status = "needs_review" }
@@ -40,8 +40,8 @@ translations.hi = { path = "locales/hi/.mustflow/context/PROJECT.md", source_rev
40
40
  [documents."docs.agent-workflow"]
41
41
  source = "locales/en/.mustflow/docs/agent-workflow.md"
42
42
  source_locale = "en"
43
- revision = 20
44
- translations.ko = { path = "locales/ko/.mustflow/docs/agent-workflow.md", source_revision = 20, status = "current" }
43
+ revision = 23
44
+ translations.ko = { path = "locales/ko/.mustflow/docs/agent-workflow.md", source_revision = 23, status = "current" }
45
45
  translations.zh = { path = "locales/zh/.mustflow/docs/agent-workflow.md", source_revision = 18, status = "needs_review" }
46
46
  translations.es = { path = "locales/es/.mustflow/docs/agent-workflow.md", source_revision = 18, status = "needs_review" }
47
47
  translations.fr = { path = "locales/fr/.mustflow/docs/agent-workflow.md", source_revision = 18, status = "needs_review" }
@@ -62,7 +62,7 @@ translations = {}
62
62
  [documents."skills.index"]
63
63
  source = "locales/en/.mustflow/skills/INDEX.md"
64
64
  source_locale = "en"
65
- revision = 167
65
+ revision = 169
66
66
  translations = {}
67
67
 
68
68
  [documents."skill.adapter-boundary"]
@@ -119,6 +119,12 @@ source_locale = "en"
119
119
  revision = 2
120
120
  translations = {}
121
121
 
122
+ [documents."skill.quality-gaming-guard"]
123
+ source = "locales/en/.mustflow/skills/quality-gaming-guard/SKILL.md"
124
+ source_locale = "en"
125
+ revision = 2
126
+ translations = {}
127
+
122
128
  [documents."skill.module-boundary-review"]
123
129
  source = "locales/en/.mustflow/skills/module-boundary-review/SKILL.md"
124
130
  source_locale = "en"
@@ -978,7 +984,7 @@ translations = {}
978
984
  [documents."skill.llm-token-cost-control-review"]
979
985
  source = "locales/en/.mustflow/skills/llm-token-cost-control-review/SKILL.md"
980
986
  source_locale = "en"
981
- revision = 1
987
+ revision = 2
982
988
  translations = {}
983
989
 
984
990
  [documents."skill.llm-response-latency-review"]
@@ -3,7 +3,7 @@ mustflow_doc: context.project
3
3
  kind: mustflow-context
4
4
  locale: en
5
5
  canonical: true
6
- revision: 1
6
+ revision: 3
7
7
  name: project
8
8
  authority: contextual
9
9
  lifecycle: user-editable
@@ -58,9 +58,11 @@ Unset. List paths, public APIs, generated files, migrations, secrets, or compati
58
58
  - `.mustflow/docs/agent-workflow.md`
59
59
  - `.mustflow/config/mustflow.toml`
60
60
  - `.mustflow/config/commands.toml`
61
- - `.mustflow/skills/INDEX.md`
61
+ - `.mustflow/skills/router.toml`
62
+ - `.mustflow/skills/routes.toml` only when detailed route metadata is needed
63
+ - `.mustflow/skills/INDEX.md` only when human-readable route evidence is needed
62
64
 
63
65
  ## Staleness Check
64
66
 
65
67
  - If this file conflicts with current code, tests, command contracts, or user instructions, treat it as stale and report the conflict.
66
- - Update this file only when the project direction, non-goals, or repository-wide promises change.
68
+ - Update this file only when the project direction, non-goals, or repository-wide promises change.
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: docs.agent-workflow
3
3
  locale: en
4
4
  canonical: true
5
- revision: 20
5
+ revision: 23
6
6
  lifecycle: mustflow-owned
7
7
  authority: workflow-policy
8
8
  ---
@@ -31,7 +31,9 @@ mustflow documents have specific, narrow roles. Do not move a rule into a lower-
31
31
  | `.mustflow/config/preferences.toml` | Repository-level defaults for style, language, Git suggestions, testing tendency, verification selection, and version-impact handling. | Lower-authority preferences; not permissions. | Repository-local TOML, user-customizable. |
32
32
  | `.mustflow/context/INDEX.md` | Router for task-specific context files. | Selects optional context only; not a policy manual. | mustflow-owned Markdown. |
33
33
  | `.mustflow/context/PROJECT.md` | Cautious project facts, unknowns, and domain conventions. | Contextual reference below user instructions, code, tests, commands, and configured policies. | User-editable context. |
34
- | `.mustflow/skills/INDEX.md` | Router that selects which procedure document to read for a task. | Selection contract only; procedure detail remains in `SKILL.md`. | mustflow-owned Markdown. |
34
+ | `.mustflow/skills/router.toml` | Stable compact route taxonomy and fallback rules for prompt-cache-friendly first-pass skill selection. | Selection kernel only; procedure detail remains in `SKILL.md`. | mustflow-owned TOML. |
35
+ | `.mustflow/skills/routes.toml` | Full route metadata for detailed procedure selection when the compact router is insufficient. | Selection hint only; procedure detail remains in `SKILL.md`. | mustflow-owned TOML. |
36
+ | `.mustflow/skills/INDEX.md` | Expanded human-readable route table for detailed skill selection and route maintenance. | Selection contract only; procedure detail remains in `SKILL.md`. | mustflow-owned Markdown. |
35
37
  | `.mustflow/skills/<name>/SKILL.md` | Repeatable task procedure with inputs, allowed scope, checks, and reporting format. | Procedure guidance only; cannot authorize commands or override rules. | mustflow-owned Markdown, optionally localized. |
36
38
  | `REPO_MAP.md` | Generated anchor map for broad navigation and nested repository entry points. | Generated navigation aid below current files and instructions. | Generated; refresh with the configured `repo_map` intent or `mf map`. |
37
39
 
@@ -53,10 +55,12 @@ Skills are task procedures, not autonomous tools. Activating a skill means readi
53
55
 
54
56
  At task start and before the first edit:
55
57
 
56
- 1. Read `.mustflow/skills/INDEX.md`.
57
- 2. Match the current task against the listed scenarios.
58
- 3. Read every matching `SKILL.md` before editing that part of the work.
59
- 4. If no skill applies, proceed with the smallest safe change under `AGENTS.md` and `.mustflow/config/commands.toml`.
58
+ 1. Read `.mustflow/skills/router.toml` for the stable route taxonomy, category signals, selection limits, and fallback rules.
59
+ 2. Match the current task against category signals, user intent, expected paths, discovered technology, and event signals.
60
+ 3. Read `.mustflow/skills/routes.toml` when the compact router is insufficient, the task edits skill routing, detailed route metadata is needed, or route confidence is ambiguous.
61
+ 4. Read `.mustflow/skills/INDEX.md` when full route metadata is insufficient, the task edits the expanded route table, or human-readable trigger evidence is needed.
62
+ 5. Read every matching `SKILL.md` before editing that part of the work.
63
+ 6. If no skill applies, proceed with the smallest safe change under `AGENTS.md` and `.mustflow/config/commands.toml`.
60
64
 
61
65
  Activate a skill later if new evidence changes the task type. For example, a failing configured command activates failure triage; a test contract change activates test maintenance; and a documentation or workflow change activates documentation update.
62
66
 
@@ -82,8 +86,8 @@ Prompt caching is a performance optimization, not an authority source. A cached
82
86
 
83
87
  Hosts and agent harnesses assembling model input should keep context in this order:
84
88
 
85
- 1. Stable prefix: repository rules and workflow files from `mf context --json --cache-profile stable`.
86
- 2. Task context: selected context files, matching skills, repository-map anchors, relevant source files, and `mf search --json` results with `cache_layer` set to `task`.
89
+ 1. Stable prefix: repository entrypoint rules and the compact route kernel from `mf context --json --cache-profile stable`.
90
+ 2. Task context: selected context files, workflow/configuration refresh slices, command intent definitions, full route metadata fallback, detailed skill index fallback, matching skills, repository-map anchors, relevant source files, and `mf search --json` results with `cache_layer` set to `task`.
87
91
  3. Volatile suffix: current user request, changed-file lists, command output tails, latest run receipt metadata, timestamps, and any `mf search --json` result whose `volatile` field is `true`.
88
92
 
89
93
  Before reusing a stable prefix, compare the reported content hashes with the current files. If any stable document hash changes, reread the document instead of reusing cached text. Do not place absolute local paths, run receipt timestamps, command output, changed files, or current user task text before the stable prefix.
@@ -126,7 +130,7 @@ Use `.mustflow/config/mustflow.toml` `[refresh]` to determine the refresh level:
126
130
  - `command`: reread `AGENTS.md` and `.mustflow/config/commands.toml`
127
131
  - `edit`: reread `AGENTS.md`, `.mustflow/config/mustflow.toml`, and `.mustflow/docs/agent-workflow.md` before sensitive edits
128
132
  - `report`: reread `AGENTS.md`, `.mustflow/config/mustflow.toml`, and `.mustflow/config/preferences.toml` before the final report
129
- - `skill`: reread `AGENTS.md` and `.mustflow/skills/INDEX.md`
133
+ - `skill`: reread `AGENTS.md` and `.mustflow/skills/router.toml`
130
134
  - `full`: reread the full mustflow read sequence
131
135
 
132
136
  `before_command_run` is a freshness checkpoint for the current command intent, not a requirement to reread every file before every repeated command when the command contract has not changed.