@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
@@ -137,7 +137,7 @@ support, organized around batteries included, universal by default, and AI-nativ
137
137
  **Title:** `Reference documentation coverage`
138
138
 
139
139
  **Labels:** `area:docs`, `type:docs`
140
- **Project fields:** Area=`docs`, Target=`Next`, Impact=`Improvement`, IP=`docs-reference-coverage`, Status=`In progress`
140
+ **Project fields:** Area=`docs`, Target=`Released`, Impact=`Improvement`, IP=`docs-reference-coverage`, Status=`Shipped`
141
141
 
142
142
  Gives every published Terreno package a real README and a public docs/reference page instead
143
143
  of stubs. Adds missing reference pages, de-stubs package READMEs, sanitizes internal
@@ -209,7 +209,7 @@ websocket verification. Requires a spike on backend hosting options.
209
209
  **Title:** `Upgrade guides and upgrading-terreno skill`
210
210
 
211
211
  **Labels:** `area:mcp`, `type:docs`
212
- **Project fields:** Area=`mcp`, Target=`Next`, Impact=`Improvement`, IP=`upgrade-guides-and-skill`, Status=`Planned`
212
+ **Project fields:** Area=`mcp`, Target=`Released`, Impact=`Improvement`, IP=`upgrade-guides-and-skill`, Status=`Shipped`
213
213
 
214
214
  Makes upgrading Terreno across lockstep-published packages a documented, repeatable process.
215
215
  Backfills upgrade notes, adds versioning policy, ships an upgrading-terreno skill, and
@@ -262,7 +262,7 @@ using only public docs and skills, then publishes a friction log and blog post.
262
262
  **Title:** `Examples, demo, and test coverage`
263
263
 
264
264
  **Labels:** `area:examples`, `type:chore`
265
- **Project fields:** Area=`examples`, Target=`Future`, Impact=`Improvement`, IP=`examples-demo-coverage`, Status=`Planned`
265
+ **Project fields:** Area=`examples`, Target=`Released`, Impact=`Improvement`, IP=`examples-demo-coverage`, Status=`Shipped`
266
266
 
267
267
  Closes credibility gaps in examples, the UI demo app, and CI coverage gates. Adds missing demo
268
268
  stories, extends coverage enforcement, and publishes an example-app feature matrix.
@@ -352,7 +352,7 @@ roadmap item, so apps only install the SDKs they use.
352
352
  **Title:** `Comms adapter — Expo push notifications`
353
353
 
354
354
  **Labels:** `area:api`, `type:feature`
