@terreno/mcp 57.6.1 → 57.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/docs/upgrades/57.7.0.md +64 -0
  2. package/dist/docs/upgrades/58.0.0.md +4 -0
  3. package/dist/docs/versioned/next/explanation/loop-engineering.md +32 -3
  4. package/dist/docs/versioned/next/explanation/repository-settings.md +12 -5
  5. package/dist/docs/versioned/next/explanation/roadmap-process.md +41 -19
  6. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +271 -22
  7. package/dist/docs/versioned/next/explanation/static-analysis.md +3 -2
  8. package/dist/docs/versioned/next/explanation/test-isolation.md +42 -0
  9. package/dist/docs/versioned/next/how-to/circleci.md +95 -53
  10. package/dist/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  11. package/dist/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  12. package/dist/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  13. package/dist/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  14. package/dist/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  15. package/dist/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  16. package/dist/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  17. package/dist/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  18. package/dist/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  19. package/dist/docs/versioned/next/implementationPlans/announcements.md +2 -1
  20. package/dist/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  21. package/dist/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  22. package/dist/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  23. package/dist/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  24. package/dist/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  25. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  26. package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  27. package/dist/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  28. package/dist/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  29. package/dist/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  30. package/dist/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  31. package/dist/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  32. package/dist/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  33. package/dist/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  34. package/dist/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  35. package/dist/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  36. package/dist/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  37. package/dist/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  38. package/dist/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  39. package/dist/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  40. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  41. package/dist/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  42. package/dist/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  43. package/dist/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  44. package/dist/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  45. package/dist/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  46. package/dist/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  47. package/dist/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  48. package/dist/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  49. package/dist/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  50. package/dist/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  51. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  52. package/dist/docs/versioned/next/reference/test.md +1 -1
  53. package/dist/docs/versioned/next/reference/ui.md +65 -2
  54. package/dist/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  55. package/dist/docs/versioned/next/tasks/collection-registry.md +6 -6
  56. package/dist/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  57. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  58. package/package.json +2 -2
  59. package/src/docs/upgrades/57.7.0.md +64 -0
  60. package/src/docs/upgrades/58.0.0.md +4 -0
  61. package/src/docs/versioned/next/explanation/loop-engineering.md +32 -3
  62. package/src/docs/versioned/next/explanation/repository-settings.md +12 -5
  63. package/src/docs/versioned/next/explanation/roadmap-process.md +41 -19
  64. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +271 -22
  65. package/src/docs/versioned/next/explanation/static-analysis.md +3 -2
  66. package/src/docs/versioned/next/explanation/test-isolation.md +42 -0
  67. package/src/docs/versioned/next/how-to/circleci.md +95 -53
  68. package/src/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  69. package/src/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  70. package/src/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  71. package/src/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  72. package/src/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  73. package/src/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  74. package/src/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  75. package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  76. package/src/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  77. package/src/docs/versioned/next/implementationPlans/announcements.md +2 -1
  78. package/src/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  79. package/src/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  80. package/src/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  81. package/src/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  82. package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  83. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  84. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  85. package/src/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  86. package/src/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  87. package/src/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  88. package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  89. package/src/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  90. package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  91. package/src/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  92. package/src/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  93. package/src/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  94. package/src/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  95. package/src/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  96. package/src/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  97. package/src/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  98. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  99. package/src/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  100. package/src/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  101. package/src/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  102. package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  103. package/src/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  104. package/src/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  105. package/src/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  106. package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  107. package/src/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  108. package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  109. package/src/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  110. package/src/docs/versioned/next/reference/test.md +1 -1
  111. package/src/docs/versioned/next/reference/ui.md +65 -2
  112. package/src/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  113. package/src/docs/versioned/next/tasks/collection-registry.md +6 -6
  114. package/src/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  115. package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
@@ -1,6 +1,7 @@
1
1
  # Implementation Plan: Support answering agent (`@terreno/support`)
2
2
 
3
3
  **Status:** Draft — awaiting approval (Grow ran unattended; every Decisions row marked `assumed` is a recommended default the reviewer can change before Approve)
4
+ **Roadmap:** Area=`ai`, Target=`Future`, Impact=`Feature`
4
5
  **Branch:** `cursor/support-agent-grow-fd63`
