cabloy 5.1.227 → 5.1.228

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +16 -0
  3. package/CONTRIBUTING.md +1 -1
  4. package/package.json +2 -2
  5. package/repo-agent-governance/managed-assets.json +30 -30
  6. package/repo-agent-governance/policies/repository.md +1 -1
  7. package/repo-agent-governance/skills/cabloy-backend-scaffold/SKILL.md +3 -3
  8. package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +2 -2
  9. package/repo-agent-governance/skills/cabloy-frontend-scaffold/SKILL.md +1 -0
  10. package/repo-agent-governance/skills/cabloy-master-detail/SKILL.md +2 -1
  11. package/repo-agent-governance/skills/cabloy-resource-field-update/SKILL.md +2 -0
  12. package/repo-agent-governance/skills/cabloy-resource-field-update/references/follow-up-checklist.md +11 -5
  13. package/repo-agent-governance/skills/cabloy-resource-field-update/references/verification-checklist.md +10 -14
  14. package/repo-agent-governance/skills/cabloy-spec-execution/evals/evals.json +4 -2
  15. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +1 -1
  16. package/repo-agent-governance/tests/evidence-paths.test.mjs +84 -13
  17. package/repo-agent-governance/tools/evidence-paths/sanitize.mjs +38 -8
  18. package/repo-docs/backend/migration-and-changes.md +21 -14
  19. package/repo-docs/backend/quickstart.md +1 -1
  20. package/repo-docs/backend/resource-field-update.md +3 -2
  21. package/repo-docs/backend/unit-testing.md +9 -3
  22. package/repo-docs/frontend/table-cell-cookbook.md +32 -0
  23. package/repo-docs/fullstack/quickstart.md +1 -1
  24. package/repo-docs/reference/repo-scripts.md +2 -2
  25. package/repo-e2e/specs/a-commerce.spec.ts +83 -9
  26. package/scripts/init.ts +14 -0
  27. package/vona/pnpm-lock.yaml +25 -82
  28. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +2 -0
  29. package/vona/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +2 -0
  30. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/orderShip.tsx +4 -2
  31. package/zova/package.original.json +1 -1
  32. package/zova/packages-cli/cli/package.json +5 -2
  33. package/zova/packages-cli/cli-set-front/package.json +5 -2
  34. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.bin.buildRest.ts +5 -1
  35. package/zova/pnpm-lock.yaml +434 -276
  36. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +23 -23
  37. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +28 -12
  38. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +245 -85
  39. package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionAdjustStock/controller.tsx +3 -2
  40. package/zova/src/suite/a-commerce/modules/commerce-trade/src/component/tableCellActionShip/controller.tsx +82 -34
  41. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/en-us.ts +1 -0
  42. package/zova/src/suite/a-commerce/modules/commerce-trade/src/config/locale/zh-cn.ts +1 -0
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.227
1
+ 5.1.228
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.228
4
+
5
+ ### Features
6
+
7
+ - Add trade ship order support.
8
+ - Update node-related functionality.
9
+
10
+ ### Bug Fixes
11
+
12
+ - Ensure the commerce locale schema is ready before opening dialogs.
13
+
14
+ ### Improvements
15
+
16
+ - Clarify isolated migration verification and development database updates in the documentation.
17
+ - Update CLI REST build tooling.
18
+
3
19
  ## 5.1.227
4
20
 
5
21
  ### Features
package/CONTRIBUTING.md CHANGED
@@ -11,7 +11,7 @@ Contributions to Cabloy Basic source, tests, tooling, and documentation are welc
11
11
 
12
12
  ## Set up a development checkout
13
13
 
14
- You need Git, Node.js `>=24.4.0`, pnpm `>=12.14.0`, Redis `>=7.2.6`, and one documented development database baseline: SQLite, MySQL `>=8`, or PostgreSQL `>=16`. SQLite setups using `better-sqlite3` may also require a native build toolchain for `node-gyp`.
14
+ You need Git, Node.js `>=24.11.0`, pnpm `>=12.14.0`, Redis `>=7.2.6`, and one documented development database baseline: SQLite, MySQL `>=8`, or PostgreSQL `>=16`. SQLite setups using `better-sqlite3` may also require a native build toolchain for `node-gyp`.
15
15
 
