@eventmodelers/cli 1.0.18 → 1.0.20

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/README.md CHANGED
@@ -94,8 +94,9 @@ Use skills in Claude Code with `/skill-name`:
94
94
  | `/update-slice-status` | Update slice status on the board |
95
95
  | `/load-slice` | Persist board slices to disk (backend stacks) |
96
96
  | `/build-state-change`, `/build-state-view`, `/build-automation`, `/build-webhook` | Implement a slice's command/view/automation/webhook (backend stacks) |
97
+ | `/request-feedback` | Post a QUESTION comment and mark a slice `Blocked` when it's genuinely ambiguous (backend stacks) |
97
98
 
98
- Which skills install depends on the chosen stack — see `stacks/<name>/templates/.claude/skills/`. `/connect`, `/learn-eventmodelers-api`, and `/update-slice-status` have no stack-specific content and install into every stack from `shared/skills/` instead.
99
+ Which skills install depends on the chosen stack — see `stacks/<name>/templates/.claude/skills/`. `/connect`, `/learn-eventmodelers-api`, `/update-slice-status`, and `/request-feedback` have no stack-specific content and install into every stack from `shared/skills/` instead.
99
100
 
100
101
  ## Everyday commands
101
102
 
@@ -346,7 +347,7 @@ npx @eventmodelers/cli uninstall --modeling-kit # remove .agent-modeling-ki
346
347
 
347
348
  ### Adding a stack
348
349
 
349
- Each stack lives under `stacks/<name>/templates/` with `.claude/` (skills), `root/` (spread into the project root), and either `build-kit/` (backend stacks) or `kit/` (modeling-only) for the agent runner. Files identical across all backend stacks live once in `shared/build-kit/` and get layered in automatically — only put stack-specific overrides under `stacks/<name>/templates/build-kit/`. Skills with no stack-specific content (`connect`, `learn-eventmodelers-api`, `update-slice-status`) work the same way via `shared/skills/` — a new stack gets them for free without copying anything; add a skill there only once it needs a stack-specific fork.
350
+ Each stack lives under `stacks/<name>/templates/` with `.claude/` (skills), `root/` (spread into the project root), and either `build-kit/` (backend stacks) or `kit/` (modeling-only) for the agent runner. Files identical across all backend stacks live once in `shared/build-kit/` and get layered in automatically — only put stack-specific overrides under `stacks/<name>/templates/build-kit/`. Skills with no stack-specific content (`connect`, `learn-eventmodelers-api`, `update-slice-status`, `request-feedback`) work the same way via `shared/skills/` — a new stack gets them for free without copying anything; add a skill there only once it needs a stack-specific fork.
350
351
 
351
352
  Once your `init --build-kit` scaffold (see above) works against a real backend, promote it to a first-class stack:
352
353
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventmodelers/cli",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, Cratis, or modeling-only)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,155 @@
1
+ ---
2
+ name: request-feedback
3
+ description: Post a QUESTION comment on a slice and mark it Blocked when the slice's requirements are genuinely ambiguous, contradictory, or missing something a decision depends on. This is an escalation path, not a routine step — reach for it only when you cannot proceed without guessing.
4
+ ---
5
+
6
+ # Request Feedback
7
+
8
+ > **Before doing anything else**, invoke the `connect` skill — if not already connected — to resolve `TOKEN`, `BOARD_ID`, `ORG_ID`, and `BASE_URL`. Do not proceed until the connect skill has completed.
9
+
10
+ Prefer `mcp__eventmodelers__*` tools when available (registered by the `connect` skill) — the curl blocks below are the fallback for sessions without MCP connected.
11
+
12
+ ---
13
+
14
+ ## When to use this skill — the exception, not the rule
15
+
16
+ Building a slice is normally unambiguous: `slice.json` names every command field, event field, and
17
+ GWT scenario, and the matching build skill (`build-state-change`, `build-state-view`,
18
+ `build-automation`, ...) tells you exactly how to turn that into code. **Read `slice.json` fully, and
19
+ read the build skill's own instructions and reference docs, before ever concluding something is
20
+ missing.** Most slices need none of this.
21
+
22
+ Only invoke `request-feedback` when, after that reading, a decision the implementation depends on
23
+ still cannot be made without guessing — for example:
24
+
25
+ - A business rule mentioned in `description`/`comments`/`notes` isn't backed by any field, event, or
26
+ `specifications[]` scenario, so there's no way to encode it.
27
+ - Two fields, or a field and an `idAttribute` flag, contradict each other about what the slice is
28
+ supposed to do.
29
+ - A `specifications[]` scenario references a prior event or state that no command/event in this slice
30
+ (or its declared dependencies) actually produces.
31
+ - The slice depends on another slice, screen, or read model that doesn't exist yet and it's unclear
32
+ whether one should be created, or the dependency was meant to point elsewhere.
33
+
34
+ **Do not use this skill for:**
35
+ - Implementation-detail choices the build skill's own instructions already answer (e.g. package
36
+ naming, file layout, which annotation to use) — those aren't ambiguity in the slice, they're just
37
+ reading the skill more carefully.
38
+ - Style or naming preferences with no functional consequence — pick the reasonable option and move on.
39
+ - "This would be nice to confirm" — if you *can* proceed correctly from what `slice.json` says, proceed.
40
+
41
+ When in doubt, prefer finishing the slice over escalating. Escalating on every minor uncertainty
42
+ defeats the purpose — it should be rare enough that a `Blocked` slice reliably means "a human needs to
43
+ look at this," not "the agent didn't feel like deciding."
44
+
45
+ **When this skill does apply: do not guess and build anyway.** Post the question and stop work on this
46
+ slice for this run — do not implement your best interpretation first. A wrong guess encoded into
47
+ working, tested, committed code is harder to catch and undo than an unbuilt slice waiting for an
48
+ answer.
49
+
50
+ ---
51
+
52
+ ## Step 1 — Parse arguments
53
+
54
+ From `$ARGUMENTS` or the calling skill's context, extract:
55
+
56
+ | Field | How to find it | Default |
57
+ |-------|---------------|---------|
58
+ | `sliceName` or `sliceId` | the slice being worked on | **required** — one of the two |
59
+ | `question` | the specific ambiguity or missing piece, phrased as a question | **required** |
60
+ | `author` | author identifier string | `agent` |
61
+
62
+ ## Step 2 — Resolve the slice's node id
63
+
64
+ Prefer MCP:
65
+
66
+ ```
67
+ mcp__eventmodelers__list_slices { "boardId": "<BOARD_ID>" }
68
+ ```
69
+
70
+ **Fallback (no MCP):**
71
+
72
+ ```bash
73
+ curl -s \
74
+ -H "x-token: <TOKEN>" \
75
+ -H "x-board-id: <BOARD_ID>" \
76
+ -H "x-user-id: request-feedback-skill" \
77
+ "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/slicedata/slices"
78
+ ```
79
+
80
+ Find the slice whose `title` matches `sliceName` (case-insensitive), or whose `id` matches `sliceId`.
81
+ If no match is found, stop and list the available slice titles so the caller can pick one. Save the
82
+ matched slice's `id` as `SLICE_NODE_ID` and its current `status` as `CURRENT_STATUS`.
83
+
84
+ ## Step 3 — Post the QUESTION comment
85
+
86
+ Prefer MCP:
87
+
88
+ ```
89
+ mcp__eventmodelers__add_comment { "boardId": "<BOARD_ID>", "nodeId": "<SLICE_NODE_ID>", "text": "<question>", "type": "QUESTION", "author": "<author>" }
90
+ ```
91
+
92
+ **Fallback (no MCP):**
93
+
94
+ ```bash
95
+ curl -s -X POST "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes/<SLICE_NODE_ID>/comments" \
96
+ -H "Authorization: Bearer <TOKEN>" \
97
+ -H "Content-Type: application/json" \
98
+ -d '{"text":"<question>","type":"QUESTION","author":"<author>"}'
99
+ ```
100
+
101
+ Response: `201 {"id":"<commentId>"}`. Save it as `COMMENT_ID` — the calling skill may want to reference
102
+ it later once the question is answered.
103
+
104
+ Write `<question>` so a human reading it cold understands the gap without re-reading the slice
105
+ themselves: name the slice, name the specific field/rule/scenario in question, and say what's missing
106
+ or contradictory — not just "please clarify this slice."
107
+
108
+ ## Step 4 — Mark the slice Blocked
109
+
110
+ Prefer MCP:
111
+
112
+ ```
113
+ mcp__eventmodelers__update_slice_status { "boardId": "<BOARD_ID>", "sliceId": "<SLICE_NODE_ID>", "newStatus": "Blocked" }
114
+ ```
115
+
116
+ Also mark the slice 'blocked' locally in the index.json if possible.
117
+
118
+ **Fallback (no MCP)** — send a `node:changed` event to update the `sliceStatus` field in the
119
+ SLICE_BORDER node's meta directly:
120
+
121
+ ```bash
122
+ curl -s -X POST "<BASE_URL>/api/org/<ORG_ID>/boards/<BOARD_ID>/nodes/events" \
123
+ -H "Content-Type: application/json" \
124
+ -H "x-token: <TOKEN>" \
125
+ -H "x-board-id: <BOARD_ID>" \
126
+ -H "x-user-id: request-feedback-skill" \
127
+ -d '[{
128
+ "id": "<new-random-uuid>",
129
+ "eventType": "node:changed",
130
+ "nodeId": "<SLICE_NODE_ID>",
131
+ "boardId": "<BOARD_ID>",
132
+ "timestamp": <Date.now()>,
133
+ "changedAttributes": ["sliceStatus"],
134
+ "meta": {
135
+ "sliceStatus": "Blocked"
136
+ }
137
+ }]'
138
+ ```
139
+
140
+ If `CURRENT_STATUS` was already `Blocked`, this step is a no-op — don't treat that as an error, and
141
+ don't retry. It just means someone (possibly this same agent, on an earlier prompt) already flagged it.
142
+
143
+ ## Step 5 — Stop and report
144
+
145
+ Do not continue implementing the slice after this. Report back to whoever invoked this skill:
146
+
147
+ ```
148
+ Requested feedback on slice "<sliceName>" (<SLICE_NODE_ID>)
149
+ Question posted: "<question>"
150
+ Status: <CURRENT_STATUS> → Blocked
151
+ ```
152
+
153
+ Then stop work on this slice for this run. If the caller has other, unrelated slices queued, it may
154
+ move on to those — but this specific slice stays untouched until the question is answered and the
155
+ slice is moved out of `Blocked`.
@@ -415,8 +415,6 @@ than fabricating an assertion.
415
415
 
