@terreno/mcp 57.6.0 → 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 (117) 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/api.md +16 -0
  52. package/dist/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  53. package/dist/docs/versioned/next/reference/test.md +1 -1
  54. package/dist/docs/versioned/next/reference/ui.md +65 -2
  55. package/dist/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  56. package/dist/docs/versioned/next/tasks/collection-registry.md +6 -6
  57. package/dist/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  58. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +6 -3
  59. package/package.json +2 -2
  60. package/src/docs/upgrades/57.7.0.md +64 -0
  61. package/src/docs/upgrades/58.0.0.md +4 -0
  62. package/src/docs/versioned/next/explanation/loop-engineering.md +32 -3
  63. package/src/docs/versioned/next/explanation/repository-settings.md +12 -5
  64. package/src/docs/versioned/next/explanation/roadmap-process.md +41 -19
  65. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +271 -22
  66. package/src/docs/versioned/next/explanation/static-analysis.md +3 -2
  67. package/src/docs/versioned/next/explanation/test-isolation.md +42 -0
  68. package/src/docs/versioned/next/how-to/circleci.md +95 -53
  69. package/src/docs/versioned/next/how-to/github-actions-ci.md +4 -3
  70. package/src/docs/versioned/next/how-to/run-tests-locally.md +23 -2
  71. package/src/docs/versioned/next/implementationPlans/IP_TEMPLATE.md +3 -1
  72. package/src/docs/versioned/next/implementationPlans/admin-improvements.md +1 -1
  73. package/src/docs/versioned/next/implementationPlans/admin-scripts-durable-jobs.md +2 -1
  74. package/src/docs/versioned/next/implementationPlans/agent-ui-blocks.md +1 -0
  75. package/src/docs/versioned/next/implementationPlans/ai-agents-and-failover.md +1 -0
  76. package/src/docs/versioned/next/implementationPlans/ai-observability.md +1 -0
  77. package/src/docs/versioned/next/implementationPlans/announcements-surfaces.md +1 -1
  78. package/src/docs/versioned/next/implementationPlans/announcements.md +2 -1
  79. package/src/docs/versioned/next/implementationPlans/app-mcp-server.md +1 -0
  80. package/src/docs/versioned/next/implementationPlans/better-auth-strict-oauth-provider.md +2 -1
  81. package/src/docs/versioned/next/implementationPlans/can-as-permission-seam.md +1 -1
  82. package/src/docs/versioned/next/implementationPlans/collection-registry.md +1 -1
  83. package/src/docs/versioned/next/implementationPlans/comms-adapter-expo-push.md +1 -1
  84. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +1 -1
  85. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +1 -1
  86. package/src/docs/versioned/next/implementationPlans/compile-pipeline-dedup.md +2 -1
  87. package/src/docs/versioned/next/implementationPlans/datatable-server-side-filtering.md +1 -1
  88. package/src/docs/versioned/next/implementationPlans/describe-model-schema.md +1 -1
  89. package/src/docs/versioned/next/implementationPlans/docs-reference-coverage.md +1 -1
  90. package/src/docs/versioned/next/implementationPlans/docs-site-and-versioning.md +1 -1
  91. package/src/docs/versioned/next/implementationPlans/examples-demo-coverage.md +1 -1
  92. package/src/docs/versioned/next/implementationPlans/framework-audit-log.md +1 -1
  93. package/src/docs/versioned/next/implementationPlans/gpt-chat-mascot.md +1 -0
  94. package/src/docs/versioned/next/implementationPlans/inbound-webhooks.md +1 -1
  95. package/src/docs/versioned/next/implementationPlans/knip-cleanup.md +1 -0
  96. package/src/docs/versioned/next/implementationPlans/mcp-doc-sync-off-compile-path.md +2 -1
  97. package/src/docs/versioned/next/implementationPlans/mcp-service-tokens.md +2 -1
  98. package/src/docs/versioned/next/implementationPlans/migrate-admin-to-syncdb.md +2 -1
  99. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +1 -1
  100. package/src/docs/versioned/next/implementationPlans/mongodb-migrations-tooling.md +1 -1
  101. package/src/docs/versioned/next/implementationPlans/notification-center.md +1 -1
  102. package/src/docs/versioned/next/implementationPlans/org-management-ui.md +1 -1
  103. package/src/docs/versioned/next/implementationPlans/password-reset-and-email-verification.md +1 -1
  104. package/src/docs/versioned/next/implementationPlans/rate-limiting.md +1 -1
  105. package/src/docs/versioned/next/implementationPlans/remove-legacy-realtime.md +1 -0
  106. package/src/docs/versioned/next/implementationPlans/support-agent.md +1 -0
  107. package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +1 -1
  108. package/src/docs/versioned/next/implementationPlans/terreno-langfuse-integration.md +1 -1
  109. package/src/docs/versioned/next/implementationPlans/upgrade-guides-and-skill.md +1 -1
  110. package/src/docs/versioned/next/reference/api.md +16 -0
  111. package/src/docs/versioned/next/reference/lifecycle-plugin.md +2 -2
  112. package/src/docs/versioned/next/reference/test.md +1 -1
  113. package/src/docs/versioned/next/reference/ui.md +65 -2
  114. package/src/docs/versioned/next/tasks/can-as-permission-seam.md +4 -4
  115. package/src/docs/versioned/next/tasks/collection-registry.md +6 -6
  116. package/src/docs/versioned/next/tasks/describe-model-schema.md +5 -5
  117. 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
