specverb runtime primitives: query params, array bodies, --body-file, fixed-body state toggles #127

Closed
opened 2026-06-10 17:53:27 +00:00 by coilysiren · 0 comments
Owner

What

Four runtime primitives in the specverb engine, the foundation the ward forgejo-surface migration (coilyco-flight-deck/ward#73, coilyco-flight-deck/ward#75) is blocked on:

  • Scalar query params promote to typed flags and encode into the URL (list filtering and pagination - the coily pain in coilyco-bridge/coily#201).
  • Array-of-scalar body fields promote to repeatable slice flags (--assignees a --assignees b -> ["a","b"]); previously skipped silently, which would have dropped issueCreate's assignees/labels.
  • --body-file supplies the whole JSON body, mutually exclusive with body flags - the gate-safe spill (file contents bypass the metachar gate, the path does not). Required-field enforcement moves from the CLI layer to request assembly so either source satisfies it.
  • Fixed-body state toggles - can close issues mounts a leaf PATCHing exactly {"state":"closed"} with no body flags, declared in the expansion table.

Plus a fail-closed flag-collision gate (spec input shadowing --dry-run/--query/--output/--body-file refuses to build), and the issues group rows (get/view/list/create/edit/comment/close/reopen/delete) + milestone close/reopen as the consuming surface.

Out of scope (named follow-ups in docs/specverb.md)

  • name->id resolution (issue label add/remove)
  • multipart POST (release upload-asset)
## What Four runtime primitives in the specverb engine, the foundation the ward forgejo-surface migration (https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/73, https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/75) is blocked on: * **Scalar query params** promote to typed flags and encode into the URL (list filtering and pagination - the coily pain in https://forgejo.coilysiren.me/coilyco-bridge/coily/issues/201). * **Array-of-scalar body fields** promote to repeatable slice flags (`--assignees a --assignees b` -> `["a","b"]`); previously skipped silently, which would have dropped issueCreate's assignees/labels. * **`--body-file`** supplies the whole JSON body, mutually exclusive with body flags - the gate-safe spill (file contents bypass the metachar gate, the path does not). Required-field enforcement moves from the CLI layer to request assembly so either source satisfies it. * **Fixed-body state toggles** - `can close issues` mounts a leaf PATCHing exactly `{"state":"closed"}` with no body flags, declared in the expansion table. Plus a fail-closed flag-collision gate (spec input shadowing --dry-run/--query/--output/--body-file refuses to build), and the issues group rows (get/view/list/create/edit/comment/close/reopen/delete) + milestone close/reopen as the consuming surface. ## Out of scope (named follow-ups in docs/specverb.md) * name->id resolution (issue label add/remove) * multipart POST (release upload-asset)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-flight-deck/cli-guard#127
No description provided.