mustflow 2.112.9 → 2.112.13

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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/contract-lint.js +3 -13
  3. package/dist/cli/commands/impact.js +2 -12
  4. package/dist/cli/commands/init.js +39 -14
  5. package/dist/cli/commands/onboard.js +3 -13
  6. package/dist/cli/commands/version-sources.js +2 -12
  7. package/dist/cli/i18n/en.js +6 -0
  8. package/dist/cli/i18n/es.js +6 -0
  9. package/dist/cli/i18n/fr.js +6 -0
  10. package/dist/cli/i18n/hi.js +6 -0
  11. package/dist/cli/i18n/ko.js +6 -0
  12. package/dist/cli/i18n/zh.js +6 -0
  13. package/dist/cli/lib/agent-context.js +2 -1
  14. package/dist/cli/lib/dashboard-locale.js +6 -0
  15. package/dist/cli/lib/dashboard-preferences.js +24 -1
  16. package/dist/cli/lib/preferences-options.js +8 -0
  17. package/dist/cli/lib/validation/constants.js +3 -1
  18. package/dist/cli/lib/validation/index.js +10 -1
  19. package/dist/core/preferences.js +79 -0
  20. package/dist/core/repo-version-source.js +9 -18
  21. package/package.json +1 -1
  22. package/templates/default/common/.mustflow/config/preferences.toml +10 -0
  23. package/templates/default/i18n.toml +19 -19
  24. package/templates/default/locales/en/.mustflow/docs/agent-workflow.md +10 -4
  25. package/templates/default/locales/en/.mustflow/skills/INDEX.md +4 -4
  26. package/templates/default/locales/en/.mustflow/skills/async-timing-boundary-review/SKILL.md +19 -5
  27. package/templates/default/locales/en/.mustflow/skills/backend-log-evidence-review/SKILL.md +10 -3
  28. package/templates/default/locales/en/.mustflow/skills/cache-integrity-review/SKILL.md +63 -21
  29. package/templates/default/locales/en/.mustflow/skills/concurrency-invariant-review/SKILL.md +13 -3
  30. package/templates/default/locales/en/.mustflow/skills/cross-platform-filesystem-safety/SKILL.md +10 -9
  31. package/templates/default/locales/en/.mustflow/skills/dependency-upgrade-review/SKILL.md +8 -3
  32. package/templates/default/locales/en/.mustflow/skills/memory-lifetime-review/SKILL.md +19 -3
  33. package/templates/default/locales/en/.mustflow/skills/observability-debuggability-review/SKILL.md +31 -21
  34. package/templates/default/locales/en/.mustflow/skills/race-condition-review/SKILL.md +38 -25
  35. package/templates/default/locales/en/.mustflow/skills/repro-first-debug/SKILL.md +43 -10
  36. package/templates/default/locales/en/.mustflow/skills/routes.toml +4 -4
  37. package/templates/default/locales/en/.mustflow/skills/security-flow-review/SKILL.md +19 -4
  38. package/templates/default/locales/en/.mustflow/skills/security-privacy-review/SKILL.md +8 -3
  39. package/templates/default/locales/en/AGENTS.md +9 -1
  40. package/templates/default/locales/es/AGENTS.md +2 -0
  41. package/templates/default/locales/fr/AGENTS.md +2 -0
  42. package/templates/default/locales/hi/AGENTS.md +2 -0
  43. package/templates/default/locales/ko/AGENTS.md +3 -1
  44. package/templates/default/locales/zh/AGENTS.md +2 -0
  45. package/templates/default/manifest.toml +1 -1
@@ -2,11 +2,11 @@
2
2
  mustflow_doc: skill.cache-integrity-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: cache-integrity-review
9
- description: Apply this skill when code is created, changed, reviewed, or reported and cache behavior can spread stale, wrong, private, overbroad, tenant-crossing, permission-wrong, version-incompatible, or source-overloading values through cache keys, query normalization, key versions, TTL and jitter, soft and hard TTL, stale-while-revalidate, stampede protection, request coalescing, negative caching, invalidation order, list or page caches, tag invalidation, L1/L2 cache layers, Redis fallback, cache-status ledgers such as hit, miss, bypass, stale, refresh, error, set-failed, evicted, or expired, origin-cost observability, value size, eviction policy, TTL-less keys, KEYS/SCAN use, hot keys, Redis Cluster hash tags, replica lag, Redis latency, HTTP Vary/no-cache/no-store semantics, permission caches, cache warming, or failure-path cache tests.
9
+ description: Apply this skill when code is created, changed, reviewed, or reported and cache or client state behavior can spread stale, wrong, private, overbroad, tenant-crossing, permission-wrong, version-incompatible, partial-entity, persisted-storage, hydration, optimistic-update, or source-overloading values through cache keys, query normalization, key versions, TTL and jitter, soft and hard TTL, stale-while-revalidate, stampede protection, request coalescing, negative caching, invalidation order, list or page caches, tag invalidation, L1/L2 cache layers, Redis fallback, browser storage, service workers, SSR hydration, cache-status ledgers such as hit, miss, bypass, stale, refresh, error, set-failed, evicted, or expired, origin-cost observability, value provenance, value size, eviction policy, TTL-less keys, KEYS/SCAN use, hot keys, Redis Cluster hash tags, replica lag, Redis latency, HTTP Vary/no-cache/no-store semantics, permission caches, cache warming, or failure-path cache tests.
10
10
  metadata:
11
11
  mustflow_schema: "1"
12
12
  mustflow_kind: procedure
@@ -48,6 +48,8 @@ and what happens to the source system when the cache misses or fails?"
48
48
  - Cache behavior can vary by tenant, actor, login state, membership tier, country, language, locale,
49
49
  A/B test, feature flag, adult verification, inventory policy, authorization, subscription, or
50
50
  request headers.
51
+ - State is mirrored between server data, framework state, form state, URL state, query cache, localStorage,
52
+ IndexedDB, service worker cache, SSR hydration, normalized entity cache, or optimistic update layers.
51
53
  - A review or final report claims that caching is safe, fast, resilient, correct, isolated, warmed,
52
54
  invalidated, observable, or harmless under deploy, rollback, source failure, Redis failure, or
53
55
  concurrent updates.
@@ -72,7 +74,11 @@ and what happens to the source system when the cache misses or fails?"
72
74
  - Source of truth: database, provider, file, auth service, entitlement system, inventory source,
73
75
  canonical event stream, generated artifact, or other owner.
