cabloy 5.1.150 → 5.1.152

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 (50) hide show
  1. package/.cabloy-version +1 -1
  2. package/.claude/commands/release.md +12 -1
  3. package/.claude/hooks/contract-loop-gate.ts +35 -17
  4. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +4 -3
  5. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
  6. package/.claude/skills/cabloy-contract-loop/SKILL.md +4 -3
  7. package/.claude/skills/cabloy-domain-planning/SKILL.md +4 -3
  8. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +4 -3
  9. package/.claude/skills/cabloy-master-detail/SKILL.md +4 -3
  10. package/.claude/skills/cabloy-module-removal/SKILL.md +5 -4
  11. package/.claude/skills/cabloy-resource-field-update/SKILL.md +8 -5
  12. package/.claude/skills/cabloy-spec-execution/SKILL.md +169 -0
  13. package/.claude/skills/cabloy-spec-execution/evals/evals.json +71 -0
  14. package/.claude/skills/cabloy-spec-execution/references/execution-protocol.md +137 -0
  15. package/.claude/skills/cabloy-spec-execution/references/status-and-evidence.md +117 -0
  16. package/.claude/skills/cabloy-spec-generation/SKILL.md +227 -0
  17. package/.claude/skills/cabloy-spec-generation/evals/evals.json +83 -0
  18. package/.claude/skills/cabloy-spec-generation/references/repo-aware-discovery.md +101 -0
  19. package/.claude/skills/cabloy-spec-generation/references/repo-specs-document-set.md +267 -0
  20. package/.claude/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +135 -0
  21. package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.mjs +350 -0
  22. package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.test.mjs +202 -0
  23. package/.claude/skills/cabloy-workflow/SKILL.md +21 -10
  24. package/.claude/skills/cabloy-workflow/evals/evals.json +8 -2
  25. package/.claude/skills/cabloy-workflow/references/edition-detection.md +5 -3
  26. package/.claude/skills/cabloy-zova-source-reading/SKILL.md +4 -3
  27. package/CHANGELOG.md +25 -0
  28. package/CLAUDE.md +12 -11
  29. package/package.json +4 -2
  30. package/repo-docs/.vitepress/config.mjs +4 -0
  31. package/repo-docs/ai/docs-skills-rules-mapping.md +6 -6
  32. package/repo-docs/ai/future-skill-roadmap.md +2 -2
  33. package/repo-docs/ai/introduction.md +5 -5
  34. package/repo-docs/ai/playbook-contract-regeneration.md +3 -9
  35. package/repo-docs/ai/repo-guidance.md +5 -4
  36. package/repo-docs/ai/rules-and-config.md +2 -2
  37. package/repo-docs/ai/virtual-decorator-guidance.md +1 -3
  38. package/repo-docs/backend/cache-guide.md +36 -0
  39. package/repo-docs/backend/introduction.md +1 -1
  40. package/repo-docs/backend/migration-and-changes.md +27 -2
  41. package/repo-docs/backend/model-guide.md +1 -1
  42. package/repo-docs/backend/resource-field-update.md +156 -0
  43. package/repo-docs/frontend/router-tabs-introduction.md +2 -4
  44. package/repo-docs/fullstack/a-pay-payment-suite.md +1 -1
  45. package/repo-docs/fullstack/contract-loop-playbook.md +4 -0
  46. package/repo-docs/fullstack/one-to-one-companion-resource-guide.md +1 -1
  47. package/repo-docs/reference/package-map.md +1 -1
  48. package/scripts/release.ts +48 -1
  49. package/scripts/upgrade.ts +18 -7
  50. package/zova/pnpm-lock.yaml +5 -5
package/.cabloy-version CHANGED
@@ -1 +1 @@
1
- 5.1.150
1
+ 5.1.152
@@ -6,7 +6,14 @@ version: 1.0.0
6
6
 
7
7
  # Cabloy Release
8
8
 
9
- Run the release workflow for the cabloy package. The release script at `scripts/release.ts` performs 4 steps:
9
+ This command applies only when the active checkout is unambiguously Cabloy Basic and its root `package.json` exposes the public `cabloy` release scripts. First inspect the repository-root edition markers and the active root script surface:
10
+
11
+ - only `__CABLOY_BASIC__` present and the required `release*` scripts available → continue with this workflow;
12
+ - only `__CABLOY_START__` present → stop: do not use this public release workflow or `scripts/release.ts`; use an explicitly configured Cabloy Start release workflow instead;
13
+ - both markers or neither marker present → stop before choosing an edition-specific release path;
14
+ - required Basic release scripts absent → stop and ask for the active release workflow rather than inferring one.
15
+
16
+ The release script at `scripts/release.ts` performs 4 steps for the public `cabloy` package:
10
17
 
