spine-framework 0.3.145 → 0.4.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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,18 +1,13 @@
1
- // CIL[BEGIN chunk_id="cildashboardpage_module_header_1784193942" type="module_header" identity="module_header" parent="none"]
2
- // CIL[DOC-MACRO purpose="Import dependencies and icons for the CIL dashboard page"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Provides module imports and icon references used by the page"]
4
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
5
- // CIL[DOC-CONTRACT inputs="none" outputs="module imports" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Imports React hooks, router, apiFetch, app path hook, UI components, and lucide icons" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Admin CIL project dashboard page root module: imports dependencies and composes the CILDashboardPage component."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Bootstraps the admin CIL dashboard page and wires UI primitives, icons, and the local PageInstructions component."]
4
+ // CIL[DOC-CONTEXT module="admin/cil" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="default export CILDashboardPage" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports React hooks, router, API, UI components, icons, and PageInstructions." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
8
  // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="developer"]
10
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/functions/_shared/principal.ts, \."]
11
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
14
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
15
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="developers maintaining the CIL admin UI"]
10
+
16
11
  import { useEffect, useState, useCallback } from 'react'
17
12
  import { useParams } from 'react-router-dom'
18
13
  import { apiFetch } from '@core/lib/api'
@@ -41,24 +36,23 @@ import {
41
36
  Settings2,
42
37
  } from 'lucide-react'
43
38
 
44
-
45
-
46
39
  import { PageInstructions } from '../../../components/admin/PageInstructions'
