cabloy 5.1.194 → 5.1.196

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 (91) hide show
  1. package/.cabloy-version +1 -1
  2. package/.github/workflows/agent-governance.yml +1 -0
  3. package/CHANGELOG.md +22 -0
  4. package/README.md +13 -24
  5. package/package.json +2 -1
  6. package/repo-agent-governance/managed-assets.json +138 -33
  7. package/repo-agent-governance/scripts/pack-check.mjs +17 -0
  8. package/repo-agent-governance/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
  9. package/repo-agent-governance/skills/cabloy-domain-planning/SKILL.md +5 -3
  10. package/repo-agent-governance/skills/cabloy-spec-execution/SKILL.md +13 -8
  11. package/repo-agent-governance/skills/cabloy-spec-execution/evals/evals.json +108 -12
  12. package/repo-agent-governance/skills/cabloy-spec-execution/evals/files/scenarios.json +84 -0
  13. package/repo-agent-governance/skills/cabloy-spec-execution/evals/protocol.md +9 -0
  14. package/repo-agent-governance/skills/cabloy-spec-execution/references/execution-protocol.md +21 -5
  15. package/repo-agent-governance/skills/cabloy-spec-execution/references/status-and-evidence.md +5 -3
  16. package/repo-agent-governance/skills/cabloy-spec-generation/SKILL.md +78 -168
  17. package/repo-agent-governance/skills/cabloy-spec-generation/evals/evals.json +165 -17
  18. package/repo-agent-governance/skills/cabloy-spec-generation/evals/files/scenarios.json +114 -0
  19. package/repo-agent-governance/skills/cabloy-spec-generation/evals/protocol.md +44 -0
  20. package/repo-agent-governance/skills/cabloy-spec-generation/references/canonical-spec-input.md +145 -0
  21. package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-aware-discovery.md +55 -57
  22. package/repo-agent-governance/skills/cabloy-spec-generation/references/repo-specs-document-set.md +6 -4
  23. package/repo-agent-governance/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +12 -8
  24. package/repo-agent-governance/tests/governance.test.mjs +10 -1
  25. package/repo-agent-governance/tests/spec-audit.test.mjs +255 -0
  26. package/repo-agent-governance/tools/spec-audit/audit.mjs +427 -0
  27. package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.mjs +97 -408
  28. package/repo-agent-governance/tools/spec-charts/generate-implementation-charts.test.mjs +462 -1
  29. package/repo-agent-governance/tools/spec-charts/spec-parser.mjs +561 -0
  30. package/repo-docs/.vitepress/config.mjs +54 -29
  31. package/repo-docs/ai/playbook-spec-execution.md +10 -4
  32. package/repo-docs/ai/playbook-spec-generation.md +40 -3
  33. package/repo-docs/ai/skills.md +3 -3
  34. package/repo-docs/backend/controller-aop-guide.md +10 -0
  35. package/repo-docs/backend/field-indexes.md +25 -0
  36. package/repo-docs/blogs/cabloy-fullstack-resource-addressing/index.md +1 -1
  37. package/repo-docs/fullstack/contract-loop-playbook.md +1 -1
  38. package/repo-docs/fullstack/development-history.md +24 -0
  39. package/repo-docs/fullstack/introduction.md +25 -156
  40. package/repo-docs/fullstack/quickstart.md +1 -1
  41. package/repo-docs/fullstack/ssr-entry-modes.md +52 -0
  42. package/repo-docs/fullstack/ssr-site-and-flavor-setup.md +3 -1
  43. package/repo-docs/fullstack/tutorial-5-backend-contract-sharing.md +13 -7
  44. package/repo-docs/fullstack/tutorial-6-one-contract-four-uses.md +11 -15
  45. package/repo-docs/fullstack/tutorials-overview.md +2 -2
  46. package/repo-docs/index.md +23 -45
  47. package/repo-docs/public/cabloy.png +0 -0
  48. package/repo-docs/public/cabloy.svg +3 -0
  49. package/repo-docs/public/favicon.svg +3 -0
  50. package/repo-docs/reference/repo-scripts.md +6 -1
  51. package/repo-e2e/specs/home-user-account.spec.ts +311 -207
  52. package/scripts/bootstrapAgentGovernance.mjs +1 -0
  53. package/scripts/upgrade.ts +1 -0
  54. package/vona/packages-cli/cli/package.json +1 -1
  55. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudBasic/snippets/2-meta.index.ts +4 -10
  56. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/2-meta.index.ts +4 -10
  57. package/vona/packages-cli/cli-set-api/package.json +8 -2
  58. package/vona/packages-cli/cli-set-api/src/index.ts +1 -0
  59. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.masterDetail.ts +9 -12
  60. package/vona/packages-cli/cli-set-api/src/lib/mergeMetaIndex.ts +121 -0
  61. package/vona/packages-cli/cli-set-api/test/indexSnippets.test.ts +41 -0
  62. package/vona/packages-cli/cli-set-api/test/mergeMetaIndex.test.ts +78 -0
  63. package/vona/packages-vona/vona/package.json +1 -1
  64. package/vona/pnpm-lock.yaml +6 -6
  65. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +25 -4
  66. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuUniqueness.test.ts +161 -0
  67. package/vona/src/suite/a-commerce/modules/commerce-payment/src/bean/meta.index.ts +21 -20
  68. package/vona/src/suite/a-commerce/modules/commerce-payment/test/paymentIndexes.test.ts +165 -0
  69. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/bean/meta.index.ts +16 -13
  70. package/vona/src/suite/a-commerce/modules/commerce-promotion/test/promotionIndexes.test.ts +82 -0
  71. package/vona/src/suite/a-commerce/modules/commerce-trade/src/bean/meta.index.ts +23 -21
  72. package/vona/src/suite/a-commerce/modules/commerce-trade/test/tradeIndexes.test.ts +86 -0
  73. package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +379 -376
  74. package/vona/src/suite/a-home/modules/home-user/src/controller/passportTest.ts +60 -0
  75. package/vona/src/suite/a-home/modules/home-user/test/passportTest.test.ts +164 -1
  76. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +1 -1
  77. package/vona/src/suite-vendor/a-cabloy/package.json +2 -2
  78. package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  79. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/bean/meta.index.ts +35 -26
  80. package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  81. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  82. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  83. package/vona/src/suite-vendor/a-pay/package.json +5 -5
  84. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  85. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +6 -2
  86. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +4 -1
  87. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
  88. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/lib/columns.ts +3 -1
  89. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  90. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  91. /package/repo-docs/{.vitepress/public → public}/CNAME +0 -0
