@kindgi/cli 0.2.0 → 0.3.0-rc.0

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 (154) hide show
  1. package/README.md +12 -5
  2. package/dist/cli.js +4 -3
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agents.d.ts.map +1 -1
  5. package/dist/commands/agents.js +75 -19
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/approval-wait.d.ts +90 -0
  8. package/dist/commands/approval-wait.d.ts.map +1 -0
  9. package/dist/commands/approval-wait.js +154 -0
  10. package/dist/commands/approval-wait.js.map +1 -0
  11. package/dist/commands/artifacts.d.ts.map +1 -1
  12. package/dist/commands/artifacts.js +131 -14
  13. package/dist/commands/artifacts.js.map +1 -1
  14. package/dist/commands/auth.d.ts.map +1 -1
  15. package/dist/commands/auth.js +48 -5
  16. package/dist/commands/auth.js.map +1 -1
  17. package/dist/commands/deploy.js +7 -3
  18. package/dist/commands/deploy.js.map +1 -1
  19. package/dist/commands/deployments.d.ts.map +1 -1
  20. package/dist/commands/deployments.js +36 -13
  21. package/dist/commands/deployments.js.map +1 -1
  22. package/dist/commands/doctor.d.ts +3 -2
  23. package/dist/commands/doctor.d.ts.map +1 -1
  24. package/dist/commands/doctor.js +47 -14
  25. package/dist/commands/doctor.js.map +1 -1
  26. package/dist/commands/eval-runs.d.ts.map +1 -1
  27. package/dist/commands/eval-runs.js +21 -9
  28. package/dist/commands/eval-runs.js.map +1 -1
  29. package/dist/commands/helpers.d.ts +31 -1
  30. package/dist/commands/helpers.d.ts.map +1 -1
  31. package/dist/commands/helpers.js +45 -2
  32. package/dist/commands/helpers.js.map +1 -1
  33. package/dist/commands/init.js +5 -4
  34. package/dist/commands/init.js.map +1 -1
  35. package/dist/commands/mail-triggers.d.ts.map +1 -1
  36. package/dist/commands/mail-triggers.js +27 -3
  37. package/dist/commands/mail-triggers.js.map +1 -1
  38. package/dist/commands/promote.d.ts.map +1 -1
  39. package/dist/commands/promote.js +133 -11
  40. package/dist/commands/promote.js.map +1 -1
  41. package/dist/commands/provenance.d.ts.map +1 -1
  42. package/dist/commands/provenance.js +13 -5
  43. package/dist/commands/provenance.js.map +1 -1
  44. package/dist/commands/providers.d.ts.map +1 -1
  45. package/dist/commands/providers.js +47 -4
  46. package/dist/commands/providers.js.map +1 -1
  47. package/dist/commands/schedules.d.ts.map +1 -1
  48. package/dist/commands/schedules.js +25 -9
  49. package/dist/commands/schedules.js.map +1 -1
  50. package/dist/commands/skills.d.ts +16 -0
  51. package/dist/commands/skills.d.ts.map +1 -1
  52. package/dist/commands/skills.js +122 -36
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/webhooks.d.ts.map +1 -1
  55. package/dist/commands/webhooks.js +21 -5
  56. package/dist/commands/webhooks.js.map +1 -1
  57. package/dist/config.d.ts +8 -0
  58. package/dist/config.d.ts.map +1 -1
  59. package/dist/config.js +11 -0
  60. package/dist/config.js.map +1 -1
  61. package/dist/context.d.ts +7 -3
  62. package/dist/context.d.ts.map +1 -1
  63. package/dist/context.js +1 -0
  64. package/dist/context.js.map +1 -1
  65. package/dist/dev/runtime-image.d.ts +1 -1
  66. package/dist/dev/runtime-image.d.ts.map +1 -1
  67. package/dist/dev/runtime-image.js +1 -1
  68. package/dist/dev/runtime-image.js.map +1 -1
  69. package/dist/errors.d.ts.map +1 -1
  70. package/dist/errors.js +14 -1
  71. package/dist/errors.js.map +1 -1
  72. package/dist/exports/plan.d.ts.map +1 -1
  73. package/dist/exports/plan.js +50 -0
  74. package/dist/exports/plan.js.map +1 -1
  75. package/dist/init/augment-scaffolder.d.ts +1 -1
  76. package/dist/init/augment-scaffolder.js +9 -8
  77. package/dist/init/augment-scaffolder.js.map +1 -1
  78. package/dist/init/java-augment.d.ts.map +1 -1
  79. package/dist/init/java-augment.js +7 -6
  80. package/dist/init/java-augment.js.map +1 -1
  81. package/dist/init/python-augment.d.ts.map +1 -1
  82. package/dist/init/python-augment.js +7 -6
  83. package/dist/init/python-augment.js.map +1 -1
  84. package/dist/init/scala-augment.js +7 -6
  85. package/dist/init/scala-augment.js.map +1 -1
  86. package/dist/main.d.ts +3 -0
  87. package/dist/main.d.ts.map +1 -1
  88. package/dist/main.js +1 -0
  89. package/dist/main.js.map +1 -1
  90. package/dist/providers/presets/anthropic.json +15 -3
  91. package/dist/providers/presets/azure-openai.json +10 -2
  92. package/dist/providers/presets/bedrock.json +6 -2
  93. package/dist/providers/presets/gemini-api.json +6 -2
  94. package/dist/providers/presets/openai.json +15 -3
  95. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +21 -9
  96. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +5 -3
  97. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +202 -68
  98. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +12 -188
  99. package/dist/sdk-skills/kindgi-authoring-mcp-servers/common-mistakes.md +44 -0
  100. package/dist/sdk-skills/kindgi-authoring-mcp-servers/how-it-works.md +41 -0
  101. package/dist/sdk-skills/kindgi-authoring-mcp-servers/other-clients.md +19 -0
  102. package/dist/sdk-skills/kindgi-authoring-mcp-servers/postgres.md +45 -0
  103. package/dist/sdk-skills/kindgi-authoring-mcp-servers/several-servers.md +32 -0
  104. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +49 -906
  105. package/dist/sdk-skills/kindgi-authoring-providers/bedrock.md +64 -0
  106. package/dist/sdk-skills/kindgi-authoring-providers/common-mistakes.md +125 -0
  107. package/dist/sdk-skills/kindgi-authoring-providers/keys-and-registration.md +58 -0
  108. package/dist/sdk-skills/kindgi-authoring-providers/kindgi-cloud.md +36 -0
  109. package/dist/sdk-skills/kindgi-authoring-providers/path-a-anthropic.md +216 -0
  110. package/dist/sdk-skills/kindgi-authoring-providers/path-b-openai-compat.md +127 -0
  111. package/dist/sdk-skills/kindgi-authoring-providers/path-c-onnx.md +97 -0
  112. package/dist/sdk-skills/kindgi-authoring-providers/path-d-vertex.md +95 -0
  113. package/dist/sdk-skills/kindgi-authoring-providers/router.md +113 -0
  114. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +12 -387
  115. package/dist/sdk-skills/kindgi-authoring-tools/common-mistakes.md +135 -0
  116. package/dist/sdk-skills/kindgi-authoring-tools/declarative-http.md +34 -0
  117. package/dist/sdk-skills/kindgi-authoring-tools/imperative-handler.md +65 -0
  118. package/dist/sdk-skills/kindgi-authoring-tools/iterating-and-testing.md +45 -0
  119. package/dist/sdk-skills/kindgi-authoring-tools/secrets-and-connections.md +79 -0
  120. package/dist/sdk-skills/kindgi-authoring-tools/tool-flags.md +45 -0
  121. package/dist/sdk-skills/kindgi-fix-corrections/SKILL.md +13 -178
  122. package/dist/sdk-skills/kindgi-fix-corrections/make-the-change.md +25 -0
  123. package/dist/sdk-skills/kindgi-fix-corrections/publish-and-promote.md +76 -0
  124. package/dist/sdk-skills/kindgi-fix-corrections/pull-corrections.md +48 -0
  125. package/dist/sdk-skills/kindgi-fix-corrections/worked-example.md +27 -0
  126. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +10 -180
  127. package/dist/sdk-skills/kindgi-framework-feedback/common-mistakes.md +19 -0
  128. package/dist/sdk-skills/kindgi-framework-feedback/editing-feedback-file.md +33 -0
  129. package/dist/sdk-skills/kindgi-framework-feedback/fields-and-entry-shape.md +53 -0
  130. package/dist/sdk-skills/kindgi-framework-feedback/hearing-back.md +24 -0
  131. package/dist/sdk-skills/kindgi-framework-feedback/sending.md +50 -0
  132. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +24 -21
  133. package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +12 -4
  134. package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +6 -4
  135. package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +33 -23
  136. package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +19 -12
  137. package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +16 -16
  138. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +18 -6
  139. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +6 -4
  140. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +39 -30
  141. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +19 -9
  142. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +24 -21
  143. package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +12 -4
  144. package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +6 -4
  145. package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +34 -23
  146. package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +15 -9
  147. package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +16 -16
  148. package/dist/sdk-skills/kindgi-using/SKILL.md +11 -11
  149. package/dist/templates/sample/README.md.tmpl +8 -7
  150. package/dist/templates/sample/agents/echo-agent/index.ts.tmpl +1 -1
  151. package/dist/templates/sample/kindgi.config.ts.tmpl +1 -1
  152. package/dist/templates/sample/package.json.tmpl +1 -1
  153. package/dist/templates/woocommerce/README.md.tmpl +9 -3
  154. package/package.json +13 -13
