@open-mercato/cli 0.6.7-develop.6870.1.b69802067a → 0.6.8-canary.319.1.5b4be4bc52

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 (127) hide show
  1. package/.turbo/turbo-build.log +74 -1
  2. package/build.mjs +44 -4
  3. package/dist/agentic/guides/backend-ui.md +4 -0
  4. package/dist/agentic/guides/module-facts.json +1333 -113
  5. package/dist/agentic/guides/modules/ai_assistant.md +2 -2
  6. package/dist/agentic/guides/modules/api_docs.md +2 -2
  7. package/dist/agentic/guides/modules/api_keys.md +2 -2
  8. package/dist/agentic/guides/modules/attachments.md +2 -2
  9. package/dist/agentic/guides/modules/audit_logs.md +2 -2
  10. package/dist/agentic/guides/modules/auth.md +2 -2
  11. package/dist/agentic/guides/modules/business_rules.md +2 -2
  12. package/dist/agentic/guides/modules/catalog.md +10 -3
  13. package/dist/agentic/guides/modules/channel_gmail.md +2 -2
  14. package/dist/agentic/guides/modules/channel_imap.md +2 -2
  15. package/dist/agentic/guides/modules/checkout.md +8 -2
  16. package/dist/agentic/guides/modules/communication_channels.md +2 -2
  17. package/dist/agentic/guides/modules/configs.md +2 -2
  18. package/dist/agentic/guides/modules/content.md +2 -2
  19. package/dist/agentic/guides/modules/currencies.md +2 -2
  20. package/dist/agentic/guides/modules/customer_accounts.md +2 -2
  21. package/dist/agentic/guides/modules/customers.md +6 -6
  22. package/dist/agentic/guides/modules/dashboards.md +12 -12
  23. package/dist/agentic/guides/modules/data_sync.md +2 -2
  24. package/dist/agentic/guides/modules/design_system.md +2 -2
  25. package/dist/agentic/guides/modules/dictionaries.md +2 -2
  26. package/dist/agentic/guides/modules/directory.md +2 -2
  27. package/dist/agentic/guides/modules/entities.md +2 -2
  28. package/dist/agentic/guides/modules/events.md +2 -2
  29. package/dist/agentic/guides/modules/feature_toggles.md +2 -2
  30. package/dist/agentic/guides/modules/gateway_stripe.md +2 -2
  31. package/dist/agentic/guides/modules/generators.md +2 -2
  32. package/dist/agentic/guides/modules/inbox_ops.md +2 -2
  33. package/dist/agentic/guides/modules/integrations.md +5 -2
  34. package/dist/agentic/guides/modules/messages.md +2 -2
  35. package/dist/agentic/guides/modules/notifications.md +2 -2
  36. package/dist/agentic/guides/modules/onboarding.md +2 -2
  37. package/dist/agentic/guides/modules/payment_gateways.md +6 -2
  38. package/dist/agentic/guides/modules/perspectives.md +2 -2
  39. package/dist/agentic/guides/modules/planner.md +2 -2
  40. package/dist/agentic/guides/modules/portal.md +2 -2
  41. package/dist/agentic/guides/modules/progress.md +2 -2
  42. package/dist/agentic/guides/modules/query_index.md +2 -2
  43. package/dist/agentic/guides/modules/record_locks.md +3 -3
  44. package/dist/agentic/guides/modules/resources.md +2 -2
  45. package/dist/agentic/guides/modules/sales.md +13 -4
  46. package/dist/agentic/guides/modules/scheduler.md +2 -2
  47. package/dist/agentic/guides/modules/search.md +2 -2
  48. package/dist/agentic/guides/modules/security.md +3 -3
  49. package/dist/agentic/guides/modules/shipping_carriers.md +2 -2
  50. package/dist/agentic/guides/modules/sso.md +2 -2
  51. package/dist/agentic/guides/modules/staff.md +7 -4
  52. package/dist/agentic/guides/modules/storage_s3.md +2 -2
  53. package/dist/agentic/guides/modules/sync_akeneo.md +2 -2
  54. package/dist/agentic/guides/modules/sync_excel.md +2 -2
  55. package/dist/agentic/guides/modules/system_status_overlays.md +2 -2
  56. package/dist/agentic/guides/modules/translations.md +2 -2
  57. package/dist/agentic/guides/modules/webhooks.md +2 -2
  58. package/dist/agentic/guides/modules/wms.md +31 -4
  59. package/dist/agentic/guides/modules/workflows.md +2 -2
  60. package/dist/agentic/guides/reference-module-facts.json +6370 -0
  61. package/dist/agentic/guides/reference-modules/example.md +451 -0
  62. package/dist/agentic/guides/spec-delivery.md +20 -0
  63. package/dist/agentic/guides/upstream/AGENTS.md +1 -0
  64. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +1 -1
  65. package/dist/agentic/guides/upstream/manifest.json +3 -3
  66. package/dist/agentic/shared/AGENTS.md.template +10 -14
  67. package/dist/agentic/shared/ai/harness/README.md +4 -4
  68. package/dist/agentic/shared/ai/harness/RELEASE.md +4 -4
  69. package/dist/agentic/shared/ai/harness/cases.json +1584 -214
  70. package/dist/agentic/shared/ai/harness/cases.schema.json +61 -6
  71. package/dist/agentic/shared/ai/harness/fixtures/index.json +3 -1
  72. package/dist/agentic/shared/ai/harness/fixtures/seeds.json +4 -0
  73. package/dist/agentic/shared/ai/harness/knowledge-change.schema.json +228 -0
  74. package/dist/agentic/shared/ai/harness/release-matrix.json +9 -4
  75. package/dist/agentic/shared/ai/harness/result.schema.json +33 -0
  76. package/dist/agentic/shared/ai/harness/routing-response.schema.json +10 -0
  77. package/dist/agentic/shared/ai/harness/validators.json +7 -3
  78. package/dist/agentic/shared/ai/harness/writable-spec-oracles.mjs +412 -0
  79. package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +1 -0
  80. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +15 -0
  81. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +2 -0
  82. package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +1 -0
  83. package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +2 -0
  84. package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +2 -0
  85. package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +2 -0
  86. package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +1 -0
  87. package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +2 -0
  88. package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +2 -0
  89. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +2 -2
  90. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +1 -1
  91. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/knowledge-change.md +115 -0
  92. package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +1 -0
  93. package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +11 -0
  94. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/judge-workflow.md +1 -1
  95. package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +2 -2
  96. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +13 -0
  97. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +2 -0
  98. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +19 -0
  99. package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +1 -0
  100. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +24 -0
  101. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +2 -0
  102. package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +1 -0
  103. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +13 -0
  104. package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +39 -2
  105. package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +653 -26
  106. package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +1 -1
  107. package/dist/agentic/shared/scripts/validate-knowledge-change.mjs +911 -0
  108. package/dist/lib/generators/module-extension-facts.js +44 -12
  109. package/dist/lib/generators/module-extension-facts.js.map +2 -2
  110. package/dist/lib/generators/module-facts-discovery.js +23 -0
  111. package/dist/lib/generators/module-facts-discovery.js.map +2 -2
  112. package/dist/lib/generators/module-facts.js +273 -38
  113. package/dist/lib/generators/module-facts.js.map +2 -2
  114. package/dist/lib/testing/integration.js +0 -2
  115. package/dist/lib/testing/integration.js.map +2 -2
  116. package/package.json +7 -7
  117. package/src/lib/generators/__tests__/module-extension-facts.test.ts +199 -0
  118. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +53 -2
  119. package/src/lib/generators/__tests__/module-facts.computed-di-token.test.ts +88 -0
  120. package/src/lib/generators/__tests__/module-facts.local-reference.test.ts +391 -0
  121. package/src/lib/generators/__tests__/module-facts.search-entity-id.test.ts +151 -0
  122. package/src/lib/generators/__tests__/module-facts.source-links.test.ts +42 -1
  123. package/src/lib/generators/__tests__/module-override-targets.test.ts +24 -0
  124. package/src/lib/generators/module-extension-facts.ts +80 -12
  125. package/src/lib/generators/module-facts-discovery.ts +46 -0
  126. package/src/lib/generators/module-facts.ts +485 -41
  127. package/src/lib/testing/integration.ts +0 -2