47
- // CIL[END chunk_id="cildashboardpage_module_header_1784193942"]
48
- // CIL[BEGIN chunk_id="cildashboardpage_projectstats_1784193942" type="interface" identity="ProjectStats" parent="none"]
49
- // CIL[DOC-MACRO purpose="Define the ProjectStats data shape"]
50
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for project-level ingestion statistics"]
51
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
52
- // CIL[DOC-CONTRACT inputs="none" outputs="ProjectStats type definition" errors="none" side_effects="none"]
53
- // CIL[DOC-MICRO logic_summary="Declares file count, chunk count, proposal counts, ingestion cost, and last ingestion timestamp" notable_decisions="[]"]
54
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
55
- // CIL[DOC-STABILITY stability="stable"]
56
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
57
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
58
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
59
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
40
+ // CIL[DOC-VECTOR type="context" content="purpose='Admin CIL project dashboard page root module: imports dependencies and composes the CILDashboardPage component.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
41
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
42
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
43
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
60
44
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
61
45
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
46
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:module_header:module_header"]
47
+
48
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:projectstats:interface" type="interface" identity="ProjectStats" parent="none"]
49
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL project ingestion statistics."]
50
+ // CIL[DOC-RESPONSIBILITY responsibility="Provides a typed contract for project-level stats returned from the ingestion pipeline."]
51
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
52
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface ProjectStats" errors="none" side_effects="none"]
53
+ // CIL[DOC-MICRO logic_summary="Fields: file_count, chunk_count, proposal_count, approved_count, pending_review_count, total_ingestion_cost_usd, last_ingested_at." notable_decisions="[]"]
54
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
55
+ // CIL[DOC-STABILITY stability="stable"]
62
56
  interface ProjectStats {
63
57
  file_count: number
64
58
  chunk_count: number
@@ -68,44 +62,44 @@ interface ProjectStats {
68
62
  total_ingestion_cost_usd: number
69
63
  last_ingested_at: string | null
70
64
  }
71
-
72
- // CIL[END chunk_id="cildashboardpage_projectstats_1784193942"]
73
- // CIL[BEGIN chunk_id="cildashboardpage_embedstatus_1784193942" type="interface" identity="EmbedStatus" parent="none"]
74
- // CIL[DOC-MACRO purpose="Define the EmbedStatus data shape"]
75
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for chunk embedding coverage"]
76
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
77
- // CIL[DOC-CONTRACT inputs="none" outputs="EmbedStatus type definition" errors="none" side_effects="none"]
78
- // CIL[DOC-MICRO logic_summary="Declares total, embedded, unembedded counts and coverage percentage" notable_decisions="[]"]
79
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
80
- // CIL[DOC-STABILITY stability="stable"]
81
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
82
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
83
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
84
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
65
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL project ingestion statistics.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
66
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
67
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
68
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
85
69
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
86
70
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
71
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:projectstats:interface"]
72
+
73
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:embedstatus:interface" type="interface" identity="EmbedStatus" parent="none"]
74
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL embedding coverage status."]
75
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the embedding completeness counts for a project."]
76
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
77
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface EmbedStatus" errors="none" side_effects="none"]
78
+ // CIL[DOC-MICRO logic_summary="Fields: total_chunks, embedded_chunks, coverage_pct, unembedded_chunks." notable_decisions="[]"]
79
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
80
+ // CIL[DOC-STABILITY stability="stable"]
87
81
  interface EmbedStatus {
88
82
  total_chunks: number
89
83
  embedded_chunks: number
90
84
  coverage_pct: number
91
85
  unembedded_chunks: number
92
86
  }
93
-
94
- // CIL[END chunk_id="cildashboardpage_embedstatus_1784193942"]
95
- // CIL[BEGIN chunk_id="cildashboardpage_docstatus_1784193942" type="interface" identity="DocStatus" parent="none"]
96
- // CIL[DOC-MACRO purpose="Define the DocStatus data shape"]
97
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for documentation coverage"]
98
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
99
- // CIL[DOC-CONTRACT inputs="none" outputs="DocStatus type definition" errors="none" side_effects="none"]
100
- // CIL[DOC-MICRO logic_summary="Declares total, documented, undocumented, AI-generated, human-verified counts and coverage percentage" notable_decisions="[]"]
101
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
102
- // CIL[DOC-STABILITY stability="stable"]
103
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
104
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
105
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
106
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
87
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL embedding coverage status.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
88
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
89
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
90
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
107
91
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
108
92
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
93
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:embedstatus:interface"]
94
+
95
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:docstatus:interface" type="interface" identity="DocStatus" parent="none"]
96
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL documentation coverage status."]
97
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the documentation coverage counts for a project."]
98
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
99
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface DocStatus" errors="none" side_effects="none"]
100
+ // CIL[DOC-MICRO logic_summary="Fields: total_chunks, documented_count, undocumented_count, ai_generated_count, human_verified_count, coverage_pct." notable_decisions="[]"]
101
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
102
+ // CIL[DOC-STABILITY stability="stable"]
109
103
  interface DocStatus {
110
104
  total_chunks: number
111
105
  documented_count: number
@@ -114,22 +108,22 @@ interface DocStatus {
114
108
  human_verified_count: number
115
109
  coverage_pct: number
116
110
  }
117
-
118
- // CIL[END chunk_id="cildashboardpage_docstatus_1784193942"]
119
- // CIL[BEGIN chunk_id="cildashboardpage_callmapstatus_1784193942" type="interface" identity="CallmapStatus" parent="none"]
120
- // CIL[DOC-MACRO purpose="Define the CallmapStatus data shape"]
121
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for call graph link counts"]
122
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
123
- // CIL[DOC-CONTRACT inputs="none" outputs="CallmapStatus type definition" errors="none" side_effects="none"]
124
- // CIL[DOC-MICRO logic_summary="Declares import, call, export, and tested-by link counts" notable_decisions="[]"]
125
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
126
- // CIL[DOC-STABILITY stability="stable"]
127
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
128
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
129
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
130
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
111
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL documentation coverage status.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
112
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
113
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
114
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
131
115
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
132
116
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
117
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:docstatus:interface"]
118
+
119
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:callmapstatus:interface" type="interface" identity="CallmapStatus" parent="none"]
120
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL call-map link counts."]
121
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the call-map and import link counts for a project."]
122
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
123
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface CallmapStatus" errors="none" side_effects="none"]
124
+ // CIL[DOC-MICRO logic_summary="Fields: import_links, call_links, export_links, total_links, tested_by_links." notable_decisions="[]"]
125
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
126
+ // CIL[DOC-STABILITY stability="stable"]
133
127
  interface CallmapStatus {
134
128
  import_links: number
135
129
  call_links: number
@@ -137,42 +131,64 @@ interface CallmapStatus {
137
131
  total_links: number
138
132
  tested_by_links?: number
139
133
  }
140
-
141
- // CIL[END chunk_id="cildashboardpage_callmapstatus_1784193942"]
142
- // CIL[BEGIN chunk_id="cildashboardpage_configstatus_1784193942" type="interface" identity="ConfigStatus" parent="none"]
143
- // CIL[DOC-MACRO purpose="Define the ConfigStatus data shape"]
144
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for config extraction status"]
145
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
146
- // CIL[DOC-CONTRACT inputs="none" outputs="ConfigStatus type definition" errors="none" side_effects="none"]
147
- // CIL[DOC-MICRO logic_summary="Declares config item count and configures link count" notable_decisions="[]"]
148
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
149
- // CIL[DOC-STABILITY stability="stable"]
150
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
151
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
152
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
153
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
134
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL call-map link counts.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
135
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
136
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
137
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
154
138
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
155
139
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
140
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:callmapstatus:interface"]
141
+
142
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:configstatus:interface" type="interface" identity="ConfigStatus" parent="none"]
143
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL configuration graph status."]
144
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the configuration graph item counts for a project."]
145
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
146
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface ConfigStatus" errors="none" side_effects="none"]
147
+ // CIL[DOC-MICRO logic_summary="Fields: config_items, configures_links." notable_decisions="[]"]
148
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
149
+ // CIL[DOC-STABILITY stability="stable"]
156
150
  interface ConfigStatus {
157
151
  config_items: number
158
152
  configures_links: number
159
153
  }
160
-
161
- // CIL[END chunk_id="cildashboardpage_configstatus_1784193942"]
162
- // CIL[BEGIN chunk_id="cildashboardpage_dashboarddata_1784193942" type="interface" identity="DashboardData" parent="none"]
163
- // CIL[DOC-MACRO purpose="Aggregate dashboard data types into a single view model"]
164
- // CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript type contract for the dashboard's combined data state"]
165
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
166
- // CIL[DOC-CONTRACT inputs="none" outputs="DashboardData type definition" errors="none" side_effects="none"]
167
- // CIL[DOC-MICRO logic_summary="Groups project, embed, doc, callmap, and config status objects" notable_decisions="[]"]
168
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
154
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL configuration graph status.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
155
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
156
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
157
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
158
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
159
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
160
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:configstatus:interface"]
161
+
162
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:pipelineprogress:interface" type="interface" identity="PipelineProgress" parent="none"]
163
+ // CIL[DOC-MACRO purpose="Defines the shape of CIL pipeline progress aggregation."]
164
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the pipeline progress counts and per-file status for a project."]
165
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
166
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface PipelineProgress" errors="none" side_effects="none"]
167
+ // CIL[DOC-MICRO logic_summary="Fields: total_selected, total_chunks, by_status, file_statuses." notable_decisions="[]"]
168
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
169
169
  // CIL[DOC-STABILITY stability="stable"]
170
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
171
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
172
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
173
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
170
+ interface PipelineProgress {
171
+ total_selected: number
172
+ total_chunks: number
173
+ by_status: Record<string, number>
174
+ file_statuses: Record<string, string>
175
+ }
176
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the shape of CIL pipeline progress aggregation.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
177
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
178
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
179
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
174
180
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
175
181
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
182
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:pipelineprogress:interface"]
183
+
184
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:dashboarddata:interface" type="interface" identity="DashboardData" parent="none"]
185
+ // CIL[DOC-MACRO purpose="Defines the aggregate dashboard data type used by CILDashboardPage."]
186
+ // CIL[DOC-RESPONSIBILITY responsibility="Types the unified dashboard data object fetched from multiple endpoints."]
187
+ // CIL[DOC-CONTEXT module="admin/cil" layer="type" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
188
+ // CIL[DOC-CONTRACT inputs="none" outputs="interface DashboardData" errors="none" side_effects="none"]
189
+ // CIL[DOC-MICRO logic_summary="Fields: project, embed, doc, callmap, config." notable_decisions="[]"]
190
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
191
+ // CIL[DOC-STABILITY stability="stable"]
176
192
  interface DashboardData {
177
193
  project: { id: string; title: string; data: ProjectStats } | null
178
194
  embed: EmbedStatus | null
@@ -180,24 +196,22 @@ interface DashboardData {
180
196
  callmap: CallmapStatus | null
181
197
  config: ConfigStatus | null
182
198
  }
183
-
184
-
185
-
186
- // CIL[END chunk_id="cildashboardpage_dashboarddata_1784193942"]
187
- // CIL[BEGIN chunk_id="cildashboardpage_passcard_1784193942" type="function" identity="PassCard" parent="none"]
188
- // CIL[DOC-MACRO purpose="Render a pipeline pass card with status, label, description, and metric"]
189
- // CIL[DOC-RESPONSIBILITY responsibility="Display a single pipeline step's completion status and metric as a clickable card"]
190
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
191
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="none" side_effects="none"]
192
- // CIL[DOC-MICRO logic_summary="Selects a status color and icon config and renders a compact status card with an optional link" notable_decisions="[]"]
193
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
194
- // CIL[DOC-STABILITY stability="stable"]
195
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
196
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
197
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
198
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
199
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the aggregate dashboard data type used by CILDashboardPage.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
200
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
201
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
202
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
199
203
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
200
204
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
205
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:dashboarddata:interface"]
206
+
207
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:passcard:function" type="function" identity="PassCard" parent="none"]
208
+ // CIL[DOC-MACRO purpose="Renders a single pipeline pass card with status, icon, metric, and optional link."]
209
+ // CIL[DOC-RESPONSIBILITY responsibility="Visualizes the state of one CIL pipeline stage."]
210
+ // CIL[DOC-CONTEXT module="admin/cil" layer="component" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
211
+ // CIL[DOC-CONTRACT inputs="PassCard props: number, label, icon, description, status, metric, href?, skill?" outputs="JSX card element" errors="none" side_effects="none"]
212
+ // CIL[DOC-MICRO logic_summary="Selects status color, background, and icon from statusConfig and renders a compact linked card." notable_decisions="[]"]
213
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
214
+ // CIL[DOC-STABILITY stability="stable"]
201
215
  function PassCard({
202
216
  number,
203
217
  label,
@@ -206,6 +220,7 @@ function PassCard({
206
220
  status,
207
221
  metric,
208
222
  href,
223
+ skill,
209
224
  }: {
210
225
  number: string
211
226
  label: string
@@ -214,6 +229,7 @@ function PassCard({
214
229
  status: 'complete' | 'partial' | 'empty' | 'unknown'
215
230
  metric: string
216
231
  href?: string
232
+ skill?: string
217
233
  }) {
218
234
  const statusConfig = {
219
235
  complete: { color: 'text-green-600', bg: 'bg-green-50 border-green-200', dot: 'bg-green-500', icon: CheckCircle2 },
@@ -233,6 +249,7 @@ function PassCard({
233
249
  <div className="flex items-center gap-1.5">
234
250
  <span className="text-xs font-bold text-muted-foreground">Pass {number}</span>
235
251
  <StatusIcon className={`h-3 w-3 ${statusConfig.color}`} />
252
+ {skill && <span className="text-[10px] font-mono text-muted-foreground/80 bg-slate-100 dark:bg-slate-800 px-1.5 py-0.5 rounded">{skill}</span>}
236
253
  </div>
237
254
  <div className="text-sm font-medium truncate">{label}</div>
238
255
  <div className="text-xs text-muted-foreground">{description}</div>
@@ -246,24 +263,22 @@ function PassCard({
246
263
  </div>
247
264
  )
248
265
  }
249
-
250
-
251
-
252
- // CIL[END chunk_id="cildashboardpage_passcard_1784193942"]
253
- // CIL[BEGIN chunk_id="cildashboardpage_stattile_1784193942" type="function" identity="StatTile" parent="none"]
254
- // CIL[DOC-MACRO purpose="Render a numeric statistic tile with label and optional subtext"]
255
- // CIL[DOC-RESPONSIBILITY responsibility="Display a single dashboard metric inside a styled Card"]
256
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
257
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="none" side_effects="none"]
258
- // CIL[DOC-MICRO logic_summary="Renders a Card with a large value, label, optional sub, and icon" notable_decisions="[]"]
259
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
260
- // CIL[DOC-STABILITY stability="stable"]
261
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
262
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
263
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
264
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
266
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders a single pipeline pass card with status, icon, metric, and optional link.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
267
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
268
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
269
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
265
270
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
266
271
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
272
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:passcard:function"]
273
+
274
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:stattile:function" type="function" identity="StatTile" parent="none"]
275
+ // CIL[DOC-MACRO purpose="Renders a numeric stat tile with optional sub-label and accent styling."]
276
+ // CIL[DOC-RESPONSIBILITY responsibility="Displays a single dashboard metric."]
277
+ // CIL[DOC-CONTEXT module="admin/cil" layer="component" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
278
+ // CIL[DOC-CONTRACT inputs="StatTile props: label, value, sub?, icon, accent?" outputs="JSX card" errors="none" side_effects="none"]
279
+ // CIL[DOC-MICRO logic_summary="Renders a Card with value, label, optional sub, and an icon." notable_decisions="[]"]
280
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
281
+ // CIL[DOC-STABILITY stability="stable"]
267
282
  function StatTile({
268
283
  label,
269
284
  value,
@@ -292,24 +307,22 @@ function StatTile({
292
307
  </Card>
293
308
  )
294
309
  }
295
-
296
-
297
-
298
- // CIL[END chunk_id="cildashboardpage_stattile_1784193942"]
299
- // CIL[BEGIN chunk_id="cildashboardpage_coveragebar_1784193942" type="function" identity="CoverageBar" parent="none"]
300
- // CIL[DOC-MACRO purpose="Render a labeled progress bar for coverage metrics"]
301
- // CIL[DOC-RESPONSIBILITY responsibility="Display a percentage coverage value with a Progress bar"]
302
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
303
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="none" side_effects="none"]
304
- // CIL[DOC-MICRO logic_summary="Renders a label, percentage, and shadcn Progress component" notable_decisions="[]"]
305
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
306
- // CIL[DOC-STABILITY stability="stable"]
307
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
308
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
309
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
310
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
310
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders a numeric stat tile with optional sub-label and accent styling.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
311
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
312
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
313
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
311
314
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
312
315
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
316
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:stattile:function"]
317
+
318
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:coveragebar:function" type="function" identity="CoverageBar" parent="none"]
319
+ // CIL[DOC-MACRO purpose="Renders a labeled progress bar showing a percentage."]
320
+ // CIL[DOC-RESPONSIBILITY responsibility="Visualizes embedding or documentation coverage as a progress bar."]
321
+ // CIL[DOC-CONTEXT module="admin/cil" layer="component" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
322
+ // CIL[DOC-CONTRACT inputs="label, pct, color?" outputs="JSX progress bar" errors="none" side_effects="none"]
323
+ // CIL[DOC-MICRO logic_summary="Shows a label, percentage, and Progress component." notable_decisions="[]"]
324
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
325
+ // CIL[DOC-STABILITY stability="stable"]
313
326
  function CoverageBar({ label, pct, color = 'bg-indigo-500' }: { label: string; pct: number; color?: string }) {
314
327
  return (
315
328
  <div className="space-y-1">
@@ -321,24 +334,49 @@ function CoverageBar({ label, pct, color = 'bg-indigo-500' }: { label: string; p
321
334
  </div>
322
335
  )
323
336
  }
324
-
325
-
326
-
327
- // CIL[END chunk_id="cildashboardpage_coveragebar_1784193942"]
328
- // CIL[BEGIN chunk_id="cildashboardpage_driftalertcard_1784193942" type="function" identity="DriftAlertCard" parent="none"]
329
- // CIL[DOC-MACRO purpose="Check stored chunk hashes and list drifted chunks for a project"]
330
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch chunk records, validate stored hashes, and render drift alerts with links"]
331
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
332
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="API or validation errors are swallowed" side_effects="Calls /api/admin-data and /api/cil-validate; sets local state"]
333
- // CIL[DOC-MICRO logic_summary="Lists cil_chunk items for the project, calls the validate endpoint, and displays any drifted chunks or an all-current status" notable_decisions="[]"]
334
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
337
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders a labeled progress bar showing a percentage.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
338
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
339
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
340
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
341
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
342
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
343
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:coveragebar:function"]
344
+
345
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:step_details:constant" type="constant" identity="STEP_DETAILS" parent="none"]
346
+ // CIL[DOC-MACRO purpose="Maps CIL pipeline step slugs to labels, icons, descriptions, and skill tags."]
347
+ // CIL[DOC-RESPONSIBILITY responsibility="Provides the metadata that drives the PassCard rendering for each pipeline stage."]
348
+ // CIL[DOC-CONTEXT module="admin/cil" layer="data" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
349
+ // CIL[DOC-CONTRACT inputs="none" outputs="const STEP_DETAILS" errors="none" side_effects="none"]
350
+ // CIL[DOC-MICRO logic_summary="Record of step slugs to display metadata for the nine CIL pipeline stages." notable_decisions="[]"]
351
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
335
352
  // CIL[DOC-STABILITY stability="stable"]
336
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
337
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
338
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
339
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
353
+ const STEP_DETAILS: Record<string, { label: string; icon: React.ElementType; description: string; skill?: string }> = {
354
+ '0-discovered': { label: 'Discover Files', icon: FileCode2, description: 'Walk repo and register source files' },
355
+ '1-selected': { label: 'Select Files', icon: Search, description: 'Files matched by selected paths/globs' },
356
+ '2-chunked': { label: 'Chunk', icon: Layers, description: 'Parse files and write stable-ID markers', skill: 'cil-3' },
357
+ '3-documented': { label: 'Document', icon: Sparkles, description: 'Generate macro / micro / contract fields', skill: 'cil-4' },
358
+ '4-chunk-validated': { label: 'Validate Chunks', icon: CheckCircle2, description: 'Check coverage, overlap, stable IDs, and JSX leakage', skill: 'cil-5' },
359
+ '5-doc-validated': { label: 'Validate Docs', icon: CheckCircle2, description: 'Confirm required CIL[DOC-*] fields are present', skill: 'cil-6' },
360
+ '6-enriched': { label: 'Enrich', icon: Settings2, description: 'Add RAG context, blast radius, and learning notes', skill: 'cil-7' },
361
+ '7-embedded-mapped': { label: 'Embed & Map', icon: Zap, description: 'Generate embeddings and import/call/test edges', skill: 'cil-8' },
362
+ '8-published': { label: 'Publish', icon: CheckCircle2, description: 'Final validation and currentness check' },
363
+ }
364
+ // CIL[DOC-VECTOR type="context" content="purpose='Maps CIL pipeline step slugs to labels, icons, descriptions, and skill tags.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
365
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
366
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
367
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
340
368
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
341
369
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
370
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:step_details:constant"]
371
+
372
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:driftalertcard:function" type="function" identity="DriftAlertCard" parent="none"]
373
+ // CIL[DOC-MACRO purpose="Renders a card that detects and displays CIL chunk hash drift for a project."]
374
+ // CIL[DOC-RESPONSIBILITY responsibility="Fetches stored chunks, validates hashes, and surfaces drifted chunks with navigation links."]
375
+ // CIL[DOC-CONTEXT module="admin/cil" layer="component" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
376
+ // CIL[DOC-CONTRACT inputs="projectId, appPath" outputs="JSX card" errors="API or network errors swallowed" side_effects="none"]
377
+ // CIL[DOC-MICRO logic_summary="Calls admin-data and cil-validate APIs, compares hash status, and lists up to 5 drifted chunks with a count." notable_decisions="[]"]
378
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
379
+ // CIL[DOC-STABILITY stability="stable"]
342
380
  function DriftAlertCard({ projectId, appPath }: { projectId: string; appPath: (p: string) => string }) {
343
381
  const [driftChunks, setDriftChunks] = useState<any[] | null>(null)
344
382
  const [checking, setChecking] = useState(false)
@@ -355,7 +393,6 @@ function DriftAlertCard({ projectId, appPath }: { projectId: string; appPath: (p
355
393
 
356
394
  if (!chunks.length) { setDriftChunks([]); return }
357
395
 
358
-
359
396
  const validateRes = await apiFetch('/api/cil-validate?action=validate', {
360
397
  method: 'POST',
361
398
  headers: { 'Content-Type': 'application/json' },
@@ -422,36 +459,37 @@ function DriftAlertCard({ projectId, appPath }: { projectId: string; appPath: (p
422
459
  </Card>
423
460
  )
424
461
  }
425
-
426
-
427
-
428
- // CIL[END chunk_id="cildashboardpage_driftalertcard_1784193942"]
429
- // CIL[BEGIN chunk_id="cildashboardpage_cildashboardpage_1784193942" type="component" identity="CILDashboardPage" parent="none"]
430
- // CIL[DOC-MACRO purpose="Render the CIL project dashboard page"]
431
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch project status and display pipeline passes, coverage, stats, graph links, drift alerts, and quick actions"]
432
- // CIL[DOC-CONTEXT module="cortex:cil-dashboard" layer="presentation" related_files="[]"]
433
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="Failed requests are ignored; empty states shown" side_effects="Calls /api/cil-project, /api/cil-embeddings, /api/cil-doc, /api/cil-callmap, and /api/cil-config; updates local state"]
434
- // CIL[DOC-MICRO logic_summary="Loads project, embedding, documentation, callmap, and config statuses in parallel, then renders stat tiles, coverage bars, pass cards, graph links, drift alerts, and quick action buttons" notable_decisions="[]"]
435
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
436
- // CIL[DOC-STABILITY stability="stable"]
437
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
438
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
439
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
440
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
462
+ // CIL[DOC-VECTOR type="context" content="purpose='Renders a card that detects and displays CIL chunk hash drift for a project.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
463
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
464
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
465
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
441
466
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
442
467
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
468
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:driftalertcard:function"]
469
+
470
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:cildashboardpage:function" type="function" identity="CILDashboardPage" parent="none"]
471
+ // CIL[DOC-MACRO purpose="Main admin page for reviewing CIL project health, coverage, pipeline status, graph links, and drift."]
472
+ // CIL[DOC-RESPONSIBILITY responsibility="Fetches and aggregates project stats, coverage, pipeline progress, callmap, and config; renders the dashboard layout."]
473
+ // CIL[DOC-CONTEXT module="admin/cil" layer="page" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/progress.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILDashboardPage.tsx"]
474
+ // CIL[DOC-CONTRACT inputs="route param id" outputs="JSX dashboard" errors="API errors fall back to null or empty values" side_effects="loads data on mount and on projectId change"]
475
+ // CIL[DOC-MICRO logic_summary="Fetches six endpoints in parallel, computes stats, renders PassCards for each pipeline step, and embeds DriftAlertCard." notable_decisions="[]"]
476
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
477
+ // CIL[DOC-STABILITY stability="stable"]
443
478
  export default function CILDashboardPage() {
444
479
  const { id: projectId } = useParams<{ id: string }>()
445
480
  const appPath = (path: string) => '/spine-framework/admin' + (path.startsWith('/') ? path : '/' + path)
446
481
  const [data, setData] = useState<DashboardData>({ project: null, embed: null, doc: null, callmap: null, config: null })
482
+ const [pipelineProgress, setPipelineProgress] = useState<PipelineProgress | null>(null)
447
483
  const [loading, setLoading] = useState(true)
484
+ const [discovering, setDiscovering] = useState(false)
448
485
 
449
486
  const load = useCallback(async () => {
450
487
  if (!projectId) return
451
488
  setLoading(true)
452
489
  try {
453
- const [projectRes, embedRes, docRes, callmapRes, configRes] = await Promise.allSettled([
490
+ const [projectRes, progressRes, embedRes, docRes, callmapRes, configRes] = await Promise.allSettled([
454
491
  apiFetch(`/api/cil-project?action=get&id=${projectId}`).then(r => r.json()),
492
+ apiFetch(`/api/cil-project?action=pipeline_progress&id=${projectId}`).then(r => r.json()),
455
493
  apiFetch(`/api/cil-embeddings?action=status&project_id=${projectId}`).then(r => r.json()),
456
494
  apiFetch(`/api/cil-doc?action=gap_report&project_id=${projectId}`).then(r => r.json()),
457
495
  apiFetch(`/api/cil-callmap?action=status&project_id=${projectId}`).then(r => r.json()),
@@ -465,6 +503,8 @@ export default function CILDashboardPage() {
465
503
  callmap: callmapRes.status === 'fulfilled' ? (callmapRes.value?.data || callmapRes.value) : null,
466
504
  config: configRes.status === 'fulfilled' ? (configRes.value?.data || configRes.value) : null,
467
505
  })
506
+ const progressData = progressRes.status === 'fulfilled' ? (progressRes.value?.data || progressRes.value) : null
507
+ setPipelineProgress(progressData?.progress || null)
468
508
  } finally {
469
509
  setLoading(false)
470
510
  }
@@ -472,6 +512,25 @@ export default function CILDashboardPage() {
472
512
 
473
513
  useEffect(() => { load() }, [load])
474
514
 
515
+ const project = data.project
516
+
517
+ const handleDiscover = useCallback(async () => {
518
+ if (!projectId) return
519
+ setDiscovering(true)
520
+ try {
521
+ await apiFetch('/api/cil-ingest?action=discover', {
522
+ method: 'POST',
523
+ headers: { 'Content-Type': 'application/json' },
524
+ body: JSON.stringify({ project_id: projectId }),
525
+ })
526
+ } finally {
527
+ setDiscovering(false)
528
+ load()
529
+ }
530
+ }, [projectId, load])
531
+
532
+
533
+
475
534
  if (loading) {
476
535
  return (
477
536
  <div className="p-6 space-y-4">
@@ -482,25 +541,29 @@ export default function CILDashboardPage() {
482
541
  )
483
542
  }
484
543
 
485
- const project = data.project
486
544
  const stats: ProjectStats = project?.data || { file_count: 0, chunk_count: 0, proposal_count: 0, approved_count: 0, pending_review_count: 0, total_ingestion_cost_usd: 0, last_ingested_at: null }
487
545
  const embed = data.embed || { total_chunks: 0, embedded_chunks: 0, coverage_pct: 0, unembedded_chunks: 0 }
488
546
  const doc = data.doc || { total_chunks: 0, documented_count: 0, undocumented_count: 0, ai_generated_count: 0, human_verified_count: 0, coverage_pct: 0 }
489
547
  const callmap = data.callmap || { import_links: 0, call_links: 0, export_links: 0, total_links: 0, tested_by_links: 0 }
490
548
  const config = data.config || { config_items: 0, configures_links: 0 }
491
549
 
550
+ const pp = pipelineProgress || { total_selected: 0, total_chunks: 0, by_status: {}, file_statuses: {} }
551
+ const selectedFiles = pp.total_selected
552
+ const selectedChunks = pp.total_chunks
553
+ const totalTracked = Object.values(pp.by_status).reduce((a, b) => a + (b || 0), 0)
554
+
555
+ const PIPELINE_ORDER = [
556
+ '0-discovered', '1-selected', '2-chunked', '3-documented', '4-chunk-validated',
557
+ '5-doc-validated', '6-enriched', '7-embedded-mapped', '8-published',
558
+ ]
559
+
560
+ const embedPct = selectedChunks > 0 ? Math.round((embed.embedded_chunks / selectedChunks) * 100) : 0
561
+ const docPct = selectedChunks > 0 ? Math.round((doc.documented_count / selectedChunks) * 100) : 0
562
+
492
563
  const lastIngested = stats.last_ingested_at
493
564
  ? new Date(stats.last_ingested_at).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })
494
565
  : 'Never'
495
566
 
496
-
497
- const pass1Status = stats.file_count > 0 ? 'complete' : 'empty'
498
- const pass2Status = stats.chunk_count > 0 ? 'complete' : (stats.file_count > 0 ? 'partial' : 'empty')
499
- const pass3Status = embed.coverage_pct === 100 ? 'complete' : (embed.embedded_chunks > 0 ? 'partial' : 'empty') as any
500
- const pass4Status = doc.coverage_pct === 100 ? 'complete' : (doc.documented_count > 0 ? 'partial' : 'empty') as any
501
- const pass4bStatus = callmap.total_links > 0 ? 'complete' : 'empty' as any
502
- const pass5Status = config.config_items > 0 ? (config.configures_links > 0 ? 'complete' : 'partial') : 'empty' as any
503
-
504
567
  return (
505
568
  <div className="p-6 space-y-6 max-w-5xl">
506
569
  {}
@@ -522,6 +585,16 @@ export default function CILDashboardPage() {
522
585
  <Button size="sm" variant="outline" onClick={load} className="h-8 text-xs">
523
586
  <RefreshCw className="h-3 w-3 mr-1" /> Refresh
524
587
  </Button>
588
+ <Button size="sm" variant="outline" onClick={handleDiscover} disabled={discovering} className="h-8 text-xs">
589
+ {discovering ? <RefreshCw className="h-3 w-3 mr-1 animate-spin" /> : <FileCode2 className="h-3 w-3 mr-1" />}
590
+ Discover
591
+ </Button>
592
+ <Button size="sm" variant="outline" asChild className="h-8 text-xs">
593
+ <a href={appPath(`/cil/${projectId}/select`)}>
594
+ <Search className="h-3 w-3 mr-1" />
595
+ Select Files
596
+ </a>
597
+ </Button>
525
598
  <Button size="sm" asChild className="h-8 text-xs">
526
599
  <a href={appPath(`/cil/${projectId}/ingest`)}>
527
600
  <Play className="h-3 w-3 mr-1" /> Run Pipeline
@@ -535,15 +608,15 @@ export default function CILDashboardPage() {
535
608
  sections={[
536
609
  { title: 'What this page is for', content: 'This page is the project-level overview for a CIL project. It displays stats, coverage, pipeline status, graph links, and drift alerts.' },
537
610
  { title: 'How to read the cards', content: 'The top tiles show Files, Chunks, Pending Review, and cumulative LLM Cost. The Coverage card shows embedding and documentation coverage plus AI-generated, human-verified, and undocumented counts.' },
538
- { title: 'How to read the pipeline', content: 'Pass cards summarize Discover Files, AST Chunk, Embed Chunks, AI Document, Call Map, and Config Extract. Each card shows status, counts, and a link to the relevant step.' },
611
+ { title: 'How to read the pipeline', content: 'Pass cards summarize Discover Files, Select Files, Chunk, Document, Validate Chunks, Validate Docs, Enrich, Embed & Map, and Publish. Each card shows status, counts, and a link to the relevant step.' },
539
612
  { title: 'Important notes', content: 'Use Refresh to reload the dashboard and Run Pipeline to start or continue ingestion. A drift alert appears when stored hashes differ from current code.' },
540
613
  ]}
541
614
  />
542
615
 
543
616
  {}
544
617
  <div className="grid grid-cols-2 sm:grid-cols-4 gap-4">
545
- <StatTile label="Files" value={stats.file_count.toLocaleString()} icon={FileCode2} />
546
- <StatTile label="Chunks" value={stats.chunk_count.toLocaleString()} icon={Layers} accent />
618
+ <StatTile label="Files" value={selectedFiles.toLocaleString()} sub={`${stats.file_count.toLocaleString()} discovered`} icon={FileCode2} />
619
+ <StatTile label="Chunks" value={selectedChunks.toLocaleString()} sub={`${stats.chunk_count.toLocaleString()} discovered`} icon={Layers} accent />
547
620
  <StatTile
548
621
  label="Pending Review"
549
622
  value={stats.pending_review_count}
@@ -586,48 +659,43 @@ export default function CILDashboardPage() {
586
659
  <div>
587
660
  <h2 className="text-sm font-medium text-muted-foreground uppercase tracking-wide mb-3">Pipeline Status</h2>
588
661
  <div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
589
- <PassCard
590
- number="1" label="Discover Files" icon={FileCode2}
591
- description="Walk repo, register cil_file items, compute hashes"
592
- status={pass1Status}
593
- metric={`${stats.file_count.toLocaleString()} files registered`}
594
- href={appPath(`/cil/${projectId}/ingest`)}
595
- />
596
- <PassCard
597
- number="2" label="AST Chunk" icon={Layers}
598
- description="Parse files, propose chunk boundaries, write markers"
599
- status={pass2Status}
600
- metric={`${stats.chunk_count.toLocaleString()} chunks · ${stats.pending_review_count} pending`}
601
- href={appPath(`/cil/${projectId}/ingest`)}
602
- />
603
- <PassCard
604
- number="3" label="Embed Chunks" icon={Zap}
605
- description="Semantic + structural + contract vector embeddings"
606
- status={pass3Status}
607
- metric={`${embed.coverage_pct}% coverage · ${embed.embedded_chunks} / ${embed.total_chunks}`}
608
- href={appPath(`/cil/${projectId}/ingest`)}
609
- />
610
- <PassCard
611
- number="4" label="AI Document" icon={Sparkles}
612
- description="LLM-generated macro / micro / contract fields"
613
- status={pass4Status}
614
- metric={`${doc.coverage_pct}% coverage · $${(stats.total_ingestion_cost_usd ?? 0).toFixed(4)} spent`}
615
- href={appPath(`/cil/${projectId}/ingest`)}
616
- />
617
- <PassCard
618
- number="4b" label="Call Map" icon={GitGraph}
619
- description="Import + call edges between files and chunks"
620
- status={pass4bStatus}
621
- metric={`${callmap.call_links.toLocaleString()} calls · ${callmap.import_links.toLocaleString()} imports`}
622
- href={appPath(`/cil/${projectId}/graph`)}
623
- />
624
- <PassCard
625
- number="5" label="Config Extract" icon={Settings2}
626
- description="Config field contracts + cil_configures links"
627
- status={pass5Status}
628
- metric={`${config.config_items.toLocaleString()} config items · ${config.configures_links.toLocaleString()} links`}
629
- href={appPath(`/cil/${projectId}/ingest`)}
630
- />
662
+ {(() => {
663
+ const outByIdx = PIPELINE_ORDER.map((_, i) =>
664
+ PIPELINE_ORDER.slice(i === 0 ? 1 : i).reduce((sum, s) => sum + (pp.by_status[s] || 0), 0)
665
+ )
666
+
667
+ return PIPELINE_ORDER.map((status, idx) => {
668
+
669
+ const detail = STEP_DETAILS[status]
670
+
671
+ const inCount = idx === 0 ? totalTracked : outByIdx[idx - 1]
672
+ const outCount = outByIdx[idx]
673
+
674
+ const stageStatus = inCount === 0
675
+ ? 'empty'
676
+ : inCount > 0 && outCount === inCount
677
+ ? 'complete'
678
+ : 'partial'
679
+
680
+ const metric = selectedFiles > 0
681
+ ? `${inCount.toLocaleString()} / ${outCount.toLocaleString()} files`
682
+ : 'No files selected'
683
+
684
+ return (
685
+ <PassCard
686
+ key={status}
687
+ number={`${idx + 1}`}
688
+ label={detail?.label || status}
689
+ icon={detail?.icon || Clock}
690
+ description={detail?.description || ''}
691
+ status={stageStatus as 'complete' | 'partial' | 'empty' | 'unknown'}
692
+ metric={metric}
693
+ href={appPath(`/cil/${projectId}/ingest`)}
694
+ skill={detail?.skill}
695
+ />
696
+ )
697
+ })
698
+ })()}
631
699
  </div>
632
700
  </div>
633
701
 
@@ -695,5 +763,10 @@ export default function CILDashboardPage() {
695
763
  </div>
696
764
  )
697
765
  }
698
-
699
- // CIL[END chunk_id="cildashboardpage_cildashboardpage_1784193942"]
766
+ // CIL[DOC-VECTOR type="context" content="purpose='Main admin page for reviewing CIL project health, coverage, pipeline status, graph links, and drift.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
767
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
768
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
769
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
770
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
771
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
772
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILDashboardPage.tsx:cildashboardpage:function"]