@@ -223,6 +223,22 @@ export const todoRouter = modelRouter("/todos", Todo, {
223
223
 
224
224
  Do not add `endpoints: (router) => { router.get(...) }` when an action fits.
225
225
 
226
+ ## modelRouter array operations
227
+
228
+ When a model has at least one array field, `modelRouter` provides subroutes for adding,
229
+ updating, and removing array items:
230
+
231
+ | Method | Path | Operation |
232
+ | --- | --- | --- |
233
+ | `POST` | `/:id/:field` | Append an item |
234
+ | `PATCH` | `/:id/:field/:itemId` | Replace or merge an item |
235
+ | `DELETE` | `/:id/:field/:itemId` | Remove an item |
236
+
237
+ The `field` path must resolve to an array on the document. Requests for scalar, object,
238
+ or unknown fields run the normal update transform and `preUpdate` hook first so consumer
239
+ authorization remains authoritative, then return `400` with code
240
+ `array-operation-field-not-array` if the hook allows the request.
241
+
226
242
  ## MCP tools
227
243
 
228
244
  Opt a model into Model Context Protocol tools with `mcp` on `modelRouter`. `TerrenoApp` mounts `POST /mcp` when any model has `mcp` or a custom tool is registered.
@@ -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
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "@modelcontextprotocol/node": "^2.0.0",
12
12
  "@modelcontextprotocol/server": "^2.0.0",
13
13
  "@sentry/bun": "^10.39.0",
14
- "@terreno/api": "57.6.0",
14
+ "@terreno/api": "57.7.0",
15
15
  "express": "^5.2.1",
16
16
  "luxon": "^3.7.2",
17
17
  "minisearch": "^7.2.0",
@@ -104,5 +104,5 @@
104
104
  "test:coverage": "bun run ../scripts/check-coverage.ts"
105
105
  },
106
106
  "type": "module",
107
- "version": "57.6.0"
107
+ "version": "57.7.0"
108
108
  }