416
416
  ## References
417
417
 
418
- - [Stateless Automation Example](references/automation-test-example.md) — Complete Java test example
419
- - [Automation with Read Model Example](references/automation-with-read-model-test-example.md) — Multi-command test
420
418
  - [Feature Flag Patterns](references/feature-flag-patterns.md) — `@ConditionalOnProperty` and alternatives
421
419
 
422
420
  ---
@@ -7,8 +7,7 @@ description: >
7
7
  (long-running, durable, multi-step processes) instead of plain @EventHandler automations.
8
8
  Determines WHICH slices need a Workflow, then implements them using the AF5 Workflow engine.
9
9
  Use when: (1) given a set of automation slice.json definitions, decide which ones should be
10
- Workflows; (2) user asks to "convert automation to workf
11
- low", "implement as workflow",
10
+ Workflows; (2) user asks to "convert automation to workflow", "implement as workflow",
12
11
  or "use Axon Workflow for this slice"; (3) a slice has multi-step logic, needs to wait for
13
12
  external input/approval, requires compensation/rollback, or spans significant time.
14
13
  NOTE: AF5 Workflows are in Preview — APIs may change; not intended for production use yet.
@@ -121,8 +121,16 @@ public static final String {TAG_CONSTANT} = "idField";
121
121
  ## Step 3: Decision-model entity
