total-recall-brain 3.45.0 → 3.46.1

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 (363) hide show
  1. package/bin/total-recall.mjs +7 -2
  2. package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
  3. package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/dist/sw.js +5 -4
  6. package/frontend/src/App.tsx +183 -236
  7. package/frontend/src/api/auth-inventory.ts +62 -0
  8. package/frontend/src/api/memory.ts +13 -8
  9. package/frontend/src/api/plugin-credentials.ts +23 -0
  10. package/frontend/src/api/plugins.ts +37 -53
  11. package/frontend/src/api/workspace-drawers.ts +97 -0
  12. package/frontend/src/components/BrainSelector.tsx +9 -3
  13. package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
  14. package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
  15. package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
  16. package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
  17. package/frontend/src/components/plugins/plugin-frame.ts +44 -33
  18. package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
  19. package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
  20. package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
  21. package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
  22. package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
  23. package/frontend/src/components/workspace/PluginHome.tsx +76 -0
  24. package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
  25. package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
  26. package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
  27. package/frontend/src/index.css +409 -136
  28. package/frontend/src/pages/HelpPage.tsx +15 -46
  29. package/frontend/src/pages/MemoryPage.tsx +19 -36
  30. package/frontend/src/pages/SettingsPage.tsx +1 -1
  31. package/metadata.plugin.schema.json +53 -227
  32. package/package.json +1 -1
  33. package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
  34. package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
  35. package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
  36. package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
  37. package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
  38. package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
  39. package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
  40. package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
  41. package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
  42. package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
  43. package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
  44. package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
  45. package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
  46. package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
  47. package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
  48. package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
  49. package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
  50. package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
  51. package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +6 -6
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/automations/{ui/DESIGN.md → DESIGN.md} +32 -21
  74. package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +17 -1
  75. package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +10 -1
  76. package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +6 -6
  77. package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +4 -3
  78. package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +11 -27
  79. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -2
  80. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/{card.js → home.js} +32 -27
  87. package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +4 -2
  90. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +4 -2
  91. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -6
  92. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
  93. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
  94. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
  102. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -6
  105. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
  107. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
  108. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -6
  124. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
  125. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
  126. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/git/README.md +25 -1
  134. package/scaffold/.agent/skills/total-recall/plugins/git/cli.mjs +5 -1
  135. package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +6 -6
  136. package/scaffold/.agent/skills/total-recall/plugins/git/package.json +2 -1
  137. package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +17 -27
  138. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +30 -6
  139. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +24 -6
  140. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +33 -7
  141. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +29 -5
  142. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
  143. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
  144. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
  145. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
  146. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
  147. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
  148. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
  149. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
  150. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
  151. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
  152. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
  153. package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
  154. package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
  155. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
  156. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
  157. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +6 -6
  158. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
  159. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
  160. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
  161. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
  162. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
  163. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
  164. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
  165. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
  166. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
  167. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
  168. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
  169. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
  170. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
  171. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
  172. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
  173. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
  174. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
  175. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
  176. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
  177. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
  178. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
  179. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
  180. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
  181. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
  182. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
  183. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
  184. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
  185. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +19 -0
  186. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +5 -1
  187. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
  188. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +2 -1
  189. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +43 -22
  190. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
  191. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
  192. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
  193. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
  194. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
  195. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
  196. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
  197. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
  198. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
  199. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
  200. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
  201. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
  202. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
  203. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
  204. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
  205. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
  206. package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
  207. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
  208. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +17 -14
  209. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
  210. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
  211. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
  212. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
  213. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
  214. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
  215. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
  216. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +6 -3
  217. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
  218. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
  219. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
  220. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
  221. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
  222. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
  223. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
  224. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
  225. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
  226. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
  227. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
  228. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
  229. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
  230. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
  231. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
  232. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
  233. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
  234. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
  235. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
  236. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
  237. package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
  238. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
  239. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
  240. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -6
  241. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
  242. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
  243. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
  244. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
  245. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
  246. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
  247. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
  248. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
  249. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
  250. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
  251. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
  252. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
  253. package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
  254. package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
  255. package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
  256. package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
  257. package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
  258. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
  259. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
  260. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
  261. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
  262. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
  263. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
  264. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
  265. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
  266. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
  267. package/scaffold/.agent/skills/total-recall/references/operations.md +2 -0
  268. package/src/cli/api.mjs +3 -3
  269. package/src/cli/brief.mjs +3 -0
  270. package/src/cli/config.mjs +16 -0
  271. package/src/cli/connect.mjs +2 -7
  272. package/src/cli/plugin/chunks.mjs +145 -0
  273. package/src/cli/plugin/create.mjs +24 -52
  274. package/src/cli/plugin/index.mjs +20 -9
  275. package/src/cli/setup.mjs +2 -9
  276. package/src/cli/start.mjs +1 -0
  277. package/src/cli/startup.mjs +18 -0
  278. package/src/core/app-deploy/design-tokens.mjs +14 -9
  279. package/src/core/app-deploy/ui-elements.mjs +1 -1
  280. package/src/core/brain-registry.mjs +5 -0
  281. package/src/core/brain-updates.mjs +5 -1
  282. package/src/core/daemon-control.mjs +5 -1
  283. package/src/core/dashboard-bundle.mjs +261 -0
  284. package/src/core/default-plugin-refresh.mjs +39 -0
  285. package/src/core/ensure-dependencies.mjs +19 -15
  286. package/src/core/memory-brain.mjs +30 -8
  287. package/src/core/plugin-activation.mjs +63 -20
  288. package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +23 -57
  289. package/src/core/plugin-contracts/startup-check.mjs +49 -0
  290. package/src/core/plugin-contracts/ui.mjs +9 -3
  291. package/src/core/plugin-distribution.mjs +6 -6
  292. package/src/core/plugin-lifecycle.mjs +58 -0
  293. package/src/core/plugin-loader.mjs +9 -5
  294. package/src/core/plugin-runner.mjs +21 -10
  295. package/src/core/plugin-startup-checks.mjs +44 -0
  296. package/src/core/plugin-state.mjs +19 -5
  297. package/src/core/plugin-store.mjs +30 -11
  298. package/src/core/project-id.mjs +15 -5
  299. package/src/core/required-plugins.mjs +31 -6
  300. package/src/core/schema.mjs +2 -0
  301. package/src/core/ssss-operation-service.mjs +1 -0
  302. package/src/core/startup-health.mjs +28 -3
  303. package/src/core/testing/plugin-fixture.mjs +22 -21
  304. package/src/core/throttled-fetch.mjs +25 -18
  305. package/src/core/ui-chunk-choice.mjs +77 -0
  306. package/src/core/ui-chunk.registry.json +23 -0
  307. package/src/core/ui-chunks.mjs +434 -0
  308. package/src/core/vault-cache.mjs +58 -59
  309. package/src/core/workspace-compositions.mjs +151 -0
  310. package/src/core/workspace-drawers.mjs +79 -0
  311. package/src/server/api.mjs +4 -27
  312. package/src/server/index.mjs +28 -21
  313. package/src/server/memory-events.mjs +31 -0
  314. package/src/server/plugin-brain-targets.mjs +89 -0
  315. package/src/server/rest.mjs +2 -0
  316. package/src/server/route-inventory.mjs +3 -2
  317. package/src/server/route-manifest.json +52 -4
  318. package/src/server/routes/_shared.mjs +7 -14
  319. package/src/server/routes/brains.mjs +29 -44
  320. package/src/server/routes/dashboard.mjs +26 -0
  321. package/src/server/routes/plugins.mjs +154 -45
  322. package/src/server/routes/ui-chunks.mjs +192 -0
  323. package/frontend/dist/assets/index-DACh1dhx.js +0 -5613
  324. package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
  325. package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
  326. package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
  327. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
  328. package/frontend/src/components/plugins/card/args.ts +0 -28
  329. package/frontend/src/components/plugins/card/card.css +0 -32
  330. package/frontend/src/components/plugins/card/cli-line.ts +0 -13
  331. package/frontend/src/components/plugins/card/contract.ts +0 -91
  332. package/frontend/src/components/plugins/card/format.ts +0 -49
  333. package/frontend/src/components/plugins/card/runner-context.ts +0 -11
  334. package/frontend/src/components/plugins/card/runner.tsx +0 -43
  335. package/frontend/src/components/plugins/card/theme.ts +0 -35
  336. package/frontend/src/components/plugins/card/use-source.ts +0 -22
  337. package/frontend/src/components/plugins/card/widgets.tsx +0 -94
  338. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
  339. package/frontend/src/pages/PluginsPage.tsx +0 -1719
  340. package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
  341. package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
  342. package/scaffold/.agent/skills/plugin/references/card.md +0 -90
  343. package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
  344. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
  345. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
  346. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
  347. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
  348. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
  349. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
  350. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
  351. package/scaffold/.agent/skills/total-recall/plugins/git/ui/DESIGN.md +0 -100
  352. package/scaffold/.agent/skills/total-recall/plugins/git/ui/card.js +0 -637
  353. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
  354. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
  355. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
  356. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
  357. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
  358. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
  359. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
  360. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
  361. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
  362. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
  363. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