74
76
  - Cached value shape: detail item, list, page, search result, permission decision, session, rate
75
- limit, inventory, feature flag, API response, rendered HTML, or derived aggregate.
77
+ limit, inventory, feature flag, API response, rendered HTML, partial entity, optimistic patch,
78
+ persisted browser value, hydrated state, or derived aggregate.
79
+ - Value provenance and completeness: whether the value is full or partial, who last wrote it, when it
80
+ was fetched, when it becomes stale, what version it represents, whether it is optimistic or hydrated,
81
+ and which mutation or invalidation produced it.
76
82
  - Key dimensions: tenant, actor, viewer context, login state, membership tier, country, language,
77
83
  locale, A/B test, feature flag, adult verification, inventory policy, authorization state, headers,
78
84
  query parameters, schema version, and value version.
@@ -107,7 +113,8 @@ and what happens to the source system when the cache misses or fails?"
107
113
  - Add or tighten cache key construction, query normalization, key versioning, TTL and jitter,
108
114
  soft/hard TTL handling, stale-while-revalidate, request coalescing, singleflight, bounded fallback,
109
115
  load shedding, negative-cache policy, invalidation ordering, version checks, tag invalidation,
110
- cache warming, cache observability, and focused tests tied to the changed cache surface.
116
+ cache warming, partial-entity merge policy, persisted-storage reset policy, optimistic rollback
117
+ lineage, cache observability, and focused tests tied to the changed cache surface.
111
118
  - Split cache policy by success, not-found, permission-denied, temporary failure, stale value, and
112
119
  unknown outcome when those outcomes need different behavior.
113
120
  - Add tests for tenant separation, permission changes, stale value bounds, concurrent misses, source
@@ -165,64 +172,92 @@ and what happens to the source system when the cache misses or fails?"
165
172
  a newer value.
166
173
  - Use updatedAt, monotonic version, CAS, conditional write, compare-and-set, or cache delete when
167
174
  ordering cannot be proven.
168
- 10. Check list, query, and page caches separately from detail caches.
175
+ 10. Check async state staleness and current-owner checks.
176
+ - State captured before `await`, background refresh, debounce, polling, or optimistic mutation may
177
+ be stale by the time the result applies.
178
+ - Re-read current state, use functional updates, or compare generation, version, etag, sequence,
179
+ mutation id, or operation owner before writing into cache or UI state.
180
+ - Request coalescing is not obsolete-request discard. Same-key requests may share work; different
181
+ keys or superseded views need apply-time freshness checks.
182
+ 11. Check partial entity overwrite.
183
+ - A summary response should not erase fields that only a detail response owns.
184
+ - Define merge policy for partial values, field completeness, null versus absent fields, and
185
+ entity variants such as summary, detail, admin, viewer-specific, or permission-filtered views.
186
+ - If a cache normalizes by id, the id alone is not proof that two responses have the same
187
+ information quality or visibility.
188
+ 12. Check optimistic update lineage.
189
+ - Optimistic state needs a before snapshot, temporary version or mutation id, success merge rule,
190
+ and failure rollback rule.
191
+ - Concurrent optimistic mutations should not roll back later successful writes by restoring a
192
+ whole old cache snapshot blindly.
193
+ - Prefer per-mutation rollback, server refetch, or versioned merge when more than one mutation can
194
+ overlap.
195
+ 13. Check list, query, and page caches separately from detail caches.
169
196
  - List caches are harder than detail caches because latest, popular, tag, author, search, filter,
170
197
  and page keys all change when one entity changes.
171
198
  - Page-number caches are vulnerable to insertions and deletions. Prefer cursor keys, baseline
172
199
  time, snapshot token, or explicit duplicate and gap behavior for feeds and infinite scroll.
173
200
  - If tag-based invalidation is missing for compound queries, expect global flush pressure and
174
201
  report the operational cost.
175
- 11. Check cache layers.
202
+ 14. Check persisted browser and hydration caches.
203
+ - localStorage, IndexedDB, service workers, browser HTTP cache, SSR hydration payloads, and
204
+ framework-persisted query caches can revive old private or schema-incompatible values after
205
+ reload, logout, tenant switch, deploy, or rollback.
206
+ - Persisted private caches should be partitioned or cleared by user id, tenant id, schema version,
207
+ permission context, locale where relevant, and app build or service-worker version when needed.
208
+ - Test or review multi-tab, multi-device, admin-versus-user, logout/login, tenant switch,
209
+ background refresh, and hydration-first-visible-state paths when those risks exist.
210
+ 15. Check cache layers.
176
211
  - Local in-memory cache splits truth per server. L1, L2, and DB each need TTL, invalidation,
177
212
  bypass, and failure behavior.
178
213
  - Deleting L2 while L1 survives can leave "sometimes stale" bugs that depend on load-balancer
179
214
  routing.
180
- 12. Check cache outage fallback.
215
+ 16. Check cache outage fallback.
181
216
  - Redis down plus unbounded DB fallback can kill the source. Fallback needs rate limit, load
182
217
  shedding, stale serve, circuit breaker, bulkhead, or another source-protection mechanism.
183
218
  - Decide whether cache failure is disposable or correctness-sensitive. Sessions, permissions,
184
219
  rate limits, inventory, idempotency, and dedupe caches are not ordinary performance caches.
185
220
  - Compare normal cached traffic with an allowed bypass path or known miss path when evidence is
186
221
  available. If bypass is faster, fresher, or more correct, the cache policy itself is suspect.
187
- 13. Check Redis keyspace and memory behavior.
222
+ 17. Check Redis keyspace and memory behavior.
188
223
  - Review value size, key size, key schema, bounded key cardinality, max memory, eviction policy,
189
224
  expired keys, evicted keys, and whether TTL-less keys are turning cache into state storage.
190
225
  - `noeviction` makes writes fail at memory limit. `volatile-*` policies only evict keys with TTL,
191
226
  so TTL-less keys can crowd out real cache behavior.
192
227
  - `KEYS *` in application code is a production bomb. Use `SCAN` only from bounded admin or
193
228
  maintenance paths with explicit limits.
194
- 14. Check Redis latency, replication, and distribution.
229
+ 18. Check Redis latency, replication, and distribution.
195
230
  - Redis Slow Log does not include client round-trip time, connection wait, serialization,
196
231
  application loop overhead, DNS, TLS, or network path time. Do not use it as the only latency
197
232
  proof.