@@ -4,6 +4,9 @@ Copied create-app/agentic/ → dist/agentic/
4
4
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for channel_gmail
5
5
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for channel_imap
6
6
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for checkout
7
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:11
8
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:30
9
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:56
7
10
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for content
8
11
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for api_docs
9
12
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for api_keys
@@ -54,6 +57,76 @@ Copied create-app/agentic/ → dist/agentic/
54
57
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for generators
55
58
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for storage_s3
56
59
  [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for sync_akeneo
57
- [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for webhooks
58
60
  Generated 55 module fact-sheets → dist/agentic/guides/modules/
61
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for webhooks
62
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for ai_assistant
63
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for channel_gmail
64
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for channel_imap
65
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for checkout
66
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:11
67
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:30
68
+ [module-facts] searchConfig entityId is not statically resolvable: /home/runner/work/open-mercato/open-mercato/packages/checkout/src/modules/checkout/search.ts:56
69
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for content
70
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for api_docs
71
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for api_keys
72
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for attachments
73
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for audit_logs
74
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for auth
75
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for business_rules
76
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for catalog
77
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for communication_channels
78
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for configs
79
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for currencies
80
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for customer_accounts
81
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for customers
82
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for dashboards
83
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for data_sync
84
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for design_system
85
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for dictionaries
86
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for directory
87
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for entities
88
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for feature_toggles
89
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for inbox_ops
90
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for integrations
91
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for messages
92
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for notifications
93
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for payment_gateways
94
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for perspectives
95
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for planner
96
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for portal
97
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for progress
98
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for query_index
99
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for resources
100
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for sales
101
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for shipping_carriers
102
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for staff
103
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for sync_excel
104
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for translations
105
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for wms
106
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for workflows
107
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for record_locks
108
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for security
109
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for sso
110
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for system_status_overlays
111
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for events
112
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for gateway_stripe
113
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for onboarding
114
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for scheduler
115
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for search
116
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for generators
117
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for storage_s3
118
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for sync_akeneo
119
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for webhooks
120
+ [module-facts] module registry unavailable (registryPath not provided); API route auth omitted for example
121
+ [module-facts] example unresolved-first-party-target: example:auto-default-priority:example.todo.creating (src/modules/example/subscribers/auto-default-priority.ts)
122
+ [module-facts] example unresolved-first-party-target: example:example-event:example.ping (src/modules/example/subscribers/example-event.ts)
123
+ [module-facts] example unresolved-first-party-target: example:prevent-uncomplete:example.todo.updating (src/modules/example/subscribers/prevent-uncomplete.ts)
124
+ [module-facts] example unresolved-first-party-target: example.injection.crud-validation@example:phase-c-handlers:example:phase-c-handlers (src/modules/example/widgets/injection-table.ts)
125
+ [module-facts] example unresolved-first-party-target: example.todo-limit:example.todo (src/modules/example/data/guards.ts)
126
+ [module-facts][reference] unresolved first-party target: example:example:auto-default-priority:example.todo.creating
127
+ [module-facts][reference] unresolved first-party target: example:example:example-event:example.ping
128
+ [module-facts][reference] unresolved first-party target: example:example:prevent-uncomplete:example.todo.updating
129
+ [module-facts][reference] unresolved first-party target: example:example.injection.crud-validation@example:phase-c-handlers:example:phase-c-handlers
130
+ [module-facts][reference] unresolved first-party target: example:example.todo-limit:example.todo
131
+ Generated 1 local reference projection(s) → dist/agentic/guides/reference-modules/
59
132
  [build:cli] built successfully
package/build.mjs CHANGED
@@ -57,6 +57,8 @@ await buildPackage(packageDir, {
57
57
  // in an incremental `dist/` from an older build. Mirrors packages/create-app/build.mjs;
58
58
  // conceptual guides remain while stale single-dot package guides are removed below.
59
59
  rmSync(join(guidesDestDir, 'modules'), { recursive: true, force: true })
60
+ rmSync(join(guidesDestDir, 'reference-modules'), { recursive: true, force: true })
61
+ rmSync(join(guidesDestDir, 'reference-module-facts.json'), { force: true })
60
62
  for (const entry of readdirSync(guidesDestDir)) {
61
63
  if (/^core\..+\.md$/.test(entry)) {
62
64
  rmSync(join(guidesDestDir, entry))
@@ -93,14 +95,23 @@ await buildPackage(packageDir, {
93
95
  // `mercato agentic:init` bundles the same guides as a create-mercato-app scaffold
94
96
  // (packages/create-app/build.mjs). Discovery goes through the resolver, never a
95
97
  // hardcoded packages/* path (.ai/lessons/standalone-scaffolding-and-generators-must-not-assume.md).
96
- const { extractAllModuleFacts, renderModuleFactsJson } = await import(
97
- pathToFileURL(join(outdir, 'lib', 'generators', 'module-facts.js')).href
98
- )
99
- const { discoverPackageModuleSources } = await import(
98
+ const {
99
+ assertPackageModuleFactsOnly,
100
+ extractAllModuleFacts,
101
+ extractLocalReferenceModuleFacts,
102
+ renderModuleFactsJson,
103
+ renderReferenceModuleFactsJson,
104
+ } = await import(pathToFileURL(join(outdir, 'lib', 'generators', 'module-facts.js')).href)
105
+ const { discoverLocalReferenceModuleSource, discoverPackageModuleSources } = await import(
100
106
  pathToFileURL(join(outdir, 'lib', 'generators', 'module-facts-discovery.js')).href
101
107
  )
102
108
  const { createResolver } = await import(pathToFileURL(join(outdir, 'lib', 'resolver.js')).href)
103
109
 
110
+ // Mirrors packages/create-app/build.mjs: the disabled app-local example never enters
111
+ // the normal package outputs and is projected into its own reference bundle so
112
+ // `mercato agentic:init` bundles exactly what a create-mercato-app scaffold does.
113
+ const REFERENCE_MODULE_IDS = ['example']
114
+
104
115
  const sources = discoverPackageModuleSources(createResolver(join(packagesDir, '..')))
105
116
  if (sources.length > 0) {
106
117
  const registryPath = join(packagesDir, '..', 'apps', 'mercato', '.mercato', 'generated', 'modules.runtime.generated.ts')
@@ -117,6 +128,8 @@ await buildPackage(packageDir, {
117
128
  coreVersion,
118
129
  })
119
130
 
131
+ assertPackageModuleFactsOnly(factsByModule)
132
+
120
133
  const modulesGuidesDir = join(guidesDestDir, 'modules')
121
134
  mkdirSync(modulesGuidesDir, { recursive: true })
122
135
  for (const [moduleId, markdown] of Object.entries(markdownByModule)) {
@@ -127,6 +140,33 @@ await buildPackage(packageDir, {
127
140
 
128
141
  for (const warning of warnings) console.warn(warning)
129
142
  console.log(`Generated ${Object.keys(markdownByModule).length} module fact-sheets → dist/agentic/guides/modules/`)
143
+
144
+ const referenceBundle = {}
145
+ const referenceGuidesDir = join(guidesDestDir, 'reference-modules')
146
+ const templateRoot = join(packagesDir, 'create-app', 'template')
147
+ for (const moduleId of REFERENCE_MODULE_IDS) {
148
+ const reference = discoverLocalReferenceModuleSource({ appRoot: templateRoot, moduleId })
149
+ if (!reference) {
150
+ throw new Error(`[module-facts] reference module "${moduleId}" is missing from the create-app template`)
151
+ }
152
+ const { entry, markdown, warnings: referenceWarnings, unresolvedTargets } = extractLocalReferenceModuleFacts({
153
+ packageSources: sources,
154
+ reference,
155
+ registryPath: existsSync(registryPath) ? registryPath : null,
156
+ coreVersion,
157
+ })
158
+ referenceBundle[moduleId] = entry
159
+ mkdirSync(referenceGuidesDir, { recursive: true })
160
+ writeFileSync(join(referenceGuidesDir, `${moduleId}.md`), markdown)
161
+ for (const warning of referenceWarnings) console.warn(warning)
162
+ for (const target of unresolvedTargets) {
163
+ console.warn(`[module-facts][reference] unresolved first-party target: ${target}`)
164
+ }
165
+ }
166
+ writeFileSync(join(guidesDestDir, 'reference-module-facts.json'), renderReferenceModuleFactsJson(referenceBundle))
167
+ console.log(
168
+ `Generated ${REFERENCE_MODULE_IDS.length} local reference projection(s) → dist/agentic/guides/reference-modules/`,
169
+ )
130
170
  } else {
131
171
  console.warn('[module-facts] no package modules discovered; skipping fact-sheet generation')
132
172
  }
@@ -78,3 +78,7 @@ For a new editable entity or module, unless the brief explicitly excludes an ope
78
78
  2. Exercise loading, empty, validation error, server error, conflict, success, and delete flows.
79
79
  3. Save, reload, edit, clear nullable fields, and verify the API payload and rendered state agree.
80
80
  4. Check keyboard and narrow-width behavior; run affected integration tests through real API fixtures.
81
+
82
+ ## Canonical example source
83
+
84
+ This guide stays the rule owner. For one compiling implementation of a table, form, page shell, or rendered injected widget, open the exact row in [`src/modules/example/references/surface-map.md`](../../src/modules/example/references/surface-map.md) — its `Backend UI` section links each file — or go straight to [`components/TodosTable.tsx`](../../src/modules/example/components/TodosTable.tsx) and [`components/TodoForm.tsx`](../../src/modules/example/components/TodoForm.tsx). That module is source-present and runtime-disabled: read one row, never the tree, and rename every `example` identifier.