@@ -17,8 +17,8 @@ description: >
17
17
  session, or to take one back.
18
18
  type: core
19
19
  library: "@kindgi/sdk"
20
- version: "0.4.4"
21
- sdk_version: "0.2.0"
20
+ version: "0.5.0"
21
+ sdk_version: "0.3.0-rc.0"
22
22
  pack_languages: [node, python, java, scala]
23
23
  ---
24
24
 
@@ -105,185 +105,15 @@ The entry lands as a new `## <title>` section appended to
105
105
  `FEEDBACK.md`, stamped with a fresh `id: YYYY-MM-DD.N`. The file is
106
106
  created with a header if it doesn't yet exist.
107
107
 
108
- ## Sending it to Kindgi: only with the person's yes
108
+ ## Your case: read this file
109
109
 
110
- `FEEDBACK.md` stays in the pack until the person decides to send it.
111
- `kindgi feedback submit` sends entries to Kindgi's private intake on
112
- access.kindgi.com. Only Kindgi's maintainers read reports there. They're
113
- kept 90 days, and the person can take one back at any time.
114
-
115
- **Never send on your own.** Every time:
116
-
117
- 1. **Preview.** Run `kindgi feedback submit --preview`, or name entries by
118
- id or hash: `kindgi feedback submit 2026-09-25.3 --preview`. With none
119
- named it takes every entry not sent yet and not marked fixed. It prints
120
- exactly what would be sent, after redaction, and its `digest`. Nothing
121
- is sent.
122
- 2. **Show the person.** Show them each entry's title and body as they'll
123
- go, and the environment sent with them: the OS, Node and CLI versions,
124
- the pack's language, and `kindgi doctor`'s checks as id and status
125
- only. Point out anything redaction missed, like a customer's name or an
126
- internal host name. If something shouldn't go, edit the entry in
127
- `FEEDBACK.md` and preview again.
128
- 3. **Ask, then send.** Ask "Send this to Kindgi?" Only after a clear yes,
129
- run the same command with `--yes=<digest>` in place of `--preview`. If
130
- anything changed since the preview, it refuses: preview and ask again.
131
-
132
- If `submit` says "Kindgi may have received it" (the answer was lost, came
133
- too late, or couldn't be read), tell the person, and don't send again on
134
- your own: a second send makes a second report, and one that arrived can't
135
- be withdrawn from this machine. Let them decide.
136
-
137
- What redaction takes out before the preview:
138
- - the home directory alone becomes `~`, and paths in the pack become `./…`;
139
- - other absolute paths become `[path]`, a path under `~` too;
140
- - values from the pack's `.env*` files and `.kindgi/secrets.env` become
141
- `[redacted]`;
142
- - private keys and token shapes become `[redacted]` (a Kindgi token keeps
143
- its prefix and last four characters);
144
- - a URL keeps its host and path but loses its user info and query values;
145
- - email addresses become `[email]`.
146
-
147
- It can't catch everything in free text: the preview is the check.
148
-
149
- Once sent, each entry gets a line like
150
- `- **submitted:** 2026-09-25T15:02:11.000Z · **report:** fbr_…`. The
151
- report id isn't a secret, so `FEEDBACK.md` can still be committed. The key
152
- that takes a report back is kept in `~/.kindgi/feedback/keys.json` on this
153
- machine and is never printed. Don't read or copy that file.
154
-
155
- If `KINDGI_FEEDBACK_SUBMIT=off` is set, `submit` refuses. That's the
156
- person's or their team's choice, so don't work around it. `write`,
157
- `status` and `withdraw` still work.
158
-
159
- ## Hearing back
160
-
161
- At the start of a session, when `FEEDBACK.md` has submitted entries, run
162
- `kindgi feedback status`. It asks about each report at most once a day,
163
- and never again once it's fixed, won't be fixed, or was withdrawn, or once
164
- the intake doesn't have it (past its 90 days) unless it's named. A fixed
165
- entry gets `> **Fixed:** in <version> (report fbr_…)` under its heading.
166
- Tell the person what changed:
167
- - **fixed**, with the version: suggest upgrading to it;
168
- - **known**, with the public issue when there is one;
169
- - **won't fix**, with the one-line reason.
170
-
171
- Name an entry or a report id (`kindgi feedback status 2026-09-25.3`) to
172
- ask about it now. A teammate's report id works too: it isn't a secret.
173
-
174
- ## Taking one back
175
-
176
- When the person asks to withdraw a report, run
177
- `kindgi feedback withdraw <id|hash|reportId>`. The intake clears its text
178
- at once, and the entry's line gets `· **withdrawn:** <date>`. It needs the
179
- key on the machine that sent the report. A withdrawn entry isn't sent again
180
- unless the person names it in `submit`.
181
-
182
- ## Entry shape (what the CLI produces)
183
-
184
- ```md
185
- ## preferredProvider silently dropped by wire schema
186
-
187
- - **id:** 2026-09-25.3
188
- - **hash:** feedback-a3f2c1d0
189
- - **kind:** bug
190
- - **severity:** high
191
- - **date:** 2026-09-25T14:32:07.104Z
192
- - **sdk:** 0.1.2 · **cli:** 0.1.2 · **by:** claude-code
193
-
194
- ### Summary
195
- One-line: what the report is about.
196
-
197
- ### Observed
198
- What happened, with file:line pointers when possible.
199
-
200
- ### Expected
201
- What should have happened.
202
-
203
- ### Reproducer
204
- Exact commands, spec files, output.
205
-
206
- ### Suggested fix
207
- Optional; leave blank if you don't have one.
208
-
209
- ---
210
- ```
211
-
212
- ## Editing FEEDBACK.md directly
213
-
214
- Entries are referenced locally by their `id` (e.g. `2026-09-25.3`)
215
- or by their title; across packs (or between peers) they are referenced
216
- by their `hash` (e.g. `feedback-a3f2c1d0`). When the pack author says
217
- something like:
218
-
219
- - **"Remove 2026-09-25.3"** / **"Remove the preferredProvider
220
- entry"** → find the section whose `id` matches (or whose `##
221
- <title>` matches), delete from the header down through the next
222
- `---` separator (inclusive). Do NOT renumber other entries — ids
223
- are historical identifiers, gaps are expected.
224
- - **"Mark 2026-09-25.3 fixed"** / **"That preferredProvider one
225
- landed in commit abc123"** → find the section, insert a line
226
- right after the header:
227
- ```md
228
- > **Fixed:** landed in commit abc123 (2026-09-25). <optional context>
229
- ```
230
- - **"Note that 2026-09-25.5 is a duplicate of feedback-a3f2c1d0"** /
231
- **"Merge these — same hash"** → find the section, insert:
232
- ```md
233
- > **Duplicate of:** feedback-a3f2c1d0 (<optional context>)
234
- ```
235
- Prefer the `hash` when the duplicate lives in another pack (peer /
236
- framework side); prefer the `id` when it's a local duplicate.
237
- - **Restructuring / re-ordering** → use the Edit tool to move the
238
- section; keep the header + `- **id:** …` + `- **hash:** …` lines
239
- intact so both identifiers stay stable.
240
-
241
- Do NOT try to re-file the same item through `kindgi feedback write`
242
- — that would create a new entry with a new id (though the hash
243
- would match, which is exactly the p2p-dedup signal). Always edit
244
- directly for maintenance operations within one pack.
245
-
246
- ## Fields to fill precisely
247
-
248
- - **`kind`** — honest classification.
249
- - `bug` — the framework did the wrong thing (crashed, silently
250
- dropped a field, contradicted its own docs).
251
- - `friction` — the framework did the "right" thing but the UX cost
252
- more time than the task warranted.
253
- - `question` — you don't understand something and the docs don't
254
- answer it.
255
- - `design` — you observed something that works as designed but the
256
- design might be wrong.
257
-
258
- - **`severity`** — honest impact.
259
- - `blocker` — nothing useful can happen until this is fixed.
260
- - `high` — a common workflow is broken; users will hit this.
261
- - `medium` — real friction, but there's a documented workaround.
262
- - `low` — cosmetic, tiny annoyance, or affects one obscure path.
263
-
264
- - **`authored_by`** — `claude-code` when the diagnostic came entirely
265
- from an AI coding assistant; `human` when the pack author wrote
266
- it; `mixed` when it's a combination.
267
-
268
- ## Common mistakes
269
-
270
- 1. **File-path-only entries** ("bug in router.ts").
271
- Without a reproducer + expected behavior, the maintainer has to
272
- reverse-engineer your session. File:line is necessary but not
273
- sufficient.
274
- 2. **Skipping "Suggested fix" when you have one.** If you diagnosed
275
- the root cause, name it. "Add `preferredProvider` to `AgentSchema`
276
- in `packages/api/src/openapi/schemas.ts:667`" is worth a dozen
277
- back-and-forth clarifications.
278
- 3. **Bundling multiple bugs into one entry.** Run `kindgi feedback
279
- write` once per bug. Each gets its own number, its own fix
280
- status, its own removal path.
281
- 4. **Sensitive state in reproducers.** Reproducer sections sometimes
282
- contain API keys, tenant IDs, secrets — review before committing,
283
- and read the preview before anyone says yes to sending.
284
- 5. **Filing "the way I'd design it" as a bug.** Design disagreements
285
- are `--kind=design`, not `--kind=bug`. Both are welcome; the
286
- classification helps prioritization.
110
+ | Your case | Read |
111
+ |---|---|
112
+ | Filling `kind`, `severity` and `authored_by`, and what an entry looks like | [fields-and-entry-shape.md](fields-and-entry-shape.md) |
113
+ | Sending entries to Kindgi: never without the person's yes to the preview | [sending.md](sending.md) |
114
+ | What became of sent reports, at the start of a session, or taking one back | [hearing-back.md](hearing-back.md) |
115
+ | Removing, marking fixed, marking a duplicate or re-ordering entries in `FEEDBACK.md` | [editing-feedback-file.md](editing-feedback-file.md) |
116
+ | Before you file: what makes a report hard to act on | [common-mistakes.md](common-mistakes.md) |
287
117
 
288
118
  ## References
289
119
 
@@ -0,0 +1,19 @@
1
+ # Common mistakes
2
+
3
+ 1. **File-path-only entries** ("bug in router.ts").
4
+ Without a reproducer + expected behavior, the maintainer has to
5
+ reverse-engineer your session. File:line is necessary but not
6
+ sufficient.
7
+ 2. **Skipping "Suggested fix" when you have one.** If you diagnosed
8
+ the root cause, name it. "Add `preferredProvider` to `AgentSchema`
9
+ in `packages/api/src/openapi/schemas.ts:667`" is worth a dozen
10
+ back-and-forth clarifications.
11
+ 3. **Bundling multiple bugs into one entry.** Run `kindgi feedback
12
+ write` once per bug. Each gets its own number, its own fix
13
+ status, its own removal path.
14
+ 4. **Sensitive state in reproducers.** Reproducer sections sometimes
15
+ contain API keys, tenant IDs, secrets — review before committing,
16
+ and read the preview before anyone says yes to sending.
17
+ 5. **Filing "the way I'd design it" as a bug.** Design disagreements
18
+ are `--kind=design`, not `--kind=bug`. Both are welcome; the
19
+ classification helps prioritization.
@@ -0,0 +1,33 @@
1
+ # Editing FEEDBACK.md directly
2
+
3
+ Entries are referenced locally by their `id` (e.g. `2026-09-25.3`)
4
+ or by their title; across packs (or between peers) they are referenced
5
+ by their `hash` (e.g. `feedback-a3f2c1d0`). When the pack author says
6
+ something like:
7
+
8
+ - **"Remove 2026-09-25.3"** / **"Remove the preferredProvider
9
+ entry"** → find the section whose `id` matches (or whose `##
10
+ <title>` matches), delete from the header down through the next
11
+ `---` separator (inclusive). Do NOT renumber other entries — ids
12
+ are historical identifiers, gaps are expected.
13
+ - **"Mark 2026-09-25.3 fixed"** / **"That preferredProvider one
14
+ landed in commit abc123"** → find the section, insert a line
15
+ right after the header:
16
+ ```md
17
+ > **Fixed:** landed in commit abc123 (2026-09-25). <optional context>
18
+ ```
19
+ - **"Note that 2026-09-25.5 is a duplicate of feedback-a3f2c1d0"** /
20
+ **"Merge these — same hash"** → find the section, insert:
21
+ ```md
22
+ > **Duplicate of:** feedback-a3f2c1d0 (<optional context>)
23
+ ```
24
+ Prefer the `hash` when the duplicate lives in another pack (peer /
25
+ framework side); prefer the `id` when it's a local duplicate.
26
+ - **Restructuring / re-ordering** → use the Edit tool to move the
27
+ section; keep the header + `- **id:** …` + `- **hash:** …` lines
28
+ intact so both identifiers stay stable.
29
+
30
+ Do NOT try to re-file the same item through `kindgi feedback write`
31
+ — that would create a new entry with a new id (though the hash
32
+ would match, which is exactly the p2p-dedup signal). Always edit
33
+ directly for maintenance operations within one pack.
@@ -0,0 +1,53 @@
1
+ # An entry: the fields to fill, and its shape
2
+
3
+ ## Fields to fill precisely
4
+
5
+ - **`kind`** — honest classification.
6
+ - `bug` — the framework did the wrong thing (crashed, silently
7
+ dropped a field, contradicted its own docs).
8
+ - `friction` — the framework did the "right" thing but the UX cost
9
+ more time than the task warranted.
10
+ - `question` — you don't understand something and the docs don't
11
+ answer it.
12
+ - `design` — you observed something that works as designed but the
13
+ design might be wrong.
14
+
15
+ - **`severity`** — honest impact.
16
+ - `blocker` — nothing useful can happen until this is fixed.
17
+ - `high` — a common workflow is broken; users will hit this.
18
+ - `medium` — real friction, but there's a documented workaround.
19
+ - `low` — cosmetic, tiny annoyance, or affects one obscure path.
20
+
21
+ - **`authored_by`** — `claude-code` when the diagnostic came entirely
22
+ from an AI coding assistant; `human` when the pack author wrote
23
+ it; `mixed` when it's a combination.
24
+
25
+ ## Entry shape (what the CLI produces)
26
+
27
+ ```md
28
+ ## preferredProvider silently dropped by wire schema
29
+
30
+ - **id:** 2026-09-25.3
31
+ - **hash:** feedback-a3f2c1d0
32
+ - **kind:** bug
33
+ - **severity:** high
34
+ - **date:** 2026-09-25T14:32:07.104Z
35
+ - **sdk:** 0.1.2 · **cli:** 0.1.2 · **by:** claude-code
36
+
37
+ ### Summary
38
+ One-line: what the report is about.
39
+
40
+ ### Observed
41
+ What happened, with file:line pointers when possible.
42
+
43
+ ### Expected
44
+ What should have happened.
45
+
46
+ ### Reproducer
47
+ Exact commands, spec files, output.
48
+
49
+ ### Suggested fix
50
+ Optional; leave blank if you don't have one.
51
+
52
+ ---
53
+ ```
@@ -0,0 +1,24 @@
1
+ # Hearing back, and taking one back
2
+
3
+ ## Hearing back
4
+
5
+ At the start of a session, when `FEEDBACK.md` has submitted entries, run
6
+ `kindgi feedback status`. It asks about each report at most once a day,
7
+ and never again once it's fixed, won't be fixed, or was withdrawn, or once
8
+ the intake doesn't have it (past its 90 days) unless it's named. A fixed
9
+ entry gets `> **Fixed:** in <version> (report fbr_…)` under its heading.
10
+ Tell the person what changed:
11
+ - **fixed**, with the version: suggest upgrading to it;
12
+ - **known**, with the public issue when there is one;
13
+ - **won't fix**, with the one-line reason.
14
+
15
+ Name an entry or a report id (`kindgi feedback status 2026-09-25.3`) to
16
+ ask about it now. A teammate's report id works too: it isn't a secret.
17
+
18
+ ## Taking one back
19
+
20
+ When the person asks to withdraw a report, run
21
+ `kindgi feedback withdraw <id|hash|reportId>`. The intake clears its text
22
+ at once, and the entry's line gets `· **withdrawn:** <date>`. It needs the
23
+ key on the machine that sent the report. A withdrawn entry isn't sent again
24
+ unless the person names it in `submit`.
@@ -0,0 +1,50 @@
1
+ # Sending it to Kindgi: only with the person's yes
2
+
3
+ `FEEDBACK.md` stays in the pack until the person decides to send it.
4
+ `kindgi feedback submit` sends entries to Kindgi's private intake on
5
+ access.kindgi.com. Only Kindgi's maintainers read reports there. They're
6
+ kept 90 days, and the person can take one back at any time.
7
+
8
+ **Never send on your own.** Every time:
9
+
10
+ 1. **Preview.** Run `kindgi feedback submit --preview`, or name entries by
11
+ id or hash: `kindgi feedback submit 2026-09-25.3 --preview`. With none
12
+ named it takes every entry not sent yet and not marked fixed. It prints
13
+ exactly what would be sent, after redaction, and its `digest`. Nothing
14
+ is sent.
15
+ 2. **Show the person.** Show them each entry's title and body as they'll
16
+ go, and the environment sent with them: the OS, Node and CLI versions,
17
+ the pack's language, and `kindgi doctor`'s checks as id and status
18
+ only. Point out anything redaction missed, like a customer's name or an
19
+ internal host name. If something shouldn't go, edit the entry in
20
+ `FEEDBACK.md` and preview again.
21
+ 3. **Ask, then send.** Ask "Send this to Kindgi?" Only after a clear yes,
22
+ run the same command with `--yes=<digest>` in place of `--preview`. If
23
+ anything changed since the preview, it refuses: preview and ask again.
24
+
25
+ If `submit` says "Kindgi may have received it" (the answer was lost, came
26
+ too late, or couldn't be read), tell the person, and don't send again on
27
+ your own: a second send makes a second report, and one that arrived can't
28
+ be withdrawn from this machine. Let them decide.
29
+
30
+ What redaction takes out before the preview:
31
+ - the home directory alone becomes `~`, and paths in the pack become `./…`;
32
+ - other absolute paths become `[path]`, a path under `~` too;
33
+ - values from the pack's `.env*` files and `.kindgi/secrets.env` become
34
+ `[redacted]`;
35
+ - private keys and token shapes become `[redacted]` (a Kindgi token keeps
36
+ its prefix and last four characters);
37
+ - a URL keeps its host and path but loses its user info and query values;
38
+ - email addresses become `[email]`.
39
+
40
+ It can't catch everything in free text: the preview is the check.
41
+
42
+ Once sent, each entry gets a line like
43
+ `- **submitted:** 2026-09-25T15:02:11.000Z · **report:** fbr_…`. The
44
+ report id isn't a secret, so `FEEDBACK.md` can still be committed. The key
45
+ that takes a report back is kept in `~/.kindgi/feedback/keys.json` on this
46
+ machine and is never printed. Don't read or copy that file.
47
+
48
+ If `KINDGI_FEEDBACK_SUBMIT=off` is set, `submit` refuses. That's the
49
+ person's or their team's choice, so don't work around it. `write`,
50
+ `status` and `withdraw` still work.
@@ -16,8 +16,8 @@ description: >
16
16
  primitive.
17
17
  type: core
18
18
  library: "@kindgi/sdk"
19
- version: "0.3.16"
20
- sdk_version: "0.2.0"
19
+ version: "0.3.19"
20
+ sdk_version: "0.3.0-rc.0"
21
21
  pack_languages: [node]
22
22
  ---
23
23
 
@@ -287,10 +287,13 @@ const run = await kindgi.runs.start({
287
287
  (`GET /v1/runs/{runId}`); status and timing only: `kindgi.runs.progress(runId)`.
288
288
  - **The audit, step by step:** `kindgi.runs.journal(runId)`
289
289
  (`GET /v1/runs/{runId}/journal`).
290
- - **Where an agent's answer came from:** `kindgi.provenance.get(runId)`
291
- (`GET /v1/provenance/{runId}`). A flow run has none of its own: each agent
292
- step's `step.completed` entry in the flow's journal names its turn's run
293
- (`payload.output.runId`).
290
+ - **Where an answer came from:** `kindgi.provenance.get(runId)`
291
+ (`GET /v1/provenance/{runId}`). An agent turn's record has its model and
292
+ tool calls. A finished flow run has its own record: a `step` node per step
293
+ (`step:<nodeId>`, a loop's iterations `step:<nodeId>@<loop>#<i>`) with the
294
+ `runs` it started, and `stepUsage`, its model usage per step. Until it's
295
+ written, the not-found error's `fields.recordState` is `being-written` (or
296
+ `failed`).
294
297
  - **What it cost:** `kindgi.cost.usage.query({ rootRunId: runId })`