@@ -0,0 +1,64 @@
1
+ # Upgrading to 57.7.0
2
+
3
+ **Action required:** No
4
+ **Affected packages:** @terreno/ui
5
+
6
+ ## Summary
7
+
8
+ Bump every `@terreno/*` package together to `57.7.0`. `@terreno/ui`'s `Filter` is now `DropdownPanel`. Existing `Filter` and `FilterProps` imports keep working until Terreno 58. Panels stay on screen, render through the `TerrenoProvider` portal on native, and accept styled or custom triggers. No Expo upgrade is required if you are already on `57.x`.
9
+
10
+ ## Breaking changes
11
+
12
+ None
13
+
14
+ ## Deprecations
15
+
16
+ ### `Filter` and `FilterProps`
17
+
18
+ **What changed**
19
+
20
+ `Filter` is renamed to `DropdownPanel`. `Filter` and `FilterProps` stay exported as deprecated aliases and are removed in Terreno 58. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names.
21
+
22
+ **Why**
23
+
24
+ The control is a general compositional dropdown (trigger, anchored panel, optional Apply/Clear/Cancel footer), not a filter-only widget.
25
+
26
+ **Migration**
27
+
28
+ ```tsx
29
+ // Before
30
+ import {Filter} from "@terreno/ui";
31
+
32
+ <Filter label="Status">{children}</Filter>;
33
+
34
+ // After
35
+ import {DropdownPanel} from "@terreno/ui";
36
+
37
+ <DropdownPanel label="Status">{children}</DropdownPanel>;
38
+ ```
39
+
40
+ ## Changed behavior
41
+
42
+ ### Panels stay on screen and escape clipping
43
+
44
+ **What changed**
45
+
46
+ `DropdownPanel` (including the `Filter` alias) right-aligns to its trigger when a left-aligned panel would cross the right viewport edge, clamps to an 8px screen margin, flips above the trigger when there is no usable room below, and scrolls its body with the footer pinned when the content is taller than the space available. On native it renders through the `TerrenoProvider` portal host, so the panel is no longer clipped inside scroll views or cards. Without a host it stays an inline overlay.
47
+
48
+ **Why**
49
+
50
+ Left-aligned panels ran off screen, and inline overlays were clipped by parent scroll views.
51
+
52
+ **Migration**
53
+
54
+ No call-site change is required. Pass `align` or `maxPanelHeight` to override the automatic layout. Apps that position their own panels can call `computeDropdownPanelLayout`.
55
+
56
+ ## New capabilities
57
+
58
+ `DropdownPanel` triggers accept `triggerVariant` (any `Button` variant), `applyButtonVariant`, `triggerSize` on labeled triggers, `fullWidth`, and `renderTrigger` for a fully custom trigger.
59
+
60
+ ## Verification
61
+
62
+ - `bun add` every `@terreno/*` dependency to `57.7.0`, then `bun run compile` at the app root
63
+ - Open a screen that uses `Filter` or `DropdownPanel` and confirm the panel stays inside the viewport, including near the right edge and inside a scrolling parent
64
+ - Replace `Filter` imports with `DropdownPanel` before upgrading to Terreno 58
@@ -2,6 +2,10 @@
2
2
 
3
3
  This file is a placeholder until Terreno 58 is cut. When that release ships, expand this page into a full upgrade note.
4
4
 
5
+ ## `Filter` and `FilterProps` are removed
6
+
7
+ `@terreno/ui` removes the `Filter` and `FilterProps` aliases added as deprecations in 57.7.0. Import `DropdownPanel` and `DropdownPanelProps`. `FilterSelectMenu`, `FilterBoolean`, `FilterAccordion`, and `FilterChangesBadge` keep their names. See [57.7.0](57.7.0.md).
8
+
5
9
  ## HTTP rate limiting defaults on
6
10
 
7
11
  `TerrenoApp` will enable HTTP rate limiting by default (memory store unless you pass `store`). Apps that must stay unlimited must pass an explicit off once 58 defines that API.
@@ -49,7 +49,7 @@ the inner loop until the approved task list is done. Roast never invokes Pick. B
49
49
  Taste additionally wait while async review bots are running, preferring provider CLI
50
50
  watch hooks or harness event subscriptions over timer polling. Taste also waits in a
51
51
  loop for product CI with `gh` or `circleci` until jobs are terminal or the wait times
52
- out. Before any push it always pulls latest `master`, then records last-run failed tests
52
+ out. Before any push it fetches latest `master` (merging it only when needed), then records last-run failed tests
53
53
  and re-verifies them locally, then runs the repository's root
54
54
  `prepush` package script in a no-context subagent when present (falling back to affected
55
55
  package lint, typecheck, and tests), then pushes and watches CI.
@@ -82,8 +82,8 @@ acceptance criteria. Taste is one reactive iteration, not an unbounded fix-until
82
82
  daemon. It waits until async review bots (Bugbot, CodeQL, and similar) on the current
83
83
  head have reported, then waits in a loop for product CI using GitHub CLI
84
84
  (`gh pr checks --watch`, `gh run watch`) or CircleCI CLI (`circleci run watch`) until
85
- jobs are terminal or the wait times out. Before any push it always pulls latest
86
- `master`, records last-run failed tests and re-verifies them locally, then runs root
85
+ jobs are terminal or the wait times out. Before any push it fetches latest
86
+ `master` (merging it only when needed), records last-run failed tests and re-verifies them locally, then runs root
87
87
  `prepush` when present in a fresh subagent with no parent