122
122
 
123
123
  Package-private, mutable field(s) — **not** an immutable `State` record with free-standing
124
- `decide()`/`evolve()` static methods. One boolean/value field per fact the command handler's rule
125
- check needs, nothing else.
124
+ `decide()`/`evolve()` static methods.
125
+
126
+ **Derive the field(s) from this slice's `specifications[]` (Step 0), not from the event's shape.**
127
+ Each GWT scenario's `given`/`then` pair states the one decision the command handler must make and the
128
+ prior fact that decision depends on — that fact is the field. Re-read the scenarios before naming
129
+ fields: a "given no prior activity" / "given already {X}" pair means one boolean flag for {X}; a
130
+ scenario that discriminates on a value (not just presence/absence) means a value field holding that
131
+ value, not a boolean. Add exactly one field per fact a scenario actually branches on — an event can
132
+ carry several fields, but the entity only needs the ones a `specifications[]` scenario checks. Do not
133
+ add a field just because the corresponding event happens to carry that data.
126
134
 
127
135
  ```java
128
136
  package {basePackage}.slices.{context}.{slicename};
@@ -312,6 +320,8 @@ in all three places:
312
320
  - `META-INF/additional-spring-configuration-metadata.json` — add a `{"name": "...", "type":
313
321
  "java.lang.Boolean", "description": "..."}` entry
314
322
 
323
+ See [references/feature-flag-patterns.md](references/feature-flag-patterns.md) for the full pattern.
324
+
315
325
  This flag is irrelevant to the Step 7 test below — that test never boots Spring, so
316
326
  `@ConditionalOnProperty` never runs.
317
327
 
@@ -42,6 +42,13 @@ When starting to work on a slice, invoke the `update-slice-status` skill with `I
42
42
  **CRITICAL: You MUST always use the provided skills to build slices. NEVER implement a slice manually.**
43
43
  **ALL fields, event names, command names, and business rules MUST come exclusively from slice.json. Do NOT invent, assume, or guess any field or logic not present in the slice definition.**
44
44
 
45
+ **If, at any point below, the slice's requirements are genuinely ambiguous, contradictory, or missing
46
+ a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke the
47
+ `request-feedback` skill with the specific question; it posts the question as a comment on the slice
48
+ and marks it `Blocked`, and you then stop work on this slice for this run. This is an escalation path,
49
+ not a routine step — read `slice.json` and the matching build skill's own instructions fully first;
50
+ most slices are fully specified and need none of this.
51
+
45
52
  When asked to build a slice, always follow this flow:
46
53
 
47
54
  1. Read the slice definition from `.build-kit/.slices/<context>/<slicename>/slice.json`.
@@ -48,6 +48,17 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
48
48
  18. append your new learnings to `.build-kit/AGENTS.md` in a compressed form, reusable for future iterations. Only add learnings if they are not already there.
49
49
  19. Finish the iteration.
50
50
 
51
+ ## Escalating Ambiguity
52
+
53
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
54
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
55
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
56
+ board (overriding the `InProgress` set earlier), then stop this iteration without finishing the
57
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
58
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
59
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
60
+ this.
61
+
51
62
  ## Progress Report Format
52
63
 
53
64
  APPEND to progress.txt (never replace, always append):
@@ -48,6 +48,8 @@ Inspect the `sliceStatus` in the payload:
48
48
 
49
49
  This is the build trigger. Setting `InProgress` and building are one atomic step:
50
50
 
51
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the specific question; it posts the question as a comment on the slice and marks it `Blocked` (superseding the `InProgress` set in step 1), then drop this task without finishing the build. This is an escalation path, not a routine step — most slices are fully specified.
52
+
51
53
  1. Immediately call `/update-slice-status` to set the slice to `InProgress` on the board.