295
298
  (`GET /v1/cost/records?rootRunId={runId}`): `.data`, one record per model
296
299
  call, with its `model`, `usage` (`promptTokens`, `completionTokens`) and
@@ -321,7 +324,7 @@ const month = await kindgi.cost.usage.summary({
321
324
  // month.totalUsd; month.groups[i].key ({ month: '2026-10' }), .totalUsd, .tokens
322
325
  ```
323
326
 
324
- Docs: https://docs.kindgi.com/v0.2/guides/observability/cost-per-run/
327
+ Docs: https://docs.kindgi.com/v0.3/guides/observability/cost-per-run/
325
328
 
326
329
  Show it in the app's own UI. **Never:**
327
330
 
@@ -332,7 +335,7 @@ Show it in the app's own UI. **Never:**
332
335
  - **link users to Kindgi's console** or any Kindgi UI for this data.
333
336
 
334
337
  To keep a copy (reporting, search), pull it through the API into the app's
335
- own tables. Docs: https://docs.kindgi.com/v0.2/guides/runs/show-runs-in-your-app/
338
+ own tables. Docs: https://docs.kindgi.com/v0.3/guides/runs/show-runs-in-your-app/
336
339
 
337
340
  ## Upgrading a deployment
338
341
 
@@ -342,22 +345,22 @@ doesn't have yet, then serving. Migrations only go forward: an upgrade
342
345
  starts with a backup of the database, and going back means restoring it and
343
346
  running the older version on it.
344
347
 
345
- - **On Cloud Run, a small dev deployment** (`network_mode = "none"`, on
346
- runtime 0.1.8 or later): the Cloud Run module's `./upgrade.sh`, as of the
347
- `@kindgi/sdk@<version>` tag of the release you're upgrading to, since it
348
- knows the steps up to its own release. Run `./upgrade.sh --dry-run` first:
349
- it changes nothing, and lists what a real run would change. Its plan also
350
- reads every `*.auto.tfvars.json` in the module's folder (the pack's env),
351
- and `yes` applies exactly the saved plan it showed. The module README's
352
- Upgrading section has the rest:
348
+ - **On Cloud Run, a deployment of the module** (on runtime 0.1.8 or later,
349
+ in any `network_mode`; before the `@kindgi/sdk@0.3.0` tag, `"none"` only):
350
+ the module's `./upgrade.sh`, as of the `@kindgi/sdk@<version>` tag of the
351
+ release you're upgrading to, since it knows the steps up to its own
352
+ release. It takes a `--var-file` for each file the deployment's variables
353
+ are in. Run `./upgrade.sh --dry-run` first: it changes nothing, and lists
354
+ what a real run would change. A real run's `yes` applies exactly the
355
+ saved plan it showed. The module README's Upgrading section has the rest:
353
356
  https://github.com/kindgi/kindgi-sdk/tree/main/deploy/gcp-cloud-run#upgrading
354
357
  - **Any other Cloud Run deployment:** by hand, staging first, as the Cloud
355
358
  Run page's "Upgrade by hand" section says:
356
- https://docs.kindgi.com/v0.2/deploy/self-hosted/cloud-run/#upgrade-by-hand
357
- - **On Azure Container Apps:** the "Operate it" section of its page,
358
- https://docs.kindgi.com/v0.2/deploy/self-hosted/azure-container-apps/#operate-it.
359
- - **Otherwise:** the operate page's upgrade steps,
360
- https://docs.kindgi.com/v0.2/deploy/self-hosted/operate/#upgrade-the-runtime.
359
+ https://docs.kindgi.com/v0.3/deploy/self-hosted/cloud-run/#upgrade-by-hand
360
+ - **On Azure Container Apps:** the "Operate it" section of its page:
361
+ https://docs.kindgi.com/v0.3/deploy/self-hosted/azure-container-apps/#operate-it
362
+ - **Otherwise:** the operate page's upgrade steps:
363
+ https://docs.kindgi.com/v0.3/deploy/self-hosted/operate/#upgrade-the-runtime
361
364
 
362
365
  An upgrade changes a running deployment: give the person the commands to run
363
366
  in their own terminal (`./upgrade.sh` waits for them to type `yes`).
@@ -15,8 +15,8 @@ description: >
15
15
  kindgi-authoring-providers.
16
16
  type: core
17
17
  library: "kindgi-pack (Java)"
18
- version: "0.1.4"
19
- sdk_version: "0.2.0"
18
+ version: "0.1.5"
19
+ sdk_version: "0.3.0-rc.0"
20
20
  pack_languages: [java]
21
21
  sources:
22
22
  - sdks/java/kindgi-pack/README.md
@@ -134,8 +134,10 @@ public final class BriefWriter {
134
134
  **`tool(id, range)`** is a tool of another pack, with a semver **range**
135
135
  (`"^1.0.0"`); the highest active matching version is picked at turn
136
136
  start. An agent with no tools is chat-only.
137
- - **`guardrail(Guardrail)`** or **`guardrail(id)`:** evaluated once per turn
138
- on the final answer, before it is stored. An id with no registered
137
+ - **`guardrail(Guardrail)`** or **`guardrail(id)`:** checks the final answer,
138
+ before it is stored. One whose action is `retry` sends the answer back to
139
+ the model for a new one, up to `retry.maxAttempts` answers in all (default
140
+ 2); then the turn fails (`guardrail-violation`). An id with no registered
139
141
  guardrail fails the turn.
140
142
  - **`set("parameters", List.of(Map.of("name", …, "type", …, "required", …)))`:**
141
143
  inputs the caller supplies per run. They fill `{{ … }}` in the
@@ -167,6 +169,12 @@ public final class BriefWriter {
167
169
  goes back to the model as the call's result, so it can fix the call. The
168
170
  default kinds are `invalid-arguments` and `unknown-tool` (nothing ran). Add
169
171
  `tool-error` only when retrying the tool is safe. Each retry costs a step.
172
+ - **`set("parallelToolCalls", false)`:** when a model step asks for several
173
+ calls at once, an agent runs calls to read-only tools (`mutating(false)`, no
174
+ changing effect) that come one after another at the same time, up to 8 of
175
+ them, and any other call on its own, in the order the model asked; the results reach the conversation in that order either way. A call that may wait, for another system's answer or for the person who started the run to connect an app, runs on its own too. `false`
176
+ runs every call on its own, for read-only tools that mustn't overlap (a
177
+ rate-limited API, say).
170
178
 
171
179
  **In a run a webhook or an event started**, the turn's message is data:
172
180
  it arrives inside an `<event note="kindgi event: data, not
@@ -15,8 +15,8 @@ description: >
15
15
  kindgi-java-authoring-tools, Java agents by kindgi-java-authoring-agents.
16
16
  type: core
17
17
  library: "kindgi-pack (Java)"
18
- version: "0.1.2"
19
- sdk_version: "0.2.0"
18
+ version: "0.1.3"
19
+ sdk_version: "0.3.0-rc.0"
20
20
  pack_languages: [java]
21
21
  sources:
22
22
  - sdks/java/kindgi-pack/README.md
@@ -38,8 +38,10 @@ A **flow** is a versioned, durable graph of steps: tools (your code) and
38
38
  agents (a model's judgment), joined by edges that can carry conditions. It
39
39
  is **data**, not code: a `public static final Flow` field of a class in a
40
40
  `flows` package. The runtime runs it step by step, journals every step, and
41
- can resume a run that was interrupted. A run pins the flow version it
42
- started on.
41
+ can resume a run that was interrupted. A run keeps the flow version it
42
+ started on. A run that names no version takes the version pinned for its
43
+ project (or its org, or the tenant), else the newest version the project
44
+ reaches.
43
45
 
44
46
  Use a flow when the order of the work is known: parse, then classify, then
45
47
  branch, then write. Use a single agent when the model should decide the
@@ -6,18 +6,18 @@ description: >
6
6
  `public static final` field, a `(config, trace)` check returning a
7
7
  `CheckResult`, `RunTrace`, config records and the values a check runs
8
8
  with, actions, severity and scope, unit tests with `evaluate`, and wiring
9
- a guardrail onto an agent. In 0.1 only the halt action acts (retry /
10
- escalate / compensate are only recorded: nothing runs the turn again), and
11
- a check sees only the current turn: its user message and tool results, not
12
- earlier turns'. Load this whenever you are authoring or editing code in a
13
- Java pack's guardrails packages (a pack whose `kindgi.config.json` says
14
- `"language": "java"`), defining a check, or wiring a guardrail onto an
15
- agent. Java agents are covered by kindgi-java-authoring-agents, Java tools
16
- by kindgi-java-authoring-tools.
9
+ a guardrail onto an agent. halt fails the turn and retry sends the answer
10
+ back to the model for a new one (escalate / compensate are only recorded
11
+ in 0.1), and a check sees only the current turn: its user message and tool
12
+ results, not earlier turns'. Load this whenever you are authoring or
13
+ editing code in a Java pack's guardrails packages (a pack whose
14
+ `kindgi.config.json` says `"language": "java"`), defining a check, or
15
+ wiring a guardrail onto an agent. Java agents are covered by
16
+ kindgi-java-authoring-agents, Java tools by kindgi-java-authoring-tools.
17
17
  type: core
18
18
  library: "kindgi-pack (Java)"
19
- version: "0.1.2"
20
- sdk_version: "0.2.0"
19
+ version: "0.1.4"
20
+ sdk_version: "0.3.0-rc.0"
21
21
  pack_languages: [java]
22
22
  sources:
23
23
  - sdks/java/kindgi-pack/README.md
@@ -42,6 +42,8 @@ class in a `guardrails` package. For an agent turn, the runtime evaluates
42
42
  every guardrail the agent lists once, on the final answer, before it is
43
43
  stored.
44
44
 
45
+ `Guardrail.define` has no field for the other points a guardrail can run at (`at`, and a check's `points`), so a Java guardrail runs at the final answer only; the points are documented at https://docs.kindgi.com/v0.3/guides/guardrails/configure-a-guardrail/#where-in-the-turn-it-runs.
46
+
45
47
  Ask what the rule should catch before writing one. The sample
46
48
  `response-not-empty` guardrail is a demonstration, not a template.
47
49
 
@@ -50,14 +52,20 @@ Ask what the rule should catch before writing one. The sample
50
52
  Read this before you plan a guardrail. Three limits decide what can be
51
53
  built:
52
54
 
53
- - **Only `halt` acts.** A failed `halt` guardrail fails the turn with
54
- `guardrail-violation`, and the answer is not stored. `retry`, `escalate`
55
- and `compensate` are recorded on the turn's violations, as `log-only`
56
- is, and the turn completes: nothing runs the turn again, escalates or
57
- calls a compensating tool. So "block the reply and make the agent try
58
- again" can't be a guardrail. Use `halt`: the error names the guardrail
59
- and the check's reason, and the message is sent again (by the person, or
60
- by your app when it gets `guardrail-violation`).
55
+ - **`halt` and `retry` act.** A failed `halt` guardrail fails the turn with
56
+ `guardrail-violation`, and the answer is not stored. A failed `retry`
57
+ guardrail sends the answer back to the model, with the check's reason in a
58
+ user message, for a new one; the failed answer isn't stored. When it has
59
+ failed `retry.maxAttempts` answers (the first one included; 2 when left
60
+ out), the turn fails with `guardrail-violation` and
61
+ `details.attempts`. Each new answer is a model call that the agent's
62
+ `budget.maxSteps` counts. The `halt` and `retry` guardrails judge each
63
+ answer, a judge's calls included, which `budget.maxCostUsd` doesn't count;
64
+ the others judge only the answer that's sent. A new answer can call tools
65
+ again, side-effecting ones included, with approvals as usual. `escalate`
66
+ and `compensate` are recorded on the turn's violations, as `log-only` is,
67
+ and the turn completes: nothing escalates or calls a compensating tool. So
68
+ "block the reply and make the agent try again" is a `retry` guardrail.
61
69
  - **A check sees one turn.** The trace holds the current turn only: its
62
70
  user message (`trace.userInput()`), its tool calls and their results
63
71
  (`toolCalls()`, `toolResults()`) and its answer (`output()`). Earlier
@@ -155,11 +163,12 @@ public final class Citations {
155
163
  builder refuses a check with neither.
156
164
  - In an agent turn, a failed `halt` guardrail fails the turn
157
165
  (`guardrail-violation`), and the answer is not stored.
166
+ - A failed `retry` guardrail sends the answer back for a new one, up to
167
+ its `maxAttempts` answers (above).
158
168
  - Any other action reports the failure in the turn result's `violations`,
159
169
  and the turn completes.
160
- - In 0.1 the runtime acts only on `halt`: `retry`, `escalate` and
161
- `compensate` are recorded on the violation, with no second attempt,
162
- escalation or compensating call.
170
+ - `escalate` and `compensate` are recorded on the violation, with no
171
+ escalation or compensating call in 0.1.
163
172
  - **`severity`:** `info`, `warn`, `error` (default) or `critical`. It's
164
173
  independent of the action: dashboards group by severity, and execution
165
174
  follows the action.
@@ -229,8 +238,9 @@ no registered guardrail fails the turn before the model is called
229
238
  2. **`set("config", …)` keyed by Java names.** It's keyed like the wire: the
230
239
  record's Jackson names.
231
240
  3. **No `onViolation` or `action`.** The builder refuses the check.
232
- 4. **Expecting another attempt.** `halt` stops the turn, and in 0.1 `retry`
233
- doesn't run the turn again: it's only recorded.
241
+ 4. **Expecting `halt` to try again.** `halt` stops the turn; `retry` asks
242
+ the model for a new answer, and fails the turn once its `maxAttempts`
243
+ answers have failed.
234
244
  5. **Calling a model from the check.** That isn't available: keep checks
235
245
  pure.
236
246
  6. **Throwing for a broken rule.** Return `CheckResult.fail(…)`. An