@@ -0,0 +1,283 @@
1
+ const PLATFORM_LABELS = {
2
+ darwin: 'macOS', linux: 'Linux', win32: 'Windows', android: 'Android',
3
+ };
4
+ const STATES = {
5
+ 'at-risk': 'At risk', incomplete: 'Incomplete', 'review-required': 'Review required',
6
+ passed: 'Passed in inspected scope', reviewed: 'Manually reviewed', plan: 'Plan only',
7
+ unavailable: 'Unavailable', 'header-check-passed': 'Header check passed',
8
+ pass: 'Observed', fail: 'Needs attention', review: 'Review', unverified: 'Unverified',
9
+ 'user-confirmed': 'User confirmed', 'not-applicable': 'Not applicable',
10
+ };
11
+ const CHECKS = {
12
+ firewall: 'Firewall', 'disk-encryption': 'Disk encryption', gatekeeper: 'Application assessment',
13
+ 'system-integrity': 'System integrity', 'automatic-updates': 'Automatic updates',
14
+ 'ssh-permitrootlogin': 'SSH root login', 'ssh-passwordauthentication': 'SSH passwords',
15
+ 'ssh-permitemptypasswords': 'SSH empty passwords', 'ssh-pubkeyauthentication': 'SSH public keys',
16
+ 'ssh-file-permissions': 'SSH permissions', 'listening-ports': 'Listening services', 'udp-bindings': 'UDP bindings',
17
+ 'ro.boot.flash.locked': 'Bootloader lock', 'ro.crypto.state': 'Reported disk protection',
18
+ 'ro.build.version.security_patch': 'Reported security patch', 'device-settings-review': 'Device settings review',
19
+ };
20
+ const ASSESSMENTS = new Set(['machine', 'network', 'fleet', 'plugins', 'audit', 'harden', 'probe', 'scan', 'device', 'android']);
21
+
22
+ const MARKUP = [
23
+ '<style>',
24
+ ':host{display:block;color:var(--color-text,#22342d);background:var(--color-background,#f4f0e6);font:var(--typography-body-font-size,15px)/1.55 var(--typography-body-font-family,system-ui,sans-serif)}',
25
+ '*{box-sizing:border-box}main{max-width:68rem;margin:auto;padding:clamp(16px,4vw,42px)}',
26
+ 'header{display:grid;grid-template-columns:1fr auto;align-items:start;gap:var(--spacing-md,16px);border-bottom:2px solid var(--color-primary,#31564b);padding-bottom:var(--spacing-lg,22px)}',
27
+ '.mark{letter-spacing:.14em;font-weight:700;text-transform:uppercase;font-size:.72em;color:var(--color-primary,#31564b)}',
28
+ 'h2{margin:.1em 0;font:600 clamp(2rem,6vw,3.5rem)/1.05 var(--typography-title-font-family,Georgia,serif)}',
29
+ 'h3{font:600 1.4rem var(--typography-title-font-family,Georgia,serif);margin:0 0 .45em}p{margin:.4em 0;color:var(--color-muted,#4d6157)}',
30
+ 'dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,10rem),1fr));gap:var(--spacing-md,16px);margin:1.1em 0;padding:var(--spacing-md,16px) 0;border-block:1px solid var(--color-border,#aab6a8)}',
31
+ 'dt{font-weight:700;font-size:.75em;letter-spacing:.06em;text-transform:uppercase;color:var(--color-muted,#4d6157)}dd{margin:.15em 0 0;overflow-wrap:anywhere}',
32
+ '.workbench{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--spacing-xl,28px);align-items:start;margin-top:var(--spacing-xl,28px)}',
33
+ 'article{min-width:0;padding-left:var(--spacing-md,16px);border-left:3px solid var(--color-primary,#31564b)}',
34
+ '.buttons,form{display:flex;flex-wrap:wrap;align-items:end;gap:var(--spacing-sm,8px);margin:.7em 0}form>label{display:grid;flex:1 1 12rem;gap:.2em}',
35
+ 'button,input,select{min-height:44px;font:inherit;color:inherit;padding:.38em .75em;border:1px solid var(--color-primary,#31564b);border-radius:var(--radius-sm,4px);background:var(--color-surface,#fdfbf5)}',
36
+ 'button{cursor:pointer;font-weight:650}button:disabled{opacity:.6;cursor:default}button:not(:disabled):hover{background:var(--color-primary-soft,#dce9dd)}',
37
+ 'button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--color-primary,#31564b);outline-offset:3px}',
38
+ 'details{padding:.55em 0;border-top:1px solid var(--color-border,#aab6a8)}summary{display:flex;align-items:center;min-height:44px;cursor:pointer;font-weight:700}summary::before{content:"+";margin-right:.6em}details[open]>summary::before{content:"−"}',
39
+ '.confirm{display:flex;align-items:center;min-height:44px}#repair-confirm{min-height:0;margin:.4em .4em .4em 0}#report-state{color:var(--color-primary,#31564b);font-weight:750}#checks{padding-left:1.15em;margin:0}#checks li{margin:.25em 0}#device-checks label{display:grid;gap:.25em;margin:.65em 0}#device-checks select{justify-self:start}',
40
+ '@media(max-width:620px){header,.workbench{grid-template-columns:1fr}header>button{justify-self:start}}',
41
+ '</style>',
42
+ '<main aria-label="Security evidence desk">',
43
+ '<header><div><div class="mark">Total Recall · Security</div><h2>Evidence desk</h2><p>Choose what to inspect, then review the observed scope.</p></div><button type="button" id="refresh-status">Refresh status</button></header>',
44
+ '<dl aria-label="Local capability status"><div><dt>Runtime platform</dt><dd id="platform">Checking…</dd></div><div><dt>Assessment profiles</dt><dd id="profiles">Checking…</dd></div><div><dt>Session owner</dt><dd id="auth">Checking…</dd></div></dl>',
45
+ '<p id="local-state" role="status">Reading local capability metadata…</p>',
46
+ '<div class="workbench"><section aria-label="Start an assessment">',
47
+ '<h3>Assess a target</h3><p>Use the machine, network and mesh controls for targets you administer.</p>',
48
+ '<div class="buttons"><button type="button" data-action="machine">This machine</button><button type="button" data-action="network">Network posture</button><button type="button" data-action="fleet">Mesh fleet</button></div>',
49
+ '<details><summary>Mesh target</summary><form id="mesh-form"><label>Discovered machine<input id="target" maxlength="128" required></label><button type="button">Inspect target</button></form></details>',
50
+ '<details><summary>Source and plugin review</summary><div class="buttons"><button type="button" data-action="plugins">Installed plugins</button><button type="button" data-action="audit">Baseline audit</button></div><form id="scan-form"><label>Source directory<input id="source" maxlength="512" required></label><button type="button">Review source</button></form></details>',
51
+ '<details><summary>Website headers</summary><p>Check a single HTTPS URL you are authorized to test.</p><form id="web-form"><label>HTTPS URL<input id="website" type="url" maxlength="512" required placeholder="https://example.org"></label><button type="button">Check response</button></form></details>',
52
+ '<details><summary>Device evidence</summary><p>Guided answers are your observations. Enter only a label and the outcome of each check.</p>',
53
+ '<form id="device-form"><label>Platform<select id="device-platform"><option value="ios">iPhone</option><option value="ipados">iPad</option><option value="android">Android</option><option value="chromeos">ChromeOS</option><option value="chromeos-flex">ChromeOS Flex</option><option value="windows">Windows</option></select></label><label>Device label<input id="device-label" maxlength="80" required></label><button type="button">Load review</button></form>',
54
+ '<section id="device-review" hidden><div id="device-checks"></div><button type="button" id="evaluate-device">Evaluate review</button></section>',
55
+ '<form id="android-form"><label>Already authorized Android serial<input id="android-serial" maxlength="128" required></label><button type="button">Read Android properties</button></form></details>',
56
+ '<details><summary>SSH permission repair</summary><p>Preview the local plan. Repair changes recognized SSH file modes on this machine and rechecks them.</p><div class="buttons"><button type="button" data-action="harden">Preview plan</button></div>',
57
+ '<label class="confirm"><input type="checkbox" id="repair-confirm"> Apply local SSH permission repair</label><div class="buttons"><button type="button" id="repair" disabled>Repair and verify</button></div></details>',
58
+ '</section><article aria-label="Assessment report"><h3>Observed evidence</h3><p id="report-state" role="status">No assessment requested</p><dl id="facts" hidden></dl><ul id="checks"></ul></article></div>',
59
+ '</main>',
60
+ ].join('\n');
61
+
62
+ function parseReport(value) {
63
+ if (value && typeof value === 'object' && !Array.isArray(value) && !Object.hasOwn(value, 'output')) return value;
64
+ const raw = typeof value === 'string' ? value : value?.output;
65
+ if (typeof raw !== 'string' || raw.length > 1_048_576) return null;
66
+ const text = raw.trim();
67
+ const candidates = [text, text.slice(text.lastIndexOf('\n{\n') + 1), text.slice(text.lastIndexOf('\n') + 1)];
68
+ for (const candidate of candidates) {
69
+ try {
70
+ const report = JSON.parse(candidate);
71
+ if (report && typeof report === 'object' && !Array.isArray(report)) return report;
72
+ } catch { /* A transport error may have no structured report. */ }
73
+ }
74
+ return null;
75
+ }
76
+
77
+ function stateLabel(value) {
78
+ return typeof value === 'string' && Object.hasOwn(STATES, value) ? STATES[value] : null;
79
+ }
80
+
81
+ function number(value) {
82
+ return Number.isSafeInteger(value) && value >= 0 ? String(value) : null;
83
+ }
84
+
85
+ export class SecurityHome extends HTMLElement {
86
+ connectedCallback() {
87
+ if (this.shadowRoot) return;
88
+ const root = this.attachShadow({ mode: 'open' });
89
+ root.innerHTML = MARKUP;
90
+ root.querySelector('#refresh-status').addEventListener('click', () => void this.refresh());
91
+ root.querySelectorAll('[data-action]').forEach(button => {
92
+ button.addEventListener('click', () => void this.assess(button.dataset.action));
93
+ });
94
+ const field = id => root.getElementById(id);
95
+ // Dashboard panels run in a sandbox without form submission.
96
+ const bindAssessment = (id, callback) => {
97
+ const form = field(id);
98
+ const run = () => { if (form.reportValidity()) callback(); };
99
+ form.querySelector('button').addEventListener('click', run);
100
+ form.addEventListener('keydown', event => {
101
+ if (event.key !== 'Enter' || event.isComposing || !event.target.matches('input')) return;
102
+ event.preventDefault();
103
+ run();
104
+ });
105
+ };
106
+ const identity = () => ['--platform', field('device-platform').value, '--device', field('device-label').value.trim()];
107
+ bindAssessment('mesh-form', () => void this.assess('fleet', ['--target', field('target').value.trim()]));
108
+ bindAssessment('scan-form', () => void this.assess('scan', [field('source').value.trim()]));
109
+ bindAssessment('android-form', () => void this.assess('android', ['--serial', field('android-serial').value.trim()]));
110
+ bindAssessment('device-form', () => void this.assess('device', identity()));
111
+ bindAssessment('web-form', () => {
112
+ try {
113
+ const url = new URL(field('website').value);
114
+ if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash) throw new Error();
115
+ void this.assess('probe', ['--url', url.href]);
116
+ } catch {
117
+ this.clearReport('Enter an authorized HTTPS URL without credentials, query or fragment.');
118
+ }
119
+ });
120
+ const clearReview = () => {
121
+ field('device-review').hidden = true;
122
+ field('device-checks').replaceChildren();
123
+ };
124
+ field('device-platform').addEventListener('change', clearReview);
125
+ field('device-label').addEventListener('input', clearReview);
126
+ field('evaluate-device').addEventListener('click', () => {
127
+ const observations = {};
128
+ for (const select of field('device-checks').querySelectorAll('select[data-observed-at]')) {
129
+ observations[select.dataset.check] = { status: select.value, observedAt: select.dataset.observedAt };
130
+ }
131
+ void this.assess('device', [...identity(), '--answers-json', JSON.stringify(observations)]);
132
+ });
133
+ field('repair-confirm').addEventListener('change', () => {
134
+ field('repair').disabled = this.busy || !field('repair-confirm').checked;
135
+ });
136
+ field('repair').addEventListener('click', () => {
137
+ if (field('repair-confirm').checked) void this.assess('machine', ['--apply-permissions']);
138
+ });
139
+ void this.refresh();
140
+ }
141
+
142
+ async request(action, args = []) {
143
+ let report;
144
+ try { report = parseReport(await this.host?.run(action, [...args, '--json'])); }
145
+ catch (error) { report = parseReport(error?.message); }
146
+ if (!report || report.status === 'failed') throw new Error('No usable assessment result');
147
+ return report;
148
+ }
149
+
150
+ async refresh() {
151
+ const root = this.shadowRoot;
152
+ const button = root.querySelector('#refresh-status');
153
+ button.disabled = true;
154
+ const state = root.querySelector('#local-state');
155
+ state.textContent = 'Reading local capability metadata…';
156
+ try {
157
+ const report = await this.request('status');
158
+ if (report.plugin !== 'security' || !Array.isArray(report.device_coverage?.platforms)) throw new Error();
159
+ const platform = report.host_platform;
160
+ root.querySelector('#platform').textContent = Object.hasOwn(PLATFORM_LABELS, platform) ? PLATFORM_LABELS[platform] : 'Other runtime';
161
+ root.querySelector('#profiles').textContent = String(report.device_coverage.platforms.length);
162
+ root.querySelector('#auth').textContent = report.auth_integration === 'auth' ? 'Bundled Auth' : 'Unavailable';
163
+ state.textContent = 'Capability metadata available. Assessments run on demand.';
164
+ } catch {
165
+ for (const id of ['platform', 'profiles', 'auth']) root.getElementById(id).textContent = 'Unavailable';
166
+ state.textContent = 'Local capability metadata is unavailable.';
167
+ } finally {
168
+ button.disabled = false;
169
+ }
170
+ }
171
+
172
+ clearReport(message) {
173
+ const root = this.shadowRoot;
174
+ root.querySelector('#report-state').textContent = message;
175
+ const facts = root.querySelector('#facts');
176
+ facts.replaceChildren();
177
+ facts.hidden = true;
178
+ root.querySelector('#checks').replaceChildren();
179
+ }
180
+
181
+ async assess(action, args = []) {
182
+ if (this.busy || !ASSESSMENTS.has(action)) return;
183
+ const root = this.shadowRoot;
184
+ const confirm = root.querySelector('#repair-confirm');
185
+ if (args.includes('--apply-permissions') && (action !== 'machine' || !confirm.checked)) return;
186
+ if (args.some(arg => arg === '')) {
187
+ this.clearReport('Enter a target before requesting an assessment.');
188
+ return;
189
+ }
190
+ this.busy = true;
191
+ const controls = Array.from(root.querySelectorAll('button:not(#refresh-status), input, select'));
192
+ for (const control of controls) control.disabled = true;
193
+ this.clearReport('Waiting for assessment…');
194
+ try {
195
+ const report = await this.request(action, args);
196
+ this.renderEvidence(report);
197
+ if (action === 'device' && report.schema === 'security-device/v1' && !args.includes('--answers-json')) {
198
+ this.renderDeviceReview(report.checks);
199
+ }
200
+ } catch {
201
+ this.clearReport('Assessment unavailable. No result was established.');
202
+ } finally {
203
+ this.busy = false;
204
+ for (const control of controls) control.disabled = false;
205
+ confirm.checked = false;
206
+ root.querySelector('#repair').disabled = true;
207
+ }
208
+ }
209
+
210
+ renderEvidence(report) {
211
+ const root = this.shadowRoot;
212
+ const headerStates = report.security_headers && typeof report.security_headers === 'object'
213
+ ? Object.values(report.security_headers).filter(value => typeof value === 'boolean') : [];
214
+ const needsReview = report.ok === false || report.passed === false || headerStates.includes(false);
215
+ const state = report.remediation?.status === 'failed' ? 'Permission repair incomplete'
216
+ : stateLabel(report.status) || (needsReview ? 'Review required' : 'Assessment returned');
217
+ root.querySelector('#report-state').textContent = state;
218
+ const facts = root.querySelector('#facts');
219
+ const coverage = report.coverage || report.machine?.coverage || {};
220
+ const pairs = [
221
+ ['Observed checks or machines', number(coverage.observed)],
222
+ ['Total checks', number(coverage.total)],
223
+ ['Selected machines', number(coverage.selected)],
224
+ ['Manually reviewed', number(coverage.reviewed)],
225
+ ['Source findings', number(report.total_findings ?? report.findings_count)],
226
+ ['Plugins assessed', number(report.total_plugins ?? report.plugins_audited)],
227
+ ['SSH permissions changed', number(report.remediation?.changed ?? report.applied_count)],
228
+ ['HTTPS response status', number(report.status)],
229
+ ['Response latency (ms)', number(report.latency_ms)],
230
+ ];
231
+ if (headerStates.length) pairs.push(['Expected headers present', headerStates.filter(Boolean).length + ' of ' + headerStates.length]);
232
+ for (const [label, value] of pairs) {
233
+ if (value === null) continue;
234
+ const entry = document.createElement('div');
235
+ const term = document.createElement('dt');
236
+ const detail = document.createElement('dd');
237
+ term.textContent = label;
238
+ detail.textContent = value;
239
+ entry.append(term, detail);
240
+ facts.append(entry);
241
+ }
242
+ facts.hidden = facts.childElementCount === 0;
243
+ const checks = report.checks || report.machine?.checks;
244
+ if (!Array.isArray(checks)) return;
245
+ for (const check of checks) {
246
+ const label = check && Object.hasOwn(CHECKS, check.id) ? CHECKS[check.id] : null;
247
+ const result = stateLabel(check?.state);
248
+ if (!label || !result) continue;
249
+ const item = document.createElement('li');
250
+ item.textContent = label + ' · ' + result;
251
+ root.querySelector('#checks').append(item);
252
+ }
253
+ }
254
+
255
+ renderDeviceReview(checks) {
256
+ if (!Array.isArray(checks)) return;
257
+ const root = this.shadowRoot;
258
+ const form = root.querySelector('#device-checks');
259
+ form.replaceChildren();
260
+ for (const check of checks.slice(0, 24)) {
261
+ if (!check || typeof check.id !== 'string' || !/^[a-z][a-z0-9-]{0,60}$/.test(check.id) || typeof check.title !== 'string') continue;
262
+ const label = document.createElement('label');
263
+ const title = document.createElement('span');
264
+ title.textContent = check.title.slice(0, 120);
265
+ const guidance = document.createElement('small');
266
+ guidance.textContent = typeof check.remediation === 'string' ? check.remediation.slice(0, 500) : '';
267
+ const select = document.createElement('select');
268
+ select.dataset.check = check.id;
269
+ select.setAttribute('aria-label', title.textContent);
270
+ for (const [value, text] of [['unknown', 'Not checked'], ['secure', 'Protection confirmed'], ['needs-attention', 'Needs attention']]) {
271
+ const option = document.createElement('option');
272
+ option.value = value;
273
+ option.textContent = text;
274
+ select.append(option);
275
+ }
276
+ select.addEventListener('change', () => { select.dataset.observedAt = new Date().toISOString(); });
277
+ label.append(title, guidance, select);
278
+ form.append(label);
279
+ }
280
+ root.querySelector('#device-review').hidden = form.childElementCount === 0;
281
+ }
282
+ }
283
+ if (!customElements.get('tr-security-home')) customElements.define('tr-security-home', SecurityHome);
@@ -0,0 +1,93 @@
1
+ ---
2
+ version: alpha
3
+ name: SSSS ledger
4
+ description: Inspection and contract workbench for the canonical SSSS engine, skill and scaffold.
5
+ colors:
6
+ ink: "#1b1814"
7
+ panel: "#27211a"
8
+ line: "#564636"
9
+ paper: "#f7ebd6"
10
+ quiet: "#c2b59f"
11
+ amber: "#b98439"
12
+ gold: "#f4c97a"
13
+ pass: "#c2e4ad"
14
+ fail: "#ffaaa1"
15
+ typography:
16
+ heading:
17
+ fontFamily: IBM Plex Sans, system-ui, sans-serif
18
+ fontSize: 18px
19
+ fontWeight: 650
20
+ lineHeight: 1.3
21
+ body:
22
+ fontFamily: IBM Plex Sans, system-ui, sans-serif
23
+ fontSize: 14px
24
+ fontWeight: 400
25
+ lineHeight: 1.45
26
+ evidence:
27
+ fontFamily: IBM Plex Mono, ui-monospace, monospace
28
+ fontSize: 13px
29
+ fontWeight: 400
30
+ lineHeight: 1.5
31
+ spacing:
32
+ xs: 4px
33
+ sm: 8px
34
+ md: 12px
35
+ lg: 16px
36
+ rounded:
37
+ sm: 5px
38
+ md: 10px
39
+ components:
40
+ ledger-sheet:
41
+ backgroundColor: "{colors.ink}"
42
+ textColor: "{colors.paper}"
43
+ borderColor: "{colors.line}"
44
+ borderWidth: 1px
45
+ borderStyle: solid
46
+ rounded: "{rounded.md}"
47
+ padding: "{spacing.lg}"
48
+ typography: "{typography.body}"
49
+ ledger-slot:
50
+ backgroundColor: "{colors.panel}"
51
+ textColor: "{colors.paper}"
52
+ borderColor: "{colors.amber}"
53
+ borderStyle: solid
54
+ borderWidth: 0 0 0 3px
55
+ padding: 12px 16px
56
+ evidence-readout:
57
+ backgroundColor: "{colors.panel}"
58
+ textColor: "{colors.paper}"
59
+ rounded: "{rounded.sm}"
60
+ padding: "{spacing.md}"
61
+ typography: "{typography.evidence}"
62
+ field-pointer:
63
+ textColor: "{colors.gold}"
64
+ typography: "{typography.evidence}"
65
+ verdict-pass:
66
+ textColor: "{colors.pass}"
67
+ verdict-fail:
68
+ textColor: "{colors.fail}"
69
+ ---
70
+
71
+ # SSSS ledger
72
+
73
+ Operators open this Home to check whether the engine, the portable skill and the managed project scaffold all match the canonical release. From there they can repair managed files, validate a document, verify a registry lock, run engine conformance or create a new project. The page answers one question first: is this installation complete and current? Every other check is an action the operator chooses.
74
+
75
+ ## Identity
76
+
77
+ The mark is four offset strokes on one spine, like the ruled entries of a ledger. Ink, parchment and amber carry the palette. Amber is the spine: each reading slot has an amber rule on its leading edge, joining the skill and scaffold to the engine identity above them. Gold marks the primary action and the field names that carry a verdict. Pass and fail tones are reserved for verdicts.
78
+
79
+ ## Typography
80
+
81
+ Headings and body text use IBM Plex Sans. File paths, integrity hashes, JSON pointers and conformance output use IBM Plex Mono, so an operator can compare them character by character.
82
+
83
+ ## Layout
84
+
85
+ The installation ledger comes first: engine and spec version, skill, then scaffold, each as a slot with its value and the path or failure beneath. Below it, the controls are grouped by the artifact they check: one document, one registry lock, one new project. Each group shows its own verdict. Long evidence such as conformance output scrolls inside its readout instead of stretching the page.
86
+
87
+ ## States
88
+
89
+ Nothing is seeded. Before the first reading the ledger shows dashes. If the command bridge is missing, or a reply cannot be parsed, the Home says the reading is unavailable and why, and clears earlier readings. A failure names the part that failed and the time of the attempt. Controls are disabled while an operation is running.
90
+
91
+ ## Motion and accessibility
92
+
93
+ A new verdict slides 3px into place. Reduced motion turns this off. Every control has a visible gold focus ring and a 44px minimum target. Verdicts are announced through a polite live region. Pass and fail are shown in words as well as color.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "tr-plugin-ssss",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "tr-plugin-ssss",
9
- "version": "0.1.3",
9
+ "version": "0.2.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@gregiteen/ssss-cli": "0.14.5"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tr-plugin-ssss",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Canonical SSSS distribution, scaffolding and validation for Total Recall installations.",
@@ -11,6 +11,7 @@
11
11
  "ui/",