198
233
  - Review replica lag, failover behavior, cold replica warmup, persistence spikes, memory
199
234
  fragmentation, client connection pools, shard imbalance, and command mix when a cache incident
200
235
  is operational rather than semantic.
201
- 15. Check hot keys and Redis Cluster distribution.
236
+ 19. Check hot keys and Redis Cluster distribution.
202
237
  - Sharding does not save one hot key. Use replicas, local L1, request coalescing, prewarm,
203
238
  chunking, or workload-specific splitting where semantics allow it.
204
239
  - Redis Cluster hash tags are useful for intentional multi-key locality, but overusing the same
205
240
  tag can force too many keys into one slot.
206
- 16. Check HTTP cache semantics.
241
+ 20. Check HTTP cache semantics.
207
242
  - If responses vary by `Authorization`, `Cookie`, `Accept-Language`, `Accept-Encoding`, content
208
243
  negotiation, or user context, verify `Vary` and cache-control behavior.
209
244
  - `no-cache` means revalidate before reuse. `no-store` means do not store. Do not use one when
210
245
  the other is required.
211
246
  - Check freshness, validation, private versus public cacheability, CDN behavior, browser behavior,
212
247
  and generated-client or proxy expectations.
213
- 17. Check permission and entitlement caches as security boundaries.
248
+ 21. Check permission and entitlement caches as security boundaries.
214
249
  - A permission cache, role cache, organization-membership cache, subscription cache, admin cache,
215
250
  or entitlement cache must be invalidated by revocation, role change, organization move,
216
251
  subscription expiry, ownership change, and emergency access changes.
217
252
  - Short TTL alone is not enough for decisions that should fail closed or revoke promptly.
218
- 18. Check cache warming and cold-start behavior.
253
+ 22. Check cache warming and cold-start behavior.
219
254
  - Deployment, autoscale, failover, and rollback can create synchronized cold caches that push
220
255
  traffic to the source.
221
256
  - Prewarm only keys with clear ownership and backpressure. Do not build an unbounded warming job
222
257
  that becomes the outage.
223
258
  - Load-test or smoke the cold, warm, failover, replica-lag, source-slow, and cache-down scenarios
224
259
  when the repository has configured evidence. Otherwise report those as manual operational gaps.
225
- 19. Check observability.
260
+ 23. Check observability.
226
261
  - Hit rate alone lies. Break down hits, misses, bypasses, stale serves, refreshes, negative hits,
227
262
  refresh failures, evictions, expirations, fallback serves, Redis errors, and set failures by
228
263
  endpoint, key-pattern, tenant, status-code, and cache layer where useful.
@@ -232,13 +267,17 @@ and what happens to the source system when the cache misses or fails?"
232
267
  cache write failures, and whether a high hit rate hides a small set of expensive miss paths.
233
268
  - Keep cache metrics labels bounded; put high-cardinality keys in logs or traces only when the
234
269
  repository privacy rules allow it.
235
- 20. Check tests beyond the happy path.
270
+ - For developer or support diagnostics, expose safe provenance such as cache key class, fetchedAt,
271
+ staleAt, dataVersion, source, lastInvalidatedAt, lastMutationId, writer, isOptimistic, and
272
+ isHydrated when local UI or tooling patterns allow it.
273
+ 24. Check tests beyond the happy path.
236
274
  - "Second call is faster" is not enough.
237
275
  - Cover concurrent misses, update during read, delete then recreate, source failure, Redis
238
- failure, synchronized TTL expiry, old-version cached value, permission change, tenant
239
- separation, list invalidation, negative-cache classification, deploy rollback, and cache-layer
240
- bypass when those risks exist.
241
- 21. Label evidence honestly. If the repository lacks deterministic cache, Redis, CDN, HTTP, browser,
276
+ failure, synchronized TTL expiry, old-version cached value, stale response after newer value,
277
+ partial response after detail response, permission change, tenant separation, list invalidation,
278
+ negative-cache classification, optimistic failure, persisted-storage reset, deploy rollback,
279
+ and cache-layer bypass when those risks exist.
280
+ 25. Label evidence honestly. If the repository lacks deterministic cache, Redis, CDN, HTTP, browser,
242
281
  or load tests, report the missing evidence instead of claiming the cache is safe.
243
282
 
244
283
  <!-- mustflow-section: postconditions -->
@@ -248,6 +287,8 @@ and what happens to the source system when the cache misses or fails?"
248
287
  and observability are explicit or reported as missing.
249
288
  - Tenant, viewer, permission, entitlement, feature-flag, locale, query, schema-version, and header
250
289
  variance cannot silently share the wrong value.
290
+ - Partial entity responses, stale async results, optimistic mutations, persisted browser storage, SSR
291
+ hydration, multi-tab state, and version conflicts cannot silently overwrite or revive the wrong value.
251
292
  - Stampede, synchronized expiry, negative cache, invalidation ordering, update race, list cache,
252
293
  page cache, tag invalidation, L1/L2 layering, Redis outage, hot key, Redis Cluster, and HTTP cache
253
294
  semantics are fixed or reported where relevant.
@@ -297,8 +338,9 @@ browser, server, benchmark, or load-test commands outside the command contract.
297
338
  decisions
298
339
  - Key normalization, key version, query normalization, viewer context, tenant and permission boundary
299
340
  checks
300
- - Stampede, negative-cache, invalidation-order, update-race, list/page/tag, L1/L2, Redis, hot-key,
301
- HTTP cache, permission-cache, warming, and observability checks where relevant
341
+ - Stampede, negative-cache, invalidation-order, update-race, stale async state, partial-entity,
342
+ optimistic-update, persisted-storage, hydration, list/page/tag, L1/L2, Redis, hot-key, HTTP cache,
343
+ permission-cache, warming, and observability checks where relevant
302
344
  - Cache-integrity fixes made or recommended
303
345
  - Evidence level: configured-test evidence, static review risk, manual-only, missing, or not applicable
304
346
  - Command intents run
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: skill.concurrency-invariant-review
3
3
  locale: en
4
4
  canonical: true
5
- revision: 1
5
+ revision: 2
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: concurrency-invariant-review
@@ -59,6 +59,7 @@ The review question is not "is the code correct in this order?" The stronger que
59
59
  - Invariant: the business or data fact that must remain true across multiple fields, rows, messages, callbacks, operations, or lifecycle states.