52
54
 
53
55
  **Claim conflict**: if this call reports the slice is already in `InProgress` (or any status other than `Planned`), another agent already claimed it first — this is expected, not an error. Log it in `progress.txt`, drop this task without building, and continue the loop (the next task will naturally cover the next slice). Do not retry.
@@ -4,7 +4,7 @@
4
4
  <modelVersion>4.0.0</modelVersion>
5
5
  <groupId>io.axoniq.quickstart</groupId>
6
6
  <artifactId>quickstart</artifactId>
7
- <name>Axoniq Platform Quickstart</name>
7
+ <name>Axoniq Quickstart</name>
8
8
  <version>0.0.1-SNAPSHOT</version>
9
9
 
10
10
  <properties>
@@ -20,6 +20,8 @@
20
20
  <artifactId>spring-boot-starter-webflux</artifactId>
21
21
  </dependency>
22
22
 
23
+
24
+
23
25
  <!-- Read model persistence: Spring Data JPA + PostgreSQL, default for all projections -->
24
26
  <dependency>
25
27
  <groupId>org.springframework.boot</groupId>
@@ -43,6 +45,14 @@
43
45
  <artifactId>axoniq-platform-spring-boot-starter</artifactId>
44
46
  </dependency>
45
47
 
48
+ <!-- Auto-starts docker-compose.yml services (e.g. postgres) on app run -->
49
+ <dependency>
50
+ <groupId>org.springframework.boot</groupId>
51
+ <artifactId>spring-boot-docker-compose</artifactId>
52
+ <scope>runtime</scope>
53
+ <optional>true</optional>
54
+ </dependency>
55
+
46
56
  <!-- Testing -->
47
57
  <dependency>
48
58
  <groupId>org.springframework.boot</groupId>
@@ -1 +1,8 @@
1
- spring.application.name=Platform QuickStart
1
+ spring.application.name=Platform QuickStart
2
+
3
+ spring.datasource.url=jdbc:postgresql://localhost:5432/quickstart
4
+ spring.datasource.username=quickstart
5
+ spring.datasource.password=quickstart
6
+
7
+ spring.docker.compose.enabled=true
8
+ spring.docker.compose.file=docker-compose.yml
@@ -32,6 +32,13 @@ When starting to work on a slice, invoke the `update-slice-status` skill with `I
32
32
  **CRITICAL: You MUST always use the provided skills to build slices. NEVER implement a slice manually.**
33
33
  **ALL fields, event names, command names, and business rules MUST come exclusively from slice.json. Do NOT invent, assume, or guess any field or logic not present in the slice definition.**
34
34
 
35
+ **If, at any point below, the slice's requirements are genuinely ambiguous, contradictory, or missing
36
+ a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke the
37
+ `request-feedback` skill with the specific question; it posts the question as a comment on the slice
38
+ and marks it `Blocked`, and you then stop work on this slice for this run. This is an escalation path,
39
+ not a routine step — read `slice.json` and the matching build skill's own instructions fully first;
40
+ most slices are fully specified and need none of this.
41
+
35
42
  When asked to build a slice, always follow this flow:
36
43
 
37
44
  1. Read the slice definition from `.build-kit/.slices/<context>/<slicename>/slice.json`.
@@ -91,6 +91,17 @@ Use the skills available in `.claude/skills/` to interact with the board.
91
91
 
92
92
  After completing a task, remove it from the array and write the updated array back to `.build-kit/tasks.json`. If the array is now empty, write `[]`.
93
93
 
94
+ ## Escalating Ambiguity
95
+
96
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
97
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
98
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
99
+ board (overriding the `InProgress` set earlier), then stop this iteration without finishing the
100
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
101
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
102
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
103
+ this.
104
+
94
105
  ## Progress Report Format
95
106
 
96
107
  APPEND to `progress.txt` (never replace):
@@ -38,6 +38,17 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
38
38
  17. Append your new learnings to `.build-kit/AGENTS.md` in a compressed form, reusable for future iterations. Only add learnings if they are not already there.
39
39
  18. Finish the iteration.
40
40
 
41
+ ## Escalating Ambiguity
42
+
43
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
44
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
45
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
46
+ board (overriding the `InProgress` set in step 5), then stop this iteration without finishing the
47
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
48
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
49
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
50
+ this.
51
+
41
52
  ## Progress Report Format
42
53
 
43
54
  APPEND to progress.txt (never replace, always append):
@@ -9,6 +9,13 @@ and follow the conventions distilled in
9
9
  `.build-kit/.claude/skills/_shared/cratis-conventions.md`. **The shipped example slice
10
10
  under `SomeModule/SomeFeature/` is the concrete pattern to copy** — match its structure exactly.
11
11
 
12
+ **If a slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need in
13
+ order to proceed — do not guess, and do not build anyway.** Invoke the `request-feedback` skill with
14
+ the specific question; it posts the question as a comment on the slice and marks it `Blocked`, and you
15
+ then stop work on this slice for this run. This is an escalation path, not a routine step — read
16
+ `slice.json` and the matching build skill's own instructions fully first; most slices are fully
17
+ specified and need none of this.
18
+
12
19
  ## Structure (learn from `SomeModule/SomeFeature/`)
13
20
 
14
21
  ```
