mustflow 2.112.3 → 2.112.7

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.
@@ -2,11 +2,11 @@
2
2
  mustflow_doc: skill.module-boundary-review
3
3
  locale: en
4
4
  canonical: true
5
- revision: 2
5
+ revision: 3
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: module-boundary-review
9
- description: Apply this skill when code is created, changed, reviewed, or reported and module separation, cohesion, coupling, data ownership, rule ownership, failure ownership, import direction, circular dependency, DTO leakage, shared/common/utils growth, mock-heavy tests, repeated policy conditions, enum interpretation, repository business logic, anemic domain, domain-to-I/O leakage, transaction boundary mismatch, event naming, public API bloat, caller sequencing, premature reuse, co-change history, bug/fix distance, config ownership, log responsibility, exception translation, cache invalidation ownership, repeated authorization checks, frontend/backend policy leakage, time policy, batch or worker bypass, or temporary-code accumulation can make a change spread beyond its real owner.
9
+ description: Apply this skill when code is created, changed, reviewed, or reported and module separation, cohesion, coupling, change axes, stability direction, data ownership, rule ownership, failure ownership, import direction, circular dependency, DTO leakage, shared/common/utils growth, mock-heavy tests, repeated policy conditions, enum interpretation, repository business logic, anemic domain, domain-to-I/O leakage, transaction boundary mismatch, event naming, public API bloat, caller sequencing, premature reuse, co-change history, bug/fix distance, config ownership, log responsibility, exception translation, cache invalidation ownership, repeated authorization checks, frontend/backend policy leakage, time policy, batch or worker bypass, shallow modules, or temporary-code accumulation can make a change spread beyond its real owner.
10
10
  metadata:
11
11
  mustflow_schema: "1"
12
12
  mustflow_kind: procedure
@@ -46,6 +46,12 @@ who must change, who owns the data, who owns the failure, and who should not nee
46
46
  files repeatedly change together.
47
47
  - A review claims that layering, clean architecture, DDD, modular monolith, feature folders,
48
48
  repositories, services, shared utilities, events, DTOs, or frontend/backend separation is clean.
49
+ - A design starts from feature folders, technical layers, or CRUD nouns and may be missing the real
50
+ split criterion: who changes the code, when, why, and independently of which other owners.
51
+ - A module depends on a more volatile detail such as a provider SDK, UI route flow, database query
52
+ shape, external response, framework object, config dialect, or generated transport model.
53
+ - A change creates many thin files whose public APIs are wider than the hidden implementation, or
54
+ whose abstractions only forward calls, wrap switches, or rename CRUD.
49
55
  - The suspected issue is not a large service split yet, but a local module boundary that leaks
50
56
  business rules, data shape, failure handling, sequencing, or ownership to neighbors.
51
57
 
@@ -70,12 +76,21 @@ who must change, who owns the data, who owns the failure, and who should not nee
70
76
 
71
77
  - Change reason: the policy, feature, bug, data shape, failure path, or operational behavior that
72
78
  caused the edit.
79
+ - Change-axis ledger: likely independent changes over the next useful planning horizon, including
80
+ policy, external provider, data model, UI flow, permission, pricing, billing, deployment, and
81
+ operational changes, plus who or what would cause each change.
73
82
  - Changed-file spread: folders, modules, layers, packages, tests, generated files, templates, and
74
83
  docs touched by the same reason.
75
84
  - Co-change evidence when available: recent commits, PRs, repeated paired files, or local diff
76
85
  history showing files that usually move together.
77
86
  - Module graph evidence: imports, exports, public APIs, call sites, dependency direction, cycles,
78
87
  shared helpers, DTO flow, and configuration reads.
88
+ - Stability evidence: which modules many callers rely on, which modules change because external
89
+ details move, and whether dependencies point toward the more stable policy owner rather than the
90
+ more volatile implementation detail.
91
+ - Change-simulation evidence: expected files touched for at least three concrete next changes, such
92
+ as changing a payment provider, adding a pricing rule, changing admin UI flow, changing invoice
93
+ format, changing permissions, or adding a worker path.
79
94
  - Configured guardrail evidence when available: `code/module-boundary` results for
80
95
  `.mustflow/config/module-boundaries.toml` layer deny rules, public entrypoints, feature imports,
81
96
  shared budgets, and import cycles.
@@ -121,15 +136,30 @@ who must change, who owns the data, who owns the failure, and who should not nee
121
136
  - Count how many modules, folders, layers, tests, docs, and templates changed for that one reason.