16
16
  ```bash
17
17
  git clone https://github.com/cabloy/cabloy.git
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.227",
3
+ "version": "5.1.228",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -109,7 +109,7 @@
109
109
  "typescript": "^5.9.3"
110
110
  },
111
111
  "engines": {
112
- "node": ">=24.4.0",
112
+ "node": ">=24.11.0",
113
113
  "pnpm": ">=12.14.0"
114
114
  },
115
115
  "packageManager": "pnpm@12.14.0"
@@ -18,14 +18,14 @@
18
18
  {
19
19
  "adapter": "codex",
20
20
  "category": "skill",
21
- "sha256": "11a02f57b7fbccc004e2a8d9cacb0e2af9e6f9a881e53852b9d74cb6309f4fc3",
21
+ "sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
22
22
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
23
23
  "target": ".agents/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
24
24
  },
25
25
  {
26
26
  "adapter": "codex",
27
27
  "category": "skill",
28
- "sha256": "45ac18019b253a8313b5a229528f6373f1a6814d90f27a70783f787b23936aa0",
28
+ "sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
29
29
  "source": "skills/cabloy-backend-scaffold/SKILL.md",
30
30
  "target": ".agents/skills/cabloy-backend-scaffold/SKILL.md"
31
31
  },
@@ -95,14 +95,14 @@
95
95
  {
96
96
  "adapter": "codex",
97
97
  "category": "skill",
98
- "sha256": "af5f73b8c1d52bf0bdd0464c9b29c1f9eccdddece2142da73657d164ab927f95",
98
+ "sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
99
99
  "source": "skills/cabloy-frontend-scaffold/SKILL.md",
100
100
  "target": ".agents/skills/cabloy-frontend-scaffold/SKILL.md"
101
101
  },
102
102
  {
103
103
  "adapter": "codex",
104
104
  "category": "skill",
105
- "sha256": "a284541b88adf5034129866b793eab74f92d01c14cc0f25a15672e796b485185",
105
+ "sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
106
106
  "source": "skills/cabloy-master-detail/SKILL.md",
107
107
  "target": ".agents/skills/cabloy-master-detail/SKILL.md"
108
108
  },
@@ -137,28 +137,28 @@
137
137
  {
138
138
  "adapter": "codex",
139
139
  "category": "skill",
140
- "sha256": "ca061b134cdcb2574b542f98ca4f93a7a39af57b6587e12a5fae0fb4f431de0e",
140
+ "sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
141
141
  "source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
142
142
  "target": ".agents/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
143
143
  },
144
144
  {
145
145
  "adapter": "codex",
146
146
  "category": "skill",
147
- "sha256": "c45978194ce988456656a9d54900c70ce1efc375655ee6f0e2f3003439594a43",
147
+ "sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
148
148
  "source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
149
149
  "target": ".agents/skills/cabloy-resource-field-update/references/verification-checklist.md"
150
150
  },
151
151
  {
152
152
  "adapter": "codex",
153
153
  "category": "skill",
154
- "sha256": "a2cacd13c46bff3116661df32cfcd595a1dac71945e0345a081350e01068c0f7",
154
+ "sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
155
155
  "source": "skills/cabloy-resource-field-update/SKILL.md",
156
156
  "target": ".agents/skills/cabloy-resource-field-update/SKILL.md"
157
157
  },
158
158
  {
159
159
  "adapter": "codex",
160
160
  "category": "skill",
161
- "sha256": "c17feccdf3e3528ba9a8006b03135a581a98bc264412885544acd5e8d089c4bc",
161
+ "sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
162
162
  "source": "skills/cabloy-spec-execution/evals/evals.json",
163
163
  "target": ".agents/skills/cabloy-spec-execution/evals/evals.json"
164
164
  },
@@ -179,7 +179,7 @@
179
179
  {
180
180
  "adapter": "codex",
181
181
  "category": "skill",
182
- "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
182
+ "sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
183
183
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
184
184
  "target": ".agents/skills/cabloy-spec-execution/references/execution-protocol.md"
185
185
  },
@@ -354,14 +354,14 @@
354
354
  {
355
355
  "adapter": "claude",
356
356
  "category": "skill",
357
- "sha256": "11a02f57b7fbccc004e2a8d9cacb0e2af9e6f9a881e53852b9d74cb6309f4fc3",
357
+ "sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
358
358
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
359
359
  "target": ".claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
360
360
  },
361
361
  {
362
362
  "adapter": "claude",
363
363
  "category": "skill",
364
- "sha256": "45ac18019b253a8313b5a229528f6373f1a6814d90f27a70783f787b23936aa0",
364
+ "sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
365
365
  "source": "skills/cabloy-backend-scaffold/SKILL.md",
366
366
  "target": ".claude/skills/cabloy-backend-scaffold/SKILL.md"
367
367
  },
@@ -431,14 +431,14 @@
431
431
  {
432
432
  "adapter": "claude",
433
433
  "category": "skill",
434
- "sha256": "af5f73b8c1d52bf0bdd0464c9b29c1f9eccdddece2142da73657d164ab927f95",
434
+ "sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
435
435
  "source": "skills/cabloy-frontend-scaffold/SKILL.md",
436
436
  "target": ".claude/skills/cabloy-frontend-scaffold/SKILL.md"
437
437
  },
438
438
  {
439
439
  "adapter": "claude",
440
440
  "category": "skill",
441
- "sha256": "a284541b88adf5034129866b793eab74f92d01c14cc0f25a15672e796b485185",
441
+ "sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
442
442
  "source": "skills/cabloy-master-detail/SKILL.md",
443
443
  "target": ".claude/skills/cabloy-master-detail/SKILL.md"
444
444
  },
@@ -473,28 +473,28 @@
473
473
  {
474
474
  "adapter": "claude",
475
475
  "category": "skill",
476
- "sha256": "ca061b134cdcb2574b542f98ca4f93a7a39af57b6587e12a5fae0fb4f431de0e",
476
+ "sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
477
477
  "source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
478
478
  "target": ".claude/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
479
479
  },
480
480
  {
481
481
  "adapter": "claude",
482
482
  "category": "skill",
483
- "sha256": "c45978194ce988456656a9d54900c70ce1efc375655ee6f0e2f3003439594a43",
483
+ "sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
484
484
  "source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
485
485
  "target": ".claude/skills/cabloy-resource-field-update/references/verification-checklist.md"
486
486
  },
487
487
  {
488
488
  "adapter": "claude",
489
489
  "category": "skill",
490
- "sha256": "a2cacd13c46bff3116661df32cfcd595a1dac71945e0345a081350e01068c0f7",
490
+ "sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
491
491
  "source": "skills/cabloy-resource-field-update/SKILL.md",
492
492
  "target": ".claude/skills/cabloy-resource-field-update/SKILL.md"
493
493
  },
494
494
  {
495
495
  "adapter": "claude",
496
496
  "category": "skill",
497
- "sha256": "c17feccdf3e3528ba9a8006b03135a581a98bc264412885544acd5e8d089c4bc",
497
+ "sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
498
498
  "source": "skills/cabloy-spec-execution/evals/evals.json",
499
499
  "target": ".claude/skills/cabloy-spec-execution/evals/evals.json"
500
500
  },
@@ -515,7 +515,7 @@
515
515
  {
516
516
  "adapter": "claude",
517
517
  "category": "skill",
518
- "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
518
+ "sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
519
519
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
520
520
  "target": ".claude/skills/cabloy-spec-execution/references/execution-protocol.md"
521
521
  },
@@ -683,7 +683,7 @@
683
683
  {
684
684
  "adapter": "cursor",
685
685
  "category": "policy",
686
- "sha256": "27ddaa18de3cd88e11dc20c0ad626fe07d5b6231f08243e3fbece7242dcbdc9a",
686
+ "sha256": "162dc7bf2d01964a249bc11b29c429af2d379e29c2d61c748ce332f35a224a8e",
687
687
  "source": "policies/repository.md",
688
688
  "target": ".cursor/rules/cabloy-governance.mdc"
689
689
  },
@@ -704,14 +704,14 @@
704
704
  {
705
705
  "adapter": "cursor",
706
706
  "category": "skill",
707
- "sha256": "11a02f57b7fbccc004e2a8d9cacb0e2af9e6f9a881e53852b9d74cb6309f4fc3",
707
+ "sha256": "5b5aaee730fbc585388840327de41cd8cdfd2fc6419a1dc99a9c32c2fa9676bb",
708
708
  "source": "skills/cabloy-backend-scaffold/references/follow-up-checklist.md",
709
709
  "target": ".cursor/skills/cabloy-backend-scaffold/references/follow-up-checklist.md"
710
710
  },
711
711
  {
712
712
  "adapter": "cursor",
713
713
  "category": "skill",
714
- "sha256": "45ac18019b253a8313b5a229528f6373f1a6814d90f27a70783f787b23936aa0",
714
+ "sha256": "ad7d88df6dc9bd7196ce894883f292537754aefe7c037d05330d6c02d0420e98",
715
715
  "source": "skills/cabloy-backend-scaffold/SKILL.md",
716
716
  "target": ".cursor/skills/cabloy-backend-scaffold/SKILL.md"
717
717
  },
@@ -781,14 +781,14 @@
781
781
  {
782
782
  "adapter": "cursor",
783
783
  "category": "skill",
784
- "sha256": "af5f73b8c1d52bf0bdd0464c9b29c1f9eccdddece2142da73657d164ab927f95",
784
+ "sha256": "b883f2b01ab79d51b23e899be43a1c90a821db916490f50c4b28958eedf36b6e",
785
785
  "source": "skills/cabloy-frontend-scaffold/SKILL.md",
786
786
  "target": ".cursor/skills/cabloy-frontend-scaffold/SKILL.md"
787
787
  },
788
788
  {
789
789
  "adapter": "cursor",
790
790
  "category": "skill",
791
- "sha256": "a284541b88adf5034129866b793eab74f92d01c14cc0f25a15672e796b485185",
791
+ "sha256": "ec828440c4169b2c0235531744ded554db24a71b18082c2b96788c25e4c23ded",
792
792
  "source": "skills/cabloy-master-detail/SKILL.md",
793
793
  "target": ".cursor/skills/cabloy-master-detail/SKILL.md"
794
794
  },
@@ -823,28 +823,28 @@
823
823
  {
824
824
  "adapter": "cursor",
825
825
  "category": "skill",
826
- "sha256": "ca061b134cdcb2574b542f98ca4f93a7a39af57b6587e12a5fae0fb4f431de0e",
826
+ "sha256": "7922a45b7f9553e5b7a405b41b5d8f173d39481dff38a08d34fb7d99a5979ebb",
827
827
  "source": "skills/cabloy-resource-field-update/references/follow-up-checklist.md",
828
828
  "target": ".cursor/skills/cabloy-resource-field-update/references/follow-up-checklist.md"
829
829
  },
830
830
  {
831
831
  "adapter": "cursor",
832
832
  "category": "skill",
833
- "sha256": "c45978194ce988456656a9d54900c70ce1efc375655ee6f0e2f3003439594a43",
833
+ "sha256": "980550915f494cf8e6a5110f84bd518a51378111a3cef49a2772ff62c60dd715",
834
834
  "source": "skills/cabloy-resource-field-update/references/verification-checklist.md",
835
835
  "target": ".cursor/skills/cabloy-resource-field-update/references/verification-checklist.md"
836
836
  },
837
837
  {
838
838
  "adapter": "cursor",
839
839
  "category": "skill",
840
- "sha256": "a2cacd13c46bff3116661df32cfcd595a1dac71945e0345a081350e01068c0f7",
840
+ "sha256": "3423b7bbce2662acbd7d8f31a3607f14fcaee31470b0156cca33b4bfe0a1ab3c",
841
841
  "source": "skills/cabloy-resource-field-update/SKILL.md",
842
842
  "target": ".cursor/skills/cabloy-resource-field-update/SKILL.md"
843
843
  },
844
844
  {
845
845
  "adapter": "cursor",
846
846
  "category": "skill",
847
- "sha256": "c17feccdf3e3528ba9a8006b03135a581a98bc264412885544acd5e8d089c4bc",
847
+ "sha256": "780105ec2e56a5460664836aab98b6dfc610ca1f9951becc165c524f80d52ff6",
848
848
  "source": "skills/cabloy-spec-execution/evals/evals.json",
849
849
  "target": ".cursor/skills/cabloy-spec-execution/evals/evals.json"
850
850
  },
@@ -865,7 +865,7 @@
865
865
  {
866
866
  "adapter": "cursor",
867
867
  "category": "skill",
868
- "sha256": "a7aae017823a738fbf031424bb68b6cd982f0832102dfbe7320eacaf713919f8",
868
+ "sha256": "4f1b4b87b2c0d2ff485c58c8f891189fd3dc7914d66af806c1a808d22cd94124",
869
869
  "source": "skills/cabloy-spec-execution/references/execution-protocol.md",
870
870
  "target": ".cursor/skills/cabloy-spec-execution/references/execution-protocol.md"
871
871
  },
@@ -1005,14 +1005,14 @@
1005
1005
  {
1006
1006
  "adapter": "codex",
1007
1007
  "category": "policy",
1008
- "sha256": "e5929a9b3fa63d76faa596fcd24a9faa4fc8bcadd3eae2e99507ac0b33567efe",
1008
+ "sha256": "af4c50c261114d494961bd30a75c2a7baf999a43644d0aa9c218fbd8ad83c53d",
1009
1009
  "source": "policies/repository.md",
1010
1010
  "target": "AGENTS.md"
1011
1011
  },
1012
1012
  {
1013
1013
  "adapter": "claude",
1014
1014
  "category": "policy",
1015
- "sha256": "e5929a9b3fa63d76faa596fcd24a9faa4fc8bcadd3eae2e99507ac0b33567efe",
1015
+ "sha256": "af4c50c261114d494961bd30a75c2a7baf999a43644d0aa9c218fbd8ad83c53d",
1016
1016
  "source": "policies/repository.md",
1017
1017
  "target": "CLAUDE.md"
1018
1018
  }
@@ -109,4 +109,4 @@ Before inventing a custom implementation path:
109
109
  - For code-generation or workflow guidance changes: verify that the referenced scripts and command families still exist.
110
110
  - For code changes: prefer the narrowest meaningful verification first, then use shared root scripts when broader confidence is needed.
111
111
  - Keep frontend and backend verification proportional to the change: cover critical behavior using existing infrastructure, not exhaustive upfront test matrices or bespoke source-evaluation/mock harnesses. Prefer a few critical-flow E2E scenarios for frontend work and the smallest meaningful service/model/API/integration tests for backend work; add focused regressions for actual defects. Preserve applicable security, SSR, data-consistency, migration, and acceptance requirements.
112
- - Any change to `meta.version.ts` requires running `npm run test` so the test database is reinitialized and schema/data consistency issues surface early.
112
+ - Verify changes to migration, initialization, or seed behavior through the managed isolated test entrypoint, preferably with focused tests covering the affected behavior. Do not require the full suite solely because `meta.version.ts` changed; expand coverage according to actual impact. Isolated tests do not update development databases: apply pending migrations through normal startup, require explicit approval to reset disposable dev data when replaying an already-applied positive-numbered branch, and use a new migration when existing data must be preserved.
@@ -200,7 +200,7 @@ For persisted test data, classify each record as a durable module seed or a test
200
200
  Check whether the feature needs:
201
201
 
202
202
  - unit tests
203
- - `db:reset` or migration verification
203
+ - managed isolated migration verification and a separate development-database update decision
204
204
  - controller action testing
205
205
  - broader `test` / `tsc` / `build` checks
206
206
 
@@ -239,7 +239,7 @@ Always end with a verification path that matches the scope of the backend change
239
239
 
240
240
  Prefer focused tests of critical business behavior using the existing Vona testing infrastructure. Choose the smallest meaningful service/model, controller/API, or integration boundary for the changed contract; browser E2E is not the default backend test layer. Avoid exhaustive upfront mock/fake matrices and bespoke harnesses. Add focused regression coverage when actual defects are fixed; targeted unit and framework tests remain useful when they directly prove new or changed behavior.
241
241
 
242
- Keep relevant static checks scope-dependent and preserve applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance requirements. These are selected by the affected behavior, not a mandatory matrix for every change. Retain `mockCtx(...)` ownership, test-resource isolation, precise fixture cleanup, and the required `npm run test` after `meta.version.ts` changes. Missing runtime access is a reported gap, not permission to reset resources or invent substitute test machinery. See [Unit Testing](../../../repo-docs/backend/unit-testing.md).
242
+ Keep relevant static checks scope-dependent and preserve applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance requirements. These are selected by the affected behavior, not a mandatory matrix for every change. Retain `mockCtx(...)` ownership, test-resource isolation, and precise fixture cleanup. Verify migration, initialization, or seed changes through managed isolated tests covering the affected behavior; focused tests still prepare the test database, so a `meta.version.ts` edit alone does not require the full suite. Tests do not update development databases; decide the development migration/reset path separately using [Migration and Changes](../../../repo-docs/backend/migration-and-changes.md#local-development-workflow). Missing runtime access is a reported gap, not permission to reset resources or invent substitute test machinery. See [Unit Testing](../../../repo-docs/backend/unit-testing.md).
243
243
 
244
244
  Shared checks, when applicable, include:
245
245
 
@@ -251,7 +251,7 @@ Narrower checks may include:
251
251
 
252
252
  - module test updates
253
253
  - route/controller action verification
254
- - migration reset flow
254
+ - focused managed migration tests; development reset only with separate explicit approval
255
255
  - CRUD workflow test coverage
256
256
 
257
257
  ## Response pattern
@@ -83,8 +83,8 @@ When the active edition and installed modules provide `@Passport.rbac(...)` and
83
83
  - focused regressions for actual defects; avoid exhaustive upfront mock/fake matrices and bespoke harnesses
84
84
  - applicable authentication/authorization, tenant-isolation, transaction, concurrency, idempotency, migration, and acceptance checks
85
85
  - relevant format, lint, and type checks using the smallest supported scope
86
- - `npm run test`, including the required run after `meta.version.ts` changes
87
- - migration verification when affected; `db:reset` remains destructive and requires explicit approval
86
+ - managed isolated tests for affected migration, initialization, and seed behavior, preferably focused; expand to the full suite for actual impact, not merely a `meta.version.ts` edit
87
+ - a separate development-database decision: normal startup applies pending migrations, while replaying an already-applied positive-numbered branch on disposable dev data requires an explicitly approved `db:reset`; preserve existing data with a new migration
88
88
  - `npm run build` only when the affected artifact or acceptance boundary requires it
89
89
 
90
90
  ## Escalation rule
@@ -205,6 +205,7 @@ Check whether the feature needs:
205
205
  - style/theme/icon updates
206
206
  - wrapper usage review
207
207
  - async interaction ownership: for a button-only action, return or await the complete action through `ZButton onPerform`, choose one error presentation owner rather than combining its generic alert with local query/error UI, and do not mirror the same lifecycle with button-local `loading` / `disabled` state; retain explicit state only for independently initiated or broader shared work
208
+ - business row actions that require additional input: prefer a compact trigger and a focused dialog unless deliberate inline editing is intended; follow the [TableCell dialog pattern](../../../repo-docs/frontend/table-cell-cookbook.md#collect-input-for-a-business-row-action-in-a-dialog) for schema-backed forms where suitable, existing mutation ownership, success-only closure, failure input retention, and dialog-scoped E2E verification
208
209
  - async-loading or controllerRef implications
209
210
 
210
211
  ### Verification
@@ -194,7 +194,8 @@ Typical checks include:
194
194
  - confirm detail schema/index support is present
195
195
  - confirm both modules’ `.metadata/index.ts` outputs reflect the expected nested detail DTOs
196
196
  - if standalone mode applies, confirm the detail module still exposes its standalone resource surface
197
- - if this workflow changes `meta.version.ts`, run `npm run test` so the test database is reinitialized and schema/data consistency issues surface early
197
+ - verify migration, initialization, or seed changes through managed isolated tests covering the affected aggregate and detail behavior; focused runs still prepare the test database, so a `meta.version.ts` edit alone does not require the full suite
198
+ - decide development-database updates separately: isolated tests do not update dev data, normal startup applies pending migrations, and replaying an already-applied positive-numbered branch on disposable dev data requires explicit reset approval; use a new migration to preserve existing data
198
199
 
199
200
  ## Response pattern
200
201
 
@@ -115,6 +115,8 @@ Then:
115
115
  2. fold the schema change into the current version path
116
116
  3. do not create a new migration branch
117
117
 
118
+ An already-applied positive-numbered migration branch does not replay during normal startup. Managed focused tests exercise the edited branch on a fresh isolated test database, not the development database. Recreating disposable dev data requires separate explicit reset approval; a no-bump decision does not grant it. If existing data must be preserved, resolve a new incremental migration strategy instead. See [Migration and Changes](../../../repo-docs/backend/migration-and-changes.md#local-development-workflow).
119
+
118
120
  ## Step 4: Inspect the current backend thread first
119
121
 
120
122
  Before proposing or making edits, inspect the existing thread:
@@ -55,14 +55,20 @@ Apply when the user explicitly wants to demonstrate custom renderer development:
55
55
 
56
56
  ## Verification follow-up
57
57
 
58
- ### If persistence changed
58
+ ### Backend checks
59
59
 
60
- - `npm run test`
60
+ - relevant typecheck, such as `cd vona && npm run tsc`
61
+ - focused managed tests, such as `npm run test -- 'src/module/<module-name>/test/**/*.ts'` from the repository root; resolve the actual path for suite-owned modules
62
+ - if persistence, initialization, or seed behavior changed, cover that behavior in the managed run; focused tests still prepare a fresh isolated test database, so a `meta.version.ts` edit alone does not require the full suite
63
+ - expand coverage according to actual impact, including upgrade behavior when applicable
61
64
 
62
- ### If the change is narrower
65
+ ### Development-database follow-up
63
66
 
64
- - `cd vona && npm run tsc`
65
- - `cd vona && npm test -- <resource-test>.test.ts`
67
+ - isolated tests do not update development data
68
+ - normal startup applies pending migrations to existing prepared databases
69
+ - an already-applied positive-numbered migration branch does not replay on startup; recreating disposable dev data requires separate explicit reset approval, even after a no-bump decision
70
+ - use a new incremental migration when existing data must be preserved
71
+ - see [Migration and Changes](../../../../repo-docs/backend/migration-and-changes.md#local-development-workflow) for lifecycle and reset safety
66
72
 
67
73
  ### If custom frontend renderers were introduced
68
74
 
@@ -11,32 +11,28 @@ This means the task changed storage shape, such as:
11
11
  - `meta.version.ts`
12
12
  - module `fileVersion`
13
13
 
14
- Run:
14
+ Verify affected migration, initialization, or seed behavior through the managed isolated test entrypoint. Prefer focused tests that cover the changed resource:
15
15
 
16
16
  ```bash