@@ -73,6 +73,17 @@ implementing.
73
73
  until the backend compiles**. Always: Backend → `dotnet build` → Specs → Frontend → Composition.
74
74
  Never implement a slice's frontend before its backend builds.
75
75
 
76
+ ## Escalating Ambiguity
77
+
78
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
79
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
80
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
81
+ board (overriding the `InProgress` set earlier), then stop this iteration without finishing the
82
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
83
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
84
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
85
+ this.
86
+
76
87
  ## Progress Report Format
77
88
 
78
89
  APPEND to `progress.txt` (never replace):
@@ -48,6 +48,8 @@ Inspect the `sliceStatus` in the payload:
48
48
 
49
49
  This is the build trigger. Setting `InProgress` and building are one atomic step:
50
50
 
51
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the specific question; it posts the question as a comment on the slice and marks it `Blocked` (superseding the `InProgress` set in step 1), then drop this task without finishing the build. This is an escalation path, not a routine step — most slices are fully specified.
52
+
51
53
  1. Immediately call `/update-slice-status` to set the slice to `InProgress` on the board.
52
54
 
53
55
  2. Read the slice definition from `.build-kit/.slices/<contextSlug>/<sliceFolder>/slice.json` (written by `/load-slice`).
@@ -35,6 +35,13 @@ When starting to work on a slice, invoke the `update-slice-status` skill with `I
35
35
  **CRITICAL: You MUST always use the provided skills to build slices. NEVER implement a slice manually.**
36
36
  **ALL fields, event names, command names, and business rules MUST come exclusively from slice.json. Do NOT invent, assume, or guess any field or logic not present in the slice definition.**
37
37
 
38
+ **If, at any point below, the slice's requirements are genuinely ambiguous, contradictory, or missing
39
+ a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke the
40
+ `request-feedback` skill with the specific question; it posts the question as a comment on the slice
41
+ and marks it `Blocked`, and you then stop work on this slice for this run. This is an escalation path,
42
+ not a routine step — read `slice.json` and the matching build skill's own instructions fully first;
43
+ most slices are fully specified and need none of this.
44
+
38
45
  When asked to build a slice, always follow this flow:
39
46
 
40
47
  1. Read the slice definition from `.build-kit/.slices/<context>/<slicename>/slice.json`.
@@ -42,6 +42,17 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
42
42
  18. append your new learnings to `.build-kit/AGENTS.md` in a compressed form, reusable for future iterations. Only add learnings if they are not already there.
43
43
  19. Finish the iteration.
44
44
 
45
+ ## Escalating Ambiguity
46
+
47
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
48
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
49
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
50
+ board (overriding the `InProgress` set earlier), then stop this iteration without finishing the
51
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
52
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
53
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
54
+ this.
55
+
45
56
  ## Progress Report Format
46
57
 
47
58
  APPEND to progress.txt (never replace, always append):
@@ -48,6 +48,8 @@ Inspect the `sliceStatus` in the payload:
48
48
 
49
49
  This is the build trigger. Setting `InProgress` and building are one atomic step:
50
50
 
51
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the specific question; it posts the question as a comment on the slice and marks it `Blocked` (superseding the `InProgress` set in step 1), then drop this task without finishing the build. This is an escalation path, not a routine step — most slices are fully specified.
52
+
51
53
  1. Immediately call `/update-slice-status` to set the slice to `InProgress` on the board.
52
54
 
53
55
  **Claim conflict**: if this call reports the slice is already in `InProgress` (or any status other than `Planned`), another agent already claimed it first — this is expected, not an error. Log it in `progress.txt`, drop this task without building, and continue the loop (the next task will naturally cover the next slice). Do not retry.
@@ -35,6 +35,13 @@ When starting to work on a slice, invoke the `update-slice-status` skill with `I
35
35
  **CRITICAL: You MUST always use the provided skills to build slices. NEVER implement a slice manually.**