5
6
  **Owner:** unassigned
6
7
  **Created:** 2026-09-15
@@ -1,7 +1,7 @@
1
1
  # Implementation Plan: @terreno/syncdb-codegen
2
2
 
3
3
  **Status:** Complete — shipped as `syncdb/src/codegen` + `terreno-syncdb-codegen`
4
- **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1087
4
+ **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1110
5
5
  **Branch:** cursor/syncdb-codegen-in-package-746d
6
6
  **Owner:**
7
7
  **Created:** 2026-07-08
@@ -1,7 +1,7 @@
1
1
  # @terreno/langfuse
2
2
 
3
3
  **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1093
4
- **Status:** Approved
4
+ **Status:** Complete
5
5
 
6
6
  > **See also:** Native in-app observability (prompts, traces, evals, experiments, review queue) is specified in [ai-observability.md](./ai-observability.md). This IP remains the **Langfuse Cloud/self-host vendor plugin**. Both plugins may be registered; traces/scores fan out (see that IP).
7
7
 
@@ -1,6 +1,6 @@
1
1
  # Implementation Plan: Upgrade Guides and the `upgrading-terreno` Skill
2
2
 
3
- **Status:** Approved
3
+ **Status:** Complete
4
4
  **Roadmap issue:** https://github.com/TerrenoLabs/terreno/issues/1013
5
5
  **Priority:** High
6
6
  **Effort:** Big batch