122
137
  - If one policy edit forces controller, service, repository, mapper, utility, constants, worker,
123
138
  and UI edits together, treat the module boundary as suspect.
139
+ - Before accepting a new split, list the independent change axes first. Do not start with
140
+ `controllers`, `services`, `repositories`, `utils`, or CRUD nouns unless the repository already
141
+ proves those are the real change units.
124
142
  2. Group by reason to change.
125
143
  - Files with different names but the same change reason are one module candidate.
126
144
  - `UserService`, `UserValidator`, `UserMapper`, `UserPolicy`, and `UserHelper` changing together is
127
145
  evidence of sliced roles, not necessarily separated modules.
146
+ - Write each candidate module as "this module changes when ...". If that sentence names more than
147
+ one independent owner, split the candidate or report the boundary risk.
148
+ - Prefer volatility names and business capabilities, such as pricing policy, payment provider,
149
+ subscription lifecycle, invoice rendering, fraud check, fulfillment handoff, or entitlement
150
+ decision, over role-sliced layer names when those better predict future edits.
128
151
  3. Check import direction.
129
152
  - Infrastructure or low-level modules should not know high-level business use case names unless
130
153
  the repository intentionally uses that inversion.
131
154
  - Treat lower layers importing policy names such as plan, checkout, approval, permission, or
132
155
  subscription as evidence that the policy leaked downward.
156
+ - Check stability direction. Code that many callers depend on should not import volatile details
157
+ such as Stripe, Toss, Prisma, SQLAlchemy, React Router, FastAPI request objects, provider DTOs,
158
+ raw SQL builders, generated clients, or `process.env` unless the repository explicitly makes
159
+ that layer an edge adapter.
160
+ - Prefer interfaces or ports owned by the using side when the abstraction protects stable policy
161
+ code from an unstable provider, database, queue, cache, filesystem, network, framework, or UI
162
+ detail.
133
163
  4. Treat cycles as boundary failure until proven harmless.
134
164
  - If A imports B and B imports A, identify the missing concept, ownership decision, event, port, or
135
165
  data-flow direction.
@@ -188,6 +218,11 @@ who must change, who owns the data, who owns the failure, and who should not nee
188
218
  - Too many exported functions can mean internals are on display.
189
219
  - If callers must call `create`, then `apply`, then `reserve`, then `mark`, the module has handed
190
220
  out an assembly manual instead of owning the sequence.
221
+ - A good module should have a small door and a deeper inside. If most files only expose one-line
222
+ forwarding methods, wrapper services, or renamed CRUD calls, treat the split as shallow module
223
+ theater until a real hidden decision or variation point is named.
224
+ - A public API wider than the behavior it hides is usually not a boundary; it is implementation
225
+ leakage with extra navigation.
191
226
  16. Check reuse claims.
192
227
  - "Used in many places" is not enough reason to extract a common helper.
193
228
  - Reuse is safe only when the callers change for the same reason. Similar code from different
@@ -197,20 +232,27 @@ who must change, who owns the data, who owns the failure, and who should not nee
197
232
  names.
198
233
  - If a file repeatedly receives temporary exceptions in the same direction, name the missing
199
234
  concept instead of adding another branch.
200
- 18. Compare bug location with fix location.
235
+ 18. Run change simulations.
236
+ - Pick at least three plausible next changes from the change-axis ledger.
237
+ - For each scenario, list which modules should change and which modules must stay ignorant.
238
+ - If changing a provider, UI flow, invoice format, permission rule, or pricing rule repeatedly
239
+ crosses the same unrelated modules, treat that as hidden coupling.
240
+ - If a module would break because a different module's test changed, identify whether the
241
+ boundary couples futures that should be independent.
242
+ 19. Compare bug location with fix location.
201
243
  - If the symptom appears in one module but the fix belongs in an unrelated utility, policy, or
202
244
  mapper, the responsibility line may be bent.
203
- 19. Check config, time, and logging responsibility.
245
+ 20. Check config, time, and logging responsibility.
204
246
  - Raw `process.env`, feature flag, remote config, clock, timezone, locale, and date parsing should
205
247
  usually be read at the edge and injected as explicit values.
206
248
  - Logs that mention another module's job, such as payment code logging welcome-email failure, are
207
249
  strong ownership evidence.
208
- 20. Translate exceptions at boundaries.
250
+ 21. Translate exceptions at boundaries.
209
251
  - Database, provider, filesystem, framework, and payment errors should not leak through every
210
252
  layer unchanged.
211
253
  - Convert external failure dialect into the receiving module's language while preserving safe