60
60
  - Time-order points: `await`, I/O, DB calls, callbacks, event listeners, plugin hooks, logging, metrics, lock release, condition wait, notify, retry, timeout, queue ack, scheduler tick, cancellation, shutdown, close, send, and publication.
61
61
  - Synchronization evidence: exact lock identity, lock order, condition predicate, atomic memory-ordering story, transaction isolation, row lock, unique constraint, fencing token, idempotency record, queue dedupe, or deterministic test harness.
62
+ - Failure evidence for timing bugs: incident file, wait-for graph, lock-order graph, happens-before handoff logs, generation counters, pool saturation, and configured or manual sanitizer, detector, record/replay, profiler, or kernel-tracing evidence when available.
62
63
  - Runtime and deployment shape: single thread, worker pool, process pool, multi-instance service, distributed cache, database, queue, scheduler, coroutine runtime, or reactive runtime.
63
64
 
64
65
  <!-- mustflow-section: preconditions -->
@@ -102,9 +103,11 @@ The review question is not "is the code correct in this order?" The stronger que
102
103
  - Record nested acquisition order such as `account lock -> ledger lock -> notification lock`.
103
104
  - Reject paths that acquire the same pair in reverse order unless the runtime and lock type make that impossible.
104
105
  - Check reentrant callbacks and external code called under a lock for hidden reacquisition.
106
+ - When local instrumentation exists, prefer a runtime lock-order graph that records edges from already-held locks to newly acquired locks and fails on cycles.
105
107
  7. Check condition variables and notifications by state, not signal.
106
108
  - A condition variable wait should be inside a loop that rechecks the predicate.
107
109
  - The loop must tolerate spurious wakeup, another waiter consuming the work first, and notifications that arrive before this worker starts waiting.
110
+ - Prefer generation counters or versioned predicates when the same event can be missed, duplicated, delayed, or consumed by another waiter.
108
111
  - `notify` and state changes should happen under the same synchronization boundary.
109
112
  - A lost notification is possible when code trusts the signal instead of a persistent state predicate.
110
113
  8. Check atomics, memory visibility, and CAS.
@@ -136,21 +139,27 @@ The review question is not "is the code correct in this order?" The stronger que
136
139
  - Shutdown should define stop-accepting, drain, cancel, flush, close, and in-flight side-effect ownership.
137
140
  - `closed = true` is not enough if futures, workers, sockets, buffers, queues, or async continuations keep running.
138
141
  - Mutexes, semaphores, read-write locks, connection checkouts, rate-limit tokens, and permits must release on every exception path.
139
- 15. Check thread-local and async context.
142
+ 15. Check deadlocks and starvation as wait-for systems.
143
+ - A thread stack dump alone is not enough. Build a wait-for graph that connects threads, locks, condition variables, futures, queues, pool workers, callbacks, and external waits.
144
+ - Separate lock-order deadlock, lost notification, callback reentry, sync-over-async, and thread-pool starvation; a saturated pool can freeze progress without any mutex cycle.
145
+ - Record executor queue length, active worker count, blocked worker count, work-stealing or scheduler state, and blocking waits inside worker pools when local evidence exists.
146
+ 16. Check thread-local and async context.
140
147
  - Thread-local context is hidden global state in thread pools.
141
148
  - Clear request, tenant, auth, transaction, and locale context before the thread is reused.
142
149
  - Async, coroutine, virtual-thread, and reactive runtimes can break assumptions that thread-local state follows logical work.
143
150
  - Treat every `await` as a point where the world can change before the continuation resumes.
144
- 16. Check concurrency tests as evidence, not decoration.
151
+ 17. Check concurrency tests as evidence, not decoration.
145
152
  - `Thread.sleep(100)` is not deterministic proof.
146
153
  - Prefer barriers, latches, fake schedulers, deterministic executors, controlled promises, transactional fixtures, version assertions, queue dedupe fixtures, and explicit interleaving tests.
147
154
  - Use stress or repeated tests only as supplementary evidence when deterministic ordering is unavailable.
155
+ - Treat sanitizer, detector, model-checker, record/replay, profiler, and kernel-scheduler diagnostics as configured or manual evidence only; report them when useful but unavailable.
148
156
 
149
157
  <!-- mustflow-section: postconditions -->
150
158
  ## Postconditions
151
159
 
152
160
  - Shared state, owners, invariants, and time-order points are named or missing evidence is reported.
153
161
  - Locks, atomics, conditions, transactions, distributed leases, queues, schedulers, shutdown, thread-local context, async yields, collections, caches, and tests are checked where relevant.
162
+ - Deadlock, starvation, lost-notification, and lock-order claims are backed by wait-for, lock-order, generation, pool, or configured/manual diagnostic evidence when relevant.
154
163
  - The chosen fix or recommendation preserves the whole invariant, not just one field or one method call.
155
164
  - Deterministic evidence covers the highest-risk interleaving when the repository has a configured way to exercise it.
156
165
 
@@ -186,6 +195,7 @@ Prefer the narrowest configured test, build, docs, release, or mustflow intent t
186
195
  - Invariant and time-order table reviewed
187
196
  - Check-then-act and read-modify-write findings
188
197
  - Lock identity, lock scope, lock order, condition variable, atomics, memory visibility, CAS ABA, publication, immutability, collections, cache, database, distributed lock, idempotency, queue duplicate, state transition, scheduler, shutdown, resource release, thread-local, async `await`, and test-evidence checks where relevant
198
+ - Wait-for graph, lock-order graph, generation counter, pool-starvation, and configured/manual diagnostic evidence where relevant
189
199
  - Concurrency fixes made or recommended
190
200
  - Tests or verification evidence
191
201
  - Command intents run
@@ -2,11 +2,11 @@
2
2
  mustflow_doc: skill.cross-platform-filesystem-safety
3
3
  locale: en
4
4
  canonical: true
5
- revision: 6
5
+ revision: 7
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: cross-platform-filesystem-safety
9
- description: Apply this skill when file paths, directories, symlinks, reparse points, real paths, path traversal, reserved names, null bytes, atomic file writes, temporary files, file copies, generated outputs, clone or checkout materialization, Windows/POSIX path behavior, line endings, file permissions, durable writes, failure classification, or filesystem cleanup are created, changed, reviewed, or reported.
9
+ description: Apply this skill when file paths, directories, symlinks, reparse points, real paths, path traversal, reserved names, null bytes, NTFS alternate data streams, Windows 8.3 short names, Windows namespace prefixes, atomic file writes, temporary files, file copies, generated outputs, clone or checkout materialization, Windows/POSIX path behavior, line endings, file permissions, durable writes, failure classification, or filesystem cleanup are created, changed, reviewed, or reported.
10
10
  metadata:
