mustflow 2.115.11 → 2.115.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -302,7 +302,7 @@ mf run mustflow_update_apply
302
302
  | `mf script-pack list` | List bundled script packs, script refs, routing hints, side-effect flags, input/output labels, and JSON schema files. |
303
303
  | `mf script-pack suggest --changed --json` | Rank optional read-only helpers for current changed files without running those helpers or granting command authority. |
304
304
  | `mf script-pack suggest --path <path> --phase before_change` | Rank helpers for an explicit path and workflow phase before deciding which script to run. |
305
- | `mf script-pack run code/outline scan <path...> --json` | Scan supported source files for symbol headers, line ranges, source anchors, return metadata, and content hashes. |
305
+ | `mf script-pack run code/outline scan <path...> --json` | Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers, line ranges, source anchors, return metadata, and content hashes. |
306
306
  | `mf script-pack run code/dependency-graph scan <path...> --json` | Trace bounded relative import, export, require, and dynamic import edges for TypeScript and JavaScript source files. |
307
307
  | `mf script-pack run code/module-boundary check <path...> --json` | Check configured module-boundary import rules, import cycles, public entrypoints, feature imports, and shared budgets. |
308
308
  | `mf script-pack run code/change-impact analyze --base HEAD --json` | Analyze changed files and return bounded impact candidates, script-pack hints, and verification intent hints. |
@@ -482,7 +482,7 @@ mf run release_npm_publish
482
482
  mf run release_npm_published_verify