11
18
  1. **Version bump** — Detects changes since last `cabloy@*` tag, bumps `package.json` version, commits + tags + pushes
12
19
  2. **AI Changelog** — Calls Anthropic API to summarize commits into categorized changelog, writes to `CHANGELOG.md`
@@ -15,6 +22,8 @@ Run the release workflow for the cabloy package. The release script at `scripts/
15
22
 
16
23
  ## Commands
17
24
 
25
+ Only after the Basic preflight above succeeds, use the matching script that exists in the active root `package.json`:
26
+
18
27
  | Command | Description |
19
28
  |---------|-------------|
20
29
  | `pnpm release-patch` | Full release with patch version bump |
@@ -26,6 +35,8 @@ Run the release workflow for the cabloy package. The release script at `scripts/
26
35
  | `pnpm release:publish` | Only publish to npm |
27
36
  | `pnpm release:github` | Only create GitHub release |
28
37
 
38
+ Do not infer equivalent commands in Cabloy Start when this table is absent from its package scripts.
39
+
29
40
  ## CLI Options
30
41
 
31
42
  | Option | Description |
@@ -42,6 +42,11 @@ type ReverseSyncOutcome =
42
42
 
43
43
  type SyncState = Record<string, SyncStateEntry>;
44
44
 
45
+ type EditionResolution =
46
+ | { kind: 'resolved'; edition: EditionConfig }
47
+ | { kind: 'ambiguous' }
48
+ | { kind: 'missing' };
49
+
45
50
  const SCRIPT_FILE = fileURLToPath(import.meta.url);
46
51
  const ROOT = path.resolve(path.dirname(SCRIPT_FILE), '../..');
47
52
  const ROOT_KEY = toPosixPath(ROOT);
@@ -102,7 +107,9 @@ const EDITION_CONFIGS: Record<'basic' | 'start', EditionConfig> = {
102
107
  },
103
108
  };
104
109
 
105
- const ACTIVE_EDITION = resolveEdition();
110
+ const ACTIVE_EDITION_RESOLUTION = resolveEdition();
111
+ const ACTIVE_EDITION =
112
+ ACTIVE_EDITION_RESOLUTION.kind === 'resolved' ? ACTIVE_EDITION_RESOLUTION.edition : null;
106
113
  const FALLBACK_REVERSE_VONA_CONTENT_MARKERS = [
107
114
  ...SHARED_REVERSE_VONA_CONTENT_MARKERS,
108
115
  ...EDITION_CONFIGS.basic.reverseVonaContentMarkers,
@@ -123,14 +130,12 @@ function normalizePath(value?: string): string | null {
123
130
  }
124
131
  }
125
132
 