88
88
  conversation. If absent, it proves affected-package lint, typecheck, and tests instead.
89
89
  It then pushes and watches CI, emits `PASS`, `FAIL`, `BLOCKED`, or `PENDING`, and exits.
@@ -139,6 +139,35 @@ or transports it and Brew excludes it from commits unless repository policy says
139
139
  otherwise. Stage results follow the plugin's JSON-schema-backed YAML contract and never
140
140
  contain chain-of-thought or transcripts.
141
141
 
142
+ ## Commits and pushes
143
+
144
+ Every pushed commit starts a full CI run. Harnesses such as Cursor cloud agents push
145
+ every commit automatically, so commit count turns directly into CI runs. Before these
146
+ rules, one 30-commit dashboard PR had ten "mark slice roasted" commits and ten "harden"
147
+ follow-ups, and `ui-ci` stayed red on every commit after the first.
148
+
149
+ - One behavior-scoped commit per task, after Roast `PASS`: code, tests, docs, and the
150
+ task-file mark together. Roast-driven fixes fold into that commit.
151
+ - Progress lives in execution state, not in standalone task-file commits.
152
+ - Pick and Roast never push. Brew pushes once. Taste pushes at most once per reaction.
153
+ - Pick does not continue on a head whose product CI shows a branch-caused failure.
154
+ - Pick lists a behavior's edge cases before coding, so Roast proves them instead of
155
+ discovering them.
156
+ - Roast runs the gate CI will run (root `prepush`, which mirrors the triggered CI jobs),
157
+ not only the task's test file.
158
+ - Taste fetches `master` before every push but merges it only when the PR conflicts, a
159
+ failure traces to base drift, or the branch is otherwise merge-ready.
160
+
161
+ ## Direct invocation
162
+
163
+ Outer loops (`terreno-planning-loop`, `terreno-taste-sweep`) consume Taste `PENDING`
164
+ and invoke Taste again. When a human invokes Taste directly, no loop is waiting, so a
165
+ `PENDING` would only tell them to come back later. In that case Taste uses
166
+ **standalone entry**: it waits in-process with native watches and reacts again. It
167
+ stops on `PASS`, `BLOCKED`, or `FAIL`, or after 3 fix pushes or 3 hours of waiting,
168
+ which ends as `BLOCKED` with one concrete human action. A directly invoked Brew
169
+ starts Taste as its next stage instead of exiting.
170
+
142
171
  ## Retry and stop rules
143
172
 
144
173
  - Pick implements one task, Roast proves it, then Pick takes the next unblocked task.
@@ -51,11 +51,18 @@ as GitHub App checks; they are not CircleCI jobs.
51
51
 
52
52
  **Path:** Settings → Environments
53
53
 
54
- Same-repo PR jobs in `cd.yml` (`Terraform preview`, `Tasks deploy (preview)`,
55
- `Backend deploy (preview)`) skip when `head.repo.full_name != github.repository`.
56
- Also restrict the `gcp-cd-preview` environment (create it on first deploy if missing) with a
57
- **deployment branch policy** or **required reviewers** so a fork that edits
58
- `cd.yml` cannot mint a prod WIF token.
54
+ `cd.yml` is disabled; CircleCI `gcp-cd-preview` performs GCP previews and
55
+ halts on fork PRs. While the GitHub WIF provider still exists, keep the
56
+ `gcp-cd-preview` environment restricted with a **deployment branch policy** or
57
+ **required reviewers** so a fork that re-enables `cd.yml` cannot mint a prod
58
+ WIF token.
59
+
60
+ ### Actions secrets for CircleCI hooks
61
+
62
+ `preview-cleanup.yml` (PR close) and `publish-on-tag.yml` (manual publish demo
63
+ redeploy) start CircleCI pipelines. Set the secret `CIRCLECI_TOKEN` and the
64
+ variable `CIRCLECI_PIPELINE_DEFINITION_ID` under Settings → Secrets and
65
+ variables → Actions.
59
66
 
60
67
  ## Merge settings
61
68
 
@@ -88,11 +88,10 @@ half applies:
88
88
  | 1 | Announcements | Announcement | Maintainers only | Official release notes, breaking changes, deprecations, and launch updates from the Terreno team. |