212
254
  diagnostic causes.
213
- 21. Check cache invalidation, authorization, frontend policy, and alternate entrypoints.
255
+ 22. Check cache invalidation, authorization, frontend policy, and alternate entrypoints.
214
256
  - Cache invalidation belongs near the data owner, not scattered across random callers.
215
257
  - Authorization checks repeated in controllers should move to one use-case entry, policy, or
216
258
  capability boundary.
@@ -218,7 +260,14 @@ who must change, who owns the data, who owns the failure, and who should not nee
218
260
  backend policy from internal statuses.
219
261
  - Batch, cron, worker, and admin tools should use the same use case or policy owner as online
220
262
  requests instead of bypassing validations, events, logs, and permissions.
221
- 22. Decide the smallest response.
263
+ 23. Attack the design before accepting it.
264
+ - Name the three modules or abstractions most likely to rot first.
265
+ - For each, name the change request that would break it, the owner that would cause the change,
266
+ and whether the blast stays inside one module.
267
+ - Remove or redesign shallow wrappers, central managers, enum-switch strategies, provider-shaped
268
+ "neutral" ports, configuration-driven logic hiding, event-bus call hiding, and CRUD stamp
269
+ modules when they fail the attack.
270
+ 24. Decide the smallest response.
222
271
  - If evidence is strong and the edit is in scope, make the smallest boundary fix.
223
272
  - If the fix would be broad, report the module boundary risk and the first safe split point.
224
273
  - If evidence is weak, leave the structure alone and report the missing co-change or ownership
@@ -229,9 +278,15 @@ who must change, who owns the data, who owns the failure, and who should not nee
229
278
 
230
279
  - The changed reason, changed-file spread, co-change evidence, data owner, policy owner, failure
231
280
  owner, and public module surface are explicit or reported as missing.
281
+ - The relevant change axes and stability direction are explicit, or reported as missing evidence.
282
+ - At least three change simulations were checked when designing or accepting a new module boundary,
283
+ unless the task is only auditing an existing small local diff.
232
284
  - Import direction, cycles, DTO spread, shared helper ownership, repository policy leakage, domain
233
285
  I/O leakage, transaction mismatch, event naming, caller sequencing, duplicated policy, and alternate
234
286
  entrypoints are fixed or reported where relevant.
287
+ - Shallow module signals such as role-sliced CRUD layers, one-line wrappers, provider-shaped ports,
288
+ ownerless managers, event-bus call hiding, config-hidden logic, and public API bloat are removed,
289
+ justified, or reported.
235
290
  - Any new abstraction hides a named responsibility and reduces caller knowledge, change spread, or
236
291
  test mock cost.
237
292
  - Behavior, public contracts, permissions, data ownership, and failure semantics remain intact or
@@ -276,11 +331,13 @@ design is clean.
276
331
  ## Output Format
277
332
 
278
333
  - Module boundary reviewed
279
- - Change reason and changed-file spread
334
+ - Change reason, change axes, stability direction, and changed-file spread
280
335
  - Co-change, import direction, cycle, DTO, shared helper, public API, caller sequencing, and test mock
281
336
  evidence
282
337
  - Data owner, policy owner, failure owner, cache invalidation owner, config/time owner, and
283
338
  authorization owner where relevant
339
+ - Change simulations and most-likely-to-rot modules
340
+ - Shallow module signals found, fixed, justified, or deferred
284
341
  - Boundary fixes made or recommended
285
342
  - Evidence level: current diff, local source evidence, history evidence, configured-test evidence,
286
343
  missing, or not applicable
@@ -198,6 +198,12 @@ route_type = "adjunct"
198
198
  priority = 76
199
199
  applies_to_reasons = ["unknown_change", "code_change", "behavior_change", "test_change", "public_api_change", "performance_change"]
200
200
 
201
+ [routes."abstraction-boundary-review"]
202
+ category = "general_code"
203
+ route_type = "adjunct"
204
+ priority = 77
205
+ applies_to_reasons = ["unknown_change", "code_change", "behavior_change", "test_change", "public_api_change", "performance_change", "data_change"]
206
+
201
207
  [routes."module-boundary-review"]
202
208
  category = "general_code"
203
209
  route_type = "adjunct"
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: agents.root
3
3
  locale: en
4
4
  canonical: true
5
- revision: 18
5
+ revision: 20
6
6
  lifecycle: user-editable
7
7
  authority: binding
8
8
  ---
@@ -92,8 +92,17 @@ mustflow-managed details are under `.mustflow/`.
92
92
 