36
36
  **ALL fields, event names, command names, and business rules MUST come exclusively from slice.json. Do NOT invent, assume, or guess any field or logic not present in the slice definition.**
37
37
 
38
+ **If, at any point below, the slice's requirements are genuinely ambiguous, contradictory, or missing
39
+ a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke the
40
+ `request-feedback` skill with the specific question; it posts the question as a comment on the slice
41
+ and marks it `Blocked`, and you then stop work on this slice for this run. This is an escalation path,
42
+ not a routine step — read `slice.json` and the matching build skill's own instructions fully first;
43
+ most slices are fully specified and need none of this.
44
+
38
45
  When asked to build a slice, always follow this flow:
39
46
 
40
47
  1. Read the slice definition from `.build-kit/.slices/<context>/<slicename>/slice.json`.
@@ -42,6 +42,17 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
42
42
  18. append your new learnings to `.build-kit/AGENTS.md` in a compressed form, reusable for future iterations. Only add learnings if they are not already there.
43
43
  19. Finish the iteration.
44
44
 
45
+ ## Escalating Ambiguity
46
+
47
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need
48
+ in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the
49
+ specific question; it posts the question as a comment on the slice and marks it `Blocked` on the
50
+ board (overriding the `InProgress` set earlier), then stop this iteration without finishing the
51
+ build — reply `<promise>DONE</promise>` as if the iteration's work was to raise the question, not to
52
+ implement the slice. This is an escalation path, not a routine step — read the slice.json and the
53
+ matching build skill's own instructions fully first; most slices are fully specified and need none of
54
+ this.
55
+
45
56
  ## Progress Report Format
46
57
 
47
58
  APPEND to progress.txt (never replace, always append):
@@ -48,6 +48,8 @@ Inspect the `sliceStatus` in the payload:
48
48
 
49
49
  This is the build trigger. Setting `InProgress` and building are one atomic step:
50
50
 
51
+ **If the slice's requirements are genuinely ambiguous, contradictory, or missing a decision you need in order to proceed — do not guess, and do not build anyway.** Invoke `/request-feedback` with the specific question; it posts the question as a comment on the slice and marks it `Blocked` (superseding the `InProgress` set in step 1), then drop this task without finishing the build. This is an escalation path, not a routine step — most slices are fully specified.
52
+
51
53
  1. Immediately call `/update-slice-status` to set the slice to `InProgress` on the board.
52
54
 
53
55
  **Claim conflict**: if this call reports the slice is already in `InProgress` (or any status other than `Planned`), another agent already claimed it first — this is expected, not an error. Log it in `progress.txt`, drop this task without building, and continue the loop (the next task will naturally cover the next slice). Do not retry.