355
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-expo-push`, Status=`In progress`
355
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`comms-adapter-expo-push`, Status=`Shipped`
356
356
 
357
357
  Implements the `@terreno/comms` push provider on Expo's push service using
358
358
  `expo-server-sdk` (already a dependency of `@terreno/api`, currently unused). Covers token
@@ -371,7 +371,7 @@ half — `getExpoPushTokenAsync` registration — already exists in example-fron
371
371
  **Title:** `Comms adapter — Twilio SMS`
372
372
 
373
373
  **Labels:** `area:api`, `type:feature`
374
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-twilio-sms`, Status=`Planned`
374
+ **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-twilio-sms`, Status=`In progress`
375
375
 
376
376
  Implements the `@terreno/comms` SMS provider on Twilio Programmable Messaging: send via
377
377
  messaging service or from-number, delivery status callbacks through the inbound-webhook
@@ -390,7 +390,7 @@ catalog.
390
390
  **Title:** `Comms adapter — Twilio Verify (OTP)`
391
391
 
392
392
  **Labels:** `area:api`, `type:feature`
393
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`comms-adapter-twilio-verify`, Status=`Shipped`
393
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`comms-adapter-twilio-verify`, Status=`Shipped`
394
394
 
395
395
  Implements the `@terreno/comms` verification provider on Twilio Verify for SMS and email
396
396
  one-time codes. This is the delivery channel for phone verification and for the future MFA
@@ -427,7 +427,7 @@ SES, SMTP) get their own items when demand appears.
427
427
  **Title:** `Comms admin dashboard (errors, retries, log digging)`
428
428
 
429
429
  **Labels:** `area:admin`, `type:feature`
430
- **Project fields:** Area=`admin`, Target=`Next`, Impact=`Feature`, IP=`comms-admin-dashboard`, Status=`Planned`
430
+ **Project fields:** Area=`admin`, Target=`Released`, Impact=`Feature`, IP=`comms-admin-dashboard`, Status=`Shipped`
431
431
 
432
432
  Makes the admin panel the operations surface for the `@terreno/comms` layer: filterable
433
433
  delivery logs (channel, provider, status, error code/class, recipient, date range, free
@@ -448,7 +448,7 @@ comms abstraction.
448
448
  **Title:** `Password reset and email verification`
449
449
 
450
450
  **Labels:** `area:auth`, `type:feature`
451
- **Project fields:** Area=`auth`, Target=`Next`, Impact=`Feature`, IP=`password-reset-and-email-verification`, Status=`Planned`
451
+ **Project fields:** Area=`auth`, Target=`Released`, Impact=`Feature`, IP=`password-reset-and-email-verification`, Status=`Shipped`
452
452
 
453
453
  Closes a functional hole: the `@terreno/rtk` client already exposes a `resetPassword`
454
454
  endpoint but no backend route implements it, and there is no email verification flow.
@@ -467,7 +467,7 @@ equivalents, and sends the emails through `@terreno/comms`.
467
467
  **Title:** `Inbound webhook framework`
468
468
 
469
469
  **Labels:** `area:api`, `type:feature`
470
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`inbound-webhooks`, Status=`Planned`
470
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`inbound-webhooks`, Status=`Shipped`
471
471
 
472
472
  **GitHub:** https://github.com/TerrenoLabs/terreno/issues/1172
473
473
 
@@ -545,7 +545,7 @@ billing can later enforce. Emails go through `@terreno/comms`.
545
545
  **Title:** `Organizations as a first-class primitive (admin UI + RBAC)`
546
546
 
547
547
  **Labels:** `area:api`, `type:feature`
548
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`org-management-ui`, Status=`Planned`
548
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`org-management-ui`, Status=`Shipped`
549
549
 
550
550
  Native Organization and Membership models, RBAC (`org-admin`, `operator`, `superadmin`),
551
551
  and admin-panel directory / switcher / members / settings. Operators manage all orgs;
@@ -585,7 +585,7 @@ are a separate item.
585
585
  **Title:** `Native module baseline for the next major release`
586
586
 
587
587
  **Labels:** `area:ui`, `type:chore`, `breaking`
588
- **Project fields:** Area=`ui`, Target=`Next`, Impact=`Breaking`, IP=*(not yet written)*, Status=`Planned`
588
+ **Project fields:** Area=`ui`, Target=`Next`, Impact=`Breaking`, IP=`native-module-baseline`, Status=`Shaping`
589
589
 
590
590
  Adding a native module to a Terreno app forces a new dev-client/store binary, so every
591
591
  native dependency the B2B program needs lands in one major release: Stripe payment sheet,
@@ -663,7 +663,7 @@ root views and system chrome follow the scheme.
663
663
  **Title:** `DataTable server-side filtering and search`
664
664
 
665
665
  **Labels:** `area:ui`, `type:feature`
666
- **Project fields:** Area=`ui`, Target=`Next`, Impact=`Feature`, IP=`datatable-server-side-filtering`, Status=`Planned`
666
+ **Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`datatable-server-side-filtering`, Status=`Shipped`
667
667
 
668
668
  DataTable sorts and paginates but has no filter UI. Adds per-column filter controls and a
669
669
  search box that emit modelRouter-compatible query params (`queryFields`, `$and`/`$or`), so
@@ -700,7 +700,7 @@ native module baseline regardless, so this lands as a JS/OTA feature when schedu
700
700
  **Title:** `In-app notification center`
701
701
 
702
702
  **Labels:** `area:ui`, `type:feature`
703
- **Project fields:** Area=`ui`, Target=`Next`, Impact=`Feature`, IP=`notification-center` (Approved), Status=`Planned`
703
+ **Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`notification-center` (Approved), Status=`Shipped`
704
704
 
705
705
  Adds a Notification model with per-user preferences, realtime delivery over the existing
706
706
  change-stream socket layer, and a bell/inbox UI in `@terreno/ui` with read/unread state —
@@ -827,7 +827,7 @@ enforcement hooks in the permission layer.
827
827
  **Title:** `Framework-level audit log`
828
828
 
829
829
  **Labels:** `area:api`, `type:feature`
830
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`framework-audit-log`, Status=`Planned`
830
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`framework-audit-log`, Status=`Shipped`
831
831
 
832
832
  Generalizes the admin/consent audit patterns into a first-class audit log: an AuditEvent
833
833
  model, modelRouter hooks that record who changed what (with before/after diffs), org
@@ -849,7 +849,7 @@ Shipping this work **closes** https://github.com/TerrenoLabs/terreno/issues/1186
849
849
  **Title:** `API rate limiting`
850
850
 
851
851
  **Labels:** `area:api`, `type:feature`
852
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Feature`, IP=`rate-limiting`, Status=`Planned`
852
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`rate-limiting`, Status=`Shipped`
853
853
 
