opencastle 0.1.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/bin/cli.mjs +69 -0
  4. package/dist/cli/adapters/claude-code.d.ts +22 -0
  5. package/dist/cli/adapters/claude-code.d.ts.map +1 -0
  6. package/dist/cli/adapters/claude-code.js +237 -0
  7. package/dist/cli/adapters/claude-code.js.map +1 -0
  8. package/dist/cli/adapters/cursor.d.ts +20 -0
  9. package/dist/cli/adapters/cursor.d.ts.map +1 -0
  10. package/dist/cli/adapters/cursor.js +231 -0
  11. package/dist/cli/adapters/cursor.js.map +1 -0
  12. package/dist/cli/adapters/vscode.d.ts +20 -0
  13. package/dist/cli/adapters/vscode.d.ts.map +1 -0
  14. package/dist/cli/adapters/vscode.js +132 -0
  15. package/dist/cli/adapters/vscode.js.map +1 -0
  16. package/dist/cli/copy.d.ts +14 -0
  17. package/dist/cli/copy.d.ts.map +1 -0
  18. package/dist/cli/copy.js +62 -0
  19. package/dist/cli/copy.js.map +1 -0
  20. package/dist/cli/dashboard.d.ts +3 -0
  21. package/dist/cli/dashboard.d.ts.map +1 -0
  22. package/dist/cli/dashboard.js +183 -0
  23. package/dist/cli/dashboard.js.map +1 -0
  24. package/dist/cli/diff.d.ts +3 -0
  25. package/dist/cli/diff.d.ts.map +1 -0
  26. package/dist/cli/diff.js +27 -0
  27. package/dist/cli/diff.js.map +1 -0
  28. package/dist/cli/eject.d.ts +3 -0
  29. package/dist/cli/eject.d.ts.map +1 -0
  30. package/dist/cli/eject.js +27 -0
  31. package/dist/cli/eject.js.map +1 -0
  32. package/dist/cli/init.d.ts +3 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +92 -0
  35. package/dist/cli/init.js.map +1 -0
  36. package/dist/cli/manifest.d.ts +14 -0
  37. package/dist/cli/manifest.d.ts.map +1 -0
  38. package/dist/cli/manifest.js +34 -0
  39. package/dist/cli/manifest.js.map +1 -0
  40. package/dist/cli/mcp.d.ts +14 -0
  41. package/dist/cli/mcp.d.ts.map +1 -0
  42. package/dist/cli/mcp.js +35 -0
  43. package/dist/cli/mcp.js.map +1 -0
  44. package/dist/cli/prompt.d.ts +12 -0
  45. package/dist/cli/prompt.d.ts.map +1 -0
  46. package/dist/cli/prompt.js +104 -0
  47. package/dist/cli/prompt.js.map +1 -0
  48. package/dist/cli/run/adapters/claude-code.d.ts +16 -0
  49. package/dist/cli/run/adapters/claude-code.d.ts.map +1 -0
  50. package/dist/cli/run/adapters/claude-code.js +82 -0
  51. package/dist/cli/run/adapters/claude-code.js.map +1 -0
  52. package/dist/cli/run/adapters/copilot.d.ts +16 -0
  53. package/dist/cli/run/adapters/copilot.d.ts.map +1 -0
  54. package/dist/cli/run/adapters/copilot.js +84 -0
  55. package/dist/cli/run/adapters/copilot.js.map +1 -0
  56. package/dist/cli/run/adapters/cursor.d.ts +16 -0
  57. package/dist/cli/run/adapters/cursor.d.ts.map +1 -0
  58. package/dist/cli/run/adapters/cursor.js +81 -0
  59. package/dist/cli/run/adapters/cursor.js.map +1 -0
  60. package/dist/cli/run/adapters/index.d.ts +14 -0
  61. package/dist/cli/run/adapters/index.d.ts.map +1 -0
  62. package/dist/cli/run/adapters/index.js +35 -0
  63. package/dist/cli/run/adapters/index.js.map +1 -0
  64. package/dist/cli/run/executor.d.ts +15 -0
  65. package/dist/cli/run/executor.d.ts.map +1 -0
  66. package/dist/cli/run/executor.js +249 -0
  67. package/dist/cli/run/executor.js.map +1 -0
  68. package/dist/cli/run/reporter.d.ts +10 -0
  69. package/dist/cli/run/reporter.d.ts.map +1 -0
  70. package/dist/cli/run/reporter.js +112 -0
  71. package/dist/cli/run/reporter.js.map +1 -0
  72. package/dist/cli/run/schema.d.ts +28 -0
  73. package/dist/cli/run/schema.d.ts.map +1 -0
  74. package/dist/cli/run/schema.js +511 -0
  75. package/dist/cli/run/schema.js.map +1 -0
  76. package/dist/cli/run.d.ts +6 -0
  77. package/dist/cli/run.d.ts.map +1 -0
  78. package/dist/cli/run.js +123 -0
  79. package/dist/cli/run.js.map +1 -0
  80. package/dist/cli/stack-config.d.ts +12 -0
  81. package/dist/cli/stack-config.d.ts.map +1 -0
  82. package/dist/cli/stack-config.js +146 -0
  83. package/dist/cli/stack-config.js.map +1 -0
  84. package/dist/cli/types.d.ts +169 -0
  85. package/dist/cli/types.d.ts.map +1 -0
  86. package/dist/cli/types.js +2 -0
  87. package/dist/cli/types.js.map +1 -0
  88. package/dist/cli/update.d.ts +3 -0
  89. package/dist/cli/update.d.ts.map +1 -0
  90. package/dist/cli/update.js +50 -0
  91. package/dist/cli/update.js.map +1 -0
  92. package/package.json +48 -0
  93. package/src/cli/adapters/claude-code.ts +287 -0
  94. package/src/cli/adapters/cursor.ts +377 -0
  95. package/src/cli/adapters/vscode.ts +168 -0
  96. package/src/cli/copy.ts +79 -0
  97. package/src/cli/dashboard.ts +225 -0
  98. package/src/cli/diff.ts +44 -0
  99. package/src/cli/eject.ts +39 -0
  100. package/src/cli/init.ts +120 -0
  101. package/src/cli/manifest.ts +45 -0
  102. package/src/cli/mcp.ts +49 -0
  103. package/src/cli/prompt.ts +115 -0
  104. package/src/cli/run/adapters/claude-code.ts +95 -0
  105. package/src/cli/run/adapters/copilot.ts +97 -0
  106. package/src/cli/run/adapters/cursor.ts +94 -0
  107. package/src/cli/run/adapters/index.ts +40 -0
  108. package/src/cli/run/executor.ts +292 -0
  109. package/src/cli/run/reporter.ts +129 -0
  110. package/src/cli/run/schema.ts +595 -0
  111. package/src/cli/run.ts +137 -0
  112. package/src/cli/stack-config.ts +180 -0
  113. package/src/cli/types.ts +207 -0
  114. package/src/cli/update.ts +75 -0
  115. package/src/dashboard/astro.config.mjs +6 -0
  116. package/src/dashboard/package-lock.json +5455 -0
  117. package/src/dashboard/package.json +14 -0
  118. package/src/dashboard/public/data/delegations.ndjson +35 -0
  119. package/src/dashboard/public/data/panels.ndjson +13 -0
  120. package/src/dashboard/public/data/sessions.ndjson +50 -0
  121. package/src/dashboard/public/icon-192.png +0 -0
  122. package/src/dashboard/scripts/generate-seed-data.ts +355 -0
  123. package/src/dashboard/src/layouts/Layout.astro +25 -0
  124. package/src/dashboard/src/pages/index.astro +1070 -0
  125. package/src/dashboard/src/styles/dashboard.css +1078 -0
  126. package/src/dashboard/tsconfig.json +6 -0
  127. package/src/orchestrator/agent-workflows/README.md +22 -0
  128. package/src/orchestrator/agent-workflows/bug-fix.md +128 -0
  129. package/src/orchestrator/agent-workflows/data-pipeline.md +145 -0
  130. package/src/orchestrator/agent-workflows/database-migration.md +159 -0
  131. package/src/orchestrator/agent-workflows/feature-implementation.md +223 -0
  132. package/src/orchestrator/agent-workflows/performance-optimization.md +125 -0
  133. package/src/orchestrator/agent-workflows/refactoring.md +142 -0
  134. package/src/orchestrator/agent-workflows/schema-changes.md +164 -0
  135. package/src/orchestrator/agent-workflows/security-audit.md +148 -0
  136. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +33 -0
  137. package/src/orchestrator/agents/api-designer.agent.md +68 -0
  138. package/src/orchestrator/agents/architect.agent.md +129 -0
  139. package/src/orchestrator/agents/content-engineer.agent.md +57 -0
  140. package/src/orchestrator/agents/copywriter.agent.md +95 -0
  141. package/src/orchestrator/agents/data-expert.agent.md +63 -0
  142. package/src/orchestrator/agents/database-engineer.agent.md +62 -0
  143. package/src/orchestrator/agents/developer.agent.md +66 -0
  144. package/src/orchestrator/agents/devops-expert.agent.md +57 -0
  145. package/src/orchestrator/agents/documentation-writer.agent.md +60 -0
  146. package/src/orchestrator/agents/performance-expert.agent.md +58 -0
  147. package/src/orchestrator/agents/release-manager.agent.md +72 -0
  148. package/src/orchestrator/agents/researcher.agent.md +145 -0
  149. package/src/orchestrator/agents/reviewer.agent.md +62 -0
  150. package/src/orchestrator/agents/security-expert.agent.md +64 -0
  151. package/src/orchestrator/agents/seo-specialist.agent.md +67 -0
  152. package/src/orchestrator/agents/team-lead.agent.md +644 -0
  153. package/src/orchestrator/agents/testing-expert.agent.md +85 -0
  154. package/src/orchestrator/agents/ui-ux-expert.agent.md +63 -0
  155. package/src/orchestrator/copilot-instructions.md +3 -0
  156. package/src/orchestrator/customizations/AGENT-EXPERTISE.md +325 -0
  157. package/src/orchestrator/customizations/AGENT-FAILURES.md +69 -0
  158. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +58 -0
  159. package/src/orchestrator/customizations/DISPUTES.md +162 -0
  160. package/src/orchestrator/customizations/KNOWLEDGE-GRAPH.md +10 -0
  161. package/src/orchestrator/customizations/LESSONS-LEARNED.md +70 -0
  162. package/src/orchestrator/customizations/README.md +59 -0
  163. package/src/orchestrator/customizations/agents/agent-registry.md +46 -0
  164. package/src/orchestrator/customizations/agents/skill-matrix.md +142 -0
  165. package/src/orchestrator/customizations/logs/README.md +181 -0
  166. package/src/orchestrator/customizations/logs/delegations.ndjson +1 -0
  167. package/src/orchestrator/customizations/logs/panels.ndjson +1 -0
  168. package/src/orchestrator/customizations/logs/sessions.ndjson +1 -0
  169. package/src/orchestrator/customizations/project/docs-structure.md +23 -0
  170. package/src/orchestrator/customizations/project/tracker-config.md +45 -0
  171. package/src/orchestrator/customizations/project.instructions.md +64 -0
  172. package/src/orchestrator/customizations/stack/api-config.md +37 -0
  173. package/src/orchestrator/customizations/stack/cms-config.md +26 -0
  174. package/src/orchestrator/customizations/stack/data-pipeline-config.md +41 -0
  175. package/src/orchestrator/customizations/stack/database-config.md +44 -0
  176. package/src/orchestrator/customizations/stack/deployment-config.md +45 -0
  177. package/src/orchestrator/customizations/stack/testing-config.md +56 -0
  178. package/src/orchestrator/instructions/ai-optimization.instructions.md +143 -0
  179. package/src/orchestrator/instructions/general.instructions.md +194 -0
  180. package/src/orchestrator/mcp.json +55 -0
  181. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +235 -0
  182. package/src/orchestrator/prompts/brainstorm.prompt.md +115 -0
  183. package/src/orchestrator/prompts/bug-fix.prompt.md +141 -0
  184. package/src/orchestrator/prompts/create-skill.prompt.md +103 -0
  185. package/src/orchestrator/prompts/generate-task-spec.prompt.md +154 -0
  186. package/src/orchestrator/prompts/implement-feature.prompt.md +124 -0
  187. package/src/orchestrator/prompts/metrics-report.prompt.md +142 -0
  188. package/src/orchestrator/prompts/quick-refinement.prompt.md +137 -0
  189. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +100 -0
  190. package/src/orchestrator/skills/accessibility-standards/SKILL.md +164 -0
  191. package/src/orchestrator/skills/agent-hooks/SKILL.md +147 -0
  192. package/src/orchestrator/skills/agent-memory/SKILL.md +144 -0
  193. package/src/orchestrator/skills/api-patterns/SKILL.md +106 -0
  194. package/src/orchestrator/skills/browser-testing/SKILL.md +203 -0
  195. package/src/orchestrator/skills/code-commenting/SKILL.md +133 -0
  196. package/src/orchestrator/skills/contentful-cms/SKILL.md +43 -0
  197. package/src/orchestrator/skills/context-map/SKILL.md +135 -0
  198. package/src/orchestrator/skills/convex-database/SKILL.md +80 -0
  199. package/src/orchestrator/skills/data-engineering/SKILL.md +99 -0
  200. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +49 -0
  201. package/src/orchestrator/skills/documentation-standards/SKILL.md +85 -0
  202. package/src/orchestrator/skills/fast-review/SKILL.md +327 -0
  203. package/src/orchestrator/skills/frontend-design/SKILL.md +42 -0
  204. package/src/orchestrator/skills/jira-management/SKILL.md +168 -0
  205. package/src/orchestrator/skills/memory-merger/SKILL.md +123 -0
  206. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +75 -0
  207. package/src/orchestrator/skills/nx-workspace/SKILL.md +192 -0
  208. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +184 -0
  209. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +38 -0
  210. package/src/orchestrator/skills/performance-optimization/SKILL.md +101 -0
  211. package/src/orchestrator/skills/react-development/SKILL.md +117 -0
  212. package/src/orchestrator/skills/sanity-cms/SKILL.md +18 -0
  213. package/src/orchestrator/skills/security-hardening/SKILL.md +118 -0
  214. package/src/orchestrator/skills/self-improvement/SKILL.md +137 -0
  215. package/src/orchestrator/skills/seo-patterns/SKILL.md +40 -0
  216. package/src/orchestrator/skills/session-checkpoints/SKILL.md +205 -0
  217. package/src/orchestrator/skills/slack-notifications/SKILL.md +211 -0
  218. package/src/orchestrator/skills/strapi-cms/SKILL.md +43 -0
  219. package/src/orchestrator/skills/supabase-database/SKILL.md +24 -0
  220. package/src/orchestrator/skills/task-management/SKILL.md +143 -0
  221. package/src/orchestrator/skills/team-lead-reference/SKILL.md +317 -0
  222. package/src/orchestrator/skills/teams-notifications/SKILL.md +249 -0
  223. package/src/orchestrator/skills/testing-workflow/SKILL.md +134 -0
  224. package/src/orchestrator/skills/validation-gates/SKILL.md +100 -0
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "@opencastle/dashboard",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "Agent observability dashboard for OpenCastle",
6
+ "scripts": {
7
+ "dev": "astro dev --port 4300",
8
+ "build": "astro build",
9
+ "preview": "astro preview --port 4300"
10
+ },
11
+ "dependencies": {
12
+ "astro": "^5.5.0"
13
+ }
14
+ }
@@ -0,0 +1,35 @@
1
+ {"timestamp":"2026-02-20T08:00:00.000Z","session_id":"feat/tas-43","agent":"DevOps Expert","model":"gpt-5-mini","tier":"standard","mechanism":"sub-agent","linear_issue":"TAS-43","outcome":"success","retries":1,"phase":1,"file_partition":["libs/queries/","libs/server-utils/"]}
2
+ {"timestamp":"2026-02-20T11:38:52.677Z","session_id":"feat/tas-31","agent":"Architect","model":"gpt-5.3-codex","tier":"economy","mechanism":"sub-agent","linear_issue":"TAS-31","outcome":"success","retries":0,"phase":2,"file_partition":["libs/data-pipeline/"]}
3
+ {"timestamp":"2026-02-20T15:37:40.293Z","session_id":"feat/tas-59","agent":"Documentation Writer","model":"gemini-3.1-pro","tier":"standard","mechanism":"background","linear_issue":"TAS-59","outcome":"success","retries":0,"phase":2,"file_partition":["libs/data-pipeline/"]}
4
+ {"timestamp":"2026-02-20T19:36:10.946Z","session_id":"feat/tas-49","agent":"Data Expert","model":"gemini-3.1-pro","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-49","outcome":"partial","retries":0,"phase":3,"file_partition":["libs/queries/","libs/server-utils/"]}
5
+ {"timestamp":"2026-02-20T23:09:18.799Z","session_id":"feat/tas-49","agent":"Supabase DB Expert","model":"gpt-5-mini","tier":"utility","mechanism":"background","linear_issue":"TAS-49","outcome":"failed","retries":1,"phase":3,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
6
+ {"timestamp":"2026-02-21T02:23:04.138Z","session_id":"feat/tas-32","agent":"Security Expert","model":"gpt-5-mini","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-32","outcome":"success","retries":0,"phase":1,"file_partition":["apps/tastebeer.eu/app/","apps/tastecoffee.eu/app/"]}
7
+ {"timestamp":"2026-02-21T05:52:23.451Z","session_id":"feat/tas-39","agent":"Next.js Developer","model":"gpt-5.3-codex","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-39","outcome":"success","retries":0,"phase":4,"file_partition":["apps/cms-studio/"]}
8
+ {"timestamp":"2026-02-21T10:29:16.394Z","session_id":"feat/tas-41","agent":"Testing Expert","model":"claude-opus-4-6","tier":"utility","mechanism":"background","linear_issue":"TAS-41","outcome":"success","retries":1,"phase":2,"file_partition":["libs/data-pipeline/","libs/queries/"]}
9
+ {"timestamp":"2026-02-21T14:00:03.752Z","session_id":"feat/tas-50","agent":"Next.js Developer","model":"gpt-5.3-codex","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-50","outcome":"success","retries":0,"phase":1,"file_partition":["libs/supabase-auth/"]}
10
+ {"timestamp":"2026-02-21T17:10:13.592Z","session_id":"feat/tas-41","agent":"UI/UX Expert","model":"gpt-5.3-codex","tier":"premium","mechanism":"sub-agent","linear_issue":"TAS-41","outcome":"success","retries":1,"phase":1,"file_partition":["apps/tastecoffee.eu/app/"]}
11
+ {"timestamp":"2026-02-21T21:26:17.711Z","session_id":"feat/tas-58","agent":"Sanity Expert","model":"gpt-5-mini","tier":"utility","mechanism":"background","linear_issue":"TAS-58","outcome":"success","retries":1,"phase":1,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
12
+ {"timestamp":"2026-02-22T00:51:23.821Z","session_id":"feat/tas-33","agent":"DevOps Expert","model":"gpt-5-mini","tier":"utility","mechanism":"background","linear_issue":"TAS-33","outcome":"failed","retries":2,"phase":1,"file_partition":["apps/tastebeer.eu/app/","apps/tastecoffee.eu/app/"]}
13
+ {"timestamp":"2026-02-22T04:53:39.261Z","session_id":"feat/tas-35","agent":"Documentation Writer","model":"gpt-5.3-codex","tier":"utility","mechanism":"background","linear_issue":"TAS-35","outcome":"success","retries":1,"phase":1,"file_partition":["libs/server-utils/"]}
14
+ {"timestamp":"2026-02-22T08:20:53.525Z","session_id":"feat/tas-59","agent":"DevOps Expert","model":"claude-opus-4-6","tier":"standard","mechanism":"sub-agent","linear_issue":"TAS-59","outcome":"success","retries":0,"phase":4,"file_partition":["libs/queries/"]}
15
+ {"timestamp":"2026-02-22T11:43:14.243Z","session_id":"feat/tas-36","agent":"Next.js Developer","model":"gpt-5.3-codex","tier":"economy","mechanism":"sub-agent","linear_issue":"TAS-36","outcome":"success","retries":0,"phase":1,"file_partition":["libs/server-utils/"]}
16
+ {"timestamp":"2026-02-22T15:29:36.510Z","session_id":"feat/tas-54","agent":"Supabase DB Expert","model":"gpt-5.3-codex","tier":"standard","mechanism":"background","linear_issue":"TAS-54","outcome":"success","retries":0,"phase":4,"file_partition":["apps/cms-studio/"]}
17
+ {"timestamp":"2026-02-22T19:18:04.518Z","session_id":"feat/tas-41","agent":"DevOps Expert","model":"gemini-3.1-pro","tier":"utility","mechanism":"background","linear_issue":"TAS-41","outcome":"success","retries":1,"phase":3,"file_partition":["libs/server-utils/"]}
18
+ {"timestamp":"2026-02-22T23:18:07.164Z","session_id":"feat/tas-44","agent":"Next.js Developer","model":"claude-opus-4-6","tier":"premium","mechanism":"sub-agent","linear_issue":"TAS-44","outcome":"success","retries":1,"phase":2,"file_partition":["libs/server-utils/"]}
19
+ {"timestamp":"2026-02-23T02:34:46.644Z","session_id":"feat/tas-30","agent":"Sanity Expert","model":"gemini-3.1-pro","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-30","outcome":"failed","retries":2,"phase":4,"file_partition":["apps/tastebeer.eu/app/","apps/tastecoffee.eu/app/"]}
20
+ {"timestamp":"2026-02-23T06:21:11.926Z","session_id":"feat/tas-45","agent":"Performance Expert","model":"gpt-5-mini","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-45","outcome":"success","retries":1,"phase":4,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
21
+ {"timestamp":"2026-02-23T09:50:56.855Z","session_id":"feat/tas-50","agent":"Data Expert","model":"gemini-3.1-pro","tier":"standard","mechanism":"background","linear_issue":"TAS-50","outcome":"success","retries":1,"phase":2,"file_partition":["libs/supabase-auth/"]}
22
+ {"timestamp":"2026-02-23T14:28:33.926Z","session_id":"feat/tas-55","agent":"UI/UX Expert","model":"gpt-5-mini","tier":"economy","mechanism":"background","linear_issue":"TAS-55","outcome":"success","retries":1,"phase":3,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
23
+ {"timestamp":"2026-02-23T17:21:16.023Z","session_id":"feat/tas-34","agent":"Data Expert","model":"claude-opus-4-6","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-34","outcome":"partial","retries":1,"phase":4,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
24
+ {"timestamp":"2026-02-23T21:23:59.785Z","session_id":"feat/tas-54","agent":"Supabase DB Expert","model":"claude-opus-4-6","tier":"standard","mechanism":"background","linear_issue":"TAS-54","outcome":"success","retries":0,"phase":1,"file_partition":["apps/tastebeer.eu/app/"]}
25
+ {"timestamp":"2026-02-24T01:37:32.832Z","session_id":"feat/tas-45","agent":"UI/UX Expert","model":"gemini-3.1-pro","tier":"economy","mechanism":"background","linear_issue":"TAS-45","outcome":"success","retries":1,"phase":1,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
26
+ {"timestamp":"2026-02-24T04:36:24.219Z","session_id":"feat/tas-32","agent":"Data Expert","model":"gpt-5.3-codex","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-32","outcome":"success","retries":1,"phase":4,"file_partition":["libs/data-pipeline/","libs/queries/"]}
27
+ {"timestamp":"2026-02-24T08:15:17.039Z","session_id":"feat/tas-49","agent":"Data Expert","model":"gpt-5.3-codex","tier":"premium","mechanism":"sub-agent","linear_issue":"TAS-49","outcome":"success","retries":1,"phase":3,"file_partition":["libs/data-pipeline/"]}
28
+ {"timestamp":"2026-02-24T12:28:28.251Z","session_id":"feat/tas-31","agent":"DevOps Expert","model":"claude-opus-4-6","tier":"premium","mechanism":"background","linear_issue":"TAS-31","outcome":"partial","retries":0,"phase":4,"file_partition":["libs/ui-kit/","apps/tastebeer.eu/app/"]}
29
+ {"timestamp":"2026-02-24T16:03:58.674Z","session_id":"feat/tas-51","agent":"Data Expert","model":"gpt-5-mini","tier":"standard","mechanism":"sub-agent","linear_issue":"TAS-51","outcome":"success","retries":0,"phase":2,"file_partition":["libs/queries/"]}
30
+ {"timestamp":"2026-02-24T19:36:47.295Z","session_id":"feat/tas-45","agent":"Security Expert","model":"gpt-5.3-codex","tier":"premium","mechanism":"sub-agent","linear_issue":"TAS-45","outcome":"success","retries":0,"phase":1,"file_partition":["apps/tastecoffee.eu/app/"]}
31
+ {"timestamp":"2026-02-24T23:22:20.331Z","session_id":"feat/tas-54","agent":"Documentation Writer","model":"gpt-5-mini","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-54","outcome":"success","retries":0,"phase":1,"file_partition":["apps/tastebeer.eu/app/","apps/tastecoffee.eu/app/"]}
32
+ {"timestamp":"2026-02-25T03:04:08.793Z","session_id":"feat/tas-42","agent":"Next.js Developer","model":"gpt-5-mini","tier":"premium","mechanism":"sub-agent","linear_issue":"TAS-42","outcome":"success","retries":1,"phase":4,"file_partition":["apps/cms-studio/"]}
33
+ {"timestamp":"2026-02-25T06:35:46.724Z","session_id":"feat/tas-38","agent":"DevOps Expert","model":"gpt-5.3-codex","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-38","outcome":"success","retries":1,"phase":4,"file_partition":["libs/server-utils/"]}
34
+ {"timestamp":"2026-02-25T10:39:46.727Z","session_id":"feat/tas-38","agent":"Sanity Expert","model":"gemini-3.1-pro","tier":"standard","mechanism":"sub-agent","linear_issue":"TAS-38","outcome":"success","retries":0,"phase":3,"file_partition":["libs/ui-kit/"]}
35
+ {"timestamp":"2026-02-25T14:30:07.967Z","session_id":"feat/tas-46","agent":"Sanity Expert","model":"gemini-3.1-pro","tier":"utility","mechanism":"sub-agent","linear_issue":"TAS-46","outcome":"success","retries":1,"phase":4,"file_partition":["apps/tastebeer.eu/app/","apps/tastecoffee.eu/app/"]}
@@ -0,0 +1,13 @@
1
+ {"timestamp":"2026-02-20T08:00:00.000Z","panel_key":"auth-review","verdict":"pass","pass_count":2,"block_count":1,"must_fix":0,"should_fix":6,"reviewer_model":"gpt-5.3-codex","weighted":false,"attempt":1,"linear_issue":"TAS-43","artifacts_count":7,"report_path":"docs/ai-agents/panel/auth-review.md"}
2
+ {"timestamp":"2026-02-20T19:09:32.117Z","panel_key":"security-audit","verdict":"pass","pass_count":2,"block_count":1,"must_fix":0,"should_fix":5,"reviewer_model":"claude-opus-4-6","weighted":false,"attempt":1,"linear_issue":"TAS-48","artifacts_count":9,"report_path":"docs/ai-agents/panel/security-audit.md"}
3
+ {"timestamp":"2026-02-21T06:02:55.882Z","panel_key":"perf-review","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":8,"reviewer_model":"gpt-5-mini","weighted":false,"attempt":1,"linear_issue":"TAS-37","artifacts_count":16,"report_path":"docs/ai-agents/panel/perf-review.md"}
4
+ {"timestamp":"2026-02-21T16:32:56.551Z","panel_key":"a11y-audit","verdict":"block","pass_count":0,"block_count":3,"must_fix":4,"should_fix":3,"reviewer_model":"claude-opus-4-6","weighted":false,"attempt":2,"linear_issue":"TAS-39","artifacts_count":16,"report_path":"docs/ai-agents/panel/a11y-audit.md"}
5
+ {"timestamp":"2026-02-22T03:35:46.612Z","panel_key":"schema-review","verdict":"block","pass_count":0,"block_count":3,"must_fix":5,"should_fix":2,"reviewer_model":"gpt-5-mini","weighted":false,"attempt":2,"linear_issue":"TAS-54","artifacts_count":20,"report_path":"docs/ai-agents/panel/schema-review.md"}
6
+ {"timestamp":"2026-02-22T14:02:10.154Z","panel_key":"api-review","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":8,"reviewer_model":"gpt-5.3-codex","weighted":true,"attempt":1,"linear_issue":"TAS-50","artifacts_count":17,"report_path":"docs/ai-agents/panel/api-review.md"}
7
+ {"timestamp":"2026-02-23T01:09:17.203Z","panel_key":"ui-review","verdict":"block","pass_count":1,"block_count":2,"must_fix":5,"should_fix":6,"reviewer_model":"claude-opus-4-6","weighted":true,"attempt":2,"linear_issue":"TAS-55","artifacts_count":15,"report_path":"docs/ai-agents/panel/ui-review.md"}
8
+ {"timestamp":"2026-02-23T11:41:37.464Z","panel_key":"test-coverage","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":3,"reviewer_model":"gpt-5-mini","weighted":false,"attempt":1,"linear_issue":"TAS-31","artifacts_count":18,"report_path":"docs/ai-agents/panel/test-coverage.md"}
9
+ {"timestamp":"2026-02-23T22:16:10.866Z","panel_key":"csp-headers","verdict":"pass","pass_count":2,"block_count":1,"must_fix":0,"should_fix":3,"reviewer_model":"gemini-3.1-pro","weighted":false,"attempt":1,"linear_issue":"TAS-40","artifacts_count":6,"report_path":"docs/ai-agents/panel/csp-headers.md"}
10
+ {"timestamp":"2026-02-24T09:55:09.030Z","panel_key":"migration-review","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":5,"reviewer_model":"gemini-3.1-pro","weighted":false,"attempt":1,"linear_issue":"TAS-53","artifacts_count":6,"report_path":"docs/ai-agents/panel/migration-review.md"}
11
+ {"timestamp":"2026-02-24T20:15:45.425Z","panel_key":"query-optimization","verdict":"block","pass_count":0,"block_count":3,"must_fix":5,"should_fix":5,"reviewer_model":"gpt-5-mini","weighted":false,"attempt":3,"linear_issue":"TAS-42","artifacts_count":15,"report_path":"docs/ai-agents/panel/query-optimization.md"}
12
+ {"timestamp":"2026-02-25T07:07:18.806Z","panel_key":"deployment-checklist","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":8,"reviewer_model":"gemini-3.1-pro","weighted":true,"attempt":1,"linear_issue":"TAS-33","artifacts_count":6,"report_path":"docs/ai-agents/panel/deployment-checklist.md"}
13
+ {"timestamp":"2026-02-25T10:00:00Z","panel_key":"instruction-refactoring","verdict":"pass","pass_count":3,"block_count":0,"must_fix":0,"should_fix":5,"reviewer_model":"claude-opus-4-6","weighted":false,"attempt":1,"artifacts_count":14,"report_path":"docs/ai-agents/panel/instruction-refactoring.md"}
@@ -0,0 +1,50 @@
1
+ {"timestamp":"2026-02-20T08:00:34.359Z","agent":"Architect","model":"claude-opus-4-6","task":"TAS-46: Fix CORS headers","linear_issue":"TAS-46","outcome":"success","duration_min":20,"files_changed":9,"retries":1,"lessons_added":["LES-002"],"discoveries":[]}
2
+ {"timestamp":"2026-02-20T11:05:05.028Z","agent":"Supabase DB Expert","model":"gpt-5-mini","task":"TAS-56: Fix redirect loop","linear_issue":"TAS-56","outcome":"partial","duration_min":32,"files_changed":5,"retries":2,"lessons_added":[],"discoveries":[]}
3
+ {"timestamp":"2026-02-20T13:16:10.762Z","agent":"Sanity Expert","model":"gpt-5-mini","task":"TAS-51: Fix redirect loop","linear_issue":"TAS-51","outcome":"success","duration_min":33,"files_changed":11,"retries":1,"lessons_added":[],"discoveries":[]}
4
+ {"timestamp":"2026-02-20T15:42:21.649Z","agent":"Architect","model":"gpt-5.3-codex","task":"TAS-48: Add venue suggestions","linear_issue":"TAS-48","outcome":"success","duration_min":42,"files_changed":6,"retries":1,"lessons_added":["LES-005"],"discoveries":[]}
5
+ {"timestamp":"2026-02-20T18:33:39.948Z","agent":"Next.js Developer","model":"gemini-3.1-pro","task":"TAS-45: Add image optimization","linear_issue":"TAS-45","outcome":"success","duration_min":17,"files_changed":6,"retries":0,"lessons_added":[],"discoveries":[]}
6
+ {"timestamp":"2026-02-20T20:50:56.727Z","agent":"UI/UX Expert","model":"claude-opus-4-6","task":"TAS-49: Fix redirect loop","linear_issue":"TAS-49","outcome":"success","duration_min":29,"files_changed":13,"retries":1,"lessons_added":["LES-002"],"discoveries":[]}
7
+ {"timestamp":"2026-02-21T00:05:00.537Z","agent":"Testing Expert","model":"gpt-5-mini","task":"TAS-58: Fix mobile layout","linear_issue":"TAS-58","outcome":"partial","duration_min":36,"files_changed":5,"retries":1,"lessons_added":[],"discoveries":[]}
8
+ {"timestamp":"2026-02-21T01:56:41.910Z","agent":"Supabase DB Expert","model":"gpt-5.3-codex","task":"TAS-42: Optimize bundle size","linear_issue":"TAS-42","outcome":"partial","duration_min":25,"files_changed":15,"retries":2,"lessons_added":[],"discoveries":[]}
9
+ {"timestamp":"2026-02-21T05:11:42.700Z","agent":"Security Expert","model":"gpt-5.3-codex","task":"TAS-51: Add image optimization","linear_issue":"TAS-51","outcome":"success","duration_min":11,"files_changed":5,"retries":1,"lessons_added":["LES-002"],"discoveries":["Refactor auth flow"]}
10
+ {"timestamp":"2026-02-21T07:24:02.899Z","agent":"Next.js Developer","model":"gpt-5.3-codex","task":"TAS-42: Update scraper logic","linear_issue":"TAS-42","outcome":"success","duration_min":24,"files_changed":9,"retries":0,"lessons_added":[],"discoveries":[]}
11
+ {"timestamp":"2026-02-21T10:15:19.797Z","agent":"DevOps Expert","model":"gemini-3.1-pro","task":"TAS-53: Update SEO metadata","linear_issue":"TAS-53","outcome":"success","duration_min":29,"files_changed":11,"retries":0,"lessons_added":[],"discoveries":["Update venue detail"]}
12
+ {"timestamp":"2026-02-21T12:33:24.255Z","agent":"Testing Expert","model":"gemini-3.1-pro","task":"TAS-50: Refactor auth flow","linear_issue":"TAS-50","outcome":"success","duration_min":29,"files_changed":11,"retries":0,"lessons_added":[],"discoveries":["Add social links"]}
13
+ {"timestamp":"2026-02-21T14:54:49.349Z","agent":"Data Expert","model":"gpt-5-mini","task":"TAS-47: Fix slug generation","linear_issue":"TAS-47","outcome":"partial","duration_min":25,"files_changed":3,"retries":2,"lessons_added":[],"discoveries":[]}
14
+ {"timestamp":"2026-02-21T18:06:15.985Z","agent":"Sanity Expert","model":"gemini-3.1-pro","task":"TAS-44: Update moderation UI","linear_issue":"TAS-44","outcome":"success","duration_min":18,"files_changed":4,"retries":1,"lessons_added":["LES-010"],"discoveries":["Fix pagination"]}
15
+ {"timestamp":"2026-02-21T20:51:57.384Z","agent":"Performance Expert","model":"claude-opus-4-6","task":"TAS-47: Add geolocation","linear_issue":"TAS-47","outcome":"partial","duration_min":22,"files_changed":3,"retries":1,"lessons_added":["LES-006"],"discoveries":[]}
16
+ {"timestamp":"2026-02-21T22:37:25.143Z","agent":"Sanity Expert","model":"gpt-5.3-codex","task":"TAS-38: Fix header navigation","linear_issue":"TAS-38","outcome":"success","duration_min":38,"files_changed":3,"retries":0,"lessons_added":[],"discoveries":["Add cache headers"]}
17
+ {"timestamp":"2026-02-22T02:04:09.220Z","agent":"Data Expert","model":"gpt-5-mini","task":"TAS-40: Update CMS schema","linear_issue":"TAS-40","outcome":"failed","duration_min":29,"files_changed":1,"retries":3,"lessons_added":["LES-003"],"discoveries":["Add social links"]}
18
+ {"timestamp":"2026-02-22T04:18:52.718Z","agent":"Supabase DB Expert","model":"gemini-3.1-pro","task":"TAS-38: Update scraper logic","linear_issue":"TAS-38","outcome":"success","duration_min":32,"files_changed":1,"retries":0,"lessons_added":[],"discoveries":[]}
19
+ {"timestamp":"2026-02-22T06:31:31.565Z","agent":"Architect","model":"gemini-3.1-pro","task":"TAS-41: Add unit tests","linear_issue":"TAS-41","outcome":"success","duration_min":13,"files_changed":14,"retries":0,"lessons_added":[],"discoveries":[]}
20
+ {"timestamp":"2026-02-22T09:44:33.779Z","agent":"Security Expert","model":"gemini-3.1-pro","task":"TAS-51: Update RLS policies","linear_issue":"TAS-51","outcome":"failed","duration_min":8,"files_changed":10,"retries":3,"lessons_added":["LES-004"],"discoveries":["Update scraper logic"]}
21
+ {"timestamp":"2026-02-22T12:20:59.680Z","agent":"Testing Expert","model":"gpt-5-mini","task":"TAS-32: Add venue suggestions","linear_issue":"TAS-32","outcome":"failed","duration_min":21,"files_changed":12,"retries":3,"lessons_added":["LES-001"],"discoveries":["Fix CORS headers"]}
22
+ {"timestamp":"2026-02-22T14:18:43.678Z","agent":"Supabase DB Expert","model":"claude-opus-4-6","task":"TAS-55: Update search API","linear_issue":"TAS-55","outcome":"success","duration_min":33,"files_changed":12,"retries":1,"lessons_added":[],"discoveries":[]}
23
+ {"timestamp":"2026-02-22T17:34:33.606Z","agent":"Documentation Writer","model":"claude-opus-4-6","task":"TAS-55: Update venue detail","linear_issue":"TAS-55","outcome":"success","duration_min":6,"files_changed":6,"retries":1,"lessons_added":[],"discoveries":["Add cache headers"]}
24
+ {"timestamp":"2026-02-22T20:17:44.211Z","agent":"Supabase DB Expert","model":"claude-opus-4-6","task":"TAS-36: Add price filter","linear_issue":"TAS-36","outcome":"success","duration_min":19,"files_changed":4,"retries":0,"lessons_added":[],"discoveries":[]}
25
+ {"timestamp":"2026-02-22T22:32:33.601Z","agent":"Supabase DB Expert","model":"claude-opus-4-6","task":"TAS-37: Fix pagination","linear_issue":"TAS-37","outcome":"partial","duration_min":44,"files_changed":2,"retries":1,"lessons_added":[],"discoveries":["Add venue suggestions"]}
26
+ {"timestamp":"2026-02-23T01:26:57.546Z","agent":"Sanity Expert","model":"gpt-5-mini","task":"TAS-52: Add social links","linear_issue":"TAS-52","outcome":"partial","duration_min":13,"files_changed":3,"retries":0,"lessons_added":[],"discoveries":[]}
27
+ {"timestamp":"2026-02-23T03:16:41.486Z","agent":"Architect","model":"gpt-5.3-codex","task":"TAS-31: Add sort options","linear_issue":"TAS-31","outcome":"success","duration_min":31,"files_changed":8,"retries":1,"lessons_added":[],"discoveries":[]}
28
+ {"timestamp":"2026-02-23T06:22:53.878Z","agent":"Sanity Expert","model":"gemini-3.1-pro","task":"TAS-47: Add price filter","linear_issue":"TAS-47","outcome":"success","duration_min":19,"files_changed":4,"retries":1,"lessons_added":[],"discoveries":["Fix pagination"]}
29
+ {"timestamp":"2026-02-23T09:04:20.943Z","agent":"UI/UX Expert","model":"gpt-5-mini","task":"TAS-34: Add geolocation","linear_issue":"TAS-34","outcome":"success","duration_min":35,"files_changed":1,"retries":0,"lessons_added":[],"discoveries":[]}
30
+ {"timestamp":"2026-02-23T11:28:05.523Z","agent":"Data Expert","model":"claude-opus-4-6","task":"TAS-36: Update CMS schema","linear_issue":"TAS-36","outcome":"success","duration_min":15,"files_changed":9,"retries":1,"lessons_added":[],"discoveries":[]}
31
+ {"timestamp":"2026-02-23T14:15:53.224Z","agent":"Data Expert","model":"gpt-5.3-codex","task":"TAS-31: Fix redirect loop","linear_issue":"TAS-31","outcome":"success","duration_min":43,"files_changed":8,"retries":1,"lessons_added":[],"discoveries":[]}
32
+ {"timestamp":"2026-02-23T16:28:00.114Z","agent":"UI/UX Expert","model":"gpt-5-mini","task":"TAS-35: Add cache headers","linear_issue":"TAS-35","outcome":"success","duration_min":37,"files_changed":14,"retries":1,"lessons_added":[],"discoveries":[]}
33
+ {"timestamp":"2026-02-23T18:44:29.480Z","agent":"Architect","model":"gemini-3.1-pro","task":"TAS-56: Add cache headers","linear_issue":"TAS-56","outcome":"failed","duration_min":39,"files_changed":12,"retries":2,"lessons_added":[],"discoveries":["Fix SSR hydration"]}
34
+ {"timestamp":"2026-02-23T22:10:16.183Z","agent":"Performance Expert","model":"gpt-5.3-codex","task":"TAS-33: Add price filter","linear_issue":"TAS-33","outcome":"success","duration_min":37,"files_changed":13,"retries":0,"lessons_added":[],"discoveries":[]}
35
+ {"timestamp":"2026-02-24T00:09:22.013Z","agent":"Security Expert","model":"gpt-5.3-codex","task":"TAS-48: Update search API","linear_issue":"TAS-48","outcome":"success","duration_min":15,"files_changed":8,"retries":1,"lessons_added":[],"discoveries":["Update CMS schema"]}
36
+ {"timestamp":"2026-02-24T03:00:42.606Z","agent":"Testing Expert","model":"gpt-5-mini","task":"TAS-39: Fix cookie consent","linear_issue":"TAS-39","outcome":"success","duration_min":42,"files_changed":10,"retries":0,"lessons_added":[],"discoveries":[]}
37
+ {"timestamp":"2026-02-24T05:18:53.042Z","agent":"Next.js Developer","model":"gemini-3.1-pro","task":"TAS-37: Update contact form","linear_issue":"TAS-37","outcome":"failed","duration_min":20,"files_changed":11,"retries":2,"lessons_added":[],"discoveries":["Add geolocation"]}
38
+ {"timestamp":"2026-02-24T08:11:14.714Z","agent":"Next.js Developer","model":"gemini-3.1-pro","task":"TAS-30: Add unit tests","linear_issue":"TAS-30","outcome":"partial","duration_min":32,"files_changed":6,"retries":2,"lessons_added":["LES-009"],"discoveries":["Fix SSR hydration"]}
39
+ {"timestamp":"2026-02-24T10:24:49.892Z","agent":"Performance Expert","model":"claude-opus-4-6","task":"TAS-33: Fix cookie consent","linear_issue":"TAS-33","outcome":"failed","duration_min":39,"files_changed":2,"retries":2,"lessons_added":[],"discoveries":[]}
40
+ {"timestamp":"2026-02-24T12:54:27.158Z","agent":"Data Expert","model":"claude-opus-4-6","task":"TAS-35: Add filter component","linear_issue":"TAS-35","outcome":"success","duration_min":13,"files_changed":7,"retries":1,"lessons_added":[],"discoveries":[]}
41
+ {"timestamp":"2026-02-24T15:47:57.543Z","agent":"Performance Expert","model":"gpt-5.3-codex","task":"TAS-59: Fix CSP violations","linear_issue":"TAS-59","outcome":"success","duration_min":25,"files_changed":7,"retries":1,"lessons_added":[],"discoveries":["Add venue suggestions"]}
42
+ {"timestamp":"2026-02-24T18:21:34.626Z","agent":"Testing Expert","model":"claude-opus-4-6","task":"TAS-47: Add image optimization","linear_issue":"TAS-47","outcome":"success","duration_min":45,"files_changed":1,"retries":1,"lessons_added":["LES-005"],"discoveries":[]}
43
+ {"timestamp":"2026-02-24T20:46:38.816Z","agent":"DevOps Expert","model":"gemini-3.1-pro","task":"TAS-36: Add geolocation","linear_issue":"TAS-36","outcome":"success","duration_min":22,"files_changed":9,"retries":0,"lessons_added":[],"discoveries":[]}
44
+ {"timestamp":"2026-02-24T23:50:07.144Z","agent":"Next.js Developer","model":"claude-opus-4-6","task":"TAS-32: Add price filter","linear_issue":"TAS-32","outcome":"success","duration_min":15,"files_changed":11,"retries":1,"lessons_added":[],"discoveries":[]}
45
+ {"timestamp":"2026-02-25T02:48:10.908Z","agent":"Sanity Expert","model":"claude-opus-4-6","task":"TAS-32: Add cache headers","linear_issue":"TAS-32","outcome":"failed","duration_min":38,"files_changed":8,"retries":1,"lessons_added":["LES-008"],"discoveries":[]}
46
+ {"timestamp":"2026-02-25T05:22:40.043Z","agent":"Next.js Developer","model":"gemini-3.1-pro","task":"TAS-31: Update contact form","linear_issue":"TAS-31","outcome":"success","duration_min":8,"files_changed":7,"retries":0,"lessons_added":[],"discoveries":[]}
47
+ {"timestamp":"2026-02-25T07:56:19.927Z","agent":"Architect","model":"claude-opus-4-6","task":"TAS-57: Fix cookie consent","linear_issue":"TAS-57","outcome":"success","duration_min":22,"files_changed":9,"retries":0,"lessons_added":[],"discoveries":[]}
48
+ {"timestamp":"2026-02-25T10:34:21.652Z","agent":"UI/UX Expert","model":"claude-opus-4-6","task":"TAS-33: Update search API","linear_issue":"TAS-33","outcome":"failed","duration_min":41,"files_changed":11,"retries":1,"lessons_added":[],"discoveries":[]}
49
+ {"timestamp":"2026-02-25T13:00:16.014Z","agent":"DevOps Expert","model":"gpt-5-mini","task":"TAS-44: Add geolocation","linear_issue":"TAS-44","outcome":"failed","duration_min":12,"files_changed":12,"retries":3,"lessons_added":[],"discoveries":["Update venue detail"]}
50
+ {"timestamp":"2026-02-25T15:48:46.235Z","agent":"UI/UX Expert","model":"claude-opus-4-6","task":"TAS-38: Optimize bundle size","linear_issue":"TAS-38","outcome":"failed","duration_min":5,"files_changed":12,"retries":3,"lessons_added":[],"discoveries":[]}
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Generate realistic seed data for the Agent Dashboard.
4
+ *
5
+ * Writes NDJSON files to docs/ai-agents/logs/:
6
+ * - sessions.ndjson (50 records)
7
+ * - delegations.ndjson (35 records)
8
+ * - panels.ndjson (12 records + preserves existing)
9
+ *
10
+ * Usage: npx tsx opencastle/src/dashboard/scripts/generate-seed-data.ts
11
+ */
12
+
13
+ import { readFileSync, writeFileSync, mkdirSync } from 'fs';
14
+ import { join } from 'path';
15
+
16
+ const REPO_ROOT = join(__dirname, '..', '..', '..', '..');
17
+ const LOGS_DIR = join(REPO_ROOT, 'docs', 'ai-agents', 'logs');
18
+
19
+ // --- Constants ---
20
+
21
+ const AGENTS = [
22
+ 'Developer',
23
+ 'UI/UX Expert',
24
+ 'Content Engineer',
25
+ 'Database Engineer',
26
+ 'Testing Expert',
27
+ 'Security Expert',
28
+ 'Performance Expert',
29
+ 'DevOps Expert',
30
+ 'Data Expert',
31
+ 'Architect',
32
+ 'Documentation Writer',
33
+ ];
34
+
35
+ const MODELS = ['claude-opus-4-6', 'gpt-5.3-codex', 'gemini-3.1-pro', 'gpt-5-mini'];
36
+
37
+ const TIERS: Array<{ name: string; weight: number }> = [
38
+ { name: 'utility', weight: 0.4 },
39
+ { name: 'standard', weight: 0.25 },
40
+ { name: 'economy', weight: 0.2 },
41
+ { name: 'premium', weight: 0.15 },
42
+ ];
43
+
44
+ const _MECHANISMS = ['sub-agent', 'background'];
45
+
46
+ const LINEAR_ISSUES = Array.from({ length: 30 }, (_, i) => `TAS-${i + 30}`);
47
+
48
+ const FILE_PARTITIONS = [
49
+ ['libs/ui-kit/'],
50
+ ['apps/tastebeer.eu/app/'],
51
+ ['libs/queries/'],
52
+ ['libs/supabase-auth/'],
53
+ ['libs/data-pipeline/'],
54
+ ['apps/tastecoffee.eu/app/'],
55
+ ['libs/server-utils/'],
56
+ ['apps/cms-studio/'],
57
+ ['libs/ui-kit/', 'apps/tastebeer.eu/app/'],
58
+ ['libs/queries/', 'libs/server-utils/'],
59
+ ['apps/tastebeer.eu/app/', 'apps/tastecoffee.eu/app/'],
60
+ ['libs/data-pipeline/', 'libs/queries/'],
61
+ ];
62
+
63
+ const PANEL_KEYS = [
64
+ 'auth-review',
65
+ 'security-audit',
66
+ 'perf-review',
67
+ 'a11y-audit',
68
+ 'schema-review',
69
+ 'api-review',
70
+ 'ui-review',
71
+ 'test-coverage',
72
+ 'csp-headers',
73
+ 'migration-review',
74
+ 'query-optimization',
75
+ 'deployment-checklist',
76
+ ];
77
+
78
+ const TASK_DESCRIPTIONS = [
79
+ 'Fix header navigation',
80
+ 'Add filter component',
81
+ 'Update search API',
82
+ 'Refactor auth flow',
83
+ 'Add price filter',
84
+ 'Fix map markers',
85
+ 'Update CMS schema',
86
+ 'Add unit tests',
87
+ 'Fix SSR hydration',
88
+ 'Optimize bundle size',
89
+ 'Add geolocation',
90
+ 'Fix CORS headers',
91
+ 'Update RLS policies',
92
+ 'Add image optimization',
93
+ 'Fix pagination',
94
+ 'Add sort options',
95
+ 'Update venue detail',
96
+ 'Fix mobile layout',
97
+ 'Add analytics tracking',
98
+ 'Update SEO metadata',
99
+ 'Fix cookie consent',
100
+ 'Add venue suggestions',
101
+ 'Update contact form',
102
+ 'Fix redirect loop',
103
+ 'Add social links',
104
+ 'Update moderation UI',
105
+ 'Fix CSP violations',
106
+ 'Add cache headers',
107
+ 'Update scraper logic',
108
+ 'Fix slug generation',
109
+ ];
110
+
111
+ const LESSON_IDS = ['LES-001', 'LES-002', 'LES-003', 'LES-004', 'LES-005', 'LES-006', 'LES-007', 'LES-008', 'LES-009', 'LES-010'];
112
+
113
+ // --- Helpers ---
114
+
115
+ /** Seeded PRNG for reproducible results */
116
+ class SeededRandom {
117
+ private seed: number;
118
+ constructor(seed: number) {
119
+ this.seed = seed;
120
+ }
121
+ next(): number {
122
+ this.seed = (this.seed * 16807 + 0) % 2147483647;
123
+ return (this.seed - 1) / 2147483646;
124
+ }
125
+ int(min: number, max: number): number {
126
+ return Math.floor(this.next() * (max - min + 1)) + min;
127
+ }
128
+ pick<T>(arr: T[]): T {
129
+ return arr[this.int(0, arr.length - 1)];
130
+ }
131
+ weighted<T extends { name: string; weight: number }>(items: T[]): string {
132
+ const r = this.next();
133
+ let cumulative = 0;
134
+ for (const item of items) {
135
+ cumulative += item.weight;
136
+ if (r <= cumulative) return item.name;
137
+ }
138
+ return items[items.length - 1].name;
139
+ }
140
+ }
141
+
142
+ const rng = new SeededRandom(20260225);
143
+
144
+ /** Generate a timestamp between start and end dates, offset by index */
145
+ function generateTimestamp(index: number, total: number, startDate: Date, endDate: Date): string {
146
+ const range = endDate.getTime() - startDate.getTime();
147
+ const base = startDate.getTime() + (range * index) / total;
148
+ const jitter = rng.int(-1800000, 1800000); // +/- 30 min
149
+ const ts = new Date(Math.max(startDate.getTime(), Math.min(endDate.getTime(), base + jitter)));
150
+ return ts.toISOString();
151
+ }
152
+
153
+ const START_DATE = new Date('2026-02-20T08:00:00Z');
154
+ const END_DATE = new Date('2026-02-25T18:00:00Z');
155
+
156
+ // --- Generate Sessions ---
157
+
158
+ interface SessionRecord {
159
+ timestamp: string;
160
+ agent: string;
161
+ model: string;
162
+ task: string;
163
+ linear_issue: string;
164
+ outcome: string;
165
+ duration_min: number;
166
+ files_changed: number;
167
+ retries: number;
168
+ lessons_added: string[];
169
+ discoveries: string[];
170
+ }
171
+
172
+ function generateSessions(count: number): SessionRecord[] {
173
+ const records: SessionRecord[] = [];
174
+ for (let i = 0; i < count; i++) {
175
+ const issue = rng.pick(LINEAR_ISSUES);
176
+ const outcomeRoll = rng.next();
177
+ const outcome = outcomeRoll < 0.7 ? 'success' : outcomeRoll < 0.9 ? 'partial' : 'failed';
178
+ const retries = outcome === 'failed' ? rng.int(1, 3) : outcome === 'partial' ? rng.int(0, 2) : rng.int(0, 1);
179
+ const lessonsAdded = retries > 0 && rng.next() > 0.6 ? [rng.pick(LESSON_IDS)] : [];
180
+ const discoveries = rng.next() > 0.7 ? [rng.pick(TASK_DESCRIPTIONS)] : [];
181
+
182
+ records.push({
183
+ timestamp: generateTimestamp(i, count, START_DATE, END_DATE),
184
+ agent: rng.pick(AGENTS),
185
+ model: rng.pick(MODELS),
186
+ task: `${issue}: ${rng.pick(TASK_DESCRIPTIONS)}`,
187
+ linear_issue: issue,
188
+ outcome,
189
+ duration_min: rng.int(5, 45),
190
+ files_changed: rng.int(1, 15),
191
+ retries,
192
+ lessons_added: lessonsAdded,
193
+ discoveries,
194
+ });
195
+ }
196
+ return records.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
197
+ }
198
+
199
+ // --- Generate Delegations ---
200
+
201
+ interface DelegationRecord {
202
+ timestamp: string;
203
+ session_id: string;
204
+ agent: string;
205
+ model: string;
206
+ tier: string;
207
+ mechanism: string;
208
+ linear_issue: string;
209
+ outcome: string;
210
+ retries: number;
211
+ phase: number;
212
+ file_partition: string[];
213
+ }
214
+
215
+ function generateDelegations(count: number): DelegationRecord[] {
216
+ const records: DelegationRecord[] = [];
217
+ for (let i = 0; i < count; i++) {
218
+ const issue = rng.pick(LINEAR_ISSUES);
219
+ const outcomeRoll = rng.next();
220
+ const outcome = outcomeRoll < 0.75 ? 'success' : outcomeRoll < 0.9 ? 'partial' : 'failed';
221
+
222
+ records.push({
223
+ timestamp: generateTimestamp(i, count, START_DATE, END_DATE),
224
+ session_id: `feat/${issue.toLowerCase()}`,
225
+ agent: rng.pick(AGENTS),
226
+ model: rng.pick(MODELS),
227
+ tier: rng.weighted(TIERS),
228
+ mechanism: rng.next() < 0.6 ? 'sub-agent' : 'background',
229
+ linear_issue: issue,
230
+ outcome,
231
+ retries: outcome === 'failed' ? rng.int(1, 2) : rng.int(0, 1),
232
+ phase: rng.int(1, 4),
233
+ file_partition: rng.pick(FILE_PARTITIONS),
234
+ });
235
+ }
236
+ return records.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
237
+ }
238
+
239
+ // --- Generate Panels ---
240
+
241
+ interface PanelRecord {
242
+ timestamp: string;
243
+ panel_key: string;
244
+ verdict: string;
245
+ pass_count: number;
246
+ block_count: number;
247
+ must_fix: number;
248
+ should_fix: number;
249
+ reviewer_model: string;
250
+ weighted: boolean;
251
+ attempt: number;
252
+ linear_issue: string;
253
+ artifacts_count: number;
254
+ report_path: string;
255
+ }
256
+
257
+ function generatePanels(count: number): PanelRecord[] {
258
+ const records: PanelRecord[] = [];
259
+ for (let i = 0; i < count; i++) {
260
+ const panelKey = PANEL_KEYS[i % PANEL_KEYS.length];
261
+ const isPass = rng.next() < 0.75;
262
+ const passCount = isPass ? rng.int(2, 3) : rng.int(0, 1);
263
+ const blockCount = 3 - passCount;
264
+ const issue = rng.pick(LINEAR_ISSUES);
265
+
266
+ records.push({
267
+ timestamp: generateTimestamp(i, count, START_DATE, END_DATE),
268
+ panel_key: panelKey,
269
+ verdict: isPass ? 'pass' : 'block',
270
+ pass_count: passCount,
271
+ block_count: blockCount,
272
+ must_fix: isPass ? 0 : rng.int(1, 5),
273
+ should_fix: rng.int(0, 8),
274
+ reviewer_model: rng.pick(MODELS),
275
+ weighted: rng.next() > 0.7,
276
+ attempt: isPass ? 1 : rng.int(1, 3),
277
+ linear_issue: issue,
278
+ artifacts_count: rng.int(3, 20),
279
+ report_path: `docs/ai-agents/panel/${panelKey}.md`,
280
+ });
281
+ }
282
+ return records.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
283
+ }
284
+
285
+ // --- Main ---
286
+
287
+ function main() {
288
+ mkdirSync(LOGS_DIR, { recursive: true });
289
+
290
+ // Read existing panel records to preserve them
291
+ const panelsPath = join(LOGS_DIR, 'panels.ndjson');
292
+ let existingPanels: string[] = [];
293
+ try {
294
+ const content = readFileSync(panelsPath, 'utf-8').trim();
295
+ if (content) {
296
+ existingPanels = content.split('\n').filter(Boolean);
297
+ }
298
+ } catch {
299
+ // File doesn't exist yet
300
+ }
301
+
302
+ // Generate data
303
+ const sessions = generateSessions(50);
304
+ const delegations = generateDelegations(35);
305
+ const panels = generatePanels(12);
306
+
307
+ // Write sessions
308
+ const sessionsPath = join(LOGS_DIR, 'sessions.ndjson');
309
+ writeFileSync(sessionsPath, sessions.map((r) => JSON.stringify(r)).join('\n') + '\n');
310
+ console.log(`Wrote ${sessions.length} session records to ${sessionsPath}`);
311
+
312
+ // Write delegations
313
+ const delegationsPath = join(LOGS_DIR, 'delegations.ndjson');
314
+ writeFileSync(delegationsPath, delegations.map((r) => JSON.stringify(r)).join('\n') + '\n');
315
+ console.log(`Wrote ${delegations.length} delegation records to ${delegationsPath}`);
316
+
317
+ // Write panels (preserve existing + add new, sorted by timestamp)
318
+ const allPanelLines = [
319
+ ...existingPanels,
320
+ ...panels.map((r) => JSON.stringify(r)),
321
+ ];
322
+ // Parse and sort all panel records by timestamp
323
+ const allPanelRecords = allPanelLines
324
+ .map((line) => JSON.parse(line))
325
+ .sort((a: { timestamp: string }, b: { timestamp: string }) => a.timestamp.localeCompare(b.timestamp));
326
+ writeFileSync(panelsPath, allPanelRecords.map((r: unknown) => JSON.stringify(r)).join('\n') + '\n');
327
+ console.log(`Wrote ${allPanelRecords.length} panel records to ${panelsPath} (${existingPanels.length} existing + ${panels.length} new)`);
328
+
329
+ // Summary
330
+ console.log('\n--- Seed Data Summary ---');
331
+ console.log(`Sessions: ${sessions.length}`);
332
+ console.log(`Delegations: ${delegations.length}`);
333
+ console.log(`Panels: ${allPanelRecords.length} (${existingPanels.length} existing + ${panels.length} generated)`);
334
+
335
+ // Outcome distribution
336
+ const sessionOutcomes = sessions.reduce<Record<string, number>>((acc, s) => {
337
+ acc[s.outcome] = (acc[s.outcome] || 0) + 1;
338
+ return acc;
339
+ }, {});
340
+ console.log(`\nSession outcomes: ${JSON.stringify(sessionOutcomes)}`);
341
+
342
+ const tierDist = delegations.reduce<Record<string, number>>((acc, d) => {
343
+ acc[d.tier] = (acc[d.tier] || 0) + 1;
344
+ return acc;
345
+ }, {});
346
+ console.log(`Delegation tiers: ${JSON.stringify(tierDist)}`);
347
+
348
+ const panelVerdicts = allPanelRecords.reduce((acc: Record<string, number>, p: { verdict: string }) => {
349
+ acc[p.verdict] = (acc[p.verdict] || 0) + 1;
350
+ return acc;
351
+ }, {} as Record<string, number>);
352
+ console.log(`Panel verdicts: ${JSON.stringify(panelVerdicts)}`);
353
+ }
354
+
355
+ main();
@@ -0,0 +1,25 @@
1
+ ---
2
+ interface Props {
3
+ title: string;
4
+ }
5
+
6
+ const { title } = Astro.props;
7
+ const base = import.meta.env.BASE_URL;
8
+ ---
9
+
10
+ <html lang="en">
11
+ <head>
12
+ <meta charset="UTF-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
14
+ <title>{title}</title>
15
+ <meta
16
+ name="description"
17
+ content="Real-time observability for OpenCastle multi-agent orchestration — sessions, delegations, model tiers, and quality gates."
18
+ />
19
+ <meta name="theme-color" content="#0a0a0f" />
20
+ <link rel="icon" type="image/png" sizes="192x192" href={`${base}icon-192.png`} />
21
+ </head>
22
+ <body>
23
+ <slot />
24
+ </body>
25
+ </html>