@@ -69,6 +69,7 @@ const fullstackGroups = [
69
69
  text: 'Fullstack / Getting Started',
70
70
  items: [
71
71
  { text: 'Introduction', link: '/fullstack/introduction' },
72
+ { text: 'Development History', link: '/fullstack/development-history' },
72
73
  { text: 'Quickstart', link: '/fullstack/quickstart' },
73
74
  { text: 'Suites and Modules', link: '/fullstack/suites-and-modules' },
74
75
  ],
@@ -98,7 +99,7 @@ const fullstackGroups = [
98
99
  link: '/fullstack/tutorial-5-backend-contract-sharing',
99
100
  },
100
101
  {
101
- text: 'Tutorial 6: One Contract Surface, Four Uses',
102
+ text: 'Tutorial 6: One Contract Model, Four Uses',
102
103
  link: '/fullstack/tutorial-6-one-contract-four-uses',
103
104
  },
104
105
  ],
@@ -115,7 +116,7 @@ const fullstackGroups = [
115
116
  ],
116
117
  },
117
118
  {
118
- text: 'Architecture & Integration',
119
+ text: 'Architecture & Editions',
119
120
  items: [
120
121
  {
121
122
  text: 'Comparison with Other Frameworks',
@@ -123,18 +124,27 @@ const fullstackGroups = [
123
124
  },
124
125
  { text: 'Framework Performance', link: '/fullstack/framework-performance' },
125
126
  { text: 'Vona + Zova Integration', link: '/fullstack/vona-zova-integration' },
126
- { text: 'SSR Site and Flavor Setup', link: '/fullstack/ssr-site-and-flavor-setup' },
127
- { text: 'A-Pay Payment Suite', link: '/fullstack/a-pay-payment-suite' },
128
127
  {
129
- text: 'Payment Provider Sandbox Configuration',
130
- link: '/fullstack/payment-sandbox-configuration',
128
+ text: 'Edition Collaboration Differences',
129
+ link: '/fullstack/edition-collaboration-differences',
131
130
  },
131
+ ],
132
+ },
133
+ {
134
+ text: 'Contracts & Integration',
135
+ items: [
132
136
  { text: 'Contract Loop Playbook', link: '/fullstack/contract-loop-playbook' },
133
137
  { text: 'Semantic Presentation Contract', link: '/fullstack/semantic-presentation-contract' },
138
+ { text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
134
139
  {
135
- text: 'Admin Resource and Web Self-Service',
136
- link: '/fullstack/admin-resource-and-web-self-service',
140
+ text: 'Frontend Metadata Back to Backend',
141
+ link: '/fullstack/frontend-metadata-to-backend',
137
142
  },
143
+ ],
144
+ },
145
+ {
146
+ text: 'Metadata-Driven UI',
147
+ items: [
138
148
  {
139
149
  text: 'Backend Metadata to Frontend Table Actions',
140
150
  link: '/fullstack/backend-metadata-to-frontend-table-actions',
@@ -151,20 +161,32 @@ const fullstackGroups = [
151
161
  text: 'Backend Metadata to Frontend Table Actions Source Reading Map',
152
162
  link: '/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map',
153
163
  },
154
- { text: 'Fullstack Image Workflow', link: '/fullstack/image-workflow' },
155
- { text: 'Fullstack File Workflow', link: '/fullstack/file-workflow' },
156
- { text: 'Backend OpenAPI to Frontend SDK', link: '/fullstack/openapi-to-sdk' },
164
+ ],
165
+ },
166
+ {
167
+ text: 'Resource & SSR Patterns',
168
+ items: [
169
+ { text: 'Vona Integrated SSR vs Zova Standalone SSR', link: '/fullstack/ssr-entry-modes' },
170
+ { text: 'SSR Site and Flavor Setup', link: '/fullstack/ssr-site-and-flavor-setup' },
157
171
  {
158
- text: 'Frontend Metadata Back to Backend',
159
- link: '/fullstack/frontend-metadata-to-backend',
172
+ text: 'Admin Resource and Web Self-Service',
173
+ link: '/fullstack/admin-resource-and-web-self-service',
160
174
  },
161
175
  {
162
176
  text: 'One-to-One Companion Resource',
163
177
  link: '/fullstack/one-to-one-companion-resource-guide',
164
178
  },
179
+ ],
180
+ },
181
+ {
182
+ text: 'Media & Payments',
183
+ items: [
184
+ { text: 'Fullstack Image Workflow', link: '/fullstack/image-workflow' },
185
+ { text: 'Fullstack File Workflow', link: '/fullstack/file-workflow' },
186
+ { text: 'A-Pay Payment Suite', link: '/fullstack/a-pay-payment-suite' },
165
187
  {
166
- text: 'Edition Collaboration Differences',
167
- link: '/fullstack/edition-collaboration-differences',
188
+ text: 'Payment Provider Sandbox Configuration',
189
+ link: '/fullstack/payment-sandbox-configuration',
168
190
  },
169
191
  ],
170
192
  },
@@ -194,22 +216,22 @@ const referenceGroups = [
194
216
  const GA_MEASUREMENT_ID = 'G-2NYR9RGRL4'; // process.env.GA_MEASUREMENT_ID;
195
217
  const gaHead = GA_MEASUREMENT_ID
196
218
  ? [
197
- [
198
- 'script',
199
- {
200
- async: '',
201
- src: `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`,
202
- },
203
- ],
204
- [
205
- 'script',
206
- {},
207
- `window.dataLayer = window.dataLayer || [];
219
+ [
220
+ 'script',
221
+ {
222
+ async: '',
223
+ src: `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`,
224
+ },
225
+ ],
226
+ [
227
+ 'script',
228
+ {},
229
+ `window.dataLayer = window.dataLayer || [];
208
230
  function gtag(){dataLayer.push(arguments);}
209
231
  gtag('js', new Date());
210
232
  gtag('config', '${GA_MEASUREMENT_ID}');`,
211
- ],
212
- ]
233
+ ],
234
+ ]
213
235
  : [];
214
236
 
215
237
  export default defineConfig({
@@ -218,7 +240,10 @@ export default defineConfig({
218
240
  lang: 'en-US',
219
241
  base: '/',
220
242
  ignoreDeadLinks: [/^https?:\/\/localhost/],
221
- head: gaHead,
243
+ head: [
244
+ ['link', { rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' }],
245
+ ...gaHead,
246
+ ],
222
247
  transformPageData(pageData) {
223
248
  if (!/^blogs\/[^/]+\/index\.md$/.test(pageData.relativePath)) return;
224
249
 
@@ -33,7 +33,7 @@ Use [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation) instea
33
33
 
34
34
  ## Establish the execution boundary first
35
35
 
36
- Start by inspecting the active repository, edition marker, current revision, and working-tree state. Then build an execution dossier for the selected increment.
36
+ Inspect the active root, current revision, working tree, and edition markers. Exactly one marker selects Basic or Start; both mean stop as invalid/ambiguous. If neither marker is present, inspect the owning package/structure and ask before edition-sensitive execution. Then build the selected increment's dossier.
37
37
 
38
38
  The dossier identifies:
39
39
 
@@ -46,7 +46,11 @@ The dossier identifies:
46
46
  - approved verification procedures, expected redacted evidence, and allowed record updates
47
47
  - blockers, unresolved `TODO(confirm)` items, excluded unsafe operations, and one next action
48
48
 
49
- Require explicit approval of the dossier before source changes, meaningful verification, evidence/status updates, or specialist execution. Do not reserve a task by marking it `in-progress` before approved work actually starts.
49
+ Require explicit dossier approval before source changes, meaningful verification, evidence/status updates, or specialist execution. Generation approval, concrete design/ADR acceptance, and execution approval are separate. Do not reserve a task by marking it `in-progress` before approved work starts.
50
+
51
+ Classify targets as **observed existing**, **proposed new**, or **explicitly approved new**, as in [spec generation](/ai/playbook-spec-generation#existing-facts-and-new-designs). An approved new site/flavor tuple may be created before its future source exists if framework constraints and collisions were checked, you explicitly approved the concrete design, and its governing ADR is `Accepted`. Cite accepted design authority and planned paths/manifests in the dossier. Shared integration still requires an observed owner. Controlling TODOs, unaccepted ADRs, and blocked gates remain blockers; absence of future source alone is not one.
52
+
53
+ A new wrapper is a planned addition: create it within approved scope, inspect its durable manifest and paired SSR/REST outputs, then run it. Do not treat the proposed command as already runnable.
50
54
 
51
55
  ## Read authority before implementation
52
56
 
@@ -58,7 +62,9 @@ Read the suite records in this order:
58
62
  4. linked ATP procedures and release gates in `test-plan.md`
59
63
  5. `progress.md` for derived status, blockers, waivers, evidence pointers, and next proof
60
64
  6. linked evidence, runbooks, presentation records, or rollout records when they apply
61
- 7. `implementation-gantt.svg` and `implementation-burndown.svg` as derived views to check for freshness, not authority
65
+ 7. applicable implementation charts, checking freshness only with complete supported inputs; report incomplete lightweight/legacy inputs rather than forcing new business declarations
66
+
67
+ Keep planning authority audit (`npm run spec:check -- <suite>`, with `--lightweight` only for agreed limited scope), chart model/freshness, and human approval/evidence as three separate gates. Compatible catalogue tables can define legacy ATPs in their owning role; matrices and evidence cannot. A static pass does not clear a controlling TODO, accept an ADR, or prove ATP execution.
62
68
 
63
69
  When records conflict, return to [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation) before implementation. Do not resolve an authority contradiction through an execution note, a chart edit, or a source workaround.
64
70
 
@@ -111,7 +117,7 @@ A successful build, generation command, hook, manual walkthrough, screenshot, or
111
117
 
112
118
  ## Refresh derived charts last
113
119
 
114
- After evidence and progress are accurate, refresh the two derived views when the suite's authoritative Markdown follows the [chart input contract](/reference/repo-scripts#chart-input-contract). Refresh again when the suite README title or language changes:
120
+ After evidence and progress are accurate, refresh both derived views only when complete supported README/WBS/ATP/progress inputs follow the [chart input contract](/reference/repo-scripts#chart-input-contract). Refresh again when README title/language changes. If legacy/lightweight inputs are incomplete, report the precise omission and route necessary authority repair through planning; never invent business definitions to force chart generation. Find progress rows by `WBS ID` and `Status` headers, not fixed column positions.
115
121
 
116
122
  ```bash
117
123
  npm run spec:charts -- <suite>
@@ -31,7 +31,7 @@ Use a different path when the task is already an approved bounded WBS increment,
31
31
  ## What happens after you invoke it
32
32
 
33
33
  1. **AI checks the current repository.** It detects the active Cabloy edition, reads the relevant repository guidance and existing suite records, and distinguishes observed source facts from your confirmed decisions, proposals, and unresolved items.
34
- 2. **AI identifies the planning scope.** It distinguishes a new suite, an update to an existing specification set, and a deliberately smaller planning request. Cabloy Basic and Cabloy Start share the planning model, but their runtime details can differ, so the active source remains authoritative for edition-specific facts.
34
+ 2. **AI identifies the planning scope.** It chooses a complete new baseline, incremental maintenance of an existing set, or explicitly approved lightweight planning. An existing directory is normally the update destination, not a conflict or reset request. Basic and Start share the model, but runtime details come from the active edition. Both edition markers mean stop; if neither marker is present, inspect the owning package/structure and ask before edition-sensitive planning.
35
35
  3. **AI asks focused questions.** You provide only the decisions that are needed to make the plan coherent. AI can recommend a boundary, but it identifies a recommendation as a proposal rather than treating it as confirmed input.
36
36
  4. **AI presents a confirmation summary.** The summary states what will be created or changed, what remains unresolved, and which decisions or WBS branches remain gated.
37
37
  5. **You approve or revise the summary.** No specification file is generated, replaced, or treated as approved merely because a question was asked or left unanswered. A confirmation to generate records also does not accept a durable ADR; a decision remains proposed until it is explicitly accepted.
@@ -48,7 +48,19 @@ The initial business description can be short. During the conversation, AI may a
48
48
  - delivery, release, and verification expectations
49
49
  - unresolved durable decisions, the WBS branches they block, justified optional records, and the initial delivery status
50
50
 
51
- This is a design confirmation, not a request to invent implementation details prematurely. When a fact must come from the active repository, AI verifies it rather than carrying assumptions across editions.
51
+ AI asks only for missing decisions. If the existing strategy still governs, it does not repeat a Web/Admin four-way choice; a single unresolved audience gets a focused question. Unresolved naming takes a naming-only detour through `cabloy-domain-planning`, then returns here without scaffolding.
52
+
53
+ ## Existing facts and new designs
54
+
55
+ Targets have three distinct states:
56
+
57
+ - **Observed existing**: source/configuration was inspected and cited. Shared-site integration requires an observed owner.
58
+ - **Proposed new**: a deliberately new design, not a claim that source already exists.
59
+ - **Explicitly approved new**: the concrete tuple passed framework-constraint and collision checks, you explicitly approved the design, and its governing ADR is `Accepted`.
60
+
61
+ For a new independent SSR site, validate site ID, public path, flavor, configuration ownership, site module/registration, copied bundle, generated REST package, and paired SSR/REST commands together. The target need not exist before approval: a bounded execution task may create an explicitly approved new tuple after its own dossier approval. Unknown or unchecked values remain `TODO(confirm)`; they block only dependent work. A new wrapper is a **planned addition**, not a current command to run. See [Independent SSR Site and Flavor Setup](/fullstack/ssr-site-and-flavor-setup).
62
+
63
+ Keep approval domains separate: approval to generate records does not accept a durable ADR or authorize source execution. Site-strategy selection approves only that input; design/ADR acceptance and bounded execution approval remain explicit.
52
64
 
53
65
  ## What gets generated or updated
54
66
 
@@ -77,7 +89,7 @@ repo-specs/<suite>/
77
89
  | `test-plan.md` | Acceptance procedures, expected proof, and release gates |
78
90
  | `progress.md` and charts | Derived delivery status and planning views, not upstream authority |
79
91
 
80
- AI adds presentation contracts, staged rollout records, runbooks, extra ADRs, or an `evidence/` directory only when the confirmed scope justifies them. It does not create empty evidence records to make testing or delivery appear to have started.
92
+ Charts are generated only after complete supported README/WBS/ATP/progress inputs exist. A deliberately lightweight set agrees on selected records and omissions instead of forcing a complete baseline or charts. AI adds presentation contracts, rollout records, runbooks, extra ADRs, or evidence only when justified; it never creates empty evidence to imply execution.
81
93
 
82
94
  For an existing suite, the workflow updates the owning upstream authority before dependent records. It preserves existing identifiers, accepted decisions, history, and evidence conventions rather than silently overwriting them or creating a parallel planning set.
83
95
 
@@ -105,6 +117,31 @@ A product or technical change belongs in its PRD, SRS, or accepted ADR before it
105
117
 
106
118
  Planning records and derived charts do not establish `implementation-complete` or `verified`. `verified` requires the applicable acceptance procedure and retained, redacted observed evidence. A generated plan, planned command, scaffold, screenshot, or unrelated check is not automatically sufficient proof.
107
119
 
120
+ ## Check planning without claiming implementation
121
+
122
+ Use three independent gates:
123
+
124
+ 1. **Planning authority audit** checks formal definitions, exact references, declared PRD → SRS → WBS → ATP associations, and local links:
125
+
126
+ ```bash
127
+ npm run spec:check -- <suite>
128
+ # Only for explicitly limited planning scope:
129
+ npm run spec:check -- <suite> --lightweight
130
+ ```
131
+
132
+ Lightweight mode reports omitted owners/chain coverage; it does not permit dangling references. If progress is present, its WBS owner is still needed.
133
+ 2. **Chart model/freshness** checks supported WBS/dependency/ATP/progress consistency and generated-view freshness, only with complete supported inputs:
134
+
135
+ ```bash
136
+ npm run spec:charts -- <suite>
137
+ npm run spec:charts:check -- <suite>
138
+ ```
139
+
140
+ Regenerate after WBS, test-plan, progress, or README title/language changes. With incomplete lightweight/legacy inputs, report the precise chart gap; do not invent business definitions or status to make a generator pass.
141
+ 3. **Human approval/evidence review** retains ADR acceptance, controlling TODOs, bounded execution approval, and observed ATP proof as separate requirements. Neither static check approves a design or establishes `verified`.
142
+
143
+ New specs use atomic `- **PRD-...**: <body>` / `- **SRS-...**: <body>` declarations, phase/task WBS headings with explicit Dependencies, Traceability, Tasks, and Acceptance checks, and `### ATP-...: <title>` scenarios under `## Acceptance Scenario Catalogue` with Setup, Procedure, Expected result, Minimum proof, and Traceability. Resolve progress columns by `WBS ID` and `Status` headers rather than fixed positions. Compatible legacy catalogue tables remain supported; matrices and evidence are not definitions. Report legacy gaps without silently rewriting business meaning. See [Repo Scripts](/reference/repo-scripts) for the active deterministic command contracts.
144
+
108
145
  ## What happens next
109
146
 
110
147
  After the specification set is coherent and one bounded WBS increment is approved, execute that increment in Claude Code:
@@ -51,9 +51,9 @@ For edition-aware skills, use [Cabloy Editions: For AI Development](/editions/ov
51
51
  The repository currently authors these cross-stack and monorepo-wide workflows in `repo-agent-governance/skills/` and renders them to root platform adapters; Codex and Cursor discovery remains subject to external client validation:
52
52
 
53
53
  - `cabloy-workflow` for choosing the correct Cabloy work path before implementation
54
- - `cabloy-domain-planning` for proposing and confirming providerId, suite, and initial module names before scaffolding a new business domain
55
- - `cabloy-spec-generation` for creating or maintaining suite-local planning authority, traceability, and derived planning views before implementation; see [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation)
56
- - `cabloy-spec-execution` for coordinating one confirmed WBS increment through specialist implementation, evidence, and derived progress updates; see [Execute an Approved Cabloy Specification Increment](/ai/playbook-spec-execution)
54
+ - `cabloy-domain-planning` for confirming providerId, suite, and capability names; a naming-only detour from specification generation returns there without scaffolding
55
+ - `cabloy-spec-generation` for complete new baselines, incremental maintenance, or explicitly lightweight planning; it separates generation approval, design/ADR acceptance, and bounded execution approval, audits authority, and refreshes charts only with complete supported inputs; see [Generate a Cabloy Suite Specification](/ai/playbook-spec-generation)
56
+ - `cabloy-spec-execution` for one explicitly approved WBS increment, including creation of an approved new target whose future source does not exist yet; it preserves controlling gates, specialist implementation, retained evidence, and conditional derived-view updates; see [Execute an Approved Cabloy Specification Increment](/ai/playbook-spec-execution)
57
57
  - `cabloy-contract-loop` for backend/frontend contract regeneration and drift diagnosis; see [Contract Loop Playbook](/fullstack/contract-loop-playbook)
58
58
  - `cabloy-resource-field-update` for updating an existing backend resource field thread; see [Existing Resource Field Update](/backend/resource-field-update)
59
59
  - `cabloy-module-removal` for removing a backend, frontend, or fullstack module cleanly, including generated-runtime cleanup, stale-residue recovery, and verification; see [Module Removal](/ai/playbook-module-removal)
@@ -115,6 +115,16 @@ These shorthands still map back to the generic aspect model.
115
115
 
116
116
  The global Passport guard is the baseline for controller actions: without a local Passport decorator, an action requires an authenticated and activated user. It is not public.
117
117
 
118
+ `@Passport.activated(...)` changes the activation requirement for an authenticated user:
119
+
120
+ | Value | Requirement | Typical use |
121
+ | --- | --- | --- |
122
+ | `true` | The user must be activated; this is the default. | Ordinary protected actions. |
123
+ | `false` | The user must **not** be activated. This does not mean “skip the check.” | An account-activation action. |
124
+ | `'noCheck'` | Do not check activation state; both activated and unactivated users can proceed. | Logout, including for an unactivated account. |
125
+
126
+ All three values still require authentication by default. An unauthenticated request is rejected; use `@Passport.public()` only if anonymous access is intended. A disabled account is still rejected regardless of the activation setting. The guard returns `403` when an authenticated user fails the account-status or activation check.
127
+
118
128
  Use a local Passport or domain guard when an action needs a policy beyond that baseline:
119
129
 
120
130
  - use `@Passport.public()` only when anonymous access is intentional
@@ -60,6 +60,29 @@ class MetaIndex {}
60
60
 
61
61
  This is especially valuable for maintainability because it reduces stringly-typed drift.
62
62
 
63
+ ### Multiple indexes on one table
64
+
65
+ Declare each table only once in an `indexes` object, whether using direct properties or `$tableColumns`. The helper returns one property keyed by the table name; spreading multiple calls for the same table overwrites earlier values rather than combining them. Put all specifications for that table in one array:
66
+
67
+ ```typescript
68
+ @Meta({
69
+ indexes: {
70
+ ...$tableColumns('payPaymentSession', [
71
+ 'businessReference',
72
+ 'providerCorrelationReference',
73
+ 'state+expiresAt',
74
+ ]),
75
+ },
76
+ })
77
+ class MetaIndex {}
78
+ ```
79
+
80
+ Each array entry defines a separate index. In this example, the first two entries are independent single-column indexes; `state+expiresAt` defines one composite index, with `state` as its leading column. An array such as `['state', 'expiresAt']` would instead define two single-column indexes. The typed helper accepts arrays containing both single-column fields and two-column `+` specifications.
81
+
82
+ ### Generated names and verification
83
+
84
+ The current index reconciler names an index `idx_<table>_<first-column>` and checks existing indexes by that leading column. Two intended indexes with the same leading column, such as `state+expiresAt` and `state+nextAttemptAt`, can therefore collide or leave one uncreated. Do not change column order merely to avoid a naming collision: order is part of the query access pattern. Inspect the resulting definitions, not just whether initialization succeeded.
85
+
63
86
  ## App-config override support
64
87
 
65
88
  Field indexes can also be configured through app config.
@@ -84,6 +107,8 @@ Also ask:
84
107
  2. should the index belong in `meta.index`?
85
108
  3. does a business key need tenant-scoped uniqueness, to be enforced in tenant-aware business logic rather than with `table.unique(...)`?
86
109
  4. is the typed style a better fit than raw string declarations?
110
+ 5. does each table have one effective declaration containing every intended index specification, without conflicting leading columns?
111
+ 6. do the resulting database indexes have the intended columns in the intended order? Check both registered metadata and physical index definitions; a passing type check or successful initialization alone does not establish this.
87
112
 
88
113
  That leads to backend changes that are more production-aware and more aligned with Vona’s module metadata model.
89
114
 
@@ -187,7 +187,7 @@ If this field needs specialized controls instead of the default Renderer, it can
187
187
 
188
188
  That does not mean each field automatically grows a complete UI, nor that every presentation decision belongs in the backend. It means the field’s business meaning, data contract, and permitted exposure do not have to be copied into backend DTOs, frontend request types, form rules, table columns, and response post-processing—and then manually kept aligned.
189
189
 
190
- In this **forward contract chain**, backend Controllers, DTOs, Entities, and validation rules are the source of truth. Vona generates OpenAPI; Zova then generates or consumes SDK/Schema contract material. When a backend contract changes, the recommended path is to propagate that truth forward rather than hand-edit multiple frontend copies. [Backend OpenAPI to Frontend SDK](https://cabloy.com/fullstack/openapi-to-sdk) and [One Contract Surface, Four Uses](https://cabloy.com/fullstack/tutorial-6-one-contract-four-uses) describe the boundary of that chain.
190
+ In this **forward contract chain**, backend Controllers, DTOs, Entities, and validation rules are the source of truth. Vona generates OpenAPI; Zova then generates or consumes SDK/Schema contract material. When a backend contract changes, the recommended path is to propagate that truth forward rather than hand-edit multiple frontend copies. [Backend OpenAPI to Frontend SDK](https://cabloy.com/fullstack/openapi-to-sdk) and [One Contract Model, Four Uses](https://cabloy.com/fullstack/tutorial-6-one-contract-four-uses) describe the boundary of that chain.
191
191
 
192
192
  ## Coordinate five: routes choose a UI scene; Resource identities choose business context
193
193
 
@@ -358,7 +358,7 @@ Use the tutorial series as examples of the two chains:
358
358
  - [Tutorial 3: Frontend Metadata Sharing](/fullstack/tutorial-3-frontend-metadata-sharing) — reverse chain, built-in metadata branch
359
359
  - [Tutorial 4: Custom Form/Table Renderers for Level](/fullstack/tutorial-4-custom-level-renderers) — reverse chain, custom resource handoff branch
360
360
  - [Tutorial 5: Backend Contract Sharing](/fullstack/tutorial-5-backend-contract-sharing) — forward chain, backend-emitted contract branch
361
- - [Tutorial 6: One Contract Surface, Four Uses](/fullstack/tutorial-6-one-contract-four-uses) — one field story spanning multiple contract surfaces
361
+ - [Tutorial 6: One Contract Model, Four Uses](/fullstack/tutorial-6-one-contract-four-uses) — two field examples spanning validation, OpenAPI, rendering, and serialization
362
362
 
363
363
  ## Related docs
364
364
 
@@ -0,0 +1,24 @@
1
+ # CabloyJS Development History
2
+
3
+ CabloyJS has evolved from a JavaScript-based Node.js fullstack framework into a TypeScript-based system built on Vona and Zova. Three milestones explain the transition.
4
+
5
+ ## 2016 onward: V1–V4
6
+
7
+ Development began in 2016. Across V1, V2, V3, and V4, CabloyJS refined its fullstack architecture and accumulated the conventions that led some developers to describe it as a “textbook-like framework.”
8
+
9
+ Feedback also pointed toward a new direction: TypeScript support and a clearer separation between frontend and backend development. These ideas shaped the next major redesign.
10
+
11
+ ## 2023: The V5 redesign
12
+
13
+ In 2023, work began on a redesigned V5 architecture. Rather than incrementally adapting the earlier JavaScript framework, the project adopted TypeScript and a frontend/backend separation model built around two frameworks:
14
+
15
+ - **ZovaJS** provides the frontend framework. Its programming model brings together Vue 3 reactivity, TSX authoring, and inversion of control (IoC).
16
+ - **VonaJS** provides the backend framework and fullstack integration. It connects backend contracts with frontend applications across SSR, SPA, Web, and Admin use cases.
17
+
18
+ The two layers remain connected through [bidirectional contract workflows](/fullstack/contract-loop-playbook), including backend OpenAPI contracts consumed by the frontend and frontend metadata consumed by backend tooling.
19
+
20
+ ## April 13, 2026: V5 release
21
+
22
+ ZovaJS V5 and VonaJS V5 were officially released on April 13, 2026. Built on these foundations, CabloyJS V5 continues the goal behind the “textbook-like framework” description: make fullstack architecture understandable, consistent, and productive in day-to-day development.
23
+
24
+ For the current architecture and edition-specific project baselines, continue with the [Fullstack Introduction](/fullstack/introduction) and [Editions Overview](/editions/overview).
@@ -1,178 +1,47 @@
1
1
  # Fullstack Introduction
2
2
 
3
- Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development for traceable, evidence-backed delivery.
4
-
5
- **One fullstack system for AI vibe coding—bidirectional type sync, CLI-first workflows, docs, skills, and traceable delivery from product intent to verifiable evidence.**
6
-
7
- Instead of stitching separate backend and frontend stacks together, Cabloy keeps their contracts, tooling, and guidance connected in one repository. Vona, Zova, and suite-based modules are the aligned architecture behind that workflow.
8
-
9
- ## What Cabloy emphasizes
10
-
11
- - **One fullstack system** — build backend and frontend together instead of assembling separate stacks
12
- - **Bidirectional type sync** — use the contract loop to keep backend contracts and frontend metadata aligned in both directions
13
- - **CLI-first workflows** — use explicit commands for scaffolding, generation, refactors, and verification
14
- - **Docs and skills** — give people and AI agents reusable, source-grounded guidance for the current repository
15
- - **AI Spec-Driven Development** — use Traceable Spec Delivery to connect product intent, contracts, bounded work, acceptance procedures, and verifiable evidence
16
- - **Vona + Zova** — use aligned backend and frontend layers for code sharing and cross-stack consistency
17
- - **Modular delivery** — organize capabilities as suites and modules, then deliver SSR, SPA, Web, and Admin applications with shared conventions
18
-
19
- ## How to approach fullstack work
20
-
21
- For contributor and automation workflows in this repository, prefer this order:
22
-
23
- 1. inspect the root `package.json` and shared monorepo scripts first
24
- 2. inspect `npm run vona`, `npm run zova`, and the shared fullstack CLI workflow before inventing custom steps
25
- 3. detect the active edition before making UI-sensitive or flavor-sensitive assumptions
26
- 4. explain shared cross-stack concepts once, then isolate edition-specific notes only where the editions intentionally diverge
27
-
28
- ## Fullstack reading paths
29
-
30
- Use this page as the main fullstack hub, then choose the path that matches your task.
31
-
32
- ### Getting started path
33
-
34
- Start here when you want the shortest route to a working monorepo mental model:
35
-
36
- - [Quickstart](/fullstack/quickstart)
37
- - [Suites and Modules](/fullstack/suites-and-modules)
38
- - [CLI](/fullstack/cli)
39
- - [VS Code Extensions](/fullstack/vscode-extensions)
40
-
41
- ### Architecture and integration path
42
-
43
- Use this path when the task is about how backend and frontend stay aligned inside one framework system:
44
-
45
- - [Comparison with Other Frameworks](/fullstack/comparison-with-other-frameworks)
46
- - [Framework Performance](/fullstack/framework-performance)
47
- - [Vona + Zova Integration](/fullstack/vona-zova-integration)
48
- - [Contract Loop Playbook](/fullstack/contract-loop-playbook)
49
- - [Semantic Presentation Contract](/fullstack/semantic-presentation-contract)
50
- - [Admin Resource and Web Self-Service](/fullstack/admin-resource-and-web-self-service)
51
- - [Backend Metadata to Frontend Table Actions](/fullstack/backend-metadata-to-frontend-table-actions)
52
- - [Fullstack Image Workflow](/fullstack/image-workflow)
53
- - [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk)
54
- - [Frontend Metadata Back to Backend](/fullstack/frontend-metadata-to-backend)
55
-
56
- ### Edition-aware collaboration path
57
-
58
- Use this path when the task depends on edition boundaries, UI assumptions, or cross-repo delivery differences:
59
-
60
- - [Edition Collaboration Differences](/fullstack/edition-collaboration-differences)
61
- - [Cabloy Editions](/editions/overview#choosing-an-edition)
3
+ Cabloy is a Node.js fullstack framework for AI vibe coding, with AI Spec-Driven Development guiding work from confirmed specs to verifiable delivery.
62
4
 
63
5
  ## Shared architecture
64
6
 
65
- Cabloy coordinates its backend and frontend layers as one fullstack system:
66
-
67
- - **Vona** provides the backend framework and runtime capabilities.
68
- - **Zova** provides the frontend framework and application capabilities.
69
- - Root scripts, shared terminology, and CLI-first workflows keep the layers aligned within each edition repository.
70
-
71
- Cabloy Basic and Cabloy Start are related, complete edition baselines built on this shared architecture, not alternatives to the Vona and Zova layers. They intentionally compose UI, flavors, modules, SSR sites, and project assets differently. See [Editions Overview](/editions/overview) for the complete relationship and edition differences.
72
-
73
- This combination keeps backend and frontend development close enough for code sharing, workflow reuse, and AI vibe coding workflows.
74
-
75
- ## Traceable delivery and contract synchronization
76
-
77
- [AI Spec-Driven Development](/ai/ai-spec-driven-development) governs how confirmed product intent becomes contracts, bounded WBS work, acceptance procedures, and evidence-backed status. Its precise engineering method is Traceable Spec Delivery.
78
-
79
- The [Contract Loop](/fullstack/contract-loop-playbook) is complementary rather than interchangeable: it synchronizes Vona↔Zova contract sources, generated handoffs, and consumers when an approved increment crosses the fullstack contract boundary. A completed synchronization does not establish product authority or close ATP evidence.
80
-
81
- When an approved scene needs schema-driven presentation, use the [Semantic Presentation Contract](/fullstack/semantic-presentation-contract) to translate audience, task, scene, and DTO boundaries into renderer decisions without changing security or ownership authority.
82
-
83
- ## Cabloy fullstack framework principles
84
-
85
- Cabloy’s fullstack model can be understood through two core principles.
86
-
87
- ### 1. Frontend build output participates directly in backend SSR
88
-
89
- Zova owns the frontend application, but its build output is not treated as a completely separate artifact that the backend ignores.
90
-
91
- In Cabloy’s fullstack flow:
92
-
93
- - the frontend is built from Zova source
94
- - the generated bundle and related SSR output are consumed by the Vona-side SSR runtime
95
- - backend rendering and frontend hydration stay in one coordinated SSR path rather than two unrelated systems
96
-
97
- In earlier standalone-repo explanations, this was often described as placing the frontend bundle into the backend for direct SSR rendering. In the current monorepo, the important principle stays the same while the workflow is cleaner: shared scripts and integrated repository structure let frontend build artifacts flow into the backend-side SSR process.
98
-
99
- For the integration workflow and current monorepo shape, see [Vona + Zova Integration](/fullstack/vona-zova-integration) and [SSR Overview](/frontend/ssr-overview).
100
-
101
- ### 2. Bidirectional type sync through the contract loop
102
-
103
- Cabloy does not treat type sharing as backend-to-frontend only. The collaboration loop provides bidirectional type sync:
104
-
105
- - **Backend → Frontend**: Vona emits Swagger/OpenAPI contracts that Zova uses to generate frontend SDKs and related schema-aware helpers
106
- - **Frontend → Backend**: Zova generates structural metadata and types such as routes, components, and icons, which can be reflected back into backend-side tooling and type hints
107
-
108
- This two-way contract loop reduces duplicate declarations and lets backend and frontend evolve from generated source truth instead of hand-maintained memory.
109
-
110
- Start with the canonical [Contract Loop Playbook](/fullstack/contract-loop-playbook), then use the directional deep dives [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk) and [Frontend Metadata Back to Backend](/fullstack/frontend-metadata-to-backend).
111
-
112
- Use the playbook to distinguish four cases clearly:
113
-
114
- - forward chain
115
- - reverse chain
116
- - consumer drift
117
- - local dependency drift
118
-
119
- The contract-loop model is shared across Cabloy Basic and Cabloy Start. Detect the edition to choose concrete flavor commands and generated-output paths, not to redefine the workflow model.
120
-
121
- When the reverse direction involves newly added frontend resources that backend tooling or backend metadata will consume, treat that as an operational handoff rather than a conceptual one: refresh generated frontend output, run the relevant flavor build, then run `npm run deps:vona`, and if the generated `.zova-rest` artifacts already contain the expected changes but Vona still sees stale shared types, rebuild `vona/node_modules` and reinstall dependencies.
122
-
123
- ## How the fullstack system stays connected
124
-
125
- At the repository level, shared scripts, shared terminology, and CLI-first workflows keep Vona and Zova aligned as one framework system.
7
+ Vona provides the backend framework and runtime. Zova provides the frontend framework and application layer. Suites and modules organize capabilities across Admin, Web, SSR, and SPA applications. Root scripts and CLI workflows connect these layers within each edition repository.
126
8
 
127
- For the shared terminal-first workflow model, see [Fullstack CLI](/fullstack/cli).
9
+ Cabloy Basic and Cabloy Start are complete, separate project baselines built on this architecture. They share the Vona + Zova engineering model but can differ in UI layer, frontend flavors, modules, SSR sites, and project assets. See [Editions Overview](/editions/overview) before choosing edition-specific commands or UI conventions.
128
10
 
129
- ## Why the monorepo matters
11
+ ## How Vona and Zova connect
130
12
 
131
- The monorepo makes it possible to keep backend and frontend concepts, tooling, and generated outputs aligned from source rather than memory, for example:
13
+ ### Vona integrated SSR
132
14
 
133
- - how frontend routes and components are reflected back into backend type hints
134
- - how backend OpenAPI and DTO output feeds frontend SDK generation
135
- - how common concepts can be documented once before edition-specific notes branch out
136
- - how Vona and Zova CLI capabilities can be reused instead of rebuilding scaffolding by hand
15
+ Zova builds the frontend application and SSR artifacts. In Vona integrated SSR, Vona consumes those artifacts to render the page, and the frontend hydrates it in the browser.
137
16
 
138
- ## Technology Stack
17
+ Zova standalone SSR is a separate development-server entry point for frontend work. Opening it directly does not verify the Vona integration path. See [Vona + Zova Integration](/fullstack/vona-zova-integration) and [SSR Overview](/frontend/ssr-overview) for the two layers in more detail.
139
18
 
140
- ### General
19
+ ### Bidirectional contract loop
141
20
 
142
- | Package | Version |
143
- | ---------- | -------- |
144
- | TypeScript | `^5.9.3` |
145
- | Zod | `^4.3.6` |
21
+ Type information moves in both directions, with a different source of truth on each side:
146
22
 
147
- ### Backend (Vona)
23
+ - **Backend to frontend:** Vona emits OpenAPI contracts that Zova uses to generate SDKs and schema-aware helpers.
24
+ - **Frontend to backend:** Zova generates metadata and types for routes, components, and icons that backend tooling and type hints can consume.
148
25
 
149
- | Package | Version |
150
- | -------------------------------- | --------- |
151
- | Koa | `^3.2.0` |
152
- | Knex | `^3.2.9` |
153
- | Redis Client (`ioredis`) | `^5.10.1` |
154
- | SQLite Driver (`better-sqlite3`) | `^12.9.0` |
26
+ The [Contract Loop Playbook](/fullstack/contract-loop-playbook) explains the generation, handoff, and verification steps for each direction, including recovery when generated output or local dependencies are stale.
155
27
 
156
- ### Frontend (Zova)
28
+ ## How spec-driven delivery fits
157
29
 
158
- | Package | Version |
159
- | -------------- | ----------- |
160
- | Vue | `^3.5.32` |
161
- | Vite | `^8.0.14` |
162
- | Quasar | `^2.19.3` |
163
- | TanStack Query | `^5.100.10` |
164
- | TanStack Form | `^1.32.0` |
165
- | TanStack Table | `^8.21.3` |
30
+ [AI Spec-Driven Development](/ai/ai-spec-driven-development) uses Traceable Spec Delivery to carry confirmed product intent into bounded work and verifiable evidence. The contract loop keeps Vona and Zova consumers aligned when that work changes a fullstack contract. Contract synchronization alone does not establish product approval or complete acceptance.
166
31
 
167
- ### Edition-specific UI Stack
32
+ For schema-driven UI decisions, the [Semantic Presentation Contract](/fullstack/semantic-presentation-contract) connects the approved audience and task to the appropriate renderer without changing security or ownership authority.
168
33
 
169
- - **Cabloy Basic**: DaisyUI + Tailwind CSS
170
- - **Cabloy Start**: Vuetify
34
+ ## Technology layers
171
35
 
172
- ## Edition impact
36
+ - **Backend:** Vona uses Koa, Knex, Redis, and database drivers.
37
+ - **Frontend:** Zova uses Vue, Vite, Quasar tooling, and TanStack libraries. Quasar is part of the engineering toolchain, not the edition UI component library.
38
+ - **Edition UI:** Cabloy Basic uses DaisyUI + Tailwind CSS; Cabloy Start uses Vuetify.
173
39
 
174
- Most framework concepts are shared across Cabloy Basic and Cabloy Start because both editions follow the same Cabloy fullstack core. The documentation prefers a common-first explanation, then adds edition-specific notes only where the editions intentionally diverge.
40
+ For exact versions, inspect `vona/package.json` and `zova/package.json` in the active edition checkout.
175
41
 
176
- Across editions, the frontend engineering layer stays mostly shared through Zova, Vue, Vite, Quasar tooling, and related libraries. The edition-specific UI layer then diverges between DaisyUI + Tailwind CSS for Cabloy Basic and Vuetify for Cabloy Start.
42
+ ## Continue reading
177
43
 
178
- Use the [Editions Overview](/editions/overview) page whenever a task depends on UI library assumptions, flavor names, module composition, SSR site baselines, distribution boundaries, or AI workflow guidance.
44
+ - **Explore the framework's origins:** [CabloyJS Development History](/fullstack/development-history).
45
+ - **Start a project:** [choose an edition](/editions/overview#choosing-an-edition), then follow the [Fullstack Quickstart](/fullstack/quickstart).
46
+ - **Build a feature:** use the [Fullstack Tutorials](/fullstack/tutorials-overview) and [Fullstack CLI](/fullstack/cli).
47
+ - **Work with AI agents:** start with the [AI Development Introduction](/ai/introduction) for repository guidance and skills.
@@ -107,7 +107,7 @@ The two commands start different SSR entry points. Choose the one that matches t
107
107
  | **Vona integrated SSR** | `7102` | Fullstack development, site access, and browser acceptance | Vona API handling, SSR site matching, built artifact handoff, and the integrated HTTP response path |
108
108
  | **Zova standalone SSR** | `9000` | Frontend development, hot reload, isolated debugging, and page/route/hydration iteration | Zova SSR rendering and frontend behavior without proving the Vona integration boundary |
109
109
 
110
- The Zova standalone SSR server can also be used as Vona's development proxy target. However, directly opening `9000` does not replace validation through Vona integrated SSR at `7102`. For acceptance or deployment-oriented checks, build the required SSR/REST artifacts, synchronize them with Vona, and access the site through Vona.
110
+ Directly opening `9000` does not replace validation through Vona at `7102`. For acceptance or deployment-oriented checks, build the required SSR/REST artifacts, synchronize them with Vona, and access the site through Vona. For the request flows and guidance on choosing an entry, see [Vona Integrated SSR and Zova Standalone SSR](/fullstack/ssr-entry-modes).
111
111
 
112
112
  ## 6. Run with Docker Compose
113
113