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.
- package/.cabloy-version +1 -1
- package/.claude/commands/release.md +12 -1
- package/.claude/hooks/contract-loop-gate.ts +35 -17
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +4 -3
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
- package/.claude/skills/cabloy-contract-loop/SKILL.md +4 -3
- package/.claude/skills/cabloy-domain-planning/SKILL.md +4 -3
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +4 -3
- package/.claude/skills/cabloy-master-detail/SKILL.md +4 -3
- package/.claude/skills/cabloy-module-removal/SKILL.md +5 -4
- package/.claude/skills/cabloy-resource-field-update/SKILL.md +8 -5
- package/.claude/skills/cabloy-spec-execution/SKILL.md +169 -0
- package/.claude/skills/cabloy-spec-execution/evals/evals.json +71 -0
- package/.claude/skills/cabloy-spec-execution/references/execution-protocol.md +137 -0
- package/.claude/skills/cabloy-spec-execution/references/status-and-evidence.md +117 -0
- package/.claude/skills/cabloy-spec-generation/SKILL.md +227 -0
- package/.claude/skills/cabloy-spec-generation/evals/evals.json +83 -0
- package/.claude/skills/cabloy-spec-generation/references/repo-aware-discovery.md +101 -0
- package/.claude/skills/cabloy-spec-generation/references/repo-specs-document-set.md +267 -0
- package/.claude/skills/cabloy-spec-generation/references/traceability-and-status-rules.md +135 -0
- package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.mjs +350 -0
- package/.claude/skills/cabloy-spec-generation/scripts/generate-implementation-charts.test.mjs +202 -0
- package/.claude/skills/cabloy-workflow/SKILL.md +21 -10
- package/.claude/skills/cabloy-workflow/evals/evals.json +8 -2
- package/.claude/skills/cabloy-workflow/references/edition-detection.md +5 -3
- package/.claude/skills/cabloy-zova-source-reading/SKILL.md +4 -3
- package/CHANGELOG.md +25 -0
- package/CLAUDE.md +12 -11
- package/package.json +4 -2
- package/repo-docs/.vitepress/config.mjs +4 -0
- package/repo-docs/ai/docs-skills-rules-mapping.md +6 -6
- package/repo-docs/ai/future-skill-roadmap.md +2 -2
- package/repo-docs/ai/introduction.md +5 -5
- package/repo-docs/ai/playbook-contract-regeneration.md +3 -9
- package/repo-docs/ai/repo-guidance.md +5 -4
- package/repo-docs/ai/rules-and-config.md +2 -2
- package/repo-docs/ai/virtual-decorator-guidance.md +1 -3
- package/repo-docs/backend/cache-guide.md +36 -0
- package/repo-docs/backend/introduction.md +1 -1
- package/repo-docs/backend/migration-and-changes.md +27 -2
- package/repo-docs/backend/model-guide.md +1 -1
- package/repo-docs/backend/resource-field-update.md +156 -0
- package/repo-docs/frontend/router-tabs-introduction.md +2 -4
- package/repo-docs/fullstack/a-pay-payment-suite.md +1 -1
- package/repo-docs/fullstack/contract-loop-playbook.md +4 -0
- package/repo-docs/fullstack/one-to-one-companion-resource-guide.md +1 -1
- package/repo-docs/reference/package-map.md +1 -1
- package/scripts/release.ts +48 -1
- package/scripts/upgrade.ts +18 -7
- package/zova/pnpm-lock.yaml +5 -5
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.152
|
|
@@ -6,7 +6,14 @@ version: 1.0.0
|
|
|
6
6
|
|
|
7
7
|
# Cabloy Release
|
|
8
8
|
|
|
9
|
-
|
|
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
|
|
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():
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
if (
|
|
131
|
-
|
|
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
|
-
|
|
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 (
|
|
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: '
|
|
325
|
-
message:
|
|
337
|
+
kind: 'not-applicable',
|
|
338
|
+
message: `Auto-sync did not run because ${reason}.`,
|
|
326
339
|
};
|
|
327
340
|
}
|
|
328
341
|
|
|
329
|
-
if (
|
|
342
|
+
if (shouldSkipAutoSync(filePath)) {
|
|
330
343
|
return {
|
|
331
|
-
kind: '
|
|
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
|
-
-
|
|
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;
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
+
}
|