refactor: hard-fork GSD -> MSD (Make Software Done)
Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD across contents and paths, upstream package/repo coordinates -> @golem15/msd-core and golem15com/msd-core. Deep links into upstream history, sibling upstream packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is. Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line, package/plugin identity, regenerated lockfile, install-tree fixtures, derived registries and benchmark baseline; migration checksum baseline re-locked (MSD keeps its own install state, so no install had applied the old sums); sort-order and regex-escaped expectations in tests adjusted.
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
|
||||
Claude Code and other runtimes that surface skills enumerate every installed skill's `name + description` into the system prompt on every turn, inside an `<available_skills>` block. This block is capped by `skillListingBudgetFraction` — default **1%** of the model's context window, ~**2,000 tokens** at 200k. When the combined descriptions exceed the cap, the harness silently truncates the tail. The reporter of #3408 has 135 installed skills across multiple plugins and observed dropped skills.
|
||||
|
||||
GSD's audited footprint:
|
||||
MSD's audited footprint:
|
||||
|
||||
| Metric | Value |
|
||||
|---|---|
|
||||
@@ -21,20 +21,20 @@ GSD's audited footprint:
|
||||
| Estimated description tokens (÷4) | ~1,196 |
|
||||
| Mean description length | 72.5 chars |
|
||||
| Description ceiling (enforced by `scripts/lint-descriptions.cjs`) | 100 chars |
|
||||
| GSD share of a 200k 1% budget | ~60% |
|
||||
| MSD share of a 200k 1% budget | ~60% |
|
||||
|
||||
GSD on its own consumes roughly 60% of the default skill-listing budget. When the user stacks any other plugin of comparable size (the reporter's `/doctor` shows several), the budget is breached and skills get dropped. This is not a GSD-only problem, but **GSD is the single biggest contributor in the typical install**, so we are the natural place for ecosystem-wide remediation to start.
|
||||
MSD on its own consumes roughly 60% of the default skill-listing budget. When the user stacks any other plugin of comparable size (the reporter's `/doctor` shows several), the budget is breached and skills get dropped. This is not a MSD-only problem, but **MSD is the single biggest contributor in the typical install**, so we are the natural place for ecosystem-wide remediation to start.
|
||||
|
||||
## 2. What's already in place
|
||||
|
||||
GSD has done one consolidation pass and shipped one install-time lever:
|
||||
MSD has done one consolidation pass and shipped one install-time lever:
|
||||
|
||||
- **`--minimal` / `--core-only` install flag** (`bin/install.js:123`, `gsd-core/bin/lib/install-profiles.cjs`). Stages a filtered copy of `commands/gsd/` into a temp dir before each runtime-specific copy step. Reduces ~12k tokens of cold-start overhead to ~700.
|
||||
- **`--minimal` / `--core-only` install flag** (`bin/install.js:123`, `msd-core/bin/lib/install-profiles.cjs`). Stages a filtered copy of `commands/msd/` into a temp dir before each runtime-specific copy step. Reduces ~12k tokens of cold-start overhead to ~700.
|
||||
- **`MINIMAL_SKILL_ALLOWLIST`** — 6 skills: `new-project`, `discuss-phase`, `plan-phase`, `execute-phase`, `help`, `update`. Zero sub-agents in minimal.
|
||||
- **Hard 100-char description budget**, enforced in CI by `scripts/lint-descriptions.cjs` and `npm run lint:descriptions`.
|
||||
- **`gsd update` (without `--minimal`)** as the documented upgrade path from minimal → full.
|
||||
- **`msd update` (without `--minimal`)** as the documented upgrade path from minimal → full.
|
||||
|
||||
The 100-char cap means **shrinking descriptions further is not a viable lever** — average is already 72.5 chars and the rare 99-char outliers exist because they earn their length (e.g. `gsd-progress`, `gsd-inbox`). Any future budget relief has to come from **emitting fewer skills**, not shorter ones.
|
||||
The 100-char cap means **shrinking descriptions further is not a viable lever** — average is already 72.5 chars and the rare 99-char outliers exist because they earn their length (e.g. `msd-progress`, `msd-inbox`). Any future budget relief has to come from **emitting fewer skills**, not shorter ones.
|
||||
|
||||
## 3. Audit findings
|
||||
|
||||
@@ -54,7 +54,7 @@ Hot nodes (counted by other-skill body references):
|
||||
| 6 | `new-project` | 2 | Bootstrap |
|
||||
| 6 | `plan-phase` | 2 | Main-loop step 2 |
|
||||
|
||||
`phase` and `review` are the two skills whose absence would silently break dozens of others. **`phase` is referenced by 38 other skills but is not in the current minimal allowlist** — a latent gap worth raising. Confirm with a `--minimal` install + a `/gsd-audit-fix` invocation whether it still works.
|
||||
`phase` and `review` are the two skills whose absence would silently break dozens of others. **`phase` is referenced by 38 other skills but is not in the current minimal allowlist** — a latent gap worth raising. Confirm with a `--minimal` install + a `/msd-audit-fix` invocation whether it still works.
|
||||
|
||||
### 3.2 Functional clusters
|
||||
|
||||
@@ -95,10 +95,10 @@ Each option is graded against five dimensions:
|
||||
Layer named profiles on top of the existing minimal/full binary:
|
||||
|
||||
```
|
||||
gsd install --profile=core # current --minimal (6 skills, 0 agents)
|
||||
gsd install --profile=standard # +phase, +review, +config, +progress (~14 skills)
|
||||
gsd install --profile=full # current default (66 skills, 33 agents)
|
||||
gsd install --profile=core,audit,ui # composable feature tags
|
||||
msd install --profile=core # current --minimal (6 skills, 0 agents)
|
||||
msd install --profile=standard # +phase, +review, +config, +progress (~14 skills)
|
||||
msd install --profile=full # current default (66 skills, 33 agents)
|
||||
msd install --profile=core,audit,ui # composable feature tags
|
||||
```
|
||||
|
||||
| Dimension | Assessment |
|
||||
@@ -114,36 +114,36 @@ gsd install --profile=core,audit,ui # composable feature tags
|
||||
|
||||
### Option B — Runtime enable/disable command
|
||||
|
||||
A `/gsd-surface` (or `gsd surface` CLI) command that toggles which skills are visible to the runtime without touching installed files:
|
||||
A `/msd-surface` (or `msd surface` CLI) command that toggles which skills are visible to the runtime without touching installed files:
|
||||
|
||||
```
|
||||
/gsd-surface list # show enabled/disabled
|
||||
/gsd-surface disable ui audit # hide a cluster
|
||||
/gsd-surface profile standard # apply a named profile
|
||||
/msd-surface list # show enabled/disabled
|
||||
/msd-surface disable ui audit # hide a cluster
|
||||
/msd-surface profile standard # apply a named profile
|
||||
```
|
||||
|
||||
Implementation: write enable/disable state to `~/.claude/skills/<name>/SKILL.md.disabled` (rename) or maintain a `gsd-surface.json` manifest the installer reads on every `update`.
|
||||
Implementation: write enable/disable state to `~/.claude/skills/<name>/SKILL.md.disabled` (rename) or maintain a `msd-surface.json` manifest the installer reads on every `update`.
|
||||
|
||||
| Dimension | Assessment |
|
||||
|---|---|
|
||||
| User UX | Discoverable through `/gsd-help`. Lower commit than reinstall. Mirrors VS Code's enable/disable extension UX. |
|
||||
| Implementation cost | **Medium.** Need persistent state separate from install files, plus a re-apply loop on `gsd update`. |
|
||||
| User UX | Discoverable through `/msd-help`. Lower commit than reinstall. Mirrors VS Code's enable/disable extension UX. |
|
||||
| Implementation cost | **Medium.** Need persistent state separate from install files, plus a re-apply loop on `msd update`. |
|
||||
| Dependency safety | Same manifest requirement as Option A — disabling `phase` should warn that 38 skills depend on it. |
|
||||
| Token savings | High — user-driven; can match Option A's savings. |
|
||||
| Anthropic dependency | None for the rename approach. Cleaner if Anthropic supports a `SKILL.disabled` convention natively. |
|
||||
|
||||
**Pros:** in-session adjustable, no reinstall friction.
|
||||
**Cons:** state lives outside the installer's idempotent model, so `gsd update` migrations get more complex.
|
||||
**Cons:** state lives outside the installer's idempotent model, so `msd update` migrations get more complex.
|
||||
|
||||
### Option C — Further skill consolidation
|
||||
|
||||
Collapse semantically related skills into a single dispatcher with sub-modes:
|
||||
|
||||
```text
|
||||
gsd-phase → keeps existing
|
||||
gsd-milestone {new|complete|summary|audit} # was 4 skills (hypothetical)
|
||||
gsd-research {sketch|spike|forensics|explore} # was 4 skills (hypothetical)
|
||||
gsd-workspace {pause|resume|capture|inbox|thread} # was 5 skills (hypothetical)
|
||||
msd-phase → keeps existing
|
||||
msd-milestone {new|complete|summary|audit} # was 4 skills (hypothetical)
|
||||
msd-research {sketch|spike|forensics|explore} # was 4 skills (hypothetical)
|
||||
msd-workspace {pause|resume|capture|inbox|thread} # was 5 skills (hypothetical)
|
||||
```
|
||||
|
||||
(The hypothetical dispatchers above are written without the slash prefix to signal they are not shipped commands — Option C is a sketch, not a recommendation.)
|
||||
@@ -166,12 +166,12 @@ Skills ship a 1-line *teaser* in the system prompt and the full description load
|
||||
| Dimension | Assessment |
|
||||
|---|---|
|
||||
| User UX | Invisible to users. |
|
||||
| Implementation cost | **Low for GSD** — add a `teaser:` frontmatter field. **High for Anthropic** — harness changes. |
|
||||
| Implementation cost | **Low for MSD** — add a `teaser:` frontmatter field. **High for Anthropic** — harness changes. |
|
||||
| Dependency safety | N/A (purely about listing). |
|
||||
| Token savings | ~85% of all skill-listing budget across the ecosystem. |
|
||||
| Anthropic dependency | **Yes — platform feature.** |
|
||||
|
||||
This is the architecturally correct long-term answer. GSD can't ship it alone.
|
||||
This is the architecturally correct long-term answer. MSD can't ship it alone.
|
||||
|
||||
### Option E — Per-plugin budget allocation (Anthropic ask)
|
||||
|
||||
@@ -180,13 +180,13 @@ Instead of one shared `skillListingBudgetFraction`, give each plugin a dedicated
|
||||
| Dimension | Assessment |
|
||||
|---|---|
|
||||
| User UX | Invisible. |
|
||||
| Implementation cost | **Low for GSD** — declare quota in `package.json` / plugin manifest. **Medium for Anthropic** — quota arithmetic and tie-breaking in the harness. |
|
||||
| Implementation cost | **Low for MSD** — declare quota in `package.json` / plugin manifest. **Medium for Anthropic** — quota arithmetic and tie-breaking in the harness. |
|
||||
| Token savings | Doesn't reduce total, but eliminates the silent-drop failure mode. |
|
||||
| Anthropic dependency | **Yes.** |
|
||||
|
||||
### Option F — Sub-plugins / split distribution
|
||||
|
||||
Publish GSD as multiple npm packages: `get-shit-done-redux-core`, `get-shit-done-redux-milestones`, `get-shit-done-redux-research`, etc. Users install only what they need.
|
||||
Publish MSD as multiple npm packages: `get-shit-done-redux-core`, `get-shit-done-redux-milestones`, `get-shit-done-redux-research`, etc. Users install only what they need.
|
||||
|
||||
| Dimension | Assessment |
|
||||
|---|---|
|
||||
@@ -207,9 +207,9 @@ Why this ordering:
|
||||
|
||||
1. **A reuses an existing seam.** `install-profiles.cjs` is already the staging point; this is the lowest-risk way to ship meaningful relief in the next release.
|
||||
2. **A is composable.** Naming clusters as profiles is a forcing function for the dependency manifest, which we want anyway for the lint described in 3.1.
|
||||
3. **B follows A naturally.** Once profiles exist, the `/gsd-surface` command is "apply a profile to a live install plus persist deltas." Without A, B has no profiles to apply.
|
||||
3. **B follows A naturally.** Once profiles exist, the `/msd-surface` command is "apply a profile to a live install plus persist deltas." Without A, B has no profiles to apply.
|
||||
4. **C is independent and orthogonal.** It can happen in parallel as IA cleanup; it should not block A.
|
||||
5. **D and E are platform-level.** GSD ships A regardless; D/E are documented as cooperative asks so Anthropic sees them in context.
|
||||
5. **D and E are platform-level.** MSD ships A regardless; D/E are documented as cooperative asks so Anthropic sees them in context.
|
||||
|
||||
## 6. Anthropic platform asks
|
||||
|
||||
@@ -225,25 +225,25 @@ Drafted for filing at <https://docs.claude.com/feedback> or similar channel; cop
|
||||
|
||||
### Ask 3 — Dependency-aware skill listing
|
||||
|
||||
> Skills can call other skills (in GSD, the `phase` skill is referenced by 38 others). When the harness drops a skill from the listing, it has no way to know whether anything else relies on it. Proposal: optional frontmatter `requires: [other-skill]` so the harness keeps the closure of dependencies in the listing, or warns the user at install time that a dropped skill is reachable from a kept one.
|
||||
> Skills can call other skills (in MSD, the `phase` skill is referenced by 38 others). When the harness drops a skill from the listing, it has no way to know whether anything else relies on it. Proposal: optional frontmatter `requires: [other-skill]` so the harness keeps the closure of dependencies in the listing, or warns the user at install time that a dropped skill is reachable from a kept one.
|
||||
|
||||
### Ask 4 — Disable/enable without uninstall
|
||||
|
||||
> Today the only way to remove a skill from the listing is to delete its `SKILL.md`. Proposal: a `.disabled` suffix (e.g. `SKILL.md.disabled`) or a per-skill `enabled: false` frontmatter is treated as "not surfaced" by the harness. This lets plugins ship surface-toggle UIs (like our proposed `/gsd-surface disable`) without touching install state.
|
||||
> Today the only way to remove a skill from the listing is to delete its `SKILL.md`. Proposal: a `.disabled` suffix (e.g. `SKILL.md.disabled`) or a per-skill `enabled: false` frontmatter is treated as "not surfaced" by the harness. This lets plugins ship surface-toggle UIs (like our proposed `/msd-surface disable`) without touching install state.
|
||||
|
||||
## 7. Implementation sketch (for the ADR)
|
||||
|
||||
Phase 1 — profiles (ships with ADR-0010):
|
||||
|
||||
1. In `gsd-core/bin/lib/install-profiles.cjs`, replace the single `MINIMAL_SKILL_ALLOWLIST` constant with a `PROFILES` map. Each profile is the *transitive closure* over a base set, so `standard` includes `core` automatically.
|
||||
1. In `msd-core/bin/lib/install-profiles.cjs`, replace the single `MINIMAL_SKILL_ALLOWLIST` constant with a `PROFILES` map. Each profile is the *transitive closure* over a base set, so `standard` includes `core` automatically.
|
||||
2. Add a `requires:` frontmatter field to every skill that calls another skill in its body. Add a lint check in `scripts/lint-descriptions.cjs` (or a sibling `lint-skill-deps.cjs`) that fails CI if a skill body references another skill that isn't in its `requires` list, and that fails if any profile would ship a skill whose `requires` aren't satisfied.
|
||||
3. Extend the `bin/install.js` argument parser: `--profile=<name>` (mutually exclusive with `--minimal`), `--profile=core,audit` for composition. Keep `--minimal` as an alias for `--profile=core`.
|
||||
4. Interactive install: if no `--profile` is given and no runtime/location is forced, present an `AskUserQuestion`-style picker. (Cowork analog already in the install flow.)
|
||||
5. `gsd update` re-applies the recorded profile from a small marker file (`~/.claude/skills/.gsd-profile`).
|
||||
5. `msd update` re-applies the recorded profile from a small marker file (`~/.claude/skills/.msd-profile`).
|
||||
|
||||
Phase 2 — runtime surface command (follow-up ADR or amendment):
|
||||
|
||||
1. `/gsd-surface` command writes to the profile marker and re-runs the staging step for the active runtime.
|
||||
1. `/msd-surface` command writes to the profile marker and re-runs the staging step for the active runtime.
|
||||
2. Once Anthropic ships Ask 4, switch from file-deletion to `.disabled`-suffix toggling.
|
||||
|
||||
## 8. Follow-ups outside this scope
|
||||
@@ -253,17 +253,17 @@ Phase 2 — runtime surface command (follow-up ADR or amendment):
|
||||
|
||||
## 9. Risks and unknowns
|
||||
|
||||
- **The `phase` dispatcher gap in the existing minimal allowlist.** Confirm whether a fresh `--minimal` install + the documented main loop actually works end-to-end. If `discuss-phase`/`plan-phase`/`execute-phase` silently fall back to `/gsd-phase`, the minimal allowlist is currently broken. Track as a separate bug if confirmed.
|
||||
- **The `phase` dispatcher gap in the existing minimal allowlist.** Confirm whether a fresh `--minimal` install + the documented main loop actually works end-to-end. If `discuss-phase`/`plan-phase`/`execute-phase` silently fall back to `/msd-phase`, the minimal allowlist is currently broken. Track as a separate bug if confirmed.
|
||||
- **Profile naming bikeshed.** `core` / `standard` / `full` vs. `minimal` / `recommended` / `everything` vs. functional names (`planning`, `audit`, `research`). Settle in the ADR's Open Questions.
|
||||
- **Discoverability of disabled skills.** If `gsd-audit-fix` isn't surfaced, a user asking "audit my project" won't get it suggested. `/gsd-help` should list installed-but-not-surfaced skills with a one-line upgrade hint.
|
||||
- **Telemetry blind spot.** GSD doesn't currently know which skills users invoke, so "drop the long tail" is theoretical. Survey or self-reporting may be needed before drawing the `standard` profile line.
|
||||
- **Discoverability of disabled skills.** If `msd-audit-fix` isn't surfaced, a user asking "audit my project" won't get it suggested. `/msd-help` should list installed-but-not-surfaced skills with a one-line upgrade hint.
|
||||
- **Telemetry blind spot.** MSD doesn't currently know which skills users invoke, so "drop the long tail" is theoretical. Survey or self-reporting may be needed before drawing the `standard` profile line.
|
||||
|
||||
## 10. References
|
||||
|
||||
- Issue: [#3408](https://github.com/open-gsd/get-shit-done-redux/issues/3408)
|
||||
- Existing seam: `gsd-core/bin/lib/install-profiles.cjs`
|
||||
- Existing seam: `msd-core/bin/lib/install-profiles.cjs`
|
||||
- Description lint: `scripts/lint-descriptions.cjs`
|
||||
- Install dispatcher: `bin/install.js:123` (mode parsing), `bin/install.js:8167-8207` (minimal staging)
|
||||
- Audit data: [`docs/research/data/2026-05-12-skill-audit.json`](data/2026-05-12-skill-audit.json) (per-skill dep graph, description sizes, and cluster mapping — reproducible from `commands/gsd/` and `agents/`)
|
||||
- Audit data: [`docs/research/data/2026-05-12-skill-audit.json`](data/2026-05-12-skill-audit.json) (per-skill dep graph, description sizes, and cluster mapping — reproducible from `commands/msd/` and `agents/`)
|
||||
- Prior ADRs: 0008 (Installer Migration Module) and 0009 (Shell Command Projection Module) — both touch the same install pipeline this proposal extends.
|
||||
- Ecosystem precedents: Cargo `[features]`, npm `optionalDependencies`, VS Code extension packs, Homebrew taps, Helm chart values, Ansible role tags, Linux kernel `make menuconfig` tristate, systemd target activation.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
## 1. Problem summary
|
||||
|
||||
`test:coverage:unit` runs `c8 … --all node scripts/run-tests.cjs --suite unit && node scripts/check-coverage-gate.cjs` (`package.json:152`). `scripts/run-tests.cjs` already fans the 1785-file unit suite out into 15 short-lived child processes (LPT-packed by measured duration; see `scripts/run-tests.cjs:394-497`), each with `NODE_V8_COVERAGE` propagated so V8 writes one raw-coverage JSON file per process. In the failed `finalize` run, all 15 chunks completed (0 test failures) at 00:19:36; the `FATAL ERROR: Ineffective mark-compacts near heap limit … JavaScript heap out of memory` crash happened 76s later, at 00:20:52 — after test execution, during whatever c8 does next. The job already sets `NODE_OPTIONS: --max-old-space-size=6144` (`.github/workflows/release.yml:587`), raised once before for this exact step, and it is still not enough. `--all` is load-bearing: `scripts/check-coverage-gate.cjs:28-34` reads `overall.lines.pct` / `overall.branches.pct` straight from `coverage-summary.json`'s `.total`, and without `--all` any of the ~235 `gsd-core/bin/lib/**/*.cjs` files untouched by the unit suite would silently drop out of that denominator, inflating the reported percentage — dropping `--all` is not an acceptable fix on its own.
|
||||
`test:coverage:unit` runs `c8 … --all node scripts/run-tests.cjs --suite unit && node scripts/check-coverage-gate.cjs` (`package.json:152`). `scripts/run-tests.cjs` already fans the 1785-file unit suite out into 15 short-lived child processes (LPT-packed by measured duration; see `scripts/run-tests.cjs:394-497`), each with `NODE_V8_COVERAGE` propagated so V8 writes one raw-coverage JSON file per process. In the failed `finalize` run, all 15 chunks completed (0 test failures) at 00:19:36; the `FATAL ERROR: Ineffective mark-compacts near heap limit … JavaScript heap out of memory` crash happened 76s later, at 00:20:52 — after test execution, during whatever c8 does next. The job already sets `NODE_OPTIONS: --max-old-space-size=6144` (`.github/workflows/release.yml:587`), raised once before for this exact step, and it is still not enough. `--all` is load-bearing: `scripts/check-coverage-gate.cjs:28-34` reads `overall.lines.pct` / `overall.branches.pct` straight from `coverage-summary.json`'s `.total`, and without `--all` any of the ~235 `msd-core/bin/lib/**/*.cjs` files untouched by the unit suite would silently drop out of that denominator, inflating the reported percentage — dropping `--all` is not an acceptable fix on its own.
|
||||
|
||||
## 2. Root cause, sourced
|
||||
|
||||
@@ -24,7 +24,7 @@ Exit code 134 = 128 + SIGABRT (signal 6). V8 emits `FATAL ERROR: Ineffective mar
|
||||
|
||||
## 3. Runner headroom
|
||||
|
||||
`finalize` runs on plain `runs-on: ubuntu-latest` (`.github/workflows/release.yml:547`, no `runs-on:` overrides), which is `open-gsd/gsd-core` — a public repo — so it gets GitHub's **public-repo standard Linux runner: 4 vCPU, 16 GB RAM, 14 GB SSD** ([GitHub Docs: Supported runners and hardware resources](https://docs.github.com/en/actions/reference/github-hosted-runners-reference)). Against 16 GB physical RAM, the current `--max-old-space-size=6144` (6 GB) leaves meaningful headroom before an OS-level OOM-kill — raising the flag further (e.g. to 10-12 GB) is a viable stopgap purely on paper, but it is treating the symptom: the underlying `_loadReports()` call still holds every raw V8 file for the whole 1785-test run in memory simultaneously before merging, so the ceiling will eventually be hit again as the suite grows, same as it was hit after the *first* raise from whatever the previous default was to 6144. GitHub-hosted "larger runners" (paid, up to 64 GB) are available as a deferred escape hatch if a real fix is not shipped, but they cost money and still only delay the same unbounded-memory-shape problem.
|
||||
`finalize` runs on plain `runs-on: ubuntu-latest` (`.github/workflows/release.yml:547`, no `runs-on:` overrides), which is `golem15com/msd-core` — a public repo — so it gets GitHub's **public-repo standard Linux runner: 4 vCPU, 16 GB RAM, 14 GB SSD** ([GitHub Docs: Supported runners and hardware resources](https://docs.github.com/en/actions/reference/github-hosted-runners-reference)). Against 16 GB physical RAM, the current `--max-old-space-size=6144` (6 GB) leaves meaningful headroom before an OS-level OOM-kill — raising the flag further (e.g. to 10-12 GB) is a viable stopgap purely on paper, but it is treating the symptom: the underlying `_loadReports()` call still holds every raw V8 file for the whole 1785-test run in memory simultaneously before merging, so the ceiling will eventually be hit again as the suite grows, same as it was hit after the *first* raise from whatever the previous default was to 6144. GitHub-hosted "larger runners" (paid, up to 64 GB) are available as a deferred escape hatch if a real fix is not shipped, but they cost money and still only delay the same unbounded-memory-shape problem.
|
||||
|
||||
## 4. Options considered
|
||||
|
||||
@@ -62,7 +62,7 @@ Exit code 134 = 128 + SIGABRT (signal 6). V8 emits `FATAL ERROR: Ineffective mar
|
||||
|
||||
**Primary source:** [Node.js Learn: Collecting code coverage in Node.js](https://nodejs.org/learn/test-runner/collecting-code-coverage), [Node.js `node:test` API docs](https://nodejs.org/api/test.html#collecting-code-coverage). Confirmed via docs: reporters are `spec`/`tap` (stdout summary) and `lcov` (`--test-reporter=lcov --test-reporter-destination=lcov.info`); the `run()` API exposes `coverageIncludeAll: true` as the direct equivalent of c8's `--all` (includes untouched source files as zero-coverage). **Not documented anywhere**: any `coverage-summary.json` output, or an Istanbul/c8-compatible JSON shape. The only structured outputs are stdout summary text and an `lcov.info` file — neither is `{ total: { lines: { pct }, branches: { pct } } }`, the exact shape `scripts/check-coverage-gate.cjs:15,28-34` parses.
|
||||
|
||||
**What gsd-core would lose/gain:** Gain — no dependency on c8/istanbul's merge-phase memory behavior at all, since coverage is collected and reported natively per test-runner process. Lose — `check-coverage-gate.cjs` would need a full rewrite to either (a) parse `lcov.info` (a different, line-oriented text format, no branch-pct field out of the box — would need an lcov parser or a switch to line/statement-only gating) or (b) shell out to something that converts native coverage into a `coverage-summary.json`-shaped object, which likely means keeping c8/istanbul in the pipeline anyway just for the JSON conversion (c8 itself is explicitly compatible with Istanbul's reporter set and can consume raw V8 files from any source — this is not a clean full removal, more a reshuffle). Per-file branch-coverage gating for the four hardened files (`state.cjs`, `phase.cjs`, `verify.cjs`, `init.cjs` — `scripts/check-coverage-gate.cjs:21-26`) is not confirmed reproducible from `lcov.info` without extra parsing work.
|
||||
**What msd-core would lose/gain:** Gain — no dependency on c8/istanbul's merge-phase memory behavior at all, since coverage is collected and reported natively per test-runner process. Lose — `check-coverage-gate.cjs` would need a full rewrite to either (a) parse `lcov.info` (a different, line-oriented text format, no branch-pct field out of the box — would need an lcov parser or a switch to line/statement-only gating) or (b) shell out to something that converts native coverage into a `coverage-summary.json`-shaped object, which likely means keeping c8/istanbul in the pipeline anyway just for the JSON conversion (c8 itself is explicitly compatible with Istanbul's reporter set and can consume raw V8 files from any source — this is not a clean full removal, more a reshuffle). Per-file branch-coverage gating for the four hardened files (`state.cjs`, `phase.cjs`, `verify.cjs`, `init.cjs` — `scripts/check-coverage-gate.cjs:21-26`) is not confirmed reproducible from `lcov.info` without extra parsing work.
|
||||
|
||||
**Implementation cost:** High — rewrite of `check-coverage-gate.cjs`'s parsing, likely also of `scripts/run-tests.cjs`'s chunk/shard orchestration (native coverage's multi-process merge story is not documented at all — the docs are silent on "memory characteristics for large test suites across many processes"), and re-validation of every one of the four per-file branch gates against the new format's data.
|
||||
|
||||
|
||||
@@ -87,11 +87,11 @@ Contrary to the initial framing, this check **passed** (`gh pr checks 3927`: `Pu
|
||||
- The sweep's PR body (`ack-fragment-sweep.yml:243-261`) is freeform prose — no `## Fix PR` / `## Enhancement PR` / `## Feature PR` heading, none of the required headings in `TEMPLATES` (`pr-template-policy.cjs:55-97`).
|
||||
- The changed-files carve-out does not apply: `tests/emitted-drift-acks/*.json` is not in `TOOLING_PATH_ALLOWLIST` (`pr-template-policy.cjs:24-43`), so `allPathsAreTooling` returns `false`.
|
||||
- `matchingTemplate()` finds no heading match → `template: null` → falls to `reason = 'PR body does not match the fix, enhancement, or feature template.'`, `valid: false` (`pr-template-policy.cjs:217-223`).
|
||||
- The consequence is gated on **author trust**, not template compliance (`pr-template-policy.cjs:226-229`): `action = trusted ? 'warn' : 'close'`. `TRUSTED_AUTHOR_ASSOCIATIONS` includes `MEMBER` (line 6-11). The PR's actual author association is `MEMBER` (`gh api repos/open-gsd/gsd-core/pulls/3927 --jq '.author_association'` → `MEMBER`), because the workflow authenticates `gh pr create` with `GSD_BOT_PR_TOKEN` — a personal-access token belonging to a real maintainer account (`trek-e`), not a GitHub App/bot identity. So `action: warn`: the `gsd-pr-template-policy` bot comment fires (`core.warning`, `pr-template-format.yml`'s "Warn trusted contributor" step), but the workflow only `core.setFailed`s on `action == 'close'` — never reached. The template body is objectively wrong; the check is objectively green.
|
||||
- The consequence is gated on **author trust**, not template compliance (`pr-template-policy.cjs:226-229`): `action = trusted ? 'warn' : 'close'`. `TRUSTED_AUTHOR_ASSOCIATIONS` includes `MEMBER` (line 6-11). The PR's actual author association is `MEMBER` (`gh api repos/golem15com/msd-core/pulls/3927 --jq '.author_association'` → `MEMBER`), because the workflow authenticates `gh pr create` with `MSD_BOT_PR_TOKEN` — a personal-access token belonging to a real maintainer account (`trek-e`), not a GitHub App/bot identity. So `action: warn`: the `msd-pr-template-policy` bot comment fires (`core.warning`, `pr-template-format.yml`'s "Warn trusted contributor" step), but the workflow only `core.setFailed`s on `action == 'close'` — never reached. The template body is objectively wrong; the check is objectively green.
|
||||
|
||||
### B8. `Required tests` / `test (ubuntu-latest, 24)` — the fast-signal lane ran the WHOLE suite and hit its own 15-minute cap
|
||||
|
||||
`gh run view 33059472019 --repo open-gsd/gsd-core --log-failed` and the per-job API (`jobs/98474440239`, `jobs/98478252101`) show:
|
||||
`gh run view 33059472019 --repo golem15com/msd-core --log-failed` and the per-job API (`jobs/98474440239`, `jobs/98478252101`) show:
|
||||
|
||||
- `test (ubuntu-latest, 24)` — the **unsharded** matrix entry (`.github/workflows/test.yml:198-200`: `{os: ubuntu-latest, node-version: 24, scope: targeted}`, no `shard` key, hence the bare job name per the `name:` template at `test.yml:130`) — started `09:38:38Z`, its "Run scoped tests" step ran from `09:39:10Z` to `09:53:51Z` (14m41s), and the whole job was marked `cancelled` at `09:53:56Z`, total **15m18s** — exactly the job's `timeout-minutes: 15` cap (`test.yml:155`).
|
||||
- The raw log for that job shows `run-tests: suite="all" files=827` at `09:39:11Z`, and the job reached only `chunk 13/14` before being killed (`chunk 13/14 — 61 files` at `09:52:37Z`) — i.e. it was running virtually the entire test corpus (827 files) in one unsharded process, not a narrow "targeted/fast-signal" subset. The three actually-sharded ubuntu `scope: full` jobs (which exist precisely to spread this same corpus across 3 runners, per the `#2952`/`#3057` comments at `test.yml:141-164`) all finished successfully in 6-9 minutes each.
|
||||
@@ -101,23 +101,23 @@ Contrary to the initial framing, this check **passed** (`gh pr checks 3927`: `Pu
|
||||
|
||||
### B9. How #3927 was actually merged despite red required checks
|
||||
|
||||
`gh api repos/open-gsd/gsd-core/pulls/3927 --jq '.merged_by.login, .merge_commit_sha, .author_association'` → `trek-e`, `ad6abc896...`, `MEMBER`. The PR was opened `09:38:15Z` and merged `12:16:49Z` (2h38m later) by the same account, `trek-e` (a human maintainer, `is_bot: false` per `gh pr list ... --json mergedBy`). The timeline (`gh api .../issues/3927/timeline`) shows only `review_requested` → two bot `commented` events → `merged`/`closed`/`head_ref_deleted`, all attributed to `trek-e` or `github-actions[bot]`; no re-run or re-triggered check event appears between open and merge. `gh pr checks 3927` (queried post-merge) still reports `validate-title fail` and `Required tests fail` as the latest, final state of those checks — they were never turned green. The merge therefore landed with required checks still red: a maintainer override (admin merge / branch-protection bypass), not an automatic pass triggered by the automation.
|
||||
`gh api repos/golem15com/msd-core/pulls/3927 --jq '.merged_by.login, .merge_commit_sha, .author_association'` → `trek-e`, `ad6abc896...`, `MEMBER`. The PR was opened `09:38:15Z` and merged `12:16:49Z` (2h38m later) by the same account, `trek-e` (a human maintainer, `is_bot: false` per `gh pr list ... --json mergedBy`). The timeline (`gh api .../issues/3927/timeline`) shows only `review_requested` → two bot `commented` events → `merged`/`closed`/`head_ref_deleted`, all attributed to `trek-e` or `github-actions[bot]`; no re-run or re-triggered check event appears between open and merge. `gh pr checks 3927` (queried post-merge) still reports `validate-title fail` and `Required tests fail` as the latest, final state of those checks — they were never turned green. The merge therefore landed with required checks still red: a maintainer override (admin merge / branch-protection bypass), not an automatic pass triggered by the automation.
|
||||
|
||||
### B10. No auto-merge path exists for the sweep PR
|
||||
|
||||
`ack-fragment-sweep.yml` ends at `gh pr create` + `gh pr edit --add-label automation --add-label no-changelog` (lines 263-280) — no `gh pr merge`, no `enableAutoMerge` call, nothing. Grepping every workflow for `automerge`/`auto-merge` finds only `auto-backmerge.yml` (an unrelated `main`→`next` release-engineering workflow, gated on `push: branches: [main]`, using `-s ours` merges — nothing about ack fragments) and a comment in `release.yml:729` about release→main PRs. `pr-mergeable-preflight.yml` is a reusable merge-conflict early-exit gate shared by eight caller workflows; it applies no label and performs no merge (`pr-mergeable-preflight.yml:1-40`). There is no maintainer-facing auto-merge wired to `ack-fragment-sweep.yml`'s PRs at all — every one requires a human to notice it, review it, and merge it by hand (or override), exactly as `ack-fragment-sweep.yml:14-15`'s own top-of-file comment states: "a human still approves the deletion."
|
||||
|
||||
### B11. `GSD_BOT_PR_TOKEN` fallback warning did NOT fire — ruled out as a cause
|
||||
### B11. `MSD_BOT_PR_TOKEN` fallback warning did NOT fire — ruled out as a cause
|
||||
|
||||
`gh run view 33059445125 --repo open-gsd/gsd-core --log` (the sweep workflow's own run) shows the "Open the sweep PR" step's env block: `HAS_BOT_TOKEN: 1`. The step's guard is `if [ -z "${HAS_BOT_TOKEN:-}" ]; then echo '::warning::GSD_BOT_PR_TOKEN is unset...'; fi` (`ack-fragment-sweep.yml:191-193`) — with `HAS_BOT_TOKEN=1` this branch is skipped, and indeed no such warning line appears anywhere in the run log. `GSD_BOT_PR_TOKEN` **was** configured and used. This is corroborated independently by B7/B9: the PR's `author_association` is `MEMBER` (not the unauthenticated-fallback shape) and the title/template *required* checks did run and report real verdicts (`validate-title`, `Pull request template format` both executed) — under the `GITHUB_TOKEN` fallback the workflow's own comment (`ack-fragment-sweep.yml:189`) states "no required checks will run on it," which is not what happened. **The fallback-token hypothesis is not the cause of this hang.** (Git commit authorship on the branch itself still reads `github-actions[bot]` per `git config user.name` at `ack-fragment-sweep.yml:204-205` — a separate, cosmetic identity from the `gh` API actor, which is `trek-e` via the PAT.)
|
||||
`gh run view 33059445125 --repo golem15com/msd-core --log` (the sweep workflow's own run) shows the "Open the sweep PR" step's env block: `HAS_BOT_TOKEN: 1`. The step's guard is `if [ -z "${HAS_BOT_TOKEN:-}" ]; then echo '::warning::MSD_BOT_PR_TOKEN is unset...'; fi` (`ack-fragment-sweep.yml:191-193`) — with `HAS_BOT_TOKEN=1` this branch is skipped, and indeed no such warning line appears anywhere in the run log. `MSD_BOT_PR_TOKEN` **was** configured and used. This is corroborated independently by B7/B9: the PR's `author_association` is `MEMBER` (not the unauthenticated-fallback shape) and the title/template *required* checks did run and report real verdicts (`validate-title`, `Pull request template format` both executed) — under the `GITHUB_TOKEN` fallback the workflow's own comment (`ack-fragment-sweep.yml:189`) states "no required checks will run on it," which is not what happened. **The fallback-token hypothesis is not the cause of this hang.** (Git commit authorship on the branch itself still reads `github-actions[bot]` per `git config user.name` at `ack-fragment-sweep.yml:204-205` — a separate, cosmetic identity from the `gh` API actor, which is `trek-e` via the PAT.)
|
||||
|
||||
## C. Track record — is #3927 representative or a one-off?
|
||||
|
||||
`gh pr list --repo open-gsd/gsd-core --search "head:chore/ack-sweep" --state all --limit 30 --json number,title,state,createdAt,mergedAt,mergedBy` returns **exactly one PR**: #3927 itself (opened `09:38:15Z`, merged `12:16:49Z`, `mergedBy: trek-e`). There is no prior sweep PR to compare against — this is the automation's first (and so far only) production run that produced a non-empty plan and opened a PR. It cannot yet be called "systematically failing" by volume, but the failure mechanism identified in B8 is a property of the scope-classification table and the sweep's title-generation code, not of this specific run's data — so it will reproduce on the *next* sweep PR with high confidence, absent a fix to either `ack-fragment-sweep.yml`'s title format or `scripts/ci-test-scope.cjs`'s `RULES` table (or both).
|
||||
`gh pr list --repo golem15com/msd-core --search "head:chore/ack-sweep" --state all --limit 30 --json number,title,state,createdAt,mergedAt,mergedBy` returns **exactly one PR**: #3927 itself (opened `09:38:15Z`, merged `12:16:49Z`, `mergedBy: trek-e`). There is no prior sweep PR to compare against — this is the automation's first (and so far only) production run that produced a non-empty plan and opened a PR. It cannot yet be called "systematically failing" by volume, but the failure mechanism identified in B8 is a property of the scope-classification table and the sweep's title-generation code, not of this specific run's data — so it will reproduce on the *next* sweep PR with high confidence, absent a fix to either `ack-fragment-sweep.yml`'s title format or `scripts/ci-test-scope.cjs`'s `RULES` table (or both).
|
||||
|
||||
## Open questions
|
||||
|
||||
- Should `scripts/ci-test-scope.cjs`'s `RULES` gain an explicit entry for `tests/emitted-drift-acks/` (mapping to a narrow, cheap test list — e.g. `tests/emitted-attribution.test.cjs`, `tests/lint-emitted-drift-ack.cjs`'s own test file if any) so a fragment-only diff no longer falls through the `#408` "unit" fallback onto the unsharded lane? This is the most direct fix for B8, and does not require sharding the `scope: targeted` lane.
|
||||
- Should `ack-fragment-sweep.yml:266` be changed to `--title "chore(#3875): sweep ${COUNT} spent ack fragment(s) from next (${SHORT_SHA})"` (or similarly scoped) to satisfy `conventional-title.cjs` outright? This is a one-line fix for B6.
|
||||
- Should the sweep PR body be reshaped to match one of the three typed templates (likely "Fix" or a new "chore" carve-out) so `Pull request template format` passes on its merits rather than on the author's trust level — closing the latent gap where an untrusted-token run of this same workflow (if `GSD_BOT_PR_TOKEN` ever lapses to a non-`MEMBER` identity) would hit `action: close` instead of `warn`?
|
||||
- Should the sweep PR body be reshaped to match one of the three typed templates (likely "Fix" or a new "chore" carve-out) so `Pull request template format` passes on its merits rather than on the author's trust level — closing the latent gap where an untrusted-token run of this same workflow (if `MSD_BOT_PR_TOKEN` ever lapses to a non-`MEMBER` identity) would hit `action: close` instead of `warn`?
|
||||
- Given B10/B11, should the workflow (or a separate follow-up automation) add a bounded auto-merge step once its own required checks are green, so a correctly-titled, correctly-scoped sweep PR does not still require a human to notice and merge it by hand every six hours?
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"skills": [
|
||||
{
|
||||
"stem": "add-tests",
|
||||
"name": "gsd:add-tests",
|
||||
"name": "msd:add-tests",
|
||||
"desc": "Generate tests for a completed phase based on UAT criteria and implementation",
|
||||
"desc_chars": 77,
|
||||
"calls_skills": [
|
||||
@@ -19,23 +19,23 @@
|
||||
},
|
||||
{
|
||||
"stem": "ai-integration-phase",
|
||||
"name": "gsd:ai-integration-phase",
|
||||
"name": "msd:ai-integration-phase",
|
||||
"desc": "Generate an AI-SPEC.md design contract for phases that involve building AI systems.",
|
||||
"desc_chars": 83,
|
||||
"calls_skills": [
|
||||
"phase"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-ai-researcher",
|
||||
"gsd-domain-researcher",
|
||||
"gsd-eval-planner",
|
||||
"gsd-framework-selector"
|
||||
"msd-ai-researcher",
|
||||
"msd-domain-researcher",
|
||||
"msd-eval-planner",
|
||||
"msd-framework-selector"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "audit-fix",
|
||||
"name": "gsd:audit-fix",
|
||||
"name": "msd:audit-fix",
|
||||
"desc": "Autonomous audit-to-fix pipeline \u2014 find issues, classify, fix, test, commit",
|
||||
"desc_chars": 75,
|
||||
"calls_skills": [
|
||||
@@ -46,7 +46,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "audit-milestone",
|
||||
"name": "gsd:audit-milestone",
|
||||
"name": "msd:audit-milestone",
|
||||
"desc": "Audit milestone completion against original intent before archiving",
|
||||
"desc_chars": 67,
|
||||
"calls_skills": [
|
||||
@@ -57,7 +57,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "audit-uat",
|
||||
"name": "gsd:audit-uat",
|
||||
"name": "msd:audit-uat",
|
||||
"desc": "Cross-phase audit of all outstanding UAT and verification items",
|
||||
"desc_chars": 63,
|
||||
"calls_skills": [],
|
||||
@@ -68,7 +68,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "autonomous",
|
||||
"name": "gsd:autonomous",
|
||||
"name": "msd:autonomous",
|
||||
"desc": "Run all remaining phases autonomously \u2014 discuss\u2192plan\u2192execute per phase",
|
||||
"desc_chars": 70,
|
||||
"calls_skills": [
|
||||
@@ -81,7 +81,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "capture",
|
||||
"name": "gsd:capture",
|
||||
"name": "msd:capture",
|
||||
"desc": "Capture ideas, tasks, notes, and seeds to their destination",
|
||||
"desc_chars": 59,
|
||||
"calls_skills": [],
|
||||
@@ -92,7 +92,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "cleanup",
|
||||
"name": "gsd:cleanup",
|
||||
"name": "msd:cleanup",
|
||||
"desc": "Archive accumulated phase directories from completed milestones",
|
||||
"desc_chars": 63,
|
||||
"calls_skills": [
|
||||
@@ -105,7 +105,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "code-review",
|
||||
"name": "gsd:code-review",
|
||||
"name": "msd:code-review",
|
||||
"desc": "Review source files changed during a phase for bugs, security issues, and code quality problems",
|
||||
"desc_chars": 95,
|
||||
"calls_skills": [
|
||||
@@ -116,8 +116,8 @@
|
||||
"review"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-code-fixer",
|
||||
"gsd-code-reviewer"
|
||||
"msd-code-fixer",
|
||||
"msd-code-reviewer"
|
||||
],
|
||||
"called_by": [
|
||||
"config"
|
||||
@@ -125,7 +125,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "complete-milestone",
|
||||
"name": "gsd:complete-milestone",
|
||||
"name": "msd:complete-milestone",
|
||||
"desc": "Archive completed milestone and prepare for next version",
|
||||
"desc_chars": 56,
|
||||
"calls_skills": [
|
||||
@@ -138,8 +138,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "config",
|
||||
"name": "gsd:config",
|
||||
"desc": "Configure GSD settings \u2014 workflow toggles, advanced knobs, integrations, and model profile",
|
||||
"name": "msd:config",
|
||||
"desc": "Configure MSD settings \u2014 workflow toggles, advanced knobs, integrations, and model profile",
|
||||
"desc_chars": 90,
|
||||
"calls_skills": [
|
||||
"code-review",
|
||||
@@ -159,19 +159,19 @@
|
||||
},
|
||||
{
|
||||
"stem": "debug",
|
||||
"name": "gsd:debug",
|
||||
"name": "msd:debug",
|
||||
"desc": "Systematic debugging with persistent state across context resets",
|
||||
"desc_chars": 64,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [
|
||||
"gsd-debug-session-manager",
|
||||
"gsd-debugger"
|
||||
"msd-debug-session-manager",
|
||||
"msd-debugger"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "discuss-phase",
|
||||
"name": "gsd:discuss-phase",
|
||||
"name": "msd:discuss-phase",
|
||||
"desc": "Gather phase context through adaptive questioning before planning.",
|
||||
"desc_chars": 66,
|
||||
"calls_skills": [
|
||||
@@ -186,21 +186,21 @@
|
||||
},
|
||||
{
|
||||
"stem": "docs-update",
|
||||
"name": "gsd:docs-update",
|
||||
"name": "msd:docs-update",
|
||||
"desc": "Generate or update project documentation verified against the codebase",
|
||||
"desc_chars": 70,
|
||||
"calls_skills": [
|
||||
"update"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-doc-verifier",
|
||||
"gsd-doc-writer"
|
||||
"msd-doc-verifier",
|
||||
"msd-doc-writer"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "eval-review",
|
||||
"name": "gsd:eval-review",
|
||||
"name": "msd:eval-review",
|
||||
"desc": "Audit an executed AI phase's evaluation coverage and produce an EVAL-REVIEW.md remediation plan.",
|
||||
"desc_chars": 96,
|
||||
"calls_skills": [
|
||||
@@ -211,7 +211,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "execute-phase",
|
||||
"name": "gsd:execute-phase",
|
||||
"name": "msd:execute-phase",
|
||||
"desc": "Execute all plans in a phase with wave-based parallelization",
|
||||
"desc_chars": 60,
|
||||
"calls_skills": [
|
||||
@@ -226,7 +226,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "explore",
|
||||
"name": "gsd:explore",
|
||||
"name": "msd:explore",
|
||||
"desc": "Socratic ideation and idea routing \u2014 think through ideas before committing to plans",
|
||||
"desc_chars": 83,
|
||||
"calls_skills": [],
|
||||
@@ -235,7 +235,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "extract-learnings",
|
||||
"name": "gsd:extract-learnings",
|
||||
"name": "msd:extract-learnings",
|
||||
"desc": "Extract decisions, lessons, patterns, and surprises from completed phase artifacts",
|
||||
"desc_chars": 82,
|
||||
"calls_skills": [
|
||||
@@ -246,7 +246,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "fast",
|
||||
"name": "gsd:fast",
|
||||
"name": "msd:fast",
|
||||
"desc": "Execute a trivial task inline \u2014 no subagents, no planning overhead",
|
||||
"desc_chars": 66,
|
||||
"calls_skills": [
|
||||
@@ -259,8 +259,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "forensics",
|
||||
"name": "gsd:forensics",
|
||||
"desc": "Post-mortem investigation for failed GSD workflows \u2014 diagnoses what went wrong.",
|
||||
"name": "msd:forensics",
|
||||
"desc": "Post-mortem investigation for failed MSD workflows \u2014 diagnoses what went wrong.",
|
||||
"desc_chars": 79,
|
||||
"calls_skills": [
|
||||
"phase",
|
||||
@@ -272,7 +272,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "graphify",
|
||||
"name": "gsd:graphify",
|
||||
"name": "msd:graphify",
|
||||
"desc": "Build, query, and inspect the project knowledge graph in .planning/graphs/",
|
||||
"desc_chars": 74,
|
||||
"calls_skills": [
|
||||
@@ -286,7 +286,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "health",
|
||||
"name": "gsd:health",
|
||||
"name": "msd:health",
|
||||
"desc": "Diagnose planning directory health and optionally repair issues",
|
||||
"desc_chars": 63,
|
||||
"calls_skills": [],
|
||||
@@ -295,8 +295,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "help",
|
||||
"name": "gsd:help",
|
||||
"desc": "Show available GSD commands and usage guide",
|
||||
"name": "msd:help",
|
||||
"desc": "Show available MSD commands and usage guide",
|
||||
"desc_chars": 43,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [],
|
||||
@@ -304,12 +304,12 @@
|
||||
},
|
||||
{
|
||||
"stem": "import",
|
||||
"name": "gsd:import",
|
||||
"name": "msd:import",
|
||||
"desc": "Ingest external plans with conflict detection against project decisions before writing anything.",
|
||||
"desc_chars": 96,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [
|
||||
"gsd-plan-checker"
|
||||
"msd-plan-checker"
|
||||
],
|
||||
"called_by": [
|
||||
"code-review",
|
||||
@@ -318,7 +318,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "inbox",
|
||||
"name": "gsd:inbox",
|
||||
"name": "msd:inbox",
|
||||
"desc": "Triage and review open GitHub issues and PRs against project templates and contribution guidelines.",
|
||||
"desc_chars": 99,
|
||||
"calls_skills": [
|
||||
@@ -331,18 +331,18 @@
|
||||
},
|
||||
{
|
||||
"stem": "ingest-docs",
|
||||
"name": "gsd:ingest-docs",
|
||||
"name": "msd:ingest-docs",
|
||||
"desc": "Bootstrap or merge a .planning/ setup from existing ADRs, PRDs, SPECs, and docs in a repo.",
|
||||
"desc_chars": 90,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [
|
||||
"gsd-roadmapper"
|
||||
"msd-roadmapper"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "manager",
|
||||
"name": "gsd:manager",
|
||||
"name": "msd:manager",
|
||||
"desc": "Interactive command center for managing multiple phases from one terminal",
|
||||
"desc_chars": 73,
|
||||
"calls_skills": [
|
||||
@@ -353,20 +353,20 @@
|
||||
},
|
||||
{
|
||||
"stem": "map-codebase",
|
||||
"name": "gsd:map-codebase",
|
||||
"name": "msd:map-codebase",
|
||||
"desc": "Analyze codebase with parallel mapper agents to produce .planning/codebase/ documents",
|
||||
"desc_chars": 85,
|
||||
"calls_skills": [
|
||||
"config"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-codebase-mapper"
|
||||
"msd-codebase-mapper"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "milestone-summary",
|
||||
"name": "gsd:milestone-summary",
|
||||
"name": "msd:milestone-summary",
|
||||
"desc": "Generate a comprehensive project summary from milestone artifacts for team onboarding and review",
|
||||
"desc_chars": 96,
|
||||
"calls_skills": [
|
||||
@@ -377,7 +377,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "mvp-phase",
|
||||
"name": "gsd:mvp-phase",
|
||||
"name": "msd:mvp-phase",
|
||||
"desc": "Plan a phase as a vertical MVP slice \u2014 user story, SPIDR splitting, then plan-phase",
|
||||
"desc_chars": 83,
|
||||
"calls_skills": [
|
||||
@@ -390,7 +390,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "new-milestone",
|
||||
"name": "gsd:new-milestone",
|
||||
"name": "msd:new-milestone",
|
||||
"desc": "Start a new milestone cycle \u2014 update PROJECT.md and route to requirements",
|
||||
"desc_chars": 73,
|
||||
"calls_skills": [
|
||||
@@ -402,7 +402,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "new-project",
|
||||
"name": "gsd:new-project",
|
||||
"name": "msd:new-project",
|
||||
"desc": "Initialize a new project with deep context gathering and PROJECT.md",
|
||||
"desc_chars": 67,
|
||||
"calls_skills": [
|
||||
@@ -417,7 +417,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-context",
|
||||
"name": "gsd-context",
|
||||
"name": "msd-context",
|
||||
"desc": "codebase intelligence | map graphify docs learnings",
|
||||
"desc_chars": 51,
|
||||
"calls_skills": [
|
||||
@@ -428,7 +428,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-ideate",
|
||||
"name": "gsd-ideate",
|
||||
"name": "msd-ideate",
|
||||
"desc": "exploration capture | explore sketch spike spec capture",
|
||||
"desc_chars": 55,
|
||||
"calls_skills": [
|
||||
@@ -441,7 +441,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-manage",
|
||||
"name": "gsd-manage",
|
||||
"name": "msd-manage",
|
||||
"desc": "config workspace | workstreams thread update ship inbox",
|
||||
"desc_chars": 55,
|
||||
"calls_skills": [
|
||||
@@ -455,7 +455,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-project",
|
||||
"name": "gsd-project",
|
||||
"name": "msd-project",
|
||||
"desc": "project lifecycle | milestones audits summary",
|
||||
"desc_chars": 45,
|
||||
"calls_skills": [],
|
||||
@@ -464,7 +464,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-review",
|
||||
"name": "gsd-quality",
|
||||
"name": "msd-quality",
|
||||
"desc": "quality gates | code review debug audit security eval ui",
|
||||
"desc_chars": 56,
|
||||
"calls_skills": [
|
||||
@@ -476,7 +476,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ns-workflow",
|
||||
"name": "gsd-workflow",
|
||||
"name": "msd-workflow",
|
||||
"desc": "workflow | discuss plan execute verify phase progress",
|
||||
"desc_chars": 53,
|
||||
"calls_skills": [
|
||||
@@ -488,7 +488,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "pause-work",
|
||||
"name": "gsd:pause-work",
|
||||
"name": "msd:pause-work",
|
||||
"desc": "Create context handoff when pausing work mid-phase",
|
||||
"desc_chars": 50,
|
||||
"calls_skills": [
|
||||
@@ -500,7 +500,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "phase",
|
||||
"name": "gsd:phase",
|
||||
"name": "msd:phase",
|
||||
"desc": "CRUD for phases in ROADMAP.md \u2014 add, insert, remove, or edit phases",
|
||||
"desc_chars": 67,
|
||||
"calls_skills": [],
|
||||
@@ -548,7 +548,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "plan-phase",
|
||||
"name": "gsd:plan-phase",
|
||||
"name": "msd:plan-phase",
|
||||
"desc": "Create detailed phase plan (PLAN.md) with verification loop",
|
||||
"desc_chars": 59,
|
||||
"calls_skills": [
|
||||
@@ -558,9 +558,9 @@
|
||||
"update"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-phase-researcher",
|
||||
"gsd-plan-checker",
|
||||
"gsd-planner"
|
||||
"msd-phase-researcher",
|
||||
"msd-plan-checker",
|
||||
"msd-planner"
|
||||
],
|
||||
"called_by": [
|
||||
"mvp-phase",
|
||||
@@ -569,7 +569,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "plan-review-convergence",
|
||||
"name": "gsd:plan-review-convergence",
|
||||
"name": "msd:plan-review-convergence",
|
||||
"desc": "Cross-AI plan convergence loop \u2014 replan with review feedback until no HIGH concerns remain.",
|
||||
"desc_chars": 91,
|
||||
"calls_skills": [
|
||||
@@ -577,14 +577,14 @@
|
||||
"review"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-plan-checker",
|
||||
"gsd-planner"
|
||||
"msd-plan-checker",
|
||||
"msd-planner"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "pr-branch",
|
||||
"name": "gsd:pr-branch",
|
||||
"name": "msd:pr-branch",
|
||||
"desc": "Create a clean PR branch by filtering out .planning/ commits \u2014 ready for code review",
|
||||
"desc_chars": 84,
|
||||
"calls_skills": [
|
||||
@@ -595,7 +595,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "profile-user",
|
||||
"name": "gsd:profile-user",
|
||||
"name": "msd:profile-user",
|
||||
"desc": "Generate developer behavioral profile and create Claude-discoverable artifacts",
|
||||
"desc_chars": 78,
|
||||
"calls_skills": [],
|
||||
@@ -604,8 +604,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "progress",
|
||||
"name": "gsd:progress",
|
||||
"desc": "Check progress, advance workflow, or dispatch freeform intent \u2014 the unified GSD situational command",
|
||||
"name": "msd:progress",
|
||||
"desc": "Check progress, advance workflow, or dispatch freeform intent \u2014 the unified MSD situational command",
|
||||
"desc_chars": 99,
|
||||
"calls_skills": [
|
||||
"phase"
|
||||
@@ -621,15 +621,15 @@
|
||||
},
|
||||
{
|
||||
"stem": "quick",
|
||||
"name": "gsd:quick",
|
||||
"desc": "Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents",
|
||||
"name": "msd:quick",
|
||||
"desc": "Execute a quick task with MSD guarantees (atomic commits, state tracking) but skip optional agents",
|
||||
"desc_chars": 98,
|
||||
"calls_skills": [
|
||||
"phase"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-executor",
|
||||
"gsd-planner"
|
||||
"msd-executor",
|
||||
"msd-planner"
|
||||
],
|
||||
"called_by": [
|
||||
"code-review",
|
||||
@@ -638,7 +638,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "resume-work",
|
||||
"name": "gsd:resume-work",
|
||||
"name": "msd:resume-work",
|
||||
"desc": "Resume work from previous session with full context restoration",
|
||||
"desc_chars": 63,
|
||||
"calls_skills": [],
|
||||
@@ -647,7 +647,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "review-backlog",
|
||||
"name": "gsd:review-backlog",
|
||||
"name": "msd:review-backlog",
|
||||
"desc": "Review and promote backlog items to active milestone",
|
||||
"desc_chars": 52,
|
||||
"calls_skills": [
|
||||
@@ -659,7 +659,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "review",
|
||||
"name": "gsd:review",
|
||||
"name": "msd:review",
|
||||
"desc": "Request cross-AI peer review of phase plans from external AI CLIs",
|
||||
"desc_chars": 65,
|
||||
"calls_skills": [
|
||||
@@ -683,7 +683,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "secure-phase",
|
||||
"name": "gsd:secure-phase",
|
||||
"name": "msd:secure-phase",
|
||||
"desc": "Retroactively verify threat mitigations for a completed phase",
|
||||
"desc_chars": 61,
|
||||
"calls_skills": [
|
||||
@@ -694,8 +694,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "settings",
|
||||
"name": "gsd:settings",
|
||||
"desc": "Configure GSD workflow toggles and model profile",
|
||||
"name": "msd:settings",
|
||||
"desc": "Configure MSD workflow toggles and model profile",
|
||||
"desc_chars": 48,
|
||||
"calls_skills": [
|
||||
"quick"
|
||||
@@ -708,7 +708,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ship",
|
||||
"name": "gsd:ship",
|
||||
"name": "msd:ship",
|
||||
"desc": "Create PR, run review, and prepare for merge after verification passes",
|
||||
"desc_chars": 70,
|
||||
"calls_skills": [
|
||||
@@ -719,7 +719,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "sketch",
|
||||
"name": "gsd:sketch",
|
||||
"name": "msd:sketch",
|
||||
"desc": "Sketch UI/design ideas with throwaway HTML mockups, or propose what to sketch next (frontier mode)",
|
||||
"desc_chars": 98,
|
||||
"calls_skills": [
|
||||
@@ -730,7 +730,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "spec-phase",
|
||||
"name": "gsd:spec-phase",
|
||||
"name": "msd:spec-phase",
|
||||
"desc": "Clarify WHAT a phase delivers with ambiguity scoring; produces a SPEC.md before discuss-phase.",
|
||||
"desc_chars": 94,
|
||||
"calls_skills": [
|
||||
@@ -744,7 +744,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "spike",
|
||||
"name": "gsd:spike",
|
||||
"name": "msd:spike",
|
||||
"desc": "Spike an idea through experiential exploration, or propose what to spike next (frontier mode)",
|
||||
"desc_chars": 93,
|
||||
"calls_skills": [],
|
||||
@@ -756,7 +756,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "stats",
|
||||
"name": "gsd:stats",
|
||||
"name": "msd:stats",
|
||||
"desc": "Display project statistics \u2014 phases, plans, requirements, git metrics, and timeline",
|
||||
"desc_chars": 83,
|
||||
"calls_skills": [
|
||||
@@ -770,7 +770,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "thread",
|
||||
"name": "gsd:thread",
|
||||
"name": "msd:thread",
|
||||
"desc": "Manage persistent context threads for cross-session work",
|
||||
"desc_chars": 56,
|
||||
"calls_skills": [
|
||||
@@ -783,21 +783,21 @@
|
||||
},
|
||||
{
|
||||
"stem": "ui-phase",
|
||||
"name": "gsd:ui-phase",
|
||||
"name": "msd:ui-phase",
|
||||
"desc": "Generate UI design contract (UI-SPEC.md) for frontend phases",
|
||||
"desc_chars": 60,
|
||||
"calls_skills": [
|
||||
"phase"
|
||||
],
|
||||
"calls_agents": [
|
||||
"gsd-ui-checker",
|
||||
"gsd-ui-researcher"
|
||||
"msd-ui-checker",
|
||||
"msd-ui-researcher"
|
||||
],
|
||||
"called_by": []
|
||||
},
|
||||
{
|
||||
"stem": "ui-review",
|
||||
"name": "gsd:ui-review",
|
||||
"name": "msd:ui-review",
|
||||
"desc": "Retroactive 6-pillar visual audit of implemented frontend code",
|
||||
"desc_chars": 62,
|
||||
"calls_skills": [
|
||||
@@ -808,7 +808,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "ultraplan-phase",
|
||||
"name": "gsd:ultraplan-phase",
|
||||
"name": "msd:ultraplan-phase",
|
||||
"desc": "[BETA] Offload plan phase to Claude Code's ultraplan cloud; review in browser and import back.",
|
||||
"desc_chars": 94,
|
||||
"calls_skills": [
|
||||
@@ -820,7 +820,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "undo",
|
||||
"name": "gsd:undo",
|
||||
"name": "msd:undo",
|
||||
"desc": "Safe git revert. Roll back phase or plan commits using the phase manifest with dependency checks.",
|
||||
"desc_chars": 97,
|
||||
"calls_skills": [
|
||||
@@ -831,8 +831,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "update",
|
||||
"name": "gsd:update",
|
||||
"desc": "Update GSD to latest version with changelog display",
|
||||
"name": "msd:update",
|
||||
"desc": "Update MSD to latest version with changelog display",
|
||||
"desc_chars": 51,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [],
|
||||
@@ -846,7 +846,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "validate-phase",
|
||||
"name": "gsd:validate-phase",
|
||||
"name": "msd:validate-phase",
|
||||
"desc": "Retroactively audit and fill Nyquist validation gaps for a completed phase",
|
||||
"desc_chars": 74,
|
||||
"calls_skills": [
|
||||
@@ -857,7 +857,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "verify-work",
|
||||
"name": "gsd:verify-work",
|
||||
"name": "msd:verify-work",
|
||||
"desc": "Validate built features through conversational UAT",
|
||||
"desc_chars": 50,
|
||||
"calls_skills": [
|
||||
@@ -870,8 +870,8 @@
|
||||
},
|
||||
{
|
||||
"stem": "workspace",
|
||||
"name": "gsd:workspace",
|
||||
"desc": "Manage GSD workspaces \u2014 create, list, or remove isolated workspace environments",
|
||||
"name": "msd:workspace",
|
||||
"desc": "Manage MSD workspaces \u2014 create, list, or remove isolated workspace environments",
|
||||
"desc_chars": 79,
|
||||
"calls_skills": [],
|
||||
"calls_agents": [],
|
||||
@@ -879,7 +879,7 @@
|
||||
},
|
||||
{
|
||||
"stem": "workstreams",
|
||||
"name": "gsd:workstreams",
|
||||
"name": "msd:workstreams",
|
||||
"desc": "Manage parallel workstreams \u2014 list, create, switch, status, progress, complete, and resume",
|
||||
"desc_chars": 90,
|
||||
"calls_skills": [
|
||||
@@ -996,23 +996,23 @@
|
||||
]
|
||||
},
|
||||
"agent_usage": {
|
||||
"gsd-ai-researcher": 1,
|
||||
"gsd-domain-researcher": 1,
|
||||
"gsd-eval-planner": 1,
|
||||
"gsd-framework-selector": 1,
|
||||
"gsd-code-fixer": 1,
|
||||
"gsd-code-reviewer": 1,
|
||||
"gsd-debug-session-manager": 1,
|
||||
"gsd-debugger": 1,
|
||||
"gsd-doc-verifier": 1,
|
||||
"gsd-doc-writer": 1,
|
||||
"gsd-plan-checker": 3,
|
||||
"gsd-roadmapper": 1,
|
||||
"gsd-codebase-mapper": 1,
|
||||
"gsd-phase-researcher": 1,
|
||||
"gsd-planner": 3,
|
||||
"gsd-executor": 1,
|
||||
"gsd-ui-checker": 1,
|
||||
"gsd-ui-researcher": 1
|
||||
"msd-ai-researcher": 1,
|
||||
"msd-domain-researcher": 1,
|
||||
"msd-eval-planner": 1,
|
||||
"msd-framework-selector": 1,
|
||||
"msd-code-fixer": 1,
|
||||
"msd-code-reviewer": 1,
|
||||
"msd-debug-session-manager": 1,
|
||||
"msd-debugger": 1,
|
||||
"msd-doc-verifier": 1,
|
||||
"msd-doc-writer": 1,
|
||||
"msd-plan-checker": 3,
|
||||
"msd-roadmapper": 1,
|
||||
"msd-codebase-mapper": 1,
|
||||
"msd-phase-researcher": 1,
|
||||
"msd-planner": 3,
|
||||
"msd-executor": 1,
|
||||
"msd-ui-checker": 1,
|
||||
"msd-ui-researcher": 1
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,7 @@ history, CHANGELOG) on branch `next` at commit `c0b2a05d2f`. Every claim below i
|
||||
- `GEMINI.md` itself was **repointed, not deleted**, in the same commit (`git log --oneline -- GEMINI.md` shows `8f2ebbe9bf` as the second-most-recent touch after the original `a3aa0ae142` "ship a gemini-extension.json extension package" (#775/#818)).
|
||||
- **`capabilities/gemini/capability.json` was re-created later**, as a reviewer-lane-only
|
||||
manifest, by the reviewer-lane-declaration work: `6a9babda69` `chore(#2798): declare the
|
||||
eleven reviewer lanes as manifest data (#2837)`, per ADR-2782 (`docs/adr/2782-reviewer-lane-capability-surface.md`). Confirmed live today: `capabilities/gemini/capability.json:1-6` — `"role": "reviewer"`, description *"cross-AI `/gsd-review` reviewer lane only; not a GSD install target (no runtime body, no artifacts)"*. This is intentional, not a regression of #1928 — CHANGELOG.md:810 documents the same PR: *"Five reviewers GSD never installs into (Gemini, CodeRabbit, Ollama, LM Studio, llama.cpp) become lane-only capabilities with no install surface."*
|
||||
eleven reviewer lanes as manifest data (#2837)`, per ADR-2782 (`docs/adr/2782-reviewer-lane-capability-surface.md`). Confirmed live today: `capabilities/gemini/capability.json:1-6` — `"role": "reviewer"`, description *"cross-AI `/msd-review` reviewer lane only; not a MSD install target (no runtime body, no artifacts)"*. This is intentional, not a regression of #1928 — CHANGELOG.md:810 documents the same PR: *"Five reviewers MSD never installs into (Gemini, CodeRabbit, Ollama, LM Studio, llama.cpp) become lane-only capabilities with no install surface."*
|
||||
- **Antigravity's own evolution as a runtime** (separate from the Gemini removal, but
|
||||
entangled with it because it shares the `.gemini` dialect):
|
||||
- `fbd62cd84f` `feat(#1035): phase 5a — author 16 role:runtime capability descriptors (registry-only) (#1039)` — Antigravity first declared as a capability descriptor.
|
||||
@@ -41,7 +41,7 @@ history, CHANGELOG) on branch `next` at commit `c0b2a05d2f`. Every claim below i
|
||||
- `capabilities/antigravity/capability.json:1-6` no longer has a `gemini` sibling runtime descriptor; `capabilities/gemini/capability.json:1-4` explicitly has **no `runtime` body at all** — only `reviewer`.
|
||||
|
||||
**(b) Gemini *CLI reviewer lane* (`capabilities/gemini/`) — LIVE and INTENTIONAL.**
|
||||
- `capabilities/gemini/capability.json:1-40` — `role: "reviewer"`, `reviewer.slug: "gemini"`, flags `--gemini`, spawn transport `gemini -p - -m <model>`. Still wired into the registry: `gsd-core/bin/lib/capability-registry.cjs:1793-1817` (reviewer body), `:4945-4947` (config-key ownership), `:8148` (`"gemini": []` — no requires).
|
||||
- `capabilities/gemini/capability.json:1-40` — `role: "reviewer"`, `reviewer.slug: "gemini"`, flags `--gemini`, spawn transport `gemini -p - -m <model>`. Still wired into the registry: `msd-core/bin/lib/capability-registry.cjs:1793-1817` (reviewer body), `:4945-4947` (config-key ownership), `:8148` (`"gemini": []` — no requires).
|
||||
- Documented as a live reviewer flag in `docs/COMMANDS.md:269,757,1038,1810,1826,1834,1847-1851` and `docs/CONFIGURATION.md:297,329,340,384,394,401,1464,1474,1476,1492`, and in `docs/reference/capability-matrix.md:125` — `| gemini | reviewer | full | >=1.8.0 | — | — | first-party |`.
|
||||
- CHANGELOG.md:89 shows the lane still receiving fixes as recently as #3996/#4184. This is a maintained, first-party lane — not an oversight.
|
||||
|
||||
@@ -56,7 +56,7 @@ Confirmed exactly as the CRITICAL CONTEXT states, all still present and load-bea
|
||||
- `docs/reference/host-integration-capability-matrix.md:315,317,322,330` cite Google's own migration blog (`developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli`) as the evidentiary source for Antigravity inheriting the Gemini backend.
|
||||
|
||||
**(d) Gemini *models* in the model catalog — legitimate product names.**
|
||||
- `gsd-core/bin/shared/model-catalog.json` contains `gemini-*` model IDs (not read directly here per the guard, but referenced in CHANGELOG.md:1561: *"the gemini opus default `gemini-3-pro` → `gemini-3.1-pro-preview`"*).
|
||||
- `msd-core/bin/shared/model-catalog.json` contains `gemini-*` model IDs (not read directly here per the guard, but referenced in CHANGELOG.md:1561: *"the gemini opus default `gemini-3-pro` → `gemini-3.1-pro-preview`"*).
|
||||
- Config docs: `docs/CONFIGURATION.md:297,1492` (`"gemini": "gemini-2.5-pro"`), `docs/CLI-TOOLS.md:1426` (`review.models.gemini "gemini-2.5-pro"`). All legitimate — naming the provider's model, not the retired runtime.
|
||||
|
||||
**(e) Historical/archival references — immutable, must not be rewritten.**
|
||||
@@ -76,7 +76,7 @@ while the English originals were scrubbed clean in `8f2ebbe9bf` and have zero su
|
||||
- **What it is now**: Antigravity's `contextFileName` (inherited from the shared Gemini 3
|
||||
backend) — the file Antigravity auto-reads for project context, analogous to `CLAUDE.md` for
|
||||
Claude Code or `AGENTS.md` for Codex/OpenCode. Confirmed by its own banner: `GEMINI.md:1-6`
|
||||
— *"# GSD Core — Antigravity CLI context… this file is the context Antigravity reads
|
||||
— *"# MSD Core — Antigravity CLI context… this file is the context Antigravity reads
|
||||
automatically (its `contextFileName` is `GEMINI.md`, inherited from the shared Gemini 3
|
||||
backend)."*
|
||||
- **Provenance**: originally shipped as part of a Gemini CLI extension package
|
||||
@@ -85,12 +85,12 @@ while the English originals were scrubbed clean in `8f2ebbe9bf` and have zero su
|
||||
the Gemini runtime). It is correctly an Antigravity artifact today, not a Gemini-runtime
|
||||
leftover — PRESERVE.
|
||||
- **Who generates/consumes it for user projects** (distinct from this repo's own root
|
||||
`GEMINI.md`, which is GSD's self-description for AI agents working on GSD itself):
|
||||
`GEMINI.md`, which is MSD's self-description for AI agents working on MSD itself):
|
||||
`getProjectInstructionFile(runtime)` in `src/runtime-name-policy.cts:105-127` maps
|
||||
`antigravity → GEMINI.md` (also `gemini → GEMINI.md` per CHANGELOG.md:1488, though the
|
||||
`gemini` runtime key itself no longer resolves to an installable runtime — the mapping table
|
||||
entry is vestigial/defensive, not reachable through `--gemini`). Compiled counterpart:
|
||||
`gsd-core/bin/lib/runtime-name-policy.cjs:118,130,140`. Consumed by the new-project workflow
|
||||
`msd-core/bin/lib/runtime-name-policy.cjs:118,130,140`. Consumed by the new-project workflow
|
||||
and `generate-claude-md` path per CHANGELOG.md:1488: *"A shared `getProjectInstructionFile(runtime)` policy… is now the single source of truth consumed by both the new-project workflow and the generate-claude-md path, with a parity test guarding drift."*
|
||||
- **Guard**: `tests/project-instruction-file-parity.test.cjs` exists (per the file inventory)
|
||||
and is the parity test CHANGELOG.md:1488 refers to. `tests/product-name-purity.test.cjs:23-41`
|
||||
@@ -106,11 +106,11 @@ while the English originals were scrubbed clean in `8f2ebbe9bf` and have zero su
|
||||
reviewer-lane docs, model-catalog entries, ADR/CHANGELOG history, and the Antigravity dialect
|
||||
notes in `CONTEXT.md`, `docs/reference/host-integration-capability-matrix.md`, and
|
||||
`docs/installer-migrations.md:446,583`. The generated files (`docs/FEATURES.md`,
|
||||
`gsd-core/bin/lib/capability-registry.cjs`, `gsd-core/bin/lib/capability-validator.cjs`) are
|
||||
`msd-core/bin/lib/capability-registry.cjs`, `msd-core/bin/lib/capability-validator.cjs`) are
|
||||
**not hand-edited** — `docs/FEATURES.md` is emitted by `scripts/gen-features.cjs` (registered
|
||||
in `scripts/docs-guard-registry.cjs`), and the `.cjs` registry files under `gsd-core/bin/lib/`
|
||||
in `scripts/docs-guard-registry.cjs`), and the `.cjs` registry files under `msd-core/bin/lib/`
|
||||
are the build output of the `.cts` sources under `src/` (per `CONTEXT.md:248`, "NOT generated
|
||||
from `src/*.cts`" applies only to `bin/install.js` itself — the `gsd-core/bin/lib/*` modules
|
||||
from `src/*.cts`" applies only to `bin/install.js` itself — the `msd-core/bin/lib/*` modules
|
||||
ARE generated). Do not hand-edit generated files; any fix belongs in the `.cts` source or the
|
||||
capability `.json` and must be regenerated.
|
||||
|
||||
@@ -122,7 +122,7 @@ capability `.json` and must be regenerated.
|
||||
| `README.pt-BR.md` | 9, 24, 46 | Same as above (Portuguese) | (f) | **MIGRATE** | Same |
|
||||
| `docs/ja-JP/ARCHITECTURE.md` | 24, 115, 449, 561, 637 | Describes Gemini CLI as a live runtime with install paths (`~/.gemini/`), colon-form commands, and a runtime table row | (f) | **MIGRATE** | `docs/ARCHITECTURE.md` (EN) has no such runtime-table row for gemini; only legitimate Antigravity `.gemini/*` path mentions (`:708,995`) |
|
||||
| `docs/ko-KR/ARCHITECTURE.md` | 24, 118, 487, 615 | Same (Korean) | (f) | **MIGRATE** | Same |
|
||||
| `docs/ja-JP/COMMANDS.md` | 10, 1241 | "Gemini CLI: `/gsd:command-name`" colon-namespace install instructions; `--gemini` reviewer row mixed with stale namespace claim | (f) partial | **MIGRATE** (namespace claim only) | EN `docs/COMMANDS.md` documents `--gemini` only as a reviewer flag (sense b, legitimate); the colon-namespace-install prose is runtime-install language that no longer applies |
|
||||
| `docs/ja-JP/COMMANDS.md` | 10, 1241 | "Gemini CLI: `/msd:command-name`" colon-namespace install instructions; `--gemini` reviewer row mixed with stale namespace claim | (f) partial | **MIGRATE** (namespace claim only) | EN `docs/COMMANDS.md` documents `--gemini` only as a reviewer flag (sense b, legitimate); the colon-namespace-install prose is runtime-install language that no longer applies |
|
||||
| `docs/ko-KR/COMMANDS.md` | 10, 1247 | Same | (f) partial | **MIGRATE** | Same |
|
||||
| `docs/ja-JP/USER-GUIDE.md` | 39, 674, 751 | "Gemini CLI-only" colon-form install flag, `~/.gemini` config dir table row, non-Claude runtime list including Gemini CLI | (f) | **MIGRATE** | EN `docs/USER-GUIDE.md` has zero gemini mentions |
|
||||
| `docs/ko-KR/USER-GUIDE.md`, `docs/pt-BR/USER-GUIDE.md`, `docs/zh-CN/USER-GUIDE.md` | (equivalent) | Same pattern | (f) | **MIGRATE** | Same |
|
||||
@@ -183,7 +183,7 @@ accounts for nearly all of it.
|
||||
repo's translation-parity guards, but (per their names and the `docs-guard-registry.cjs`
|
||||
registration table) they check *structural* parity — that a live registry-derived table
|
||||
(reviewer flags, STATE.md field reference) is present and enumerated identically across
|
||||
locales — not that free-form prose describing "which runtimes GSD supports" is factually
|
||||
locales — not that free-form prose describing "which runtimes MSD supports" is factually
|
||||
current. They would catch a **missing row**, not a **stale but present** row.
|
||||
- **Missing guard**: there is no test that asserts "no locale doc claims Gemini CLI is an
|
||||
installable runtime" the way `tests/gemini-runtime-removed.test.cjs` asserts it for the
|
||||
@@ -227,7 +227,7 @@ touches the stale references identified in §4 must carry:
|
||||
— **UNDETERMINED**: no `gen-features-<locale>.cjs` or translation-sync script was found by
|
||||
name; the translated FEATURES.md files may be manually maintained mirrors, which would make
|
||||
them structurally prone to exactly this kind of drift).
|
||||
- **Glossary gate** — `CLAUDE.md` "Repo conventions" cites `gsd-context-md-glossary-is-a-pr-gate` (per user memory index); `CONTEXT.md` itself mentions Gemini/Antigravity only in the legitimate installer/config-dir sense (`CONTEXT.md:248`) and does not need correction based on this pass.
|
||||
- **Glossary gate** — `CLAUDE.md` "Repo conventions" cites `msd-context-md-glossary-is-a-pr-gate` (per user memory index); `CONTEXT.md` itself mentions Gemini/Antigravity only in the legitimate installer/config-dir sense (`CONTEXT.md:248`) and does not need correction based on this pass.
|
||||
- **Translation parity** — no dedicated "translation must match EN" gate was found beyond the
|
||||
narrow structural `LOCALES`-based tests in §5; this is the actual missing-guard finding.
|
||||
- **ADR requirement** — a prose/docs correction of this kind (removing stale claims,
|
||||
@@ -249,7 +249,7 @@ edited** — remediation is a separate, subsequent change subject to the ripple
|
||||
## 7. Addendum — the severest class the §4 sweep missed: live workflow behavior
|
||||
|
||||
§4 concluded the residue is "overwhelmingly a translation-parity problem". That is true by
|
||||
*count*, but not by *severity*. Runtime-loaded workflow text under `gsd-core/workflows/` still
|
||||
*count*, but not by *severity*. Runtime-loaded workflow text under `msd-core/workflows/` still
|
||||
assigns and offers the retired `gemini` runtime id, and the name policy resolves that id to
|
||||
**Claude Code** instead of failing loudly.
|
||||
|
||||
@@ -272,35 +272,35 @@ A stale `RUNTIME="gemini"` therefore produces a *plausible wrong answer* rather
|
||||
the Claude config dir, the label "Claude Code", and `AGENTS.md` as the instruction file.
|
||||
|
||||
Note `AGENTS.md` also contradicts the workflow's own documented claim at
|
||||
`gsd-core/workflows/new-project.md:1216` and `:1238` ("`GEMINI.md` for gemini/antigravity").
|
||||
`msd-core/workflows/new-project.md:1216` and `:1238` ("`GEMINI.md` for gemini/antigravity").
|
||||
The prose and the policy disagree about the same retired id.
|
||||
|
||||
### 7.2 The live assignment sites that reach it
|
||||
|
||||
| File | Line | Text | Verdict |
|
||||
|---|---|---|---|
|
||||
| `gsd-core/workflows/new-project.md` | 76 | `` Path contains `/.gemini/` → `RUNTIME=gemini` `` | **MIGRATE** — `~/.gemini` is Antigravity's parent; the only live child is `~/.gemini/antigravity` |
|
||||
| `gsd-core/workflows/new-project.md` | 84 | `elif [ -n "$GEMINI_CONFIG_DIR" ]; then RUNTIME="gemini"` | **MIGRATE** — live shell branch minting a non-canonical id that silently resolves to Claude Code (§7.1) |
|
||||
| `gsd-core/workflows/new-project.md` | 576 | "required for non-Claude runtimes: Codex, Gemini CLI, OpenCode…" | **MIGRATE** — names a sunset product as a supported runtime |
|
||||
| `gsd-core/workflows/new-project.md` | 1216, 1238 | "`GEMINI.md` for gemini/antigravity" | **MIGRATE** — drop `gemini/`; keep `antigravity` |
|
||||
| `gsd-core/workflows/settings-advanced.md` | 412 | `{ label: "gemini", description: "Gemini CLI." }` | **MIGRATE** — a user-facing `AskUserQuestion` menu still **offers Gemini CLI as a selectable runtime** |
|
||||
| `gsd-core/workflows/settings-advanced.md` | 393 | "Common runtimes: claude, codex, gemini, qwen" | **MIGRATE** |
|
||||
| `gsd-core/workflows/settings-advanced.md` | 360 | model-profile table row keyed `gemini` (runtime axis) | **MIGRATE** — the row key is the retired runtime; the `gemini-*` model IDs in it are legitimate (sense d) |
|
||||
| `gsd-core/workflows/settings-advanced.md` | 510-512 | `config-set runtime gemini`, `model_profile_overrides.gemini.*` | **MIGRATE** — documented examples that set a non-canonical runtime |
|
||||
| `gsd-core/workflows/settings-advanced.md` | 673-675 | `google` provider rows | **PRESERVE** — provider axis, not runtime |
|
||||
| `gsd-core/workflows/reapply-patches.md` | 62-63, 91-92, 101 | probes `$GEMINI_CONFIG_DIR` and `~/.gemini/gsd-local-patches`; bare `.gemini` in the dir scan | **MIGRATE** — same class as #4347 but **hand-written, so `npm run sync:launcher` does not reach it** |
|
||||
| `gsd-core/workflows/update.md` | 77, 135, 276, 277, 315 | bare `~/.gemini/` / `./.gemini/` as a runtime config dir | **MIGRATE** — the live dir is `~/.gemini/antigravity` |
|
||||
| `gsd-core/workflows/update.md` | 466 | dir scan list including bare `.gemini` | **MIGRATE** |
|
||||
| `gsd-core/workflows/update.md` | 17, 466 | `.gemini/antigravity{,-ide,-cli}` → `antigravity` | **PRESERVE** |
|
||||
| `msd-core/workflows/new-project.md` | 76 | `` Path contains `/.gemini/` → `RUNTIME=gemini` `` | **MIGRATE** — `~/.gemini` is Antigravity's parent; the only live child is `~/.gemini/antigravity` |
|
||||
| `msd-core/workflows/new-project.md` | 84 | `elif [ -n "$GEMINI_CONFIG_DIR" ]; then RUNTIME="gemini"` | **MIGRATE** — live shell branch minting a non-canonical id that silently resolves to Claude Code (§7.1) |
|
||||
| `msd-core/workflows/new-project.md` | 576 | "required for non-Claude runtimes: Codex, Gemini CLI, OpenCode…" | **MIGRATE** — names a sunset product as a supported runtime |
|
||||
| `msd-core/workflows/new-project.md` | 1216, 1238 | "`GEMINI.md` for gemini/antigravity" | **MIGRATE** — drop `gemini/`; keep `antigravity` |
|
||||
| `msd-core/workflows/settings-advanced.md` | 412 | `{ label: "gemini", description: "Gemini CLI." }` | **MIGRATE** — a user-facing `AskUserQuestion` menu still **offers Gemini CLI as a selectable runtime** |
|
||||
| `msd-core/workflows/settings-advanced.md` | 393 | "Common runtimes: claude, codex, gemini, qwen" | **MIGRATE** |
|
||||
| `msd-core/workflows/settings-advanced.md` | 360 | model-profile table row keyed `gemini` (runtime axis) | **MIGRATE** — the row key is the retired runtime; the `gemini-*` model IDs in it are legitimate (sense d) |
|
||||
| `msd-core/workflows/settings-advanced.md` | 510-512 | `config-set runtime gemini`, `model_profile_overrides.gemini.*` | **MIGRATE** — documented examples that set a non-canonical runtime |
|
||||
| `msd-core/workflows/settings-advanced.md` | 673-675 | `google` provider rows | **PRESERVE** — provider axis, not runtime |
|
||||
| `msd-core/workflows/reapply-patches.md` | 62-63, 91-92, 101 | probes `$GEMINI_CONFIG_DIR` and `~/.gemini/msd-local-patches`; bare `.gemini` in the dir scan | **MIGRATE** — same class as #4347 but **hand-written, so `npm run sync:launcher` does not reach it** |
|
||||
| `msd-core/workflows/update.md` | 77, 135, 276, 277, 315 | bare `~/.gemini/` / `./.gemini/` as a runtime config dir | **MIGRATE** — the live dir is `~/.gemini/antigravity` |
|
||||
| `msd-core/workflows/update.md` | 466 | dir scan list including bare `.gemini` | **MIGRATE** |
|
||||
| `msd-core/workflows/update.md` | 17, 466 | `.gemini/antigravity{,-ide,-cli}` → `antigravity` | **PRESERVE** |
|
||||
|
||||
These are **not** doc-only paths for gating purposes: `pre-pr-gate.sh`'s `DOC_ONLY_RE` anchors
|
||||
its `*.md` arm at repo root only, so `gsd-core/workflows/*.md` is gated code.
|
||||
its `*.md` arm at repo root only, so `msd-core/workflows/*.md` is gated code.
|
||||
|
||||
### 7.3 Second, un-migrated launcher generation
|
||||
|
||||
`commands/gsd/graphify.md:83,100,125,144,164` and `skills/gsd-graphify/SKILL.md` carry an
|
||||
**older** launcher form (the long `elif [ -f … ]` chain) than the compact `_gsd_at` form in
|
||||
`gsd-core/workflows/_runtime-launcher.snippet.sh:1`. Both generations carry the
|
||||
`commands/msd/graphify.md:83,100,125,144,164` and `skills/msd-graphify/SKILL.md` carry an
|
||||
**older** launcher form (the long `elif [ -f … ]` chain) than the compact `_msd_at` form in
|
||||
`msd-core/workflows/_runtime-launcher.snippet.sh:1`. Both generations carry the
|
||||
`${GEMINI_CONFIG_DIR:-$HOME/.gemini}` arm. Any fix that only re-runs the launcher sync will
|
||||
therefore miss the graphify copies — a generative-fix divergence hazard.
|
||||
|
||||
@@ -343,7 +343,7 @@ search_file_content google_web_search web_fetch write_todos
|
||||
|
||||
Those are Gemini's built-in tool names, Antigravity genuinely speaks that dialect, and they remain
|
||||
byte-identical — the "trap" the table warned about is real and still stands for them. What (c) had
|
||||
swept in along with them were two **GSD-chosen identifiers**, which no external contract references.
|
||||
swept in along with them were two **MSD-chosen identifiers**, which no external contract references.
|
||||
Renaming those breaks nothing and removes a name that had outlived its runtime by more than a year.
|
||||
|
||||
Superseded rows, named explicitly so a later reader is not misled: §2(c)'s
|
||||
@@ -370,7 +370,7 @@ still carries 36 `gemini` references after the rename, which is the correct numb
|
||||
The symbol existed **twice** — the extracted copy in `src/runtime-artifact-conversion.cts` (and that
|
||||
module's `export =` block, added by #1182 as a dependency closure) plus a working inline copy in
|
||||
`bin/install.js`. `CLAUDE.md` labels that file "(generated)", but no `package.json` script emits it;
|
||||
`build:lib` is `tsc -p tsconfig.build.json` and writes `gsd-core/bin/lib/**` only. Both copies were
|
||||
`build:lib` is `tsc -p tsconfig.build.json` and writes `msd-core/bin/lib/**` only. Both copies were
|
||||
renamed, since renaming one would have left two names for one concept.
|
||||
|
||||
**Known gap:** the `bin/install.js` half is test-unprotected. That file exports none of the four
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
**Status:** research note — informs #3095 reactive classification and points at the proactive path forward.
|
||||
|
||||
GSD dispatches executor subagents into one of four host runtimes today: Claude Code, GitHub Copilot CLI, OpenAI Codex CLI, and Antigravity CLI (Google Gemini backend). Each provider exposes rate-limit information at three different layers — pre-warning, post-mortem error body, and underlying HTTP transport — but the *host runtime* (the CLI that wraps the provider for us) gates how much of that surfaces to GSD's orchestrator.
|
||||
MSD dispatches executor subagents into one of four host runtimes today: Claude Code, GitHub Copilot CLI, OpenAI Codex CLI, and Antigravity CLI (Google Gemini backend). Each provider exposes rate-limit information at three different layers — pre-warning, post-mortem error body, and underlying HTTP transport — but the *host runtime* (the CLI that wraps the provider for us) gates how much of that surfaces to MSD's orchestrator.
|
||||
|
||||
The reactive classifier shipped with #3095 (`agent.classify-failure`) parses post-mortem error bodies. This note records the proactive signals that exist at the provider layer but are not yet surfaced to orchestrators by the host runtimes — i.e. the forward path once host runtimes expose them to hooks.
|
||||
|
||||
## Anthropic / Claude Code
|
||||
|
||||
| Layer | Signal | Available to GSD today? |
|
||||
| Layer | Signal | Available to MSD today? |
|
||||
|--------------|---------------------------------------------------------------------------------------------------|----------------------------------------------------------|
|
||||
| HTTP headers | `anthropic-ratelimit-requests-remaining`, `anthropic-ratelimit-tokens-remaining`, `retry-after` on 429 | No — Claude Code does not forward these to hooks ([#33820](https://github.com/anthropics/claude-code/issues/33820), [#22407](https://github.com/anthropics/claude-code/issues/22407)) |
|
||||
| Agent SDK | `RateLimitEvent` with `status` transitions: `allowed` → `allowed_warning` → `rejected` | Only when callers use the Agent SDK directly |
|
||||
@@ -17,30 +17,30 @@ The reactive classifier shipped with #3095 (`agent.classify-failure`) parses pos
|
||||
|
||||
## GitHub Copilot CLI
|
||||
|
||||
| Layer | Signal | Available to GSD today? |
|
||||
| Layer | Signal | Available to MSD today? |
|
||||
|--------------|---------------------------------------------------------------------------------------------------------|-------------------------|
|
||||
| Pre-warning | CLI displays a warning when approaching a limit (per [GitHub Copilot usage-limits docs](https://docs.github.com/en/copilot/concepts/usage-limits)) | Visible in subprocess stdout, not as a structured signal |
|
||||
| Error body | `"hit a rate limit"`, `"exceeded your Copilot token usage"`, `rate_limited`, `user_weekly_rate_limited` | Yes — parsed by `agent.classify-failure` |
|
||||
|
||||
## OpenAI Codex CLI
|
||||
|
||||
| Layer | Signal | Available to GSD today? |
|
||||
| Layer | Signal | Available to MSD today? |
|
||||
|--------------|-----------------------------------------------------------------------|-------------------------|
|
||||
| HTTP headers | `x-ratelimit-remaining-requests`, `x-ratelimit-remaining-tokens` | No — Codex CLI does not forward these to hooks |
|
||||
| Error body | `429`, `usage_limit_reached`, `"exceeded your current quota"`, `Too Many Requests` ([openai/codex#9135](https://github.com/openai/codex/issues/9135)) | Yes — parsed by `agent.classify-failure` |
|
||||
|
||||
## Google Gemini (via Antigravity CLI)
|
||||
|
||||
*Host runtime: Antigravity CLI. GSD's Gemini CLI runtime was removed in #1928 after Google sunset it on 2026-06-18; Antigravity is the documented successor and runs on the same Gemini backend, so the provider-layer signals below are unchanged.*
|
||||
*Host runtime: Antigravity CLI. MSD's Gemini CLI runtime was removed in #1928 after Google sunset it on 2026-06-18; Antigravity is the documented successor and runs on the same Gemini backend, so the provider-layer signals below are unchanged.*
|
||||
|
||||
| Layer | Signal | Available to GSD today? |
|
||||
| Layer | Signal | Available to MSD today? |
|
||||
|--------------|---------------------------------------------------------------------------|-------------------------|
|
||||
| Error body | `RESOURCE_EXHAUSTED`, `"exceeded your current quota"`, `429` | Yes — parsed by `agent.classify-failure` |
|
||||
| Pre-warning | None documented at the CLI layer | n/a |
|
||||
|
||||
## Forward path
|
||||
|
||||
When the host runtimes (Claude Code, Copilot CLI, Codex CLI) start exposing rate-limit headers and SDK events to hooks — which is the active ask in [anthropics/claude-code#33820](https://github.com/anthropics/claude-code/issues/33820), [#22407](https://github.com/anthropics/claude-code/issues/22407), and [#32796](https://github.com/anthropics/claude-code/issues/32796) — GSD should:
|
||||
When the host runtimes (Claude Code, Copilot CLI, Codex CLI) start exposing rate-limit headers and SDK events to hooks — which is the active ask in [anthropics/claude-code#33820](https://github.com/anthropics/claude-code/issues/33820), [#22407](https://github.com/anthropics/claude-code/issues/22407), and [#32796](https://github.com/anthropics/claude-code/issues/32796) — MSD should:
|
||||
|
||||
1. Read `requests-remaining` / `tokens-remaining` in a PreToolUse / SessionStart hook and surface a soft warning to the user before dispatching a new wave when the values fall below a configurable threshold.
|
||||
2. Treat `RateLimitEvent.status == "allowed_warning"` (Anthropic Agent SDK) as a checkpoint signal in long-running executors — emit a partial SUMMARY and let the orchestrator pick up after reset.
|
||||
|
||||
Reference in New Issue
Block a user