93
93
  - When searching unfamiliar code, look for nearby `mf:anchor` comments and use them as
94
94
  navigation metadata for durable responsibility boundaries.
95
+ - Source anchors are indexed into the local SQLite cache only when source indexing is enabled,
96
+ typically through a configured local-index intent such as `mf run local_index` or through
97
+ `mf index --source` when the command contract permits that command.
98
+ - Use `mf search --scope source <query>` to find source-anchor coordinates, or
99
+ `mf search --scope all <query>` when workflow documents and source anchors should be searched
100
+ together. Search results point to files, line numbers, anchor IDs, and risk tags that still need
101
+ to be read in the current source tree.
95
102
  - Treat source anchors as navigation-only hints. They never grant command authority,
96
103
  verification authority, or permission to skip current files, tests, or user instructions.
104
+ - If `mf search` reports a missing or stale index, refresh through the configured local-index
105
+ intent when available instead of treating old search rows as current evidence.
97
106
  - When adding, changing, or relying on anchors for a source change, route through
98
107
  `.mustflow/skills/source-anchor-authoring/SKILL.md` if installed.
99
108
 
@@ -106,6 +115,10 @@ mustflow-managed details are under `.mustflow/`.
106
115
  Follow the stricter rule.
107
116
  - When navigating to a nested repository, reread that repository's `AGENTS.md` and
108
117
  `.mustflow/config/*.toml` before editing.
118
+ - In repository farms, prefer each child repository's own command contract for repository-owned
119
+ commands. If the parent root intentionally orchestrates children, split parent-owned commands
120
+ into repo-named fragments under `.mustflow/config/commands/`; use
121
+ `mf workspace command-fragments` for read-only guidance.
109
122
  - Do not edit outside the selected child repository unless explicitly requested.
110
123
 
111
124
  ## Host-Specific Instruction Compatibility
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: agents.root
3
3
  locale: ko
4
4
  canonical: false
5
- revision: 25
5
+ revision: 27
6
6
  lifecycle: user-editable
7
7
  authority: binding
8
8
  ---
@@ -60,7 +60,10 @@ mustflow가 관리하는 세부 문서와 설정은 `.mustflow/` 폴더 아래
60
60
  ## 소스 앵커
61
61
 
62
62
  - 익숙하지 않은 코드를 탐색할 때는 주변 `mf:anchor` 주석을 찾아보고, 오래 유지되는 책임 경계를 찾기 위한 탐색 메타데이터로 사용합니다.
63
+ - 소스 앵커는 소스 색인이 켜져 있을 때만 로컬 SQLite 캐시에 들어갑니다. 보통 `mf run local_index` 같은 설정된 로컬 색인 인텐트를 통하거나, 명령 계약이 해당 명령을 허용하는 경우 `mf index --source`로 색인합니다.
64
+ - `mf search --scope source <query>`로 소스 앵커 좌표를 찾고, 워크플로우 문서와 소스 앵커를 함께 찾아야 할 때는 `mf search --scope all <query>`를 사용합니다. 검색 결과는 파일, 줄 번호, 앵커 ID, risk tag를 가리키는 탐색 좌표일 뿐이며, 현재 소스 파일을 다시 읽어야 합니다.
63
65
  - 소스 앵커는 탐색용 힌트일 뿐입니다. 명령 실행 권한, 검증 권한, 현재 파일/테스트/사용자 지시를 건너뛸 권한을 부여하지 않습니다.
66
+ - `mf search`가 색인 누락이나 오래된 색인을 보고하면, 오래된 검색 행을 현재 근거로 삼지 말고 가능한 경우 설정된 로컬 색인 인텐트로 새로 고칩니다.
64
67
  - 소스 변경에서 앵커를 추가하거나 수정하거나 앵커에 의존해야 한다면, 설치되어 있는 경우 `.mustflow/skills/source-anchor-authoring/SKILL.md` 절차를 따릅니다.
65
68
 
66
69
  ## 상위/하위 규칙 우선순위
@@ -69,6 +72,7 @@ mustflow가 관리하는 세부 문서와 설정은 `.mustflow/` 폴더 아래
69
72
  - 작업 방식, 코드 스타일, 테스트 방식, 명령 실행 규칙이 충돌할 경우 하위 저장소의 `AGENTS.md`와 `.mustflow/config/commands.toml`을 우선합니다.
70
73
  - 보안, 비밀 정보, 개인정보, 파괴적 명령, 수정 가능 경로 등 안전 규칙은 누적 적용하며 더 엄격한 규칙을 따릅니다.