483
483
  ```
484
484
 
485
- The Bun scripts remain available for human maintainers and release packaging. `test_fast` runs the fast CLI regression baseline, `test_related` selects tests from changed files and falls back to the fast baseline, and both use 8 Node test workers by default. Set `MUSTFLOW_TEST_CONCURRENCY=1`, `2`, or another positive integer to tune those workers on local machines. `test_release` keeps package metadata and packaging checks out of routine local edits. `test_coverage` runs the fast CLI baseline through Node's built-in coverage report with no enforced threshold; set `MUSTFLOW_TEST_COVERAGE_CONCURRENCY=1`, `2`, or another positive integer to adjust its worker count. `lint` and test-audit are configured as narrow repository-local gates. `docs_validate_fast` checks documentation navigation and localized content links without building the entire static site; `docs_validate` performs the full static documentation build, search index, and sitemap gate for release-sensitive changes.
485
+ The Bun scripts remain available for human maintainers and release packaging. `test_fast` runs the fast CLI regression baseline, `test_related` selects tests from changed files and falls back to the fast baseline, and both use 8 Node test workers by default. Skill-body changes select only their owning authoring shard plus the lightweight install-surface contract, and `test_skill_contracts` exposes that seconds-scale contract path directly. Set `MUSTFLOW_TEST_CONCURRENCY=1`, `2`, or another positive integer to tune those workers on local machines. `test_release` keeps package metadata and packaging checks out of routine local edits. `test_coverage` runs the fast CLI baseline through Node's built-in coverage report with no enforced threshold; set `MUSTFLOW_TEST_COVERAGE_CONCURRENCY=1`, `2`, or another positive integer to adjust its worker count. `lint` and test-audit are configured as narrow repository-local gates. `docs_validate_fast` checks documentation navigation and localized content links without building the entire static site; `docs_validate` performs the full static documentation build, search index, and sitemap gate for release-sensitive changes.
486
486
 
487
487
  `dist/` is a generated build output and is not committed. `npm pack` and `npm publish` run `npm run build` via `prepack`, so the npm package contains the built CLI.
488
488
 
@@ -797,7 +797,7 @@ Read these files before working:
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "Scan TypeScript and JavaScript files for symbol headers and line ranges",
800
+ "scriptPack.script.codeOutline.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers and line ranges",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ Read these files before working:
825
825
  "scriptPack.error.unknownScript": "Unknown script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "Provide at least one suggestion input: --path <path>, --changed, --phase <phase>, or --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "Unknown script-pack phase: {phase}",
828
- "codeOutline.help.summary": "Scan TypeScript and JavaScript source files for declaration headers, line ranges, export flags, and content hashes.",
828
+ "codeOutline.help.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python source files for declaration headers, line ranges, export flags, and content hashes.",
829
829
  "codeOutline.help.option.maxFiles": "Maximum number of source files to scan. Default: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "Maximum bytes to read from each source file. Default: 1048576",
831
831
  "codeOutline.help.exit.ok": "The code outline was scanned without findings",
@@ -842,7 +842,7 @@ Read these files before working:
842
842
  "codeOutline.error.missingPath": "Provide at least one source file or directory to scan",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option} must be a positive safe integer: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option} must be a non-negative safe integer: {value}",
845
- "codeSymbolRead.help.summary": "Read a bounded TypeScript or JavaScript source snippet from a source anchor, symbol line, or explicit line range.",
845
+ "codeSymbolRead.help.summary": "Read a bounded supported-source snippet from a source anchor, symbol line, or explicit line range.",
846
846
  "codeSymbolRead.help.option.anchor": "Source anchor id to resolve to its target symbol",
847
847
  "codeSymbolRead.help.option.startLine": "1-based source line to resolve to a symbol or range",
848
848
  "codeSymbolRead.help.option.endLine": "Optional explicit 1-based end line; when omitted, the containing outline symbol is read",
@@ -797,7 +797,7 @@ Lee estos archivos antes de trabajar:
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "Scan TypeScript and JavaScript files for symbol headers and line ranges",
800
+ "scriptPack.script.codeOutline.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers and line ranges",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ Lee estos archivos antes de trabajar:
825
825
  "scriptPack.error.unknownScript": "Unknown script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "Provide at least one suggestion input: --path <path>, --changed, --phase <phase>, or --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "Unknown script-pack phase: {phase}",
828
- "codeOutline.help.summary": "Scan TypeScript and JavaScript source files for declaration headers, line ranges, export flags, and content hashes.",
828
+ "codeOutline.help.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python source files for declaration headers, line ranges, export flags, and content hashes.",
829
829
  "codeOutline.help.option.maxFiles": "Maximum number of source files to scan. Default: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "Maximum bytes to read from each source file. Default: 1048576",
831
831
  "codeOutline.help.exit.ok": "The code outline was scanned without findings",
@@ -842,7 +842,7 @@ Lee estos archivos antes de trabajar:
842
842
  "codeOutline.error.missingPath": "Provide at least one source file or directory to scan",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option} must be a positive safe integer: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option} must be a non-negative safe integer: {value}",
845
- "codeSymbolRead.help.summary": "Read a bounded TypeScript or JavaScript source snippet from a source anchor, symbol line, or explicit line range.",
845
+ "codeSymbolRead.help.summary": "Read a bounded supported-source snippet from a source anchor, symbol line, or explicit line range.",
846
846
  "codeSymbolRead.help.option.anchor": "Source anchor id to resolve to its target symbol",
847
847
  "codeSymbolRead.help.option.startLine": "1-based source line to resolve to a symbol or range",
848
848
  "codeSymbolRead.help.option.endLine": "Optional explicit 1-based end line; when omitted, the containing outline symbol is read",
@@ -797,7 +797,7 @@ Lisez ces fichiers avant de travailler :
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "Scan TypeScript and JavaScript files for symbol headers and line ranges",
800
+ "scriptPack.script.codeOutline.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers and line ranges",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ Lisez ces fichiers avant de travailler :
825
825
  "scriptPack.error.unknownScript": "Unknown script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "Provide at least one suggestion input: --path <path>, --changed, --phase <phase>, or --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "Unknown script-pack phase: {phase}",
828
- "codeOutline.help.summary": "Scan TypeScript and JavaScript source files for declaration headers, line ranges, export flags, and content hashes.",
828
+ "codeOutline.help.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python source files for declaration headers, line ranges, export flags, and content hashes.",
829
829
  "codeOutline.help.option.maxFiles": "Maximum number of source files to scan. Default: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "Maximum bytes to read from each source file. Default: 1048576",
831
831
  "codeOutline.help.exit.ok": "The code outline was scanned without findings",
@@ -842,7 +842,7 @@ Lisez ces fichiers avant de travailler :
842
842
  "codeOutline.error.missingPath": "Provide at least one source file or directory to scan",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option} must be a positive safe integer: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option} must be a non-negative safe integer: {value}",
845
- "codeSymbolRead.help.summary": "Read a bounded TypeScript or JavaScript source snippet from a source anchor, symbol line, or explicit line range.",
845
+ "codeSymbolRead.help.summary": "Read a bounded supported-source snippet from a source anchor, symbol line, or explicit line range.",
846
846
  "codeSymbolRead.help.option.anchor": "Source anchor id to resolve to its target symbol",
847
847
  "codeSymbolRead.help.option.startLine": "1-based source line to resolve to a symbol or range",
848
848
  "codeSymbolRead.help.option.endLine": "Optional explicit 1-based end line; when omitted, the containing outline symbol is read",
@@ -797,7 +797,7 @@ export const hiMessages = {
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "Scan TypeScript and JavaScript files for symbol headers and line ranges",
800
+ "scriptPack.script.codeOutline.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers and line ranges",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ export const hiMessages = {
825
825
  "scriptPack.error.unknownScript": "Unknown script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "Provide at least one suggestion input: --path <path>, --changed, --phase <phase>, or --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "Unknown script-pack phase: {phase}",
828
- "codeOutline.help.summary": "Scan TypeScript and JavaScript source files for declaration headers, line ranges, export flags, and content hashes.",
828
+ "codeOutline.help.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python source files for declaration headers, line ranges, export flags, and content hashes.",
829
829
  "codeOutline.help.option.maxFiles": "Maximum number of source files to scan. Default: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "Maximum bytes to read from each source file. Default: 1048576",
831
831
  "codeOutline.help.exit.ok": "The code outline was scanned without findings",
@@ -842,7 +842,7 @@ export const hiMessages = {
842
842
  "codeOutline.error.missingPath": "Provide at least one source file or directory to scan",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option} must be a positive safe integer: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option} must be a non-negative safe integer: {value}",
845
- "codeSymbolRead.help.summary": "Read a bounded TypeScript or JavaScript source snippet from a source anchor, symbol line, or explicit line range.",
845
+ "codeSymbolRead.help.summary": "Read a bounded supported-source snippet from a source anchor, symbol line, or explicit line range.",
846
846
  "codeSymbolRead.help.option.anchor": "Source anchor id to resolve to its target symbol",
847
847
  "codeSymbolRead.help.option.startLine": "1-based source line to resolve to a symbol or range",
848
848
  "codeSymbolRead.help.option.endLine": "Optional explicit 1-based end line; when omitted, the containing outline symbol is read",
@@ -797,7 +797,7 @@ export const koMessages = {
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "TypeScript JavaScript 파일에서 symbol header와 라인 범위를 스캔합니다",
800
+ "scriptPack.script.codeOutline.summary": "TypeScript, JavaScript, Astro, Svelte, Go, Rust, Python 파일에서 symbol header와 라인 범위를 스캔합니다",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ export const koMessages = {
825
825
  "scriptPack.error.unknownScript": "알 수 없는 script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "추천 입력을 하나 이상 제공하세요: --path <path>, --changed, --phase <phase>, 또는 --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "알 수 없는 script-pack phase: {phase}",
828
- "codeOutline.help.summary": "TypeScript JavaScript 소스 파일에서 declaration header, 라인 범위, export flag, content hash를 스캔합니다.",
828
+ "codeOutline.help.summary": "TypeScript, JavaScript, Astro, Svelte, Go, Rust, Python 소스 파일에서 declaration header, 라인 범위, export flag, content hash를 스캔합니다.",
829
829
  "codeOutline.help.option.maxFiles": "스캔할 최대 소스 파일 수입니다. 기본값: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "각 소스 파일에서 읽을 최대 바이트입니다. 기본값: 1048576",
831
831
  "codeOutline.help.exit.ok": "code outline을 finding 없이 스캔했습니다",
@@ -842,7 +842,7 @@ export const koMessages = {
842
842
  "codeOutline.error.missingPath": "스캔할 소스 파일이나 디렉터리를 하나 이상 제공하세요",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option}은 양의 safe integer여야 합니다: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option}은 0 이상의 safe integer여야 합니다: {value}",
845
- "codeSymbolRead.help.summary": "source anchor, symbol 라인, 또는 명시 라인 범위에서 제한된 TypeScript 또는 JavaScript source snippet을 읽습니다.",
845
+ "codeSymbolRead.help.summary": "source anchor, symbol 라인, 또는 명시 라인 범위에서 지원되는 소스의 제한된 snippet을 읽습니다.",
846
846
  "codeSymbolRead.help.option.anchor": "target symbol로 해석할 source anchor id입니다",
847
847
  "codeSymbolRead.help.option.startLine": "symbol 또는 범위로 해석할 1-based source line입니다",
848
848
  "codeSymbolRead.help.option.endLine": "선택적 1-based end line입니다. 생략하면 포함하는 outline symbol을 읽습니다",
@@ -797,7 +797,7 @@ export const zhMessages = {
797
797
  "scriptPack.pack.docs.summary": "Documentation reference utility scripts",
798
798
  "scriptPack.pack.test.summary": "Test evidence and performance utility scripts",
799
799
  "scriptPack.pack.repo.summary": "Repository-boundary utility scripts",
800
- "scriptPack.script.codeOutline.summary": "Scan TypeScript and JavaScript files for symbol headers and line ranges",
800
+ "scriptPack.script.codeOutline.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python files for symbol headers and line ranges",
801
801
  "scriptPack.script.codeDependencyGraph.summary": "Trace relative TypeScript and JavaScript dependency graph edges",
802
802
  "scriptPack.script.codeImportCycle.summary": "Detect relative TypeScript and JavaScript import cycles with line evidence",
803
803
  "scriptPack.script.codeModuleBoundary.summary": "Check configured module boundary import rules and shared budgets",
@@ -825,7 +825,7 @@ export const zhMessages = {
825
825
  "scriptPack.error.unknownScript": "Unknown script-pack script: {script}",
826
826
  "scriptPack.error.missingSuggestInput": "Provide at least one suggestion input: --path <path>, --changed, --phase <phase>, or --skill <skill>",
827
827
  "scriptPack.error.unknownPhase": "Unknown script-pack phase: {phase}",
828
- "codeOutline.help.summary": "Scan TypeScript and JavaScript source files for declaration headers, line ranges, export flags, and content hashes.",
828
+ "codeOutline.help.summary": "Scan TypeScript, JavaScript, Astro, Svelte, Go, Rust, and Python source files for declaration headers, line ranges, export flags, and content hashes.",
829
829
  "codeOutline.help.option.maxFiles": "Maximum number of source files to scan. Default: 200",
830
830
  "codeOutline.help.option.maxFileBytes": "Maximum bytes to read from each source file. Default: 1048576",
831
831
  "codeOutline.help.exit.ok": "The code outline was scanned without findings",
@@ -842,7 +842,7 @@ export const zhMessages = {
842
842
  "codeOutline.error.missingPath": "Provide at least one source file or directory to scan",
843
843
  "codeOutline.error.invalidPositiveInteger": "{option} must be a positive safe integer: {value}",
844
844
  "codeOutline.error.invalidNonNegativeInteger": "{option} must be a non-negative safe integer: {value}",
845
- "codeSymbolRead.help.summary": "Read a bounded TypeScript or JavaScript source snippet from a source anchor, symbol line, or explicit line range.",
845
+ "codeSymbolRead.help.summary": "Read a bounded supported-source snippet from a source anchor, symbol line, or explicit line range.",
846
846
  "codeSymbolRead.help.option.anchor": "Source anchor id to resolve to its target symbol",
847
847
  "codeSymbolRead.help.option.startLine": "1-based source line to resolve to a symbol or range",
848
848
  "codeSymbolRead.help.option.endLine": "Optional explicit 1-based end line; when omitted, the containing outline symbol is read",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mustflow",
3
- "version": "2.115.11",
3
+ "version": "2.115.14",
4
4
  "description": "Agent workflow documents and CLI for mustflow repository roots.",
5
5
  "type": "module",
6
6
  "license": "MIT-0",
@@ -32,6 +32,7 @@
32
32
  "test:related": "node scripts/run-cli-tests.mjs --build=auto related",
33
33
  "test:related:cached": "node scripts/run-cli-tests.mjs related-cached",
34
34
  "test:related:profile": "node scripts/run-cli-tests.mjs --build related-profile",
35
+ "test:skill-contracts": "node scripts/run-cli-tests.mjs skill-contracts",
35
36
  "test:cli": "node scripts/run-cli-tests.mjs --build cli",
36
37
  "test:coverage": "node scripts/run-cli-tests.mjs --build coverage",
37
38
  "test:audit": "node scripts/audit-tests.mjs --json",
@@ -321,9 +321,7 @@ on_limit = "stop_and_report"
321
321
  required_for = [
322
322
  "git_commit",
323
323
  "git_push",
324
- "dependency_install",
325
324
  "dependency_upgrade",
326
- "network_access",
327
325
  "database_migration",
328
326
  "destructive_command",
329
327
  "secret_access",
@@ -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 = 239
65
+ revision = 242
66
66
  translations = {}
67
67
 
68
68
  [documents."skill.ada-code-change"]
@@ -889,7 +889,7 @@ translations = {}
889
889
  [documents."skill.svelte-code-change"]
890
890
  source = "locales/en/.mustflow/skills/svelte-code-change/SKILL.md"
891
891
  source_locale = "en"
892
- revision = 4
892
+ revision = 5
893
893
  translations = {}
894
894
 
895
895
  [documents."skill.tailwind-code-change"]
@@ -910,6 +910,18 @@ source_locale = "en"
910
910
  revision = 2
911
911
  translations = {}
912
912
 
913
+ [documents."skill.webview2-code-change"]
914
+ source = "locales/en/.mustflow/skills/webview2-code-change/SKILL.md"
915
+ source_locale = "en"
916
+ revision = 2
917
+ translations = {}
918
+
919
+ [documents."skill.hetzner-cloud-change"]
920
+ source = "locales/en/.mustflow/skills/hetzner-cloud-change/SKILL.md"
921
+ source_locale = "en"
922
+ revision = 2
923
+ translations = {}
924
+
913
925
  [documents."skill.typescript-code-change"]
914
926
  source = "locales/en/.mustflow/skills/typescript-code-change/SKILL.md"
915
927
  source_locale = "en"
@@ -1146,7 +1158,7 @@ translations = {}
1146
1158
  [documents."skill.state-machine-pattern"]
1147
1159
  source = "locales/en/.mustflow/skills/state-machine-pattern/SKILL.md"
1148
1160
  source_locale = "en"
1149
- revision = 4
1161
+ revision = 5
1150
1162
  translations = {}
1151
1163
 
1152
1164
  [documents."skill.strategy-pattern"]
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: skills.index
3
3
  locale: en
4
4
  canonical: true
5
- revision: 239
5
+ revision: 242
6
6
  authority: router
7
7
  lifecycle: mustflow-owned
8
8
  ---
@@ -685,6 +685,8 @@ routes. Event routes stay inactive until their event occurs.
685
685
  | Third-party SDK or external API integration, review, debugging, upgrade, webhook handling, auth scope change, sandbox or production setup, provider SDK version change, API version migration, rate-limit handling, retry policy, idempotency key usage, pagination, provider error mapping, request id logging, changelog review, deprecation response, or provider operational-readiness test needs production integration review | `.mustflow/skills/third-party-api-integration-review/SKILL.md` | Provider and SDK/API ledger, source-of-truth docs, auth and scope ledger, operation and side-effect ledger, webhook ledger, error and observability ledger, changelog or migration evidence, existing fakes or sandbox tests, and configured command intents | Provider adapters, wrappers, typed request and response models, error mappers, timeout and retry policies, rate-limit handling, idempotency key handling, pagination handling, webhook signature verification and dedupe, redacted observability, sandbox tests, fixtures, runbooks, migration notes, and directly synchronized docs or templates | demo-only integration, stale provider docs, SDK/API drift, sandbox-production mixup, hardcoded secret, overbroad scope, token refresh gap, missing timeout, infinite retry, retrying permanent errors, mutating retry without idempotency, per-attempt idempotency key, 429 retry storm, ignored Retry-After, offset pagination assumption, raw provider error leak, string-only provider error, missing request id, trusted webhook payload, JSON-parsed signature breakage, duplicate webhook side effect, event-order assumption, success redirect as proof, unhandled unknown provider outcome, dashboard-only setting, untested SDK upgrade, or happy-path-only sandbox test | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `test_audit`, `docs_validate_fast`, `test_release`, `mustflow_check` | Third-party integration reviewed, provider source-of-truth and SDK/API version evidence, auth/environment/scope decisions, timeout/retry/rate-limit/idempotency/pagination decisions, webhook delivery and dedupe checks, error and observability mapping, tests or missing evidence, verification, and remaining provider operational risk |
686
686
  | Tauri frontend invokes, Rust commands, capabilities, permissions, scopes, plugins, filesystem, dialog, shell, opener, updater, sidecar, mobile native permissions, Tauri bundling targets, release package formats, or native desktop CI build matrices are created or changed | `.mustflow/skills/tauri-code-change/SKILL.md` | Frontend call sites, Tauri config, Rust commands, capability and permission files, plugin config, bundle targets, release matrix evidence, changed files, and command contract entries | Tauri frontend, Rust commands, capabilities, permissions, scopes, plugins, bundle target narrowing, package target notes, tests, and docs | broad native permission, untrusted IPC input, filesystem escape, shell or updater risk, WebView/native boundary drift, all-target bundling surprise, cold Cargo cache cost, duplicated macOS packaging jobs, or long-retention CI artifacts posing as release assets | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `docs_validate_fast`, `mustflow_check` | IPC, permission, scope, filesystem, shell, updater, native boundary, bundle target, release matrix, artifact retention, verification, and remaining Tauri risk |
687
687
  | Wails v3 applications, Go services, generated bindings, TypeScript runtime calls, windows, menus, system tray, dialogs, events, frontend bridge payloads, WebView platform behavior, Taskfile or build config, signing, packaging, platform targets, native desktop CI build matrices, custom protocols, file associations, server builds, or Wails-related tests are created, changed, reviewed, or upgraded | `.mustflow/skills/wails-code-change/SKILL.md` | Wails version track, Go module and frontend package metadata, generated bindings, app entry point, service/window/event/menu/tray/dialog/build/package evidence, platform target and release matrix evidence, changed files, and command contract entries | Wails app assembly, Go services, frontend bridge calls, generated bindings, windows, events, menus, tray, dialogs, WebView platform behavior, platform packaging, target narrowing, tests, and docs | Electron or Wails v2 migration drift, accidental exported RPC, binding or runtime version drift, shared-service race, unsafe frontend input, oversized bridge payload, event leak or broadcast, WebView platform mismatch, packaging/signing drift, all-platform PR packaging, duplicated macOS packaging jobs, or long-retention CI artifacts posing as release assets | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `docs_validate_fast`, `mustflow_check` | Wails version/app/service/bridge/binding/window/event/menu/tray/dialog/platform packaging, release matrix, artifact retention notes, verification, and remaining Wails risk |
688
+ | Microsoft Edge WebView2 SDK or Runtime selection, `CoreWebView2Environment`, custom initialization, UDFs, profiles, web messages, host objects, document or frame trust, navigation, popups, downloads, permissions, process failures, memory, performance, Evergreen or Fixed Version deployment, WPF, WinForms, WinUI, or Win32 behavior is created, changed, reviewed, debugged, or upgraded | `.mustflow/skills/webview2-code-change/SKILL.md` | Host/Runtime, environment/UDF/profile, trust/bridge/navigation, lifecycle, failure, and performance ledgers; official source evidence; changed files; and command contract entries | Initialization, environment registry, UDF/profile policy, bridge handlers, navigation/frame policy, popup/download/permission lifecycle, process recovery, memory/performance diagnostics, Runtime update, packaging, tests, and docs | implicit `Source` initialization, UDF deletion retry, SDK/Runtime confusion, untrusted native RPC, prefix origin check, broad host object, stale navigation result, leaked event/deferral/child/download, recovery loop, process-count theater, timing misdiagnosis, Evergreen update not adopted, or unowned Fixed Runtime patching | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `docs_validate_fast`, `mustflow_check` | Host/SDK/Runtime/distribution decision, environment/UDF/profile/process/document ownership, bridge/navigation/lifecycle/security/memory/performance findings, verification, and remaining WebView2 risk |
689
+ | Hetzner Cloud or Dedicated infrastructure, hcloud or API integrations, Terraform provider resources, servers, networks, load balancers, firewalls, IPs, placement groups, volumes, backups, Object Storage, Storage Box, cloud-init, Docker or Coolify hosting, Kubernetes CCM or CSI integration, monitoring, recovery, capacity, cost, or Hetzner-related deployment tests are created, changed, reviewed, debugged, migrated, or upgraded | `.mustflow/skills/hetzner-cloud-change/SKILL.md` | Target repository and environment, Hetzner project or account boundary, infrastructure source and state owner, resource and credential ledger, failure domains, traffic and storage model, container data paths, guest network owner, CCM/CSI compatibility, RPO/RTO, workload and capacity evidence, current official provider facts, changed files, and command contract entries | Hetzner IaC, provider integrations, bootstrap config, images, guest networking, container mounts, orchestration drivers, application resilience code, health checks, monitoring, tests, fixtures, runbooks, architecture docs, cost guardrails, and directly synchronized templates | Placement Group treated as an availability zone, Firewall allowlists treated as overrides, outbound or existing-session semantics ignored, label selection treated as applied state, private Network treated as encrypted or filtered, L3 Network treated as VLAN, competing DHCP owners, load balancer or Floating IP treated as automatic location failover, DDoS filtering treated as WAF or origin authentication, Docker named volume treated as Hetzner Volume, missing mount creating fresh state, Object Storage treated as POSIX, unpinned CCM/CSI compatibility, replicated storage or server Backup treated as independent backup, provider-only monitoring or recovery control, unfenced IP move, untested private-only recovery, irreversible rescale, architecture mismatch, arbitrary performance thresholds, destructive raw-device benchmark, powered-off resource assumed free, stale price or limit, autonomous cleanup, or local validation claimed as live provider state | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `docs_validate_fast`, `test_release`, `mustflow_check` | Hetzner boundary and resource ledger, refreshed provider facts and integration versions, failure-domain/network/firewall/credential/storage/mount/backup/restore decisions, compute/performance/capacity/cost evidence, state layers verified, files changed, command intents run, manual provider checks, and remaining Hetzner risk |
688
690
  | File path handling, cross-platform path behavior, path helpers, safe filesystem wrappers, clone or checkout destinations, scaffold roots, temp or cache paths, atomic writes, locks, archive extraction, uploads, downloads, scanners, CLI/API/schema path contracts, snapshots, generated outputs, or package artifact paths are created, changed, reviewed, or reported | `.mustflow/skills/file-path-cross-platform-change/SKILL.md` | Path ledger, trust classes, accepted path representation, base root, path helpers, safe filesystem wrappers, clone/checkout/scaffold/install/extract outputs, staging and promotion policy, temp/cache helpers, lock policy, archive policy, upload/download policy, scanner policy, CLI/API/schema/snapshot/generated/package surfaces, platform expectations, failure taxonomy, and command contract entries | Path validators, helpers, wrappers, schemas, CLI/API parsing, snapshots, fixtures, docs, tests, generated-output paths, package artifact paths, clone or scaffold destinations, archive extraction, scanner bounds, temp/cache handling, locks, and cleanup code | path traversal, base containment bypass, drive-relative path bug, reserved-name bug, case-collision bug, Unicode-collision bug, Git checkout path-length failure misreported as network or auth, unsafe archive extraction, non-atomic write claim, stale lock, scanner loop, partial-output cleanup data loss, user-selected destination deletion, path contract drift, or package artifact path drift | `changes_status`, `changes_diff_summary`, `lint`, `build`, `test_related`, `test`, `docs_validate_fast`, `test_release`, `mustflow_check` | Path contract, path ledger, trust classes, root policy, preflight/staging/promotion decisions, Windows/macOS/Linux/archive/upload/download/scanner/lock/temp/cache/atomic/cleanup decisions, failure taxonomy, synchronized contract surfaces, verification, and remaining path risk |
689
691
  | File paths, directories, symlinks, real paths, traversal, NTFS alternate data streams, Windows 8.3 short names, Windows namespace prefixes, atomic writes, file copies, generated outputs, temporary files, clone or checkout materialization, cleanup, or Windows/POSIX filesystem behavior are created, changed, reviewed, or reported | `.mustflow/skills/cross-platform-filesystem-safety/SKILL.md` | Path inputs, base directory, trust boundary, symlink policy, write or cleanup strategy, clone/checkout/scaffold/install/extract path budget, app-owned staging boundary, platform expectations, ADS and short-name behavior, failure taxonomy, and command contract entries | Path validation, file helpers, copy/update/delete code, clone/scaffold/archive cleanup code, scan bounds, dev-server or file-serving deny checks, fixtures, tests, docs, and templates | path traversal, symlink escape, unsafe overwrite, Windows ADS bypass, 8.3 short-name bypass, namespace-prefix bypass, platform-only behavior, stale output, path-length or filename-length misclassification, watcher/resource misclassification, or cleanup data loss | `changes_status`, `changes_diff_summary`, `test_related`, `docs_validate_fast`, `test_release`, `mustflow_check` | Path trust classes, root boundary, symlink/write/delete/scan decisions, ADS and short-name handling, preflight and staging boundaries, clone/scaffold/extract classification, platform assumptions, verification, and remaining filesystem risk |
690
692
  | Child processes, shell or argv execution, built-in command reruns, Git/package-manager/scaffolder failures, timeouts, process trees, output limits, streaming, environment policy, command eligibility, failure classification, command-line length limits, or execution receipts are created, changed, reviewed, or reported | `.mustflow/skills/process-execution-safety/SKILL.md` | Execution path, timeout, output limit, stdin, argv and shell command-length budget, environment, cwd, process tree behavior, failure taxonomy, receipt and write-tracking expectations, and command contract entries | Process execution code, process-tree helpers, output buffers, environment creation, eligibility checks, failure classifiers, receipts, tests, and docs | runaway process, unbounded output, leaked environment, argv-too-long failure, shell-command-too-long failure, inconsistent JSON/text execution, false cleanup claim, Git checkout path failure misreported as network or auth, blind retry, diagnostic loss, or unreliable receipt | `changes_status`, `changes_diff_summary`, `test_related`, `test_release`, `mustflow_check` | Execution surface, timeout/output/environment/process-tree boundaries, argv and shell length handling, failure classification, diagnostic preservation, receipt consistency, tests, verification, and remaining process risk |
@@ -778,7 +780,6 @@ routes. Event routes stay inactive until their event occurs.
778
780
  | Skill procedures or routes are created or maintained, or their conditional, exception-bearing, authority-sensitive, universal, completion, or cross-repository verification claims need logical review | `.mustflow/skills/skill-authoring/SKILL.md` | Repeated task evidence, selected repository boundary, explicit parent dependencies, nearby rules, positive cases, boundary cases, and counterexamples | `.mustflow/skills/**` | overlap, command drift, cross-root verification inheritance, converse inference, unbounded quantifier, contradictory branch, flat authority ranking, unreachable stop state, or unobservable postcondition | `mustflow_check`, `docs_validate` | Skill route and procedure changes, logical consistency and repository-boundary result, counterexamples checked, and claims narrowed |
779
781
  | Agent A designs and Agent B implements from a versioned handoff, private `.agent` planning files, local-only ignored design state, manifest/plan/state ledgers, startup gates, allowed-path gates, blocker/deviation ledgers, or completion gates | `.mustflow/skills/design-implementation-handoff/SKILL.md` | Target repository, Agent A and Agent B surfaces, privacy mode, public behavior source, private handoff paths, ownership, allowed and forbidden paths, task dependencies, verification expectations, and remote-agent transfer boundary | `AGENTS.md`, public spec files, private `.agent` handoff files, ignore or exclude guidance, handoff templates, instruction artifacts, tests, docs, and directly synchronized workflow surfaces | hidden-only product contract, private-file leak, remote agent missing local context, plan/state version drift, Agent B editing Agent A-owned files, overly broad allowed paths, unbacked ignored files, or false completion evidence | `changes_status`, `changes_diff_summary`, `docs_validate_fast`, `mustflow_check` | Handoff mode, public versus private file split, Agent A/B ownership, startup and task gates, ignore or exclude decision, remote-agent limitation, verification gates, and remaining privacy or handoff risk |
780
782
  | Work instructions for coding agents, Codex tasks, work orders, issues, PR requests, automations, implementation briefs, reviews, proofs, cleanup tasks, or operational-readiness tasks are drafted, reviewed, or improved | `.mustflow/skills/task-instruction-authoring/SKILL.md` | Target agent surface, task family, goal, scope, constraints, durable rules, risk class, verification expectations, and required output | Instruction artifacts, work-order bodies, issue bodies, templates, docs, skills, checklists, and directly synchronized workflow surfaces | vague goal, delegated product decision, missing acceptance evidence, unsafe raw command, proof theater, review blade drift, overlong one-off policy, or operational-readiness gap | `changes_status`, `changes_diff_summary`, `docs_validate_fast`, `mustflow_check` | Instruction family, missing decisions, final instruction or rubric, durable guidance decision, verification expectations, and remaining ambiguity or operational risk |
781
-
782
783
  When introducing a new skill, link it here and define the specific trigger and route fields.
783
784
  Avoid including raw shell commands in skill documents; instead, reference the command intent
784
785
  names as defined in `.mustflow/config/commands.toml`.
@@ -0,0 +1,316 @@
1
+ ---
2
+ mustflow_doc: skill.hetzner-cloud-change
3
+ locale: en
4
+ canonical: true
5
+ revision: 2
6
+ lifecycle: mustflow-owned
7
+ authority: procedure
8
+ name: hetzner-cloud-change
9
+ description: Apply this skill when Hetzner Cloud or Dedicated infrastructure, hcloud or API integrations, Terraform provider resources, servers, networks, load balancers, firewalls, IPs, placement groups, volumes, backups, Object Storage, Storage Box, cloud-init, Docker or Coolify hosting, Kubernetes CCM or CSI integration, monitoring, recovery, capacity, cost, or Hetzner-related deployment tests are created, changed, reviewed, debugged, migrated, or upgraded.
10
+ metadata:
11
+ mustflow_schema: "1"
12
+ mustflow_kind: procedure
13
+ pack_id: mustflow.core
14
+ skill_id: mustflow.core.hetzner-cloud-change
15
+ command_intents:
16
+ - changes_status
17
+ - changes_diff_summary
18
+ - lint
19
+ - build
20
+ - test_related
21
+ - test
22
+ - docs_validate_fast
23
+ - test_release
24
+ - mustflow_check
25
+ ---
26
+
27
+ # Hetzner Cloud Change
28
+
29
+ <!-- mustflow-section: purpose -->
30
+ ## Purpose
31
+
32
+ Change or review Hetzner infrastructure without confusing one resilience mechanism with a complete
33
+ availability, backup, recovery, security, performance, or cost design.
34
+
35
+ Treat Hetzner as a provider with distinct compute, network, storage, control-plane, account, and
36
+ location failure domains. Prove the current provider contract from official documentation instead
37
+ of carrying old prices, limits, product availability, or console behavior into a durable design.
38
+
39
+ <!-- mustflow-section: use-when -->
40
+ ## Use When
41
+
42
+ - A task changes Hetzner Cloud, Dedicated, Robot, hcloud, API, Terraform, Pulumi, Ansible, cloud-init,
43
+ image, server, server type, architecture, location, network zone, private Network, Load Balancer,
44
+ Firewall, Primary IP, Floating IP, Placement Group, Volume, Backup, Snapshot, Object Storage,
45
+ Storage Box, DNS failover, monitoring, capacity, restore, or disaster-recovery behavior.
46
+ - A review claims that a Hetzner design is highly available, private, encrypted, backed up,
47
+ recoverable, scalable, cost-effective, or production-ready.
48
+ - A Hetzner incident or performance investigation may lead to infrastructure, application,
49
+ runbook, test, monitoring, or capacity changes.
50
+ - Docker, Coolify, Kubernetes, a cloud-controller manager, CSI driver, CNI, ingress, egress gateway,
51
+ container registry, or orchestration platform depends on Hetzner networking, storage, metadata,
52
+ load-balancer, image, architecture, or API behavior.
53
+
54
+ <!-- mustflow-section: do-not-use-when -->
55
+ ## Do Not Use When
56
+
57
+ - The task is provider-neutral cost review only; use `cloud-cost-guardrail-review`.
58
+ - The task is provider-neutral rollout, canary, drain, probe, or rollback review only; use
59
+ `deployment-rollout-safety-review`.
60
+ - The task only changes Docker build or runtime behavior without a Hetzner boundary; use
61
+ `docker-code-change` or `docker-runtime-triage`.
62
+ - The task only diagnoses application code, database queries, Linux performance, or networking
63
+ after evidence has excluded Hetzner resources and provider behavior.
64
+ - The user asks for a live production mutation, deletion, failover, restore, rescale, or provider
65
+ purchase that no configured command intent authorizes.
66
+
67
+ <!-- mustflow-section: required-inputs -->
68
+ ## Required Inputs
69
+
70
+ - Target repository, environment, Hetzner project or account boundary, infrastructure source of
71
+ truth, state owner, changed files, and configured command intents.
72
+ - Resource ledger: Cloud or Dedicated servers, architecture and server types, images, locations,
73
+ network zones, Placement Groups, Networks, routes, Load Balancers, Firewalls, Primary and Floating
74
+ IPs, Volumes, Backups, Snapshots, buckets, Storage Boxes, DNS, certificates, metadata endpoints,
75
+ guest network-config owners, container data paths, orchestration drivers, monitoring, and tokens.
76
+ - Failure-domain and recovery model: host, rack or unknown facility boundary, location, network zone,
77
+ provider control plane, DNS, account, credential, operator error, data corruption, and dependency
78
+ failure; required RPO, RTO, restore evidence, and traffic or data failover path.
79
+ - Runtime and traffic model: ingress, egress, east-west traffic, health checks, TLS termination,
80
+ connection draining, long-lived connections, retries, idempotency, queue leases, replication,
81
+ storage consistency, and peak connection or throughput demand.
82
+ - Capacity and cost model: actual workload measurements, architecture compatibility, quota, current
83
+ SKU and location availability, current provider prices, retention, egress, IP, storage, backup,
84
+ and idle-resource costs.
85
+ - Current official Hetzner documentation for every date-sensitive price, limit, availability,
86
+ billing, networking, backup, restore, or product-capability claim used in the decision.
87
+
88
+ <!-- mustflow-section: preconditions -->
89
+ ## Preconditions
90
+
91
+ - Read the actual IaC, config, code, tests, runbooks, state boundaries, and current official Hetzner
92
+ documentation before recommending or changing provider behavior.
93
+ - Separate declared configuration, provider-accepted configuration, and observed runtime state.
94
+ One layer does not prove the next.
95
+ - Treat attached reports, old docs, console screenshots, blogs, and AI summaries as leads to verify,
96
+ not as current provider authority.
97
+ - Keep provider credentials, state files, private addresses, customer data, and recovery secrets out
98
+ of repository output and test fixtures.
99
+ - Provider CLI, API, console, apply, import, state mutation, purchase, deletion, failover, and restore
100
+ actions remain manual-only unless a configured oneshot command intent explicitly permits them.
101
+
102
+ <!-- mustflow-section: allowed-edits -->
103
+ ## Allowed Edits
104
+
105
+ - Update Hetzner IaC, provider integrations, bootstrap configuration, images, application resilience
106
+ code, health checks, monitoring, tests, fixtures, runbooks, architecture docs, cost guardrails, and
107
+ directly synchronized templates within the user-requested scope.
108
+ - Add validation for immutable-image or reproducible bootstrap paths, multi-architecture artifacts,
109
+ resource labels, deletion protection, bounded scaling, restore evidence, and declared-versus-applied
110
+ state when the repository owns those surfaces.
111
+ - Do not add live credentials, broad provider command wrappers, autonomous cleanup, production
112
+ failover, unbounded autoscaling, or destructive recovery automation outside the command contract.
113
+ - Do not rewrite provider-neutral deployment, cost, database, security, or performance policy inside
114
+ this skill when the matching adjunct skill already owns it.
115
+
116
+ <!-- mustflow-section: procedure -->
117
+ ## Procedure
118
+
119
+ 1. Classify the provider boundary.
120
+ Record Cloud versus Dedicated, project or account, environment, location, network zone,
121
+ architecture, OS, image, ownership, IaC state, and whether the task changes desired state,
122
+ provider state, guest state, application behavior, or only documentation.
123
+
124
+ 2. Build the resource and credential ledger.
125
+ Map each server, IP, Network, route, Load Balancer, target, Firewall, Placement Group, Volume,
126
+ Backup, Snapshot, bucket, Storage Box, DNS record, certificate, token, monitoring path, and state
127
+ store to its owner, lifecycle, protection, cost, and dependent resources. Use projects and token
128
+ scope as blast-radius boundaries; keep read-only monitoring credentials separate from mutation
129
+ credentials and keep break-glass material outside the affected provider boundary.
130
+
131
+ 3. Model failures by mechanism instead of by product label.
132
+ For host, location, network-zone, provider-control-plane, DNS, account, credential, operator,
133
+ corruption, and dependency failures, record detection, surviving components, fencing, traffic or
134
+ data transition, and recovery evidence. A spread Placement Group reduces same-host concentration;
135
+ it does not prove location isolation. A Load Balancer, replicated Volume, server Backup, Snapshot,
136
+ and off-provider backup each cover different failures.
137
+
138
+ 4. Verify current provider facts.
139
+ Refresh exact prices, quotas, server types, architectures, locations, limits, billing rules,
140
+ supported protocols, IP behavior, MTU, firewall scope, backup contents, restore compatibility,
141
+ Object Lock behavior, metadata endpoints, guest auto-configuration ownership, CCM and CSI
142
+ compatibility, and product availability from official Hetzner sources and maintained provider
143
+ repositories. Record the access date, component version, or digest. Keep time-sensitive values in
144
+ config or evidence, not as timeless prose; never treat a mutable `latest` tag as compatibility proof.
145
+
146
+ 5. Review network and recovery reachability together.
147
+ Map ingress, egress, east-west traffic, DNS, TLS, routes, MTU and overlay overhead, allowlists,
148
+ private-address behavior, Firewall coverage, bastion or console access, package and API egress,
149
+ and rescue or rebuild paths. Private does not prove encrypted or filtered. Before removing a
150
+ public path, prove a tested replacement for administration, egress, recovery, and credential
151
+ rotation under the same failure being handled. Treat Cloud Firewall, host firewall, container
152
+ firewall, service identity, and application authorization as separate layers. Verify these
153
+ provider-Firewall semantics from current docs and applied state:
154
+ - assigned allowlists combine; attaching another Firewall does not override an existing broad allow;
155
+ - no outbound rules means allow-all, while adding outbound rules creates an implicit-deny remainder;
156
+ - rule changes do not terminate connections that were already established;
157
+ - label selection is desired scope, not proof that every intended resource was actually attached;
158
+ - private Network traffic and Load Balancer interfaces require their own controls when provider
159
+ Firewall coverage is absent.
160
+ Model the Network as routed L3, not a VLAN or security zone. Verify source-address and route
161
+ constraints for VPN, NAT, custom-router, alias-IP, and failover designs. Give each private NIC one
162
+ configuration owner: provider image automation or explicit guest config, not competing DHCP
163
+ clients. Validate routes, DNS, MTU, large transfers, and recovery after a cold boot.
164
+
165
+ 6. Review Load Balancer and IP transitions.
166
+ Separate liveness from readiness; keep readiness bounded to dependencies required to accept new
167
+ work. Verify TLS termination, target protocol, Proxy Protocol compatibility, health-check timing,
168
+ connection and bandwidth budget, drain order, long-lived connection recovery, and independent
169
+ DNS entry points when location-level failover is required. Treat Floating IP movement as an
170
+ explicit fenced transition: isolate the old writer before reassignment and prove the guest-side
171
+ address and routing state. Do not call it automatic failover. Inspect actual public IPv4, public
172
+ IPv6, and private interface state rather than inferring exposure from DNS. Keep DDoS filtering,
173
+ WAF behavior, application abuse control, and origin authentication distinct; hiding a DNS record
174
+ does not prove that an old or direct origin address is unreachable.
175
+
176
+ 7. Select compute from workload evidence.
177
+ Compare Cloud and Dedicated ownership burden, shared and dedicated CPU behavior, x86 and Arm
178
+ compatibility, memory duplication, local-disk dependence, replacement speed, and tail latency.
179
+ Correlate application throughput, error rate, queue age, p95 or p99 latency, run queue, CPU PSI,
180
+ steal, `MemAvailable`, swap I/O, memory PSI, storage latency, queue depth, I/O PSI, and fsync
181
+ latency. Do not promote an arbitrary utilization or PSI percentage to a universal threshold.
182
+ Reproduce candidates with identical workload, location, image, and application version when safe.
183
+
184
+ 8. Preserve replacement and scaling options.
185
+ Check architecture and image compatibility, root-disk resize irreversibility, local-state loss,
186
+ SKU and location scarcity, quotas, drain behavior, maximum scale, and fallback types before
187
+ rescale or autoscaling changes. Keep state out of disposable compute where practical. Define
188
+ bounded fallback behavior when a preferred type or location cannot be allocated.
189
+
190
+ 9. Classify storage by durability and access pattern.
191
+ Distinguish replaceable local storage, block Volume state, object storage, backup archives, and
192
+ Storage Box data. Verify current performance and durability claims rather than copying fixed IOPS
193
+ or throughput values. Replication is availability, not history. Test storage with disposable files
194
+ and realistic I/O shapes; never benchmark a production raw block device destructively.
195
+ Trace the actual byte path from application or container to filesystem, mount, block device, or
196
+ object key. A Docker named volume is not a Hetzner Volume. For required block storage, make mount
197
+ identity and readiness a startup precondition, order consumers after the mount, and fail closed on
198
+ a missing or wrong mount so an empty local directory cannot become a second database. Treat Volume
199
+ attachment, location, growth, and filesystem expansion as explicit operations, not automatic HA.
200
+ Treat Object Storage as an object API, not POSIX, shared block storage, or a database filesystem;
201
+ review overwrite, rename, locking, append, small-object, request, connection, bucket, and source-IP
202
+ limits, including NAT aggregation. For Kubernetes, verify the pinned CCM and CSI versions or
203
+ digests, topology, access modes, attachment behavior, immutable provider fields, and current
204
+ snapshot or migration support before accepting a StatefulSet or LoadBalancer design.
205
+
206
+ 10. Build the backup and restore chain.
207
+ Start from application-consistent backup and point-in-time requirements. Record whether root disk,
208
+ attached Volumes, databases, objects, secrets, DNS, certificates, queues, cron, and external state
209
+ are included. Keep an encrypted independently administered copy outside the failure and account
210
+ boundary being protected. Decide Object Lock at bucket creation when required, separate write from
211
+ retention or deletion authority, and test restoration into an isolated target including login,
212
+ reads, writes, workers, schedules, policies, and cutover. Measure achieved data-loss window and
213
+ service restoration time; do not infer RPO or RTO from backup-job success. Design versioning,
214
+ retention lock, lifecycle deletion, encryption, and credential scope as separate controls; prove
215
+ that lifecycle rules cannot delete an application backup chain earlier than the restore contract.
216
+
217
+ 11. Keep monitoring and recovery control independent.
218
+ Use guest, application, database, storage, network, backup-age, and synthetic-user signals in
219
+ addition to provider graphs. Place at least one detection and coordination path outside the
220
+ provider failure domain when that failure is in scope. Preserve timestamps, request or job IDs,
221
+ path evidence, provider inventory drift, access and audit events, and bidirectional network
222
+ evidence before replacement or restart hides the fault. Send security-relevant logs to a sink
223
+ whose ingestion identity cannot rewrite or delete retained evidence.
224
+
225
+ 12. Prepare rebuild-first incident recovery.
226
+ Separate prevention from containment: a provider Firewall change can block new connections while
227
+ old sessions, application tokens, database sessions, and compromised processes remain active.
228
+ Define clean administrator access, account and token containment, exposure removal, session
229
+ termination, evidence preservation, isolated analysis, clean-image rebuild, validated data
230
+ restoration, and rotation of every secret the compromised workload could read. Do not return a
231
+ patched compromised server or attached forensic disk to the production trust boundary.
232
+
233
+ 13. Treat bootstrap as reproducible initialization.
234
+ Keep cloud-init or user data small, versioned, secret-safe, observable, and limited to bootstrap.
235
+ Move substantial configuration into an idempotent, rerunnable, pinned, and testable mechanism.
236
+ Prove failure reporting and rebuild from a clean server; do not rely on a one-shot script whose
237
+ partial completion cannot be distinguished from success. Verify the current metadata API contract,
238
+ deprecated paths, image-specific network auto-configuration owner, and first-boot identity reset.
239
+
240
+ 14. Build a live cost and lifecycle ledger.
241
+ Refresh billing rules and prices, then account for active and powered-off compute, IPs, Load
242
+ Balancers, Volumes, Backups, Snapshots, buckets, retained versions, Storage Boxes, egress, and
243
+ Dedicated commitments. Label owner, environment, purpose, protection, and expiry. Cleanup must
244
+ inventory dependencies and protections first and use a configured intent; never turn a cost
245
+ observation into an automatic delete.
246
+
247
+ 15. Verify the complete change matrix.
248
+ Cover declared config, parser or schema, plan or diff, focused tests, architecture compatibility,
249
+ bootstrap, health checks, failover fencing, restore, monitoring, cost, docs, and rollback or
250
+ replacement. Run only configured intents. Report provider-side checks that remain manual rather
251
+ than claiming production state from local validation.
252
+
253
+ <!-- mustflow-section: postconditions -->
254
+ ## Postconditions
255
+
256
+ - Hetzner resources, owners, failure domains, credentials, network paths, storage classes, recovery
257
+ chain, current provider assumptions, capacity evidence, and cost lifecycle are explicit.
258
+ - Availability, replication, backup, restore, and off-provider recovery claims are kept distinct.
259
+ - Declared, provider-applied, guest-observed, and externally observed states are not conflated.
260
+ - Every changed operational claim has named evidence or is reported as an unverified manual check.
261
+
262
+ <!-- mustflow-section: verification -->
263
+ ## Verification
264
+
265
+ Use configured oneshot command intents when available:
266
+
267
+ - `changes_status`
268
+ - `changes_diff_summary`
269
+ - `lint`
270
+ - `build`
271
+ - `test_related`
272
+ - `test`
273
+ - `docs_validate_fast`
274
+ - `test_release`
275
+ - `mustflow_check`
276
+
277
+ Prefer narrower configured IaC validation, provider-mock, network, architecture, bootstrap, restore,
278
+ performance, cost, and runbook checks. Local success does not prove live Hetzner state.
279
+
280
+ <!-- mustflow-section: failure-handling -->
281
+ ## Failure Handling
282
+
283
+ - If current official documentation disagrees with an attachment, old runbook, test fixture, or
284
+ remembered provider behavior, use the current contract and report the compatibility impact.
285
+ - If provider state cannot be inspected safely, stop at declared-state verification and name the
286
+ missing provider and runtime checks.
287
+ - If a change removes public reachability, enlarges a root disk, crosses architecture, moves a
288
+ Floating IP, deletes a resource, changes retention, or alters backup custody without a proven
289
+ recovery path, do not proceed with the mutation.
290
+ - If failover lacks fencing, idempotency, bounded retry, quorum, or independent coordination, report
291
+ the split-brain or duplicate-work risk before adding automation.
292
+ - If an isolation change relies only on a new Cloud Firewall while old sessions remain active,
293
+ require a separate connection, process, credential, and evidence-containment plan.
294
+ - If required state storage is missing, mounted at the wrong path, attached in the wrong location, or
295
+ replaced by an empty local directory, fail startup instead of creating fresh state.
296
+ - If an application requires POSIX locks, atomic rename, append, mmap, or low-latency random I/O,
297
+ reject Object Storage as a transparent mounted filesystem.
298
+ - If a provider integration relies on a mutable image tag, removed API field, undocumented metadata
299
+ path, or unverified CSI or CCM feature, pin a compatible version or stop with the compatibility gap.
300
+ - If a cost optimization removes recovery, observability, capacity, architecture compatibility, or
301
+ failure isolation, reject the optimization or add the missing guardrail first.
302
+ - If the needed provider command intent is absent, report it instead of embedding a raw hcloud,
303
+ Terraform, API, SSH, benchmark, delete, rescale, restore, or failover command.
304
+
305
+ <!-- mustflow-section: output-format -->
306
+ ## Output Format
307
+
308
+ - Hetzner boundary and resource ledger
309
+ - Current official provider facts refreshed and access date
310
+ - Failure-domain, network, credential, storage, backup, restore, and control-plane decisions
311
+ - Compute, architecture, performance, capacity, cost, and lifecycle evidence
312
+ - Declared, provider, guest, and external state verified
313
+ - Files changed
314
+ - Command intents run
315
+ - Manual or skipped provider checks and reasons
316
+ - Remaining Hetzner availability, recovery, security, performance, and cost risk
@@ -918,6 +918,18 @@ route_type = "primary"
918
918
  priority = 90
919
919
  applies_to_reasons = ["code_change", "behavior_change", "ui_change", "security_change", "privacy_change", "data_change", "public_api_change", "package_metadata_change", "release_risk"]
920
920
 
921
+ [routes."webview2-code-change"]
922
+ category = "data_external"
923
+ route_type = "primary"
924
+ priority = 90
925
+ applies_to_reasons = ["code_change", "behavior_change", "ui_change", "security_change", "privacy_change", "data_change", "public_api_change", "package_metadata_change", "performance_change", "release_risk"]
926
+
927
+ [routes."hetzner-cloud-change"]
928
+ category = "data_external"
929
+ route_type = "primary"
930
+ priority = 90
931
+ applies_to_reasons = ["unknown_change", "code_change", "behavior_change", "test_change", "security_change", "privacy_change", "data_change", "migration_change", "docs_change", "workflow_change", "package_metadata_change", "performance_change", "release_risk"]
932
+
921
933
  [routes."process-execution-safety"]
922
934
  category = "data_external"
923
935
  route_type = "primary"
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: skill.state-machine-pattern
3
3
  locale: en
4
4
  canonical: true
5
- revision: 4
5
+ revision: 5
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: state-machine-pattern
@@ -66,6 +66,7 @@ Two states can still require this skill when the lifecycle is meaningful, such a
66
66
  ## Required Inputs
67
67
 
68
68
  - The entity and state field under change.
69
+ - The intended initial state, the user-visible entry state, and the first event or command that should leave it.
69
70
  - Complete state list and which states are terminal.
70
71
  - Complete event list and the facts each event carries.
71
72
  - Current places that change state, validate actions, check state, or render available actions.
@@ -118,6 +119,8 @@ Two states can still require this skill when the lifecycle is meaningful, such a
118
119
  5. Write the transition table first.
119
120
  - Include every source state, allowed event, guard name, target state, and effect description.
120
121
  - Include terminal states explicitly with no outgoing transitions when they are truly terminal.
122
+ - Declare the initial state explicitly and verify it matches the real entry experience. Do not initialize directly into an active state such as `PLAYING`, `RUNNING`, or `PROCESSING` when the user must first see a menu, confirmation, setup, or start action.
123
+ - Model the first user or system action as a real transition. Test that the expected entry action leaves the initial state and that missing runtime prerequisites produce a visible failure or unavailable action instead of a silent no-op.
121
124
  - Do not hide transition rules inside handler branches, repository filters, database queries, adapter code, or UI code.
122
125
  - Do not let direct `deleted_at` assignment bypass allowed archive, soft-delete, restore, purge, anonymize, or redirect transitions when deletion is a meaningful lifecycle.
123
126
  6. Keep guards pure.
@@ -167,6 +170,7 @@ Two states can still require this skill when the lifecycle is meaningful, such a
167
170
  - For important domains, document state list, event list, transition table, terminal states, guards, effects, concurrency method, duplicate-event handling, and any cross-machine invariants.
168
171
  - Diagrams are secondary. The code transition table is the source of truth.
169
172
  17. Test from the transition table.
173
+ - Test the declared initial state and the first permitted transition before testing later lifecycle branches.
170
174
  - Test every valid transition.
171
175
  - Test representative invalid transitions, especially terminal states and dangerous skipped states.
172
176
  - Test guard success and guard failure separately.
@@ -2,7 +2,7 @@
2
2
  mustflow_doc: skill.svelte-code-change
3
3
  locale: en
4
4
  canonical: true
5
- revision: 4
5
+ revision: 5
6
6
  lifecycle: mustflow-owned
7
7
  authority: procedure
8
8
  name: svelte-code-change
@@ -98,6 +98,10 @@ Preserve Svelte component reactivity, SvelteKit SSR/server/client execution mode
98
98
  20. Keep `$effect` dependencies narrow and synchronous. Read dependencies before `await`, `setTimeout`, or callbacks; use `untrack` for incidental logging, snapshots, or non-dependency reads.
99
99
  21. Return cleanup from effects that create subscriptions, intervals, observers, sockets, editors, charts, canvas loops, or external library instances.
100
100
  22. Treat props as parent-owned. Use callback props for changes and `$bindable` only for narrow form-control-like two-way APIs. Preserve wrapper binding chains or convert them to explicit callbacks.
101
+ - In Svelte 5 runes mode, do not expose local `$state` through an `export { local as prop }` alias and expect a parent `bind:` directive to update. Declare a bindable prop through `$props()` and `$bindable()` when two-way binding is the intended public contract.
102
+ - Do not remove a child component merely to hide a broken DOM-reference handoff. Prefer keeping canvas, editor, chart, media, or other imperative resource creation and cleanup in the component that owns the DOM node. When a parent must coordinate initialization, expose an explicit ready callback carrying the node or initialized handle after the child has mounted.
103
+ - Treat `bind:this` values as unavailable before mount and possibly unavailable again after conditional unmount. Do not assume a parent `onMount` runs after a child-provided reference has propagated through an invalid or indirect binding chain.
104
+ - Do not silently return from required imperative initialization when the DOM node is unexpectedly absent. Distinguish an expected conditional absence from a broken ownership or binding contract, expose the failure during development, and provide a bounded reinitialization path when the node can appear later.
101
105
  23. In Svelte 5, treat DOM event handlers as props. When spreading rest props through wrappers, intentionally compose external handlers with internal policy instead of relying on spread order.
102
106
  24. Treat snippets as typed render callbacks. Require optional snippet guards, pass row or slot-like data as parameters, and avoid hidden parent-state capture in reusable library components.
103
107
  25. In the official-source snapshot checked on 2026-07-11, SvelteKit remote functions were
@@ -141,6 +145,7 @@ Preserve Svelte component reactivity, SvelteKit SSR/server/client execution mode
141
145
  - Use `$state.snapshot` before sending proxy state to serializers, workers, chart libraries, equality tools, or external APIs that should see plain data.
142
146
  - Use `$derived` for calculations from props, route data, page state, URL state, or local state.
143
147
  - Use `$effect` only for browser-side effects, subscriptions, DOM, canvas, analytics, timers, third-party browser libraries, and cleanup.
148
+ - Keep imperative DOM resources in the component that owns the bound node when practical. If ownership must cross a component boundary, use an explicit `$bindable` prop or ready callback and test the handoff instead of exporting local rune state by alias.
144
149
  - Use stores for external streams or manual subscribe/unsubscribe interop, not ordinary component state.
145
150
  - Use context for parent-owned values shared down the component tree, especially request-scoped layout data.
146
151
  - Do not reassign reactive context objects after placing them in context; update their properties or pass getter functions when needed.
@@ -0,0 +1,335 @@
1
+ ---
2
+ mustflow_doc: skill.webview2-code-change
3
+ locale: en
4
+ canonical: true
5
+ revision: 2
6
+ lifecycle: mustflow-owned
7
+ authority: procedure
8
+ name: webview2-code-change
9
+ description: Apply this skill when Microsoft Edge WebView2 code, SDK or Runtime selection, CoreWebView2Environment initialization, user data folders, profiles, web messages, host objects, document or frame trust, navigation, popups, downloads, permissions, process failures, memory or performance behavior, Evergreen or Fixed Version deployment, WPF, WinForms, WinUI, or Win32 WebView2 tests are created, changed, reviewed, debugged, or upgraded.
10
+ metadata:
11
+ mustflow_schema: "1"
12
+ mustflow_kind: procedure
13
+ pack_id: mustflow.core
14
+ skill_id: mustflow.core.webview2-code-change
15
+ command_intents:
16
+ - changes_status
17
+ - changes_diff_summary
18
+ - lint
19
+ - build
20
+ - test_related
21
+ - test
22
+ - docs_validate_fast
23
+ - mustflow_check
24
+ ---
25
+
26
+ # WebView2 Code Change
27
+
28
+ <!-- mustflow-section: purpose -->
29
+ ## Purpose
30
+
31
+ Preserve WebView2's runtime, process, storage, initialization, native-bridge, navigation, threading,
32
+ lifecycle, security, performance, update, and deployment boundaries across WPF, WinForms, WinUI,
33
+ and Win32 hosts.
34
+
35
+ Treat WebView2 as a Chromium process group, a persistent browser profile, and a native RPC boundary,
36
+ not as a browser-shaped UI control whose lifetime ends when a window disappears.
37
+
38
+ <!-- mustflow-section: use-when -->
39
+ ## Use When
40
+
41
+ - `Microsoft.Web.WebView2`, `CoreWebView2*`, `ICoreWebView2*`, `EnsureCoreWebView2Async`,
42
+ `CreationProperties`, `WebMessageReceived`, `PostWebMessageAsJson`, host objects, virtual host
43
+ mappings, document or frame origins, navigation events, popups, downloads, permissions, process
44
+ events, profiles, or user data folders change.
45
+ - A WPF, WinForms, WinUI, or Win32 application creates, disposes, recycles, packages, diagnoses, or
46
+ tests WebView2 controls or environments.
47
+ - The task chooses or changes Evergreen versus Fixed Version Runtime distribution, feature
48
+ detection, prerelease SDK usage, runtime update adoption, or enterprise update policy.
49
+ - The task investigates initialization failures, incompatible environment options, UDF locks,
50
+ bridge authorization, stale document responses, Runtime update adoption, process-failure
51
+ classification, memory retention, process growth, shutdown delay, rendering stalls, GPU behavior,
52
+ popup or download bugs, or packaged Runtime availability.
53
+ - Durable guidance makes exact claims about current WebView2 SDKs, Runtimes, preview channels,
54
+ release cadence, API stability, platform support, or distribution requirements.
55
+
56
+ <!-- mustflow-section: do-not-use-when -->
57
+ ## Do Not Use When
58
+
59
+ - The task is ordinary frontend code with no WebView2 host, native bridge, profile, runtime, or
60
+ packaged behavior; use the matching frontend skill.
61
+ - The task changes a Tauri or Wails application without direct WebView2 APIs or Windows-specific
62
+ runtime behavior; use `tauri-code-change` or `wails-code-change`.
63
+ - The task is only generic desktop memory analysis with no WebView2-specific lifecycle or process
64
+ boundary; use `desktop-memory-footprint-review`.
65
+ - The task only refreshes an external version statement and does not change WebView2 procedure;
66
+ use `source-freshness-check` or `version-freshness-check`.
67
+
68
+ <!-- mustflow-section: required-inputs -->
69
+ ## Required Inputs
70
+
71
+ - Host stack and target: WPF, WinForms, WinUI, or Win32; packaged or unpackaged; architecture;
72
+ minimum Windows version; installed SDK package; Runtime distribution mode; and target channels.
73
+ - Environment ledger: Runtime executable folder, normalized user data folder, environment options,
74
+ profile name, InPrivate choice, owner, sharing boundary, initialization call sites, and first
75
+ navigation trigger.
76
+ - Trust ledger: top-level origins, frame origins, virtual host mappings, remote content, injected
77
+ scripts, web-message commands, host objects, native capabilities, navigation and redirect policy,
78
+ popups, downloads, permissions, external schemes, and document-generation rules.
79
+ - Ownership ledger: control, controller, environment, profile, process group, document generation,
80
+ frame, navigation, child window, download, deferral, event subscription, pending bridge request,
81
+ disposal, update, and restart owners.
82
+ - Failure evidence: exception or HRESULT, effective environment options, actual UDF path, Runtime
83
+ and SDK versions, process kind, source origin, crash reason, packaged or unpackaged state, and
84
+ reproduction sequence.
85
+ - Performance evidence: browser, renderer, GPU, or helper process identity; WebView and window
86
+ count; navigation id; page and host timestamps; bridge request ids; memory metric; DevTools or OS
87
+ trace; hidden or suspended state; and before-open, steady-state, after-close, and repeated-cycle
88
+ observations.
89
+ - Current official Microsoft documentation before preserving exact version, release-date,
90
+ stable-versus-prerelease, API phase, runtime cadence, or deployment claims.
91
+ - Configured verification intents for host builds, focused tests, packaged startup, runtime
92
+ detection, initialization, UDF/profile behavior, bridge security, navigation, lifecycle, memory,
93
+ performance, update adoption, and docs.
94
+
95
+ <!-- mustflow-section: preconditions -->
96
+ ## Preconditions
97
+
98
+ - Identify the host framework and actual WebView2 SDK and Runtime evidence before changing API
99
+ calls. Do not infer Runtime capability from the NuGet version alone.
100
+ - Distinguish stable APIs, prerelease or experimental APIs, Runtime-only fixes, and future plans.
101
+ Feature-detect recent APIs where deployed Evergreen clients may lag or enterprise policy may
102
+ block updates.
103
+ - Refresh official release notes and concept documentation before writing date-sensitive claims.
104
+ If freshness cannot be checked, keep the procedure version-agnostic and report the gap.
105
+ - Treat web content, messages, frames, paths, URLs, file objects, permission requests, and host
106
+ object arguments as untrusted even when the HTML is bundled with the app.
107
+ - Keep command execution within the selected repository's configured intents.
108
+
109
+ <!-- mustflow-section: allowed-edits -->
110
+ ## Allowed Edits
111
+
112
+ - Update WebView2 host initialization, environment registries, profile and UDF policy, bridge DTOs
113
+ and handlers, document trust and navigation policy, popup/download/permission handlers, lifecycle
114
+ owners, update adoption, process-failure diagnostics, performance instrumentation, packaging,
115
+ tests, and directly synchronized docs or templates.
116
+ - Add narrow state machines, registries, typed message envelopes, origin policies, resource
117
+ filters, cleanup paths, or feature-detection adapters when the existing ownership is implicit.
118
+ - Keep framework-specific UI integration in the established WPF, WinForms, WinUI, or Win32 layer.
119
+ - Do not delete or reset a UDF as a generic initialization retry, weaken origin or permission
120
+ checks to make navigation work, or adopt prerelease APIs as production requirements without an
121
+ explicit compatibility decision.
122
+
123
+ <!-- mustflow-section: procedure -->
124
+ ## Procedure
125
+
126
+ 1. Read package metadata, target framework files, app startup, control creation, environment
127
+ construction, first navigation, event registration, bridge code, window shutdown, packaging,
128
+ tests, and diagnostic hooks. Record the host framework and Runtime distribution mode.
129
+ 2. Build one ownership map for four distinct lifetimes:
130
+ - native control and controller;
131
+ - `CoreWebView2Environment`, UDF, profile, and Chromium process group;
132
+ - top-level document, frames, scripts, and bridge requests;
133
+ - host window, application session, restart, update, and uninstall policy.
134
+ Do not use window visibility or field nulling as proof that the other lifetimes ended.
135
+ 3. Centralize environment creation. Key a shared initialization task by the effective Runtime path,
136
+ normalized UDF path, environment options, language, browser arguments, and access policy. Reject
137
+ incompatible options for an already-active UDF instead of racing a second environment into it.
138
+ 4. Make initialization an explicit state machine such as `Created -> Initializing -> Ready ->
139
+ Closing -> Closed` with one shared task and a generation or cancellation token. Apply creation
140
+ properties or the explicit environment before `EnsureCoreWebView2Async`; register handlers and
141
+ document-created scripts after successful initialization; navigate last. Do not let XAML or
142
+ constructor `Source` start an implicit default initialization first.
143
+ 5. Treat UDF and profile design as storage architecture:
144
+ - use a writable, user-local UDF path and avoid network drives;
145
+ - use multiple profiles inside one UDF for account separation within one trust boundary;
146
+ - use different UDFs only for process, trust, regulatory, or independent-lifecycle isolation;
147
+ - use stable opaque profile identifiers rather than email addresses or display names;
148
+ - distinguish logout, browsing-data clearing, profile deletion, factory reset, and uninstall;
149
+ - wait for all owning WebViews and browser processes to exit before moving or deleting a UDF.
150
+ 6. Choose Runtime distribution deliberately. Prefer Evergreen unless exact binary reproducibility
151
+ or a constrained certification contract justifies Fixed Version. For Fixed Version, require an
152
+ owned patch SLA, retained signed artifacts and hashes, architecture-specific packaging, update
153
+ and rollback tests, disk-budget evidence, and required filesystem permissions. For Evergreen,
154
+ handle continuous-running apps by coordinating release of all environments or a state-saving
155
+ restart after `NewBrowserVersionAvailable`.
156
+ 7. Bind bridge availability to the current trusted document generation. Issue a new document id or
157
+ generation at navigation start, complete a native-to-web handshake only after an allowed origin
158
+ is ready, reject requests from older generations, and cancel pending work when the document,
159
+ renderer, or control is replaced.
160
+ 8. Treat every native bridge as a privileged RPC surface:
161
+ - parse and compare exact normalized scheme, host, and effective port; never use prefix matching;
162
+ - keep top-level and frame origin policies separate;
163
+ - use a finite command allowlist with typed request and response schemas, size and depth limits,
164
+ request ids, timeouts, cancellation, idempotency for side effects, and bounded concurrency;
165
+ - bind pending requests to the current document generation and cancel them on navigation,
166
+ renderer loss, or disposal;
167
+ - send data through JSON message APIs instead of interpolating values into script source;
168
+ - expose small capability objects only when messages cannot meet the requirement, and recheck
169
+ native authorization on every host-object call.
170
+ 9. Separate trusted app content from external content when native capabilities differ. Prefer a
171
+ dedicated WebView for external pages. Configure scripts, web messages, host objects, and virtual
172
+ host mappings before first navigation. Map only the resource directory, deny unnecessary
173
+ cross-origin access, and keep sensitive files physically outside mapped trees and reparse-point
174
+ escape paths.
175
+ 10. Build navigation state around WebView instance, top-level versus frame scope, and
176
+ `NavigationId`:
177
+ - re-evaluate every redirect rather than trusting the first URL;
178
+ - keep same-document source or history changes separate from a new document generation;
179
+ - reject stale completion events after a newer navigation has started;
180
+ - use `IsSuccess`, `WebErrorStatus`, and HTTP status only for transport evidence, not business
181
+ success;
182
+ - keep request-header inspection separate from mutation and restrict injected headers to the
183
+ exact resource context and origin.
184
+ 11. Route every escape from the current document through one native policy engine:
185
+ - top-level and frame navigation;
186
+ - `NewWindowRequested` and opener behavior;
187
+ - `LaunchingExternalUriScheme`;
188
+ - downloads and final save paths;
189
+ - script dialogs and permission requests.
190
+ Treat `IsUserInitiated` as a gesture signal, not authorization. Check the initiating frame and
191
+ destination, default-deny unknown schemes and origins, and keep permission decisions keyed by
192
+ origin and permission kind.
193
+ 12. Treat popups and downloads as owned asynchronous state:
194
+ - initialize a child WebView under a deferral before assigning `NewWindow`;
195
+ - dispose half-created children when initialization or the parent lifetime fails;
196
+ - distinguish `DownloadStarting.Handled` from `Cancel`;
197
+ - validate the final absolute save path against an allowed directory and safe filename policy;
198
+ - track `CoreWebView2DownloadOperation.State`, including unknown total length, until terminal
199
+ completion or interruption;
200
+ - unregister per-child and per-download handlers at their terminal state.
201
+ 13. Preserve the STA threading contract. Create, initialize, and access WebView2 on the UI STA
202
+ thread with a message pump. Keep one asynchronous initialization owner and do not block its
203
+ callbacks with `.Wait()` or `.Result`. When an event requires asynchronous policy work, acquire
204
+ its deferral, enter `try`, and complete exactly once in `finally`; track outstanding deferrals so
205
+ closing can cancel work and still terminate.
206
+ 14. Make shutdown idempotent and ordered: mark closing, reject new navigation, popup, bridge, and
207
+ download work, cancel pending operations, complete deferrals, close children, unregister events
208
+ from long-lived publishers, remove host objects, close or dispose the controller or control,
209
+ clear references, and wait for browser exit only when a Runtime or UDF operation requires it.
210
+ Hidden controls remain alive; choose hide, suspend, low-memory mode, and permanent disposal as
211
+ distinct policies.
212
+ 15. Coordinate Runtime update adoption and UDF maintenance at the environment-sharing boundary.
213
+ Stop bridge traffic, dispose every WebView using the UDF, release environment references, wait
214
+ for the owning browser process to exit when deletion or replacement requires it, and then create
215
+ the new environment. Recreating one window while another shares the UDF does not adopt a new
216
+ Runtime or release the profile lock.
217
+ 16. Classify `ProcessFailed` by process kind and reason before recovery. Distinguish normal exit,
218
+ abnormal exit, integrity failure, renderer unresponsiveness, launch failure, and whole browser
219
+ process exit when the deployed API exposes them. Use nullable crash details as diagnostics, not
220
+ as a required recovery input. Do not recreate for auto-recoverable GPU or utility exits. Coordinate
221
+ browser-process recovery with `BrowserProcessExited`, deduplicate events across controls, and
222
+ bound recovery by environment generation, retry count, backoff, and one concurrent recovery.
223
+ 17. Diagnose memory by ownership, not the total of every `msedgewebview2.exe` process. Separate
224
+ JavaScript heap and detached DOM, renderer memory, shared browser or helper processes, native
225
+ window/ViewModel retention, environment event cycles, host-object graphs, pending deferrals,
226
+ hidden controls, and expected caches. Pair process ids with UDF, kind, associated frames, active
227
+ controls, and repeated open-close evidence before calling growth a leak.
228
+ 18. Diagnose performance across page and host boundaries. Correlate page performance marks,
229
+ WebView2 event timestamps, navigation ids, process ids, bridge ids, DevTools/CDP traces, and host
230
+ or WPR/WPA traces. Check broad `WebResourceRequested` interception, synchronous UI-thread work,
231
+ bridge chatter, large payloads, slow or network UDF storage, security software, GPU fallback,
232
+ hidden controls, suspension, and low-memory targets before rewriting frontend code.
233
+ 19. Verify the smallest relevant matrix: supported Windows and host framework, installed Runtime
234
+ floor, Evergreen current and preview channel when compatibility matters, Fixed artifact when
235
+ used, packaged and unpackaged startup, first and repeated initialization, navigation and frame
236
+ denial, redirect denial, bridge negative cases, popup and download cancellation, deferral
237
+ completion, permission and external-scheme denial, process-failure recovery, repeated open-close
238
+ memory, planned restart, and UDF cleanup or retention policy.
239
+
240
+ <!-- mustflow-section: hard-bans -->
241
+ ## Hard Bans
242
+
243
+ - Do not treat the NuGet SDK version as proof of the installed Runtime version or API availability.
244
+ - Do not set `Source` before custom environment initialization and then attempt to replace the
245
+ environment.
246
+ - Do not delete a UDF because initialization threw an unclassified exception.
247
+ - Do not authorize native work from `Source.StartsWith`, `IsUserInitiated`, a frontend role flag,
248
+ an arbitrary reflected method name, or a path supplied by JavaScript.
249
+ - Do not expose a service container, application object, shell execution, unrestricted filesystem,
250
+ secrets, tokens, or broad host object to web content.
251
+ - Do not leave event subscriptions, host objects, pending bridge requests, document generations,
252
+ environment references, deferrals, child windows, downloads, or profile locks without an explicit
253
+ owner and cleanup path.
254
+ - Do not treat `IsUserInitiated`, `NavigationCompleted`, `DownloadStarting`, process count, or a
255
+ lower working set as proof of a safe destination, business success, completed download, memory
256
+ leak, or reduced live memory.
257
+ - Do not ship prerelease or experimental API assumptions as a stable production contract without
258
+ feature detection, compatibility bounds, and fallback behavior.
259
+
260
+ <!-- mustflow-section: postconditions -->
261
+ ## Postconditions
262
+
263
+ - Host, SDK, Runtime, channel, distribution mode, environment, UDF, profile, document, and process
264
+ ownership are explicit.
265
+ - Initialization, navigation, bridge, popup, download, permission, deferral, process failure,
266
+ update adoption, and UDF cleanup paths have bounded states and terminal cleanup.
267
+ - Origin, frame, message schema, native authorization, permission, filesystem, and external-launch
268
+ boundaries are enforced on the native side.
269
+ - Memory and performance claims name the process, metric, scenario, timestamps, and after-close or
270
+ recovery evidence.
271
+ - Missing packaged, Runtime-channel, initialization, security-negative, lifecycle, memory, or
272
+ process diagnostic coverage is reported rather than hidden behind a generic frontend test.
273
+
274
+ <!-- mustflow-section: verification -->
275
+ ## Verification
276
+
277
+ Use configured oneshot command intents when available:
278
+
279
+ - `changes_status`
280
+ - `changes_diff_summary`
281
+ - `lint`
282
+ - `build`
283
+ - `test_related`
284
+ - `test`
285
+ - `docs_validate_fast`
286
+ - `mustflow_check`
287
+
288
+ Report missing WebView2-specific intents when relevant: packaged startup smoke, installed Runtime
289
+ detection, SDK/Runtime compatibility, custom-environment initialization, UDF/profile isolation,
290
+ origin and frame denial, malformed or oversized bridge messages, host-object reachability,
291
+ document-generation invalidation, redirect denial, popup initialization, download cancellation and
292
+ path safety, deferral completion, permission and external-scheme denial, process-failure recovery,
293
+ repeated open-close memory, Evergreen restart adoption, Fixed Version packaging, GPU fallback, and
294
+ preview-channel regression.
295
+
296
+ <!-- mustflow-section: failure-handling -->
297
+ ## Failure Handling
298
+
299
+ - If initialization fails, classify environment option mismatch, UDF path or permission, Runtime
300
+ discovery, window handle, UI thread, disposed control, policy override, and browser-process exit
301
+ before retrying or touching stored data.
302
+ - If a blank view appears only after packaging, inspect built assets, virtual host mappings, CSP,
303
+ navigation denial, Runtime availability, architecture loaders, and packaged path permissions
304
+ before changing application state.
305
+ - If bridge responses are stale or duplicated, add document generations, request correlation,
306
+ cancellation, idempotency, and bounded queues before adding retries.
307
+ - If a UDF remains locked, inspect shared environments, other app instances, active WebViews,
308
+ environment references, and browser-process exit before deleting, moving, or recreating it.
309
+ - If a popup, download, dialog, permission, or external launch hangs, inspect deferral completion,
310
+ parent lifetime, initiating frame, terminal operation state, and event cleanup before adding a
311
+ retry or bypass.
312
+ - If memory or processes remain after close, inspect shared UDF ownership, environment event cycles,
313
+ host objects, child windows, downloads, deferrals, hidden controls, renderer heap, and expected
314
+ caches before forcing termination or trimming working sets.
315
+ - If a performance trace disagrees with page timing, preserve both observations and correlate the
316
+ page, WebView event, process, bridge, and OS timelines before assigning the bottleneck.
317
+ - If exact current release claims cannot be refreshed from official sources, remove the precise
318
+ claim from durable guidance and report the unverified boundary.
319
+ - If repository intents cannot exercise a Windows or packaged path, report the missing platform
320
+ evidence and keep the completion claim limited to the checks actually run.
321
+
322
+ <!-- mustflow-section: output-format -->
323
+ ## Output Format
324
+
325
+ - WebView2 boundary checked
326
+ - Host, SDK, Runtime, channel, and distribution mode
327
+ - Environment, UDF, profile, process, document, frame, and lifecycle ownership notes
328
+ - Initialization, UDF/profile, document/frame trust, bridge, and native authorization findings
329
+ - Navigation, redirect, popup, download, permission, external-launch, and deferral findings
330
+ - Runtime distribution, lifecycle, update adoption, process-failure, memory, performance, and
331
+ packaging findings
332
+ - Files changed
333
+ - Command intents run
334
+ - Skipped checks and reasons
335
+ - Remaining WebView2 risk
@@ -1,6 +1,6 @@
1
1
  id = "default"
2
2
  name = "default"
3
- version = "2.115.11"
3
+ version = "2.115.14"
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"
@@ -132,6 +132,8 @@ creates = [
132
132
  ".mustflow/skills/tailwind-code-change/SKILL.md",
133
133
  ".mustflow/skills/tauri-code-change/SKILL.md",
134
134
  ".mustflow/skills/wails-code-change/SKILL.md",
135
+ ".mustflow/skills/webview2-code-change/SKILL.md",
136
+ ".mustflow/skills/hetzner-cloud-change/SKILL.md",
135
137
  ".mustflow/skills/typescript-code-change/SKILL.md",
136
138
  ".mustflow/skills/unocss-code-change/SKILL.md",
137
139
  ".mustflow/skills/cli-option-contract-review/SKILL.md",
@@ -373,6 +375,8 @@ minimal = [
373
375
  "tailwind-code-change",
374
376
  "tauri-code-change",
375
377
  "wails-code-change",
378
+ "webview2-code-change",
379
+ "hetzner-cloud-change",
376
380
  "typescript-code-change",
377
381
  "unocss-code-change",
378
382
  "command-contract-authoring",
@@ -550,6 +554,8 @@ patterns = [
550
554
  "tailwind-code-change",
551
555
  "tauri-code-change",
552
556
  "wails-code-change",
557
+ "webview2-code-change",
558
+ "hetzner-cloud-change",
553
559
  "typescript-code-change",
554
560
  "unocss-code-change",
555
561
  "command-contract-authoring",
@@ -738,6 +744,8 @@ oss = [
738
744
  "tailwind-code-change",
739
745
  "tauri-code-change",
740
746
  "wails-code-change",
747
+ "webview2-code-change",
748
+ "hetzner-cloud-change",
741
749
  "typescript-code-change",
742
750
  "unocss-code-change",
743
751
  "cli-option-contract-review",
@@ -945,6 +953,8 @@ team = [
945
953
  "tailwind-code-change",
946
954
  "tauri-code-change",
947
955
  "wails-code-change",
956
+ "webview2-code-change",
957
+ "hetzner-cloud-change",
948
958
  "typescript-code-change",
949
959
  "unocss-code-change",
950
960
  "command-contract-authoring",
@@ -1136,6 +1146,8 @@ product = [
1136
1146
  "tailwind-code-change",
1137
1147
  "tauri-code-change",
1138
1148
  "wails-code-change",
1149
+ "webview2-code-change",
1150
+ "hetzner-cloud-change",
1139
1151
  "typescript-code-change",
1140
1152
  "unocss-code-change",
1141
1153
  "command-contract-authoring",
@@ -1333,6 +1345,8 @@ library = [
1333
1345
  "tailwind-code-change",
1334
1346
  "tauri-code-change",
1335
1347
  "wails-code-change",
1348
+ "webview2-code-change",
1349
+ "hetzner-cloud-change",
1336
1350
  "typescript-code-change",
1337
1351
  "unocss-code-change",
1338
1352
  "cli-option-contract-review",