89
89
  | 2 | Q&A | Question / Answer | Anyone | Ask how to use Terreno. Search existing threads first; accepted answers may become how-to guides in `docs/how-to/`. |
90
90
  | 3 | Ideas | Open-ended | Anyone | Feature ideas and improvements before they are shaped. This is the intake funnel — do not open a tracking issue until a maintainer promotes your idea. |
91
- | 4 | Hacktoberfest | Open-ended | Anyone | Pitch something to build during Hacktoberfest and upvote the ideas you want. Popular, well-scoped ideas become `hacktoberfest` issues anyone can pick up. |
92
- | 5 | Agents & AI | Open-ended | Anyone | MCP setup, Cursor/Claude skills, agent workflows, and prompt patterns for building with Terreno. |
93
- | 6 | RFCs | Open-ended | Anyone | Substantial proposals that change public API or add packages. Use the RFC discussion template; accepted RFCs become IPs. |
94
- | 7 | Show and tell | Open-ended | Anyone | Apps and experiments built with Terreno. Share what you shipped and what friction you hit. |
95
- | 8 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
91
+ | 4 | Agents & AI | Open-ended | Anyone | MCP setup, Cursor/Claude skills, agent workflows, and prompt patterns for building with Terreno. |
92
+ | 5 | RFCs | Open-ended | Anyone | Substantial proposals that change public API or add packages. Use the RFC discussion template; accepted RFCs become IPs. |
93
+ | 6 | Show and tell | Open-ended | Anyone | Apps and experiments built with Terreno. Share what you shipped and what friction you hit. |
94
+ | 7 | Docs feedback | Open-ended | Anyone | Report missing or confusing documentation. Link the page URL; recurring feedback becomes docs PRs. |
96
95
 
97
96
  ### Pinned posts
98
97
 
