cabloy 5.1.212 → 5.1.214

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.cabloy-version +1 -1
  2. package/CHANGELOG.md +14 -0
  3. package/package.json +1 -1
  4. package/repo-agent-governance/managed-assets.json +12 -12
  5. package/repo-agent-governance/policies/repository.md +2 -0
  6. package/repo-agent-governance/skills/cabloy-spec-execution/SKILL.md +7 -1
  7. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +4 -2
  8. package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +10 -0
  9. package/repo-docs/ai/ai-spec-driven-development.md +12 -0
  10. package/repo-docs/backend/migration-and-changes.md +5 -1
  11. package/repo-docs/backend/startup-guide.md +16 -1
  12. package/repo-docs/frontend/permission-formscene-action-visibility-guide.md +7 -5
  13. package/repo-docs/reference/repo-scripts.md +3 -1
  14. package/vona/packages-cli/cli/package.json +1 -1
  15. package/vona/packages-cli/cli-set-api/cli/templates/tools/masterDetail/boilerplate/dto/<%=argv.detailDtoResItemName%>.tsx_ +3 -3
  16. package/vona/packages-cli/cli-set-api/package.json +1 -1
  17. package/vona/packages-vona/vona/package.json +1 -1
  18. package/vona/pnpm-lock.yaml +139 -29
  19. package/vona/src/suite/a-training/modules/training-record/src/dto/detailRecordSubjectResItem.tsx +3 -3
  20. package/vona/src/suite/a-training/modules/training-student/src/dto/detailRecordResItem.tsx +3 -3
  21. package/vona/src/suite-vendor/a-vona/modules/a-printtip/package.json +1 -1
  22. package/vona/src/suite-vendor/a-vona/modules/a-printtip/src/bean/startup.printTip.ts +1 -1
  23. package/vona/src/suite-vendor/a-vona/modules/a-printtip/test/printTip.test.ts +46 -0
  24. package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
  25. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/service/startup.ts +16 -21
  26. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/types/startup.ts +0 -1
  27. package/vona/src/suite-vendor/a-vona/modules/a-startup/test/devSeed.test.ts +282 -30
  28. package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
  29. package/vona/src/suite-vendor/a-vona/modules/a-version/src/service/version.ts +3 -0
  30. package/vona/src/suite-vendor/a-vona/modules/a-version/test/instanceSeed.test.ts +47 -0
  31. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  32. package/zova/packages-zova/zova/package.json +2 -2
  33. package/zova/pnpm-lock.yaml +8 -8
  34. package/zova/src/suite/cabloy-basic/modules/basic-details/src/bean/tableCell.actionOperationsRow.tsx +6 -5
  35. package/zova/src/suite/cabloy-basic/modules/basic-details/src/bean/tableCell.actionUpdate.tsx +1 -0
  36. package/zova/src/suite/cabloy-basic/modules/basic-details/src/bean/tableCell.actionView.tsx +1 -0
  37. package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/actionCreate/controller.tsx +1 -0
  38. package/zova/src/suite/cabloy-basic/modules/basic-details/src/component/formFieldDetails/controller.tsx +20 -8
  39. package/zova/src/suite/cabloy-basic/modules/basic-details/src/lib/detailsPermissions.ts +6 -4
  40. package/zova/src/suite/cabloy-basic/modules/basic-details/src/service/detail.tsx +1 -0
  41. package/zova/src/suite/cabloy-basic/modules/basic-details/src/types/detail.ts +2 -0
  42. package/zova/src/suite/cabloy-basic/modules/basic-details/src/types/details.ts +2 -2
  43. package/zova/src/suite/cabloy-basic/modules/basic-details/src/types/dialogForm.ts +3 -0
  44. package/zova/src/suite/cabloy-basic/modules/basic-details/test/lib/detailsPermissions.test.ts +196 -1
  45. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +1 -1
  46. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts +8 -2
  47. package/zova/src/suite-vendor/a-zova/package.json +2 -2
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.212
1
+ 5.1.214
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.1.214
4
+
5
+ ### Improvements
6
+
7
+ - Enhance the AI specification.
8
+ - Refactor database reset logic.
9
+ - Improve `printTip` output.
10
+
11
+ ## 5.1.213
12
+
13
+ ### Bug Fixes
14
+
15
+ - Fix details.
16
+
3
17
  ## 5.1.212
4
18
 
5
19
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabloy",
3
- "version": "5.1.212",
3
+ "version": "5.1.214",
4
4
  "gitHead": "2c5c19284bab738e492856189acb6fad74b8a7b7",