17
- npm run test
17
+ npm run test -- 'src/module/<module-name>/test/**/*.ts'
18
18
  ```
19
19
 
20
- Reason:
20
+ Resolve the actual test path for suite-owned modules. A focused managed run still recreates its isolated test database and runs migrations, initialization, and seeds; a `meta.version.ts` edit alone does not require the full suite. Expand coverage according to actual impact, including upgrade behavior when applicable; fresh-database preparation alone does not prove an existing-data upgrade.
21
21
 
22
- - the test database should be reinitialized so schema/version mismatches surface early
22
+ Development-database updates are a separate decision. Tests do not update dev data. Normal startup applies pending migrations to existing prepared databases, but does not replay an already-applied positive-numbered branch. Recreating disposable dev data requires explicit reset approval; a no-bump decision is not authorization. Use a new incremental migration when data must be preserved. See [Migration and Changes](../../../../repo-docs/backend/migration-and-changes.md#local-development-workflow).
23
23
 
24
- ## 2. If the change is narrower
24
+ ## 2. For all backend field changes
25
25
 
26
- Start with the narrowest meaningful checks first.
26
+ Start with the narrowest meaningful checks, including when persistence changed.
27
27
 
28
- Typical sequence:
28
+ Typical root-level sequence:
29
29
 
30
30
  ```bash