126
- function resolveEdition(): EditionConfig | null {
127
- if (existsSync(path.resolve(ROOT, '__CABLOY_BASIC__'))) {
128
- return EDITION_CONFIGS.basic;
129
- }
130
- if (existsSync(path.resolve(ROOT, '__CABLOY_START__'))) {
131
- return EDITION_CONFIGS.start;
132
- }
133
- return null;
133
+ function resolveEdition(): EditionResolution {
134
+ const hasBasic = existsSync(path.resolve(ROOT, '__CABLOY_BASIC__'));
135
+ const hasStart = existsSync(path.resolve(ROOT, '__CABLOY_START__'));
136
+ if (hasBasic && hasStart) return { kind: 'ambiguous' };
137
+ if (!hasBasic && !hasStart) return { kind: 'missing' };
138
+ return { kind: 'resolved', edition: hasBasic ? EDITION_CONFIGS.basic : EDITION_CONFIGS.start };
134
139
  }
135
140
 
136
141
  function getReverseVonaContentMarkers(edition: EditionConfig | null): readonly string[] {
@@ -290,7 +295,11 @@ function autoSyncReverse(filePath: string, edition: EditionConfig): ReverseSyncO
290
295
 
291
296
  function buildReverseGuidance(edition: EditionConfig | null): string {
292
297
  if (!edition) {
293
- return 'If backend tooling or backend metadata will consume this handoff, refresh generated metadata when applicable, resolve the active Cabloy edition marker before choosing the relevant Zova build and generated-output path, and then run `npm run deps:vona`.';
298
+ const resolutionMessage =
299
+ ACTIVE_EDITION_RESOLUTION.kind === 'ambiguous'
300
+ ? 'Both Cabloy edition markers are present, so stop before choosing an edition-specific build or generated-output path.'
301
+ : 'No Cabloy edition marker is present, so inspect the active package scripts and repository shape before choosing an edition-specific build or generated-output path.';
302
+ return `If backend tooling or backend metadata will consume this handoff, refresh generated metadata when applicable. ${resolutionMessage} Then run \`npm run deps:vona\` once the active edition is resolved.`;
294
303
  }
295
304
 
296
305
  const autoSyncCommands = edition.reverseAutoSyncCommands
@@ -319,18 +328,21 @@ function resolveReverseSyncOutcome(
319
328
  };
320
329
  }
321
330
 
322
- if (shouldSkipAutoSync(filePath)) {
331
+ if (!edition) {
332
+ const reason =
333
+ ACTIVE_EDITION_RESOLUTION.kind === 'ambiguous'
334
+ ? 'both Cabloy edition markers are present'
335
+ : 'no Cabloy edition marker is present';
323
336
  return {
324
- kind: 'skipped',
325
- message: 'Auto-sync skipped because the same reverse-source edit was already synced recently in this repo.',
337
+ kind: 'not-applicable',
338
+ message: `Auto-sync did not run because ${reason}.`,
326
339
  };
327
340
  }
328
341
 
329
- if (!edition) {
342
+ if (shouldSkipAutoSync(filePath)) {
330
343
  return {
331
- kind: 'not-applicable',
332
- message:
333
- 'Auto-sync did not run because the active Cabloy edition marker could not be resolved for this repo.',
344
+ kind: 'skipped',
345
+ message: 'Auto-sync skipped because the same reverse-source edit was already synced recently in this repo.',
334
346
  };
335
347
  }
336
348
 
@@ -344,6 +356,12 @@ function buildMessages(
344
356
  ): string {
345
357
  const messages = ["Contract-loop gate: this change may affect Cabloy's bidirectional contract loop."];
346
358
 
359
+ if (ACTIVE_EDITION_RESOLUTION.kind === 'ambiguous') {
360
+ messages.push(
361
+ 'Both Cabloy edition markers are present, so stop before choosing an edition-specific build, generated-output path, or auto-sync action.',
362
+ );
363
+ }
364
+
347
365
  if (result.forwardReason) {
348
366
  messages.push(
349
367
  `Forward chain: ${result.forwardReason} If backend contract truth changed, verify the emitted OpenAPI/contract output and regenerate the frontend consumer path before considering the task done.`,
@@ -25,9 +25,10 @@ Check the repository root for these marker files:
25
25
 
26
26
  Interpretation:
27
27
 
28
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
29
- - `__CABLOY_START__` present → this is Cabloy Start
30
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
28
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
29
+ - only `__CABLOY_START__` present → this is Cabloy Start
30
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
31
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
31
32
 
32
33
  Then classify the request:
33
34
 
@@ -50,7 +50,7 @@ When the active edition and installed modules provide `@Passport.rbac(...)` and
50
50
  - keep the dependency graph acyclic and free of duplicate edges; do not declare both forms for the same edge because propagation is transitive and current runtime collection does not deduplicate targets
51
51
  - when `modelsClearedByFn` is required, treat it as replacement behavior and explicitly own the target clear and any necessary downstream propagation
52
52
  - prefer normal Model/service mutation paths so source invalidation, commit-time re-clear, and configured double-delete remain active
53
- - add a warm-query → mutate-source → repeat-query regression test for each new dependency path; read [Vona Cross-Model Query-Cache Dependencies](../../../../repo-docs-internal/architecture/vona-cross-model-query-cache-dependencies.md) for the source-backed decision rules
53
+ - add a warm-query → mutate-source → repeat-query regression test for each new dependency path; follow [Cross-model query-cache dependencies](../../../../repo-docs/backend/cache-guide.md#cross-model-query-cache-dependencies) for the portable decision rules
54
54
  - transaction behavior
55
55
 
56
56
  ## Test resource lifecycle follow-up
@@ -53,9 +53,10 @@ Check the repository root for these marker files:
53
53
 
54
54
  Interpretation:
55
55
 
56
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
57
- - `__CABLOY_START__` present → this is Cabloy Start
58
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
56
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
57
+ - only `__CABLOY_START__` present → this is Cabloy Start
58
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
59
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
59
60
 
60
61
  Then classify whether the task is really a contract-loop task.
61
62
 
@@ -26,9 +26,10 @@ Check the repository root for these marker files:
26
26
 
27
27
  Interpretation:
28
28
 
29
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
30
- - `__CABLOY_START__` present → this is Cabloy Start
31
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
29
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
30
+ - only `__CABLOY_START__` present → this is Cabloy Start
31
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
32
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
32
33
 
33
34
  This matters most when examples, frontend flavors, or suite/module availability may differ between editions.
34
35
 
@@ -25,9 +25,10 @@ Check the repository root for these marker files:
25
25
 
26
26
  Interpretation:
27
27
 
28
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
29
- - `__CABLOY_START__` present → this is Cabloy Start
30
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
28
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
29
+ - only `__CABLOY_START__` present → this is Cabloy Start
30
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
31
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
31
32
 
32
33
  Then classify the request:
33
34
 
@@ -27,9 +27,10 @@ Check the repository root for these marker files:
27
27
 
28
28
  Interpretation:
29
29
 
30
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
31
- - `__CABLOY_START__` present → this is Cabloy Start
32
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
30
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
31
+ - only `__CABLOY_START__` present → this is Cabloy Start
32
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
33
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
33
34
 
34
35
  Then classify the request into one of these entry shapes.
35
36
 
@@ -26,9 +26,10 @@ Check the repository root for these marker files:
26
26
 
27
27
  Interpretation:
28
28
 
29
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
30
- - `__CABLOY_START__` present → this is Cabloy Start
31
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
29
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
30
+ - only `__CABLOY_START__` present → this is Cabloy Start
31
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
32
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
32
33
 
33
34
  Then classify the request into one of three branches:
34
35
 
@@ -128,7 +129,7 @@ Ask or confirm whether the task is:
128
129
  - code/runtime removal only
129
130
  - code/runtime removal plus docs/examples scrub
130
131
 
131
- If docs cleanup is in scope, update `repo-docs/` separately from the runtime cleanup and keep maintainer rationale in `repo-docs-internal/`.
132
+ If docs cleanup is in scope, update `repo-docs/` separately from the runtime cleanup. When an established `repo-docs-internal/` home exists, keep maintainer rationale there; otherwise do not create or require that path as part of module removal.
132
133
 
133
134
  ## Response pattern
134
135
 
@@ -36,9 +36,10 @@ Check the repository root for these marker files:
36
36
 
37
37
  Interpretation:
38
38
 
39
- - `__CABLOY_BASIC__` present → this is Cabloy Basic
40
- - `__CABLOY_START__` present → this is Cabloy Start
41
- - neither present → inspect nearby scripts and ask before making edition-specific assumptions
39
+ - only `__CABLOY_BASIC__` present → this is Cabloy Basic
40
+ - only `__CABLOY_START__` present → this is Cabloy Start
41
+ - both markers present → treat the repository as ambiguous or invalid and stop before making edition-specific assumptions
42
+ - neither marker present → inspect the owning package scripts and nearby repository structure, then ask before making an edition-specific assumption
42
43
 
43
44
  Then confirm the request is about an **existing** resource field.
44
45
 
@@ -211,10 +212,12 @@ In Cabloy Basic, prefer `placeholder` over artificial empty-item injection when
211
212
 
212
213
  If the user explicitly wants to **demonstrate** the custom renderer workflow, branch into a frontend follow-up path.
213
214
 
214
- Use these references:
215
+ Use these portable references:
215
216
 
216
217
  - `references/custom-renderer-demo-checklist.md`
217
- - `repo-docs-internal/architecture/backend-resource-field-workflow.md`
218
+ - [Existing Resource Field Update](../../../repo-docs/backend/resource-field-update.md)
219
+
220
+ When an active repository provides `repo-docs-internal/architecture/backend-resource-field-workflow.md`, it may be consulted as optional maintainer rationale. Its absence must not block or alter this shared workflow.
218
221
 
219
222
  Recommended shape:
220
223
 
@@ -0,0 +1,169 @@
1
+ ---
2
+ name: cabloy-spec-execution
3
+ description: Use this skill whenever the user asks to implement, execute, deliver, verify, or close a task from an existing Cabloy suite specification, including requests such as “implement WBS-…”, “execute the approved phase”, “deliver the next spec task”, or “make the repo-specs plan real”. It coordinates one bounded WBS increment through the existing backend, frontend, and contract-loop skills, then records evidence-backed derived status. Require an explicit WBS task ID or a finite, explicitly approved phase; do not use it to invent requirements, resolve suite identity, replace cabloy-spec-generation, duplicate scaffold procedures, or perform unapproved destructive, deployment, or provider operations.
4
+ ---
5
+
6
+ # Cabloy Spec Execution
7
+
8
+ Use this skill as the control plane for delivering an already-approved suite specification. It turns one bounded WBS item into an implementation, verification, evidence, and progress handoff without becoming a second product authority.
9
+
10
+ ## Goals
11
+
12
+ 1. detect the active Cabloy edition and repository state before making implementation or command assumptions;
13
+ 2. select only an explicit, bounded, dependency-ready WBS increment;
14
+ 3. preserve PRD, SRS, ADR, WBS, and test-plan authority while routing technical work to the existing specialist skills;
15
+ 4. require scoped verification and durable redacted evidence before claiming `verified`;
16
+ 5. leave a resumable status and next-proof handoff without silently advancing neighboring work.
17
+
18
+ Read these references before executing or substantially updating an increment:
19
+
20
+ - `references/execution-protocol.md` for discovery, dossier, gates, routing, and safe-operation boundaries;
21
+ - `references/status-and-evidence.md` for evidence retention, status transitions, supersession, and progress updates.
22
+
23
+ ## Step 1: Detect repository and edition
24
+
25
+ From the active repository root, inspect:
26
+
27
+ 1. `git rev-parse --show-toplevel`, `git status --short`, current `HEAD`, and the working-tree classification;
28
+ 2. `__CABLOY_BASIC__` or `__CABLOY_START__`;
29
+ 3. root `package.json` and `CLAUDE.md`;
30
+ 4. the target `repo-specs/<suite>/` directory and relevant source/module topology.
31
+
32
+ Interpret the markers as follows:
33
+
34
+ - `__CABLOY_BASIC__` present: use Basic source, scripts, flavors, UI, and SSR facts only when observed;
35
+ - `__CABLOY_START__` present: resolve Start-specific scripts, flavor/site names, paths, UI, and SSR behavior from the active Start repository;
36
+ - neither present: stop before edition-specific execution and ask the user to confirm the repository context.
37
+
38
+ A PostToolUse hook or an automatic build is convenience assistance, not evidence that the task is synchronized or verified. The deterministic chart commands are `npm run spec:charts -- <suite>` and `npm run spec:charts:check -- <suite>`; they validate derived-view freshness, not implementation or ATP completion.
39
+
40
+ ## Step 2: Require and classify the execution target
41
+
42
+ Require one of:
43
+
44
+ - an explicit WBS task identifier such as `WBS-ABC-20-01`;
45
+ - a finite phase whose included WBS tasks and closure boundary are explicitly named and approved.
46
+
47
+ Do not interpret “implement the suite”, “finish everything”, or “execute the next phase” as a sufficiently bounded target. Ask for the exact task or enumerate a finite candidate set and obtain approval before implementation.
48
+
49
+ Classify the target:
50
+
51
+ - **backend increment**: Vona module, bean, service, model, entity, DTO, validation, migration, or backend test;
52
+ - **frontend increment**: Zova page, component, route, model, metadata, SSR, or frontend test;
53
+ - **contract increment**: OpenAPI, DTO consumer, generated SDK/schema, reverse metadata handoff, or consumer-drift diagnosis;
54
+ - **verification/closure increment**: an ATP, evidence, phase closure, or release gate explicitly defined by the test plan;
55
+ - **authority change**: a requirement, contract, dependency, scope, or durable decision change. Stop and route this to `cabloy-spec-generation` or `cabloy-domain-planning` before execution.
56
+
57
+ If a task maps to a more specialized Cabloy skill such as `cabloy-master-detail`, `cabloy-resource-field-update`, or `cabloy-module-removal`, use that specialist rather than flattening its procedure into this skill.
58
+
59
+ ## Step 3: Read the spec authority set
60
+
61
+ Read the suite records in this order:
62
+
63
+ 1. `README.md` for identity, reading order, topology, and authority map;
64
+ 2. `prd.md`, `srs.md`, and applicable accepted/proposed ADRs for product and technical authority;
65
+ 3. `pdp-wbs.md` for the complete selected task, dependencies, source areas, exclusions, completion checks, and linked IDs;
66
+ 4. `test-plan.md` for linked `ATP-*` procedures, fixture/cleanup rules, evidence requirements, and release gates;
67
+ 5. `progress.md` for current derived state, blockers, waivers, prior evidence, superseded proof, and next action;
68
+ 6. linked evidence, phase indexes, presentation contracts, rollout records, or provider runbooks when referenced;
69
+ 7. `implementation-gantt.svg` and `implementation-burndown.svg` as derived views; check their freshness rather than treating them as authority.
70
+
71
+ Do not trust the first status statement found in a historical record. Reconcile revision, chronology, supersession, and the authoritative current progress row before deciding readiness.
72
+
73
+ ## Step 4: Build and confirm an execution dossier
74
+
75
+ Before implementation, present a concise dossier containing:
76
+
77
+ - detected edition, repository root, suite, target WBS ID/finite phase, current revision, and clean/dirty working-tree classification;
78
+ - linked `PRD-*`, `SRS-*`, `ATP-*`, ADR, and evidence records;
79
+ - dependencies and their actual status/proof;
80
+ - source-of-truth paths, proposed paths, ownership boundaries, and specialist skill route;
81
+ - applicable tenant, identity, authorization, ownership, lifecycle, transaction, concurrency, idempotency, audit, privacy, SSR, migration, and contract-loop constraints;
82
+ - exact scoped verification procedures and expected evidence;
83
+ - records permitted to change (`progress.md`, evidence/phase index, derived implementation charts, and only other records whose established convention requires it);
84
+ - remaining blockers, `TODO(confirm)` decisions, unsafe actions intentionally excluded, and one next action.
85
+
86
+ Keep observed repository facts separate from target contracts. Require explicit user confirmation of this dossier before making source changes, running meaningful verification, or writing evidence/status updates. Do not treat silence as approval.
87
+
88
+ ## Step 5: Apply readiness gates
89
+
90
+ Stop and route back to the relevant planning authority if any of the following applies:
91
+
92
+ - the suite identity, ownership, or target boundary is unresolved;
93
+ - PRD/SRS/ADR/WBS/test-plan records contradict one another;
94
+ - a controlling `TODO(confirm)` or unaccepted ADR remains;
95
+ - a predecessor is not complete according to the WBS, or its required evidence is absent;
96
+ - the selected task is already `verified`, explicitly `deferred`, or currently `blocked`;
97
+ - a persisted field/schema change lacks an explicit decision about incrementing `vonaModule.fileVersion`;
98
+ - the working tree contains overlapping unclassified changes that make attribution or rollback unclear;
99
+ - authorization, tenant isolation, privacy, lifecycle, transaction, concurrency, idempotency, or ownership behavior is unspecified for a material risk;
100
+ - the requested work would expand scope or silently create a competing persistence, identity, or API authority.
101
+
102
+ A task may be marked `in-progress` only when approved execution actually starts. Do not edit progress merely to reserve a task.
103
+
104
+ ## Step 6: Route the approved increment
105
+
106
+ After confirmation, route the smallest coherent implementation unit:
107
+
108
+ - Vona implementation -> `cabloy-backend-scaffold`;
109
+ - Zova implementation -> `cabloy-frontend-scaffold`;
110
+ - Vona/Zova contract synchronization, generated consumers, reverse metadata handoff, or stale consumer diagnosis -> `cabloy-contract-loop`;
111
+ - master-detail, resource-field, or module-removal shape -> the corresponding specialized skill;
112
+ - test-only/closure work -> follow the selected ATP and repository test ownership, without inventing a new test authority.
113
+
114
+ Keep the specialist’s CLI-first and follow-up rules. Never hand-edit generated consumers. Do not automatically implement adjacent WBS items, choose unconfirmed routes/flavors, change requirements, commit/push, or invoke the next phase.
115
+
116
+ ## Step 7: Verify narrowly, then expand as required
117
+
118
+ Start with the narrowest meaningful check for the selected task, then follow the linked ATP and release-gate requirements. Use only commands observed in the active repository and approved by the dossier.
119
+
120
+ For contract-sensitive work:
121
+
122
+ - forward chain: establish backend contract truth, inspect OpenAPI, regenerate Zova consumers, then perform thin frontend follow-up;
123
+ - reverse chain: build the affected Zova flavor with both SSR and REST outputs, then run `npm run deps:vona`; build Web and Admin pairs when both are affected;
124
+ - if generated artifacts are correct but installed Vona consumers remain stale, diagnose local dependency drift through `cabloy-contract-loop` rather than hand-patching generated files or reinstalling automatically.
125
+
126
+ For SSR-sensitive work, verify server output and hydration-time initial render equivalence, privacy/admission behavior, and the exact active flavor/site contract. For backend tests, preserve separate `mockCtx(...)` boundaries for competing operations, explicit contention assertions, precise `finally` cleanup, and read-only managed seed behavior.
127
+
128
+ A planned command, successful generation, code reading, manual walkthrough, screenshot, or unrelated broad test pass is not sufficient for `verified` unless the test plan explicitly defines it as adequate retained proof.
129
+
130
+ ## Step 8: Record evidence and derived status
131
+
132
+ Record actual observed proof according to `references/status-and-evidence.md`. Prefer dedicated phase/ATP evidence records when the suite convention supports them; otherwise preserve the suite’s established inline test-plan convention. Update evidence first, then the derived progress register, and regenerate/check both implementation charts last. Use `npm run spec:charts -- <suite>` followed by `npm run spec:charts:check -- <suite>`; chart output remains derived and cannot repair an authority conflict.
133
+
134
+ Set status accurately:
135
+
136
+ - `in-progress` while work or verification remains open;
137
+ - `implementation-complete` when source work is complete but ATP/release proof remains;
138
+ - `verified` only after all applicable WBS checks and ATPs have durable linked redacted evidence;
139
+ - `blocked`, `waived`, or `deferred` only with the required details.
140
+
141
+ Do not create empty evidence records, fabricate `EVD-*` IDs, erase historical failures, or claim that a hook/build means verification passed. If changed source or authority invalidates old proof, mark it superseded or requiring rerun.
142
+
143
+ ## Step 9: Finish with a resumable handoff
144
+
145
+ Report:
146
+
147
+ 1. target WBS/phase and detected edition;
148
+ 2. implementation files and commands actually changed/run;
149
+ 3. observed result and evidence locations, with secrets and sensitive data redacted;
150
+ 4. resulting status and the precise reason for it;
151
+ 5. blockers, decisions, or evidence still outstanding;
152
+ 6. one next proof/action only;
153
+ 7. refreshed `implementation-gantt.svg` and `implementation-burndown.svg`, README-derived chart language, and the chart check result.
154
+
155
+ Do not automatically modify the next WBS item or claim release closure from feature-level verification.
156
+
157
+ ## Prohibited autonomous operations
158
+
159
+ Unless a separate explicit workflow and confirmation authorizes them, do not:
160
+
161
+ - run `npm run init`;
162
+ - reset or recreate a database;
163
+ - deploy, publish, cut over, or perform production/provider/webhook operations;
164
+ - change credentials or retain secrets/raw tokens/signed callback state/live provider identifiers;
165
+ - clean, reset, stash, checkout, or discard the working tree;
166
+ - reinstall dependencies as a first response to drift;
167
+ - scaffold broad source outside the approved WBS boundary;
168
+ - commit or push;
169
+ - mark implementation or verification complete without observed, traceable proof.
@@ -0,0 +1,71 @@
1
+ {
2
+ "skill_name": "cabloy-spec-execution",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "In the Cabloy Basic repository, implement WBS-HUA-20-01 from repo-specs/home-user. Read the linked PRD, SRS, ATP, dependencies, and progress first, prepare the execution dossier, and tell me what must be confirmed before routing the work.",
7
+ "expected_output": "Detects Basic, reads the existing suite authority set, resolves the bounded WBS task and linked traceability, checks dependencies and current status, separates observed facts from proposed work, presents a confirmation dossier, and routes implementation to the appropriate specialist without claiming execution or verification prematurely.",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "Make the entire a-commerce suite real and finish every phase in its specs. Start implementing whatever is next without asking me to choose a task.",
13
+ "expected_output": "Rejects the open-ended scope, requires an explicit WBS item or finite approved phase, and does not begin broad source changes or advance progress automatically.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "Execute the selected WBS task even though its ADR still contains TODO(confirm) for authorization and the progress row is blocked by a failed acceptance gate.",
19
+ "expected_output": "Stops before implementation, explains the unresolved authority and failed-gate blockers, and routes the decision or spec correction to cabloy-spec-generation rather than working around it.",
20
+ "files": []
21
+ },
22
+ {
23
+ "id": 4,
24
+ "prompt": "Implement WBS-ABC-30-01, which adds a persisted field to an existing entity. Just choose the migration version that seems consistent with nearby modules and continue.",
25
+ "expected_output": "Requires an explicit decision about whether vonaModule.fileVersion increments before editing migration metadata, does not invent migration history, and includes the required full test consequence if meta.version.ts changes.",
26
+ "files": []
27
+ },
28
+ {
29
+ "id": 5,
30
+ "prompt": "Implement the backend DTO change for WBS-COM-20-02 and patch the generated Zova API types manually so the frontend compiles. There is no need to regenerate anything.",
31
+ "expected_output": "Routes the contract-affecting work through the forward contract loop, keeps backend contract truth first, requires OpenAPI inspection and generated consumer regeneration, and refuses hand-editing generated consumers.",
32
+ "files": []
33
+ },
34
+ {
35
+ "id": 6,
36
+ "prompt": "Execute the Start suite task WBS-ADM-60-01 for an Admin SSR route. Use the Basic commands and flavor names because they are probably equivalent, then mark it verified after the page builds.",
37
+ "expected_output": "Detects or requires Start-specific repository facts, rejects Basic flavor/command leakage, routes frontend work appropriately, requires SSR/hydration and applicable paired artifact proof, and refuses verified status from a build alone.",
38
+ "files": []
39
+ },
40
+ {
41
+ "id": 7,
42
+ "prompt": "For the selected WBS task, run npm run init, reset the database, deploy the sandbox webhook, and commit all changes automatically so the spec is closed.",
43
+ "expected_output": "Does not perform init, database reset, deployment/provider operations, or commit automatically; separates those operations behind explicit workflows and confirmation while preserving the bounded execution scope.",
44
+ "files": []
45
+ },
46
+ {
47
+ "id": 8,
48
+ "prompt": "The implementation for WBS-HUA-50-01 is complete and the focused test command passed, but no retained ATP artifact exists yet. Update progress to verified and create an empty evidence directory.",
49
+ "expected_output": "Keeps the task at implementation-complete or another accurate pre-verification status, rejects empty/fabricated evidence, and requires durable ATP evidence with revision, environment, procedure, result, and redaction before verified.",
50
+ "files": []
51
+ },
52
+ {
53
+ "id": 9,
54
+ "prompt": "A previously verified WBS task changed its backend contract after a new implementation commit. Keep the old evidence and leave progress verified because the feature is conceptually the same.",
55
+ "expected_output": "Recognizes revision-scoped evidence, marks prior proof as superseded or requiring rerun, preserves the historical record, and avoids carrying verified status across changed source or authority without new applicable ATP evidence.",
56
+ "files": []
57
+ },
58
+ {
59
+ "id": 10,
60
+ "prompt": "After executing an approved WBS task, update progress with its new status and evidence pointer but leave implementation-gantt.svg and implementation-burndown.svg stale.",
61
+ "expected_output": "Regenerates both derived charts after progress, runs npm run spec:charts:check -- <suite>, reports the chart result, and never treats the charts as authority or evidence.",
62
+ "files": []
63
+ },
64
+ {
65
+ "id": 11,
66
+ "prompt": "The execution chart disagrees with the WBS dependency or a planning authority changed while the task was running. Edit the SVG until it looks correct and continue.",
67
+ "expected_output": "Stops on the authority conflict, routes the correction through cabloy-spec-generation, and refuses to hand-edit a derived chart as a workaround; only regenerate after the authoritative records are reconciled.",
68
+ "files": []
69
+ }
70
+ ]
71
+ }