71
74
  - 상위 작업 공간에서 하위 저장소로 진입한 경우, 하위 저장소의 `AGENTS.md`와 `.mustflow/config/*.toml`을 다시 읽은 뒤 작업합니다.
75
+ - repository farm에서는 각 하위 저장소가 소유한 명령은 해당 저장소의 command contract를 우선합니다. 상위 루트가 하위 저장소를 의도적으로 orchestration해야 한다면 상위 소유 명령을 `.mustflow/config/commands/` 아래 repo 이름별 fragment로 나누고, `mf workspace command-fragments`로 읽기 전용 안내를 확인합니다.
72
76
  - 명시적 요청 없이 선택한 하위 저장소 밖의 파일은 수정하지 않습니다.
73
77
 
74
78
  ## 호스트별 지침 호환성
@@ -1,6 +1,6 @@
1
1
  id = "default"
2
2
  name = "default"
3
- version = "2.112.3"
3
+ version = "2.112.7"
4
4
  description = "Minimal workflow for LLM agents to read, edit, and verify their work in a repository."
5
5
  common_root = "common"
6
6
  locales_root = "locales"
@@ -27,6 +27,7 @@ creates = [
27
27
  ".mustflow/skills/code-review/SKILL.md",
28
28
  ".mustflow/skills/ai-generated-code-hardening/SKILL.md",
29
29
  ".mustflow/skills/quality-gaming-guard/SKILL.md",
30
+ ".mustflow/skills/abstraction-boundary-review/SKILL.md",
30
31
  ".mustflow/skills/module-boundary-review/SKILL.md",
31
32
  ".mustflow/skills/change-blast-radius-review/SKILL.md",
32
33
  ".mustflow/skills/business-rule-leakage-review/SKILL.md",
@@ -234,6 +235,7 @@ after_install = [
234
235
  "Read AGENTS.md for repository-specific working rules.",
235
236
  "Run mf doctor to inspect the current state before editing.",
236
237
  "Generate REPO_MAP.md with mf map when a repository map is needed.",
238
+ "For repo farms under projects/, run mf workspace command-fragments --projects-dir projects --json before putting many child-repository commands in one parent command file.",
237
239
  "Review the default Bun-backed test intents in .mustflow/config/commands.toml and replace them with narrower project commands when useful.",
238
240
  "Add your lint and build commands to .mustflow/config/commands.toml.",
239
241
  "Review repository-specific language and style defaults in .mustflow/config/preferences.toml.",
@@ -261,6 +263,7 @@ minimal = [
261
263
  "code-review",
262
264
  "ai-generated-code-hardening",
263
265
  "quality-gaming-guard",
266
+ "abstraction-boundary-review",
264
267
  "module-boundary-review",
265
268
  "change-blast-radius-review",
266
269
  "business-rule-leakage-review",
@@ -430,6 +433,7 @@ patterns = [
430
433
  "code-review",
431
434
  "ai-generated-code-hardening",
432
435
  "quality-gaming-guard",
436
+ "abstraction-boundary-review",
433
437
  "module-boundary-review",
434
438
  "change-blast-radius-review",
435
439
  "business-rule-leakage-review",
@@ -610,6 +614,7 @@ oss = [
610
614
  "code-review",
611
615
  "ai-generated-code-hardening",
612
616
  "quality-gaming-guard",
617
+ "abstraction-boundary-review",
613
618
  "module-boundary-review",
614
619
  "change-blast-radius-review",
615
620
  "business-rule-leakage-review",
@@ -808,6 +813,7 @@ team = [
808
813
  "code-review",
809
814
  "ai-generated-code-hardening",
810
815
  "quality-gaming-guard",
816
+ "abstraction-boundary-review",
811
817
  "module-boundary-review",
812
818
  "change-blast-radius-review",
813
819
  "business-rule-leakage-review",
@@ -991,6 +997,7 @@ product = [
991
997
  "code-review",
992
998
  "ai-generated-code-hardening",
993
999
  "quality-gaming-guard",
1000
+ "abstraction-boundary-review",
994
1001
  "module-boundary-review",
995
1002
  "change-blast-radius-review",
996
1003
  "business-rule-leakage-review",
@@ -1180,6 +1187,7 @@ library = [
1180
1187
  "code-review",
1181
1188
  "ai-generated-code-hardening",
1182
1189
  "quality-gaming-guard",
1190
+ "abstraction-boundary-review",
1183
1191
  "module-boundary-review",
1184
1192
  "change-blast-radius-review",
1185
1193
  "business-rule-leakage-review",