854
854
  Adds opt-in HTTP rate limiting to `@terreno/api`: per-user or per-IP keys, stricter
855
855
  auth/OTP buckets (including login), memory Redis or Mongo stores, and 429 rate-limit
@@ -892,7 +892,7 @@ Shipping this work **closes** https://github.com/TerrenoLabs/terreno/issues/1188
892
892
  **Title:** `MongoDB migrations tooling`
893
893
 
894
894
  **Labels:** `area:api`, `type:feature`
895
- **Project fields:** Area=`api`, Target=`Future`, Impact=`Feature`, IP=`mongodb-migrations-tooling`, Status=`Planned`
895
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`mongodb-migrations-tooling`, Status=`Shipped`
896
896
 
897
897
  A migrations runner for Terreno apps: versioned migration files, up/down with a lock
898
898
  collection, CI checks, CLI generate-from-schema-diff, optional boot apply, and an admin
@@ -937,7 +937,7 @@ permission, hook, field-view, or soft-delete fix lands once instead of twice.
937
937
  **Title:** `[Roadmap] One collection registry`
938
938
 
939
939
  **Labels:** `area:api`, `type:chore`
940
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Improvement`, IP=`collection-registry`, Status=`Planned`
940
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`collection-registry`, Status=`Shipped`
941
941
 
942
942
  Registers a `modelRouter` collection once. MCP, realtime, and Sync each keep a process-global
943
943
  array plus an `update*RegistryOptions` call today, so every RBAC or MCP change has to touch
@@ -956,7 +956,7 @@ options, surfaces}` and the existing per-surface lookups become views over it.
956
956
  **Title:** `[Roadmap] can() as the permission seam`
957
957
 
958
958
  **Labels:** `area:api`, `type:chore`
959
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Improvement`, IP=`can-as-permission-seam`, Status=`Planned`
959
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`can-as-permission-seam`, Status=`Shipped`
960
960
 
961
961
  Finishes the RBAC work by making `accessControl.can()` the enforcement engine wherever a
962
962
  router declares `access`. Today RBAC roles and statements are compiled down into legacy
@@ -975,7 +975,7 @@ must pass both `access` and `permissions` and the two can disagree.
975
975
  **Title:** `[Roadmap] describeModel() schema metadata`
976
976
 
977
977
  **Labels:** `area:api`, `type:chore`
978
- **Project fields:** Area=`api`, Target=`Next`, Impact=`Improvement`, IP=`describe-model-schema`, Status=`Planned`
978
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Improvement`, IP=`describe-model-schema`, Status=`Shipped`
979
979
 
980
980
  Walks each Mongoose schema once into a shared `ModelDescription`. OpenAPI generation, the
981
981
  admin field-widget extractor, and the MCP Zod tool generator each re-interpret `schema.paths`
@@ -1009,6 +1009,254 @@ stay gated behind capability flags.
1009
1009
 
1010
1010
  ---
1011
1011
 