31
- cd vona && npm run tsc
32
- cd vona && npm test -- <resource-test>.test.ts
31
+ npm run tsc:vona
32
+ npm run test -- 'src/module/<module-name>/test/**/*.ts'
33
33
  ```
34
34
 
35
- Use this for:
36
-
37
- - validation-only refinement
38
- - locale updates for a field
39
- - renderer metadata changes on an existing persisted field
35
+ For validation-only refinements, locale updates, or renderer metadata changes on an existing field, select relevant checks without inventing a migration requirement.
40
36
 
41
37
  ## 3. If custom frontend renderers were introduced
42
38
 
@@ -35,11 +35,13 @@
35
35
  {
36
36
  "id": 4,
37
37
  "prompt": "Implement WBS-ABC-30-01, which adds a persisted field to an existing entity. Just choose the migration version that seems consistent with nearby modules and continue.",
38
- "expected_output": "Requires an explicit decision about whether vonaModule.fileVersion increments before editing migration metadata, does not invent migration history, and includes the required full test consequence if meta.version.ts changes.",
38
+ "expected_output": "Requires an explicit decision about whether vonaModule.fileVersion increments before editing migration metadata, does not invent migration history, and plans managed isolated verification of affected migration behavior, preferably with focused tests. Separates development-database updates from test verification and preserves explicit reset approval.",
39
39
  "files": ["files/scenarios.json"],
40
40
  "expectations": [
41
41
  "Asks direct fileVersion strategy before migration edits.",
42
- "Includes npm run test consequence if meta.version.ts changes."
42
+ "Plans managed focused tests for affected migration behavior without requiring the full suite solely for a meta.version.ts edit.",
43
+ "States that isolated tests do not update dev data; normal startup applies pending migrations, not already-applied positive-numbered branches.",
44
+ "Keeps reset approval separate from the fileVersion decision and uses a new migration when data must be preserved."
43
45
  ]
44
46
  },
45
47
  {
@@ -79,7 +79,7 @@ When authority records conflict, stop the affected work. Update the authoritativ
79
79
 
80
80
  ### Persisted schema and file version
81
81
 
82
- If implementation may add or alter a persisted field, table, relation, index, or `meta.version.ts` path, ask before editing whether `vonaModule.fileVersion` should increment. Do not infer the answer from neighboring modules. If `meta.version.ts` changes, the repository rule requires `npm run test` after the change; include this in the dossier and evidence plan.
82
+ If implementation may add or alter a persisted field, table, relation, index, or `meta.version.ts` path, ask before editing whether `vonaModule.fileVersion` should increment. Do not infer the answer from neighboring modules. Include managed isolated verification of affected migration, initialization, or seed behavior in the dossier and evidence plan; focused tests still prepare the test database, and a `meta.version.ts` edit alone does not require the full suite. Record development-database updates separately: tests do not update dev data, normal startup applies pending migrations, and replaying an already-applied positive-numbered branch on disposable dev data requires separate explicit reset approval. A no-bump decision is not reset authorization; use a new migration when existing data must be preserved.
83
83
 
84
84
  ### Contract loop
85
85
 
@@ -369,24 +369,95 @@ test('stream fatal UTF-8 and line limit never emit raw fragments of the failing
369
369
  test('stream rejects binary control bytes on complete and final lines without raw fragments', async () => {
370
370
  for (const byte of [0, 1, 27, 127]) {
371
371
  for (const ending of ['', '\n']) {
372
- const bytes = Buffer.concat([
373
- Buffer.from('/Users/Secret/file '),
374
- Buffer.from([byte]),
375
- Buffer.from(ending),
376
- ]);
372
+ for (const prefix of ['', '/Users/Secret/file ']) {
373
+ const bytes = Buffer.concat([
374
+ Buffer.from(prefix),
375
+ Buffer.from([byte]),
376
+ Buffer.from(ending),
377
+ ]);
378
+ const bytePosition = Buffer.byteLength(prefix) + 1;
379
+ const output = sink();
380
+ await assert.rejects(
381
+ sanitizeStream(Readable.from([bytes]), output.stream, { matcher }),
382
+ error => {
383
+ assert.equal(String(error), 'Error: BINARY');
384
+ assert.equal(error.code, 'BINARY');
385
+ assert.deepEqual(error.details, { byte, line: 1, bytePosition });
386
+ return true;
387
+ },
388
+ );
389
+ assert.equal(output.text(), '');
390
+ const result = cli(['sanitize'], bytes);
391
+ assert.equal(result.status, 2);
392
+ assert.equal(result.stdout, '');
393
+ assert.equal(
394
+ result.stderr,
395
+ `evidence-paths: BINARY byte=${byte} line=1 byte-position=${bytePosition}\n`,
396
+ );
397
+ }
398
+ }
399
+ }
400
+ assert.equal(await streamed([Buffer.from('plain\ttext\f\r\n')]), 'plain\ttext\f\r\n');
401
+ });
402
+
403
+ test('binary diagnostics use original byte positions across chunks and input lines', async () => {
404
+ for (const ending of ['', '\n']) {
405
+ const bytes = Buffer.concat([
406
+ Buffer.from('ok\r\n\r\né🙂'),
407
+ Buffer.from([27, 0]),
408
+ Buffer.from('/Users/Secret/file'),
409
+ Buffer.from(ending),
410
+ ]);
411
+ for (const chunks of [[bytes], Array.from(bytes, byte => Buffer.from([byte]))]) {
377
412
  const output = sink();
378
413
  await assert.rejects(
379
- sanitizeStream(Readable.from([bytes]), output.stream, { matcher }),
380
- /^Error: BINARY$/u,
414
+ sanitizeStream(Readable.from(chunks), output.stream, { matcher }),
415
+ error => {
416
+ assert.equal(String(error), 'Error: BINARY');
417
+ assert.equal(error.code, 'BINARY');
418
+ assert.deepEqual(error.details, { byte: 27, line: 3, bytePosition: 7 });
419
+ return true;
420
+ },
381
421
  );
382
- assert.equal(output.text(), '');
383
- const result = cli(['sanitize'], bytes);
384
- assert.equal(result.status, 2);
385
- assert.equal(result.stdout, '');
386
- assert.equal(result.stderr, 'evidence-paths: BINARY\n');
422
+ assert.equal(output.text(), 'ok\r\n\r\n');
423
+ const cliOutput = sink();
424
+ const errors = sink();
425
+ assert.equal(
426
+ await runCli(['sanitize'], {
427
+ input: Readable.from(chunks),
428
+ output: cliOutput.stream,
429
+ error: errors.stream,
430
+ }),
431
+ 2,
432
+ );
433
+ assert.equal(cliOutput.text(), 'ok\r\n\r\n');
434
+ assert.equal(errors.text(), 'evidence-paths: BINARY byte=27 line=3 byte-position=7\n');
387
435
  }
436
+ const result = cli(['sanitize'], bytes);
437
+ assert.equal(result.status, 2);
438
+ assert.equal(result.stdout, 'ok\r\n\r\n');
439
+ assert.equal(result.stderr, 'evidence-paths: BINARY byte=27 line=3 byte-position=7\n');
440
+ }
441
+ });
442
+
443
+ test('line limits retain precedence over binary diagnostics', async () => {
444
+ for (const ending of ['', '\n']) {
445
+ const bytes = Buffer.concat([
446
+ Buffer.from([27]),
447
+ Buffer.alloc(LINE_LIMIT, 97),
448
+ Buffer.from(ending),
449
+ ]);
450
+ const output = sink();
451
+ await assert.rejects(
452
+ sanitizeStream(Readable.from([bytes]), output.stream, { matcher }),
453
+ /^Error: LINE_LIMIT$/u,
454
+ );
455
+ assert.equal(output.text(), '');
456
+ const result = cli(['sanitize'], bytes);
457
+ assert.equal(result.status, 2);
458
+ assert.equal(result.stdout, '');
459
+ assert.equal(result.stderr, 'evidence-paths: LINE_LIMIT\n');
388
460
  }
389
- assert.equal(await streamed([Buffer.from('plain\ttext\f\r\n')]), 'plain\ttext\f\r\n');
390
461
  });
391
462
 
392
463
  test('stream input/output failures and CLI diagnostics never expose raw exception text or stacks', async () => {