5
5
  "description": "A Node.js fullstack framework",
6
6
  "keywords": [
@@ -179,7 +179,7 @@
179
179
  {
180
180
  "adapter": "codex",
181
181
  "category": "skill",
182
- "sha256": "e3441608051b6383385a9c4bd7fd77c8fc9e48a89293c4da81f05e067f9a8e8a",
182
+ "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
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
  },
@@ -193,7 +193,7 @@
193
193
  {
194
194
  "adapter": "codex",
195
195
  "category": "skill",
196
- "sha256": "60e20ef75f390a25464208470b6862f7a559d9eddf4d6f8012d2b99cc992c887",
196
+ "sha256": "cc739f11ae129235375a461b7376d639af967e1c659d4735a03b0973ff53dbdd",
197
197
  "source": "skills/cabloy-spec-execution/SKILL.md",
198
198
  "target": ".agents/skills/cabloy-spec-execution/SKILL.md"
199
199
  },
@@ -249,7 +249,7 @@
249
249
  {
250
250
  "adapter": "codex",
251
251
  "category": "skill",
252
- "sha256": "4d7c6a45eb8854ac50a04e8cbf878c7b47dc5253dad05b9cea7ed0ec2b28b1d0",
252
+ "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
253
253
  "source": "skills/cabloy-spec-generation/SKILL.md",
254
254
  "target": ".agents/skills/cabloy-spec-generation/SKILL.md"
255
255
  },
@@ -515,7 +515,7 @@
515
515
  {
516
516
  "adapter": "claude",
517
517
  "category": "skill",
518
- "sha256": "e3441608051b6383385a9c4bd7fd77c8fc9e48a89293c4da81f05e067f9a8e8a",
518
+ "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
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
  },
@@ -529,7 +529,7 @@
529
529
  {
530
530
  "adapter": "claude",
531
531
  "category": "skill",
532
- "sha256": "60e20ef75f390a25464208470b6862f7a559d9eddf4d6f8012d2b99cc992c887",
532
+ "sha256": "cc739f11ae129235375a461b7376d639af967e1c659d4735a03b0973ff53dbdd",
533
533
  "source": "skills/cabloy-spec-execution/SKILL.md",
534
534
  "target": ".claude/skills/cabloy-spec-execution/SKILL.md"
535
535
  },
@@ -585,7 +585,7 @@
585
585
  {
586
586
  "adapter": "claude",
587
587
  "category": "skill",
588
- "sha256": "4d7c6a45eb8854ac50a04e8cbf878c7b47dc5253dad05b9cea7ed0ec2b28b1d0",
588
+ "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
589
589
  "source": "skills/cabloy-spec-generation/SKILL.md",
590
590
  "target": ".claude/skills/cabloy-spec-generation/SKILL.md"
591
591
  },
@@ -683,7 +683,7 @@
683
683
  {
684
684
  "adapter": "cursor",
685
685
  "category": "policy",
686
- "sha256": "2948516f964a13242178b4f5969756d469f60cc1766616a53e899c5551cf443d",
686
+ "sha256": "0b196a0d31058bb1d54efd10cdd7acbe51534d5738a908af57ef13d285afea8a",
687
687
  "source": "policies/repository.md",
688
688
  "target": ".cursor/rules/cabloy-governance.mdc"
689
689
  },
@@ -865,7 +865,7 @@
865
865
  {
866
866
  "adapter": "cursor",
867
867
  "category": "skill",
868
- "sha256": "e3441608051b6383385a9c4bd7fd77c8fc9e48a89293c4da81f05e067f9a8e8a",
868
+ "sha256": "044824fcfceff8153b722b8239d81d939286cb05ec03f75e78cfd03afe465f5a",
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
  },
@@ -879,7 +879,7 @@
879
879
  {
880
880
  "adapter": "cursor",
881
881
  "category": "skill",
882
- "sha256": "60e20ef75f390a25464208470b6862f7a559d9eddf4d6f8012d2b99cc992c887",
882
+ "sha256": "cc739f11ae129235375a461b7376d639af967e1c659d4735a03b0973ff53dbdd",
883
883
  "source": "skills/cabloy-spec-execution/SKILL.md",
884
884
  "target": ".cursor/skills/cabloy-spec-execution/SKILL.md"
885
885
  },
@@ -935,7 +935,7 @@
935
935
  {
936
936
  "adapter": "cursor",
937
937
  "category": "skill",
938
- "sha256": "4d7c6a45eb8854ac50a04e8cbf878c7b47dc5253dad05b9cea7ed0ec2b28b1d0",
938
+ "sha256": "846d81a0c8067900c4bcf3b9a854ca831cf4f0d2a184511fc6a01560da3b8dcb",
939
939
  "source": "skills/cabloy-spec-generation/SKILL.md",
940
940
  "target": ".cursor/skills/cabloy-spec-generation/SKILL.md"
941
941
  },
@@ -1005,14 +1005,14 @@
1005
1005
  {
1006
1006
  "adapter": "codex",
1007
1007
  "category": "policy",
1008
- "sha256": "f4f6c2584bd58846e315ecf2c0772a47735ef0d1f24a72213d2d6ea13673db71",
1008
+ "sha256": "f4242299ae0b3a95427caaf9b137032767afa381d29135254195107348c4c42b",
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": "f4f6c2584bd58846e315ecf2c0772a47735ef0d1f24a72213d2d6ea13673db71",
1015
+ "sha256": "f4242299ae0b3a95427caaf9b137032767afa381d29135254195107348c4c42b",
1016
1016
  "source": "policies/repository.md",
1017
1017
  "target": "CLAUDE.md"
1018
1018
  }
@@ -69,6 +69,8 @@ Before inventing a custom implementation path:
69
69
  - In SSR, keep server HTML and the client's hydration-time initial render equivalent. When server rendering intentionally omits private, cookie-unavailable, or browser-only state, keep the same neutral shell or placeholder through hydration and defer its query/load/render branch to an explicit post-hydration, admission, mounted, or interaction boundary.
70
70
  - Keep portable repo-wide AI rules short and durable in `repo-agent-governance/policies/`; put branching root workflows in `repo-agent-governance/skills/` and regenerate platform adapters instead of hand-editing them.
71
71
  - Treat hooks, permissions, local settings, credentials, MCP registration, command discovery, and automatic command execution as platform-specific integrations, not portable rule or skill capabilities.
72
+ - Plan to resolve named blockers for a bounded increment, not every future detail. Define finite exit criteria, batch related decisions, and require new facts, decision value, or explicit blocker reduction for further planning; do not substitute repeated refinement for delivery.
73
+ - Scope blockers to their actual dependency branches and surface meaningful, independently verifiable implementation candidates elsewhere without executing them unapproved. Once the selected increment is ready, request missing execution approval or proceed within existing unchanged approval; do not repeatedly reconfirm the same scope. Preserve security gates and separate runtime evidence/release requirements; neither a planning-round quota nor empty scaffolding justifies bypass or completion.
72
74
  - After implementation, do not launch broad reviews automatically; when review is needed, scope it to the current diff and report only high-confidence issues.
73
75
  - Do not modify shared environment identity or ports merely to bypass a busy resource. For intentional parallel worktree setup, follow `repo-docs/fullstack/parallel-worktree-environment.md`; otherwise wait for the shared resource or ask the user. Create or change worktree-local environment overrides only through the explicitly invoked `cabloy-worktree-environment` skill and its confirmation phase, and only in `vona/env/.env.local` and `zova/env/.env.local`; never modify flavor-, mode-, app-mode-, or runtime-specific `.env.*.local` files. The skill derives the standard `APP_NAME`, `SERVER_LISTEN_PORT`, `DEV_SERVER_PORT`, `DEV_SERVER_HMR_PORT`, and API-derived `API_BASE_URL` tuple only from Git worktree metadata and fixed port baselines; never read or expose `.env*` content while recommending values. Admin and Web are alternative commands using this shared tuple and must not run concurrently in one worktree; use another linked worktree for concurrent use. Detect the active edition before choosing scripts, and never run `npm run init` as an automatic follow-up.
74
76
  - In Cabloy Basic and Cabloy Start, root `npm run test` and `npm run test:e2e` allocate an isolated same-checkout test run: disposable run-specific database and Redis namespaces, runtime/public paths, and listener. Ordinary same-checkout dev-process presence alone is not a blocker; do not require dev shutdown, another worktree, or environment changes solely to run these tests. Judge conflicts by actual overlap with effective test resources or shared preparation writes, not process names. Builds and dependency installation/generation remain shared prerequisites; coordinate overlapping writes, and check custom external resources separately. This guarantee does not cover raw test commands or authorize manual resets, process killing, or shared configuration changes. See `repo-docs/reference/repo-scripts.md`.
@@ -90,9 +90,13 @@ Classify targets as observed existing, proposed new, or explicitly approved new.
90
90
 
91
91
  Require explicit dossier approval before source changes, meaningful verification, or evidence/status updates. Generation approval, design/ADR acceptance, and this execution approval are separate; silence is not approval.
92
92
 
93
+ Reuse an already explicitly approved dossier when the target, scope, authority, dependencies, safety conditions and permitted operations remain valid. Check current revision/worktree attribution and evidence applicability; a revision change alone calls for an impact check, not automatic reapproval. Do not request the same approval again merely because a skill handoff, session continuation or implementation substep occurred. Refresh affected parts and seek renewed approval only when a material change, newly observed risk or the approval's own conditions require it. Existing approval never expands to another task or an unapproved external/destructive operation.
94
+
93
95
  ## Step 5: Apply readiness gates
94
96
 
95
- Stop and route back to the relevant planning authority if any of the following applies:
97
+ Apply these gates to the selected increment and its actual dependencies, not every unresolved detail in the suite. Separate start-readiness from the runtime evidence this increment will produce and from later release gates; predecessor proof remains mandatory. If blocked, name the exact condition, affected branch and closure criterion in the existing records. Recommend a meaningful dependency-ready alternative for approval when one exists, without silently changing the target or its status. A smaller subincrement of a blocked WBS requires a justified independent boundary and explicit approval; it cannot bypass a controlling safety gate or claim parent completion.
98
+
99
+ Stop and route only the affected authority questions back to planning if any of the following applies:
96
100
 
97
101
  - the suite identity, ownership, or target boundary is unresolved;
98
102
  - PRD/SRS/ADR/WBS/test-plan records contradict one another;
@@ -106,6 +110,8 @@ Stop and route back to the relevant planning authority if any of the following a
106
110
 
107
111
  A task may be marked `in-progress` only when approved execution actually starts. Do not edit progress merely to reserve a task.
108
112
 
113
+ Once the selected increment is ready and explicitly approved, execute its coherent implementation and verification steps without adding another preparation/review cycle by default. Any proposed planning return must identify the new fact, material authority question or concrete blocker it resolves and a finite exit condition; restating accepted direction is not sufficient. Batch related unresolved decisions rather than serializing each into another micro-plan. Preserve all mandatory reviews and safety/authorization gates; no round quota forces implementation.
114
+
109
115
  ## Step 6: Route the approved increment
110
116
 
111
117
  After confirmation, route the smallest coherent implementation unit:
@@ -71,7 +71,9 @@ Before implementation, verify:
71
71
  - tenant, identity, authorization, ownership, privacy, lifecycle, transaction, concurrency, idempotency, audit, and recovery constraints are defined for the task’s risk;
72
72
  - the requested change does not broaden scope or create a competing persistence, identity, or API authority.
73
73
 
74
- When authority records conflict, stop. Update the authoritative PRD, SRS, or ADR through `cabloy-spec-generation`, then propagate the change through WBS, ATP, evidence assumptions, and progress. Do not reconcile a conflict by silently editing a downstream status or implementation plan.
74
+ Apply readiness to the selected increment and its real dependency graph. Record each blocker with its affected branch, decision owner and finite closure condition in existing records; keep future refinements and release-only questions separate. Do not require the new implementation's runtime ATP evidence before implementation starts, but retain required predecessor evidence and any specifically mandated pre-implementation qualification. When blocked, surface one meaningful, independently verifiable alternative if available, without executing it unapproved or changing formal dependencies/status to bypass the blocker. A foundation-only subincrement needs concrete integration value, checks and explicit scope approval; it does not complete the parent WBS.
75
+
76
+ When authority records conflict, stop the affected work. Update the authoritative PRD, SRS, or ADR through `cabloy-spec-generation`, then propagate the change through WBS, ATP, evidence assumptions, and progress. Do not reconcile a conflict by silently editing a downstream status or implementation plan. A return to planning must name the new fact, material authority question or blocker to resolve and its exit condition; do not restart a preparation/review cycle merely to restate accepted direction. Batch related decisions and report stalled convergence if further refinement has no justified new value.
75
77
 
76
78
  ## 4. Special gates
77
79
 
@@ -123,7 +125,7 @@ Excluded operations: <init/reset/deploy/provider/etc.>
123
125
  Next action: <one action after confirmation>
124
126
  ```
125
127
 
126
- Require explicit confirmation. If the user changes scope, rebuild the dossier and re-check dependencies and authority. A prior confirmation does not authorize a new task, phase, provider operation, or destructive command.
128
+ Require explicit confirmation unless this same bounded dossier already has valid explicit approval. Reuse unchanged approval across skill handoffs, session continuations and implementation substeps after checking current revision/worktree attribution and evidence applicability. Revision change alone requires an impact check, not automatic reapproval. Refresh affected dossier parts and obtain renewed approval for material scope/authority/dependency/safety changes, newly observed risks or conditions specified by the approval. A prior confirmation does not authorize a new task, phase, provider operation, or destructive command. Once ready and approved, proceed with the coherent implementation/verification sequence rather than requesting the same permission or another planning round by default.
127
129
 
128
130
  ## 6. Specialist routing
129
131
 
@@ -69,6 +69,16 @@ Ask only for missing inputs in a compact clarification pass:
69
69
 
70
70
  Label recommendations as proposals. A request for comprehensiveness is not permission to invent security or business decisions.
71
71
 
72
+ ### Planning convergence
73
+
74
+ For the next bounded increment, keep a finite blocker/exit checklist in the existing owning records, not a new planning hierarchy. Name each material unresolved decision, why it blocks this increment, its decision owner and closure condition; separate deferrable details and future increments. Batch related decisions into a compact review rather than mechanically splitting preparation, review and reconfirmation into separate rounds.
75
+
76
+ Before proposing more planning, identify the blocker or material uncertainty it addresses, the new fact or decision value expected, and the exit condition or resulting implementation handoff. If another pass merely restates accepted direction or leaves the same blockers without a justified new approach, report the stalled convergence and recommend a concrete decision, bounded feasibility check or scope disposition instead of another micro-plan. Do not impose a fixed round limit or weaken security requirements to force code.
77
+
78
+ Apply blockers only along actual dependencies, not to the whole suite by default. Surface one meaningful, independently verifiable implementation candidate on an unaffected branch when available; do not invent one or use empty scaffolding/document counts as progress. A foundation-only increment must have explicit integration value and its own checks, and must not be reported as completion of its parent feature. If none is ready, state the exact reason.
79
+
80
+ Stop refining when the selected increment's material contracts, dependencies, scope, safety constraints and verification plan are sufficient. Request only missing execution approval, or hand off within existing explicit approval whose scope and conditions remain valid. Reopen settled decisions only for a material change or newly observed risk. Generation/design approval alone still does not authorize implementation; runtime ATP proof and release approval remain later gates, not proof that must already exist for the new implementation to start.
81
+
72
82
  ## 6. Confirm generation scope
73
83
 
74
84
  Before writing, present the edition/root, mode, identity/path, intended ownership, outcomes/scope, site strategy/target tuple classification, affected records, justified omissions/extensions, unresolved gates, and initial status/evidence policy. Include planned chart eligibility and README language.
@@ -73,6 +73,18 @@ Before source work begins, an **execution dossier** makes the unit explicit: tar
73
73
 
74
74
  This structure lets a team pause, review, or transfer work without treating an unfinished implementation as verified. See [Execute an Approved Cabloy Specification Increment](/ai/playbook-spec-execution) for the readiness gates, routing rules, evidence protocol, and handoff format.
75
75
 
76
+ ## Converge planning into implementation
77
+
78
+ Planning should resolve the material blockers of the next bounded increment, not specify every future detail before any code is written. Keep a finite blocker/exit checklist in the existing owning records: the unresolved decision, why it blocks this increment, its decision owner, and the condition that closes it. Separate deferrable details and later increments; batch related decisions instead of turning each clarification into another preparation and review cycle.
79
+
80
+ Before adding a planning pass, explain which blocker or material uncertainty it addresses, what new fact or decision value it should provide, and how it ends. If the next pass only restates an accepted direction without a justified new approach to the remaining blockers, report stalled convergence and recommend a concrete decision, bounded feasibility check, or scope disposition. A larger document or another review is not delivery progress by itself.
81
+
82
+ Blockers follow actual dependencies, not the whole suite by default. A blocked identity integration does not necessarily block an independent capability whose own contracts, dependencies, safety boundary, and verification plan are ready. Conversely, a frontend change that depends on an unresolved response contract cannot bypass that dependency by calling itself an independent increment. Surface a meaningful, independently verifiable candidate for approval when available; if none exists, state why. Foundation-only work is useful only when it has explicit integration value and checks, not merely an empty scaffold presented as feature completion.
83
+
84
+ Planning is sufficient for an increment when its material contracts, dependencies, scope, safety constraints, and verification plan are settled. At that point, request any missing execution approval or proceed within valid existing approval. Reuse an unchanged approved dossier after checking current revision, worktree attribution, and evidence applicability; a skill handoff, resumed session, or ordinary implementation substep is not a reason to request the same permission again. Material changes, newly observed risks, and the approval's own conditions can require renewed approval; prior approval never covers unrelated tasks or unapproved external/destructive operations.
85
+
86
+ This is not a fixed limit on planning rounds or a relaxation of security requirements. Preserve mandatory reviews, predecessor proof, and any specifically required pre-implementation qualification. The new implementation's runtime ATP proof normally follows implementation; it must not become an impossible prerequisite to writing that implementation. Evidence and release gates still control later verification and release claims. A genuine new risk can reopen planning, but the return should name the affected blocker and its exit condition rather than restart open-ended refinement.
87
+
76
88
  ## Contract Loop is complementary
77
89
 
78
90
  [Contract Loop](/fullstack/contract-loop-playbook) is Cabloy's bidirectional Vona↔Zova synchronization model. It determines where fullstack contract truth lives, which generated handoff must be refreshed, and how to recover from forward-chain, reverse-chain, consumer, or local-dependency drift.
@@ -173,6 +173,8 @@ This is valuable because shared baseline data becomes part of the structured ver
173
173
 
174
174
  Vona invokes `seed()` while the application starts in test mode (`npm run test` or managed E2E), and during an explicit `npm run db:reset` in dev mode. In **Cabloy Basic and Cabloy Start**, ordinary `npm run dev` and `npm run dev:one` only reuse existing managed disposable databases and never seed; a missing required database makes startup fail with an instruction to run `npm run db:reset`. Framework upgrades do not reset existing development data or repeat its seeds. Use `seed()` for durable baseline fixtures shared by tests or for freshly prepared local development data. Seeding follows instance initialization on a newly created or recreated disposable database; `seed()` is not a repeatable, same-database data-import mechanism. See [Managed development database preparation](#managed-development-database-preparation) for the explicit reset lifecycle.
175
175
 
176
+ In **Cabloy Basic and Cabloy Start**, automatic `seed()` execution is limited to the default instance (`''`). These records are convenience fixtures for test/dev use, not required business initialization data. Reset still migrates and initializes configured isolated targets such as `isolateTest`, but does not seed them: they can exercise multi-instance behavior without shared test fixtures. Use `init()` for initialization required by each instance.
177
+
176
178
  Treat shared `seed()` records as read-only in ordinary tests. A scenario that needs different state must create independent, test-owned data and clean it up in `finally`; it must not mutate or delete the shared baseline. `seed()` remains distinct from `init()`: use `init()` for instance-aware initialization data and reserve `seed()` for baseline data in test runs or explicit development resets.
177
179
 
178
180
  ## Version changes across the generated backend thread
@@ -217,7 +219,9 @@ When `database.testDatabase: true` enables framework-managed disposable dev data
217
219
  1. **Check every required target:** both shared and statically configured isolate database targets must exist. If any required target is missing, startup fails promptly with an instruction to run `npm run db:reset`; it does not create the target, perform creation-time Redis cleanup, or seed as a fallback.
218
220
  2. **Reuse existing databases:** keep their data without database creation, creation-time Redis cleanup, or module seeding. Ordinary startup is not a fixture refresh, an implicit reset, or recovery for a partial reset. Non-disposable databases are outside this managed reset path.
219
221
 
220
- An explicit `npm run db:reset` owns preparation in a single process. It requires `database.testDatabase: true` and a connection outside the disposable database. It clears validated application-owned Redis state with `clearAllData()`, drops and recreates the managed disposable dev databases, runs migrations and instance initialization, then invokes the owning modules' `seed()` hooks.
222
+ An explicit `npm run db:reset` owns preparation in a single process. It requires `database.testDatabase: true` and a connection outside the disposable database. It clears validated application-owned Redis state with `clearAllData()`, drops and recreates the managed disposable dev databases, and runs migrations. It then completes each instance's non-after startups and initialization in sequence. Only the default instance runs the owning modules' `seed()` hooks, after its initialization and before consuming its creation bookkeeping and setting its readiness flag; isolated instances initialize and become ready without seeding.
223
+
224
+ Reset skips all instance and application startups with `after: true`: schedule loading, runtime JSON generation, development tips, queue-worker preloading, and HTTP listening are runtime-server work, not reset prerequisites. Put required data preparation in migrations, `init()`, `seed()`, or non-after startups. Normal dev startup still runs after-startups; independent framework lifecycle hooks and reset's application teardown remain intact. See [Backend Startup Guide](/backend/startup-guide#app-startup-and-instance-startup-in-practice) for the phase boundary.
221
225
 
222
226
  **Stop the development server and any other processes using the same database and Redis namespace first.** There is no file-based preparation lock; concurrent dev/dev and dev/reset against the same database and Redis namespace are unsupported. The reset command disables its own listener, but that does not protect a concurrently running server or queue worker. Never reset development data you need to keep.
223
227
 
@@ -232,7 +232,7 @@ In the current runtime behavior:
232
232
  - in `test` and `dev`, the default instance is started eagerly
233
233
  - in production-style flows, configured static instances are started from `config.instance.instances`
234
234
 
235
- A practical timeline is:
235
+ For ordinary startup without newly created development databases, a practical timeline is:
236
236
 
237
237
  1. run non-instance startups with `after !== true` during app start
238
238
  2. run non-instance startups with `after === true` during app ready
@@ -241,6 +241,21 @@ A practical timeline is:
241
241
  5. mark `appReadyInstances[instanceName] = true`
242
242
  6. run instance startups with `after === true`
243
243
 
244
+ Explicit development preparation through `npm run db:reset` is a data-preparation flow in **Cabloy Basic and Cabloy Start**. It retains non-instance startups with `after !== true`, including database migration and database-name preparation, then completes the default instance and each newly created isolated instance:
245
+
246
+ 1. run the instance's startups with `after !== true`, including instance initialization
247
+ 2. for the newly created default instance (`''`) only, run module `seed()` hooks for test/dev convenience fixtures
248
+ 3. consume the instance's creation bookkeeping and mark it ready
249
+ 4. repeat for the next instance, without seeding isolated targets such as `isolateTest`
250
+
251
+ Reset skips all instance and non-instance startups with `after === true` before dispatch. This excludes schedule loading, runtime JSON generation, development tips, queue-worker preloading, and HTTP listening, including their startup execution logs. Normal dev startup retains these runtime tasks and generates runtime JSON when the server starts. Skipping queue-worker preloading does not disable queues: an explicit queue push can still create a worker lazily, and fire-and-forget jobs are not automatically drained by reset.
252
+
253
+ Reset-required preparation must belong to migrations, `init()`, `seed()`, or a non-after startup; do not depend on an after-startup for required data. This phase filter does not bypass independent framework monkey hooks such as `appStarted`, or application teardown.
254
+
255
+ Each instance completes preparation in one queued startup task. Ordinary queued readiness requests skip reinitialization once the instance is ready, even though its after-startups were skipped. A failed default seed leaves its creation marker unconsumed and its readiness unset. There is no all-instances atomic readiness guarantee: if a later instance fails, an earlier instance may already be ready; the failure still stops preparation. Outside reset, explicitly forced startup requests retain their force behavior through instance after-startups.
256
+
257
+ Test-mode default seeding retains its existing lifecycle after default instance startup. Ordinary dev startup reuses existing databases without seeding. See [Managed development database preparation](/backend/migration-and-changes#managed-development-database-preparation) for reset safety and seed ownership.
258
+
244
259
  This is why startup should be read together with the instance and datasource story rather than as a purely global boot topic.
245
260
 
246
261
  ## Teardown-oriented monkey examples
@@ -214,11 +214,11 @@ The current source confirms:
214
214
 
215
215
  That means the details action family is scene-aware in a different way from `tableActionBulk`.
216
216
 
217
- A practical current example from backend DTO metadata is:
217
+ A practical details example from backend DTO metadata is:
218
218
 
219
219
  ```tsx
220
220
  ZovaRender.detailsActionBulk('basic-details:actionCreate', {
221
- permission: { formScene: ['create', 'edit'] },
221
+ permission: { mode: 'formScene', formScene: ['create', 'edit'] },
222
222
  });
223
223
  ```
224
224
 
@@ -226,15 +226,17 @@ and:
226
226
 
227
227
  ```tsx
228
228
  ZovaRender.detailsActionRow('basic-details:actionDelete', {
229
- permission: { formScene: ['create', 'edit'] },
229
+ permission: { mode: 'formScene', formScene: ['create', 'edit'] },
230
230
  });
231
231
  ```
232
232
 
233
+ For default detail CRUD actions, `permission.mode: 'formScene'` makes the intent explicit: the enclosing form scene controls visibility and no independent action permission check is performed. Custom detail actions should use `permission.mode: 'action'`; an explicit `actionInherit` also takes the action-checking path. If `mode` is omitted, the runtime uses the conservative action-checking path rather than inferring behavior from the action name.
234
+
233
235
  So the correct distinction is:
234
236
 
235
237
  - `tableActionBulk` does not currently support `formScene`
236
- - `detailsActionBulk` does support `formScene`
237
- - `detailsActionRow` also supports `formScene`
238
+ - `detailsActionBulk` supports `formScene` and the detail-specific `mode`
239
+ - `detailsActionRow` supports `formScene` and the detail-specific `mode`
238
240
 
239
241
  ## 7. Why bulk actions are different today
240
242
 
@@ -166,7 +166,9 @@ With `database.testDatabase: true`, `npm run dev` and `npm run dev:one` only reu
166
166
  - **All required databases exist:** startup reuses them without database creation, creation-time Redis cleanup, or module seeding. Ordinary startup is not a reset or a repeatable fixture-import path.
167
167
  - **Any required database is missing:** startup fails promptly with an instruction to run `npm run db:reset`. This check covers both shared and statically configured isolate database targets; the presence of the shared database alone is not sufficient. Startup does not create the missing target or clear Redis or seed as a fallback.
168
168
 
169
- `npm run db:reset` is the explicit, destructive preparation command. It requires `database.testDatabase: true` and a connection outside the disposable database. In a single process, it clears validated application-owned Redis state with `clearAllData()`, drops and recreates the managed disposable dev databases, then runs migrations, instance initialization, and module `seed()` hooks.
169
+ `npm run db:reset` is the explicit, destructive preparation command. It requires `database.testDatabase: true` and a connection outside the disposable database. In a single process, it clears validated application-owned Redis state with `clearAllData()`, drops and recreates the managed disposable dev databases, then runs migrations and instance initialization. In both editions, only the default instance (`''`) runs module `seed()` hooks, supplying test/dev convenience fixtures before consuming its creation bookkeeping and marking it ready. Configured isolated targets such as `isolateTest` initialize and become ready without fixture seeding. Each instance completes preparation in sequence.
170
+
171
+ Reset retains non-after startups and skips all instance and application startups with `after: true`, including schedules, runtime JSON generation, development tips, queue-worker preloading, and HTTP listening. Required data preparation must not depend on after-startups. Normal dev startup retains these runtime tasks; independent framework lifecycle hooks and application teardown still run during reset. See [Backend Startup Guide](/backend/startup-guide#app-startup-and-instance-startup-in-practice).
170
172
 
171
173
  **Stop the development server and any other processes using the same database and Redis namespace before running reset.** There is no file-based preparation lock: concurrent dev/dev and dev/reset processes against the same database and Redis namespace are unsupported. Disabling the reset command's own listener does not make reset safe alongside a live server or queue worker. Do not reset data you need to retain.
172
174
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli",
3
- "version": "1.1.162",
3
+ "version": "1.1.163",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli",
6
6
  "keywords": [
@@ -19,7 +19,7 @@ export interface IDtoOptions<%=cli.helper.firstCharToUpperCase(argv.detailDtoRes
19
19
  actions: [
20
20
  ZovaRender.detailsActionBulk('<%=argv.detailsModuleName%>:actionCreate', {
21
21
  dialogOptions: { title: $locale('Add<%=argv.detailDialogTitleCapitalize%>') },
22
- permission: { formScene: ['create', 'edit'] },
22
+ permission: { mode: 'formScene', formScene: ['create', 'edit'] },
23
23
  }),
24
24
  ],
25
25
  }),
@@ -48,10 +48,10 @@ export class Dto<%=cli.helper.firstCharToUpperCase(argv.detailDtoResItemName)%>
48
48
  actions: [
49
49
  ZovaRender.detailsActionRow('<%=argv.detailsModuleName%>:actionUpdate', {
50
50
  dialogOptions: { title: $locale('Edit<%=argv.detailDialogTitleCapitalize%>') },
51
- permission: { formScene: ['create', 'edit'] },
51
+ permission: { mode: 'formScene', formScene: ['create', 'edit'] },
52
52
  }),
53
53
  ZovaRender.detailsActionRow('<%=argv.detailsModuleName%>:actionDelete', {
54
- permission: { formScene: ['create', 'edit'] },
54
+ permission: { mode: 'formScene', formScene: ['create', 'edit'] },
55
55
  }),
56
56
  ],
57
57
  }),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-cli-set-api",
3
- "version": "1.1.160",
3
+ "version": "1.1.161",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "vona cli-set-api",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona",
3
- "version": "5.1.108",
3
+ "version": "5.1.109",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "Vona is an intuitive, elegant and powerful Node.js framework for rapidly developing enterprise applications of any size",
6
6
  "keywords": [