@@ -127,24 +126,29 @@ When an answer repeats, maintainers turn it into a how-to doc via PR.
127
126
  - Do **not** open a feature issue directly — maintainers promote accepted ideas to tracked issues on the [Terreno Roadmap](https://github.com/TerrenoLabs/terreno/projects) board.
128
127
  - For API/package-level design, use the **RFCs** category instead.
129
128
  - Bugs → [Bug report](https://github.com/TerrenoLabs/terreno/issues/new?template=bug_report.yml).
129
+ - **Hacktoberfest pitches live here too.** Tick the Hacktoberfest box on the form; maintainers apply the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest) label. 👍 the pitches you want built.
130
130
  ```
131
131
 
132
- #### Hacktoberfest
132
+ #### Hacktoberfest (inside Ideas)
133
133
 
134
- ```markdown
135
- **Pitch Hacktoberfest ideas here, and 👍 the ones you want built.**
136
-
137
- 1. [Start a Hacktoberfest discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=hacktoberfest) — the form asks for the idea, area, rough size, and what "done" looks like.
138
- 2. Upvote and comment on other pitches. Upvotes are how maintainers rank them.
139
- 3. Maintainers turn popular, well-scoped ideas into issues labeled [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest) and link them back here. Pick one up by commenting on the issue.
134
+ Hacktoberfest does not get its own category. Pitches are Ideas discussions carrying the
135
+ `hacktoberfest` label, so upvotes, promotion, and search all use the same path as any other
136
+ idea.
140
137
 
141
- Longer-term feature ideas → **Ideas**. Bugs → [Bug report](https://github.com/TerrenoLabs/terreno/issues/new?template=bug_report.yml).
142
- ```
138
+ 1. [Start an Ideas discussion](https://github.com/TerrenoLabs/terreno/discussions/new?category=ideas)
139
+ and tick **This is a Hacktoberfest pitch**. Give the area, rough size, and what "done" looks
140
+ like.
141
+ 2. A maintainer applies the [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/discussions?discussions_q=label%3Ahacktoberfest)
142
+ label and the matching `area:*` label. Upvotes are how maintainers rank pitches.
143
+ 3. Popular, well-scoped pitches become issues labeled
144
+ [`hacktoberfest`](https://github.com/TerrenoLabs/terreno/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest),
145
+ linked back to the discussion. Pick one up by commenting on the issue.
143
146
 
144
- Promotion follows the Ideas path, with one change: a Hacktoberfest idea small enough to finish
147
+ Promotion follows the Ideas path, with one change: a Hacktoberfest pitch small enough to finish
145
148
  in a weekend becomes a `hacktoberfest` + `good first issue` work item directly (see
146
149
  [GitHub issue lifecycle](../how-to/github-issue-lifecycle.md)) instead of a `Shaping` roadmap
147
- item. Larger ones go through `roadmap-promote` like any other idea.
150
+ item. Larger ones get `hacktoberfest` + `help wanted` and go through `roadmap-promote` like any
151
+ other idea.
148
152
 
149
153
  #### Agents & AI
150
154
 
@@ -397,10 +401,10 @@ do not claim completion until done.
397
401
 
398
402
  | Workflow | Trigger | Purpose |
399
403
  | -------- | ------- | ------- |
400
- | [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present |
404
+ | [`.github/workflows/triage.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/triage.yml) | Issue opened | `status:needs-triage` + `area:*` from package dropdown + `type:*` from Kind when present; `area:*` / `type:*` labels the issue was opened with win, so `roadmap:sync` issues are not asked for an area |
401
405
  | [`.github/workflows/roadmap-generate.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-generate.yml) | Daily + manual | `roadmap:sync --check` for board drift, then regenerate `ROADMAP.md` from the board and open a pull request when it changes |
402
406
  | [`.github/workflows/roadmap-sync.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-sync.yml) | Taxonomy files change on `master` + manual | Apply labels and reconcile the board's fields and items |
403
- | [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, push to the board, regenerate `ROADMAP.md` |
407
+ | [`.github/workflows/roadmap-reconcile.yml`](https://github.com/TerrenoLabs/terreno/blob/master/.github/workflows/roadmap-reconcile.yml) | IP or task files change on `master` + manual | Advance status from IP headers, add an entry for every new IP, open its tracking issue, push to the board, regenerate `ROADMAP.md` |
404
408
  All three share the `roadmap` concurrency group. They write the same board, and interleaving
405
409
  them produces confusing partial states. After the group lock is acquired, each job refreshes
406
410
  to the latest branch HEAD so a queued `roadmap-sync` cannot overwrite statuses that
@@ -413,7 +417,7 @@ The full loop, each arrow with exactly one writer:
413
417
 
414
418
  ```
415
419
  docs/implementationPlans/*.md ──roadmap:reconcile──▶ roadmap-seed-issues.md
416
- docs/tasks/*.md (Status only) │
420
+ docs/tasks/*.md (Status + new entries) │
417
421
  roadmap:sync
418
422
  ▼
419
423
  Project board
@@ -439,6 +443,24 @@ reported by `--check` and is never overwritten. Cards that are not in
439
443
  [`roadmap-seed-issues.md`](roadmap-seed-issues.md) are also `--check` failures; apply does
440
444
  not delete them. Maintainers own the board's *state* and `Community interest`.
441
445
 
446
+ **New IPs reach the roadmap on merge.** When a merged plan has no entry,
447
+ `roadmap:reconcile --fix` scaffolds one: the title from the IP's H1, the summary from the first
448
+ paragraph of `## Goal`, and links to the IP and its task list (when `docs/tasks/<slug>.md`
449
+ exists). Area, Target, and Impact come from an optional IP header:
450
+
451
+ ```markdown
452
+ **Roadmap:** Area=`api`, Target=`Next`, Impact=`Feature`
453
+ ```
454
+
455
+ Without that header they are inferred: Area from the packages named in the header block
456
+ (default `dx`); Target `Released` for shipped work, `Future` for drafts, `58` when a
457
+ `**Target:**` line names 58, otherwise `Next`; Impact `Breaking` when the `**Target:**` line
458
+ says so, otherwise `Feature`. Edit the scaffolded section afterward if a guess is wrong. The
459
+ workflow then runs `roadmap:sync --create-missing-ip-issues`, which opens a tracking issue
460
+ only for entries backed by an IP. Drafts land as `Shaping`. Moving an entry to `Shipped` also
461
+ moves its Target to `Released`. `ROADMAP.md` links each entry's IP and, when one exists, its
462
+ task list.
463
+
442
464
  **Status automation is monotonic.** `roadmap:reconcile --fix` advances status and applies
443
465
  supersessions, but never walks a status backwards and never revives declined work. IP headers
444
466
  go stale far more often than boards do — several plans still read `Draft` for work that