@@ -14,7 +14,7 @@ loops that invoke those stages; they are not stages and must not appear as `stag
14
14
  | `terreno-2-pick` | approved task + branch/state | one implemented slice, then Roast, then the next task | Roast, or Brew when the list is done |
15
15
  | `terreno-3-roast` | Pick result + current diff | independent requirement/evidence verdict for the current task | emit Pick if tasks remain, else Brew; never invoke Pick; pass a task-scoped briefing; do not spawn two unconstrained reviewers |
16
16
  | `terreno-4-brew` | Roast PASS for every in-scope task + branch/evidence | pushed head + PR + product-CI trigger check + review-bot wait + attached evidence | Taste |
17
- | `terreno-5-taste` | PR + current state | one current-head reaction; before push: pull latest `master`, re-verify last-run failed tests locally, run root `prepush` when present (otherwise affected-package checks) in a no-context subagent, then watch CI | null or fresh Taste |
17
+ | `terreno-5-taste` | PR + current state | one current-head reaction; before push: fetch latest `master` (merge only when needed), re-verify last-run failed tests locally, run root `prepush` when present (otherwise affected-package checks) in a no-context subagent, then watch CI; invoked directly, repeats bounded reactions until terminal | null or fresh Taste |
18
18
 
19
19
  Outer loops (not stages):
20
20
 
@@ -51,7 +51,7 @@ until async review bots (Bugbot, CodeQL, and similar) on the current head have r
51
51
  preferring provider CLI watch hooks or harness event subscriptions over sleep polling.
52
52
  Taste then waits in a loop for product CI using GitHub CLI (`gh pr checks --watch`,
53
53
  `gh run watch`) or CircleCI CLI (`circleci run watch`) until jobs are terminal or the
54
- wait times out. Before any push, Taste always pulls latest `master`, records last-run
54
+ wait times out. Before any push, Taste fetches latest `master` (merging it only when needed), records last-run
55
55
  failed tests and re-verifies them locally, then spawns a
56
56
  fresh subagent with no parent conversation. If the repository root defines a `prepush`
57
57
  package script, Taste runs it as the authoritative local gate; otherwise it falls back
@@ -148,7 +148,7 @@ the demo compiles. Add a story plus `demoConfig.tsx` registration for new
148
148
  components, or an allowlist entry with a specific reason — not "hard to demo".
149
149
  The allowlist is limited to shell/providers, React context objects, thin RN
150
150
  list wrappers, subcomponents already exercised by a parent story
151
- (Filter, Table, DateTimeField, HeightField, ConsentFormScreen), and
151
+ (DropdownPanel, Table, DateTimeField, HeightField, ConsentFormScreen), and
152
152
  product surfaces that belong in `example-frontend` rather than the isolated
153
153
  UI demo (announcements and in-app notifications).
154
154
  Standalone picker sheets (`NumberPickerActionSheet`, `DecimalRangeActionSheet`)
@@ -226,6 +226,69 @@ overrides it:
226
226
  | Helper | `{testID}.helper` |
227
227
  | Show/hide toggle | `{testID}.visibility-toggle` |
228
228
 
229
+ ### DropdownPanel
230
+
231
+ `DropdownPanel` is the compositional dropdown behind the DataTable filter popovers. A
232
+ trigger opens an anchored panel of arbitrary composed content with an optional
233
+ Apply / Clear / Cancel footer, so it also fits non-filter panels (bulk actions, column
234
+ pickers, sort menus).
235
+
236
+ ``````typescript
237
+ <DropdownPanel
238
+ label="Filters"
239
+ onApply={applyDraft}
240
+ onCancel={resetDraft}
241
+ onClear={clearDraft}
242
+ onOpenChange={(isOpen) => isOpen && seedDraft()}
243
+ width={340}
244
+ >
245
+ <FilterSelectMenu title="Due date" options={DUE_DATE_OPTIONS} value={dueDate} onChange={setDueDate} />
246
+ <FilterBoolean title="Urgent tasks only" value={urgentOnly} onChange={setUrgentOnly} />
247
+ </DropdownPanel>
248
+ ``````
249
+
250
+ > `Filter` is the former name and stays exported as a deprecated alias (with `FilterProps`)
251
+ > until Terreno 58. The `FilterSelectMenu` / `FilterBoolean` / `FilterAccordion` /
252
+ > `FilterChangesBadge` controls keep their names.
253
+
254
+ #### Positioning
255
+
256
+ The panel never renders inside its parent's clipping or stacking context: on web it is
257
+ portaled to `document.body` with fixed positioning, and on native it is teleported to the
258
+ `TerrenoProvider` portal host (falling back to an inline absolute overlay when no host is
259
+ mounted). `computeDropdownPanelLayout` then anchors it to the measured trigger:
260
+
261
+ | Situation | Behavior |
262
+ | --- | --- |
263
+ | Panel fits beside the trigger | Left edges line up (`align="start"`) |
264
+ | Left-aligned panel would cross the right viewport edge | Right edges line up instead (`align="auto"`, the default) |
265
+ | Panel is wider than the viewport | Narrowed to the viewport minus the 8px screen margins |
266
+ | Less than 160px below the trigger, and more above | Flipped above the trigger |
267
+ | Content taller than the space on screen | Panel body scrolls; the footer stays pinned |
268
+
269
+ Pass `align="start"` or `align="end"` to pin the side explicitly, and `maxPanelHeight` to
270
+ cap the height below what the viewport allows.
271
+
272
+ #### Trigger
273
+
274
+ The default trigger is a `Button` (or a compact icon trigger with `iconOnly`). Style it
275
+ with `triggerVariant` (any `Button` variant), `triggerSize`, and `fullWidth`, or replace
276
+ it entirely with `renderTrigger` when the design needs chrome the button variants do not
277
+ cover:
278
+
279
+ ``````typescript
280
+ <DropdownPanel
281
+ fullWidth
282
+ renderTrigger={({isOpen, toggle}) => <MyPill active={isOpen} onPress={toggle} />}
283
+ width={300}
284
+ >
285
+ {fields}
286
+ </DropdownPanel>
287
+ ``````
288
+
289
+ `variant` still sets both the trigger and the Apply button; `triggerVariant` and
290
+ `applyButtonVariant` override each independently.
291
+
229
292
  ### GPTChat
230
293
 
231
294
  Streaming chat surface for `@terreno/ai`. Histories, messages, submit, and optional MCP/tools stay under consumer control.
@@ -811,10 +874,10 @@ columns; web shows one **More filters** popover and native includes them in the
811
874
 
812
875
  | Platform | Chrome |
813
876
  | --- | --- |
814
- | Web | Toolbar search + per-column `Filter` popovers (`column.filter`) |
877
+ | Web | Toolbar search + per-column `DropdownPanel` popovers (`column.filter`) |
815
878
  | Native | Toolbar search + one **Filters** sheet (`Modal`) with the same fields |
816
879
 
817
- Column headers use `Filter` with `iconOnly`, which renders a compact icon trigger
880
+ Column headers use `DropdownPanel` with `iconOnly`, which renders a compact icon trigger
818
881
  (24px at the default `triggerSize="sm"`, 32px with `triggerSize="default"`) instead
819
882
  of a labeled button. Give it an accessible name with `triggerAccessibilityLabel`.
820
883
 
@@ -4,7 +4,7 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
4
4
 
5
5
  ## Phase 1 — `assertAllowed`
6
6
 
7
- - [ ] **Task 1.1**: Helper + unit tests
7
+ - [x] **Task 1.1**: Helper + unit tests
8
8
  - Delivers: `assertAllowed` implements legacy `checkPermissions` and `accessControl.can()`; double-gate test (access allow + permissions deny → allow)
9
9
  - Files: `api/src/rbac/assertAllowed.ts`, `api/src/rbac/assertAllowed.test.ts`
10
10
  - Blocked by: none (can land before MCP adapters; executors wiring waits on unified writes if MCP still duplicates checks)
@@ -12,7 +12,7 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
12
12
 
13
13
  ## Phase 2 — Hot path
14
14
 
15
- - [ ] **Task 2.1**: Middleware + executors
15
+ - [x] **Task 2.1**: Middleware + executors
16
16
  - Delivers: `permissionMiddleware` and `executeCreate/Update/Delete` call `assertAllowed`; `buildAccessPermissions` not used on requests
17
17
  - Files: `api/src/permissions.ts`, `api/src/sync/executors.ts`, `api/src/api.ts`, `api/src/rbac/modelRouterAccess.ts`, tests
18
18
  - Blocked by: 1.1; unified-mutation-executors Phase 2 so MCP is included automatically
@@ -20,12 +20,12 @@ IP: [can-as-permission-seam.md](../implementationPlans/can-as-permission-seam.md
20
20
 
21
21
  ## Phase 3 — Consumers and docs
22
22
 
23
- - [ ] **Task 3.1**: example-backend dual config
23
+ - [x] **Task 3.1**: example-backend dual config
24
24
  - Delivers: routers with `access` drop redundant AND `permissions` where RBAC is the intent
25
25
  - Files: `example-backend/src/**` model routers
26
26
  - Blocked by: 2.1
27
27
  - Acceptance: example-backend tests pass
28
- - [ ] **Task 3.2**: Docs + breaking changelog
28
+ - [x] **Task 3.2**: Docs + breaking changelog
29
29
  - Files: `docs/reference/api.md`, `docs/how-to/create-a-model.md`, `docs/implementationPlans/rbac-permissions.md` pointer, changelog
30
30
  - Blocked by: 2.1
31
31
  - Skills: `update-docs`
@@ -4,12 +4,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
4
4
 
5
5
  ## Phase 1 — Dual-write catalog
6
6
 
7
- - [ ] **Task 1.1**: `CollectionRegistry` module
7
+ - [x] **Task 1.1**: `CollectionRegistry` module
8
8
  - Delivers: `registerCollection`, `replaceCollectionOptions`, `getCollection`, `listCollections`, `clearCollectionRegistry` with unit tests (unknown path no-op, options replace)
9
9
  - Files: `api/src/collectionRegistry.ts`, `api/src/collectionRegistry.test.ts`
10
10
  - Blocked by: none
11
11
  - Acceptance: bun tests for the module pass without wiring modelRouter
12
- - [ ] **Task 1.2**: Dual-write from `modelRouter`
12
+ - [x] **Task 1.2**: Dual-write from `modelRouter`
13
13
  - Delivers: `modelRouter` / `_buildModelRouter` write the catalog in addition to existing `register*` / `update*`
14
14
  - Files: `api/src/api.ts`
15
15
  - Blocked by: 1.1
@@ -17,12 +17,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
17
17
 
18
18
  ## Phase 2 — Surfaces read the catalog
19
19
 
20
- - [ ] **Task 2.1**: MCP and realtime views
20
+ - [x] **Task 2.1**: MCP and realtime views
21
21
  - Delivers: `getMCPRegistry` / realtime finders read `CollectionRegistry`; arrays in those files removed
22
22
  - Files: `api/src/mcp/registry.ts`, `api/src/realtime/registry.ts`, related tests
23
23
  - Blocked by: 1.2
24
24
  - Acceptance: MCP and realtime tests pass; `updateMCPRegistryOptions` updates the shared record
25
- - [ ] **Task 2.2**: Sync view + keep validation
25
+ - [x] **Task 2.2**: Sync view + keep validation
26
26
  - Delivers: sync lookup uses catalog; `registerSync` validation + index promises still run
27
27
  - Files: `api/src/sync/registry.ts`, `api/src/sync/*.test.ts`
28
28
  - Blocked by: 1.2
@@ -30,12 +30,12 @@ IP: [collection-registry.md](../implementationPlans/collection-registry.md)
30
30
 
31
31
  ## Phase 3 — Contract
32
32
 
33
- - [ ] **Task 3.1**: Single writer + clear-all
33
+ - [x] **Task 3.1**: Single writer + clear-all
34
34
  - Delivers: `modelRouter` only writes `CollectionRegistry`; wrapper register/update/clear functions; tests that used independent clears updated
35
35
  - Files: `api/src/api.ts`, registry wrappers, tests
36
36
  - Blocked by: 2.1, 2.2
37
37
  - Acceptance: one `replaceCollectionOptions` is enough for MCP+sync options identity
38
- - [ ] **Task 3.2**: Docs + changelog
38
+ - [x] **Task 3.2**: Docs + changelog
39
39
  - Files: `docs/explanation/modular-api-design.md`, `docs/reference/api.md`, changelog
40
40
  - Blocked by: 3.1
41
41
  - Skills: `update-docs`
@@ -4,12 +4,12 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
4
4
 
5
5
  ## Phase 1 — Descriptor + MCP
6
6
 
7
- - [ ] **Task 1.1**: `describeModel` / `describeModelForRouter`
7
+ - [x] **Task 1.1**: `describeModel` / `describeModelForRouter`
8
8
  - Delivers: field graph + snapshot tests on a fixture schema
9
9
  - Files: `api/src/schemaMetadata.ts`, `api/src/schemaMetadata.test.ts`
10
10
  - Blocked by: none
11
11
  - Acceptance: snapshots for enum, ref, array, subdocument, system fields
12
- - [ ] **Task 1.2**: MCP Zod from descriptor
12
+ - [x] **Task 1.2**: MCP Zod from descriptor
13
13
  - Delivers: `schemaGenerator.ts` maps `FieldDescription`; no SchemaType switch for kinds already in the descriptor
14
14
  - Files: `api/src/mcp/schemaGenerator.ts`, `api/src/mcp/schemaGenerator.test.ts`
15
15
  - Blocked by: 1.1
@@ -17,7 +17,7 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
17
17
 
18
18
  ## Phase 2 — Admin
19
19
 
20
- - [ ] **Task 2.1**: `extractFieldMeta` from descriptor
20
+ - [x] **Task 2.1**: `extractFieldMeta` from descriptor
21
21
  - Delivers: admin config fields built from `describeModel`, not OpenAPI property walk
22
22
  - Files: `admin-backend/src/adminApp.ts`, admin-backend tests
23
23
  - Blocked by: 1.1
@@ -25,12 +25,12 @@ IP: [describe-model-schema.md](../implementationPlans/describe-model-schema.md)
25
25
 
26
26
  ## Phase 3 — OpenAPI + docs
27
27
 
28
- - [ ] **Task 3.1**: `getOpenApiSpecForModel` from descriptor
28
+ - [x] **Task 3.1**: `getOpenApiSpecForModel` from descriptor
29
29
  - Delivers: OpenAPI properties derived from `ModelDescription`; populate still applied
30
30
  - Files: `api/src/populate.ts`, `api/src/openApi.test.ts` / example-backend openapi snapshot if required
31
31
  - Blocked by: 1.1
32
32
  - Acceptance: OpenAPI tests pass; any snapshot diff is reviewed in the PR
33
- - [ ] **Task 3.2**: Docs + export
33
+ - [x] **Task 3.2**: Docs + export
34
34
  - Files: `docs/explanation/schema-metadata.md`, `docs/reference/api.md`, `docs/how-to/create-a-model.md`, admin reference, `api/src/index.ts`, changelog
35
35
  - Blocked by: 1.2, 2.1, 3.1
36
36
  - Skills: `update-docs`
@@ -103,19 +103,21 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
103
103
  - Files: `.circleci/continue-config.yml`
104
104
  - Depends on: Task 0.2, Task 1.3
105
105
  - Acceptance: preview deploy URL posted or visible; prod deploy on master path filter.
106
- - Note: Path filters and preview jobs exist. Live Netlify still runs on GHA until `terreno-netlify` is filled; CircleCI skips. Cleanup on PR close is GHA `preview-cleanup.yml`.
106
+ - Note: CircleCI is the only Netlify deployer; jobs fail when `terreno-netlify` is empty. PR close triggers CircleCI `preview-cleanup` through `preview-cleanup.yml`.
107
107
 
108
108
  - [ ] **Task 4.2**: Preview cleanup port
109
109
  - Description: On PR close, clean Netlify/GCP preview resources from CircleCI (webhook or GitHub App → pipeline). Prefer OIDC over `GCP_SA_KEY`.
110
110
  - Files: `.circleci/continue-config.yml`
111
111
  - Depends on: Task 4.1
112
112
  - Acceptance: closing a PR removes preview resources; no orphaned Cloud Run `pr-N` services in a test PR.
113
+ - Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
113
114
 
114
115
  - [ ] **Task 4.3**: Dual-run cutover for Netlify
115
116
  - Description: Delete GHA deploy workflows after CircleCI trusted.
116
117
  - Files: `.github/workflows/demo-deploy.yml`, `frontend-example-deploy.yml`, `docs-deploy.yml`, `preview-cleanup.yml`
117
118
  - Depends on: Task 4.1, Task 4.2
118
119
  - Acceptance: GHA deploy twins deleted.
120
+ - Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
119
121
 
120
122
  ## Phase 5: EAS + fingerprint
121
123
 
@@ -150,13 +152,14 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
150
152
  - Files: `.circleci/continue-config.yml`
151
153
  - Depends on: Task 6.1
152
154
  - Acceptance: terraform preview on PR; apply+deploy on master for a safe test path; GitHub Deployment records optional but documented.
153
- - Note: Path filters exist. Live GCP still runs on GHA until `terreno-gcp` is filled; CircleCI skips apply.
155
+ - Note: CircleCI is the only GCP deployer; jobs fail when `terreno-gcp` is empty. `gcp-cd-prod` runs MCP `test:ci` before the MCP deploy.
154
156
 
155
157
  - [ ] **Task 6.3**: Dual-run cutover for CD
156
158
  - Description: Single deployer: disable GHA `cd.yml` when CircleCI CD is required; remove GitHub OIDC provider only after GHA CD is gone (or keep read-only if other repos need it — document).
157
159
  - Files: `.github/workflows/cd.yml`, terraform OIDC
158
160
  - Depends on: Task 6.2
159
161
  - Acceptance: only CircleCI performs terreno CD; no double apply.
162
+ - Note: Cutover code landed on branch `move-cd-to-circleci` (GHA deploy workflows disabled; CircleCI deploy jobs fail on empty contexts). Check off after contexts are filled and the acceptance is observed.
160
163
 
161
164
  ## Phase 7: npm publish
162
165
 
@@ -200,7 +203,7 @@ Research: [`docs/implementationPlans/migrate-cicd-to-circleci-research.md`](../i
200
203
  - Depends on: Task 0.2
201
204
  - Acceptance: Security tab still receives results **or** explicit maintainer sign-off on alternative.
202
205
 
203
- - [ ] **Task 9.2**: Replace Dependabot auto-merge + triage + roadmap-generate + docs-audit
206
+ - [ ] **Task 9.2**: Replace Dependabot auto-merge + triage + docs-audit (roadmap workflows stay on GitHub Actions, decided 2026-09-26)
204
207
  - Description: Implement CircleCI (or Renovate) equivalents; wire issue/schedule triggers without leaving required logic on GHA.
205
208
  - Files: `.circleci/continue-config.yml`, corresponding GHA deletions
206
209
  - Depends on: Task 0.2