12
12
  "scripts/",
13
13
  "cli.mjs",
14
+ "DESIGN.md",
14
15
  "plugin.json"
15
16
  ],
16
17
  "scripts": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
3
3
  "id": "ssss",
4
4
  "name": "SSSS",
5
- "version": "0.1.3",
5
+ "version": "0.2.0",
6
6
  "description": "Canonical SSSS distribution, scaffolding and validation for Total Recall installations.",
7
7
  "license": "MIT",
8
8
  "use_cases": ["software-development", "state-conformance"],
@@ -72,10 +72,12 @@
72
72
  "name": "SSSS", "color": "#b98439", "accent": "#f4c97a", "font": "ibm-plex",
73
73
  "density": "compact", "radius": "sm", "header": "ledger-rule", "logo": "ui/logo.svg"
74
74
  },
75
+ "auth": { "plugin": "auth", "methods": ["passkey", "google-oauth2"], "session_verification": true },
75
76
  "ui": {
76
- "design_tokens": "ui/DESIGN.md",
77
+ "design_tokens": "DESIGN.md",
78
+ "home": "home",
77
79
  "elements": [
78
- {"id":"card","kind":"card","tag":"tr-ssss-card","module":"ui/card.js","description":"SSSS installation and contract workbench"}
80
+ {"id":"home","kind":"panel","tag":"tr-ssss-home","module":"ui/home.js","description":"SSSS installation ledger with document, registry, scaffold and conformance checks"}
79
81
  ]
80
82
  }