11
11
  mustflow_schema: "1"
12
12
  mustflow_kind: procedure
@@ -35,6 +35,7 @@ Keep filesystem behavior safe across Windows and POSIX while preventing path tra
35
35
  - A change handles user-provided paths, repository-relative paths, real paths, symlinks, Windows reparse points or junctions, temporary files, generated output, backups, manifests, locks, caches, or latest pointers.
36
36
  - Code materializes large or externally sourced trees such as Git checkouts, cloned repositories, project scaffolds, dependency trees, archive extractions, template installs, generated snapshots, or package artifacts.
37
37
  - Behavior must work on Windows and POSIX path separators, drive roots, case differences, reserved names, maximum path lengths, executable extensions, line endings, permissions, or rename semantics.
38
+ - Code or config serves files to a browser, preview server, dev server, test UI, static asset server, attachment endpoint, snapshot endpoint, or package artifact where a denied path, filename alias, or platform-specific path form could expose private files.
38
39
  - A test or final report claims a path is inside the project, symlink-safe, traversal-safe, race-safe, atomic, idempotent, cleanup-safe, or cross-platform.
39
40
 
40
41
  <!-- mustflow-section: do-not-use-when -->
@@ -49,7 +50,7 @@ Keep filesystem behavior safe across Windows and POSIX while preventing path tra
49
50
 
50
51
  - Affected path inputs, output paths, base directory, trust boundary, and whether each path is user-controlled, template-controlled, generated, or repository-owned.
51
52
  - Current filesystem helpers, path validation rules, symlink policy, case-sensitivity policy, write strategy, cleanup strategy, temporary-file strategy, permission strategy, and platform expectations.
52
- - Expected behavior for missing paths, existing files, directories, symlinks, dangling symlinks, reparse points or junctions, path traversal, null bytes, Windows namespace prefixes, Windows reserved names, alternate data streams, trailing spaces or dots, collisions, long paths, large files, and permissions errors.
53
+ - Expected behavior for missing paths, existing files, directories, symlinks, dangling symlinks, reparse points or junctions, path traversal, null bytes, Windows namespace prefixes, Windows reserved names, NTFS alternate data streams, Windows 8.3 short names, trailing spaces or dots, collisions, long paths, large files, and permissions errors.
53
54
  - Path-length, filename-length, collision, staging, promotion, and cleanup expectations for clone, checkout, scaffold, install, archive, and generated-tree flows, including the deepest known entry path when available.
54
55
  - Failure classification expectations for filesystem and platform errors such as Windows path length, POSIX `ENAMETOOLONG`, reserved names, case collisions, Unicode aliases, file locks, permissions, quota, cross-device moves, missing executable bits, line endings, watcher limits, and descriptor limits.
55
56
  - Whether atomicity requires best-effort rename, same-directory temporary files on the same volume, file fsync, parent directory fsync, Windows replacement behavior, or reader-safe latest pointers.
@@ -69,7 +70,7 @@ Keep filesystem behavior safe across Windows and POSIX while preventing path tra
69
70
  - Prefer repository-local safe helpers over ad hoc path string checks.
70
71
  - Do not rely on string prefix checks alone when symlinks, drive roots, or real paths matter.
71
72
  - Do not lowercase paths as a universal containment strategy. Case-insensitive comparison may be appropriate for a specific platform boundary, but it must not collapse distinct POSIX paths or replace real containment checks.
72
- - Do not accept null bytes, Windows device names, namespace bypass prefixes, alternate data streams, or platform-invalid path segments as ordinary filenames.
73
+ - Do not accept null bytes, Windows device names, namespace bypass prefixes, alternate data streams, 8.3 short-name aliases, or platform-invalid path segments as ordinary filenames.
73
74
  - Do not recursively delete, overwrite, or copy broad directories unless the target is resolved, bounded, and intentionally owned by the task.
74
75
  - Do not claim operating-system mitigations such as Windows RedirectionGuard unless the application actually enables and verifies the mitigation in the relevant process boundary.
75
76
  - Do not change system-wide or user-wide settings such as Windows registry long-path flags, global Git config, Developer Mode, WSL mount metadata, Linux sysctl limits, Docker Desktop storage backends, antivirus exclusions, or shell profile files from this skill. Report the missing prerequisite or require an explicit configured setup command.
@@ -78,7 +79,7 @@ Keep filesystem behavior safe across Windows and POSIX while preventing path tra
78
79
  ## Procedure
79
80
 
80
81
  1. Classify each path as trusted repository path, user input, generated state, template source, package artifact, temporary file, external path, or unknown.