1012
+ ## mcp-doc-sync-off-compile-path
1013
+
1014
+ **Title:** `Move mcp-server doc-sync off the compile path`
1015
+
1016
+ **Labels:** `area:dx`, `type:chore`
1017
+ **Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`mcp-doc-sync-off-compile-path`, Status=`Shipped`
1018
+
1019
+ Take the three doc-sync scripts and the `cp` off mcp-server's `compile` script so a normal `bun run compile` type-checks only. This removes ~5s of fixed I/O from every cold build and — critically — eliminates a Bun `cpSync` race in `sync-versioned-docs` that intermittently fails the full concurrent build (observed 1/3 runs once Slice B raises build concurrency).
1020
+
1021
+ - **Implementation plan:** [mcp-doc-sync-off-compile-path.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/mcp-doc-sync-off-compile-path.md)
1022
+ - **Tasks:** [mcp-doc-sync-off-compile-path.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/mcp-doc-sync-off-compile-path.md)
1023
+
1024
+ ---
1025
+
1026
+ ## admin-scripts-durable-jobs
1027
+
1028
+ **Title:** `Admin scripts via durable jobs`
1029
+
1030
+ **Labels:** `area:admin`, `type:chore`
1031
+ **Project fields:** Area=`admin`, Target=`Released`, Impact=`Improvement`, IP=`admin-scripts-durable-jobs`, Status=`Shipped`
1032
+
1033
+ Admin HTTP script runs (`POST /admin/scripts/:name/run`) enqueue `@terreno/jobs` job `admin/script` when `JobsApp` is registered, while the Scripts UI keeps polling `BackgroundTask` by `taskId`.
1034
+
1035
+ - **Implementation plan:** [admin-scripts-durable-jobs.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/admin-scripts-durable-jobs.md)
1036
+ - **Tasks:** [admin-scripts-durable-jobs.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/admin-scripts-durable-jobs.md)
1037
+
1038
+ ---
1039
+
1040
+ ## announcements
1041
+
1042
+ **Title:** `Product Update Announcements — In-App Core Feature`
1043
+
1044
+ **Labels:** `area:api`, `type:feature`
1045
+ **Project fields:** Area=`api`, Target=`Released`, Impact=`Feature`, IP=`announcements`, Status=`Shipped`
1046
+
1047
+ Ship a **core Terreno feature** for admin-managed, in-app product update announcements — similar in scope to feature flags and consent forms. Admins create markdown announcements with scheduling, targeting metadata, and lifecycle controls. Authenticated users see a **priority-ordered modal queue** (one at a time) and can browse a **changelog feed**. Consumers (e.g. Flourish) configure audience matching and acknowledgement policy without forking the package.
1048
+
1049
+ - **Implementation plan:** [announcements.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/announcements.md)
1050
+ - **Tasks:** [announcements.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/announcements.md)
1051
+
1052
+ ---
1053
+
1054
+ ## gpt-chat-mascot
1055
+
1056
+ **Title:** `GPTChat optional mascot`
1057
+
1058
+ **Labels:** `area:ui`, `type:feature`
1059
+ **Project fields:** Area=`ui`, Target=`Released`, Impact=`Feature`, IP=`gpt-chat-mascot`, Status=`Shipped`
1060
+
1061
+ Let consuming apps brand the GPT screen with their own mascot. Terreno does not ship a default character.
1062
+
1063
+ - **Implementation plan:** [gpt-chat-mascot.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/gpt-chat-mascot.md)
1064
+ - **Tasks:** [gpt-chat-mascot.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/gpt-chat-mascot.md)
1065
+
1066
+ ---
1067
+
1068
+ ## knip-cleanup
1069
+
1070
+ **Title:** `Remove the Knip baseline`
1071
+
1072
+ **Labels:** `area:dx`, `type:chore`
1073
+ **Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`knip-cleanup`, Status=`Shipped`
1074
+
1075
+ `bun run analyze:full` stays green and Knip has no baseline file. Every finding that existed on 2026-09-08 (~1076 fingerprints: 529 default + 547 production) is either **gone from the live Knip report** (fixed) or **declared in `knip.jsonc` with a one-line reason** (disabled).
1076
+
1077
+ - **Implementation plan:** [knip-cleanup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/knip-cleanup.md)
1078
+ - **Tasks:** [knip-cleanup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/knip-cleanup.md)
1079
+
1080
+ ---
1081
+
1082
+ ## agent-ui-blocks
1083
+
1084
+ **Title:** `Agent UI Blocks — a strict YAML DSL for agent-rendered Terreno components`
1085
+
1086
+ **Labels:** `area:ai`, `type:feature`
1087
+ **Project fields:** Area=`ai`, Target=`Next`, Impact=`Feature`, IP=`agent-ui-blocks`, Status=`Planned`
1088
+
1089
+ Let an agent answer with **components, not just prose**. When UI blocks are enabled for a chat, **every assistant reply is one YAML document**: a short, ordered list of **blocks** (heading, text, metric, chart, table, actions, columns, card, …) plus named **datasets** that charts and tables bind to. Prose is a `text` block. Terreno owns the grammar, the validator, and the renderer, so the agent can only ever produce `@terreno/ui` components painted from the app theme — never HTML, JSX, or hex colors.
1090
+
1091
+ - **Implementation plan:** [agent-ui-blocks.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/agent-ui-blocks.md)
1092
+ - **Tasks:** [agent-ui-blocks.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/agent-ui-blocks.md)
1093
+
1094
+ ---
1095
+
1096
+ ## app-mcp-server
1097
+
1098
+ **Title:** `App MCP server`
1099
+
1100
+ **Labels:** `area:mcp`, `type:feature`
1101
+ **Project fields:** Area=`mcp`, Target=`Future`, Impact=`Feature`, IP=`app-mcp-server`, Status=`Shaping`
1102
+
1103
+ A Terreno backend exposes a complete MCP product surface — tools, prompts, resources, named HTTP servers, OAuth 2.1 for remote clients, Inspector/test DX, a Streamable HTTP client, and hosted generators for those primitives — without giving up generated CRUD tools that stay aligned with `modelRouter` permissions.
1104
+
1105
+ - **Implementation plan:** [app-mcp-server.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/app-mcp-server.md)
1106
+ - **Tasks:** [app-mcp-server.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/app-mcp-server.md)
1107
+
1108
+ ---
1109
+
1110
+ ## migrate-admin-to-syncdb
1111
+
1112
+ **Title:** `Migrate built-in admin to syncdb`
1113
+
1114
+ **Labels:** `area:admin`, `type:chore`
1115
+ **Project fields:** Area=`admin`, Target=`Released`, Impact=`Improvement`, IP=`migrate-admin-to-syncdb`, Status=`Shipped`
1116
+
1117
+ Move **built-in admin model list/read/create/update/delete** for collections that already use **String `_id`** onto **windowed local-first syncdb**, with **REST remaining the membership source** (search, sort, pagination, RBAC). Remaining admin RPC (config, scripts, roles, comms, AI, consent, documents, version-config, background-tasks) leaves RTK `injectEndpoints` for a **tiny native `fetch` wrapper** with **host-injected auth**.
1118
+
1119
+ - **Implementation plan:** [migrate-admin-to-syncdb.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/migrate-admin-to-syncdb.md)
1120
+ - **Tasks:** [migrate-admin-to-syncdb.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/migrate-admin-to-syncdb.md)
1121
+
1122
+ ---
1123
+
1124
+ ## remove-legacy-realtime
1125
+
1126
+ **Title:** `Remove legacy RTK realtime in Terreno 58`
1127
+
1128
+ **Labels:** `area:api`, `type:feature`
1129
+ **Project fields:** Area=`api`, Target=`58`, Impact=`Breaking`, IP=`remove-legacy-realtime`, Status=`Planned`
1130
+
1131
+ Delete the **legacy RTK cache-patching realtime path** in Terreno 58. Collection live updates go through `@terreno/syncdb` (`sync` on `modelRouter` + `sync:delta`). This IP does **not** remove `RealtimeApp`: that plugin still hosts Socket.io, change streams, and the syncdb socket channel.
1132
+
1133
+ - **Implementation plan:** [remove-legacy-realtime.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/remove-legacy-realtime.md)
1134
+ - **Tasks:** [remove-legacy-realtime.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/remove-legacy-realtime.md)
1135
+
1136
+ ---
1137
+
1138
+ ## ai-observability
1139
+
1140
+ **Title:** `AI observability (Langfuse-light, pluggable)`
1141
+
1142
+ **Labels:** `area:ai`, `type:feature`
1143
+ **Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`ai-observability`, Status=`Shaping`
1144
+
1145
+ Ship **Langfuse-like** prompt versioning, nested traces (user / session / cost), multidimensional evaluators (LLM-as-judge + structured I/O), datasets, experiments, and a **local human review queue** — **inside Terreno**, as **plugins on `@terreno/ai`**, with an operator UI in **`admin-frontend` only**.
1146
+
1147
+ - **Implementation plan:** [ai-observability.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/ai-observability.md)
1148
+ - **Tasks:** [ai-observability.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/ai-observability.md)
1149
+
1150
+ ---
1151
+
1152
+ ## better-auth-strict-oauth-provider
1153
+
1154
+ **Title:** `Better Auth sync omits unset oauthProvider`
1155
+
1156
+ **Labels:** `area:auth`, `type:bug`
1157
+ **Project fields:** Area=`auth`, Target=`Released`, Impact=`Fix`, IP=`better-auth-strict-oauth-provider`, Status=`Shipped`
1158
+
1159
+ Email/password Better Auth users sync into a consumer `User` model that uses `strict: "throw"` and does **not** declare `oauthProvider`. The first authenticated `modelRouter` request after sign-up populates `req.user` (not 401).
1160
+
1161
+ - **Implementation plan:** [better-auth-strict-oauth-provider.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/better-auth-strict-oauth-provider.md)
1162
+ - **Tasks:** [better-auth-strict-oauth-provider.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/better-auth-strict-oauth-provider.md)
1163
+
1164
+ ---
1165
+
1166
+ ## mcp-service-tokens
1167
+
1168
+ **Title:** `MCP service tokens`
1169
+
1170
+ **Labels:** `area:mcp`, `type:feature`
1171
+ **Project fields:** Area=`mcp`, Target=`Released`, Impact=`Feature`, IP=`mcp-service-tokens`, Status=`Shipped`
1172
+
1173
+ Authenticated users mint **personal MCP service tokens** that act as that user on the consumer app's `POST /mcp` endpoint only. They copy an **MCP URL** plus a **Bearer `mcp_…` key** into external clients (Perplexity custom connectors, Claude Code, Cursor, Inspector) without pasting a session JWT. Admins list and revoke any user's tokens from the admin panel.
1174
+
1175
+ - **Implementation plan:** [mcp-service-tokens.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/mcp-service-tokens.md)
1176
+ - **Tasks:** [mcp-service-tokens.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/mcp-service-tokens.md)
1177
+
1178
+ ---
1179
+
1180
+ ## compile-pipeline-dedup
1181
+
1182
+ **Title:** `Compile pipeline dedup (remove redundant recompiles)`
1183
+
1184
+ **Labels:** `area:dx`, `type:chore`
1185
+ **Project fields:** Area=`dx`, Target=`Released`, Impact=`Improvement`, IP=`compile-pipeline-dedup`, Status=`Shipped`
1186
+
1187
+ Make each `@terreno/*` package compile **exactly once** per cold `bun run compile` by relying on Bun's built-in workspace dependency ordering, instead of the current pipeline that recompiles shared packages many times. Target contribution to the scan goal: ~60–90s.
1188
+
1189
+ - **Implementation plan:** [compile-pipeline-dedup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/compile-pipeline-dedup.md)
1190
+ - **Tasks:** [compile-pipeline-dedup.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/compile-pipeline-dedup.md)
1191
+
1192
+ ---
1193
+
1194
+ ## support-agent
1195
+
1196
+ **Title:** `Support answering agent (@terreno/support)`
1197
+
1198
+ **Labels:** `area:ai`, `type:feature`
1199
+ **Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`support-agent`, Status=`Shaping`
1200
+
1201
+ Ship `@terreno/support`, a `TerrenoPlugin` that:
1202
+
1203
+ 1. **Ingests knowledge** from pluggable `KnowledgeSource` adapters into a Mongo-backed,
1204
+ chunked, searchable index. Built in: announcements, markdown docs folder, and a generic
1205
+ Mongoose-model adapter.
1206
+ 2. **Answers support questions** with `@terreno/ai`'s `AIService`, grounded only in
1207
+ retrieved chunks, returning `answer`, `sources`, `confidence`, and `shouldEscalate`.
1208
+ 3. **Exposes the agent as MCP tools** on the app's existing `/mcp` server
1209
+ (`support_ask`, `support_search`, `support_get_document`, `support_list_sources`) and
1210
+ as REST `modelRouter` actions, so ChatGPT, Claude, Cursor, an in-app widget, or a
1211
+ human-support tool can all call the same agent.
1212
+ 4. **Closes the loop for AI authors**: a `support/kb/` docs convention, a
1213
+ `write-support-docs` skill, a `terreno-support check` validator, and a
1214
+ "knowledge gaps" report (low-confidence / thumbs-down questions) that tells agents which
1215
+ doc to write next.
1216
+
1217
+ - **Implementation plan:** [support-agent.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/support-agent.md)
1218
+ - **Tasks:** [support-agent.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/support-agent.md)
1219
+
1220
+ ---
1221
+
1222
+ ## ai-agents-and-failover
1223
+
1224
+ **Title:** `AI agents and provider failover`
1225
+
1226
+ **Labels:** `area:ai`, `type:feature`
1227
+ **Project fields:** Area=`ai`, Target=`Future`, Impact=`Feature`, IP=`ai-agents-and-failover`, Status=`Shaping`
1228
+
1229
+ Add two additive library seams to `@terreno/ai` so app code can:
1230
+
1231
+ 1. Define a reusable **Agent** (`name`, `instructions`, `tools`, optional `schema`, optional `middleware`) that runs through existing `AIService` logging.
1232
+ 2. Wrap one or more Vercel AI SDK `LanguageModel`s in **`createFailoverModel`** so 429/502/503/overloaded failures try the next model. Every `AIService` method inherits failover without per-method changes.
1233
+
1234
+ - **Implementation plan:** [ai-agents-and-failover.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/ai-agents-and-failover.md)
1235
+ - **Tasks:** [ai-agents-and-failover.md](https://github.com/TerrenoLabs/terreno/blob/master/docs/tasks/ai-agents-and-failover.md)
1236
+
1237
+ ---
1238
+
1239
+ ## terreno-58
1240
+
1241
+ **Title:** `Terreno 58`
1242
+
1243
+ **Labels:** `area:dx`, `type:chore`, `breaking`
1244
+ **Project fields:** Area=`dx`, Target=`58`, Impact=`Breaking`, IP=*(not yet written)*, Status=`Planned`
1245
+
1246
+ Umbrella for the Terreno 58 / Expo SDK 58 major release: every breaking change that was
1247
+ deprecated during 57.x lands together so consumers upgrade once. Each change keeps its own
1248
+ IP and tracking issue; this entry is the release checklist, not a plan.
1249
+
1250
+ - Remove legacy RTK realtime (`modelRouter` `realtime`, RTK cache patching) — [remove-legacy-realtime](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/remove-legacy-realtime.md)
1251
+ - Remove admin `api` / `injectEndpoints` and `useAdminApi`; admin runs on syncdb — follow-up to [migrate-admin-to-syncdb](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/migrate-admin-to-syncdb.md)
1252
+ - Native module baseline (new dev-client binary) — [native-module-baseline](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/native-module-baseline.md)
1253
+ - HTTP rate limiting on by default — [rate-limiting](https://github.com/TerrenoLabs/terreno/blob/master/docs/implementationPlans/rate-limiting.md)
1254
+ - Expo SDK 58 upgrade — release PR [#1310](https://github.com/TerrenoLabs/terreno/pull/1310)
1255
+ - **RTK flag:** Breaking
1256
+ - **Depends on:** remove-legacy-realtime, migrate-admin-to-syncdb, native-module-baseline
1257
+
1258
+ ---
1259
+
1012
1260
  # Shipped, umbrella, and declined IPs
1013
1261
 
1014
1262
  Tracking issues created for IPs that previously lacked a `**Roadmap issue:**` header.
@@ -1035,20 +1283,21 @@ this table supplies only the issue number.
1035
1283
  | `design-blend-skill` | https://github.com/TerrenoLabs/terreno/issues/1083 | `Shipped` | `dx` | `Released` | `Feature` | `type:feature` |
1036
1284
  | `ModularAPI` | https://github.com/TerrenoLabs/terreno/issues/1084 | `Shipped` | `api` | `Released` | `Feature` | `type:feature` |
1037
1285
  | `mcp-boost-parity` | https://github.com/TerrenoLabs/terreno/issues/1085 | `In progress` | `mcp` | `Next` | `Feature` | `type:feature` |
1038
- | `docs-site-and-versioning` | https://github.com/TerrenoLabs/terreno/issues/1086 | `Planned` | `docs` | `Next` | `Feature` | `type:docs` |
1286
+ | `docs-site-and-versioning` | https://github.com/TerrenoLabs/terreno/issues/1086 | `Shipped` | `docs` | `Released` | `Feature` | `type:docs` |
1039
1287
  | `syncdb-codegen` | https://github.com/TerrenoLabs/terreno/issues/1110 | `Shipped` | `syncdb` | `Released` | `Feature` | `type:feature` |
1040
1288
  | `migrate-cicd-to-circleci` | https://github.com/TerrenoLabs/terreno/issues/1088 | `In progress` | `dx` | `Next` | `Improvement` | `type:chore` |
1041
1289
  | `rbac-permissions` | https://github.com/TerrenoLabs/terreno/issues/1089 | `Shipped` | `api` | `Released` | `Feature` | `type:feature` |
1042
1290
  | `infra-mcp` | https://github.com/TerrenoLabs/terreno/issues/1090 | `Planned` | `mcp` | `Future` | `Feature` | `type:feature` |
1043
- | `comms-admin-dashboard` | https://github.com/TerrenoLabs/terreno/issues/1091 | `Planned` | `admin` | `Next` | `Feature` | `type:feature` |
1291
+ | `comms-admin-dashboard` | https://github.com/TerrenoLabs/terreno/issues/1091 | `Shipped` | `admin` | `Released` | `Feature` | `type:feature` |
1044
1292
  | `model-router-mcp` | https://github.com/TerrenoLabs/terreno/issues/1092 | `Shipped` | `mcp` | `Released` | `Feature` | `type:feature` |
1045
- | `terreno-langfuse-integration` | https://github.com/TerrenoLabs/terreno/issues/1093 | `Planned` | `ai` | `Future` | `Feature` | `type:feature` |
1293
+ | `terreno-langfuse-integration` | https://github.com/TerrenoLabs/terreno/issues/1093 | `Shipped` | `ai` | `Released` | `Feature` | `type:feature` |
1046
1294
  | `oss-launch-program` | https://github.com/TerrenoLabs/terreno/issues/1094 | `In progress` | `dx` | `Next` | `Improvement` | `type:chore` |
1047
1295
  | `b2b-platform-program` | https://github.com/TerrenoLabs/terreno/issues/1095 | `Planned` | `api` | `Next` | `Feature` | `type:feature` |
1048
1296
  | `offline-mode` | https://github.com/TerrenoLabs/terreno/issues/1096 | `Declined` | `syncdb` | `Future` | `Feature` | `type:feature` |
1049
1297
  | `model-router-actions` | https://github.com/TerrenoLabs/terreno/issues/1097 | `Declined` | `api` | `Future` | `Feature` | `type:feature` |
1050
1298
  | `feature-flags` | https://github.com/TerrenoLabs/terreno/issues/1098 | `Declined` | `api` | `Future` | `Feature` | `type:feature` |
1051
1299
  | `admin-improvements` | https://github.com/TerrenoLabs/terreno/issues/1099 | `Declined` | `admin` | `Future` | `Improvement` | `type:feature` |
1300
+ | `better-auth-strict-oauth-provider` | https://github.com/TerrenoLabs/terreno/issues/1218 | `Shipped` | `auth` | `Released` | `Fix` | `type:bug` |
1052
1301
 
1053
1302
  **Duplicate to retire:** [#1087](https://github.com/TerrenoLabs/terreno/issues/1087)
1054
1303
  covers the same `syncdb-codegen` IP as [#1110](https://github.com/TerrenoLabs/terreno/issues/1110).
@@ -4,8 +4,9 @@ Run `bun run analyze:full` before pushing changes that alter imports, exports, p
4
4
  dependencies, or module boundaries.
5
5
 
6
6
  Taste does not need to infer that policy in this repository. The root `prepush` package
7
- script is the canonical local gate and runs lint, TypeScript compilation, and full static
8
- analysis:
7
+ script is the canonical local gate. It runs lint and TypeScript compilation, then the
8
+ local mirror of every CI job the branch triggers, including full static analysis when
9
+ repo policies apply (see [Run tests locally](../how-to/run-tests-locally.md#prepush-mirrors-ci)):
9
10
 
10
11
  ```bash
11
12
  bun run prepush
@@ -0,0 +1,42 @@
1
+ # Test isolation in Bun suites
2
+
3
+ `bun test` runs every test file of a package in one process. `mock.module` replaces a
4
+ module for that whole process, and `mock.restore()` does not undo it. A test that
5
+ mocks a module can pass on its own, then break other files, or be broken by them,
6
+ when the whole package runs. CI always runs the whole package, so this kind of
7
+ failure shows up only after a push.
8
+
9
+ ## The rule
10
+
11
+ A branch may not add a `mock.module` call to a shared suite, meaning any `*.test.*` or
12
+ `*.spec.*` file outside an `isolated/` directory. Existing calls are grandfathered. The
13
+ check only counts lines the branch adds.
14
+
15
+ ```bash
16
+ bun run check:test-isolation # vs merge-base with origin/master
17
+ ```
18
+
19
+ `bun run prepush` and the CircleCI `repo-policies` job both run it.
20
+
21
+ ## Fixes, in order of preference
22
+
23
+ 1. **Inject the dependency.** Pass a fake through props, options, or a parameter
24
+ instead of replacing the module.
25
+ 2. **Isolate the file.** Move the test to `src/isolated/<name>.isolated.ts(x)`. Packages
26
+ whose `test:coverage` uses `scripts/check-coverage.ts` run each isolated file in its
27
+ own `bun test` process and merge the coverage.
28
+ 3. **Mock once in the preload.** Register the mock in the package's bun preload (for
29
+ example `src/tests/bunSetup.ts`) so every file sees the same module.
30
+ 4. **Mark an identical mock.** When the call matches the preload exactly, put
31
+ `// isolation-safe: <reason>` on the line above it.
32
+
33
+ ## Why a ratchet
34
+
35
+ Terreno has about 80 existing shared-suite files that call `mock.module`. Most mock
36
+ native modules the same way everywhere, which is harmless. Blocking new calls stops
37
+ the problem from growing without forcing a migration of working tests. Both
38
+ "passes alone, fails in the suite" fixes on the AI observability branch (#1196) came
39
+ from new module mocks.
40
+
41
+ Roast also runs the package's full CI test command, not only the changed test file,
42
+ so any remaining order-dependent failure shows up before push.