81
83
  }
@@ -0,0 +1,26 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: conformance
5
+ title: Engine conformance
6
+ description: Runs the canonical SSSS reference engine conformance suite and reports its exit code and full output as evidence.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["run ssss conformance", "does the ssss engine pass its suite", "engine conformance evidence"]
9
+ surfaces: [page]
10
+ operations: [conformance]
11
+ data: ["conformance:/ok", "conformance:/exitCode", "conformance:/signal", "conformance:/output", "conformance:/error", "conformance:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-suite" data-design-component="ledger-sheet" aria-labelledby="ssss-conformance-title">
15
+ <style>
16
+ .ssss-suite { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-suite h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-suite p { margin:0; color:var(--color-quiet, #c2b59f); }
19
+ </style>
20
+ <h2 id="ssss-conformance-title">Engine conformance</h2>
21
+ <p>Runs the reference engine suite that ships with the canonical package, with a two-minute limit. This checks the engine, not your installation or your documents.</p>
22
+ <div data-design-component="evidence-readout">
23
+ <p>Passes only on exit code 0. The suite's own output is kept whole as evidence. A timeout or signal is reported as a failure with its cause.</p>
24
+ <code data-design-component="field-pointer">exitCode · signal · output · error</code>
25
+ </div>
26
+ </section>
@@ -0,0 +1,37 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: registry
5
+ title: Registry lock
6
+ description: Compares a registry lock file's integrity with the effective SSSS registry composed from the canonical core and any extension registries.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["verify ssss registry lock", "has the registry drifted", "compare registry integrity", "check extension registry lock"]
9
+ surfaces: [page]
10
+ operations: [registry]
11
+ data: ["registry:/ok", "registry:/valid", "registry:/expected_integrity", "registry:/actual_integrity", "registry:/specVersion", "registry:/error", "registry:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-lock" data-design-component="ledger-sheet" aria-labelledby="ssss-registry-title">
15
+ <style>
16
+ .ssss-lock { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-lock h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-lock p { margin:0; color:var(--color-quiet, #c2b59f); }
19
+ .ssss-lock .pair { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap:var(--spacing-sm, 8px); }
20
+ .ssss-lock .pair > div { display:grid; gap:var(--spacing-xs, 4px); }
21
+ </style>
22
+ <h2 id="ssss-registry-title">Registry lock</h2>
23
+ <p>A lock matches only when its integrity equals the integrity of the registry this engine composes now.</p>
24
+ <div class="pair">
25
+ <div data-design-component="ledger-slot">
26
+ <strong>Expected</strong>
27
+ <span>Computed from the canonical core and the extensions you name.</span>
28
+ <code data-design-component="field-pointer">expected_integrity</code>
29
+ </div>
30
+ <div data-design-component="ledger-slot">
31
+ <strong>In the lock</strong>
32
+ <span>Read from the lock file. Empty when the lock has none.</span>
33
+ <code data-design-component="field-pointer">actual_integrity</code>
34
+ </div>
35
+ </div>
36
+ <p>The verdict is <code data-design-component="field-pointer">valid</code>. It is checked against spec <code data-design-component="field-pointer">specVersion</code>.</p>
37
+ </section>
@@ -0,0 +1,42 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: repair
5
+ title: Repair managed files
6
+ description: Restores missing, stale or previously repinned managed SSSS skill and scaffold files in the selected brain, then verifies them again.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["repair ssss installation", "restore missing ssss skill", "fix stale ssss scaffold", "replace dangling ssss skill link"]
9
+ surfaces: [page]
10
+ operations: [repair]
11
+ data: ["repair:/ok", "repair:/version", "repair:/specVersion", "repair:/skill/ok", "repair:/skill/files", "repair:/scaffold/ok", "repair:/scaffold/files", "repair:/recoveredFrom", "repair:/replacedLink/path", "repair:/replacedLink/target", "repair:/error", "repair:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-repair" data-design-component="ledger-sheet" aria-labelledby="ssss-repair-title">
15
+ <style>
16
+ .ssss-repair { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-repair h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-repair p, .ssss-repair dd { margin:0; }
19
+ .ssss-repair dl { display:grid; gap:var(--spacing-sm, 8px); margin:0; }
20
+ .ssss-repair dt { color:var(--color-paper, #f7ebd6); font-weight:650; }
21
+ .ssss-repair dd { color:var(--color-quiet, #c2b59f); }
22
+ .ssss-repair .warn { color:var(--color-gold, #f4c97a); }
23
+ </style>
24
+ <h2 id="ssss-repair-title">Repair managed files</h2>
25
+ <p class="warn">Writes to the selected brain. It runs only when you choose Repair in the SSSS Home panel.</p>
26
+ <dl>
27
+ <div data-design-component="ledger-slot">
28
+ <dt>What it replaces</dt>
29
+ <dd>Managed skill and scaffold files that are missing or differ from the canonical release. A dangling or stale skill link becomes a managed folder. The link's target is left untouched.</dd>
30
+ </div>
31
+ <div data-design-component="ledger-slot">
32
+ <dt>What it keeps</dt>
33
+ <dd>Your skill wrapper and any unrelated files. A previously repinned scaffold is set aside, not deleted.</dd>
34
+ <dd><code data-design-component="field-pointer">recoveredFrom · replacedLink.path · replacedLink.target</code></dd>
35
+ </div>
36
+ <div data-design-component="ledger-slot">
37
+ <dt>How it reports</dt>
38
+ <dd>The same ledger as the installation check, read again after the repair. If verification still fails, the error names the part.</dd>
39
+ <dd><code data-design-component="field-pointer">ok · skill.files · scaffold.files · error</code></dd>
40
+ </div>
41
+ </dl>
42
+ </section>
@@ -0,0 +1,33 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: scaffold
5
+ title: New SSSS project
6
+ description: Creates a complete canonical SSSS project in a new or empty directory inside the workspace, optionally with an extension and Total Recall wiring.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["scaffold an ssss project", "create a new ssss app", "start a project with total recall wiring", "new project with extension registry"]
9
+ surfaces: [page]
10
+ operations: [scaffold]
11
+ data: ["scaffold:/ok", "scaffold:/directory", "scaffold:/files", "scaffold:/version", "scaffold:/error", "scaffold:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-new" data-design-component="ledger-sheet" aria-labelledby="ssss-scaffold-title">
15
+ <style>
16
+ .ssss-new { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-new h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-new p { margin:0; color:var(--color-quiet, #c2b59f); }
19
+ .ssss-new ol { margin:0; padding-left:1.4em; display:grid; gap:var(--spacing-xs, 4px); }
20
+ .ssss-new .warn { color:var(--color-gold, #f4c97a); }
21
+ </style>
22
+ <h2 id="ssss-scaffold-title">New SSSS project</h2>
23
+ <p class="warn">Creates files. It runs only when you choose Create project in the SSSS Home panel.</p>
24
+ <ol>
25
+ <li>The canonical generator builds the whole project in a private staging folder.</li>
26
+ <li>The result must include its conformance test, or nothing is published.</li>
27
+ <li>The project moves into your directory only if that directory is new or empty.</li>
28
+ </ol>
29
+ <div data-design-component="ledger-slot">
30
+ <p>The result reports where the project went, every file created and the engine release that generated it.</p>
31
+ <code data-design-component="field-pointer">directory · files · version · error</code>
32
+ </div>
33
+ </section>
@@ -0,0 +1,43 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: ssss
4
+ id: status
5
+ title: Installation ledger
6
+ description: Shows whether the engine, the portable SSSS skill and the managed project scaffold in the selected brain match the canonical release.
7
+ timestamp: '2026-11-08T08:12:00Z'
8
+ intents: ["check ssss installation", "is the ssss skill current", "inspect ssss scaffold", "ssss engine version"]
9
+ surfaces: [page]
10
+ operations: [status]
11
+ data: ["status:/ok", "status:/version", "status:/specVersion", "status:/skill/ok", "status:/skill/files", "status:/skill/path", "status:/skill/error", "status:/scaffold/ok", "status:/scaffold/files", "status:/scaffold/path", "status:/scaffold/error", "status:/checkedAt"]
12
+ panel: home
13
+ ---
14
+ <section class="ssss-ledger" data-design-component="ledger-sheet" aria-labelledby="ssss-status-title">
15
+ <style>
16
+ .ssss-ledger { display:grid; gap:var(--spacing-md, 12px); }
17
+ .ssss-ledger h2 { margin:0; font:var(--typography-heading-font-weight, 650) var(--typography-heading-font-size, 18px)/var(--typography-heading-line-height, 1.3) var(--typography-heading-font-family, sans-serif); }
18
+ .ssss-ledger p { margin:0; color:var(--color-quiet, #c2b59f); }
19
+ .ssss-ledger ol { display:grid; grid-template-columns:repeat(auto-fit, minmax(min(100%, 190px), 1fr)); gap:1px; margin:0; padding:0; list-style:none; background:var(--color-line, #564636); }
20
+ .ssss-ledger li { display:grid; gap:var(--spacing-xs, 4px); }
21
+ .ssss-ledger strong { color:var(--color-paper, #f7ebd6); }
22
+ </style>
23
+ <h2 id="ssss-status-title">Installation ledger</h2>
24
+ <p>Three entries on one spine. The release is complete only when all three agree.</p>
25
+ <ol>
26
+ <li data-design-component="ledger-slot">
27
+ <strong>Engine and spec</strong>
28
+ <span>The canonical engine release and the specification version it implements.</span>
29
+ <code data-design-component="field-pointer">version · specVersion</code>
30
+ </li>
31
+ <li data-design-component="ledger-slot">
32
+ <strong>Portable skill</strong>
33
+ <span>Every managed skill file matches its pinned hash. A local wrapper is preserved.</span>
34
+ <code data-design-component="field-pointer">skill.ok · skill.files · skill.path · skill.error</code>
35
+ </li>
36
+ <li data-design-component="ledger-slot">
37
+ <strong>Project scaffold</strong>
38
+ <span>The complete starter project, held under the brain with its integrity receipt.</span>
39
+ <code data-design-component="field-pointer">scaffold.ok · scaffold.files · scaffold.path · scaffold.error</code>
40
+ </li>
41
+ </ol>
42
+ <p>Read-only. Choose the brain and run the check from the SSSS Home panel.</p>
43
+ </section>