81
- 2. Reject impossible or dangerous path text early. Check null bytes, empty segments, absolute paths where relative paths are required, Windows device names such as `CON` or `NUL`, namespace prefixes such as `\\?\`, alternate data streams using colon segments, trailing dots or spaces when Windows compatibility matters, and platform-invalid characters before writing.
82
+ 2. Reject impossible or dangerous path text early. Check null bytes, empty segments, absolute paths where relative paths are required, Windows device names such as `CON` or `NUL`, namespace prefixes such as `\\?\`, alternate data streams using colon segments, 8.3 short-name aliases such as generated `PROGRA~1`-style names, trailing dots or spaces when Windows compatibility matters, and platform-invalid characters before writing.
82
83
  3. Establish the base boundary. Use normalized repository-relative paths for storage and real-path checks for filesystem safety when symlinks may be present.
83
84
  4. Use Unicode normalization for validation only when detecting platform aliases such as superscript Windows device-name variants. Do not rewrite or persist normalized filenames unless the repository policy explicitly says so.
84
85
  5. For externally sourced trees, use a `preflight -> dangerous operation -> classifier -> safe cleanup` pipeline. Estimate the materialized path budget before writing, including destination root, project directory, generated subdirectories, deepest known repository or archive entry, Windows path-length behavior, POSIX path and component limits, byte limits, case collisions, reserved names, and safety headroom.
@@ -86,13 +87,13 @@ Keep filesystem behavior safe across Windows and POSIX while preventing path tra
86
87
  7. For Windows Git checkout or clone materialization, prefer a per-invocation `core.longpaths=true` setting when product code invokes Git. Do not mutate global Git config from application code unless the user explicitly chose that setup action. Long-path support still depends on operating-system, Git, filesystem, and downstream tool behavior, so checkout failures must remain classifiable.
87
88
  8. For symlink-heavy repositories on Windows, detect whether checkout produced real links or plain-text symlink stubs before running build logic. Report missing Developer Mode, `core.symlinks`, or native symlink support as an environment prerequisite; do not silently replace file symlinks with junctions or copies unless the repository contract explicitly supports that compatibility mode.
88
89
  9. For POSIX, do not assume that forward slashes make paths safe. Check `ENAMETOOLONG`, byte-based per-component name limits, mount permissions, executable bits, case-sensitive import paths, symlink loops, file descriptor limits, watcher limits, quota, and cross-device rename behavior.
89
- 10. Check containment with path-aware logic. Prefer relative-path or resolved-path containment helpers over raw string prefixes, and include a path-separator boundary so partial path traversal cannot let sibling names masquerade as children.
90
+ 10. Check containment with path-aware logic. Prefer relative-path or resolved-path containment helpers over raw string prefixes, and include a path-separator boundary so partial path traversal cannot let sibling names masquerade as children. Apply deny rules to the same canonical path form that will be opened, not to a raw URL or display path that the operating system may reinterpret.
90
91
  11. Check case behavior explicitly. Windows and many macOS volumes preserve case but compare case-insensitively by default; POSIX commonly compares case-sensitively. State whether the code preserves spelling, rejects conflicting names, or relies on the host filesystem.
91
92
  12. Check collisions before materializing Git trees, archives, generated files, uploaded names, or dependency trees. Include case-only collisions, Unicode normalization aliases, reserved Windows names with extensions, trailing dot or space aliases, duplicate archive entries, and byte-limit collisions from multibyte names.
92
93
  13. Check symlink, reparse point, and junction behavior explicitly. Decide whether they are rejected, followed only within the root, or treated as ordinary path entries. Test dangling, outside-target, loop, text-stub, and junction-like cases when relevant.
93
94
  14. Close time-of-check to time-of-use gaps where practical. Prefer opening or writing through safe helpers that reject symlinks at the final operation, then verify the opened target when the platform and helper support it.
94
95
  15. Treat high-level path APIs as incomplete defenses when the runtime cannot expose descriptor-relative open, no-follow, or opened-file verification. Do not claim race-free behavior from resolve-then-open code alone.
95
- 16. Check traversal and root handling across platforms. Account for absolute paths, drive letters, UNC-like paths, mixed separators, empty paths, dot segments, reserved names, long paths, and case sensitivity where relevant.
96
+ 16. Check traversal and root handling across platforms. Account for absolute paths, drive letters, UNC-like paths, mixed separators, empty paths, dot segments, reserved names, long paths, case sensitivity, NTFS alternate data streams, 8.3 short names, and Windows namespace prefixes where relevant.
96
97
  17. Classify filesystem failures before generic network, auth, or unknown failures. Use stable categories such as `path_too_long`, `filename_too_long`, `byte_limit_exceeded`, `invalid_path`, `reserved_name`, `case_collision`, `unicode_collision`, `symlink_escape`, `permission_denied`, `file_locked`, `cross_device_move`, `disk_full_or_quota`, `executable_bit_missing`, `line_ending_mismatch`, `watcher_limit`, and `descriptor_limit`.
97
98
  18. For writes, prefer same-directory temporary-file then rename or replace behavior when readers may observe the file. Keep the temporary file on the same volume, use unpredictable names, least-privilege creation permissions, and safe no-follow writes when the project already has that helper.
98
99
  19. Treat atomic writes as platform-specific. POSIX rename semantics, Windows replacement behavior, cross-filesystem moves, network filesystems, fsync availability, and directory fsync support differ; report best-effort guarantees honestly.
@@ -136,7 +137,7 @@ Use release checks when template files, package artifacts, or installed workflow
136
137
  - If root containment is unclear, stop before writing or deleting and report the ambiguous path owner.
137
138
  - If the platform cannot prove symlink-safe behavior, fail closed or document the exact remaining gap.
138
139
  - If atomic replace, file fsync, parent directory fsync, no-follow open, or final-target verification is not available on the platform, downgrade the claim to best-effort and keep the write boundary narrow.
139
- - If Unicode normalization, Windows namespace prefixes, alternate data streams, or reparse points could change the effective target, fail closed or report the exact unhandled path class.
140
+ - If Unicode normalization, Windows namespace prefixes, alternate data streams, 8.3 short names, or reparse points could change the effective target, fail closed or report the exact unhandled path class.
140
141
  - If clone, checkout, scaffold, install, extraction, or generated-tree materialization fails, classify filesystem and platform causes before reporting network, token, auth, dependency, or unknown causes.
141
142
  - If a fix requires elevated host settings or global user configuration, stop at a clear prerequisite report unless an explicit configured command intent and user request authorize the setup.
142
143
  - If a test depends on platform-specific symlink support or permissions, state the platform boundary and keep assertions narrow.
@@ -147,7 +148,7 @@ Use release checks when template files, package artifacts, or installed workflow
147
148
 
148
149
  - Filesystem surface reviewed
149
150
  - Path trust classes, invalid-name handling, case policy, and root boundary
150
- - Null byte, reserved-name, Unicode normalization, namespace prefix, alternate data stream, symlink, reparse-point, traversal, race, atomic write, durability, permission, copy, delete, scan, and cleanup decisions
151
+ - Null byte, reserved-name, Unicode normalization, namespace prefix, alternate data stream, 8.3 short-name, symlink, reparse-point, traversal, race, atomic write, durability, permission, copy, delete, scan, and cleanup decisions
151
152
  - Clone, checkout, scaffold, install, extraction, preflight, staging, promotion, path-length, collision, failure-taxonomy, and diagnostic-preservation decisions
152
153
  - Host-setting prerequisites reported or deferred
153
154
  - Windows/POSIX assumptions and skipped platform checks
@@ -2,11 +2,11 @@
2
2
  mustflow_doc: skill.dependency-upgrade-review
3
3
  locale: en
4
4
  canonical: true
5
- revision: 5
5
+ revision: 6
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: dependency-upgrade-review
9
- description: Apply this skill when dependency versions, lockfiles, package manager metadata, security advisory fixes, generated dependency outputs, runtime engine constraints, Python runtime support, peer dependency contracts, framework plugins, TypeScript compiler tracks, CI actions, Docker base images, or toolchain versions are upgraded, downgraded, pinned, widened, regenerated, reviewed, or reported.
9
+ description: Apply this skill when dependency versions, lockfiles, package manager metadata, security advisory fixes, vulnerability scanner alerts, generated dependency outputs, runtime engine constraints, Python runtime support, peer dependency contracts, framework plugins, dev servers, test runners, TypeScript compiler tracks, CI actions, Docker base images, or toolchain versions are upgraded, downgraded, pinned, widened, regenerated, reviewed, or reported.
10
10
  metadata:
11
11
  mustflow_schema: "1"
12
12
  mustflow_kind: procedure
@@ -56,6 +56,7 @@ Review dependency upgrades as runtime, build, security, package, and generated-o
56
56
  - Ecosystem and package manager: JavaScript or TypeScript, Python, Go, Rust, JVM, .NET, Ruby, PHP, Swift, Docker, CI actions, or another declared system.
57
57
  - Package declarations, lockfiles, workspace files, runtime-version files, package-manager config, toolchain files, CI/Docker files, generated outputs, and command contract entries.
58
58
  - Release notes, migration notes, changelog, advisory range, fixed range, compatibility notes, or local issue evidence when available from approved context.
59
+ - Advisory exploit preconditions, including operating system, host binding, public network exposure, dev-server mode, privileged UI/API flags, protocol peer role, unauthenticated reachability, and whether the affected package runs in production, CI, development, containers, or remote workspaces.
59
60
  - Impacted runtime paths, build paths, test paths, generated clients, mocks, fixtures, docs examples, deployment images, and package publish output.
60
61
 
61
62
  <!-- mustflow-section: preconditions -->
@@ -93,9 +94,11 @@ Review dependency upgrades as runtime, build, security, package, and generated-o
93
94
  8. For security upgrades, keep the patch narrow. Identify advisory id, affected range, fixed range, direct or transitive path, exploit-relevant code path, minimum patched version, scanner recheck, and whether stricter validation, escaping, TLS, redirect, auth, or parser behavior can break callers.
94
95
  - For lockfile-only or transitive vulnerability alerts, do not treat the lockfile line as the root cause. Trace the vulnerable package back to the direct dependency or framework plugin that resolves it, then update the narrowest parent version, override, or package-manager resolution that satisfies the fixed range.
95
96
  - After regenerating the lockfile, confirm the old vulnerable version is absent from the resolved graph and that any override is recorded in the manifest rather than hidden as unexplained lockfile churn.
97
+ - For devDependency advisories, decide whether the affected tool ever binds to a non-localhost host, runs in a container with published ports, serves worktree files, exposes a browser or test UI, accepts remote API tokens, writes source or snapshot files, reruns tests, or executes project code. A devDependency can still be security-sensitive when it is reachable from another machine or CI/preview surface.
98
+ - For protocol and crypto dependency advisories, classify whether the package acts as client, server, agent, parser, verifier, or keyring. Check unauthenticated reachability, panic or assertion behavior, attacker-controlled key sizes, packet or frame ordering, unsolicited responses, and resource exhaustion before reducing the finding to "DoS only".
96
99
  9. Review the lockfile as a graph, not a blob. Check direct and transitive replacements, newly introduced packages, removed packages, optional/platform packages, source URLs, integrity or checksum changes, peer resolution, engine requirements, native prebuilds, and postinstall or lifecycle scripts.
97
100
  10. Review runtime boundaries that dependency upgrades commonly break: ESM/CJS and package `type`, `exports` and conditional exports, browser/node/edge conditions, Node engine support, Python dependency markers and extras, Go module path changes, Cargo feature unification, native builds, SSR/client split, WebView/native split, and generated client or SDK types.
98
- 11. Treat framework, plugin, code generator, formatter, linter, bundler, ORM, protobuf, OpenAPI, GraphQL, database driver, and test-runner upgrades as behavior changes when their output, config schema, plugin API, CLI flags, or generated code can change.
101
+ 11. Treat framework, plugin, code generator, formatter, linter, bundler, ORM, protobuf, OpenAPI, GraphQL, database driver, dev-server, browser-test, and test-runner upgrades as behavior changes when their output, config schema, plugin API, CLI flags, file-serving policy, privileged UI gates, or generated code can change.
99
102
  12. For Python runtime upgrades, treat `requires-python`, CI matrices, base images, dependency markers, wheels, packaging output, standard-library API availability, and security-default changes as one compatibility contract. Review version-gated standard-library usage and changed defaults before assuming the upgrade is only a dependency resolution change.
100
103
  13. For Python upgrades that adopt newer standard-library behavior, call out affected paths such as archive extraction, subprocess handling, async lifecycle, import/resource loading, typing surfaces, data-class shapes, and diagnostic flags. Keep fallbacks or compatibility wording when the repository still supports older interpreters.
101
104
  14. For TypeScript upgrades, classify the compiler track explicitly: TS6 stable API track through `@typescript/typescript6` and `tsc6`, TS7 RC compiler track through `typescript@rc` and `tsc`, TS7 nightly track through `@typescript/native-preview` and `tsgo`, future TS7 stable track through the stable `typescript` package, editor extension preview, or framework-owned wrapper. Do not treat a nightly package as a stable replacement for the `typescript` package unless the repository policy says so.
@@ -116,6 +119,7 @@ Review dependency upgrades as runtime, build, security, package, and generated-o
116
119
  - Python runtime upgrades classify standard-library availability, changed defaults, packaging output, and security-behavior impact.
117
120
  - TypeScript compiler-track changes distinguish TS6 stable API compatibility, TS7 RC compiler verification, TS7 nightly comparison work, and future TS7 stable adoption.
118
121
  - Security fixes are narrow unless the user explicitly accepted a broader modernization.
122
+ - Advisory exploit preconditions are checked against local scripts, config, CI, containers, remote workspaces, and docs before an alert is dismissed as development-only or unreachable.
119
123
  - Tests and scanners were not weakened to pass the upgrade.
120
124
 
121
125
  <!-- mustflow-section: verification -->
@@ -158,6 +162,7 @@ Prefer the narrowest configured intent that proves the actual upgraded dependenc
158
162
  - Python runtime, standard-library, packaging, and changed-default risks when relevant
159
163
  - TypeScript compiler-track, RC, nightly, and API compatibility risks when relevant
160
164
  - Security advisory and fixed-range notes when relevant
165
+ - Exploit preconditions, dev-server exposure, protocol role, and scanner recheck notes when relevant
161
166
  - Surfaces synchronized
162
167
  - Command intents run
163
168
  - Skipped dependency checks and reasons
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: skill.memory-lifetime-review
3
3
  locale: en
4
4
  canonical: true
5
- revision: 1
5
+ revision: 2
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: memory-lifetime-review
@@ -59,6 +59,7 @@ The question is not only "where was it allocated?" The stronger review question
59
59
  - Retainer graph: the longer-lived owner, the shorter-lived object, the reference path between them, and the expected point where that reference should be severed.
60
60
  - Repetition path: repeated requests, screen open/close, route changes, tab switches, reconnects, retries, scheduled runs, test cases, or long-running sessions that can accumulate retained state.
61
61
  - Error and success paths: normal completion, early return, partial read, cancellation, timeout, retry, exception, unmount, shutdown, and dependency failure behavior.
62
+ - Diagnostic evidence for native or low-level memory faults: first sanitizer or memory-checker report, invalid write/read address, watchpoint condition, allocator or quarantine behavior, fuzzing input, core dump, symbols, build id, shared library list, and configured or manual diagnostic boundary.
62
63
  - Relevant command-intent contract entries for tests, builds, docs, release checks, and mustflow validation.
63
64
 
64
65
  <!-- mustflow-section: preconditions -->
@@ -116,8 +117,21 @@ The question is not only "where was it allocated?" The stronger review question
116
117
  - C and C++: ownership transfer must be explicit across raw pointers, containers, callbacks, and failure paths; `shared_ptr` cycles need `weak_ptr` or a different ownership shape.
117
118
  - Rust: `Rc`, `Arc`, `RefCell`, task handles, channels, and cycles can leak even when memory safety is preserved; use weak ownership or explicit shutdown when ownership is not truly shared.
118
119
  - Python: weak references are useful for caches and observer maps, but not as a substitute for a clear lifetime owner; check global dicts, LRU caches, callbacks, generators, files, and async tasks.
119
- 11. Reject finalizers as the main plan. Finalizers, destructors, drop hooks, or weak callbacks can be last-resort diagnostics or safety nets, but the review should still identify deterministic cleanup for resources and reference removal.
120
- 12. Add a repeated-lifecycle proof when feasible. Prefer a focused test or probe that repeats the risky lifecycle, then asserts listener count, registry size, cache size, goroutine/task completion, handle closure, queue depth, or retained object count. If heap snapshots, leak profilers, sanitizer runs, or platform-specific diagnostics are not configured intents, report them as manual evidence gaps instead of running raw commands.
120
+ 11. For native or low-level memory corruption, chase the first invalid access instead of the crash line.
121
+ - Treat the crash line as a victim until the first invalid write, invalid read, use-after-free, double free, uninitialized value, or ownership violation is identified.
122
+ - Prefer the first sanitizer, memory-checker, or watchpoint report over later cascade failures.
123
+ - Use watchpoint, reverse-debugging, core dump, symbol, build-id, allocator, quarantine, or memory-poison evidence only through configured or manual diagnostics; do not infer raw commands from tool names.
124
+ 12. Separate diagnostic build axes when they exist.
125
+ - ASan/UBSan/LSan, TSan, MSan, release-with-asserts, debug allocator, guard-page allocator, hardware tagging, and fuzzing-with-sanitizers expose different bug classes and usually should be reported as separate configured or manual evidence surfaces.
126
+ - Do not claim memory-corruption proof from a normal unit test unless it actually exercises the ownership and lifetime boundary.
127
+ 13. Treat dangling references as ownership failures.
128
+ - Ask which owner promised the object would remain alive across async callbacks, observer lists, event buses, lambda captures, coroutines, workers, caches, intrusive lists, and queues.
129
+ - Prefer stable handles, owner id plus generation id, unregister-on-drop or RAII boundaries, weak-reference lock windows, and queueing copied identifiers instead of raw object pointers or references when local style supports them.
130
+ 14. Preserve production crash evidence when reproduction is unavailable.
131
+ - Core dump, exact binary, symbols, build id, shared library list, process maps, allocator state, failing input, and deployment version can be the only evidence for a memory fault.
132
+ - If those artifacts are unavailable or manual-only, report that boundary instead of implying the crash was diagnosed from logs alone.
133
+ 15. Reject finalizers as the main plan. Finalizers, destructors, drop hooks, or weak callbacks can be last-resort diagnostics or safety nets, but the review should still identify deterministic cleanup for resources and reference removal.
134
+ 16. Add a repeated-lifecycle proof when feasible. Prefer a focused test or probe that repeats the risky lifecycle, then asserts listener count, registry size, cache size, goroutine/task completion, handle closure, queue depth, or retained object count. If heap snapshots, leak profilers, sanitizer runs, memory-checker runs, fuzzers, core dump inspection, or platform-specific diagnostics are not configured intents, report them as manual evidence gaps instead of running raw commands.
121
135
 
122
136
  <!-- mustflow-section: postconditions -->
123
137
  ## Postconditions
@@ -126,6 +140,7 @@ The question is not only "where was it allocated?" The stronger review question
126
140
  - Long-lived owners no longer retain short-lived objects beyond their intended lifecycle, or the remaining retention is intentional and bounded.
127
141
  - Caches, queues, registries, debug stores, and logging or telemetry buffers have capacity, eviction, truncation, or copied-value boundaries where they can grow.
128
142
  - Async, stream, worker, goroutine, thread, and native-resource paths have deterministic cancellation, close, shutdown, or release behavior where the platform supports it.
143
+ - Native or low-level memory fault analysis names the first invalid access evidence or reports the missing diagnostic boundary instead of blaming the final crash line.
129
144
  - Tests or configured verification cover the highest-risk repeated lifecycle when feasible.
130
145
 
131
146
  <!-- mustflow-section: verification -->
@@ -162,6 +177,7 @@ Use the narrowest configured test, build, docs, release, or mustflow intent that
162
177
  - Retainer paths found or ruled out
163
178
  - Long-lived owners and short-lived objects checked
164
179
  - Timers, listeners, subscriptions, streams, workers, goroutines, threads, native handles, caches, queues, registries, closures, and logs checked where relevant
180
+ - First invalid access, diagnostic build axis, dangling ownership, fuzzing or core-dump evidence where relevant
165
181
  - Cleanup symmetry changes made or recommended
166
182
  - Repeated-lifecycle proof: configured, manual-only, missing, or not applicable
167
183
  - Command intents run