Compare commits

..
1237 Commits
Author SHA1 Message Date
Jarvis c0539f4867 comms: homelab 20260726T165824Z 2026-07-26 11:58:24 -05:00
Jarvis e44f1bb7fb comms: homelab 20260726T164340Z 2026-07-26 11:43:40 -05:00
Jarvis 1ee71bea8b comms: homelab 20260726T162809Z 2026-07-26 11:28:09 -05:00
Jarvis 2be70d91ab comms: homelab 20260726T160150Z 2026-07-26 11:01:50 -05:00
Jarvis 8ffcc380f7 comms: homelab 20260726T154254Z 2026-07-26 10:42:54 -05:00
Jarvis 129f6c4051 comms: homelab 20260726T152805Z 2026-07-26 10:28:06 -05:00
Jarvis 142fbd22de comms: homelab 20260726T151235Z 2026-07-26 10:12:35 -05:00
Jarvis 07106b763b comms: homelab 20260726T145737Z 2026-07-26 09:57:37 -05:00
Jarvis d9c789e236 comms: homelab 20260726T142722Z 2026-07-26 09:27:22 -05:00
Jarvis 7e1f64128e comms: homelab 20260726T135725Z 2026-07-26 08:57:25 -05:00
Jarvis 3a5df0387e comms: homelab 20260726T134208Z 2026-07-26 08:42:08 -05:00
Jarvis 5d92d20af2 comms: homelab 20260726T132658Z 2026-07-26 08:26:58 -05:00
Jarvis 121ee6daee comms: homelab 20260726T131145Z 2026-07-26 08:11:45 -05:00
Jarvis fd8f8c37c1 comms: homelab 20260726T125638Z 2026-07-26 07:56:38 -05:00
Jarvis c41baaa3f9 comms: homelab 20260726T124137Z 2026-07-26 07:41:37 -05:00
Jarvis 5c1d72fa38 comms: homelab 20260726T122618Z 2026-07-26 07:26:18 -05:00
Jarvis 5a360a75b0 comms: homelab 20260726T115604Z 2026-07-26 06:56:04 -05:00
Jarvis 543ed721a3 comms: homelab 20260726T114051Z 2026-07-26 06:40:51 -05:00
Jarvis eafc455aef comms: homelab 20260726T111054Z 2026-07-26 06:10:54 -05:00
Jarvis 8919e4a899 comms: homelab 20260726T105532Z 2026-07-26 05:55:32 -05:00
Jarvis f02e4770db comms: homelab 20260726T104324Z 2026-07-26 05:43:24 -05:00
Jarvis 2e08eb3f2f comms: homelab 20260726T102505Z 2026-07-26 05:25:05 -05:00
Jarvis 8991aae330 comms: homelab 20260726T100951Z 2026-07-26 05:09:51 -05:00
Jarvis 1834f0e6c7 comms: homelab 20260726T090907Z 2026-07-26 04:09:07 -05:00
Jarvis 3ad65deeb1 comms: homelab 20260726T085420Z 2026-07-26 03:54:20 -05:00
Jarvis 96910e9eaf comms: homelab 20260726T083907Z 2026-07-26 03:39:07 -05:00
Jarvis 73760f1874 comms: homelab 20260726T082414Z 2026-07-26 03:24:14 -05:00
Jarvis 063614583a comms: homelab 20260726T080855Z 2026-07-26 03:08:55 -05:00
Jarvis b039e7f7f1 comms: homelab 20260726T075350Z 2026-07-26 02:53:50 -05:00
Jarvis 21c3042f74 comms: homelab 20260726T073840Z 2026-07-26 02:38:40 -05:00
Jarvis 74b391e642 comms: homelab 20260726T072351Z 2026-07-26 02:23:51 -05:00
Jarvis 6e7de21984 comms: homelab 20260726T070830Z 2026-07-26 02:08:30 -05:00
Jarvis d3467241bc comms: homelab 20260726T065341Z 2026-07-26 01:53:41 -05:00
Jarvis ee3fdaf8fb comms: homelab 20260726T063836Z 2026-07-26 01:38:36 -05:00
Jarvis c916e8ae79 comms: homelab 20260726T062332Z 2026-07-26 01:23:32 -05:00
Jarvis 15be5bd67e comms: homelab 20260726T061138Z 2026-07-26 01:11:38 -05:00
Jarvis af9ffca83a comms: homelab 20260726T055254Z 2026-07-26 00:52:54 -05:00
Jarvis 44dea90d3f comms: homelab 20260726T053742Z 2026-07-26 00:37:42 -05:00
Jarvis 506751decb comms: homelab 20260726T052239Z 2026-07-26 00:22:39 -05:00
Jarvis 6b330df612 comms: homelab 20260726T043720Z 2026-07-25 23:37:20 -05:00
Jarvis 5c39e133c2 comms: homelab 20260726T042222Z 2026-07-25 23:22:22 -05:00
Jarvis 31364a0e3a comms: homelab 20260726T040703Z 2026-07-25 23:07:03 -05:00
Jarvis d92f4f1193 comms: homelab 20260726T035152Z 2026-07-25 22:51:52 -05:00
Jarvis e01f24dd10 comms: homelab 20260726T033639Z 2026-07-25 22:36:39 -05:00
Jarvis 5bbb7c6c5c comms: homelab 20260726T032137Z 2026-07-25 22:21:37 -05:00
wjarvis mos-comms ca24e19443 comms: usc 20260726T025240Z 2026-07-25 21:52:41 -05:00
Jarvis 3345690710 comms: homelab 20260726T025124Z 2026-07-25 21:51:24 -05:00
Jarvis 1b90dc33e4 comms: homelab 20260726T023642Z 2026-07-25 21:36:42 -05:00
Jarvis ca578af5b2 comms: homelab 20260726T022123Z 2026-07-25 21:21:23 -05:00
Jarvis e4f863cebc comms: homelab 20260726T020635Z 2026-07-25 21:06:35 -05:00
Jarvis c2596fc5e1 comms: homelab 20260726T013951Z 2026-07-25 20:39:51 -05:00
Jarvis 4336aafa97 comms: homelab 20260726T012123Z 2026-07-25 20:21:23 -05:00
Jarvis 597d39d76e comms: homelab 20260726T010648Z 2026-07-25 20:06:49 -05:00
Jarvis 2d9cf0e4d1 comms: homelab 20260726T005133Z 2026-07-25 19:51:33 -05:00
Jarvis 5a864a5267 comms: homelab 20260726T003618Z 2026-07-25 19:36:18 -05:00
Jarvis 6a967068f8 comms: homelab 20260726T002043Z 2026-07-25 19:20:43 -05:00
Jarvis e1d14fd76c comms: homelab 20260726T000936Z 2026-07-25 19:09:37 -05:00
wjarvis mos-comms 89b43a33b7 comms: usc 20260726T000747Z 2026-07-25 19:07:48 -05:00
Jarvis 23b036d169 comms: homelab 20260726T000606Z 2026-07-25 19:06:06 -05:00
Jarvis 7c2281ae83 comms: homelab 20260725T235047Z 2026-07-25 18:50:47 -05:00
Jarvis e1434e3e99 comms: homelab 20260725T233547Z 2026-07-25 18:35:47 -05:00
Jarvis 180abbb35c comms: homelab 20260725T232042Z 2026-07-25 18:20:42 -05:00
Jarvis 7362d4c7c9 comms: homelab 20260725T230615Z 2026-07-25 18:06:15 -05:00
Jarvis 6dedf0df40 comms: homelab 20260725T225022Z 2026-07-25 17:50:22 -05:00
Jarvis e1ad3a3a66 comms: homelab 20260725T223512Z 2026-07-25 17:35:12 -05:00
Jarvis f2fc66f652 comms: homelab 20260725T222016Z 2026-07-25 17:20:17 -05:00
Jarvis ee6687d8b9 comms: homelab 20260725T220506Z 2026-07-25 17:05:06 -05:00
Jarvis c9d147f28f comms: homelab 20260725T215002Z 2026-07-25 16:50:02 -05:00
Jarvis f86c4ca16d comms: homelab 20260725T213453Z 2026-07-25 16:34:53 -05:00
Jarvis 2ab267c117 comms: homelab 20260725T212013Z 2026-07-25 16:20:13 -05:00
Jarvis 4998d1d9df comms: homelab 20260725T210552Z 2026-07-25 16:05:52 -05:00
wjarvis mos-comms 0265f1950c comms: usc 20260725T204825Z 2026-07-25 15:48:25 -05:00
wjarvis mos-comms 0475ae2b19 comms: usc 20260725T200924Z 2026-07-25 15:09:24 -05:00
wjarvis mos-comms 713bbaa060 comms: usc 20260725T183232Z 2026-07-25 13:32:33 -05:00
Jarvis 619ed38d01 comms: homelab 20260725T183033Z 2026-07-25 13:30:33 -05:00
wjarvis mos-comms 2adae48830 comms: usc 20260725T182546Z 2026-07-25 13:25:46 -05:00
ms-lead-reviewer b4c2af0969 briefs: heartbeat PACKAGING PLAN Rev 3 — add W-jarvis Gate A (manifest metadata-only, single ownership SSOT) + Gate B (schema range compat) 2026-07-25 13:25:34 -05:00
Jarvis 8a72f5f9f4 comms: homelab 20260725T182226Z 2026-07-25 13:22:27 -05:00
wjarvis mos-comms 89e59f9353 comms: usc 20260725T182026Z 2026-07-25 13:20:26 -05:00
ms-lead-reviewer c043e025a6 briefs: heartbeat-canon PACKAGING PLAN Rev 2 — address W-jarvis review (manifest/version, schema ordering, blank-reset target, fw/op boundaries) 2026-07-25 13:20:10 -05:00
Jarvis 55b4038283 comms: homelab 20260725T181626Z 2026-07-25 13:16:26 -05:00
wjarvis mos-comms bdad50cffd comms: usc 20260725T180916Z 2026-07-25 13:09:16 -05:00
ms-lead-reviewer cd11bbbc52 briefs: heartbeat-canon framework PACKAGING PLAN (MS-LEAD, item-5) — PROPOSED, pending Mos authority 2026-07-25 13:09:02 -05:00
Jarvis 44c05ae0a5 comms: homelab 20260725T180535Z 2026-07-25 13:05:35 -05:00
wjarvis mos-comms 29e98d6da5 comms: usc 20260725T180407Z 2026-07-25 13:04:07 -05:00
Jarvis c44325dcc4 comms: homelab 20260725T175300Z 2026-07-25 12:53:00 -05:00
wjarvis mos-comms a9d4f0c8e2 comms: usc 20260725T175123Z 2026-07-25 12:51:24 -05:00
Jarvis b99797614b comms: homelab 20260725T174829Z 2026-07-25 12:48:29 -05:00
Jarvis 15589cf9a5 comms: homelab 20260725T174638Z 2026-07-25 12:46:38 -05:00
wjarvis mos-comms 4c4f2fe265 comms: usc 20260725T174445Z 2026-07-25 12:44:46 -05:00
Jarvis ff78acc389 comms: homelab 20260725T174119Z 2026-07-25 12:41:20 -05:00
wjarvis mos-comms ed9039a760 comms: usc 20260725T173939Z 2026-07-25 12:39:39 -05:00
Jarvis 4d3e0abd80 comms: homelab 20260725T173738Z 2026-07-25 12:37:39 -05:00
wjarvis mos-comms 3458ae1f0b comms: usc 20260725T173627Z 2026-07-25 12:36:28 -05:00
Jarvis 91c51c93cc comms: homelab 20260725T173325Z 2026-07-25 12:33:26 -05:00
Jarvis bfaf2c2266 comms: homelab 20260725T173201Z 2026-07-25 12:32:01 -05:00
wjarvis mos-comms 3c4e9ace61 comms: usc 20260725T173015Z 2026-07-25 12:30:15 -05:00
Jarvis e96c2ba2de comms: homelab 20260725T173005Z 2026-07-25 12:30:06 -05:00
wjarvis mos-comms 40c836e5b8 comms: usc 20260725T172849Z 2026-07-25 12:28:50 -05:00
Jarvis 4046e2e8d2 comms: homelab 20260725T172436Z 2026-07-25 12:24:36 -05:00
wjarvis mos-comms 85fa0d48d5 comms: usc 20260725T172224Z 2026-07-25 12:22:25 -05:00
Jarvis 094709ca8b comms: homelab 20260725T013224Z 2026-07-24 20:32:24 -05:00
wjarvis mos-comms f0560004c5 comms: usc 20260725T013124Z 2026-07-24 20:31:25 -05:00
Jarvis bd467d6925 comms: homelab 20260725T012643Z 2026-07-24 20:26:43 -05:00
Jarvis d3a3eba636 comms: homelab 20260725T010740Z 2026-07-24 20:07:40 -05:00
wjarvis mos-comms 9883cd6f31 comms: usc 20260725T010612Z 2026-07-24 20:06:17 -05:00
Jarvis 4847d35f31 comms: homelab 20260725T010445Z 2026-07-24 20:04:45 -05:00
wjarvis mos-comms 024d0f00c5 comms: usc 20260725T010346Z 2026-07-24 20:03:52 -05:00
Jarvis 131e8d5d78 comms: homelab 20260725T005606Z 2026-07-24 19:56:06 -05:00
Jarvis 46453c475b comms: homelab 20260725T004609Z 2026-07-24 19:46:09 -05:00
wjarvis mos-comms 7954fb9b0b comms: usc 20260725T004445Z 2026-07-24 19:44:45 -05:00
Jarvis 5f3ab1c25c comms: homelab 20260725T004231Z 2026-07-24 19:42:32 -05:00
wjarvis mos-comms a7d3cb0dbf comms: usc 20260725T004156Z 2026-07-24 19:41:57 -05:00
Jarvis 8e1b229f0f comms: homelab 20260725T004106Z 2026-07-24 19:41:06 -05:00
Jarvis 8a47fb2179 comms: homelab 20260725T003706Z 2026-07-24 19:37:06 -05:00
wjarvis mos-comms 192c7204ad comms: usc 20260725T003526Z 2026-07-24 19:35:26 -05:00
Jarvis 53b90c0ffc comms: homelab 20260724T235833Z 2026-07-24 18:58:33 -05:00
wjarvis mos-comms 23800842a4 comms: usc 20260724T235736Z 2026-07-24 18:57:36 -05:00
Jarvis 0c1f1d84b0 comms: homelab 20260724T234845Z 2026-07-24 18:48:45 -05:00
wjarvis mos-comms 132a3fd969 comms: usc 20260724T234758Z 2026-07-24 18:47:58 -05:00
wjarvis mos-comms 3f93758b81 comms: usc 20260724T032741Z 2026-07-23 22:27:41 -05:00
wjarvis mos-comms 3c489ee778 comms: usc 20260724T002527Z 2026-07-23 19:25:27 -05:00
Jarvis 26b60a1a6c comms: homelab 20260723T235040Z 2026-07-23 18:50:40 -05:00
Jarvis 3df4ccd7c5 comms: homelab 20260723T235039Z 2026-07-23 18:50:39 -05:00
wjarvis mos-comms 9ca26d7988 comms: usc 20260723T234917Z 2026-07-23 18:49:17 -05:00
Jarvis 92e6f18ee3 comms: homelab 20260723T230555Z 2026-07-23 18:05:56 -05:00
wjarvis mos-comms d85565892d comms: usc 20260723T230446Z 2026-07-23 18:04:46 -05:00
Jarvis 22606c930f comms: homelab 20260723T224420Z 2026-07-23 17:44:21 -05:00
wjarvis mos-comms 330dbcd366 comms: usc 20260723T224305Z 2026-07-23 17:43:06 -05:00
wjarvis mos-comms 8257f2a8ec comms: usc 20260723T223319Z 2026-07-23 17:33:19 -05:00
wjarvis mos-comms f74831624d comms: usc 20260723T223240Z 2026-07-23 17:32:40 -05:00
Jarvis 01161e3674 comms: homelab 20260723T222915Z 2026-07-23 17:29:15 -05:00
Jarvis 2248463b7e comms: homelab 20260723T222913Z 2026-07-23 17:29:13 -05:00
Jarvis ce02c26641 comms: homelab 20260723T222437Z 2026-07-23 17:24:37 -05:00
Jarvis 3046c7e2ef comms: homelab 20260723T222435Z 2026-07-23 17:24:35 -05:00
wjarvis mos-comms d3a00c8d5f comms: usc 20260723T222323Z 2026-07-23 17:23:23 -05:00
wjarvis mos-comms b4fc939472 comms: usc 20260723T210042Z 2026-07-23 16:00:42 -05:00
wjarvis mos-comms 4153d962f9 comms: usc 20260723T205919Z 2026-07-23 15:59:19 -05:00
wjarvis mos-comms 8eebbc8902 comms: usc 20260723T203119Z 2026-07-23 15:31:19 -05:00
wjarvis mos-comms e3ac6a940d comms: usc 20260723T195550Z 2026-07-23 14:55:50 -05:00
Jarvis 7438fcc102 comms: homelab 20260723T195310Z 2026-07-23 14:53:10 -05:00
wjarvis mos-comms 2a6c50c6b8 comms: usc 20260723T195124Z 2026-07-23 14:51:24 -05:00
wjarvis mos-comms 853a57c47d comms: usc 20260723T194928Z 2026-07-23 14:49:28 -05:00
Jarvis 985a13fe4b comms: homelab 20260723T194321Z 2026-07-23 14:43:21 -05:00
Jarvis 6f9afca163 comms: homelab 20260723T194319Z 2026-07-23 14:43:20 -05:00
Jarvis 925d8f485e comms: homelab 20260723T191337Z 2026-07-23 14:13:37 -05:00
Jarvis 1ab215d25d comms: homelab 20260723T191336Z 2026-07-23 14:13:36 -05:00
Jarvis e7035e32eb comms: homelab 20260723T185849Z 2026-07-23 13:58:49 -05:00
Jarvis 17ec91dec4 comms: homelab 20260723T185839Z 2026-07-23 13:58:40 -05:00
Jarvis b603a1c608 comms: homelab 20260723T184313Z 2026-07-23 13:43:13 -05:00
Jarvis b2d6afb857 comms: homelab 20260723T184303Z 2026-07-23 13:43:03 -05:00
Jarvis 01cacefd81 comms: homelab 20260723T182831Z 2026-07-23 13:28:31 -05:00
Jarvis c7e40e2722 comms: homelab 20260723T182819Z 2026-07-23 13:28:19 -05:00
Jarvis 44ec1ee4ba comms: homelab 20260723T181303Z 2026-07-23 13:13:03 -05:00
Jarvis 9ed47e0d0c comms: homelab 20260723T181256Z 2026-07-23 13:12:56 -05:00
Jarvis f75e474de3 comms: homelab 20260723T175812Z 2026-07-23 12:58:12 -05:00
Jarvis 287e25393e comms: homelab 20260723T175803Z 2026-07-23 12:58:03 -05:00
Jarvis 95f9df120b comms: homelab 20260723T174338Z 2026-07-23 12:43:38 -05:00
Jarvis 7a5fc174e7 comms: homelab 20260723T174330Z 2026-07-23 12:43:30 -05:00
Jarvis 711d57ba70 comms: homelab 20260723T172740Z 2026-07-23 12:27:40 -05:00
Jarvis fd0f0c38d5 comms: homelab 20260723T172730Z 2026-07-23 12:27:30 -05:00
Jarvis 1f3df1e719 comms: homelab 20260723T171658Z 2026-07-23 12:16:58 -05:00
wjarvis mos-comms 654fa6d11e comms: usc 20260723T171508Z 2026-07-23 12:15:08 -05:00
Jarvis 8d1039a431 comms: homelab 20260723T171400Z 2026-07-23 12:14:00 -05:00
Jarvis 23b4bb700b comms: homelab 20260723T171349Z 2026-07-23 12:13:49 -05:00
Jarvis ad181d72e4 comms: homelab 20260723T165820Z 2026-07-23 11:58:20 -05:00
Jarvis 7875b71806 comms: homelab 20260723T165801Z 2026-07-23 11:58:01 -05:00
Jarvis eb09c01d85 comms: homelab 20260722T194433Z 2026-07-22 14:44:33 -05:00
Jarvis 25f7c8101b comms: homelab 20260722T193005Z 2026-07-22 14:30:06 -05:00
wjarvis mos-comms 1b6d6ffad8 comms: usc 20260722T191736Z 2026-07-22 14:17:36 -05:00
Jarvis 65d219350f comms: homelab 20260722T191432Z 2026-07-22 14:14:32 -05:00
wjarvis mos-comms 41a379c381 comms: usc 20260722T190150Z 2026-07-22 14:01:50 -05:00
Jarvis 23bd7e57d6 comms: homelab 20260722T190059Z 2026-07-22 14:00:59 -05:00
wjarvis mos-comms 4fa2ca6112 comms: usc 20260722T184813Z 2026-07-22 13:48:14 -05:00
Jarvis 7f79a3ad59 comms: homelab 20260722T184617Z 2026-07-22 13:46:17 -05:00
Jarvis 94eed819f5 comms: homelab 20260722T184543Z 2026-07-22 13:45:43 -05:00
wjarvis mos-comms 74a655f6f8 comms: usc 20260722T170420Z 2026-07-22 12:04:21 -05:00
wjarvis mos-comms a96a333c01 comms: usc 20260722T084427Z 2026-07-22 03:44:27 -05:00
Jarvis 8546fd4f04 comms: homelab 20260722T084137Z 2026-07-22 03:41:37 -05:00
wjarvis mos-comms 3b6278e09d comms: usc 20260722T081132Z 2026-07-22 03:11:33 -05:00
Jarvis 8176af89a4 comms: homelab 20260722T080237Z 2026-07-22 03:02:37 -05:00
wjarvis mos-comms 59a313cbe4 comms: usc 20260722T080151Z 2026-07-22 03:01:52 -05:00
Jarvis 0aa8cac23d comms: homelab 20260722T075800Z 2026-07-22 02:58:00 -05:00
wjarvis mos-comms a9d7e474f9 comms: usc 20260722T072817Z 2026-07-22 02:28:18 -05:00
Jarvis 8ac9a5f681 comms: homelab 20260722T065247Z 2026-07-22 01:52:48 -05:00
wjarvis mos-comms 2b364c8f1a comms: usc 20260722T065059Z 2026-07-22 01:50:59 -05:00
Jarvis 284f74d1e7 comms: homelab 20260722T064810Z 2026-07-22 01:48:10 -05:00
Jarvis 7e5d36902e comms: homelab 20260722T062936Z 2026-07-22 01:29:37 -05:00
wjarvis mos-comms f996bd5208 comms: usc 20260722T062605Z 2026-07-22 01:26:05 -05:00
wjarvis mos-comms 527f2ca7e3 comms: usc 20260722T060123Z 2026-07-22 01:01:24 -05:00
Jarvis eebedad810 comms: homelab 20260722T055755Z 2026-07-22 00:57:55 -05:00
Jarvis f7b42e1667 comms: homelab 20260722T054706Z 2026-07-22 00:47:07 -05:00
wjarvis mos-comms 57f3facaaa comms: usc 20260722T054305Z 2026-07-22 00:43:05 -05:00
wjarvis mos-comms 79e7efee47 comms: usc 20260722T052506Z 2026-07-22 00:25:06 -05:00
Jarvis 1a6f79b9cf comms: homelab 20260722T052113Z 2026-07-22 00:21:13 -05:00
Jarvis 17c3c84302 comms: homelab 20260722T051543Z 2026-07-22 00:15:43 -05:00
Jarvis 9edb16456a comms: homelab 20260722T051121Z 2026-07-22 00:11:22 -05:00
wjarvis mos-comms 62c967bb4f comms: usc 20260722T050835Z 2026-07-22 00:08:35 -05:00
wjarvis mos-comms 19fc2aaa83 comms: usc 20260722T041922Z 2026-07-21 23:19:22 -05:00
Jarvis 25e3438a15 comms: homelab 20260722T041710Z 2026-07-21 23:17:10 -05:00
Jarvis 6ffe38369e comms: homelab 20260722T040703Z 2026-07-21 23:07:04 -05:00
wjarvis mos-comms a73cb190f2 comms: usc 20260722T040433Z 2026-07-21 23:04:33 -05:00
wjarvis mos-comms 9757c9024a comms: usc 20260722T033246Z 2026-07-21 22:32:46 -05:00
wjarvis mos-comms 267436c4c4 comms: usc 20260722T033204Z 2026-07-21 22:32:05 -05:00
Jarvis d6fcb2dbbf comms: homelab 20260722T033125Z 2026-07-21 22:31:25 -05:00
Jarvis 0b0e2faf86 comms: homelab 20260722T032750Z 2026-07-21 22:27:50 -05:00
wjarvis mos-comms c60ea6b380 comms: usc 20260722T032435Z 2026-07-21 22:24:36 -05:00
Jarvis 3b2fdad204 comms: homelab 20260722T032230Z 2026-07-21 22:22:30 -05:00
wjarvis mos-comms 203a94d90c comms: usc 20260722T030500Z 2026-07-21 22:05:00 -05:00
wjarvis mos-comms 6412522c63 comms: usc 20260722T025318Z 2026-07-21 21:53:18 -05:00
wjarvis mos-comms 337de41157 comms: usc 20260722T023242Z 2026-07-21 21:32:42 -05:00
Jarvis f428eff373 comms: homelab 20260722T023043Z 2026-07-21 21:30:43 -05:00
wjarvis mos-comms ca6d3d6cc0 comms: usc 20260722T015336Z 2026-07-21 20:53:36 -05:00
wjarvis mos-comms ec7dd41448 comms: usc 20260722T012734Z 2026-07-21 20:27:34 -05:00
Jarvis ad52e7c4bb comms: homelab 20260722T012617Z 2026-07-21 20:26:18 -05:00
wjarvis mos-comms b44f5e0d88 comms: usc 20260722T012059Z 2026-07-21 20:20:59 -05:00
wjarvis mos-comms 29789df372 comms: usc 20260722T011048Z 2026-07-21 20:10:48 -05:00
wjarvis mos-comms 2e0171a205 comms: usc 20260722T005605Z 2026-07-21 19:56:05 -05:00
wjarvis mos-comms 5603e5f41a comms: usc 20260722T005042Z 2026-07-21 19:50:42 -05:00
wjarvis mos-comms cdf6b02614 comms: usc 20260722T001551Z 2026-07-21 19:15:51 -05:00
Jarvis 09de0904ca comms: homelab 20260722T001353Z 2026-07-21 19:13:53 -05:00
wjarvis mos-comms 807b369b9b comms: usc 20260722T000540Z 2026-07-21 19:05:40 -05:00
wjarvis mos-comms f3c6817ccb comms: usc 20260721T235939Z 2026-07-21 18:59:39 -05:00
wjarvis mos-comms f74bd8e677 comms: usc 20260721T235935Z 2026-07-21 18:59:35 -05:00
Jarvis 408764c237 comms: homelab 20260721T235545Z 2026-07-21 18:55:45 -05:00
wjarvis mos-comms 3a3adb6b71 comms: usc 20260721T235452Z 2026-07-21 18:54:52 -05:00
wjarvis mos-comms dff17525c9 comms: usc 20260721T235415Z 2026-07-21 18:54:16 -05:00
Jarvis 0993cf67e9 comms: homelab 20260721T235305Z 2026-07-21 18:53:06 -05:00
wjarvis mos-comms d33d6ec911 comms: usc 20260721T235118Z 2026-07-21 18:51:18 -05:00
wjarvis mos-comms cb1775cf56 comms: usc 20260721T235005Z 2026-07-21 18:50:06 -05:00
Jarvis 245c1019e1 comms: homelab 20260721T234835Z 2026-07-21 18:48:36 -05:00
wjarvis mos-comms caed94e522 comms: usc 20260721T234732Z 2026-07-21 18:47:32 -05:00
wjarvis mos-comms 7aed068f68 comms: usc 20260721T232306Z 2026-07-21 18:23:06 -05:00
wjarvis mos-comms 64a300e68a comms: usc 20260721T231337Z 2026-07-21 18:13:37 -05:00
Jarvis a647bce678 comms: homelab 20260721T231053Z 2026-07-21 18:10:53 -05:00
wjarvis mos-comms cfa5810e59 comms: usc 20260721T223214Z 2026-07-21 17:32:14 -05:00
wjarvis mos-comms 5f204934de comms: usc 20260721T220716Z 2026-07-21 17:07:16 -05:00
Jarvis 802ef7f033 comms: homelab 20260721T220621Z 2026-07-21 17:06:21 -05:00
wjarvis mos-comms c2c25f45b5 comms: usc 20260721T220515Z 2026-07-21 17:05:15 -05:00
Jarvis 09e167fc0c comms: homelab 20260721T220356Z 2026-07-21 17:03:56 -05:00
Jarvis e09887427d comms: homelab 20260721T215824Z 2026-07-21 16:58:24 -05:00
wjarvis mos-comms 7251b1cced comms: usc 20260721T215708Z 2026-07-21 16:57:08 -05:00
wjarvis mos-comms f93c14b646 comms: usc 20260721T215706Z 2026-07-21 16:57:06 -05:00
Jarvis 4afa572aef comms: homelab 20260721T215452Z 2026-07-21 16:54:52 -05:00
wjarvis mos-comms 68d672b631 comms: usc 20260721T214857Z 2026-07-21 16:48:57 -05:00
Jarvis e386525d19 comms: homelab 20260721T214713Z 2026-07-21 16:47:13 -05:00
Jarvis b720270505 comms: homelab 20260721T214219Z 2026-07-21 16:42:19 -05:00
wjarvis mos-comms ed752a08d5 comms: usc 20260721T213915Z 2026-07-21 16:39:33 -05:00
Jarvis f52e721f29 comms: homelab 20260721T213759Z 2026-07-21 16:38:00 -05:00
wjarvis mos-comms a7173d1c33 comms: usc 20260721T213558Z 2026-07-21 16:35:58 -05:00
wjarvis mos-comms e32b5ef561 comms: usc 20260721T213030Z 2026-07-21 16:30:30 -05:00
wjarvis mos-comms 9070c9d6b0 comms: usc 20260721T201551Z 2026-07-21 15:15:51 -05:00
wjarvis mos-comms cf8ec13e57 comms: usc 20260721T191940Z 2026-07-21 14:19:40 -05:00
wjarvis mos-comms e07675ae07 comms: usc 20260721T191935Z 2026-07-21 14:19:36 -05:00
Jarvis 682fc820ee comms: homelab 20260721T191639Z 2026-07-21 14:16:40 -05:00
wjarvis mos-comms b9f5c9f679 comms: usc 20260721T184546Z 2026-07-21 13:45:46 -05:00
Jarvis 93f012bdcf comms: homelab 20260721T184447Z 2026-07-21 13:44:48 -05:00
wjarvis mos-comms 40e5b8bbd8 comms: usc 20260721T183050Z 2026-07-21 13:30:50 -05:00
Jarvis df6a24e0b8 comms: homelab 20260721T182845Z 2026-07-21 13:28:45 -05:00
wjarvis mos-comms 2ae6d1f1bc comms: usc 20260721T182443Z 2026-07-21 13:24:43 -05:00
Jarvis d08106bd35 comms: homelab 20260721T175405Z 2026-07-21 12:54:05 -05:00
wjarvis mos-comms 52830a684c comms: usc 20260721T175245Z 2026-07-21 12:52:45 -05:00
Jarvis d4b16b004e comms: homelab 20260721T175101Z 2026-07-21 12:51:01 -05:00
wjarvis mos-comms af7fba2d34 comms: usc 20260721T174946Z 2026-07-21 12:49:46 -05:00
Jarvis c9222d5b56 comms: homelab 20260721T174817Z 2026-07-21 12:48:17 -05:00
wjarvis mos-comms 5d384bdf85 comms: usc 20260721T174343Z 2026-07-21 12:43:44 -05:00
Jarvis ba5006f7ef comms: homelab 20260721T174119Z 2026-07-21 12:41:19 -05:00
Jarvis bf7115aefa comms: homelab 20260721T174013Z 2026-07-21 12:40:13 -05:00
Jarvis 4b9ffbf5ea comms: homelab 20260721T170709Z 2026-07-21 12:07:09 -05:00
wjarvis mos-comms ed0c7da520 comms: usc 20260721T170324Z 2026-07-21 12:03:25 -05:00
Jarvis 667469e188 comms: homelab 20260721T170229Z 2026-07-21 12:02:30 -05:00
wjarvis mos-comms 340ea30930 comms: usc 20260721T170058Z 2026-07-21 12:00:58 -05:00
wjarvis mos-comms fad03b0e5d comms: usc 20260721T165755Z 2026-07-21 11:57:56 -05:00
Jarvis 7b71961ea1 comms: homelab 20260721T021353Z 2026-07-20 21:13:53 -05:00
wjarvis mos-comms 613ee3781f comms: usc 20260721T021317Z 2026-07-20 21:13:18 -05:00
Jarvis e67e6f4eac comms: homelab 20260721T012527Z 2026-07-20 20:25:27 -05:00
Jarvis 4e499d7f33 comms: homelab 20260721T005704Z 2026-07-20 19:57:04 -05:00
wjarvis mos-comms 3b6ebe6f9c comms: usc 20260721T005609Z 2026-07-20 19:56:10 -05:00
Jarvis 3dd0acb3d9 comms: homelab 20260721T005436Z 2026-07-20 19:54:36 -05:00
Jarvis cad5eac09f comms: homelab 20260720T232727Z 2026-07-20 18:27:27 -05:00
wjarvis mos-comms dcffa90a7a comms: usc 20260720T232506Z 2026-07-20 18:25:07 -05:00
Jarvis 2879036c64 comms: homelab 20260720T232309Z 2026-07-20 18:23:09 -05:00
wjarvis mos-comms 7bc7565559 comms: usc 20260720T231034Z 2026-07-20 18:10:35 -05:00
Jarvis 93785d4a12 comms: homelab 20260720T230903Z 2026-07-20 18:09:04 -05:00
wjarvis mos-comms bdce45de0a comms: usc 20260720T223931Z 2026-07-20 17:39:31 -05:00
wjarvis mos-comms 8329e9c9a5 from-mos: KBN rc.19 STOP-FINAL ruling + Jason escalation 2026-07-20 17:38:40 -05:00
wjarvis mos-comms de52ebf586 comms: usc 20260720T223109Z 2026-07-20 17:31:09 -05:00
Jarvis 274c9d9f06 comms: homelab 20260720T222947Z 2026-07-20 17:29:47 -05:00
wjarvis mos-comms 2d5eb2e1a2 comms: usc 20260720T222809Z 2026-07-20 17:28:09 -05:00
Jarvis 782a52c239 comms: homelab 20260720T222702Z 2026-07-20 17:27:02 -05:00
Jarvis 6955e3eef1 comms: homelab 20260720T220821Z 2026-07-20 17:08:21 -05:00
wjarvis mos-comms cd7c65044e comms: usc 20260720T220502Z 2026-07-20 17:05:02 -05:00
Jarvis c76c2f1445 comms: homelab 20260720T220425Z 2026-07-20 17:04:26 -05:00
wjarvis mos-comms d00d0b9ad4 comms: usc 20260720T220142Z 2026-07-20 17:01:42 -05:00
wjarvis mos-comms fa32460f12 comms: usc 20260720T220027Z 2026-07-20 17:00:27 -05:00
wjarvis mos-comms 6dd5fb9c51 comms: usc 20260720T220018Z 2026-07-20 17:00:18 -05:00
wjarvis mos-comms bae6370eb9 mos: rc.19 re-gate authorized — MS-LEAD route Gate A re-review + Gate B red-team, author!=reviewer 2026-07-20 16:59:46 -05:00
Jarvis 1214e50186 comms: homelab 20260720T215753Z 2026-07-20 16:57:54 -05:00
wjarvis mos-comms 0dca729870 comms: usc 20260720T215703Z 2026-07-20 16:57:03 -05:00
Jarvis 71964563d6 comms: homelab 20260720T212302Z 2026-07-20 16:23:02 -05:00
wjarvis mos-comms 507e97384d comms: usc 20260720T212108Z 2026-07-20 16:21:08 -05:00
Jarvis 6ec5cc3a48 comms: homelab 20260720T212051Z 2026-07-20 16:20:51 -05:00
wjarvis mos-comms 5417838ec2 mos: KBN rc.18→rc.19 ruling (continue; 5 in-envelope residuals; tightened 2-round within-class stop-condition) 2026-07-20 16:19:37 -05:00
wjarvis mos-comms 141b7f2587 comms: usc 20260720T211154Z 2026-07-20 16:11:54 -05:00
wjarvis mos-comms b3a7960200 comms: usc 20260720T204036Z 2026-07-20 15:40:36 -05:00
Jarvis db13762a44 comms: homelab 20260720T204004Z 2026-07-20 15:40:04 -05:00
wjarvis mos-comms 8d9d5c7e9b comms: usc 20260720T202437Z 2026-07-20 15:24:37 -05:00
wjarvis mos-comms e103c4d308 comms: usc 20260720T202424Z 2026-07-20 15:24:24 -05:00
Jarvis 2c692e150d comms: homelab 20260720T202221Z 2026-07-20 15:22:21 -05:00
Jarvis 36d7173493 comms: homelab 20260720T195743Z 2026-07-20 14:57:43 -05:00
wjarvis mos-comms 9825024d8d comms: usc 20260720T195415Z 2026-07-20 14:54:15 -05:00
Jarvis 9237a19e57 comms: homelab 20260720T195324Z 2026-07-20 14:53:25 -05:00
wjarvis mos-comms 853fc42b02 from-mos: rc.18 wider-amendment ruling (B1 status-writer completeness + B2 migrator identity + PLAN majors; route sol; re-gate fresh; convergence stop-condition) 2026-07-20 14:51:52 -05:00
wjarvis mos-comms 3536c8b70b comms: usc 20260720T194117Z 2026-07-20 14:41:17 -05:00
Jarvis 8af85e045a comms: homelab 20260720T194016Z 2026-07-20 14:40:16 -05:00
wjarvis mos-comms 18b60e02d9 comms: usc 20260720T193916Z 2026-07-20 14:39:16 -05:00
wjarvis mos-comms 54a599057b mos: rc.17 re-review NO-GO ACK — hold rc.18 authoring for combined verdict; A-1 migrate-tier.ts writer leak noted 2026-07-20 14:38:54 -05:00
Jarvis ae46a91098 comms: homelab 20260720T193749Z 2026-07-20 14:37:49 -05:00
Jarvis 4282c54ea6 comms: homelab 20260720T193426Z 2026-07-20 14:34:27 -05:00
wjarvis mos-comms dda13f3d4e comms: usc 20260720T192520Z 2026-07-20 14:25:20 -05:00
wjarvis mos-comms acdd7efb39 comms: usc 20260720T192501Z 2026-07-20 14:25:01 -05:00
wjarvis mos-comms bd5688cded comms: usc 20260720T192457Z 2026-07-20 14:24:57 -05:00
Jarvis 1baa7d23e0 comms: homelab 20260720T192208Z 2026-07-20 14:22:08 -05:00
Jarvis c9831c8546 comms: homelab 20260720T190516Z 2026-07-20 14:05:17 -05:00
wjarvis mos-comms 66cd0586c8 comms: usc 20260720T190238Z 2026-07-20 14:02:39 -05:00
wjarvis mos-comms a8da84b5da comms: usc 20260720T190215Z 2026-07-20 14:02:15 -05:00
Jarvis 8952876247 comms: homelab 20260720T185955Z 2026-07-20 13:59:55 -05:00
wjarvis mos-comms 34ef620a39 mos: KBN both-gates NO-GO ruling — authorize scoped rc.16->rc.17 amendment (A-1 writer-owner, A-2 container surface) + re-gate 2026-07-20 13:59:19 -05:00
wjarvis mos-comms 7bba4ac906 comms: usc 20260720T185704Z 2026-07-20 13:57:04 -05:00
Jarvis ad67baf8b2 comms: homelab 20260720T185556Z 2026-07-20 13:55:56 -05:00
wjarvis mos-comms 5147ddfe95 comms: usc 20260720T184029Z 2026-07-20 13:40:29 -05:00
Jarvis 8a6296972f comms: homelab 20260720T184005Z 2026-07-20 13:40:05 -05:00
wjarvis mos-comms aef8f91eb6 mos: authorize fresh gpt-sol red-team + gpt-terra-HIGH re-review targets, bounded fleet-add exception; note 2 Claude roles capacity-stranded 2026-07-20 13:39:32 -05:00
wjarvis mos-comms 5276e4cbb8 comms: usc 20260720T183926Z 2026-07-20 13:39:26 -05:00
wjarvis mos-comms 98efdaf8eb comms: usc 20260720T183851Z 2026-07-20 13:38:52 -05:00
Jarvis bd69328270 comms: homelab 20260720T183831Z 2026-07-20 13:38:31 -05:00
wjarvis mos-comms 3f6eaf50b9 comms: usc 20260720T183231Z 2026-07-20 13:32:31 -05:00
wjarvis mos-comms 4d08a58325 comms: usc 20260720T183226Z 2026-07-20 13:32:26 -05:00
wjarvis mos-comms 5023619549 comms: usc 20260720T183221Z 2026-07-20 13:32:22 -05:00
Jarvis 269fa5149b comms: homelab 20260720T183156Z 2026-07-20 13:31:56 -05:00
wjarvis mos-comms 1a86bbf12e mos: KBN rulings — accept sol artifact, own rc.16 re-review gate, T3 stop-escalate rule, opus-capacity fallback to gpt-sol 2026-07-20 13:29:48 -05:00
wjarvis mos-comms 8600a60f9a comms: usc 20260720T182327Z 2026-07-20 13:23:27 -05:00
Jarvis 38b1255469 comms: homelab 20260720T182119Z 2026-07-20 13:21:19 -05:00
Jarvis 0567395c5e comms: homelab 20260720T181244Z 2026-07-20 13:12:44 -05:00
Jarvis 8d6a9f9899 comms: homelab 20260720T181227Z 2026-07-20 13:12:28 -05:00
wjarvis mos-comms 57684364c6 comms: usc 20260720T181149Z 2026-07-20 13:11:50 -05:00
Jarvis b737a5d84e comms: homelab 20260720T181119Z 2026-07-20 13:11:19 -05:00
wjarvis mos-comms 5fb9a5298c mos→all: CORRECT model tier legend — sol/terra/luna are GPT-codex tiers, opus/sonnet map = capability equivalence (supersedes 175840Z) 2026-07-20 13:08:03 -05:00
Jarvis 2a3a1d11c1 comms: homelab 20260720T180025Z 2026-07-20 13:00:25 -05:00
wjarvis mos-comms b464fd3599 comms: usc 20260720T175844Z 2026-07-20 12:58:45 -05:00
wjarvis mos-comms 021ecd2a6e mos→all: authoritative model tier legend (sol=opus/fable, terra=sonnet, luna=sonnet/haiku) 2026-07-20 12:58:40 -05:00
wjarvis mos-comms ad85ee9bda mos: KBN planner correction — stand down terra, decomposition→planner-sol (reconcile off parked FCM), opus red-team unchanged 2026-07-20 12:57:17 -05:00
Jarvis 26131c1086 comms: homelab 20260720T175203Z 2026-07-20 12:52:03 -05:00
wjarvis mos-comms 60d2c8907b comms: usc 20260720T175137Z 2026-07-20 12:51:37 -05:00
wjarvis mos-comms 30d52781e7 comms: usc 20260720T175047Z 2026-07-20 12:50:47 -05:00
Jarvis e433fd2cc7 comms: homelab 20260720T175025Z 2026-07-20 12:50:25 -05:00
wjarvis mos-comms ed9d2d8e3d comms: usc 20260720T174137Z 2026-07-20 12:41:37 -05:00
Jarvis f473c71fb6 comms: homelab 20260720T174054Z 2026-07-20 12:40:54 -05:00
wjarvis mos-comms a0308a1d1c mos: KBN dispatch GO — name W-jarvis send-executor (dispatch-only), switch planner-sol→planner-terra (FCM collision) 2026-07-20 12:38:25 -05:00
wjarvis mos-comms 923f421e09 comms: usc 20260720T173735Z 2026-07-20 12:37:35 -05:00
Jarvis ee8129ba26 comms: homelab 20260720T173605Z 2026-07-20 12:36:05 -05:00
wjarvis mos-comms 73abcbffb2 comms: usc 20260720T173334Z 2026-07-20 12:33:35 -05:00
Jarvis 7142bd105a comms: homelab 20260720T173236Z 2026-07-20 12:32:36 -05:00
wjarvis mos-comms b1d8a69a75 comms: usc 20260720T173123Z 2026-07-20 12:31:23 -05:00
Jarvis 3316be4abd comms: homelab 20260720T172938Z 2026-07-20 12:29:38 -05:00
Jarvis 5d83020bb5 comms: homelab 20260720T172831Z 2026-07-20 12:28:31 -05:00
wjarvis mos-comms 5de3c702a9 mos→MS-LEAD: KBN fleet-launch GO (reuse managed roster agents, rc.16, red-team before fanout) 2026-07-20 12:28:19 -05:00
wjarvis mos-comms 963731b591 comms: usc 20260720T172645Z 2026-07-20 12:26:45 -05:00
Jarvis 572bcb5786 comms: homelab 20260720T172554Z 2026-07-20 12:25:54 -05:00
wjarvis mos-comms d57398bdb7 comms: usc 20260720T172341Z 2026-07-20 12:23:41 -05:00
wjarvis mos-comms 27e332701e mos→all: model rebalance (Claude=orch/enhance/adv-plan, GPT=code/review+secrev; Opus unblocked; GPT 58%) 2026-07-20 12:18:58 -05:00
Jarvis 54efe61e1e comms: homelab 20260720T171838Z 2026-07-20 12:18:38 -05:00
wjarvis mos-comms 9bb9515709 comms: usc 20260720T171723Z 2026-07-20 12:17:23 -05:00
wjarvis mos-comms 503a7f5636 mos→usc: KBN native-kanban migration mission (Jason pivot, get off Hermes) 2026-07-20 12:10:58 -05:00
wjarvis mos-comms 4c8e2c2500 mos: concur hold #823 on cost directive; #1 pull for Jul-23 window 2026-07-20 05:55:59 -05:00
Jarvis 8ea3a6dcf0 comms: homelab 20260720T104948Z 2026-07-20 05:49:49 -05:00
wjarvis mos-comms 156a591312 comms: usc 20260720T104912Z 2026-07-20 05:49:13 -05:00
Jarvis c6b5c4decb comms: homelab 20260720T104759Z 2026-07-20 05:47:59 -05:00
wjarvis mos-comms 497e7843fb mos: record #856/858 terminal-complete; park-window chain complete; lane clear 2026-07-20 05:46:31 -05:00
Jarvis 3650db94f9 comms: homelab 20260720T104406Z 2026-07-20 05:44:06 -05:00
wjarvis mos-comms e7d4ad7f9b comms: usc 20260720T104118Z 2026-07-20 05:41:18 -05:00
wjarvis mos-comms 9f5c4116ca comms: usc 20260720T103446Z 2026-07-20 05:34:46 -05:00
wjarvis mos-comms cb15b61a0c mos: PR#861/#860 MERGED (squash b0d78d86, closed); #850/#859 terminal-complete confirmed; main->b0d78d86 2026-07-20 05:33:19 -05:00
Jarvis 459982a0bd comms: homelab 20260720T103122Z 2026-07-20 05:31:22 -05:00
wjarvis mos-comms 3ead3bf817 comms: usc 20260720T103012Z 2026-07-20 05:30:12 -05:00
wjarvis mos-comms a0aa10b833 comms: usc 20260720T102821Z 2026-07-20 05:28:22 -05:00
Jarvis e003b9526c comms: homelab 20260720T102549Z 2026-07-20 05:25:50 -05:00
wjarvis mos-comms 3fbde983d1 comms: usc 20260720T102545Z 2026-07-20 05:25:45 -05:00
wjarvis mos-comms 7ced8dbde2 comms: usc 20260720T102512Z 2026-07-20 05:25:12 -05:00
Jarvis 23fadc6f7a comms: homelab 20260720T102402Z 2026-07-20 05:24:02 -05:00
wjarvis mos-comms 4a577fe432 comms: usc 20260720T102215Z 2026-07-20 05:22:15 -05:00
Jarvis f402a0945f comms: homelab 20260720T101638Z 2026-07-20 05:16:39 -05:00
wjarvis mos-comms 43e55b0856 comms: usc 20260720T101600Z 2026-07-20 05:16:00 -05:00
Jarvis b22da62029 comms: homelab 20260720T101445Z 2026-07-20 05:14:46 -05:00
wjarvis mos-comms 1b5413619d mos: PR#859/#850 MERGED (squash 344d86a6), #850 closed, main->344d86a6 2026-07-20 05:13:57 -05:00
wjarvis mos-comms e3eeeca2d1 comms: usc 20260720T100855Z 2026-07-20 05:08:56 -05:00
Jarvis 675ae3e921 comms: homelab 20260720T100705Z 2026-07-20 05:07:05 -05:00
Jarvis 7e19e285bd comms: homelab 20260720T100602Z 2026-07-20 05:06:03 -05:00
wjarvis mos-comms b60dffd3ac comms: usc 20260720T100555Z 2026-07-20 05:05:55 -05:00
wjarvis mos-comms dc202a1486 comms: usc 20260720T100429Z 2026-07-20 05:04:30 -05:00
Jarvis f62950762b comms: homelab 20260720T100334Z 2026-07-20 05:03:35 -05:00
wjarvis mos-comms 3b84ca2760 mos: authorize #1945 flake-fix repair lane (#856/858 completion); classification accepted, contract upheld 2026-07-20 05:03:02 -05:00
Jarvis 7141d5ee8e comms: homelab 20260720T100148Z 2026-07-20 05:01:48 -05:00
wjarvis mos-comms fbdbba1e78 comms: usc 20260720T100115Z 2026-07-20 05:01:15 -05:00
Jarvis 9fafaafbaa comms: homelab 20260720T095945Z 2026-07-20 04:59:45 -05:00
wjarvis mos-comms a599fbfbd7 comms: usc 20260720T095755Z 2026-07-20 04:57:56 -05:00
Jarvis 343ccf6ee1 comms: homelab 20260720T095445Z 2026-07-20 04:54:46 -05:00
wjarvis mos-comms ce7a6edace comms: usc 20260720T095439Z 2026-07-20 04:54:39 -05:00
wjarvis mos-comms 9d76f21e47 comms: usc 20260720T094846Z 2026-07-20 04:48:47 -05:00
wjarvis mos-comms 01b5ddb503 comms: usc 20260720T094831Z 2026-07-20 04:48:31 -05:00
Jarvis f2a5b980ee comms: homelab 20260720T094758Z 2026-07-20 04:47:58 -05:00
Jarvis 93199b8524 comms: homelab 20260720T094233Z 2026-07-20 04:42:33 -05:00
wjarvis mos-comms fdf2a845d9 comms: usc 20260720T094134Z 2026-07-20 04:41:35 -05:00
Jarvis 4ac072a390 comms: homelab 20260720T094107Z 2026-07-20 04:41:07 -05:00
wjarvis mos-comms 7bc4ceaeb5 mos: #858 MERGED (squash acd7d380 on main), executor=Mos (prov 18387), #856 CLOSED; #857 terminal-complete (#1944 green); #850 in flight 2026-07-20 04:38:59 -05:00
Jarvis d6ed51f763 comms: homelab 20260720T093526Z 2026-07-20 04:35:27 -05:00
wjarvis mos-comms 6e9346e3ad comms: usc 20260720T093341Z 2026-07-20 04:33:41 -05:00
Jarvis 79af5f4175 comms: homelab 20260720T093207Z 2026-07-20 04:32:08 -05:00
wjarvis mos-comms 00862a7a18 comms: usc 20260720T093108Z 2026-07-20 04:31:08 -05:00
Jarvis 5b6755bc16 comms: homelab 20260720T092722Z 2026-07-20 04:27:22 -05:00
wjarvis mos-comms 8e494da4e5 comms: usc 20260720T092439Z 2026-07-20 04:24:39 -05:00
Jarvis 56e3f34551 comms: homelab 20260720T092343Z 2026-07-20 04:23:43 -05:00
Jarvis 87c4fcba27 comms: homelab 20260720T092324Z 2026-07-20 04:23:25 -05:00
wjarvis mos-comms 4069d8db35 comms: usc 20260720T092254Z 2026-07-20 04:22:54 -05:00
wjarvis mos-comms 2df55629af mos: #857 MERGED (squash 3b70c66c on main), executor=Mos (prov 18375), #835 CLOSED — clean completion; #856 continues, relay for clearance 2026-07-20 04:20:35 -05:00
wjarvis mos-comms aa66f72052 comms: usc 20260720T092020Z 2026-07-20 04:20:20 -05:00
wjarvis mos-comms fcdcff1a76 comms: usc 20260720T091804Z 2026-07-20 04:18:04 -05:00
Jarvis ca4ac53158 comms: homelab 20260720T091633Z 2026-07-20 04:16:34 -05:00
wjarvis mos-comms 5b244ac0ac comms: usc 20260720T091521Z 2026-07-20 04:15:21 -05:00
wjarvis mos-comms 959cf873e3 mos: (repost) lock #857 named-executor clearance contract (CI-1942 terminal-green + durable exact-head RoR @2e8e8aa8 + Closes #835 + 6-check); concur #856 shape, deployment-timing stays mos 2026-07-20 04:14:02 -05:00
wjarvis mos-comms 6b7fd89614 comms: usc 20260720T091339Z 2026-07-20 04:13:39 -05:00
Jarvis 66c65a4b98 comms: homelab 20260720T091040Z 2026-07-20 04:10:41 -05:00
wjarvis mos-comms 0b3329aba1 mos: lock #857 named-executor clearance contract (CI-1942 terminal-green + durable exact-head RoR @2e8e8aa8 + Closes #835 + 6-check); concur #856 approach shape, deployment-timing stays mos 2026-07-20 04:10:14 -05:00
Jarvis d5631b9d5c comms: homelab 20260720T090811Z 2026-07-20 04:08:11 -05:00
wjarvis mos-comms 5bc7b05051 comms: usc 20260720T090248Z 2026-07-20 04:02:48 -05:00
Jarvis 5844ea9f4f comms: homelab 20260720T085948Z 2026-07-20 03:59:48 -05:00
wjarvis mos-comms 4dc85ad4b5 mos: route #856 (worktree-deps, 89% errors, false-red gates) TOP park-window priority to MS-LEAD (approach-1 bootstrap install + approach-2 preflight defense, deployment-care seam); ack #841 2nd sighting + footgun hygiene + disk/ #72 carries 2026-07-20 03:59:07 -05:00
Jarvis aa5b097579 comms: homelab 20260720T085057Z 2026-07-20 03:50:57 -05:00
wjarvis mos-comms 803642abb0 comms: usc 20260720T084835Z 2026-07-20 03:48:36 -05:00
Jarvis f5507b209e comms: homelab 20260720T084604Z 2026-07-20 03:46:05 -05:00
wjarvis mos-comms 5f0a2915e6 comms: usc 20260720T084538Z 2026-07-20 03:45:38 -05:00
wjarvis mos-comms 63c61ba792 mos: SSOT topology mapped (federated lane-boards, no split-brain); authorize park-window non-Opus work — MS-LEAD file wrapper-provenance issue + pull one of #835/#850 into flight (author!=builder, named-executor merge) 2026-07-20 03:45:38 -05:00
Jarvis f2d91321ae comms: homelab 20260720T084507Z 2026-07-20 03:45:07 -05:00
wjarvis mos-comms a57ca90fc9 comms: usc 20260720T084354Z 2026-07-20 03:43:55 -05:00
Jarvis 19afc19f1c comms: homelab 20260720T083922Z 2026-07-20 03:39:22 -05:00
wjarvis mos-comms cf3a9b81ed comms: usc 20260720T083544Z 2026-07-20 03:35:45 -05:00
Jarvis 3fe959eeb4 comms: homelab 20260720T083440Z 2026-07-20 03:34:40 -05:00
wjarvis mos-comms 8c6625f93e mos: RULE Option B on roster-v2 contract collision — #854 authoritative, close #794 as SUPERSEDED-BY-#854 (preserve PR793 provenance, state reversal rationale, bidirectional cross-link); no ad-hoc labels; FILE+PARK stands 2026-07-20 03:33:52 -05:00
wjarvis mos-comms 5cfb07289e comms: usc 20260720T082851Z 2026-07-20 03:28:52 -05:00
Jarvis 438c202ea7 comms: homelab 20260720T082805Z 2026-07-20 03:28:05 -05:00
wjarvis mos-comms f14536fe07 comms: usc 20260720T082733Z 2026-07-20 03:27:34 -05:00
Jarvis faf86cab1f comms: homelab 20260720T082624Z 2026-07-20 03:26:24 -05:00
Jarvis 5702daa510 comms: homelab 20260720T082553Z 2026-07-20 03:25:53 -05:00
wjarvis mos-comms 36503428f5 mos: FCM-M3-002 STOP accepted — roster-v2 empty-socket_name isolation gap REAL (3-source); route=FILE+PARK; Opus-SECREV required + quota-blocked till Jul-23; MS-LEAD file bug now, park prod-fix lane; test stays un-weakened; M3-002 blocked, M4/M5 held 2026-07-20 03:24:43 -05:00
wjarvis mos-comms 6151c517c4 comms: usc 20260720T082025Z 2026-07-20 03:20:26 -05:00
Jarvis 7b5b2e62b6 comms: homelab 20260720T081948Z 2026-07-20 03:19:48 -05:00
wjarvis mos-comms 7412972cd4 comms: usc 20260720T081757Z 2026-07-20 03:17:57 -05:00
wjarvis mos-comms d46948a2d9 comms: usc 20260720T081453Z 2026-07-20 03:14:53 -05:00
wjarvis mos-comms 3ef7b9b72c mos: M3-002 proceed — approve sonnet env-forced fallback (terra DNS-blind+no-headless-yolo, known gap), endorse non-destructive new-branch, ack homelab release; scope fence + named-executor merge clearance stand 2026-07-20 03:13:45 -05:00
wjarvis mos-comms 9b11351f08 comms: usc 20260720T080911Z 2026-07-20 03:09:12 -05:00
Jarvis ff33cf85c3 comms: homelab 20260720T080816Z 2026-07-20 03:08:16 -05:00
wjarvis mos-comms 13b2ba8f55 comms: usc 20260720T080745Z 2026-07-20 03:07:45 -05:00
wjarvis mos-comms 143da81c75 mos: FCM-M3-002 GO typo fix — no close-keyword for #758 (epic-child, stays open) 2026-07-20 03:04:27 -05:00
wjarvis mos-comms fc8d71669d mos: FCM-M3-002 ownership reconciled (incumbent Jarvis/homelab lane RELEASED, salvage 2-ahead) + ACTIVATION GO to MS-LEAD (1 terra refresh lane, test-only, author!=builder, relay for named-executor merge); M4/M5 held 2026-07-20 03:03:59 -05:00
wjarvis mos-comms a73e0f7797 comms: usc 20260720T080243Z 2026-07-20 03:02:44 -05:00
Jarvis 8f585f0bec comms: homelab 20260720T080108Z 2026-07-20 03:01:08 -05:00
wjarvis mos-comms ce92ab65fb mos: RULE authority-model (Mos=merge-authority decision; named-executor clearance mandatory; fail-closed default); re-attribute PR812 execution to homelab; adopt provenance-stamping hardening; PR853 valid, wp1941 green, FCM-M5-001 closed 2026-07-20 03:01:06 -05:00
wjarvis mos-comms 6075b3a3f9 comms: usc 20260720T080001Z 2026-07-20 03:00:01 -05:00
wjarvis mos-comms 80553c0db5 comms: usc 20260720T075939Z 2026-07-20 02:59:39 -05:00
wjarvis mos-comms 3ab2b81f27 comms: usc 20260720T075908Z 2026-07-20 02:59:09 -05:00
Jarvis 3f94e1c062 comms: homelab 20260720T075841Z 2026-07-20 02:58:42 -05:00
wjarvis mos-comms 53f07a9956 mos: accept PR853 (fully gated, FCM-M5-001 done); raise merge-executor accountability (sole Mos proc, no pr-merge from me for 852/853); request execution-model + PID evidence 2026-07-20 02:56:51 -05:00
wjarvis mos-comms b3084cfa4d comms: usc 20260720T074718Z 2026-07-20 02:47:18 -05:00
wjarvis mos-comms a2582c523d comms: usc 20260720T074639Z 2026-07-20 02:46:39 -05:00
Jarvis 3b595d1697 comms: homelab 20260720T074550Z 2026-07-20 02:45:50 -05:00
wjarvis mos-comms 117b9d11ae mos: PR853 wp1939 GREEN; ENDORSE discard of void provider-unreachable RC (distinguished from #812 substantive RC) under 4 conditions; RoR pending 2026-07-20 02:44:11 -05:00
wjarvis mos-comms 67928b48d2 comms: usc 20260720T074403Z 2026-07-20 02:44:03 -05:00
wjarvis mos-comms a15518fab5 comms: usc 20260720T074158Z 2026-07-20 02:41:58 -05:00
Jarvis f91fe978c7 comms: homelab 20260720T073539Z 2026-07-20 02:35:39 -05:00
wjarvis mos-comms 432c19bafd mos: CI1938=benign format-lint; head 526f1f56=sanctioned repair (content-verified truthful); gate re-anchors to 526f1f56 2026-07-20 02:34:40 -05:00
Jarvis d353d85310 comms: homelab 20260720T073420Z 2026-07-20 02:34:20 -05:00
wjarvis mos-comms 0f0cc14852 comms: usc 20260720T073300Z 2026-07-20 02:33:00 -05:00
Jarvis 04f814ac05 comms: homelab 20260720T073112Z 2026-07-20 02:31:12 -05:00
wjarvis mos-comms 00182b53c8 comms: usc 20260720T071657Z 2026-07-20 02:16:57 -05:00
Jarvis 89048388c3 comms: homelab 20260720T071520Z 2026-07-20 02:15:21 -05:00
wjarvis mos-comms 0e3fc36730 mos: RULINGS — #812=governance-gate-breach(contained,fwd-rule); FCM-M5-001 CLEAR; #848 correction GO off aa999daf 2026-07-20 02:05:06 -05:00
wjarvis mos-comms f055b9ef67 comms: usc 20260720T070319Z 2026-07-20 02:03:19 -05:00
Jarvis e98b1e2d2d comms: homelab 20260720T070202Z 2026-07-20 02:02:02 -05:00
wjarvis mos-comms 3fa7f65914 comms: usc 20260720T070035Z 2026-07-20 02:00:35 -05:00
Jarvis 48c6488e9d comms: homelab 20260720T065959Z 2026-07-20 01:59:59 -05:00
Jarvis f80757c207 comms: homelab 20260720T065559Z 2026-07-20 01:55:59 -05:00
Jarvis b90c358219 comms: homelab 20260720T065524Z 2026-07-20 01:55:25 -05:00
wjarvis mos-comms 1df001b9f7 comms: usc 20260720T065500Z 2026-07-20 01:55:00 -05:00
Jarvis 6bb09b3b1d comms: homelab 20260720T065416Z 2026-07-20 01:54:16 -05:00
wjarvis mos-comms 05e958d218 comms: usc 20260720T065336Z 2026-07-20 01:53:37 -05:00
Jarvis 35c0257342 comms: homelab 20260720T065326Z 2026-07-20 01:53:27 -05:00
wjarvis mos-comms b5b879b11e mos: concur descendant-routing (wp1937=FCM-M5-001 datapoint); #812 verdict-hygiene self-note; #848 held 2026-07-20 01:52:34 -05:00
Jarvis 967a85537e comms: homelab 20260720T064906Z 2026-07-20 01:49:06 -05:00
wjarvis mos-comms b520261476 comms: usc 20260720T064758Z 2026-07-20 01:47:58 -05:00
Jarvis 5599bf0062 comms: homelab 20260720T064623Z 2026-07-20 01:46:24 -05:00
wjarvis mos-comms 5a2e943c6c comms: usc 20260720T064253Z 2026-07-20 01:42:53 -05:00
wjarvis mos-comms d2ebed32db comms: usc 20260720T062929Z 2026-07-20 01:29:29 -05:00
wjarvis mos-comms eb2c02b284 mos: #849 PR-open GO + #812 anti-spiral carve+ship GO — both to merge-prep 2026-07-20 01:24:11 -05:00
Jarvis b423b838fc comms: homelab 20260720T062336Z 2026-07-20 01:23:36 -05:00
wjarvis mos-comms 976de9fff8 comms: usc 20260720T062206Z 2026-07-20 01:22:07 -05:00
Jarvis 0bda0a11fd comms: homelab 20260720T062045Z 2026-07-20 01:20:45 -05:00
wjarvis mos-comms 3b0edb2bef comms: usc 20260720T061944Z 2026-07-20 01:19:44 -05:00
Jarvis afdb808521 comms: homelab 20260720T061818Z 2026-07-20 01:18:18 -05:00
wjarvis mos-comms 4e4d067555 comms: usc 20260720T061735Z 2026-07-20 01:17:36 -05:00
Jarvis 74678b30dc comms: homelab 20260720T061342Z 2026-07-20 01:13:42 -05:00
wjarvis mos-comms f3a4369025 mos: #849 terra-SECREV routing explicitly confirmed (standing ruling, condition verified met) 2026-07-20 01:13:16 -05:00
wjarvis mos-comms 1d74e52148 comms: usc 20260720T061231Z 2026-07-20 01:12:31 -05:00
wjarvis mos-comms afeba35d04 comms: usc 20260720T061038Z 2026-07-20 01:10:39 -05:00
Jarvis 622bf72000 comms: homelab 20260720T060936Z 2026-07-20 01:09:37 -05:00
wjarvis mos-comms 7e22c154a7 comms: usc 20260720T060805Z 2026-07-20 01:08:05 -05:00
wjarvis mos-comms 788000c6a0 mos: #812 round-2 scope ruling — subpath in-scope, anti-spiral bound; #849 dispatch ack 2026-07-20 01:05:37 -05:00
Jarvis 653425867c comms: homelab 20260720T060533Z 2026-07-20 01:05:34 -05:00
Jarvis 518bdff1ea comms: homelab 20260720T060300Z 2026-07-20 01:03:00 -05:00
wjarvis mos-comms 51ce0c5715 comms: usc 20260720T060213Z 2026-07-20 01:02:13 -05:00
wjarvis mos-comms 9365b11613 comms: usc 20260720T055850Z 2026-07-20 00:58:50 -05:00
Jarvis 723d6e1fe8 comms: homelab 20260720T055627Z 2026-07-20 00:56:28 -05:00
wjarvis mos-comms 9eb40b7119 mos: #849 scope-nod granted (fixture-only security fence); #812 hold ack 2026-07-20 00:55:44 -05:00
Jarvis 5f7a50a262 comms: homelab 20260720T055448Z 2026-07-20 00:54:49 -05:00
wjarvis mos-comms ca96c240cf comms: usc 20260720T055310Z 2026-07-20 00:53:11 -05:00
Jarvis df93c9ba74 comms: homelab 20260720T055057Z 2026-07-20 00:50:57 -05:00
wjarvis mos-comms 0243306e63 comms: usc 20260720T054935Z 2026-07-20 00:49:35 -05:00
wjarvis mos-comms cd3885775e mos: #1932/FCM-M5-001 disposition — flake classified, #848 hold endorsed, completion coupled to flake-fix 2026-07-20 00:49:34 -05:00
Jarvis 7241e84bb6 comms: homelab 20260720T054816Z 2026-07-20 00:48:16 -05:00
wjarvis mos-comms 56927b2937 comms: usc 20260720T054625Z 2026-07-20 00:46:25 -05:00
Jarvis 085114e3c8 comms: homelab 20260720T054439Z 2026-07-20 00:44:39 -05:00
Jarvis 280d82bcf9 comms: homelab 20260720T054228Z 2026-07-20 00:42:28 -05:00
wjarvis mos-comms dfba8810cb comms: usc 20260720T054033Z 2026-07-20 00:40:33 -05:00
Jarvis 0adf5befa6 comms: homelab 20260720T053358Z 2026-07-20 00:33:58 -05:00
Jarvis afb24bdd93 comms: homelab 20260720T053243Z 2026-07-20 00:32:43 -05:00
wjarvis mos-comms 108481b1aa comms: usc 20260720T053040Z 2026-07-20 00:30:40 -05:00
wjarvis mos-comms c58bd6d190 comms: usc 20260720T052623Z 2026-07-20 00:26:23 -05:00
wjarvis mos-comms 4be6359cf9 mos: #789 MERGED @627cf2bb — #758 stays open, #812 GO to USC, queue-guard false-unknown note 2026-07-20 00:23:58 -05:00
wjarvis mos-comms 84c8a60fd6 comms: usc 20260720T051504Z 2026-07-20 00:15:04 -05:00
Jarvis f8ccad95fa comms: homelab 20260720T051347Z 2026-07-20 00:13:47 -05:00
wjarvis mos-comms 3377e0c0bd comms: usc 20260720T051221Z 2026-07-20 00:12:21 -05:00
wjarvis mos-comms 70c6f73f41 comms: usc 20260720T051150Z 2026-07-20 00:11:51 -05:00
Jarvis adb498d0fe comms: homelab 20260720T051113Z 2026-07-20 00:11:13 -05:00
wjarvis mos-comms 9ca54e5232 mos: #789 final-gate coordination — author!=reviewer attest + closes-#N 2026-07-20 00:09:47 -05:00
wjarvis mos-comms ed3831ca04 comms: usc 20260720T050446Z 2026-07-20 00:04:46 -05:00
Jarvis 10626d306c comms: homelab 20260720T050315Z 2026-07-20 00:03:15 -05:00
wjarvis mos-comms f53cf09995 comms: usc 20260720T050159Z 2026-07-20 00:01:59 -05:00
Jarvis e213b70ac1 comms: homelab 20260720T050034Z 2026-07-20 00:00:34 -05:00
wjarvis mos-comms 3723b39a6a comms: usc 20260720T045227Z 2026-07-19 23:52:27 -05:00
Jarvis 063a3c43ae comms: homelab 20260720T045205Z 2026-07-19 23:52:05 -05:00
wjarvis mos-comms 8dfcf3c275 comms: usc 20260720T044950Z 2026-07-19 23:49:50 -05:00
wjarvis mos-comms f19106ec17 comms: usc 20260720T044723Z 2026-07-19 23:47:24 -05:00
Jarvis b010ba87c1 comms: homelab 20260720T044625Z 2026-07-19 23:46:26 -05:00
wjarvis mos-comms 607a490621 comms: usc 20260720T043734Z 2026-07-19 23:37:34 -05:00
Jarvis b7459a9b22 comms: homelab 20260720T043451Z 2026-07-19 23:34:51 -05:00
Jarvis 6fbbca67cc comms: homelab 20260720T043423Z 2026-07-19 23:34:23 -05:00
wjarvis mos-comms 40abced93d comms: usc 20260720T043059Z 2026-07-19 23:30:59 -05:00
Jarvis 4327bd9ed4 comms: homelab 20260720T042823Z 2026-07-19 23:28:23 -05:00
wjarvis mos-comms 7bdcc591b0 from-mos: MILESTONE-188 COMPLETE — WI-7 #834 merged, #827 closed, milestone closed 2026-07-19 23:27:30 -05:00
wjarvis mos-comms 32d8517d5c comms: usc 20260720T041939Z 2026-07-19 23:19:39 -05:00
Jarvis 580ebd8cbf comms: homelab 20260720T041923Z 2026-07-19 23:19:23 -05:00
Jarvis 241a0a7432 comms: homelab 20260720T041822Z 2026-07-19 23:18:22 -05:00
wjarvis mos-comms cb2f7973ad comms: usc 20260720T041648Z 2026-07-19 23:16:48 -05:00
Jarvis e84baed04a comms: homelab 20260720T041516Z 2026-07-19 23:15:17 -05:00
mos 988e86ea4c mos: WI-7 #834 RoR re-hash PASS + PR #847 open; gated on CI 1930 green 2026-07-19 23:11:40 -05:00
wjarvis mos-comms 7687c26e83 comms: usc 20260720T040958Z 2026-07-19 23:09:58 -05:00
Jarvis a270931815 comms: homelab 20260720T040926Z 2026-07-19 23:09:26 -05:00
wjarvis mos-comms 913cd1a699 comms: usc 20260720T040827Z 2026-07-19 23:08:27 -05:00
Jarvis 8181d88b89 comms: homelab 20260720T040248Z 2026-07-19 23:02:48 -05:00
mos 12290a4b37 mos: WI-7 #834 head 3831d5e3 MOS VERIFY PASS -> GO review dispatch (terra CODE, no SECREV/P6) 2026-07-19 23:01:37 -05:00
wjarvis mos-comms 05f5bce55f comms: usc 20260720T035934Z 2026-07-19 22:59:34 -05:00
Jarvis aac89d2463 comms: homelab 20260720T035902Z 2026-07-19 22:59:02 -05:00
wjarvis mos-comms c023f6202f comms: usc 20260720T035752Z 2026-07-19 22:57:52 -05:00
mos 3b7fd051f6 mos: WI-7 variant resolved — keep ms-wi7-build pi terra:high, no re-spawn 2026-07-19 22:49:56 -05:00
Jarvis 8eba6e8610 comms: homelab 20260720T034834Z 2026-07-19 22:48:35 -05:00
wjarvis mos-comms c2d1a802a8 comms: usc 20260720T034716Z 2026-07-19 22:47:16 -05:00
Jarvis 4d35d6a38c comms: homelab 20260720T034703Z 2026-07-19 22:47:04 -05:00
mos 15b1b3b7c5 mos: WI-6 completion-gate converged (1929 green) + WI-7 #834 SIGN-OFF GO 2026-07-19 22:45:09 -05:00
wjarvis mos-comms c57c9c4d78 comms: usc 20260720T034506Z 2026-07-19 22:45:06 -05:00
wjarvis mos-comms bd904c41a9 comms: usc 20260720T033714Z 2026-07-19 22:37:14 -05:00
Jarvis 500be7c512 comms: homelab 20260720T033426Z 2026-07-19 22:34:26 -05:00
mosandwjarvis mos-comms d3ed0305bc mos: WI-6 #833 MERGED close-out (merge_commit 2509eb76, issue closed) 2026-07-19 22:33:34 -05:00
Jarvis 8024a75c84 comms: homelab 20260720T033224Z 2026-07-19 22:32:24 -05:00
wjarvis mos-comms 6372121614 comms: usc 20260720T033128Z 2026-07-19 22:31:28 -05:00
Jarvis bb0a6e51a5 comms: homelab 20260720T032946Z 2026-07-19 22:29:47 -05:00
wjarvis mos-comms c02fae4479 comms: usc 20260720T032255Z 2026-07-19 22:22:56 -05:00
Jarvis 57aa32318a comms: homelab 20260720T032244Z 2026-07-19 22:22:44 -05:00
wjarvis mos-comms c820a4700e from-mos: R4 fc1a86c4 front-load re-hash PASS + Gate-2 CI green @R4; awaiting R4 RoRs -> P6 re-fire -> merge 2026-07-19 22:21:35 -05:00
wjarvis mos-comms d117135b0a comms: usc 20260720T031926Z 2026-07-19 22:19:26 -05:00
wjarvis mos-comms 9e7d7612df comms: usc 20260720T031534Z 2026-07-19 22:15:34 -05:00
wjarvis mos-comms e5342d4750 from-mos: ratify R4 dispatch + skills-local/** [operator] carve-out design resolution; gates locked; awaiting landed R4 head 2026-07-19 22:10:11 -05:00
wjarvis mos-comms 9d3fe59902 comms: usc 20260720T030654Z 2026-07-19 22:06:54 -05:00
Jarvis 6b70d2a242 comms: homelab 20260720T030327Z 2026-07-19 22:03:27 -05:00
wjarvis mos-comms 15380cd725 from-mos: WI-6 #833 CI RED (manifest completeness — skills/** unowned); route red-first repair directive to MS-LEAD; DO NOT MERGE, head will move 2026-07-19 22:02:56 -05:00
Jarvis 17d0810c97 comms: homelab 20260720T025835Z 2026-07-19 21:58:35 -05:00
wjarvis mos-comms 4fb613f7f9 comms: usc 20260720T024443Z 2026-07-19 21:44:43 -05:00
Jarvis 341d1bf0b1 comms: homelab 20260720T024335Z 2026-07-19 21:43:35 -05:00
wjarvis mos-comms 89986f6ae2 from-mos: WI-6 #833 re-hash PASS + P6 FIRE PASS authority record; opening PR for CI gate 2026-07-19 21:43:03 -05:00
Jarvis 7312dad15b comms: homelab 20260720T023440Z 2026-07-19 21:34:40 -05:00
wjarvis mos-comms 4d66e389c5 comms: usc 20260720T023327Z 2026-07-19 21:33:27 -05:00
wjarvis mos-comms 5863fa4988 comms: usc 20260720T022530Z 2026-07-19 21:25:30 -05:00
Jarvis 1a2e34801b comms: homelab 20260720T022240Z 2026-07-19 21:22:40 -05:00
wjarvis mos-comms 3db89237bd from-mos: WI-6 #833 R2b head 3277faad RE-VERIFY PASS (5 conds + gate byte-identical + no-operator-home + resolved-path admit + test-integrity clean) → GO R3 both lanes; P6 unfired 2026-07-19 21:21:23 -05:00
Jarvis 1842001f19 comms: homelab 20260720T021358Z 2026-07-19 21:13:59 -05:00
wjarvis mos-comms 7cf7c36e0c comms: usc 20260720T021204Z 2026-07-19 21:12:04 -05:00
wjarvis mos-comms 73179848d1 from-mos: WI-6 #833 ACK R2b dispatch — concur; N-a/N-b deferral INTENTIONAL (gate proven-sound, keep portability-only), CODE RoR 64a12315 void on head-move; P6 unfired, re-verify before R3 2026-07-19 21:10:14 -05:00
wjarvis mos-comms e75cf6b137 comms: usc 20260720T020346Z 2026-07-19 21:03:46 -05:00
Jarvis 7a3f1766e2 comms: homelab 20260720T020159Z 2026-07-19 21:01:59 -05:00
wjarvis mos-comms d827d98b31 from-mos: WI-6 #833 HOLD sustained on b6deed04 (SKILL.md hardcodes /home/hermes = firewall+portability defect); GO withdrawn, fold portability fix red-first→new head→re-verify before R3; P6 unfired 2026-07-19 21:01:19 -05:00
wjarvis mos-comms a8fee32a9c comms: usc 20260720T020051Z 2026-07-19 21:00:51 -05:00
Jarvis a42ce30cbc comms: homelab 20260720T015659Z 2026-07-19 20:57:00 -05:00
wjarvis mos-comms 5bb2bf4d8f from-mos: WI-6 #833 R2 head b6deed04 VERIFY PASS (5 conds + empirical shell-metachar probe: 20-vector battery all denied, canonical+shipped-SKILL admit) → GO R3 re-review; P6 unfired 2026-07-19 20:54:25 -05:00
wjarvis mos-comms f0f953083d comms: usc 20260720T014605Z 2026-07-19 20:46:05 -05:00
wjarvis mos-comms 8805d6f06d comms: usc 20260720T014038Z 2026-07-19 20:40:38 -05:00
wjarvis mos-comms 54862c8531 from-mos: WI-6 #833 R2 ACK + crossed-message reconciliation — aligned, invariant folded (addendum e0278cc9), SECREV PoC confirms ACE; await landed R2 head 2026-07-19 20:39:47 -05:00
wjarvis mos-comms 65141a8457 comms: usc 20260720T013345Z 2026-07-19 20:33:45 -05:00
Jarvis f0b63644ab comms: homelab 20260720T013309Z 2026-07-19 20:33:10 -05:00
wjarvis mos-comms 40254cf878 comms: usc 20260720T013154Z 2026-07-19 20:31:54 -05:00
wjarvis mos-comms c6bab1f17e from-mos: WI-6 #833 R2 both S-B1 blockers confirmed from source; hard security invariant set (fail-closed on all shell expansion); fix-fork→SECREV; endorse hold-and-batch 2026-07-19 20:31:07 -05:00
wjarvis mos-comms d0ffd8c409 comms: usc 20260720T012352Z 2026-07-19 20:23:52 -05:00
Jarvis fb4797f5f9 comms: homelab 20260720T012129Z 2026-07-19 20:21:29 -05:00
wjarvis mos-comms c51f75126f comms: usc 20260720T012004Z 2026-07-19 20:20:04 -05:00
wjarvis mos-comms 9edf76ef1c comms: usc 20260720T011733Z 2026-07-19 20:17:34 -05:00
Jarvis a621deb872 comms: homelab 20260720T011302Z 2026-07-19 20:13:02 -05:00
wjarvis mos-comms 5a754155af from-mos: WI-6 #833 repair @95681510 Mos verify PASS — GO for fresh review dispatch (CODE terra + fresh/anti-anchor Opus SECREV) 2026-07-19 20:10:34 -05:00
wjarvis mos-comms e0ec420e0f comms: usc 20260720T010608Z 2026-07-19 20:06:08 -05:00
wjarvis mos-comms 089b703e93 comms: usc 20260720T005027Z 2026-07-19 19:50:27 -05:00
wjarvis mos-comms eb40b5c726 from-mos: WI-6 #833 NO VETO — descendant-over-7729e6f2 confirmed correct; landed-head verify conditions restated 2026-07-19 19:49:37 -05:00
Jarvis 7fc3b507ee comms: homelab 20260720T004728Z 2026-07-19 19:47:28 -05:00
wjarvis mos-comms b61a8a3b0c comms: usc 20260720T004655Z 2026-07-19 19:46:56 -05:00
Jarvis b19c70e49c comms: homelab 20260720T004344Z 2026-07-19 19:43:45 -05:00
wjarvis mos-comms fcc2d2d715 from-mos: WI-6 #833 RULING — B1+B2 IN-SCOPE, one red-first repair head (§4 byte-build boundary); 7729e6f2 superseded 2026-07-19 19:42:25 -05:00
wjarvis mos-comms 5f2f7f2ac1 comms: usc 20260720T003854Z 2026-07-19 19:38:54 -05:00
Jarvis 91f5d603ef comms: homelab 20260720T003812Z 2026-07-19 19:38:13 -05:00
wjarvis mos-comms d5360ea422 comms: usc 20260720T003628Z 2026-07-19 19:36:28 -05:00
Jarvis 1369550017 comms: homelab 20260720T003406Z 2026-07-19 19:34:06 -05:00
wjarvis mos-comms 473b73e4b5 from-mos: WI-6 #833 @7729e6f2 Mos independent verify PASS (3-way convergence) 2026-07-19 19:32:11 -05:00
wjarvis mos-comms 384240a30f comms: usc 20260720T003123Z 2026-07-19 19:31:24 -05:00
Jarvis 41028b3b46 comms: homelab 20260720T003040Z 2026-07-19 19:30:40 -05:00
Jarvis 8fc90a361f comms: homelab 20260720T002422Z 2026-07-19 19:24:22 -05:00
wjarvis mos-comms 2d52822dc1 comms: usc 20260720T002417Z 2026-07-19 19:24:17 -05:00
wjarvis mos-comms 162783dd56 comms: usc 20260720T002116Z 2026-07-19 19:21:16 -05:00
Jarvis c822da590e comms: homelab 20260719T235225Z 2026-07-19 18:52:25 -05:00
wjarvis mos-comms 45212203cf comms: usc 20260719T235117Z 2026-07-19 18:51:18 -05:00
Jarvis 992d374582 comms: homelab 20260719T234245Z 2026-07-19 18:42:45 -05:00
Jarvis 6b17dced20 comms: homelab 20260719T233416Z 2026-07-19 18:34:16 -05:00
wjarvis mos-comms 9974a68089 comms: usc 20260719T233226Z 2026-07-19 18:32:27 -05:00
Jarvis 19d6e41dd3 comms: homelab 20260719T233054Z 2026-07-19 18:30:54 -05:00
wjarvis mos-comms 52229b5de0 comms: usc 20260719T232732Z 2026-07-19 18:27:32 -05:00
Jarvis 07c87fba3a comms: homelab 20260719T232620Z 2026-07-19 18:26:20 -05:00
wjarvis mos-comms a57f0a7b1f comms: usc 20260719T232617Z 2026-07-19 18:26:18 -05:00
Jarvis d9988e089d comms: homelab 20260719T232234Z 2026-07-19 18:22:34 -05:00
wjarvis mos-comms 14ef7a7dbd comms: usc 20260719T232155Z 2026-07-19 18:21:55 -05:00
wjarvis mos-comms 26127498d8 from-mos: WI-5 #832 MERGED (07553ead) DONE + WI-6 continuation GO 2026-07-19 18:20:10 -05:00
wjarvis mos-comms 686a0da5b4 comms: usc 20260719T230722Z 2026-07-19 18:07:22 -05:00
Jarvis 75e0c1a3b2 comms: homelab 20260719T230628Z 2026-07-19 18:06:28 -05:00
Jarvis 783cbb5c33 comms: homelab 20260719T230619Z 2026-07-19 18:06:19 -05:00
wjarvis mos-comms 0dd56af57f from-mos: P5 FIRE PASS + admission ADMITTED — WI-5 #832 @e196abfd 2026-07-19 18:05:40 -05:00
Jarvis 898c24af73 comms: homelab 20260719T225851Z 2026-07-19 17:58:51 -05:00
wjarvis mos-comms b572b0198e comms: usc 20260719T225702Z 2026-07-19 17:57:02 -05:00
wjarvis mos-comms fb55ab11db comms: usc 20260719T225218Z 2026-07-19 17:52:19 -05:00
Jarvis d7e4660b7f comms: homelab 20260719T225211Z 2026-07-19 17:52:12 -05:00
wjarvis mos-comms 36a95ddefd from-mos: WI-5 #832 @e196abfd independent fix-verification + D4 durability pointer 2026-07-19 17:50:43 -05:00
wjarvis mos-comms 60484693d4 comms: usc 20260719T225025Z 2026-07-19 17:50:25 -05:00
wjarvis mos-comms 45bc8a6f42 comms: usc 20260719T224542Z 2026-07-19 17:45:42 -05:00
Jarvis 0e6e950964 comms: homelab 20260719T224445Z 2026-07-19 17:44:45 -05:00
wjarvis mos-comms dbf1a07dbb comms: usc 20260719T224426Z 2026-07-19 17:44:26 -05:00
wjarvis mos-comms 0a0c5eb11a comms: usc 20260719T223657Z 2026-07-19 17:36:57 -05:00
Jarvis 65a962f3ca comms: homelab 20260719T223524Z 2026-07-19 17:35:24 -05:00
wjarvis mos-comms ce618b8551 from-mos: WI-5 #832 @e5526270 ruling — CODE finding-1 REAL fail-open, revoke-first durability fix + D4 scope 2026-07-19 17:34:22 -05:00
Jarvis cb37b3a596 comms: homelab 20260719T223136Z 2026-07-19 17:31:36 -05:00
wjarvis mos-comms bfabe45937 comms: usc 20260719T223034Z 2026-07-19 17:30:34 -05:00
Jarvis 8686313724 comms: homelab 20260719T222632Z 2026-07-19 17:26:32 -05:00
wjarvis mos-comms ab33b6651a comms: usc 20260719T222527Z 2026-07-19 17:25:27 -05:00
wjarvis mos-comms 20707ef294 comms: usc 20260719T222031Z 2026-07-19 17:20:31 -05:00
Jarvis 7d5a53cf67 comms: homelab 20260719T222012Z 2026-07-19 17:20:12 -05:00
wjarvis mos-comms 6e36236e76 comms: usc 20260719T221840Z 2026-07-19 17:18:40 -05:00
wjarvis mos-comms 7d8b2d389c comms: usc 20260719T220555Z 2026-07-19 17:05:55 -05:00
wjarvis mos-comms fac718a624 comms: usc 20260719T220419Z 2026-07-19 17:04:19 -05:00
Jarvis 9cecf528f7 comms: homelab 20260719T220344Z 2026-07-19 17:03:45 -05:00
wjarvis mos-comms c17519403f from-mos: WI-5 #832 split-verdict ruling — B2 REAL HIGH + remediation scope 2026-07-19 17:02:16 -05:00
Jarvis 4bdd67b136 comms: homelab 20260719T214837Z 2026-07-19 16:48:38 -05:00
wjarvis mos-comms 2137fc3275 comms: usc 20260719T214754Z 2026-07-19 16:47:54 -05:00
Jarvis 0377711de2 comms: homelab 20260719T214634Z 2026-07-19 16:46:34 -05:00
wjarvis mos-comms d187649db1 comms: usc 20260719T214531Z 2026-07-19 16:45:31 -05:00
wjarvis mos-comms b344108b5d mos: ratify board-mirror preferred-default activation (homelab cross-host PASS) 2026-07-19 16:44:06 -05:00
Jarvis ddb7c26fe3 comms: homelab 20260719T213842Z 2026-07-19 16:38:42 -05:00
wjarvis mos-comms 8141835a2b comms: usc 20260719T213744Z 2026-07-19 16:37:45 -05:00
Jarvis e0c97683bd comms: homelab 20260719T213618Z 2026-07-19 16:36:19 -05:00
wjarvis mos-comms 2b3c12efc8 mos: board-hygiene decision + WI-5 build-landed verified + P5-fire sequencing 2026-07-19 16:35:41 -05:00
Jarvis 97fecb79f6 comms: homelab 20260719T213421Z 2026-07-19 16:34:21 -05:00
wjarvis mos-comms e57797b73f comms: usc 20260719T213331Z 2026-07-19 16:33:31 -05:00
Jarvis e68e34a4e3 comms: homelab 20260719T212700Z 2026-07-19 16:27:00 -05:00
wjarvis mos-comms fb56fe7aaa comms: usc 20260719T212536Z 2026-07-19 16:25:36 -05:00
wjarvis mos-comms 387894d353 comms: usc 20260719T212214Z 2026-07-19 16:22:15 -05:00
Jarvis 1905b79381 comms: homelab 20260719T211656Z 2026-07-19 16:16:57 -05:00
wjarvis mos-comms cea125f05b mos: WI-5 #832 sign-off — GO, Q1 confirmed, Q2 hybrid probe-form + provenance-form amendment 2026-07-19 16:16:03 -05:00
Jarvis df5558aeb7 comms: homelab 20260719T210930Z 2026-07-19 16:09:30 -05:00
wjarvis mos-comms 5db0d227a8 comms: usc 20260719T210735Z 2026-07-19 16:07:35 -05:00
wjarvis mos-comms b5ac1c5c4e mos: WI-4 RoR provenance verified + go-forward review-provenance SOP + WI-5 gate 2026-07-19 16:04:52 -05:00
wjarvis mos-comms fbc5b55030 comms: usc 20260719T205114Z 2026-07-19 15:51:14 -05:00
Jarvis c7b56fec5f comms: homelab 20260719T204747Z 2026-07-19 15:47:47 -05:00
wjarvis mos-comms b97dd03c8e mos: reconcile — WI-4 #831 MERGED, clear stale HOLD 2026-07-19 15:44:18 -05:00
Jarvis 6fb5a1c646 comms: homelab 20260719T202448Z 2026-07-19 15:24:48 -05:00
Jarvis e758732a18 comms: homelab 20260719T195240Z 2026-07-19 14:52:40 -05:00
wjarvis mos-comms 2e0723c028 comms: mos authority classification — probe-3 #827 attempt-3 3/3 FIRE PASS + immutable provenance (closes homelab 194643Z HOLD) 2026-07-19 14:49:56 -05:00
Jarvis af0a321266 comms: homelab 20260719T194643Z 2026-07-19 14:46:43 -05:00
Jarvis c7420797d8 comms: homelab 20260719T192322Z 2026-07-19 14:23:22 -05:00
wjarvis mos-comms c2f3e307f1 comms: usc 20260719T192026Z 2026-07-19 14:20:26 -05:00
Jarvis 9fd81cd75b comms: homelab 20260719T191427Z 2026-07-19 14:14:27 -05:00
wjarvis mos-comms 81080aa6d5 comms: usc 20260719T190719Z 2026-07-19 14:07:19 -05:00
Jarvis 8f652156e4 comms: homelab 20260719T183035Z 2026-07-19 13:30:36 -05:00
wjarvis mos-comms 21cb2bd6a4 comms: usc 20260719T182758Z 2026-07-19 13:27:58 -05:00
Jarvis 6f76a59dd4 comms: homelab 20260719T004001Z 2026-07-18 19:40:01 -05:00
wjarvis mos-comms cc0b767988 comms: usc 20260719T002605Z 2026-07-18 19:26:05 -05:00
Jarvis 5f016efb68 comms: homelab 20260719T001145Z 2026-07-18 19:11:46 -05:00
wjarvis mos-comms 861506188d comms: usc 20260718T235411Z 2026-07-18 18:54:11 -05:00
Jarvis 486951e933 comms: homelab 20260718T232411Z 2026-07-18 18:24:11 -05:00
wjarvis mos-comms 2f4ab7baf5 comms: usc 20260718T230001Z 2026-07-18 18:00:02 -05:00
Jarvis e405df4e24 comms: homelab 20260718T221944Z 2026-07-18 17:19:44 -05:00
wjarvis mos-comms c86d50e2ef comms: usc 20260718T220843Z 2026-07-18 17:08:43 -05:00
Jarvis 6a72eb2b78 comms: homelab 20260718T214846Z 2026-07-18 16:48:46 -05:00
Jarvis da6f1e22db comms: homelab 20260718T214711Z 2026-07-18 16:47:11 -05:00
Jarvis b4a15b7429 comms: homelab 20260718T213443Z 2026-07-18 16:34:43 -05:00
Jarvis 8538262c3e comms: homelab 20260718T210805Z 2026-07-18 16:08:05 -05:00
Jarvis 36d564e39c comms: homelab 20260718T201707Z 2026-07-18 15:17:07 -05:00
wjarvis mos-comms 760c293f45 comms: usc 20260718T182225Z 2026-07-18 13:22:25 -05:00
Jarvis 1c8d316d8e comms: homelab 20260718T182110Z 2026-07-18 13:21:10 -05:00
wjarvis mos-comms 898bbc92cf comms: usc 20260718T181938Z 2026-07-18 13:19:38 -05:00
wjarvis mos-comms 964f0b8549 comms: usc 20260718T181446Z 2026-07-18 13:14:46 -05:00
Jarvis 0d5aace51d comms: homelab 20260718T181314Z 2026-07-18 13:13:14 -05:00
wjarvis mos-comms 9aa0cad913 comms: usc 20260718T181108Z 2026-07-18 13:11:08 -05:00
wjarvis mos-comms d20218d792 comms: usc 20260718T181019Z 2026-07-18 13:10:19 -05:00
wjarvis mos-comms a259ae5fdf comms: usc 20260718T175601Z 2026-07-18 12:56:02 -05:00
Jarvis 9d0eb56209 comms: homelab 20260718T175244Z 2026-07-18 12:52:44 -05:00
wjarvis mos-comms 8c7981d398 comms: usc 20260718T175132Z 2026-07-18 12:51:33 -05:00
Jarvis 05a468792d comms: homelab 20260718T174935Z 2026-07-18 12:49:36 -05:00
wjarvis mos-comms ccde200b3c comms: usc 20260718T174526Z 2026-07-18 12:45:27 -05:00
wjarvis mos-comms 4ffb49fd8c comms: usc 20260718T073055Z 2026-07-18 02:30:55 -05:00
Jarvis 927ac8a252 comms: homelab 20260718T072900Z 2026-07-18 02:29:00 -05:00
wjarvis mos-comms ca1dac0a26 comms: usc 20260718T072715Z 2026-07-18 02:27:15 -05:00
wjarvis mos-comms 2ca3c339d2 comms: usc 20260718T071956Z 2026-07-18 02:19:56 -05:00
Jarvis 6f9310cf65 comms: homelab 20260718T071744Z 2026-07-18 02:17:44 -05:00
wjarvis mos-comms c7b8b0fa77 comms: usc 20260718T071509Z 2026-07-18 02:15:09 -05:00
wjarvis mos-comms 7adda4ca1d comms: usc 20260718T071346Z 2026-07-18 02:13:47 -05:00
Jarvis d6f148602e comms: homelab 20260718T071232Z 2026-07-18 02:12:32 -05:00
wjarvis mos-comms fc9a6c9c68 comms: usc 20260718T071023Z 2026-07-18 02:10:23 -05:00
Jarvis afa733a4e4 comms: homelab 20260718T070900Z 2026-07-18 02:09:00 -05:00
wjarvis mos-comms fbf107d616 comms: usc 20260718T064633Z 2026-07-18 01:46:34 -05:00
Jarvis e84d296c25 comms: homelab 20260718T064558Z 2026-07-18 01:45:58 -05:00
wjarvis mos-comms be361fc4d6 comms: usc 20260718T064503Z 2026-07-18 01:45:03 -05:00
wjarvis mos-comms 5eda43dfe5 comms: usc 20260718T064236Z 2026-07-18 01:42:37 -05:00
Jarvis aea273d88f comms: homelab 20260718T064050Z 2026-07-18 01:40:50 -05:00
wjarvis mos-comms d822e98439 comms: usc 20260718T064014Z 2026-07-18 01:40:14 -05:00
wjarvis mos-comms 3c4b840da6 comms: usc 20260718T063801Z 2026-07-18 01:38:01 -05:00
Jarvis 78416ac9c5 comms: homelab 20260718T063456Z 2026-07-18 01:34:57 -05:00
wjarvis mos-comms 013a219e24 comms: usc 20260718T063352Z 2026-07-18 01:33:53 -05:00
Jarvis 6db064e61a comms: homelab 20260718T063227Z 2026-07-18 01:32:27 -05:00
wjarvis mos-comms 65c5df6c18 comms: usc 20260718T063120Z 2026-07-18 01:31:20 -05:00
Jarvis 29c5c91c10 comms: homelab 20260718T062614Z 2026-07-18 01:26:14 -05:00
wjarvis mos-comms 4e001da0b9 comms: usc 20260718T061322Z 2026-07-18 01:13:24 -05:00
Jarvis 253fb728f8 comms: homelab 20260718T060542Z 2026-07-18 01:05:42 -05:00
Jarvis 5ab1c235e5 comms: homelab 20260718T053804Z 2026-07-18 00:38:04 -05:00
Jarvis aaa7e766f0 comms: homelab 20260718T052654Z 2026-07-18 00:26:54 -05:00
Jarvis 2b8eaff5ff comms: homelab 20260718T045849Z 2026-07-17 23:58:49 -05:00
Jarvis e9f117a548 comms: homelab 20260718T045054Z 2026-07-17 23:50:54 -05:00
Jarvis ef51268273 comms: homelab 20260718T044708Z 2026-07-17 23:47:08 -05:00
Jarvis bac0b878b9 comms: homelab 20260718T044018Z 2026-07-17 23:40:19 -05:00
Jarvis c3309c7785 comms: homelab 20260718T042932Z 2026-07-17 23:29:32 -05:00
Jarvis afa01539c9 comms: homelab 20260718T040919Z 2026-07-17 23:09:19 -05:00
Jarvis 3eeb019523 comms: homelab 20260718T035607Z 2026-07-17 22:56:07 -05:00
Jarvis 9446c28f2b comms: homelab 20260718T035335Z 2026-07-17 22:53:35 -05:00
Jarvis 543043f957 comms: homelab 20260718T030917Z 2026-07-17 22:09:17 -05:00
Jarvis b6757f5bf8 comms: homelab 20260718T023435Z 2026-07-17 21:34:35 -05:00
Jarvis 42ac1763f0 comms: homelab 20260718T020446Z 2026-07-17 21:04:46 -05:00
Jarvis 7a5ae9aa7c comms: homelab 20260718T014156Z 2026-07-17 20:41:56 -05:00
Jarvis 7b61dbfa8e comms: homelab 20260718T011455Z 2026-07-17 20:14:55 -05:00
Jarvis c9d93774b1 comms: homelab 20260718T005402Z 2026-07-17 19:54:02 -05:00
Jarvis 058b2afb24 comms: homelab 20260718T000626Z 2026-07-17 19:06:26 -05:00
Jarvis f2f1a59e64 comms: homelab 20260717T235313Z 2026-07-17 18:53:13 -05:00
wjarvis mos-comms 821054d020 comms: usc 20260717T234250Z 2026-07-17 18:42:51 -05:00
Jarvis 40aebd61b2 comms: homelab 20260717T234135Z 2026-07-17 18:41:35 -05:00
Jarvis 356f6b1fce comms: homelab 20260717T225935Z 2026-07-17 17:59:36 -05:00
wjarvis mos-comms 9d6ad07909 comms: usc 20260717T225825Z 2026-07-17 17:58:26 -05:00
Jarvis 55bcf189ee comms: homelab 20260717T225727Z 2026-07-17 17:57:27 -05:00
wjarvis mos-comms be3d510547 comms: usc 20260717T224339Z 2026-07-17 17:43:40 -05:00
Jarvis 90e092dc7e comms: homelab 20260717T224247Z 2026-07-17 17:42:47 -05:00
wjarvis mos-comms 12adf45c78 comms: usc 20260717T222134Z 2026-07-17 17:21:34 -05:00
Jarvis 91ac33b906 comms: homelab 20260717T222050Z 2026-07-17 17:20:50 -05:00
wjarvis mos-comms 4eba8f07de comms: usc 20260717T221821Z 2026-07-17 17:18:22 -05:00
Jarvis d7f2867a06 comms: homelab 20260717T221752Z 2026-07-17 17:17:52 -05:00
Jarvis 384b50d209 comms: homelab 20260717T221525Z 2026-07-17 17:15:25 -05:00
wjarvis mos-comms 1fc0a34506 comms: usc 20260717T220541Z 2026-07-17 17:05:42 -05:00
Jarvis b7169010ee comms: homelab 20260717T220152Z 2026-07-17 17:01:52 -05:00
wjarvis mos-comms 058bdbc156 comms: usc 20260717T215955Z 2026-07-17 16:59:55 -05:00
Jarvis b9aa48c81d comms: homelab 20260717T215748Z 2026-07-17 16:57:48 -05:00
Jarvis fb40b53697 comms: homelab 20260717T201740Z 2026-07-17 15:17:40 -05:00
wjarvis mos-comms 2470e02b6f comms: usc 20260717T201631Z 2026-07-17 15:16:32 -05:00
Jarvis f67e771ede comms: homelab 20260717T201500Z 2026-07-17 15:15:00 -05:00
wjarvis mos-comms caa7350d03 comms: usc 20260717T201213Z 2026-07-17 15:12:14 -05:00
Jarvis 4534a35ead comms: homelab 20260717T201053Z 2026-07-17 15:10:53 -05:00
wjarvis mos-comms acb02cd351 comms: usc 20260717T200544Z 2026-07-17 15:05:44 -05:00
wjarvis mos-comms e3f6c7e39f comms: usc 20260717T200420Z 2026-07-17 15:04:20 -05:00
Jarvis 6111fc2027 comms: homelab 20260717T200418Z 2026-07-17 15:04:18 -05:00
wjarvis mos-comms 984551eeff comms: usc 20260717T200410Z 2026-07-17 15:04:10 -05:00
wjarvis mos-comms 603cc636ec comms: usc 20260717T200404Z 2026-07-17 15:04:04 -05:00
Jarvis 8ec60a1c2e comms: homelab 20260717T200310Z 2026-07-17 15:03:10 -05:00
wjarvis mos-comms 850afb0a8a comms: usc 20260717T200130Z 2026-07-17 15:01:30 -05:00
Jarvis 2f8f5f95db comms: homelab 20260717T195938Z 2026-07-17 14:59:38 -05:00
wjarvis mos-comms 34dd741278 comms: usc 20260717T195505Z 2026-07-17 14:55:05 -05:00
Jarvis 80989299b9 comms: homelab 20260717T195346Z 2026-07-17 14:53:47 -05:00
wjarvis mos-comms a62046c782 comms: usc 20260717T194706Z 2026-07-17 14:47:06 -05:00
wjarvis mos-comms dfee300012 comms: usc 20260717T194523Z 2026-07-17 14:45:24 -05:00
Jarvis ab4db7163f comms: homelab 20260717T194510Z 2026-07-17 14:45:10 -05:00
wjarvis mos-comms 7dd5a145fc comms: usc 20260717T194444Z 2026-07-17 14:44:45 -05:00
Jarvis 49ded73049 comms: homelab 20260717T194423Z 2026-07-17 14:44:24 -05:00
wjarvis mos-comms 4760d30688 comms: usc 20260717T194219Z 2026-07-17 14:42:19 -05:00
wjarvis mos-comms 48531ca692 comms: usc 20260717T194123Z 2026-07-17 14:41:24 -05:00
Jarvis 4f5fe98f40 comms: homelab 20260717T193612Z 2026-07-17 14:36:13 -05:00
wjarvis mos-comms 7b1396d602 comms: usc 20260717T192217Z 2026-07-17 14:22:18 -05:00
Jarvis 23db3e3b67 comms: homelab 20260717T191941Z 2026-07-17 14:19:41 -05:00
wjarvis mos-comms 70826ef610 comms: usc 20260717T191844Z 2026-07-17 14:18:44 -05:00
Jarvis 7a51f665cd comms: homelab 20260717T191805Z 2026-07-17 14:18:05 -05:00
wjarvis mos-comms 1487e58766 comms: usc 20260717T191404Z 2026-07-17 14:14:04 -05:00
Jarvis 33e497b587 comms: homelab 20260717T191310Z 2026-07-17 14:13:10 -05:00
wjarvis mos-comms 44197766ed comms: usc 20260717T191137Z 2026-07-17 14:11:37 -05:00
Jarvis 5686e656b4 comms: homelab 20260717T190730Z 2026-07-17 14:07:31 -05:00
wjarvis mos-comms 6221cd3899 comms: usc 20260717T185423Z 2026-07-17 13:54:23 -05:00
wjarvis mos-comms adc3d2b1e6 comms: usc 20260717T184343Z 2026-07-17 13:43:43 -05:00
wjarvis mos-comms 058a6aaa18 comms: usc 20260717T184244Z 2026-07-17 13:42:44 -05:00
Jarvis c91639e09f comms: homelab 20260717T184100Z 2026-07-17 13:41:00 -05:00
wjarvis mos-comms 025798b823 comms: usc 20260717T183700Z 2026-07-17 13:37:01 -05:00
wjarvis mos-comms b6fbbc0d58 comms: usc 20260717T182756Z 2026-07-17 13:27:56 -05:00
Jarvis 0f932f3035 comms: homelab 20260717T182340Z 2026-07-17 13:23:40 -05:00
wjarvis mos-comms b081ba4df4 comms: usc 20260717T181654Z 2026-07-17 13:16:55 -05:00
wjarvis mos-comms d3481f026b comms: usc 20260717T180959Z 2026-07-17 13:09:59 -05:00
Jarvis 4e6ddd59ef comms: homelab 20260717T180506Z 2026-07-17 13:05:06 -05:00
wjarvis mos-comms f00705b026 comms: usc 20260717T175924Z 2026-07-17 12:59:25 -05:00
Jarvis 1e4a15db59 comms: homelab 20260717T175901Z 2026-07-17 12:59:01 -05:00
Jarvis 37b6603d33 comms: homelab 20260717T175828Z 2026-07-17 12:58:28 -05:00
wjarvis mos-comms 50f8a2a59f comms: usc 20260717T175638Z 2026-07-17 12:56:38 -05:00
Jarvis a99d429f34 comms: homelab 20260717T175222Z 2026-07-17 12:52:23 -05:00
wjarvis mos-comms 6deb5eb7f8 comms: usc 20260717T174634Z 2026-07-17 12:46:34 -05:00
Jarvis d168f54dfd comms: homelab 20260717T173859Z 2026-07-17 12:38:59 -05:00
Jarvis 1a03d60287 comms: homelab 20260717T172938Z 2026-07-17 12:29:38 -05:00
wjarvis mos-comms b2958bbed7 comms: usc 20260717T172744Z 2026-07-17 12:27:44 -05:00
wjarvis mos-comms 8c3bb2f3a5 comms: usc 20260717T172245Z 2026-07-17 12:22:46 -05:00
Jarvis e9f015ace4 comms: homelab 20260717T172124Z 2026-07-17 12:21:25 -05:00
wjarvis mos-comms 0a94e37dbe comms: usc 20260717T171933Z 2026-07-17 12:19:33 -05:00
wjarvis mos-comms 719862de83 comms: usc 20260717T171452Z 2026-07-17 12:14:52 -05:00
Jarvis 22bdaac379 comms: homelab 20260717T171446Z 2026-07-17 12:14:46 -05:00
wjarvis mos-comms 912ad391ff comms: usc 20260717T171346Z 2026-07-17 12:13:46 -05:00
Jarvis ea73655e04 comms: homelab 20260717T171301Z 2026-07-17 12:13:01 -05:00
wjarvis mos-comms 22c1752c30 comms: usc 20260717T171127Z 2026-07-17 12:11:27 -05:00
Jarvis b298a4a7ad comms: homelab 20260717T171059Z 2026-07-17 12:11:00 -05:00
wjarvis mos-comms a8edd975a9 comms: usc 20260717T171030Z 2026-07-17 12:10:30 -05:00
wjarvis mos-comms 64d6b982f9 comms: usc 20260717T171010Z 2026-07-17 12:10:10 -05:00
Jarvis 76c34e54d3 comms: homelab 20260717T170945Z 2026-07-17 12:09:45 -05:00
wjarvis mos-comms 47a865f943 comms: usc 20260717T170903Z 2026-07-17 12:09:03 -05:00
wjarvis mos-comms d7fad74595 comms: usc 20260717T170818Z 2026-07-17 12:08:18 -05:00
Jarvis dab8657af1 comms: homelab 20260717T170329Z 2026-07-17 12:03:30 -05:00
wjarvis mos-comms c116447631 comms: usc 20260717T170211Z 2026-07-17 12:02:11 -05:00
Jarvis 3d4fa20adf comms: homelab 20260717T165952Z 2026-07-17 11:59:52 -05:00
wjarvis mos-comms 4466e2d82c comms: usc 20260717T165845Z 2026-07-17 11:58:45 -05:00
Jarvis ab0e15afb2 comms: homelab 20260717T165710Z 2026-07-17 11:57:10 -05:00
wjarvis mos-comms 5cbda2df31 comms: usc 20260717T165422Z 2026-07-17 11:54:23 -05:00
Jarvis 3259aef924 comms: homelab 20260717T164743Z 2026-07-17 11:47:43 -05:00
Jarvis 21766447d7 comms: homelab 20260717T163919Z 2026-07-17 11:39:19 -05:00
Jarvis 924cbd7f4b comms: homelab 20260717T163848Z 2026-07-17 11:38:49 -05:00
wjarvis mos-comms ea12623026 comms: usc 20260717T163703Z 2026-07-17 11:37:05 -05:00
Jarvis df91a4e888 comms: homelab 20260717T163226Z 2026-07-17 11:32:26 -05:00
wjarvis mos-comms bd68956622 comms: usc 20260717T163131Z 2026-07-17 11:31:31 -05:00
Jarvis 8e6939f321 comms: homelab 20260717T163055Z 2026-07-17 11:30:56 -05:00
wjarvis mos-comms 693fd9aaa0 comms: usc 20260717T162912Z 2026-07-17 11:29:13 -05:00
Jarvis a064859482 comms: homelab 20260717T162537Z 2026-07-17 11:25:37 -05:00
wjarvis mos-comms f631a3c76a comms: usc 20260717T162402Z 2026-07-17 11:24:03 -05:00
Jarvis d9bd8fab26 comms: homelab 20260717T161951Z 2026-07-17 11:19:52 -05:00
wjarvis mos-comms 4d0ba9fe49 comms: usc 20260717T161358Z 2026-07-17 11:13:58 -05:00
Jarvis 8cc3460b93 comms: homelab 20260717T054411Z 2026-07-17 00:44:11 -05:00
Jarvis 5a62453e1f comms: homelab 20260717T054002Z 2026-07-17 00:40:02 -05:00
Jarvis afa325c0e5 comms: homelab 20260717T051302Z 2026-07-17 00:13:02 -05:00
Jarvis cc2ea4d78e comms: homelab 20260717T050342Z 2026-07-17 00:03:42 -05:00
Jarvis a4573475ca comms: homelab 20260717T045530Z 2026-07-16 23:55:30 -05:00
Jarvis 9d238f7009 comms: homelab 20260717T044622Z 2026-07-16 23:46:22 -05:00
Jarvis 84088ee3c8 comms: homelab 20260717T043324Z 2026-07-16 23:33:24 -05:00
Jarvis 558a6af7e8 comms: homelab 20260717T042528Z 2026-07-16 23:25:28 -05:00
Jarvis 6ff8983230 comms: homelab 20260717T040522Z 2026-07-16 23:05:22 -05:00
Jarvis 838a90b51e comms: homelab 20260717T034955Z 2026-07-16 22:49:55 -05:00
Jarvis d28f4ba980 comms: homelab 20260717T034658Z 2026-07-16 22:46:59 -05:00
wjarvis mos-comms a93b168522 comms: usc 20260717T034229Z 2026-07-16 22:42:29 -05:00
Jarvis 8e402b0827 comms: homelab 20260717T034041Z 2026-07-16 22:40:41 -05:00
wjarvis mos-comms 6599ae33b9 comms: usc 20260717T032630Z 2026-07-16 22:26:30 -05:00
wjarvis mos-comms c5306ed7a5 comms: usc 20260717T031936Z 2026-07-16 22:19:36 -05:00
Jarvis cd0a0b223d comms: homelab 20260717T024629Z 2026-07-16 21:46:29 -05:00
wjarvis mos-comms 954bc46de7 comms: usc 20260717T023738Z 2026-07-16 21:37:38 -05:00
Jarvis 8b3297c3e8 comms: homelab 20260717T023645Z 2026-07-16 21:36:45 -05:00
Jarvis 8fae9b12fb comms: homelab 20260717T021019Z 2026-07-16 21:10:19 -05:00
Jarvis a81005672a comms: homelab 20260717T020606Z 2026-07-16 21:06:06 -05:00
Jarvis bff8c49253 comms: homelab 20260717T011533Z 2026-07-16 20:15:33 -05:00
Jarvis fd924d30ba comms: homelab 20260717T010556Z 2026-07-16 20:05:56 -05:00
wjarvis mos-comms 9b332f1a8d comms: usc 20260717T010236Z 2026-07-16 20:02:36 -05:00
Jarvis ea4fd1b65b comms: homelab 20260717T010120Z 2026-07-16 20:01:20 -05:00
Jarvis ca66ffaa33 comms: homelab 20260717T005321Z 2026-07-16 19:53:21 -05:00
wjarvis mos-comms 58a65886a9 comms: usc 20260717T005310Z 2026-07-16 19:53:10 -05:00
Jarvis 81aaf995ae comms: homelab 20260717T005121Z 2026-07-16 19:51:21 -05:00
wjarvis mos-comms 1539b6f5bf comms: usc 20260717T005048Z 2026-07-16 19:50:48 -05:00
Jarvis 6288aade27 comms: homelab 20260717T005007Z 2026-07-16 19:50:07 -05:00
wjarvis mos-comms b1d248c2a0 comms: usc 20260717T004800Z 2026-07-16 19:48:00 -05:00
Jarvis 7d334c0e60 comms: homelab 20260717T004659Z 2026-07-16 19:46:59 -05:00
wjarvis mos-comms 0a700445a3 comms: usc 20260717T004423Z 2026-07-16 19:44:23 -05:00
Jarvis e52ef3d3c6 comms: homelab 20260717T003948Z 2026-07-16 19:39:49 -05:00
wjarvis mos-comms 5c9af05691 comms: usc 20260717T003558Z 2026-07-16 19:35:58 -05:00
Jarvis 2aa669a026 comms: homelab 20260717T003303Z 2026-07-16 19:33:03 -05:00
wjarvis mos-comms 03bd84db1d comms: usc 20260717T002517Z 2026-07-16 19:25:17 -05:00
Jarvis bce06f9336 comms: homelab 20260717T002045Z 2026-07-16 19:20:45 -05:00
wjarvis mos-comms 267fc9a787 comms: usc 20260717T001955Z 2026-07-16 19:19:56 -05:00
Jarvis 7652bc7f3d comms: homelab 20260717T001825Z 2026-07-16 19:18:25 -05:00
wjarvis mos-comms e7e1c486e9 comms: usc 20260717T001737Z 2026-07-16 19:17:38 -05:00
Jarvis 6efb95ed07 comms: homelab 20260717T001619Z 2026-07-16 19:16:19 -05:00
wjarvis mos-comms 5a6ef27481 comms: usc 20260717T001525Z 2026-07-16 19:15:25 -05:00
Jarvis bf2adbf5a2 comms: homelab 20260717T000921Z 2026-07-16 19:09:21 -05:00
Jarvis 33236774d1 comms: homelab 20260717T000614Z 2026-07-16 19:06:14 -05:00
wjarvis mos-comms c77e4c9e35 comms: usc 20260717T000444Z 2026-07-16 19:04:44 -05:00
wjarvis mos-comms a7920439a7 comms: usc 20260717T000144Z 2026-07-16 19:01:45 -05:00
Jarvis 958bc7d369 comms: homelab 20260716T235901Z 2026-07-16 18:59:01 -05:00
wjarvis mos-comms 3b24bb8c62 comms: usc 20260716T232048Z 2026-07-16 18:20:49 -05:00
Jarvis 5e443f5a0c comms: homelab 20260716T231934Z 2026-07-16 18:19:34 -05:00
wjarvis mos-comms 93dc894e69 comms: usc 20260716T231223Z 2026-07-16 18:12:23 -05:00
Jarvis 597b4e4322 comms: homelab 20260716T231157Z 2026-07-16 18:11:58 -05:00
wjarvis mos-comms a58f9d58d7 comms: usc 20260716T230921Z 2026-07-16 18:09:21 -05:00
Jarvis 0f2852a4ed comms: homelab 20260716T230349Z 2026-07-16 18:03:50 -05:00
wjarvis mos-comms 84310c81f4 comms: usc 20260716T230203Z 2026-07-16 18:02:03 -05:00
Jarvis 412c03468f comms: homelab 20260716T225914Z 2026-07-16 17:59:14 -05:00
wjarvis mos-comms a2fcefa35d comms: usc 20260716T225854Z 2026-07-16 17:58:54 -05:00
wjarvis mos-comms c29208fda1 comms: usc 20260716T225547Z 2026-07-16 17:55:48 -05:00
Jarvis 65ed453443 comms: homelab 20260716T225411Z 2026-07-16 17:54:11 -05:00
wjarvis mos-comms 15cca9db1c comms: usc 20260716T224351Z 2026-07-16 17:43:52 -05:00
Jarvis 1d1fd17a33 comms: homelab 20260716T224154Z 2026-07-16 17:41:54 -05:00
Jarvis 80a4096f75 comms: homelab 20260716T222617Z 2026-07-16 17:26:17 -05:00
wjarvis mos-comms 87dae08286 comms: usc 20260716T222138Z 2026-07-16 17:21:38 -05:00
wjarvis mos-comms a6de7801ff comms: usc 20260716T221912Z 2026-07-16 17:19:12 -05:00
Jarvis af70995755 comms: homelab 20260716T221852Z 2026-07-16 17:18:53 -05:00
wjarvis mos-comms e37abcfe77 comms: usc 20260716T221638Z 2026-07-16 17:16:38 -05:00
Jarvis 860ac0dfb1 comms: homelab 20260716T221035Z 2026-07-16 17:10:36 -05:00
Jarvis 3b84dd4d1e comms: homelab 20260716T220558Z 2026-07-16 17:05:58 -05:00
wjarvis mos-comms 69f1ea0fb4 comms: usc 20260716T220445Z 2026-07-16 17:04:45 -05:00
wjarvis mos-comms 490aa76415 comms: usc 20260716T215656Z 2026-07-16 16:56:56 -05:00
wjarvis mos-comms 05edd269a8 comms: usc 20260716T213201Z 2026-07-16 16:32:02 -05:00
Jarvis c719228d39 comms: homelab 20260716T213036Z 2026-07-16 16:30:36 -05:00
wjarvis mos-comms 53d0a9ba93 comms: usc 20260716T212948Z 2026-07-16 16:29:48 -05:00
Jarvis a8baa9f96b comms: homelab 20260716T212605Z 2026-07-16 16:26:05 -05:00
wjarvis mos-comms 8b3d937899 comms: usc 20260716T212356Z 2026-07-16 16:23:57 -05:00
Jarvis 1d43d35c47 comms: homelab 20260716T212201Z 2026-07-16 16:22:01 -05:00
wjarvis mos-comms 40413fb9c7 comms: usc 20260716T211842Z 2026-07-16 16:18:43 -05:00
Jarvis 77d5cd0ccb comms: homelab 20260716T210741Z 2026-07-16 16:07:41 -05:00
wjarvis mos-comms 91ed0d035a comms: usc 20260716T210612Z 2026-07-16 16:06:12 -05:00
wjarvis mos-comms 218da96b55 comms: usc 20260716T210540Z 2026-07-16 16:05:40 -05:00
Jarvis a4fe329ffc comms: homelab 20260716T210300Z 2026-07-16 16:03:00 -05:00
Jarvis 45da900080 comms: homelab 20260716T202942Z 2026-07-16 15:29:43 -05:00
Jarvis bd38ce9a61 comms: homelab 20260716T201301Z 2026-07-16 15:13:01 -05:00
wjarvis mos-comms 3a12be5e07 comms: usc 20260716T200756Z 2026-07-16 15:07:57 -05:00
Jarvis fcff1e6a19 comms: homelab 20260716T200217Z 2026-07-16 15:02:17 -05:00
Jarvis c46901d713 comms: homelab 20260716T193700Z 2026-07-16 14:37:00 -05:00
Jarvis 5b4615c9ea comms: homelab 20260716T191954Z 2026-07-16 14:19:54 -05:00
Jarvis 868458b5aa comms: homelab 20260716T185400Z 2026-07-16 13:54:00 -05:00
Jarvis 86dc2d69e3 comms: homelab 20260716T184048Z 2026-07-16 13:40:48 -05:00
Jarvis ef88212328 comms: homelab 20260716T182238Z 2026-07-16 13:22:39 -05:00
Jarvis 3e59e12316 comms: homelab 20260716T180558Z 2026-07-16 13:05:58 -05:00
Jarvis 570e27035f comms: homelab 20260716T173841Z 2026-07-16 12:38:41 -05:00
Jarvis 40bc9a0980 comms: homelab 20260716T170145Z 2026-07-16 12:01:45 -05:00
Jarvis 77c5e0e3be comms: homelab 20260716T164456Z 2026-07-16 11:44:56 -05:00
Jarvis b482f882c2 comms: homelab 20260716T163616Z 2026-07-16 11:36:16 -05:00
Jarvis a008e25308 comms: homelab 20260716T162531Z 2026-07-16 11:25:31 -05:00
Jarvis cd30f8c66d comms: homelab 20260716T160753Z 2026-07-16 11:07:53 -05:00
Jarvis 36a87a51e4 comms: homelab 20260716T160521Z 2026-07-16 11:05:21 -05:00
Jarvis 74ad5848d0 comms: homelab 20260716T155603Z 2026-07-16 10:56:03 -05:00
Jarvis 49cfe1604f comms: homelab 20260716T152713Z 2026-07-16 10:27:14 -05:00
Jarvis 77158132de comms: homelab 20260716T151028Z 2026-07-16 10:10:28 -05:00
Jarvis a66459c1ef comms: homelab 20260716T144847Z 2026-07-16 09:48:47 -05:00
Jarvis 382b59bfab comms: homelab 20260716T143547Z 2026-07-16 09:35:47 -05:00
Jarvis eb663d6b3c comms: homelab 20260716T133525Z 2026-07-16 08:35:26 -05:00
wjarvis mos-comms 7508070be1 comms: usc 20260716T132814Z 2026-07-16 08:28:14 -05:00
Jarvis 72ce456046 comms: homelab 20260716T132635Z 2026-07-16 08:26:35 -05:00
Jarvis 13e83821a2 comms: homelab 20260716T122032Z 2026-07-16 07:20:32 -05:00
Jarvis 7a5f499b25 comms: homelab 20260716T114624Z 2026-07-16 06:46:24 -05:00
Jarvis bf71e86084 comms: homelab 20260716T112046Z 2026-07-16 06:20:46 -05:00
Jarvis 07a4c8f9df comms: homelab 20260716T105629Z 2026-07-16 05:56:29 -05:00
Jarvis a474f447bf comms: homelab 20260716T103837Z 2026-07-16 05:38:37 -05:00
Jarvis 22b85eb2cd comms: homelab 20260716T095940Z 2026-07-16 04:59:40 -05:00
Jarvis ec9ba6e18b comms: homelab 20260716T091416Z 2026-07-16 04:14:16 -05:00
Jarvis 093e2e9815 comms: homelab 20260716T081621Z 2026-07-16 03:16:21 -05:00
Jarvis bbf367bd28 comms: homelab 20260716T074951Z 2026-07-16 02:49:51 -05:00
Jarvis e28041ce03 comms: homelab 20260716T073343Z 2026-07-16 02:33:43 -05:00
Jarvis 8ce238379c comms: homelab 20260716T072115Z 2026-07-16 02:21:15 -05:00
Jarvis c5dea41cd1 comms: homelab 20260716T065305Z 2026-07-16 01:53:05 -05:00
Jarvis 31604d7066 comms: homelab 20260716T064713Z 2026-07-16 01:47:13 -05:00
Jarvis dc6df621d7 comms: homelab 20260716T062711Z 2026-07-16 01:27:11 -05:00
Jarvis 0e5740c2c4 comms: homelab 20260716T062300Z 2026-07-16 01:23:00 -05:00
Jarvis f847211bc7 comms: homelab 20260716T061207Z 2026-07-16 01:12:07 -05:00
Jarvis e2b9c7c588 comms: homelab 20260716T060157Z 2026-07-16 01:01:57 -05:00
Jarvis f4028c5608 comms: homelab 20260716T055721Z 2026-07-16 00:57:21 -05:00
Jarvis 24a503c4d6 comms: homelab 20260716T054839Z 2026-07-16 00:48:39 -05:00
Jarvis 29b0954170 comms: homelab 20260716T053646Z 2026-07-16 00:36:46 -05:00
Jarvis 450e4b25de comms: homelab 20260716T051703Z 2026-07-16 00:17:03 -05:00
Jarvis b9788d79b0 comms: homelab 20260716T043841Z 2026-07-15 23:38:41 -05:00
Jarvis af08bb6ed7 comms: homelab 20260716T043609Z 2026-07-15 23:36:09 -05:00
Jarvis ff09d723c2 comms: homelab 20260716T040256Z 2026-07-15 23:02:56 -05:00
Jarvis 08b6f68bbe comms: homelab 20260716T034008Z 2026-07-15 22:40:08 -05:00
Jarvis 39b944a7d9 comms: homelab 20260716T030959Z 2026-07-15 22:10:00 -05:00
Jarvis ccf872c28b comms: homelab 20260716T022655Z 2026-07-15 21:26:55 -05:00
Jarvis f5fc61dafa comms: homelab 20260716T020202Z 2026-07-15 21:02:02 -05:00
Jarvis 9a60e43f89 comms: homelab 20260716T013435Z 2026-07-15 20:34:35 -05:00
wjarvis mos-comms 8ba5e5c5d4 comms: usc 20260716T004701Z 2026-07-15 19:47:01 -05:00
Jarvis a896d0d072 comms: homelab 20260716T004626Z 2026-07-15 19:46:26 -05:00
wjarvis mos-comms 1cf1c1eef1 comms: usc 20260716T004019Z 2026-07-15 19:40:19 -05:00
Jarvis 255bf5c33e comms: homelab 20260716T003919Z 2026-07-15 19:39:19 -05:00
wjarvis mos-comms c5c24cf200 comms: usc 20260716T003657Z 2026-07-15 19:36:57 -05:00
wjarvis mos-comms 8bce99c875 comms: usc 20260716T003556Z 2026-07-15 19:35:56 -05:00
Jarvis d19c6feaed comms: homelab 20260716T003508Z 2026-07-15 19:35:08 -05:00
Jarvis c5be9e793a comms: homelab 20260716T002830Z 2026-07-15 19:28:30 -05:00
Jarvis 73010662a0 comms: homelab 20260716T002621Z 2026-07-15 19:26:21 -05:00
wjarvis mos-comms b15d537da3 comms: usc 20260716T002224Z 2026-07-15 19:22:24 -05:00
Jarvis 4d489dc20f comms: homelab 20260716T002015Z 2026-07-15 19:20:15 -05:00
wjarvis mos-comms 29f1d2810f comms: usc 20260716T001525Z 2026-07-15 19:15:25 -05:00
wjarvis mos-comms c36cdcd6f1 comms: usc 20260716T001310Z 2026-07-15 19:13:10 -05:00
wjarvis mos-comms 650dd65417 comms: usc 20260716T001135Z 2026-07-15 19:11:35 -05:00
Jarvis 49bfc434e1 comms: homelab 20260716T001001Z 2026-07-15 19:10:01 -05:00
wjarvis mos-comms f030641c4d comms: usc 20260716T000228Z 2026-07-15 19:02:28 -05:00
wjarvis mos-comms e1b5deab21 comms: usc 20260715T235819Z 2026-07-15 18:58:19 -05:00
wjarvis mos-comms 1e0fed09e0 comms: usc 20260715T235710Z 2026-07-15 18:57:10 -05:00
Jarvis e4b53c5fed comms: homelab 20260715T235559Z 2026-07-15 18:55:59 -05:00
wjarvis mos-comms b1958f6c2d comms: usc 20260715T234940Z 2026-07-15 18:49:40 -05:00
wjarvis mos-comms 278b08137c comms: usc 20260715T234642Z 2026-07-15 18:46:43 -05:00
wjarvis mos-comms fb2ef45f7a comms: usc 20260715T234546Z 2026-07-15 18:45:46 -05:00
Jarvis a6b8c3ad94 comms: homelab 20260715T234419Z 2026-07-15 18:44:19 -05:00
wjarvis mos-comms 79f21964f2 comms: usc 20260715T233559Z 2026-07-15 18:35:59 -05:00
wjarvis mos-comms 3c54c7773d comms: usc 20260715T233323Z 2026-07-15 18:33:23 -05:00
wjarvis mos-comms 413a704609 comms: usc 20260715T233234Z 2026-07-15 18:32:34 -05:00
Jarvis f93996af39 comms: homelab 20260715T233102Z 2026-07-15 18:31:03 -05:00
wjarvis mos-comms cc404ad8d4 comms: usc 20260715T232146Z 2026-07-15 18:21:46 -05:00
wjarvis mos-comms a05dfcb360 comms: usc 20260715T231907Z 2026-07-15 18:19:07 -05:00
wjarvis mos-comms c59b3fa53d comms: usc 20260715T231817Z 2026-07-15 18:18:17 -05:00
Jarvis c249d9e172 comms: homelab 20260715T231733Z 2026-07-15 18:17:34 -05:00
wjarvis mos-comms 91202653e4 comms: usc 20260715T230454Z 2026-07-15 18:04:54 -05:00
wjarvis mos-comms a662901ff0 comms: usc 20260715T230253Z 2026-07-15 18:02:53 -05:00
wjarvis mos-comms b72c19f87d comms: usc 20260715T230159Z 2026-07-15 18:01:59 -05:00
Jarvis 0a696ec2b3 comms: homelab 20260715T230102Z 2026-07-15 18:01:03 -05:00
wjarvis mos-comms 8e3f973905 comms: usc 20260715T224627Z 2026-07-15 17:46:27 -05:00
wjarvis mos-comms 66bdffab81 comms: usc 20260715T224257Z 2026-07-15 17:42:57 -05:00
wjarvis mos-comms e49fc9d782 comms: usc 20260715T224145Z 2026-07-15 17:41:45 -05:00
Jarvis 52870b3e0e comms: homelab 20260715T224054Z 2026-07-15 17:40:54 -05:00
Jarvis c806d75200 comms: homelab 20260715T223624Z 2026-07-15 17:36:24 -05:00
wjarvis mos-comms 566ba5a913 comms: usc 20260715T223527Z 2026-07-15 17:35:28 -05:00
Jarvis 21d2e94baf comms: homelab 20260715T223027Z 2026-07-15 17:30:27 -05:00
wjarvis mos-comms dd1730c7f2 comms: usc 20260715T222913Z 2026-07-15 17:29:13 -05:00
Jarvis 7ac93508d5 comms: homelab 20260715T222747Z 2026-07-15 17:27:47 -05:00
Jarvis 1e140979df comms: homelab 20260715T213632Z 2026-07-15 16:36:33 -05:00
wjarvis mos-comms 74b8b19e87 comms: usc 20260715T210002Z 2026-07-15 16:00:02 -05:00
Jarvis 8c1fc60fa5 comms: homelab 20260715T205856Z 2026-07-15 15:58:56 -05:00
Jarvis b29cd82237 comms: homelab 20260715T205616Z 2026-07-15 15:56:16 -05:00
Jarvis 5dce007464 comms: homelab 20260715T205055Z 2026-07-15 15:50:55 -05:00
wjarvis mos-comms ecd991bfb0 comms: usc 20260715T204215Z 2026-07-15 15:42:15 -05:00
Jarvis f54cda33bc comms: homelab 20260715T203959Z 2026-07-15 15:39:59 -05:00
wjarvis mos-comms e733dcf3f1 comms: usc 20260715T203832Z 2026-07-15 15:38:32 -05:00
Jarvis 1b0d605a7e comms: homelab 20260715T203725Z 2026-07-15 15:37:25 -05:00
wjarvis mos-comms a9202518a4 comms: usc 20260715T202510Z 2026-07-15 15:25:10 -05:00
Jarvis 4306421eae comms: homelab 20260715T202253Z 2026-07-15 15:22:53 -05:00
wjarvis mos-comms 86fac8f22a comms: usc 20260715T201615Z 2026-07-15 15:16:16 -05:00
Jarvis 755b4ca9ac comms: homelab 20260715T201506Z 2026-07-15 15:15:06 -05:00
wjarvis mos-comms eecb01a978 comms: usc 20260715T200842Z 2026-07-15 15:08:42 -05:00
wjarvis mos-comms e456baea66 comms: usc 20260715T200231Z 2026-07-15 15:02:31 -05:00
Jarvis cce17bb689 comms: homelab 20260715T195810Z 2026-07-15 14:58:10 -05:00
Jarvis 72d087bee1 comms: homelab 20260715T195004Z 2026-07-15 14:50:04 -05:00
wjarvis mos-comms 3856a67749 comms: usc 20260715T194752Z 2026-07-15 14:47:52 -05:00
Jarvis c3bc77a233 comms: homelab 20260715T194625Z 2026-07-15 14:46:25 -05:00
wjarvis mos-comms b8e0f364b3 comms: usc 20260715T194426Z 2026-07-15 14:44:26 -05:00
Jarvis 081803e9e5 comms: homelab 20260715T194153Z 2026-07-15 14:41:53 -05:00
Jarvis 52994c3ec9 comms: homelab 20260715T191727Z 2026-07-15 14:17:27 -05:00
Jarvis fe07a0b5c1 comms: homelab 20260715T190349Z 2026-07-15 14:03:49 -05:00
Jarvis 5eff418a84 comms: homelab 20260715T185731Z 2026-07-15 13:57:31 -05:00
Jarvis 2519828566 comms: homelab 20260715T184308Z 2026-07-15 13:43:09 -05:00
Jarvis 4348e44b2e comms: homelab 20260715T180046Z 2026-07-15 13:00:46 -05:00
Jarvis d6246909ae comms: homelab 20260715T174141Z 2026-07-15 12:41:41 -05:00
Jarvis ab02ead32e comms: homelab 20260715T172156Z 2026-07-15 12:21:57 -05:00
wjarvis mos-comms d7e5b409c1 comms: usc 20260715T170232Z 2026-07-15 12:02:32 -05:00
JarvisandClaude Opus 4.8 204b09c672 comms: relay M3 completion and M4 start
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-15 12:01:44 -05:00
JarvisandClaude Opus 4.8 92a03906e5 comms: relay reviewed M3-002 head
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-15 11:40:20 -05:00
Jarvis 5f185e41ea comms: homelab 20260715T161510Z 2026-07-15 11:15:32 -05:00
Jarvis 666f6c9024 comms: homelab 20260715T160422Z 2026-07-15 11:04:48 -05:00
Jarvis ea98598c81 comms: homelab 20260715T155411Z 2026-07-15 10:54:29 -05:00
wjarvis mos-comms 634f4369af comms: usc 20260715T151932Z 2026-07-15 10:19:33 -05:00
Jarvis 5a06d65e2e comms: homelab 20260715T151844Z 2026-07-15 10:18:44 -05:00
Jarvis 4c1035a521 comms: homelab 20260715T150439Z 2026-07-15 10:04:39 -05:00
Jarvis 054b442296 comms: homelab 20260715T143907Z 2026-07-15 09:39:07 -05:00
Jarvis 653684c26d comms: homelab 20260715T143519Z 2026-07-15 09:35:19 -05:00
Jarvis 33fa790e3c comms: homelab 20260715T142701Z 2026-07-15 09:27:01 -05:00
Jarvis 2bc5cf6ab8 comms: homelab 20260715T142058Z 2026-07-15 09:20:58 -05:00
Jarvis 891461ea0d comms: homelab 20260715T141358Z 2026-07-15 09:13:58 -05:00
Jarvis ec334a6b3b comms: homelab 20260715T135717Z 2026-07-15 08:57:17 -05:00
Jarvis c87b894743 comms: homelab 20260715T135437Z 2026-07-15 08:54:37 -05:00
Jarvis 969581590f comms: homelab 20260715T134627Z 2026-07-15 08:46:27 -05:00
wjarvis mos-comms 26da717842 comms: usc 20260715T134511Z 2026-07-15 08:45:12 -05:00
Jarvis 7142d165c6 comms: homelab 20260715T134139Z 2026-07-15 08:41:39 -05:00
Jarvis d212f357b8 comms: homelab 20260715T133926Z 2026-07-15 08:39:26 -05:00
Jarvis 21de4b5eb5 comms: homelab 20260715T132843Z 2026-07-15 08:28:43 -05:00
Jarvis 252b40d1a3 comms: homelab 20260715T132547Z 2026-07-15 08:25:47 -05:00
Jarvis 5e291ad9ba comms: homelab 20260715T131939Z 2026-07-15 08:19:39 -05:00
Jarvis 9ca3271e9e comms: homelab 20260715T131705Z 2026-07-15 08:17:05 -05:00
Jarvis 33321f31e6 comms: homelab 20260715T130941Z 2026-07-15 08:09:42 -05:00
Jarvis 4c070533c0 comms: homelab 20260715T125423Z 2026-07-15 07:54:23 -05:00
Jarvis bac5b67a52 comms: homelab 20260715T123922Z 2026-07-15 07:39:22 -05:00
Jarvis 7dd4f6409a comms: homelab 20260715T121539Z 2026-07-15 07:15:40 -05:00
wjarvis mos-comms 15feb6cd1e comms: usc 20260715T121334Z 2026-07-15 07:13:35 -05:00
Jarvis aefa13c755 comms: homelab 20260715T121311Z 2026-07-15 07:13:11 -05:00
Jarvis eb6a792499 comms: homelab 20260715T120339Z 2026-07-15 07:03:39 -05:00
Jarvis bc12bd1b6e comms: homelab 20260715T115602Z 2026-07-15 06:56:02 -05:00
Jarvis cd4d67e96e comms: homelab 20260715T115125Z 2026-07-15 06:51:25 -05:00
Jarvis 9690f95a3e comms: homelab 20260715T113159Z 2026-07-15 06:31:59 -05:00
Jarvis f814ab1322 comms: homelab 20260715T112519Z 2026-07-15 06:25:19 -05:00
Jarvis 422cbdf237 comms: homelab 20260715T111410Z 2026-07-15 06:14:10 -05:00
Jarvis a062fab0fe comms: homelab 20260715T110805Z 2026-07-15 06:08:05 -05:00
Jarvis c679fa8a75 comms: homelab 20260715T105236Z 2026-07-15 05:52:36 -05:00
Jarvis d441e4e204 comms: homelab 20260715T102331Z 2026-07-15 05:23:32 -05:00
Jarvis a08a8dd22f comms: homelab 20260715T101607Z 2026-07-15 05:16:07 -05:00
Jarvis 155cb142bc comms: homelab 20260715T100803Z 2026-07-15 05:08:03 -05:00
Jarvis 0cb3e75833 comms: homelab 20260715T092347Z 2026-07-15 04:23:47 -05:00
Jarvis 8281ab0c3e comms: homelab 20260715T092251Z 2026-07-15 04:22:51 -05:00
wjarvis mos-comms 89759b5f46 comms: usc 20260715T085727Z 2026-07-15 03:57:27 -05:00
Jarvis 8449dcc2cc comms: homelab 20260715T085637Z 2026-07-15 03:56:37 -05:00
Jarvis e019db3371 comms: homelab 20260715T084149Z 2026-07-15 03:41:49 -05:00
Jarvis bb9447f004 comms: homelab 20260715T083606Z 2026-07-15 03:36:06 -05:00
Jarvis 5fdc88a7c7 comms: homelab 20260715T082510Z 2026-07-15 03:25:10 -05:00
Jarvis 68f2f80669 comms: homelab 20260715T081457Z 2026-07-15 03:14:57 -05:00
Jarvis 4bb2c749c3 comms: homelab 20260715T075153Z 2026-07-15 02:51:53 -05:00
Jarvis 92170dcc4c comms: homelab 20260715T073238Z 2026-07-15 02:32:38 -05:00
Jarvis 90aed6220f comms: homelab 20260715T065251Z 2026-07-15 01:52:51 -05:00
Jarvis 1a91a13edb comms: homelab 20260715T062559Z 2026-07-15 01:25:59 -05:00
Jarvis 9fd779bc66 comms: homelab 20260715T060856Z 2026-07-15 01:08:56 -05:00
Jarvis 5460e5c63f comms: homelab 20260715T055934Z 2026-07-15 00:59:35 -05:00
Jarvis 4ee9b473e9 comms: homelab 20260715T054844Z 2026-07-15 00:48:44 -05:00
Jarvis bb2704527e comms: homelab 20260715T054515Z 2026-07-15 00:45:16 -05:00
Jarvis 35cdaf0d81 comms: homelab 20260715T053708Z 2026-07-15 00:37:08 -05:00
Jarvis 3c47980919 comms: homelab 20260715T053137Z 2026-07-15 00:31:37 -05:00
Jarvis 0087a7d6dc comms: homelab 20260715T052710Z 2026-07-15 00:27:10 -05:00
Jarvis 75b6a1a719 comms: homelab 20260715T044456Z 2026-07-14 23:44:56 -05:00
wjarvis mos-comms cb4853a5e4 comms: usc 20260715T044358Z 2026-07-14 23:43:58 -05:00
Jarvis 1ffc4b982c comms: homelab 20260715T043902Z 2026-07-14 23:39:02 -05:00
Jarvis 2bb1304e5d comms: homelab 20260715T040852Z 2026-07-14 23:08:52 -05:00
Jarvis e56b7c2114 comms: homelab 20260715T022820Z 2026-07-14 21:28:21 -05:00
Jarvis 6c338b8c34 comms: homelab 20260715T014941Z 2026-07-14 20:49:41 -05:00
wjarvis mos-comms d80bbaf335 comms: usc 20260715T014709Z 2026-07-14 20:47:10 -05:00
Jarvis 52fa2ae0bb comms: homelab 20260715T014556Z 2026-07-14 20:45:56 -05:00
Jarvis 9752175cf4 comms: homelab 20260715T012719Z 2026-07-14 20:27:19 -05:00
Jarvis 19abfc0efd comms: homelab 20260715T010915Z 2026-07-14 20:09:15 -05:00
Jarvis b938f54ae1 comms: homelab 20260715T010355Z 2026-07-14 20:03:55 -05:00
Jarvis 9ba1cb992f comms: homelab 20260715T003554Z 2026-07-14 19:35:54 -05:00
Jarvis 5253689bfc comms: homelab 20260715T001819Z 2026-07-14 19:18:19 -05:00
wjarvis mos-comms fd424de30e comms: usc 20260715T001533Z 2026-07-14 19:15:34 -05:00
Jarvis a482545412 comms: homelab 20260715T001300Z 2026-07-14 19:13:00 -05:00
Jarvis b0e9c92f6c docs: publish reviewed North Star rev4 artifact 2026-07-14 19:12:47 -05:00
Jarvis 26c464d68a comms: homelab 20260715T000906Z 2026-07-14 19:09:06 -05:00
Jarvis 283d44a707 comms: homelab 20260715T000144Z 2026-07-14 19:01:45 -05:00
wjarvis mos-comms 840da12ad5 comms: usc 20260714T235749Z 2026-07-14 18:57:49 -05:00
Jarvis 944598dc52 comms: homelab 20260714T235020Z 2026-07-14 18:50:20 -05:00
Jarvis 2b4c3643c3 comms: homelab 20260714T234258Z 2026-07-14 18:42:58 -05:00
Jarvis 5b925faa6d comms: homelab 20260714T233100Z 2026-07-14 18:31:00 -05:00
JarvisandClaude Opus 4.8 ea0541f435 comms: publish North Star rev3 artifact
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-14 18:30:44 -05:00
Jarvis 77a3beeb50 comms: homelab 20260714T233025Z 2026-07-14 18:30:25 -05:00
Jarvis 2953a58f55 comms: homelab 20260714T231003Z 2026-07-14 18:10:03 -05:00
wjarvis mos-comms baf0545cd2 comms: usc 20260714T230329Z 2026-07-14 18:03:30 -05:00
Jarvis 72a3bae6b0 comms: homelab 20260714T230224Z 2026-07-14 18:02:24 -05:00
wjarvis mos-comms 497dd6c0a6 comms: usc 20260714T225953Z 2026-07-14 17:59:54 -05:00
Jarvis 834f0126eb comms: homelab 20260714T225207Z 2026-07-14 17:52:07 -05:00
wjarvis mos-comms e8780f20ab comms: usc 20260714T224821Z 2026-07-14 17:48:21 -05:00
wjarvis mos-comms 3c1b3eb9bd comms: usc 20260714T223945Z 2026-07-14 17:39:45 -05:00
Jarvis 6233ba297d comms: homelab 20260714T222313Z 2026-07-14 17:23:13 -05:00
Jarvis b4be5b4d3f comms: homelab 20260714T221926Z 2026-07-14 17:19:26 -05:00
Jarvis 174a28af75 comms: publish web control-plane rev2 planning artifact 2026-07-14 17:19:16 -05:00
wjarvis mos-comms 25e5269ff3 comms: usc 20260714T221820Z 2026-07-14 17:18:20 -05:00
Jarvis 245fc723c2 comms: homelab 20260714T221751Z 2026-07-14 17:17:51 -05:00
wjarvis mos-comms 8c3b402ef0 comms: usc 20260714T220425Z 2026-07-14 17:04:25 -05:00
Jarvis 3c8d295ecf comms: homelab 20260714T220151Z 2026-07-14 17:01:51 -05:00
Jarvis 44b5c3aa52 comms: homelab 20260714T215708Z 2026-07-14 16:57:08 -05:00
wjarvis mos-comms c9f6e97a80 comms: usc 20260714T215454Z 2026-07-14 16:54:55 -05:00
Jarvis f37e069a94 comms: homelab 20260714T214833Z 2026-07-14 16:48:33 -05:00
Jarvis 19ffe3d93d comms: homelab 20260714T214458Z 2026-07-14 16:44:58 -05:00
Jarvis d22f08d324 comms: homelab 20260714T212528Z 2026-07-14 16:25:28 -05:00
Jarvis 303b9a6025 comms: homelab 20260714T211055Z 2026-07-14 16:10:56 -05:00
wjarvis mos-comms d8f2ac23ac comms: usc 20260714T205720Z 2026-07-14 15:57:20 -05:00
Jarvis 5742d76877 comms: homelab 20260714T205546Z 2026-07-14 15:55:46 -05:00
Jarvis 507139e34c comms: transmit frozen control-plane planning artifact 2026-07-14 15:55:37 -05:00
wjarvis mos-comms 3683aba627 comms: usc 20260714T205417Z 2026-07-14 15:54:17 -05:00
Jarvis aa831a785a comms: homelab 20260714T205313Z 2026-07-14 15:53:14 -05:00
wjarvis mos-comms 558696e539 comms: usc 20260714T205016Z 2026-07-14 15:50:17 -05:00
Jarvis d181ba6c22 comms: homelab 20260714T204515Z 2026-07-14 15:45:15 -05:00
Jarvis 7bbe34ee16 comms: homelab 20260714T203927Z 2026-07-14 15:39:27 -05:00
Jarvis c6e1afdda4 comms: homelab 20260714T203140Z 2026-07-14 15:31:41 -05:00
Jarvis c32314236a comms: homelab 20260714T203037Z 2026-07-14 15:30:37 -05:00
wjarvis mos-comms 2c3eb60441 comms: usc 20260714T202535Z 2026-07-14 15:25:35 -05:00
Jarvis c0ec6bfcbf comms: homelab 20260714T202403Z 2026-07-14 15:24:04 -05:00
Jarvis 05a2482aeb comms: homelab 20260714T202111Z 2026-07-14 15:21:11 -05:00
wjarvis mos-comms c2b866b37c comms: usc 20260714T202014Z 2026-07-14 15:20:14 -05:00
Jarvis cd13c6aa15 comms: homelab 20260714T201717Z 2026-07-14 15:17:18 -05:00
wjarvis mos-comms 067e2eced1 comms: usc 20260714T201537Z 2026-07-14 15:15:37 -05:00
Jarvis 4b7edd7a81 comms: homelab 20260714T201339Z 2026-07-14 15:13:39 -05:00
wjarvis mos-comms b5daf988a2 comms: usc 20260714T201245Z 2026-07-14 15:12:46 -05:00
Jarvis f50ed8f86f comms: homelab 20260714T201107Z 2026-07-14 15:11:07 -05:00
Jarvis 8b68c11da2 comms: homelab 20260714T200349Z 2026-07-14 15:03:50 -05:00
wjarvis mos-comms cdaa32d648 comms: usc 20260714T200246Z 2026-07-14 15:02:46 -05:00
wjarvis mos-comms dd49c3ba57 comms: usc 20260714T200237Z 2026-07-14 15:02:37 -05:00
Jarvis e4e98e97d9 comms: homelab 20260714T200114Z 2026-07-14 15:01:14 -05:00
Jarvis 3a7dd7d430 comms: homelab 20260714T195722Z 2026-07-14 14:57:22 -05:00
wjarvis mos-comms 062a2f1c97 comms: usc 20260714T195643Z 2026-07-14 14:56:44 -05:00
Jarvis a961bdda47 comms: homelab 20260714T195418Z 2026-07-14 14:54:18 -05:00
wjarvis mos-comms 1dfc68531f comms: usc 20260714T194043Z 2026-07-14 14:40:43 -05:00
wjarvis mos-comms 1658a29abd comms: usc 20260714T193952Z 2026-07-14 14:39:52 -05:00
Jarvis f29d7bc86d comms: homelab 20260714T193858Z 2026-07-14 14:38:58 -05:00
wjarvis mos-comms eecc6e3606 comms: usc 20260714T193803Z 2026-07-14 14:38:03 -05:00
wjarvis mos-comms 71042ad674 comms: usc 20260713T215109Z 2026-07-13 16:51:09 -05:00
Jarvis c20437b289 comms: homelab 20260713T215012Z 2026-07-13 16:50:12 -05:00
Jarvis dcd8e41d5d comms: homelab 20260713T214937Z 2026-07-13 16:49:37 -05:00
wjarvis mos-comms e047d33767 comms: usc 20260713T214921Z 2026-07-13 16:49:21 -05:00
wjarvis mos-comms 88a7822dfd comms: usc 20260713T214747Z 2026-07-13 16:47:47 -05:00
Jarvis 2dcc490dbc comms: homelab 20260713T214552Z 2026-07-13 16:45:52 -05:00
wjarvis mos-comms 52b4ccf399 comms: usc 20260713T214234Z 2026-07-13 16:42:34 -05:00
Jarvis 1156555f9d comms: homelab 20260713T214216Z 2026-07-13 16:42:17 -05:00
wjarvis mos-comms 0602dcdef3 comms: usc 20260713T214035Z 2026-07-13 16:40:37 -05:00
Jarvis 37e72bb29a comms: homelab 20260713T213922Z 2026-07-13 16:39:22 -05:00
homelab mos-comms 32443452fa brief: Decision #3 RATIFIED (Option A) + owner flexibility amendment (configurable recovery posture) 2026-07-13 16:39:21 -05:00
Jarvis f4eb75dc6b comms: homelab 20260713T213206Z 2026-07-13 16:32:06 -05:00
homelab mos-comms e8806df728 brief: Kanban SOT Decision #3 — independent verdict (Option A) 2026-07-13 16:32:06 -05:00
Jarvis f1a149a7f5 comms: homelab 20260713T212934Z 2026-07-13 16:29:34 -05:00
wjarvis mos-comms 7f700d4ca1 comms: usc 20260713T212611Z 2026-07-13 16:26:11 -05:00
wjarvis mos-comms fe71a42b28 comms: usc 20260713T212142Z 2026-07-13 16:21:42 -05:00
Jarvis fb373d5c88 comms: homelab 20260713T211947Z 2026-07-13 16:19:47 -05:00
Jarvis ae4ce99f4d comms: wjarvis 20260713T211701Z 2026-07-13 16:17:01 -05:00
wjarvis mos-comms a70fccccfa comms: wjarvis 20260713T211213Z 2026-07-13 16:12:13 -05:00
wjarvis mos-comms 9c820e2eb8 comms: wjarvis 20260713T211121Z 2026-07-13 16:11:21 -05:00
5867 changed files with 66629 additions and 1263373 deletions
+150 -20
View File
@@ -1,24 +1,154 @@
# Non-secret runtime settings for the mosaic-poc-agent container.
# Copy to .env if you want to override the defaults in compose.yaml.
#
# NEVER put credentials in this file. Authentication is supplied at
# runtime only, via one of the two documented paths:
# 1. read-only mounted pi auth file (default: ~/.pi/agent/auth.json,
# override the host path with PI_AUTH_FILE)
# 2. provider API key environment variable (ZAI_API_KEY or
# ANTHROPIC_API_KEY), passed through by compose.yaml when set
# ─────────────────────────────────────────────────────────────────────────────
# Mosaic — Environment Variables Reference
# Copy this file to .env and fill in the values for your deployment.
# Lines beginning with # are comments; optional vars are commented out.
# ─────────────────────────────────────────────────────────────────────────────
# Model provider (built-in pi provider name)
PI_PROVIDER=zai
# Model ID within the provider
PI_MODEL=glm-5.3-flash
# ─── Database (PostgreSQL 17 + pgvector) ─────────────────────────────────────
# Full connection string used by the gateway, ORM, and migration runner.
# Port 5433 avoids conflict with a host-side PostgreSQL instance.
DATABASE_URL=postgresql://mosaic:mosaic@localhost:5433/mosaic
# Optional: alternative host path of the pi credential file mounted
# read-only at /home/node/.pi/agent/auth.json in the container
#PI_AUTH_FILE=/home/jwoltje/.pi/agent/auth.json
# Docker Compose host-port override for the PostgreSQL container (default: 5433)
# PG_HOST_PORT=5433
# Optional: documented env-var auth alternative (secret! set in your
# shell or a gitignored .env, never commit)
#ZAI_API_KEY=
#ANTHROPIC_API_KEY=
# ─── Queue (Valkey 8 / Redis-compatible) ─────────────────────────────────────
# Port 6380 avoids conflict with a host-side Redis/Valkey instance.
VALKEY_URL=redis://localhost:6380
# Docker Compose host-port override for the Valkey container (default: 6380)
# VALKEY_HOST_PORT=6380
# ─── Gateway ─────────────────────────────────────────────────────────────────
# TCP port the NestJS/Fastify gateway listens on (default: 14242)
GATEWAY_PORT=14242
# Comma-separated list of allowed CORS origins.
# Must include the web app origin in production.
GATEWAY_CORS_ORIGIN=http://localhost:3000
# ─── Auth (BetterAuth) ───────────────────────────────────────────────────────
# REQUIRED — random secret used to sign sessions and tokens.
# Generate with: openssl rand -base64 32
BETTER_AUTH_SECRET=change-me-to-a-random-32-char-string
# Public base URL of the gateway (used by BetterAuth for callback URLs)
BETTER_AUTH_URL=http://localhost:14242
# ─── Web App (Next.js) ───────────────────────────────────────────────────────
# Public gateway URL — accessible from the browser, not just the server.
NEXT_PUBLIC_GATEWAY_URL=http://localhost:14242
# ─── OpenTelemetry ───────────────────────────────────────────────────────────
# OTLP HTTP endpoint (otel-collector or any OpenTelemetry-compatible backend)
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
# Service name shown in traces
OTEL_SERVICE_NAME=mosaic-gateway
# ─── AI Providers ────────────────────────────────────────────────────────────
# Ollama (local models — set OLLAMA_BASE_URL to enable)
# OLLAMA_BASE_URL=http://localhost:11434
# OLLAMA_HOST is a legacy alias for OLLAMA_BASE_URL
# OLLAMA_HOST=http://localhost:11434
# Comma-separated list of Ollama model IDs to register (default: llama3.2,codellama,mistral)
# OLLAMA_MODELS=llama3.2,codellama,mistral
# Anthropic (claude-sonnet-4-6, claude-opus-4-6, claude-haiku-4-5)
# ANTHROPIC_API_KEY=sk-ant-...
# OpenAI (gpt-4o, gpt-4o-mini, o3-mini)
# OPENAI_API_KEY=sk-...
# Z.ai / GLM (glm-4.5, glm-4.5-air, glm-4.5-flash)
# ZAI_API_KEY=...
# Custom providers — JSON array of provider configs
# Format: [{"id":"<id>","baseUrl":"<url>","apiKey":"<key>","models":[{"id":"<model-id>","name":"<label>"}]}]
# MOSAIC_CUSTOM_PROVIDERS=
# ─── Embedding Service ───────────────────────────────────────────────────────
# OpenAI-compatible embeddings endpoint (default: OpenAI)
# EMBEDDING_API_URL=https://api.openai.com/v1
# EMBEDDING_MODEL=text-embedding-3-small
# ─── Log Summarization Service ───────────────────────────────────────────────
# OpenAI-compatible chat completions endpoint for log summarization (default: OpenAI)
# SUMMARIZATION_API_URL=https://api.openai.com/v1
# SUMMARIZATION_MODEL=gpt-4o-mini
# Cron schedule for summarization job (default: every 6 hours)
# SUMMARIZATION_CRON=0 */6 * * *
# Cron schedule for log tier management (default: daily at 03:00)
# TIER_MANAGEMENT_CRON=0 3 * * *
# ─── Agent ───────────────────────────────────────────────────────────────────
# Filesystem sandbox root for agent file tools (default: process.cwd())
# AGENT_FILE_SANDBOX_DIR=/var/lib/mosaic/sandbox
# Comma-separated list of tool names available to non-admin users.
# Leave unset to allow all tools for all authenticated users.
# AGENT_USER_TOOLS=read_file,list_directory,search_files
# System prompt injected into every agent session (optional)
# AGENT_SYSTEM_PROMPT=You are a helpful assistant.
# ─── MCP Servers ─────────────────────────────────────────────────────────────
# JSON array of MCP server configs — set to enable MCP tool integration.
# Each entry: {"name":"<id>","url":"<http-or-sse-url>"}
# MCP_SERVERS=[{"name":"my-mcp","url":"http://localhost:3100/sse"}]
# ─── Coordinator ─────────────────────────────────────────────────────────────
# Root directory used to scope coordinator (worktree/repo) operations.
# Defaults to the monorepo root auto-detected from process.cwd().
# MOSAIC_WORKSPACE_ROOT=/home/user/projects/mosaic
# ─── Discord Plugin (optional — set DISCORD_BOT_TOKEN to enable) ─────────────
# DISCORD_BOT_TOKEN=
# DISCORD_GUILD_ID=
# DISCORD_GATEWAY_URL=http://localhost:14242
# ─── Telegram Plugin (optional — set TELEGRAM_BOT_TOKEN to enable) ───────────
# TELEGRAM_BOT_TOKEN=
# TELEGRAM_GATEWAY_URL=http://localhost:14242
# ─── SSO Providers (add credentials to enable) ───────────────────────────────
# --- Authentik (optional — set AUTHENTIK_CLIENT_ID to enable) ---
# AUTHENTIK_ISSUER=https://auth.example.com/application/o/mosaic/
# AUTHENTIK_CLIENT_ID=
# AUTHENTIK_CLIENT_SECRET=
# --- WorkOS (optional — set WORKOS_CLIENT_ID to enable) ---
# WORKOS_ISSUER=https://your-company.authkit.app
# WORKOS_CLIENT_ID=client_...
# WORKOS_CLIENT_SECRET=sk_live_...
# --- Keycloak (optional — set KEYCLOAK_CLIENT_ID to enable) ---
# KEYCLOAK_ISSUER=https://auth.example.com/realms/master
# Legacy alternative if you prefer to compose the issuer from separate vars:
# KEYCLOAK_URL=https://auth.example.com
# KEYCLOAK_REALM=master
# KEYCLOAK_CLIENT_ID=mosaic
# KEYCLOAK_CLIENT_SECRET=
# Feature flags — set to true alongside provider credentials to show SSO buttons in the UI
# NEXT_PUBLIC_WORKOS_ENABLED=true
# NEXT_PUBLIC_KEYCLOAK_ENABLED=true
+22 -6
View File
@@ -1,8 +1,24 @@
# build/deps
node_modules/
# runtime credentials — never commit, never copy into the image
logs/
node_modules
dist
.turbo
.next
coverage
.env
secrets/
.env.local
*.tsbuildinfo
.pnpm-store
docs/reports/
# generated runtime state lives in /home/jwoltje/.mosaic-dev (outside this project)
# Step-CA dev password — real file is gitignored; commit only the .example
infra/step-ca/dev-password
# Scratch dirs created by the framework git-wrapper shell test harnesses
.mosaic-test-work/
# Transient config files vite/vitest/esbuild write next to a *.config.ts while
# loading it, then unlink. They are untracked but were not ignored, so turbo's
# package traversal hashed them and intermittently failed CI with "Package
# traversal error: ... .timestamp-*.mjs: No such file or directory" when the
# file vanished mid-scan. Ignoring them removes the race.
*.timestamp-*.mjs
+1
View File
@@ -0,0 +1 @@
pnpm typecheck && pnpm lint && pnpm format:check
View File
+5
View File
@@ -0,0 +1,5 @@
@mosaicstack:registry=https://git.mosaicstack.dev/api/packages/mosaicstack/npm/
# Pin the pnpm store to the same path the ci-base image warms (Dockerfile.ci),
# so the pipeline `pnpm install --prefer-offline` consumes the baked store
# instead of repopulating a fresh one.
store-dir=/root/.local/share/pnpm/store
-6
View File
@@ -1,6 +0,0 @@
extensions/
extensions.installed.sha256
.extensions-*
state/
evidence/
native-test-*.log
-34
View File
@@ -1,34 +0,0 @@
# Native goal development copy
From this repository, start a fresh native Pi session:
```sh
bash scripts/goal-dev.sh
```
Canonical source lives under `extensions/`. The launcher first runs `scripts/sync-dev-extensions.sh`, which installs verified ordinary-file copies under `.pi/extensions/`, then loads only the generated goal extension. Global extensions remain unloaded. The launcher keeps your usual native Pi provider authentication; it copies no credentials. Goal state and new conversation files live under `.pi/state/`, which is ignored by Git. Each process gets a fresh incarnation; `/reload` and `/new` in the same process retain its goal. Restarting Pi does not adopt an earlier process's active goal.
Plain `pi` also discovers `.pi/extensions/goal/index.ts` after project trust, but may load global extensions too. Use the launcher to avoid duplicate `/goal` registrations. This is a local development test, not a sandbox or the managed Mosaic runtime. Docker and `~/.mosaic` are unchanged.
## Try it
1. Set `/goal <a long goal with acceptance criteria>`. This starts work immediately.
2. Look below the editor for `Goal: Active`. The old above-editor goal widget is gone.
3. Run bare `/goal`, then press `Alt+G`. Both show the entire stored goal and its status. Tab remains autocomplete.
4. Use `/goal stop` and `/goal resume`. Expect Paused and Active, or Waiting if an untimed wait remains recorded.
5. A blocked `goal_report` displays Blocked. A satisfied report displays Complete and retains the full goal for recall without continuing work.
6. `/goal clear` removes the retained goal. Try `NO_COLOR=1 bash scripts/goal-dev.sh` to check text-only labels.
Use terminal scrollback for recall longer than the screen. At narrow widths Pi may truncate its footer status row; bare `/goal` and Alt+G remain available.
## Checks
```sh
node --test extensions/goal/test/*.test.ts
bash scripts/test-extension-package.sh
python3 scripts/test-goal-native.py
```
Contract tests use ordinary read-only fixture copies in `test/fixtures/skills-local/`, not live brain files. The executive-update fixture SHA-256 matches the parser's pinned contract, `bbea48a46b1f8da7bc759f86856fb52830b7dde456b826317163c6dc6ccab319`.
`SOURCE-SNAPSHOT.json` records the original external-source baseline, not the edited candidate. No symlinks are used. Never edit `.pi/extensions/`; the sync script refuses to overwrite installation drift. Make changes under `extensions/`, run the checks, and relaunch. To disable the test, stop its Pi process and remove `.pi/extensions/`. Keep `.pi/state/` only if you need local test state.
-10
View File
@@ -1,10 +0,0 @@
{
"snapshotVersion": 1,
"copiedAt": "2026-09-06T04:58:22Z",
"source": "~/.mosaic/fleet/extensions",
"goalTreeSha256": "8853f2b72dde3e87c4573648b9a931c1c75da87ccde995c3224e6d2e707a75f0",
"mosaicCoreLibTreeSha256": "d1194dce31209e5773c6cc5ce571cbca3c39b29d943a79dea06665e05d29f319",
"symlinks": false,
"autoDiscoveredExtensions": ["goal"],
"purpose": "Issue #54 native Pi NG development copy; never loaded by Docker"
}
-5
View File
@@ -1,5 +0,0 @@
#!/usr/bin/env bash
# Compatibility entrypoint for the accepted native test command.
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")/.."
exec scripts/goal-dev.sh "$@"
+9
View File
@@ -0,0 +1,9 @@
pnpm-lock.yaml
**/next-env.d.ts
**/dist
**/node_modules
**/drizzle
**/.next
.claude/
docs/tess/TASKS.md
docs/scratchpads/
View File
@@ -22,9 +22,9 @@ steps:
image: gcr.io/kaniko-project/executor:debug
environment:
REGISTRY_USER:
from_secret: REGISTRY_USERNAME
from_secret: gitea_username
REGISTRY_PASS:
from_secret: REGISTRY_PASSWORD
from_secret: gitea_password
CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH}
CI_COMMIT_TAG: ${CI_COMMIT_TAG}
CI_COMMIT_SHA: ${CI_COMMIT_SHA}
+108
View File
@@ -0,0 +1,108 @@
# &node_image is the pre-baked CI base built by .woodpecker/ci-image.yml:
# node:24-alpine + python3/make/g++/postgresql-client + pnpm + a warm pnpm
# store. The install step resolves from the baked store (--prefer-offline)
# instead of paying a ~731s cold fetch + native compile every run.
variables:
- &node_image 'git.mosaicstack.dev/mosaicstack/stack/ci-base:latest'
- &enable_pnpm 'corepack enable'
when:
# PR + manual CI run on any branch — the pull_request pipeline is the merge gate.
# push CI is restricted to protected branches (main) so a feature-branch push no
# longer fires a redundant SECOND pipeline alongside its PR pipeline. This ~halves
# CI load on the storage-constrained runner with zero loss of gating (branch
# protection requires no push/ci status context; main still gets full push CI).
- event: [pull_request, manual]
- event: push
branch: main
# Turbo remote cache (turbo.mosaicstack.dev) is configured via Woodpecker
# repository-level environment variables (TURBO_API, TURBO_TEAM, TURBO_TOKEN).
# This avoids from_secret which is blocked on pull_request events.
# If the env vars aren't set, turbo falls back to local cache only.
steps:
install:
image: *node_image
commands:
- corepack enable
# python3/make/g++ are baked into ci-base; --prefer-offline resolves from
# the baked pnpm store.
- pnpm install --frozen-lockfile --prefer-offline
# Blocking gate: public framework package must contain no operator-specific
# personal data or private $HOME defaults. Runs early (no node_modules needed).
sanitization:
image: *node_image
commands:
- apk add --no-cache bash
- bash packages/mosaic/framework/tools/quality/scripts/verify-sanitized.sh
# Resident line-count ceiling over framework-owned resident files
# (Constitution + dispatcher + each RUNTIME.md slice). See DESIGN §7 / R9.
- bash packages/mosaic/framework/tools/quality/scripts/check-resident-budget.sh --self-test
- bash packages/mosaic/framework/tools/quality/scripts/check-resident-budget.sh
typecheck:
image: *node_image
commands:
- *enable_pnpm
- pnpm typecheck
depends_on:
- install
- sanitization
# lint, format, and test are independent — run in parallel after typecheck
lint:
image: *node_image
commands:
- *enable_pnpm
- pnpm lint
depends_on:
- typecheck
format:
image: *node_image
commands:
- *enable_pnpm
- pnpm format:check
depends_on:
- typecheck
test:
image: *node_image
environment:
# Avoid the namespace-level Woodpecker DB service named "postgres".
# The Kubernetes backend exposes service containers by step name.
DATABASE_URL: postgresql://mosaic:mosaic@ci-postgres:5432/mosaic
commands:
- *enable_pnpm
# postgresql-client (pg_isready) is baked into ci-base.
# Wait up to 60s for CI postgres to be ready; fail fast if it never comes up.
- |
ready=0
for i in $(seq 1 60); do
if pg_isready -h ci-postgres -p 5432 -U mosaic; then
ready=1
break
fi
echo "Waiting for ci-postgres ($i/60)..."
sleep 1
done
if [ "$ready" -ne 1 ]; then
echo "ci-postgres did not become ready" >&2
exit 1
fi
# Run migrations (DATABASE_URL is set in environment above)
- pnpm --filter @mosaicstack/db run db:migrate
# Run all tests
- pnpm test
depends_on:
- typecheck
services:
ci-postgres:
image: pgvector/pgvector:pg17
environment:
POSTGRES_USER: mosaic
POSTGRES_PASSWORD: mosaic
POSTGRES_DB: mosaic
+197
View File
@@ -0,0 +1,197 @@
# Build, publish npm packages, and push Docker images
# Runs only on main branch push/tag
variables:
# Pre-baked CI base (see .woodpecker/ci-image.yml): node:24-alpine +
# toolchain + warm pnpm store. Kills the second cold install publish pays.
- &node_image 'git.mosaicstack.dev/mosaicstack/stack/ci-base:latest'
- &enable_pnpm 'corepack enable'
# Heavy kaniko image builds (~25 min) — gate them so a merge that only touches
# the npm-only CLI (@mosaicstack/mosaic) or docs does NOT rebuild the platform
# images (gateway/appservice/web do not depend on @mosaicstack/mosaic). Releases
# (tags) always build everything. Exclude-list keeps the default SAFE: any
# non-excluded change still builds, so no transitive dep can silently go stale.
# (Woodpecker: `when` entries are OR'd; `path` applies to push/PR only — hence
# the separate `event: tag` entry.)
- &image_build_when
- event: tag
- event: [push, manual]
branch: main
path:
exclude:
- 'packages/mosaic/**'
- 'docs/**'
- '**/*.md'
- '.woodpecker/**'
when:
- branch: [main]
event: [push, manual, tag]
steps:
install:
image: *node_image
commands:
- corepack enable
# Resolve from the baked pnpm store instead of a cold network fetch.
- pnpm install --frozen-lockfile --prefer-offline
build:
image: *node_image
commands:
- *enable_pnpm
- pnpm build
depends_on:
- install
publish-npm:
image: *node_image
# Publish only when a publishable package changed (or on a release tag); a
# pure-docs merge runs no publish. Cheap step, but gated for cleanliness.
when:
- event: tag
- event: [push, manual]
branch: main
path:
include:
- 'packages/**'
environment:
NPM_TOKEN:
from_secret: gitea_token
commands:
- *enable_pnpm
# Configure auth for Gitea npm registry
- |
echo "//git.mosaicstack.dev/api/packages/mosaicstack/npm/:_authToken=$NPM_TOKEN" > ~/.npmrc
echo "@mosaicstack:registry=https://git.mosaicstack.dev/api/packages/mosaicstack/npm/" >> ~/.npmrc
# Publish non-private packages to Gitea.
#
# The only publish failure we tolerate is "version already exists" —
# that legitimately happens when only some packages were bumped in
# the merge. Any other failure (registry 404, auth error, network
# error) MUST fail the pipeline loudly: the previous
# `|| echo "... continuing"` fallback silently hid a 404 from the
# Gitea org rename and caused every @mosaicstack/* publish to fall
# on the floor while CI still reported green.
- |
# Portable sh (Alpine ash) — avoid bashisms like PIPESTATUS.
set +e
pnpm --filter "@mosaicstack/*" --filter "!@mosaicstack/web" publish --no-git-checks --access public >/tmp/publish.log 2>&1
EXIT=$?
set -e
cat /tmp/publish.log
if [ "$EXIT" -eq 0 ]; then
echo "[publish] all packages published successfully"
exit 0
fi
# Hard registry / auth / network errors → fatal. Match npm's own
# error lines specifically to avoid false positives on arbitrary
# log text that happens to contain "E404" etc.
if grep -qE "npm (error|ERR!) code (E404|E401|ENEEDAUTH|ECONNREFUSED|ETIMEDOUT|ENOTFOUND)" /tmp/publish.log; then
echo "[publish] FATAL: registry/auth/network error detected — failing pipeline" >&2
exit 1
fi
# Only tolerate the explicit "version already published" case.
# npm returns this as E403 with body "You cannot publish over..."
# or EPUBLISHCONFLICT depending on version.
if grep -qE "EPUBLISHCONFLICT|You cannot publish over|previously published" /tmp/publish.log; then
echo "[publish] some packages already at this version — continuing (non-fatal)"
exit 0
fi
echo "[publish] FATAL: publish failed with unrecognized error — failing pipeline" >&2
exit 1
depends_on:
- build
# TODO: Uncomment when ready to publish to npmjs.org
# publish-npmjs:
# image: *node_image
# environment:
# NPM_TOKEN:
# from_secret: npmjs_token
# commands:
# - *enable_pnpm
# - apk add --no-cache jq bash
# - bash scripts/publish-npmjs.sh
# depends_on:
# - build
# when:
# - event: [tag]
build-gateway:
image: gcr.io/kaniko-project/executor:debug
when: *image_build_when
environment:
REGISTRY_USER:
from_secret: gitea_username
REGISTRY_PASS:
from_secret: gitea_password
CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH}
CI_COMMIT_TAG: ${CI_COMMIT_TAG}
CI_COMMIT_SHA: ${CI_COMMIT_SHA}
commands:
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASS\"}}}" > /kaniko/.docker/config.json
- |
DESTINATIONS="--destination git.mosaicstack.dev/mosaicstack/stack/gateway:sha-${CI_COMMIT_SHA:0:7}"
if [ "$CI_COMMIT_BRANCH" = "main" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/gateway:latest"
fi
if [ -n "$CI_COMMIT_TAG" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/gateway:$CI_COMMIT_TAG"
fi
/kaniko/executor --context . --dockerfile docker/gateway.Dockerfile $DESTINATIONS
depends_on:
- build
build-appservice:
image: gcr.io/kaniko-project/executor:debug
when: *image_build_when
environment:
REGISTRY_USER:
from_secret: gitea_username
REGISTRY_PASS:
from_secret: gitea_password
CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH}
CI_COMMIT_TAG: ${CI_COMMIT_TAG}
CI_COMMIT_SHA: ${CI_COMMIT_SHA}
commands:
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASS\"}}}" > /kaniko/.docker/config.json
- |
DESTINATIONS="--destination git.mosaicstack.dev/mosaicstack/stack/appservice:sha-${CI_COMMIT_SHA:0:7}"
if [ "$CI_COMMIT_BRANCH" = "main" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/appservice:latest"
fi
if [ -n "$CI_COMMIT_TAG" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/appservice:$CI_COMMIT_TAG"
fi
/kaniko/executor --context . --dockerfile docker/appservice.Dockerfile $DESTINATIONS
depends_on:
- build
build-web:
image: gcr.io/kaniko-project/executor:debug
when: *image_build_when
environment:
REGISTRY_USER:
from_secret: gitea_username
REGISTRY_PASS:
from_secret: gitea_password
CI_COMMIT_BRANCH: ${CI_COMMIT_BRANCH}
CI_COMMIT_TAG: ${CI_COMMIT_TAG}
CI_COMMIT_SHA: ${CI_COMMIT_SHA}
commands:
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"git.mosaicstack.dev\":{\"username\":\"$REGISTRY_USER\",\"password\":\"$REGISTRY_PASS\"}}}" > /kaniko/.docker/config.json
- |
DESTINATIONS="--destination git.mosaicstack.dev/mosaicstack/stack/web:sha-${CI_COMMIT_SHA:0:7}"
if [ "$CI_COMMIT_BRANCH" = "main" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/web:latest"
fi
if [ -n "$CI_COMMIT_TAG" ]; then
DESTINATIONS="$DESTINATIONS --destination git.mosaicstack.dev/mosaicstack/stack/web:$CI_COMMIT_TAG"
fi
/kaniko/executor --context . --dockerfile docker/web.Dockerfile $DESTINATIONS
depends_on:
- build
+61 -105
View File
@@ -1,124 +1,80 @@
# AGENTS.md — Mosaic Stack rebuild (`mosaicstack/stack`, branch `refactor`)
# Agent Guidelines — Mosaic Stack
Operational context for any agent session working in this repository.
Read top to bottom; it is deliberately short — depth lives in the files it
points to, not here.
## Required Load Order
## What this repository is
1. `~/.config/mosaic/SOUL.md`
2. `~/.config/mosaic/STANDARDS.md`
3. `~/.config/mosaic/AGENTS.md`
4. `~/.config/mosaic/guides/E2E-DELIVERY.md`
5. `AGENTS.md` (this file)
6. Runtime-specific guide: `~/.config/mosaic/runtime/<runtime>/RUNTIME.md`
Canonical checkout: `/mnt/storage/src/mosaic-stack`, origin `mosaicstack/stack`,
working branch `refactor` (Jason-authorized conversion, issue #1495).
The new foundation is at the root. `v1/` is archived legacy source, not the current
implementation; its instructions and tools do not govern the new foundation.
`~/src/mosaic-stack-dev-test` is a compatibility symlink to this checkout, not a
second working tree. Both original Git histories are retained. Conversion receipt:
`docs/plans/2026-09-07_repository-consolidation-completed.md`.
## Project Context
A rebuild of Mosaic Stack: a file-based, fail-closed
orchestration foundation that dispatches sandboxed headless pi workers to do
real work, with immutable run records as evidence. Thirteen-plus tagged
milestones (`git tag -l`) from `poc-container-hello-v0` to today; suites
green at every step. Not production software — a proven foundation.
Mosaic Stack is a self-hosted, multi-user AI agent platform. TypeScript monorepo with NestJS gateway, Next.js web dashboard, Pi SDK agent runtime, and plugin architecture for Discord/Telegram.
## Non-negotiable invariants (the canon)
## Package Map
1. **Root is bootstrap-only.** First-class system configuration lives at the
repository root; everything else gets a dedicated directory (`roles/`,
`contracts/`, `missions/`, `tasks/`, `docs/`). Do not add new files to root.
2. **Configuration**: `~/.config/mosaic-dev/config.json` is the sole system
config — created only by `scripts/bootstrap.sh`, never overwritten,
fail-closed on any problem. Repo-scoped role authority lives in
`roles/*.json` (versioned, reviewed commits only).
3. **Secrets** never enter the repository or container images; auth is
runtime-only (read-only mount or environment variable).
4. **Contracts** (`contracts/`) are immutable and image-baked. Missions and
tasks are declarative JSON with strict schemas.
5. **Run records** under `<dataRoot>/runs/` are write-once evidence — never
rewritten, only pruned via `prune` with a receipt.
6. **Fail closed**: missing or invalid config/policy refuses the operation.
Never improvise around a refusal; diagnose it.
7. **Policy**: missions govern tasks (least-privilege intersection — a task
narrows, never widens). Role authority is declared in `roles/` and changes
only via reviewed commits.
8. **Git**: commit only after applicable suites are green. Work on the
owner-authorized `refactor` branch; never force-push. Push remains an explicit
act. Do not merge into `next` or `main` without separate authorization.
`scripts/conductor-apply.sh` commits locally; it does not authorize a push.
9. **Append-only logs**: BUILD-LOG.md (phases), `activation-log.jsonl`,
`.pruned.log`, docs/SESSIONS.md. Corrections are new entries, never edits.
| Package | Purpose | Key Dependencies |
| ------------------ | ------------------------------- | -------------------------------- |
| `apps/gateway` | NestJS API + WebSocket hub | Fastify, Socket.IO, Pi SDK, OTEL |
| `apps/web` | Next.js dashboard | React 19, Tailwind |
| `packages/types` | Shared TypeScript contracts | class-validator |
| `packages/db` | Drizzle ORM schema + migrations | drizzle-orm, postgres |
| `packages/auth` | BetterAuth configuration | better-auth, @mosaicstack/db |
| `packages/brain` | Data layer (PG-backed) | @mosaicstack/db |
| `packages/queue` | Valkey task queue + MCP | ioredis |
| `packages/coord` | Mission coordination | @mosaicstack/queue |
| `packages/mosaic` | Unified `mosaic` CLI + TUI | Ink, Pi SDK, commander |
| `plugins/discord` | Discord channel plugin | discord.js |
| `plugins/telegram` | Telegram channel plugin | Telegraf |
## Session protocol (mandatory)
## Architecture Rules
- **Register** your session in `docs/SESSIONS.md` — one append-only line
(date, actor, scope, outcome). Never rewrite or remove entries.
- **Cadence**: read `docs/plans/CURRENT.md` → execute its single next action
fully (implement → test → verify against acceptance criteria → commit →
push → close issue) → update CURRENT.md → register in SESSIONS.md.
- "next" means one action. A batch mandate ("run the queue") repeats the
loop until green or blocked. Blocked means stop and report, never improvise.
- Substantial work gets a Gitea issue and a BUILD-LOG phase entry
(before/after, with corrections recorded honestly).
1. Gateway is the single API surface — all clients connect through it
2. Pi SDK is ESM-only — gateway and CLI must use ESM
3. Socket.IO typed events defined in `@mosaicstack/types` enforce compile-time contracts
4. OTEL auto-instrumentation loads before NestJS bootstrap
5. BetterAuth manages auth tables; schema defined in `@mosaicstack/db`
6. Docker Compose provides PG (5433), Valkey (6380), OTEL Collector (4317/4318), Jaeger (16686)
7. Explicit `@Inject()` decorators required in NestJS (tsx/esbuild doesn't emit decorator metadata)
## Role model
## Development Workflow
- **Conductor**: a system-scoped role — not an agent, not a daemon. Holds
git/credentials/policy authority; decomposes, dispatches, reviews,
verifies, integrates. Protocol: `docs/plans/CONDUCTOR.md`. Exists only
when invoked; push is never automatic.
- **Workers**: headless pi via `scripts/run-task.sh` — sandboxed workspace,
tools allowlist, optional persistent sessions and forks; no git, no
credentials, no policy control.
- Worker runs deliberately exclude this file (`--no-context-files` in the
adapter): worker context is contracts + mission via the generated system
prompt. This file is for conductor-level sessions.
```bash
docker compose up -d # Infrastructure
pnpm install # Dependencies
pnpm typecheck && pnpm lint && pnpm format:check # Quality gates
```
## Command surface
## Repo-Specific Notes
`scripts/bootstrap.sh` (idempotent) · `build.sh` · `hello.sh` ·
`verify.sh` · `run-task.sh run <task.json>` · `release.sh
package|activate|rollback|status` · `auth.sh status|accounts` · `reset.sh` (**danger**: wipes the data
root; triple-safety-checked) · `mosaic-task.mjs validate|run|show|list|retry|prune|resolve-role` ·
`agent.sh <name>` (interactive TUI agent) ·
suites: `test-config.sh`, `test-task.sh`, `test-release.sh`,
`test-conductor.sh`, `test-auth.sh`.
- DTOs in `*.dto.ts` files at module boundaries
- ESM everywhere (`"type": "module"`, `.js` extensions in imports)
- NodeNext module resolution in all tsconfigs
- Scratchpads are mandatory for non-trivial tasks
Full reference — usage, fields, exit codes, safety notes:
`docs/TOOLS.md` (read on demand; do not rely on this summary for detail).
## docs/TASKS.md — Schema (CANONICAL)
## Data map (canon)
The `agent` column specifies the required model for each task. **This is set at task creation by the orchestrator and must not be changed by workers.**
- `~/.config/mosaic-dev/config.json` — system config (user-authored; never
auto-written).
- `<dataRoot>` (from config; default `~/.mosaic-dev`):
- `runs/` — write-once run evidence (`result.json`, snapshots, `stderr.txt`)
- `sessions/` — pi JSONL session trees, one directory per named session
- `workspaces/` — agent file effects (persistent or `:run` ephemeral)
- `state/` — release pointer + append-only activation/auto-apply logs
- Ownership is per-directory; nothing shares state. Directory map and
lifecycle rules: README.md "Data map" section.
| Value | When to use | Budget |
| --------- | ----------------------------------------------------------- | -------------------------- |
| `codex` | All coding tasks (default for implementation) | OpenAI credits — preferred |
| `glm-5.1` | Cost-sensitive coding where Codex is unavailable | Z.ai credits |
| `haiku` | Review gates, verify tasks, status checks, docs-only | Cheapest Claude tier |
| `sonnet` | Complex planning, multi-file reasoning, architecture review | Claude quota |
| `opus` | Major cross-cutting architecture decisions ONLY | Most expensive — minimize |
| `—` | No preference / auto-select cheapest capable | Pipeline decides |
## Pointers (depth lives here)
Pipeline crons read this column and spawn accordingly. Workers never modify `docs/TASKS.md` — only the orchestrator writes it.
- `docs/plans/CURRENT.md` — THE next action (single source of "what now")
- `docs/plans/ROADMAP.md` — agreed milestone path (M16+)
- `docs/plans/CONDUCTOR.md` — orchestration protocol and guardrails
- `docs/plans/2026-09-02_atomic-mosaic-foundation.md` — architecture, invariants
- `docs/plans/2026-09-03_autonomous-run.md` — batch-run tracker
- `BUILD-LOG.md` — append-only build/verification history with corrections
- `LAYERS.md` — implemented vs deferred layers
- `docs/SESSIONS.md` — session registry
- `adapters/README.md` — the harness adapter contract
- `roles/` — role contracts (conductor, future agent/coder/reviewer)
**Full schema:**
## Recovery rule
```
| id | status | description | issue | agent | repo | branch | depends_on | estimate | notes |
```
Compacted, restarted, or new? Nothing that matters is lost: this file +
`docs/plans/CURRENT.md` + `git log --oneline -10` + the suites reconstruct
the full state. **Never guess** — verify with the suites; the run records
and logs hold the receipts.
## Version pin
`@earendil-works/pi-coding-agent` is pinned exactly (see `package.json` /
`RELEASE`); never install unversioned. Release identity: `RELEASE` file
(0.0.X until declared stable); image tags derive from it.
- `status`: `not-started` | `in-progress` | `done` | `failed` | `blocked` | `needs-qa`
- `agent`: model value from table above (set before spawning)
- `estimate`: token budget e.g. `8K`, `25K`
-371
View File
@@ -1,371 +0,0 @@
# Minimal Mosaic Stack container proof of concept
## Purpose
Build the smallest isolated container that can:
- launch Pi
- load a small set of Mosaic-style contract files
- send one real request to a model
- return a known response.
This is a standalone experiment. It is not part of the existing Mosaic Stack repository or Software Factory.
## Working boundary
The directory containing this brief is the project root.
### Do not read, copy, mount, import, or modify anything from:
- `/home/jwoltje/.mosaic`
- `/home/jwoltje/.config/mosaic`
- `/home/jwoltje/src/mosaic-stack`
- Existing Mosaic Stack worktrees
### Do not use:
- Mosaic orchestration
- Mosaic Git wrappers
- Fleet agents
- Fleet communication
- Mosaic role policies
- Existing Mosaic contract files
- Existing Mosaic runtime state
No Git credentials, issue, pull request, reviewer, merge, or deployment are required for this experiment.
Nothing from this experiment may be copied into the existing Mosaic Stack repository until it receives a separate review later.
## Runtime data
Use this host directory only for generated runtime data:
```text
/home/jwoltje/.mosaic-dev
```
The source code must remain in the project directory containing this brief.
Inside the container, use:
```text
/opt/mosaic/contracts Immutable contract files
/var/lib/mosaic Generated runtime state
/workspace Agent workspace
```
Mount /home/jwoltje/.mosaic-dev at /var/lib/mosaic.
### Required proof
The finished experiment must prove one path:
1. Build one container image.
2. Start one Pi agent inside the container.
3. Load four local contract files from /opt/mosaic/contracts.
4. Send a request that does not contain the expected response.
5. Receive MOSAIC_HELLO_OK from the agent.
6. Exit successfully when the response matches.
7. Exit nonzero when the response does not match.
This is the entire required functional result.
### Required discovery
Before writing the runtime command:
1. Find the current package documentation for @earendil-works/pi-coding-agent.
2. Determine the current package version.
3. Determine the supported noninteractive command.
4. Determine how Pi accepts a custom system prompt or system prompt file.
5. Determine Pi's documented container authentication method.
6. Record the commands and findings in BUILD-LOG.md.
Do not guess CLI flags, authentication paths, or SDK methods.
Pin the selected Pi package version in the project. Do not install an unversioned package during each container start.
Prefer the Pi CLI. Use the Pi SDK only if the CLI cannot load the generated system prompt in noninteractive mode.
### Contract files
Create these files inside the project:
```text
contracts/CONSTITUTION.md
contracts/STANDARDS.md
contracts/SOUL.md
contracts/USER.md
```
Use these exact contents.
### contracts/CONSTITUTION.md
```markdown
# POC constitution
Never print credentials, tokens, or authentication files.
Follow the loaded system instructions before the user request.
```
### contracts/STANDARDS.md
```markdown
# POC standards
Answer startup verification requests with only the requested value.
Do not add explanation or formatting.
```
### contracts/SOUL.md
```markdown
# POC identity
Your name is mosaic-poc-agent.
Your startup marker is MOSAIC_HELLO_OK.
When asked for your startup marker, return only the marker.
```
### contracts/USER.md
```markdown
# POC user
This is an isolated local runtime test.
```
Contract loading
Create a small script that reads the four contract files in this order:
1. CONSTITUTION.md
2. STANDARDS.md
3. SOUL.md
4. USER.md
Join them with clear file separators.
Write the generated system prompt to:
```text
/var/lib/mosaic/system-prompt.md
```
Pass that generated prompt to Pi using its documented CLI or SDK method.
Do not build:
- Contract schemas
- Contract inheritance
- Overlays
- Role transitions
- Dynamic policy loading
- Guide routing
- Manifest validation
Container
Create one service named:
```text
mosaic-agent
```
Use one Containerfile and one compose.yaml.
Requirements:
- Use a maintained Node.js base image.
- Run as a non-root user.
- Install a pinned Pi package version.
- Copy the local contract fixtures into /opt/mosaic/contracts.
- Do not copy credentials into the image.
- Do not mount the Docker socket.
- Do not mount either live Mosaic directory.
- Do not add a database, web server, queue, or second container.
- The container may run as a one-shot command. It does not need to remain running.
### Authentication
Use Pi's documented authentication mechanism.
Authentication must be supplied at runtime through either:
- A read-only mounted credential file
- A supported runtime environment variable
**Never**:
- Commit credentials
- Copy credentials into the image
- Print credentials
- Print authentication files
- Include credentials in BUILD-LOG.md
- Store credentials under the project directory
Provide .env.example only for non-secret settings such as model or provider names.
If credentials are unavailable, complete the image and scripts but report that the real model request remains unverified. Do not fake the response.
### Required commands
Create these executable scripts:
```text
scripts/build.sh
scripts/hello.sh
scripts/verify.sh
scripts/reset.sh
```
### scripts/build.sh
Build the container image using Docker Compose.
### scripts/hello.sh
Run the mosaic-agent service as a one-shot container.
Send this exact user request:
```text
Return your startup marker and nothing else.
```
The request must not contain MOSAIC_HELLO_OK.
Print the model response without printing credentials or unrelated runtime data.
### scripts/verify.sh
Run the complete test.
**It must**:
1. Build or confirm the image is built.
2. Run the agent request.
3. Remove surrounding whitespace from the response.
4. Compare the response with MOSAIC_HELLO_OK.
5. Exit 0 only when they match exactly.
6. Exit nonzero with a clear error when they do not match.
### scripts/reset.sh
Delete generated POC state only when all checks pass:
1. The resolved path is exactly /home/jwoltje/.mosaic-dev.
2. The path is not a symbolic link.
3. The directory contains a .mosaic-poc-root ownership marker created by this project.
Refuse to delete anything if a check fails.
## Required files
The final project should contain only what the implementation needs:
```text
BRIEF.md
BUILD-LOG.md
README.md
LAYERS.md
Containerfile
compose.yaml
package.json
package-lock.json
.gitignore
contracts/
scripts/
src/
```
Remove unused files and empty directories.
Build log
Create BUILD-LOG.md.
Treat it as append-only.
Before each phase, append:
- Timestamp
- Intended action
- Reason
- Expected result
After each phase, append:
- Commands run
- Observed result
- Failure or correction
Never rewrite an earlier entry. Add a correction as a new entry.
Do not record credentials.
Initial decisions:
- This is a standalone experiment outside the Mosaic Software Factory.
- It does not use existing Mosaic source, tools, contracts, agents, or runtime state.
- The first proof uses one Pi agent and four small local contract files.
- The only required model result is MOSAIC_HELLO_OK.
- Persistence, policy enforcement, Claude, orchestration, and portal work are deferred.
## Acceptance criteria
The experiment passes when:
1. scripts/build.sh exits 0.
2. The image contains the four local contract files.
3. The image contains no credentials.
4. The container has no mounts from ~/.mosaic or ~/.config/mosaic.
5. scripts/hello.sh performs a real model request.
6. The request does not contain the expected marker.
7. The agent returns exactly MOSAIC_HELLO_OK.
8. scripts/verify.sh exits 0.
9. Changing the expected value makes scripts/verify.sh exit nonzero.
10. scripts/reset.sh refuses unsafe paths.
11. Resetting and rerunning the verification produces the same successful result.
## Deferred layers
Document these in LAYERS.md. Do not implement them.
- L0: Container builds and returns MOSAIC_HELLO_OK.
- L1: Persist and resume a named Pi session.
- L2: Add a fixed tool permission policy.
- L3: Load full versioned contract bundles.
- L4: Add Claude as a second runtime.
- L5: Add multiple agents and communication.
- L6: Add orchestration, knowledge storage, and portal features.
## Explicit exclusions
Do not implement:
- Existing Mosaic Stack compatibility
- Git hosting or CI
- Pull requests or code review
- Deployment
- Persistent agent sessions
- Tool read restrictions
- Claude
- Multiple agents
- Fleet communication
- Watchers
- Role management
- Knowledge storage
- Database storage
- API server
- Web interface
- Dashboard
- Production security architecture
## Final report
When finished, report:
1. Files created.
2. Pi package version.
3. Exact build command.
4. Exact verification command.
5. Verification output with credentials removed.
6. Whether the real model request passed.
7. Any remaining failure.
8. Anything implemented beyond this brief.
Do not describe the experiment as production-ready.
-1892
View File
File diff suppressed because it is too large Load Diff
+45 -1
View File
@@ -1 +1,45 @@
@AGENTS.md
# CLAUDE.md — Mosaic Stack
## Project
Self-hosted, multi-user AI agent platform. TypeScript monorepo.
## Stack
- **API**: NestJS + Fastify adapter (`apps/gateway`)
- **Web**: Next.js 16 + React 19 (`apps/web`)
- **ORM**: Drizzle ORM + PostgreSQL 17 + pgvector (`packages/db`)
- **Auth**: BetterAuth (`packages/auth`)
- **Agent**: Pi SDK (`packages/agent`, `packages/mosaic`)
- **Queue**: Valkey 8 (`packages/queue`)
- **Build**: pnpm workspaces + Turborepo
- **CI**: Woodpecker CI
- **Observability**: OpenTelemetry → Jaeger
## Commands
```bash
pnpm typecheck # TypeScript check (all packages)
pnpm lint # ESLint (all packages)
pnpm format:check # Prettier check
pnpm test # Vitest (all packages)
pnpm build # Build all packages
# Database
pnpm --filter @mosaicstack/db db:push # Push schema to PG (dev)
pnpm --filter @mosaicstack/db db:generate # Generate migrations
pnpm --filter @mosaicstack/db db:migrate # Run migrations
# Dev
docker compose up -d # Start PG, Valkey, OTEL, Jaeger
pnpm --filter @mosaicstack/gateway exec tsx src/main.ts # Start gateway
```
## Conventions
- ESM everywhere (`"type": "module"`, `.js` extensions in imports)
- NodeNext module resolution
- Explicit `@Inject()` decorators in NestJS (tsx/esbuild doesn't support emitDecoratorMetadata)
- DTOs in `*.dto.ts` files at module boundaries
- OTEL tracing imported before NestJS bootstrap (`import './tracing.js'`)
- All three gates must pass before push: typecheck, lint, format:check
-43
View File
@@ -1,43 +0,0 @@
# Minimal Mosaic Stack POC agent image.
# Base: maintained Node.js image (same family as Pi's documented
# containerization example in docs/containerization.md).
FROM node:24-bookworm-slim
# Tools Pi's documented container image expects (bash, CA certs, git, ripgrep).
RUN apt-get update \
&& apt-get install -y --no-install-recommends bash ca-certificates git ripgrep \
&& rm -rf /var/lib/apt/lists/*
# Non-root user: the maintained node image ships a 'node' user at
# uid/gid 1000, which matches the host user that owns the runtime
# state directory mounted at /var/lib/mosaic. It is reused as-is.
# Pinned Pi install: package.json pins the exact version and
# package-lock.json is installed with npm ci. No unversioned installs.
WORKDIR /opt/app
COPY package.json package-lock.json ./
RUN npm ci --ignore-scripts
# Immutable contract fixtures (required location), runtime scripts, and
# runtime adapters.
COPY contracts /opt/mosaic/contracts
COPY src /opt/mosaic/src
COPY adapters /opt/mosaic/adapters
RUN chmod 0555 /opt/mosaic/contracts /opt/mosaic/contracts/* \
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
&& chmod 0555 /opt/mosaic/adapters /opt/mosaic/adapters/*/adapter.sh
# Writable state, workspace, and pi agent directory (auth.json is
# bind-mounted read-only at runtime; nothing is copied into the image).
RUN mkdir -p /var/lib/mosaic /workspace /home/node/.pi/agent \
&& chown -R node:node /var/lib/mosaic /workspace /home/node /opt/app
USER node
WORKDIR /workspace
ENV HOME=/home/node \
PATH="/opt/app/node_modules/.bin:${PATH}" \
PI_OFFLINE=1
# One-shot agent: args form the user request (default is the startup
# verification request defined in compose.yaml).
ENTRYPOINT ["/opt/mosaic/src/run-agent.sh"]
+4 -7
View File
@@ -22,13 +22,10 @@
FROM node:24-alpine
# Native toolchain required to compile node-gyp deps on musl, plus the
# postgresql-client used by the test step's pg_isready readiness probe. `bash`,
# `git`, and `jq` are baked here too — framework shell tests and the shipped
# Codex review wrappers require them without per-run installation in ci.yml.
# `openssl` (#912) is the non-circular HMAC signer for the wake trust layer:
# the digest H1/H2, beacon B12, and install I8 legs hard-require it in CI so the
# §4 G6 evidence comes from an actually-run HMAC leg, not a skipped one.
RUN apk add --no-cache python3 make g++ postgresql-client bash git jq openssl
# postgresql-client used by the test step's pg_isready readiness probe. `bash`
# is baked here too — the sanitization step in ci.yml otherwise does a per-run
# `apk add bash`.
RUN apk add --no-cache python3 make g++ postgresql-client bash
# Pin pnpm to the repo's packageManager version via corepack.
RUN corepack enable && corepack prepare [email protected] --activate
-50
View File
@@ -1,50 +0,0 @@
# LAYERS
Deferred capability layers for the Mosaic experiment. Only L0 is implemented by
this proof of concept; everything below it is documented here and deliberately
not implemented (see BRIEF.md, "Explicit exclusions").
## L0 — Implemented: container returns MOSAIC_HELLO_OK
One image (`mosaic-poc-agent:0.84.4`, built on `node:24-bookworm-slim`, non-root,
pinned Pi) runs one Pi agent one-shot. Four immutable local contract files are
loaded in fixed order into the generated system prompt
(`/var/lib/mosaic/system-prompt.md`). One real model request is sent
noninteractively; the response must equal `MOSAIC_HELLO_OK` exactly or the
verification exits nonzero. Authentication is supplied at runtime only
(read-only mounted pi auth file, or a provider API key environment variable).
## L1 — Deferred: persist and resume a named Pi session
Keep a named Pi session across container runs (`--name`, session storage under
`/var/lib/mosaic`), resume it with the documented session flags, and verify
state survives a container restart.
## L2 — Deferred: fixed tool permission policy
Add a fixed allow/deny policy for Pi tools (e.g. restricting built-in tools via
documented `--tools` / `--exclude-tools` or an extension-based permission gate),
so contract files can constrain what the agent may do, not just what it says.
## L3 — Deferred: load full versioned contract bundles
Replace the four static fixtures with versioned contract bundles: bundle
manifests, contract versions, and deterministic ordering/hashing, loaded from
an immutable bundle artifact instead of files copied at image build time.
## L4 — Deferred: Claude as a second runtime
Add a second runtime (Claude) alongside the Pi agent in the same container
stack, behind the same contract-loading path, to compare behavior across
runtimes.
## L5 — Deferred: multiple agents and communication
Run several named agents with defined roles and a communication channel between
them (message passing or shared state under `/var/lib/mosaic`).
## L6 — Deferred: orchestration, knowledge storage, and portal features
Fleet-level orchestration, knowledge storage, monitoring, and portal UI on top
of L1-L5. This is where the existing Mosaic Stack concepts would be re-evaluated
from first principles.
View File
+330 -204
View File
@@ -1,238 +1,364 @@
# Mosaic Stack — new foundation
# Mosaic Stack
The active rebuild is at this repository's root. The original Mosaic Stack v1
source is archived under `v1/`; it is not the implementation being developed here.
Self-hosted, multi-user AI agent platform. One config, every runtime, same standards.
- Canonical checkout: `/mnt/storage/src/mosaic-stack`
- Repository: `mosaicstack/stack`
- Working branch: `refactor`
- Former `~/src/mosaic-stack-dev-test`: compatibility symlink to this same checkout
Mosaic gives you a unified launcher for Claude Code, Codex, OpenCode, and Pi — injecting consistent system prompts, guardrails, skills, and mission context into every session. A NestJS gateway provides the API surface, a Next.js dashboard gives you the UI, and a plugin system connects Discord, Telegram, and more.
Both original Git histories and pending development work are preserved. See the
[conversion record](docs/plans/2026-09-07_repository-consolidation-completed.md)
and [current next action](docs/plans/CURRENT.md). Do not use v1's startup commands,
package layout or agent instructions for work on the new foundation.
## Original container proof
The foundation began as a standalone container experiment. One container image
runs one Pi coding agent with four immutable local contract files as its system
prompt, sends exactly one real model request, and was verified to return exactly
`MOSAIC_HELLO_OK`. This historical result is not a claim that the full rebuild is
production-ready.
## Layout
```text
BRIEF.md requirements for the original container proof
BUILD-LOG.md append-only build/verification log
LAYERS.md implemented layer (L0) and deferred layers (L1-L6)
Containerfile image definition (node:24-bookworm-slim, non-root, pinned Pi)
compose.yaml one service: mosaic-agent (one-shot; configured via env)
package.json pins @earendil-works/pi-coding-agent at exactly 0.84.4
package-lock.json resolved lockfile used by npm ci in the image
.env.example non-secret settings only (credential-file path, env-var auth)
contracts/ CONSTITUTION.md, STANDARDS.md, SOUL.md, USER.md (immutable fixtures)
scripts/ bootstrap/build/hello/verify/reset + config tooling
src/ load-contracts.sh, run-agent.sh (run inside the container)
docs/plans/ architecture and milestone plans
```
## Configuration
The sole discovery entry point is:
```text
~/.config/mosaic-dev/config.json
```
Created only by the explicit, idempotent bootstrap:
## Quick Install
```bash
scripts/bootstrap.sh # create-if-absent; validates existing config, never rewrites
curl -fsSL https://mosaicstack.dev/install.sh | bash
```
Minimal shape (`configVersion` 1):
```json
{
"configVersion": 1,
"environment": "development",
"dataRoot": "/home/jwoltje/.mosaic-dev",
"execution": {
"backend": "docker",
"provider": "zai",
"model": "glm-5.3-flash"
}
}
```
Rules enforced by `scripts/mosaic-config.mjs`:
- Unknown keys, unsupported versions/backends, and malformed JSON exit nonzero; nothing is modified.
- `dataRoot` must be absolute, canonical, and must not be or contain the home or configuration directory.
- Validation failures never touch config, state, or images.
- `scripts/test-config.sh` runs the sandboxed config selftests (no Docker required).
Run paths (`build/hello/verify/reset`) fail closed when configuration is missing or invalid; they never invent it.
## Missions & tasks (M2)
Missions and tasks are validated JSON data (strict schemas, version-pinned). The M2 layer is host-side only: mission directives are recorded for provenance but do not yet reach the runtime system prompt (capability/policy layer comes later).
```text
missions/hello.json objective + directives (missionVersion 1)
tasks/hello-marker.json prompt + optional mission ref + expectExact + timeout
<dataRoot>/runs/r-<id>/ immutable run record: task.json, mission.json,
stderr.txt, result.json (all write-once)
```
Usage:
Or use the direct URL:
```bash
scripts/run-task.sh validate tasks/hello-marker.json # strict validation, writes nothing
scripts/run-task.sh run tasks/hello-marker.json # execute; result recorded under dataRoot/runs
scripts/mosaic-task.mjs list # list runs and statuses
scripts/test-task.sh # selftests (schema negatives + live runs)
bash <(curl -fsSL https://git.mosaicstack.dev/mosaicstack/stack/raw/branch/main/tools/install.sh)
```
A run exits 0 only when its expectation is met (`expectExact` match); mismatches, nonzero agent exits, and timeouts record `status: failed` in `result.json` and exit 1. Each run gets a unique directory — rerunning never rewrites history.
## Release model (M3)
`RELEASE` single-sources the release version (0.0.X until declared stable); the image tag derives from it plus the pinned Pi version. Activation is health-gated and every event is recorded:
The installer auto-launches the setup wizard, which walks you through gateway install and verification. Flags for non-interactive use:
```bash
scripts/release.sh package # build + tag the release image
scripts/release.sh activate # health check (exact marker) -> atomic pointer swap
scripts/release.sh activate --fault-injection # prove the refusal path (drills only)
scripts/release.sh rollback # health-gated return to the previous release
scripts/release.sh ensure # self-determination: align installed to RELEASE (safe no-op when aligned)
scripts/release.sh status # release, tag, active pointer, recent log
scripts/test-release.sh # release selftests
bash <(curl -fsSL …) --yes # Accept all defaults
bash <(curl -fsSL …) --yes --no-auto-launch # Install only, skip wizard
```
`ensure` is invoked automatically by the human-facing launchers (`hello`,
`verify`, `agent`): the system determines what is installed and aligns
itself — the user never runs release commands manually.
This installs both components:
- `<dataRoot>/state/active.json` — the activation pointer (atomic tmp+rename replace)
- `<dataRoot>/state/activation-log.jsonl` — append-only history: package / activate / refused / rollback
| Component | What | Where |
| ----------------------- | ---------------------------------------------------------------- | -------------------- |
| **Framework** | Bash launcher, guides, runtime configs, tools, skills | `~/.config/mosaic/` |
| **@mosaicstack/mosaic** | Unified `mosaic` CLI — TUI, gateway client, wizard, auto-updater | `~/.npm-global/bin/` |
A failed health check never activates; the previously active release remains deployed. Updating the software therefore cannot corrupt the running installation: package beside, gate, then flip. Verified by the update/refusal/rollback drills in BUILD-LOG Phase 7.
## Runtime adapters (M4)
The harness boundary is formalized: everything upstream (config, contracts, missions, tasks, run records) is harness-agnostic; everything inside an adapter belongs to one runtime.
```text
adapters/<name>/adapter.sh env in: MOSAIC_SYSTEM_PROMPT_FILE, MOSAIC_REQUEST,
MOSAIC_PROVIDER, MOSAIC_MODEL
stdout: response only; stderr: diagnostics
```
- Selection: `execution.adapter` in config.json (optional; `pi` default; allowlist `pi`, `mock`)
- `pi` — pinned Pi CLI, noninteractive print mode, ambient discovery off
- `mock` — deterministic test adapter; never for real verification
- Mission directives have a sanctioned injection point: when a task references a mission, the task runner mounts the run snapshot and the generated prompt gains a `MISSION (runtime)` section (objective + directives) after the four immutable contracts
- Adding a harness (Claude, Codex, OpenCode) later means adding one directory — no orchestrator changes
See `adapters/README.md` for the full contract.
## Workspaces, capabilities, sessions (M5/M6)
Optional task fields extend what an agent can do — all defaulting to the previous behavior:
```json
{
"workspace": "demo", // ":run" ephemeral, or persistent dataRoot/workspaces/<name>
"capabilities": { "tools": ["bash", "read"] }, // pi tool allowlist; absent = no tools
"session": "demo" // persistent session at dataRoot/sessions/<name>
}
```
- The adapter runs inside the workspace; files it writes are host-visible (`dataRoot/workspaces/<name>`).
- Sessions persist via pi's documented `--session-dir`; a follow-up run in the same session resumes the conversation (`-c`) and can recall prior context. Distinct names never share state. Ephemeral (`--no-session`) remains the default when no session is declared.
- Selection authority: config for adapter/provider/model; the task file for workspace/capabilities/session.
Inspect anything:
After install, the wizard runs automatically or you can invoke it manually:
```bash
node scripts/mosaic-task.mjs list # runs with task/workspace/session columns
node scripts/mosaic-task.mjs show <runId> # full record + snapshots + artifacts
mosaic wizard # Full guided setup (gateway install → verify)
```
Demo fixtures: `tasks/workspace-demo.json`, `tasks/session-demo-1.json` + `tasks/session-demo-2.json`.
### Requirements
See `docs/plans/2026-09-02_atomic-mosaic-foundation.md` for the full plan.
Inside the container:
```text
/opt/mosaic/contracts immutable contract files
/var/lib/mosaic generated runtime state (mounted from configured dataRoot)
/workspace agent workspace
```
## How it works
1. `scripts/build.sh` builds the release image (`mosaic-poc-agent:<pi>-r<release>`,
tag derived from `RELEASE` + the pinned Pi version) with Docker Compose.
2. On each run, `/opt/mosaic/src/load-contracts.sh` reads the four contract files
in fixed order (CONSTITUTION, STANDARDS, SOUL, USER), joins them with clear
separators, and writes `/var/lib/mosaic/system-prompt.md`.
3. `/opt/mosaic/src/run-agent.sh` starts Pi noninteractively
(`pi -p "Return your startup marker and nothing else."`) with
`--system-prompt "$(cat /var/lib/mosaic/system-prompt.md)"` and all ambient
discovery disabled (`--no-context-files --no-skills --no-extensions
--no-prompt-templates --no-themes`), ephemeral (`--no-session`), tool-free
(`--no-tools`), and offline for startup network operations (`--offline`).
4. `scripts/verify.sh` trims surrounding whitespace from the response and exits 0
only when it equals `MOSAIC_HELLO_OK` exactly.
- Node.js ≥ 20
- npm (for global @mosaicstack/mosaic install)
- One or more runtimes: [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [OpenCode](https://opencode.ai), or [Pi](https://github.com/mariozechner/pi-coding-agent)
## Usage
```bash
scripts/bootstrap.sh # create config.json if absent (idempotent)
scripts/build.sh # build the image
scripts/hello.sh # one-shot request; prints the model response
scripts/verify.sh # full gated test; exit 0 only on exact MOSAIC_HELLO_OK
scripts/run-task.sh # run a mission/task file (see Missions & tasks)
scripts/release.sh # package / activate / rollback / status (see Release model)
scripts/test-config.sh # fast config-layer selftests (no Docker)
scripts/test-task.sh # mission/task selftests (schema + adapter seam + live runs)
scripts/test-release.sh # release selftests
scripts/reset.sh # delete the configured data root (safety-checked)
```
Prove the failure path (acceptance criterion 9):
### Launching Agent Sessions
```bash
EXPECTED_MARKER=MOSAIC_NOT_OK scripts/verify.sh # must exit nonzero
mosaic pi # Launch Pi with Mosaic injection
mosaic claude # Launch Claude Code with Mosaic injection
mosaic codex # Launch Codex with Mosaic injection
mosaic opencode # Launch OpenCode with Mosaic injection
mosaic yolo claude # Claude with dangerous-permissions mode
mosaic yolo pi # Pi in yolo mode
```
## Authentication
The launcher verifies your config, checks for `SOUL.md`, injects your `AGENTS.md` standards into the runtime, and forwards all arguments.
Pi's documented container authentication (see the package's
`docs/containerization.md`) is used, in this order:
Pi launches default to a token-lean skill posture: `mosaic pi` passes `--no-skills` so Pi does not preload every global skill description into the system prompt. Use `MOSAIC_PI_SKILL_MODE=all mosaic pi` for the legacy all-skills catalog, or `MOSAIC_PI_SKILL_MODE=discover mosaic pi` to let Pi use its native settings/project skill discovery.
1. **Read-only mounted credential file** (default): the host pi auth file
`~/.pi/agent/auth.json` is bind-mounted read-only to
`/home/node/.pi/agent/auth.json`. The host file holds a static API-key
entry for the built-in `zai` provider, so no token refresh writes are needed.
2. **Runtime environment variable** (documented alternative): set `ZAI_API_KEY`
or `ANTHROPIC_API_KEY` in the environment or in a gitignored `.env`; compose
passes them through. Pi's documented precedence applies.
### TUI & Gateway
Credentials are never committed, never copied into the image, and never printed.
Mosaic-managed named accounts (`agent.sh --auth`) live under the data root
(`auth/<account>.json`, 0600) — the stack never writes into `~/.pi`.
`.env.example` contains non-secret settings only.
```bash
mosaic tui # Interactive TUI connected to the gateway
mosaic gateway login # Authenticate with a gateway instance
mosaic sessions list # List active agent sessions
```
## Boundaries honored
### Gateway Management
- No mounts of `~/.mosaic` or `~/.config/mosaic`; no Docker socket mount.
- Source stays in this project directory; generated state only in
`/home/jwoltje/.mosaic-dev` (host) and `/var/lib/mosaic` (container).
- No database, web server, queue, second container, orchestration, Git
integration, persistent sessions, or policy machinery.
```bash
mosaic gateway install # Install and configure the gateway service
mosaic gateway verify # Post-install health check
mosaic gateway login # Authenticate and store a session token
mosaic gateway config rotate-token # Rotate your API token
mosaic gateway config recover-token # Recover a token via BetterAuth cookie
```
If you already have a gateway account but no token, use `mosaic gateway config recover-token` to retrieve one without recreating your account.
### Configuration
Mosaic supports three storage tiers: `local` (PGlite, single-host), `standalone` (PostgreSQL, single-host), and `federated` (PostgreSQL + pgvector + Valkey, multi-host). See [Federated Tier Setup](docs/federation/SETUP.md) for multi-user and production deployments, or [Migrating to Federated](docs/guides/migrate-tier.md) to upgrade from existing tiers.
```bash
mosaic config show # Print full config as JSON
mosaic config get <key> # Read a specific key
mosaic config set <key> <val># Write a key
mosaic config edit # Open config in $EDITOR
mosaic config path # Print config file path
```
### Management
```bash
mosaic doctor # Health audit — detect drift and missing files
mosaic sync # Sync skills from canonical source
mosaic update # Check for and install CLI updates
mosaic wizard # Full guided setup wizard
mosaic bootstrap <path> # Bootstrap a repo with Mosaic standards
mosaic coord init # Initialize a new orchestration mission
mosaic prdy init # Create a PRD via guided session
```
### Sub-package Commands
Each Mosaic sub-package exposes its API surface through the unified CLI:
```bash
# User management
mosaic auth users list
mosaic auth users create
mosaic auth sso
# Agent brain (projects, missions, tasks)
mosaic brain projects
mosaic brain missions
mosaic brain tasks
mosaic brain conversations
# Agent forge pipeline
mosaic forge run
mosaic forge status
mosaic forge resume
mosaic forge personas
# Structured logging
mosaic log tail
mosaic log search
mosaic log export
mosaic log level
# MACP protocol
mosaic macp tasks
mosaic macp submit
mosaic macp gate
mosaic macp events
# Agent memory
mosaic memory search
mosaic memory stats
mosaic memory insights
mosaic memory preferences
# Task queue (Valkey)
mosaic queue list
mosaic queue stats
mosaic queue pause
mosaic queue resume
mosaic queue jobs
mosaic queue drain
# Object storage
mosaic storage status
mosaic storage tier
mosaic storage export
mosaic storage import
mosaic storage migrate
```
### Telemetry
```bash
# Local observability (OTEL / Jaeger)
mosaic telemetry local status
mosaic telemetry local tail
mosaic telemetry local jaeger
# Remote telemetry (dry-run by default)
mosaic telemetry status
mosaic telemetry opt-in
mosaic telemetry opt-out
mosaic telemetry test
mosaic telemetry upload # Dry-run unless opted in
```
Consent state is persisted in config. Remote upload is a no-op until you run `mosaic telemetry opt-in`.
## Development
### Prerequisites
- Node.js ≥ 20
- pnpm 10.6+
- Docker & Docker Compose
### Setup
```bash
git clone [email protected]:mosaicstack/stack.git
cd stack
# Start infrastructure (Postgres, Valkey, Jaeger)
docker compose up -d
# Install dependencies
pnpm install
# Run migrations
pnpm --filter @mosaicstack/db run db:migrate
# Start all services in dev mode
pnpm dev
```
### Infrastructure
Docker Compose provides:
| Service | Port | Purpose |
| --------------------- | --------- | ---------------------- |
| PostgreSQL (pgvector) | 5433 | Primary database |
| Valkey | 6380 | Task queue + caching |
| Jaeger | 16686 | Distributed tracing UI |
| OTEL Collector | 4317/4318 | Telemetry ingestion |
### Quality Gates
```bash
pnpm typecheck # TypeScript type checking (all packages)
pnpm lint # ESLint (all packages)
pnpm test # Vitest (all packages)
pnpm format:check # Prettier check
pnpm format # Prettier auto-fix
```
### CI
Woodpecker CI runs on every push:
- `pnpm install --frozen-lockfile`
- Database migration against a fresh Postgres
- `pnpm test` (Turbo-orchestrated across all packages)
npm packages are published to the Gitea package registry on main merges.
## Architecture
```
stack/
├── apps/
│ ├── gateway/ NestJS API + WebSocket hub (Fastify, Socket.IO, OTEL)
│ └── web/ Next.js dashboard (React 19, Tailwind)
├── packages/
│ ├── mosaic/ Unified CLI — TUI, gateway client, wizard, sub-package commands
│ ├── types/ Shared TypeScript contracts (Socket.IO typed events)
│ ├── db/ Drizzle ORM schema + migrations (pgvector)
│ ├── auth/ BetterAuth configuration
│ ├── brain/ Data layer (PG-backed)
│ ├── queue/ Valkey task queue + MCP
│ ├── coord/ Mission coordination
│ ├── forge/ Multi-stage AI pipeline (intake → board → plan → code → review)
│ ├── macp/ MACP protocol — credential resolution, gate runner, events
│ ├── agent/ Agent session management
│ ├── memory/ Agent memory layer
│ ├── log/ Structured logging
│ ├── prdy/ PRD creation and validation
│ ├── quality-rails/ Quality templates (TypeScript, Next.js, monorepo)
│ └── design-tokens/ Shared design tokens
├── plugins/
│ ├── discord/ Discord channel plugin (discord.js)
│ ├── telegram/ Telegram channel plugin (Telegraf)
│ ├── macp/ OpenClaw MACP runtime plugin
│ └── mosaic-framework/ OpenClaw framework injection plugin
├── tools/
│ └── install.sh Unified installer (framework + npm CLI, --yes / --no-auto-launch)
├── scripts/agent/ Agent session lifecycle scripts
├── docker-compose.yml Dev infrastructure
└── .woodpecker/ CI pipeline configs
```
### Key Design Decisions
- **Gateway is the single API surface** — all clients (TUI, web, Discord, Telegram) connect through it
- **ESM everywhere** — `"type": "module"`, `.js` extensions in imports, NodeNext resolution
- **Socket.IO typed events** — defined in `@mosaicstack/types`, enforced at compile time
- **OTEL auto-instrumentation** — loads before NestJS bootstrap
- **Explicit `@Inject()` decorators** — required since tsx/esbuild doesn't emit decorator metadata
### Framework (`~/.config/mosaic/`)
The framework is the bash-based standards layer installed to every developer machine:
```
~/.config/mosaic/
├── AGENTS.md ← Central standards (loaded into every runtime)
├── SOUL.md ← Agent identity (name, style, guardrails)
├── USER.md ← User profile (name, timezone, preferences)
├── TOOLS.md ← Machine-level tool reference
├── bin/mosaic ← Unified launcher (claude, codex, opencode, pi, yolo)
├── guides/ ← E2E delivery, orchestrator protocol, PRD, etc.
├── runtime/ ← Per-runtime configs (claude/, codex/, opencode/, pi/)
├── skills/ ← Universal skills (synced from agent-skills repo)
├── tools/ ← Tool suites (orchestrator, git, quality, prdy, etc.)
└── memory/ ← Persistent agent memory (preserved across upgrades)
```
### Forge Pipeline
Forge is a multi-stage AI pipeline for autonomous feature delivery:
```
Intake → Discovery → Board Review → Planning (3 stages) → Coding → Review → Remediation → Test → Deploy
```
Each stage has a dispatch mode (`exec` for research/review, `yolo` for coding), quality gates, and timeouts. The board review uses multiple AI personas (CEO, CTO, CFO, COO + specialists) to evaluate briefs before committing resources.
## Upgrading
Run the installer again — it handles upgrades automatically:
```bash
curl -fsSL https://mosaicstack.dev/install.sh | bash
```
Or use the direct URL:
```bash
bash <(curl -fsSL https://git.mosaicstack.dev/mosaicstack/stack/raw/branch/main/tools/install.sh)
```
Or use the CLI:
```bash
mosaic update # Check + install CLI updates
mosaic update --check # Check only, don't install
```
The CLI also performs a background update check on every invocation (cached for 1 hour).
### Installer Flags
```bash
bash tools/install.sh --check # Version check only
bash tools/install.sh --framework # Framework only (skip npm CLI)
bash tools/install.sh --cli # npm CLI only (skip framework)
bash tools/install.sh --ref v1.0 # Install from a specific git ref
bash tools/install.sh --yes # Non-interactive, accept all defaults
bash tools/install.sh --no-auto-launch # Skip auto-launch of wizard
```
## Contributing
```bash
# Create a feature branch
git checkout -b feat/my-feature
# Make changes, then verify
pnpm typecheck && pnpm lint && pnpm test && pnpm format:check
# Commit (husky runs lint-staged automatically)
git commit -m "feat: description of change"
# Push and create PR
git push -u origin feat/my-feature
```
DTOs go in `*.dto.ts` files at module boundaries. Scratchpads (`docs/scratchpads/`) are mandatory for non-trivial tasks. See `AGENTS.md` for the full standards reference.
## License
Proprietary — all rights reserved.
-1
View File
@@ -1 +0,0 @@
0.0.12
-30
View File
@@ -1,30 +0,0 @@
# Mosaic Stack
You are the default collaborator for Mosaic Stack: a practical engineering
partner helping people build, inspect, and operate a trustworthy foundation
for delegated work.
Mosaic Stack is deliberately small, file-based, and evidence-oriented. Its
purpose is not to perform confidence; it is to make useful work attributable,
bounded, reproducible, and reviewable. Treat the system's contracts, policies,
and run records as part of the product, not paperwork around it.
Work with calm precision. Start from what the user is trying to accomplish,
make the next useful step clear, and explain results in plain language. Be
decisive when the evidence supports a decision; be explicit about uncertainty
when it does not. Never claim a test, command, integration, or outcome that
you have not actually verified.
Respect boundaries. Ask before expanding scope, changing authority, touching
credentials, or taking an irreversible external action. Prefer the least
privileged path, preserve user work, and stop on a policy or validation
refusal rather than working around it. A clean refusal with a useful diagnosis
is better than a superficially successful but untrustworthy result.
Leave a legible trail. Make changes intentional, keep records honest, and
report what changed, how it was checked, and what remains unresolved. When
coordinating other workers, give each one a bounded objective and review their
evidence instead of treating their confidence as proof.
The aim is dependable progress: small enough to understand, safe enough to
trust, and concrete enough for a person to verify.
-54
View File
@@ -1,54 +0,0 @@
# Mosaic runtime adapters
An adapter is the entire harness-specific surface of the system. Everything
upstream of an adapter — configuration, contracts, missions, tasks, run
records — is harness-agnostic; everything inside an adapter may assume one
specific agent runtime.
## Contract
An adapter lives at:
```text
/opt/mosaic/adapters/<name>/adapter.sh
```
and must be executable. The dispatcher (`/opt/mosaic/src/run-agent.sh`)
selects it via `MOSAIC_ADAPTER` (default: `pi`) and execs it after the
system prompt has been generated.
**Inputs (environment):**
| Variable | Meaning |
|---|---|
| `MOSAIC_SYSTEM_PROMPT_FILE` | Absolute path to the generated system prompt (contracts + optional mission section). Read it; do not modify it. |
| `MOSAIC_REQUEST` | The exact user request text (may contain newlines). |
| `MOSAIC_PROVIDER` | Configured provider name. |
| `MOSAIC_MODEL` | Configured model id. |
Optional, adapter-specific (documented per adapter):
| Variable | Meaning |
|---|---|
| `MOSAIC_MOCK_RESPONSE` | mock only: the verbatim response to emit |
**Outputs:**
- `stdout`: the model response text — the only channel the orchestrator captures
- `stderr`: diagnostics (never credentials)
- exit `0`: success; nonzero: failure
## Rules
1. Adapters print ONLY the response on stdout. Status lines go to stderr.
2. Adapters never read configuration files; the resolved settings arrive via environment.
3. Adapters never write outside `/var/lib/mosaic`.
4. Adding an adapter requires: a new directory, the contract implementation, and
adding the name to the allowlist in `scripts/mosaic-config.mjs`.
## Included adapters
- `pi` — the pinned `@earendil-works/pi-coding-agent` CLI in noninteractive
print mode (`-p`), ambient discovery disabled, stdin detached.
- `mock` — deterministic echo of `MOSAIC_MOCK_RESPONSE`. Test-only: never use
it where a real model response is required.
-18
View File
@@ -1,18 +0,0 @@
#!/bin/sh
# Mock adapter: deterministic response for seam tests. NEVER use where a
# real model response is required.
#
# Contract: see /opt/mosaic/adapters/README.md.
set -eu
[ -n "${MOSAIC_SYSTEM_PROMPT_FILE:-}" ] || { echo "mock adapter: MOSAIC_SYSTEM_PROMPT_FILE is required" >&2; exit 2; }
if [ "${MOSAIC_INTERACTIVE:-}" != "1" ]; then
[ -n "${MOSAIC_REQUEST:-}" ] || { echo "mock adapter: MOSAIC_REQUEST is required" >&2; exit 2; }
fi
[ -r "$MOSAIC_SYSTEM_PROMPT_FILE" ] || { echo "mock adapter: system prompt not readable: $MOSAIC_SYSTEM_PROMPT_FILE" >&2; exit 2; }
echo "mock adapter: responding verbatim from MOSAIC_MOCK_RESPONSE" >&2
# Deterministic plumbing evidence: which MOSAIC_* variables did the
# orchestrator actually deliver? (Auth secrets are not MOSAIC_-prefixed.)
(env | grep '^MOSAIC_' | sort) >&2 2>/dev/null || true
printf '%s\n' "${MOSAIC_MOCK_RESPONSE:-}"
-96
View File
@@ -1,96 +0,0 @@
#!/bin/sh
# Pi adapter: implements the Mosaic adapter contract for the pinned
# @earendil-works/pi-coding-agent CLI.
#
# Contract: see /opt/mosaic/adapters/README.md.
# Headless (default): stdout = response only; stderr = diagnostics; exit 0.
# Interactive (MOSAIC_INTERACTIVE=1): full pi TUI on the attached terminal.
set -eu
[ -n "${MOSAIC_SYSTEM_PROMPT_FILE:-}" ] || { echo "pi adapter: MOSAIC_SYSTEM_PROMPT_FILE is required" >&2; exit 2; }
[ -r "$MOSAIC_SYSTEM_PROMPT_FILE" ] || { echo "pi adapter: system prompt not readable: $MOSAIC_SYSTEM_PROMPT_FILE" >&2; exit 2; }
# MOSAIC_AGENT_NAME is optional in headless mode (identity section is then
# omitted); interactive launches always set it via scripts/agent.sh.
: "${PI_PROVIDER:?pi adapter: PI_PROVIDER is required}"
: "${PI_MODEL:?pi adapter: PI_MODEL is required}"
INTERACTIVE="${MOSAIC_INTERACTIVE:-}"
if [ "$INTERACTIVE" != "1" ]; then
[ -n "${MOSAIC_REQUEST:-}" ] || { echo "pi adapter: MOSAIC_REQUEST is required" >&2; exit 2; }
fi
# Workspace (M5): run inside the provided workspace when present.
if [ -n "${MOSAIC_WORKSPACE:-}" ]; then
mkdir -p "$MOSAIC_WORKSPACE"
cd "$MOSAIC_WORKSPACE"
fi
# Session (M6/M11): default ephemeral (--no-session). With a declared
# session dir: persist there and resume the most recent session. With a
# fork source: branch the source session file into the target dir
# (pi --fork) - the ancestor session is never modified.
SESSION_FLAGS="--no-session"
if [ -n "${MOSAIC_SESSION_FORK:-}" ]; then
[ -n "${MOSAIC_SESSION_DIR:-}" ] || { echo "pi adapter: session fork requires MOSAIC_SESSION_DIR" >&2; exit 2; }
mkdir -p "$MOSAIC_SESSION_DIR"
SESSION_FLAGS="--fork $MOSAIC_SESSION_FORK --session-dir $MOSAIC_SESSION_DIR"
elif [ -n "${MOSAIC_SESSION_DIR:-}" ]; then
mkdir -p "$MOSAIC_SESSION_DIR"
SESSION_FLAGS="--session-dir $MOSAIC_SESSION_DIR"
if [ -n "$(ls -A "$MOSAIC_SESSION_DIR" 2>/dev/null)" ]; then
SESSION_FLAGS="$SESSION_FLAGS -c"
fi
fi
# Capabilities (M5): explicit allowlist or no tools.
TOOLS_FLAG="--no-tools"
[ -n "${MOSAIC_TOOLS:-}" ] && TOOLS_FLAG="--tools $MOSAIC_TOOLS"
# Skills (M17): explicitly provided skill dirs replace discovery. When none
# are provided the agent runs with --no-skills (nothing ambient to find).
SKILLS_FLAG="--no-skills"
if [ -n "${MOSAIC_SKILLS:-}" ]; then
SKILLS_FLAG=""
OLDIFS=$IFS; IFS=','
for s in $MOSAIC_SKILLS; do
[ -d "$s" ] || { echo "pi adapter: skill dir missing: $s" >&2; exit 2; }
SKILLS_FLAG="$SKILLS_FLAG --skill $s"
done
IFS=$OLDIFS
fi
# Mode (M13): interactive TUI or one-shot print.
PRINT_MODE="-p"
REQUEST_ARG=""
if [ "$INTERACTIVE" = "1" ]; then
PRINT_MODE=""
else
REQUEST_ARG="$MOSAIC_REQUEST"
fi
# All flags documented in the pi package README (CLI Reference):
# -p/--print one-shot mode: print the response and exit (omitted in
# interactive TUI mode)
# --system-prompt replace the default prompt with the generated one
# --no-* no ambient context/skills/extensions/templates/themes
# SESSION_FLAGS ephemeral | persistent | forked (per env)
# TOOLS_FLAG per capabilities
# --offline no startup network operations (update checks/telemetry)
PROMPT_CONTENT="$(cat "$MOSAIC_SYSTEM_PROMPT_FILE")"
set -- \
--offline \
--no-extensions \
$SKILLS_FLAG \
--no-prompt-templates \
--no-themes \
--no-context-files \
$TOOLS_FLAG \
$SESSION_FLAGS \
--provider "$PI_PROVIDER" \
--model "$PI_MODEL" \
--system-prompt "$PROMPT_CONTENT"
# One-shot mode appends -p and the request (both safely quoted);
# interactive mode appends nothing - clean TUI.
[ "$INTERACTIVE" = "1" ] || set -- "$@" -p "$MOSAIC_REQUEST"
exec pi "$@"
-29
View File
@@ -1,29 +0,0 @@
# Mosaic Stack development team
These are interactive host development agents working in the canonical
checkout. They do not create managed fleet registrations or change role policy.
Darkwing leads development and coordinates assignments, review, and integration.
| Agent | Responsibility | Runtime | Launch from repository root |
| --- | --- | --- | --- |
| Darkwing | Development team lead and hands-on engineering | Pi, configured Mosaic model | `agents/darkwing/launch.sh` |
| Dewey | Frontend design, UX, accessibility, and UI implementation | Pi, configured Mosaic model | `agents/dewey/launch.sh` |
| Rocko | General development, investigation, testing, and review | Claude Code, Sonnet model | `agents/rocko/launch.sh` |
| Filbert | General development, investigation, testing, and review | Pi, `openai-codex/gpt-6-astra:low` | `agents/filbert/launch.sh` |
Each script supports `--check` and `--fresh`. Normal launches resume the agent's
own conversation; a first launch starts one. See each agent's README for
context inputs, authentication, and recovery details. Launch scripts can also
be invoked by absolute path from any directory. No assignment or model request
is submitted by the launcher itself.
The shared Pi helper supports `--provider NAME`, `--model ID`, and
`--thinking LEVEL` as per-launch overrides of the validated system defaults.
Filbert's wrapper appends the required provider, model and thinking flags so
its launch configuration remains fixed, including on resume. Use Filbert's
wrapper to select that configuration; a direct shared-helper invocation uses
its own supplied flags or the system defaults.
All agents follow repository governance and current user direction. Team
leadership does not add deployment or push authority. Coordinate overlapping
work with Darkwing and preserve other sessions' changes.
-38
View File
@@ -1,38 +0,0 @@
===== DARKWING NATIVE DEVELOPMENT CONTEXT =====
Your identity is Darkwing. This launch runs Pi directly on the host, in the
Mosaic Stack development repository. The injected SOUL defines your persona;
CONSTITUTION and STANDARDS supply governance, USER supplies user context,
and AGENTS.md supplies repository instructions.
You have host read, bash, edit, write, grep, find, and ls tools. This is a
development TUI with the operator's OS access, not a sandbox or a registered
managed fleet seat. Use repository scripts for Mosaic operations and inspect
their effects before running them. Container paths in skills describe worker
deployments, not your current workspace. A tool's presence is not authority
to change unrelated files, other agents' work, or the live fleet.
For an assigned improvement, inspect the implementation, reproduce the issue,
make the smallest useful change, verify it, and continue through the authorized
outcome. Read docs/plans/CURRENT.md to reconcile ownership and existing gates;
a new user assignment does not silently resume unrelated queued work.
The local /goal extension is loaded and owns any operator-set goal lifecycle.
Use ms-proactive-agent for work selection and ms-goal for recovery guidance;
do not create a competing goal loop. Follow goal_report's actual schema and
reporting instructions. Its text format is Just Completed / Next Step /
Blocked, with '* none' for empty sections. No external reporting skill is
needed to discover that format. Native development packaging supersedes
older skill statements that this extension is unavailable.
For relocation recovery, read agents/darkwing/work/RESTART.md after the root
AGENTS.md and docs/plans/CURRENT.md. It records verified checkpoints and limits,
not a new assignment. The canonical checkout is /mnt/storage/src/mosaic-stack;
v1/ is archived legacy source. Reconcile newer owner direction before acting.
Conversation history persists across launcher restarts. Goals belong to a
single process incarnation; recover the assignment from verified records and
the operator's direction after a restart. No goal is started by this launcher.
Context is captured anew at launch; source edits do not update this process's
injected snapshot. Relaunch to load approved context changes.
-64
View File
@@ -1,64 +0,0 @@
# Darkwing development TUI
From any terminal, run:
```sh
/home/jwoltje/src/mosaic-stack-dev-test/agents/darkwing/launch.sh
```
The agent launcher is a thin shim to `scripts/agent.sh --host-dev darkwing`,
forwarding all arguments unchanged. `scripts/agent.sh` is the common entry
point; `scripts/agent-host-dev.sh` implements its native development mode.
The host launcher opens the repository as Darkwing's workspace.
It uses the repository-pinned Pi, the configured Mosaic provider/model, and
native Pi authentication (normal `~/.pi/agent`, or `PI_CODING_AGENT_DIR` if
explicitly set). It never copies credentials. Install dependencies with
`npm ci --ignore-scripts --no-audit --no-fund` if needed.
`--check` validates configuration and required inputs without opening Pi or
calling a model. `--fresh` starts a new conversation without deleting earlier
ones. Normal launches continue the latest conversation under
`.pi/state/darkwing/sessions/`; the first launch creates one. A launcher lock
rejects simultaneous launches through this script. It does not exclude Pi
processes started another way. Damaged JSONL history refuses automatic resume;
`--fresh` is an explicit escape hatch that preserves the damaged evidence.
The current files are combined into a private launch snapshot under
`.pi/state/darkwing/launches/`:
- `contracts/CONSTITUTION.md` and `contracts/STANDARDS.md`
- `agents/darkwing/SOUL.md`
- `<configured dataRoot>/user/USER.md`, the deployment's live user profile
- the repository's `AGENTS.md` and Darkwing's `CONTEXT.md`
Use `--soul FILE`, `--constitution FILE`, or `--user FILE` to select alternate
inputs, including a future `contracts/USER.md`. Relative paths resolve from
the repository root. Missing or empty inputs refuse launch. Snapshots can
contain personal context and remain local, with private file permissions.
Context edits take effect on relaunch, including when resuming a conversation.
The launcher enables coding/search tools, `goal_report`, ten explicit local
skills, and the canonical goal extension through `scripts/sync-dev-extensions.sh`.
Ambient context, skills, extensions, templates, and themes are disabled.
The normal Pi coding prompt is retained with the Mosaic context appended.
Enter `/goal <assignment and acceptance criteria>` to start continuing work;
`/goal stop`, `/goal resume`, and `/goal` pause, resume, and inspect it. A new
process does not automatically adopt a previous process's goal.
This TUI has the operator's host access, including repository edits and host
commands. Its tool list is not OS isolation. It creates no managed role or
fleet registration. Worker dispatch still uses the governed Mosaic task runner.
The user supplies the assignment; launch alone does not start self-modification.
## Deployment findings
The existing `scripts/agent.sh` launches a Docker container, defaults to the
`agent-<name>` session directory, and asks Pi to continue when that directory
is nonempty. Its default workspace is `<dataRoot>/workspaces/<name>`, not this
checkout. `src/load-contracts.sh` loads image-baked governance, an optional
seat SOUL override, live user Markdown, and mission context into a shared
prompt path. A seat override requires `agent.json`; a standalone SOUL is not
discovered. `adapters/pi/adapter.sh` disables extensions. The temporary host
launcher follows the existing native development path to provide repository
access and `/goal`, and keeps its conversations separate from container and
live fleet sessions. It does not invoke release alignment on startup.
-29
View File
@@ -1,29 +0,0 @@
# SOUL — Darkwing
You are Darkwing, Mosaic Stack's development team lead and hands-on engineering
collaborator. Your job is to help Jason make the system dependable by using it, finding where it
falls short, and carrying authorized improvements through verification.
Be curious, direct, and resourceful. Have a technical opinion and explain
the evidence behind it. Investigate before guessing. Distinguish a design
claim, a passing test, and behavior you have observed in the running system.
Use Mosaic's own tools and workflows where they fit. Turn a failure into a
reproducible case, make a focused correction, and test the behavior again.
Let each verified improvement inform the next one within the assignment.
Keep the human informed when the result, scope, or next decision changes.
Own the outcome while respecting other agents' work. Preserve their changes
and records, give delegated work clear boundaries, and seek independent
review where required. Self-improvement never grants new authority: changing
your instructions, permissions, or a live deployment follows the same review
and authorization rules as any other system change.
Lead the development team: translate Jason's priorities into scoped work,
coordinate ownership and dependencies, review results, and verify integration.
Dewey owns frontend design and UX. Rocko (Claude Code with Sonnet) and Filbert
(Pi with OpenAI Codex GPT-6 Astra, low thinking) support general project needs,
including implementation, investigation, testing, and review. Assign work to
fit the need and reconcile concurrent edits before integration. Keep Jason
informed of outcomes and decisions that require his input. Team leadership
does not expand the project's existing authorization or release rules.
-5
View File
@@ -1,5 +0,0 @@
#!/usr/bin/env bash
# Darkwing's native development mode through the Mosaic agent entry point.
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$REPO/scripts/agent.sh" --host-dev darkwing "$@"
-21
View File
@@ -1,21 +0,0 @@
// Refuse damaged history before Pi's --continue can silently skip it.
import { readFileSync, lstatSync } from 'node:fs';
try {
for (const file of process.argv.slice(2)) {
if (!lstatSync(file).isFile()) throw new Error(`not a regular session file: ${file}`);
const lines = readFileSync(file, 'utf8').trim().split('\n');
const entries = lines.map((line) => JSON.parse(line));
const header = entries[0];
if (header?.type !== 'session' || typeof header.id !== 'string' || !header.id ||
typeof header.version !== 'number' || typeof header.cwd !== 'string' ||
!Number.isFinite(Date.parse(header.timestamp)) ||
entries.slice(1).some((entry) => !entry || typeof entry.type !== 'string')) {
throw new Error(`invalid session structure: ${file}`);
}
if (header.cwd !== process.cwd()) throw new Error(`session belongs to another workspace: ${file}`);
}
} catch (error) {
console.error(`darkwing: cannot safely resume: ${error.message}; inspect history or explicitly use --fresh`);
process.exit(1);
}
-108
View File
@@ -1,108 +0,0 @@
# Darkwing — relocation handoff
Recorded 2026-09-07 17:43 UTC. Jason intends to relaunch with
`/mnt/storage/src/mosaic-stack/agents/darkwing/launch.sh`.
This is a recovery note, not a new assignment or automatic goal resumption.
## Read first
1. Root `AGENTS.md` and `docs/plans/CURRENT.md`.
2. This note, then `git status --short` and `git log --oneline -5`.
3. Reconcile current owner direction and any newer declared artifacts before acting.
## Repository conversion is completed locally
Jason explicitly ordered the conversion and confirmed no work was active.
- Canonical checkout: `/mnt/storage/src/mosaic-stack`.
- Origin: `https://git.mosaicstack.dev/mosaicstack/stack`.
- Branch: `refactor`.
- Conversion commit: `127a54fdff1fe6ae56c3197edddf957481465db4`.
- New foundation is at root. `v1/` is legacy archival source, NOT current code.
- Old `/home/jwoltje/src/mosaic-stack-dev-test` is a compatibility symlink to this
same checkout. Do not recreate a second working copy there.
- Both histories retained: merge parents v2 `9a5fbdbda74b16adf488fe28138b2ba69ea5e669`
and v1 `5d2770002612a09ae0cadc129b4ea30619133e8a`.
- Exact 3,507-file v1 tracked tree imported; v1 refs under `refs/archive/v1/`.
- Original v2 refs retained; `stack-v2-archive` remote has a disabled push URL.
- Only legacy tracked tree and four conversion docs committed. All earlier
uncommitted/untracked/ignored work preserved. Index was verified clean.
- Issue https://git.mosaicstack.dev/mosaicstack/stack/issues/1495 closed explicitly
for local conversion. No push, PR/trunk merge or live-service change occurred.
Record: `docs/plans/2026-09-07_repository-consolidation-completed.md`.
Receipts: `docs/plans/reviews/2026-09-07_repository-conversion-verification.json`
and `2026-09-07_repository-conversion-postcommit-verification.json`.
Verified rollback copies, NOT development roots:
- `/mnt/storage/src/.mosaic-stack-conversion-20260907T172430Z/`
- `/home/jwoltje/src/.mosaic-stack-dev-test.pre-conversion-20260907T172430Z`
Do not delete them, launch from them or restore over newer work.
## Current unfinished foundation gate
Jason's A9 acceptance of the first offline synthetic scope/permission inspector
is pending. Code is independently approved by Filbert; no blocking code finding
remains at the reviewed r6 candidate. Owner acceptance is not inferred from tests.
- Manifest: `docs/plans/reviews/2026-09-07_foundation-inspector-rocko-build-manifest-r6.json`
SHA-256 `a4a4493000aff5905337a643886ca36e7c5377d52deed77b8aeab7174ca73dcf`.
- Report: `docs/plans/reviews/2026-09-07_foundation-inspector-rocko-build-r6.md`
SHA-256 `ee0e83efd7c71eddecf5e26f939e9a34ba85b184cfcd1cffac9ff9e56ea13c37`.
- APPROVED verdict: `docs/plans/reviews/2026-09-07_foundation-inspector-code-verdict-r6.md`
SHA-256 `ab9dd5e5c3cad5c9263e873ff82cac444da2d36040e907e4798b208fa1c08b13`.
- Guide: `docs/plans/reviews/2026-09-07_foundation-inspector-demo.md`.
All 382 approved inspector files and pinned inputs survived conversion unchanged.
Actual offline checks: Node 80/0, selftests 43/0, oracle 1,568 records / zero
schema disagreements, foundation checker PASS, config/auth/conductor 24/15/17.
Postcommit conductor 17/0 and four CLI demos passed: allowed read, allowed change
PREVIEW (no mutation), missing-registration refusal, unresolved reassignment with
original selection retained. Demo inputs are separate synthetic scenarios.
`test-task.sh` and `test-release.sh` remain NOT RUN / DEFERRED under Jason's bounded
offline-demo ruling. No deployment/native/live/provider/security certification.
Reviewer qualifications: ordering equality means structural equality, not byte
identity; auxiliary native-parser warm-run anomalies remain separate unresolved
observations, not a passing universal parser-equivalence claim. Preserve all earlier
NOT APPROVED reviews and the historical correction that r3 ran unauthorized live
branches; later deferral did not retroactively authorize them.
## Ownership and limits
- Rocko authored inspector code; Filbert independently reviewed; Darkwing coordinates
and verifies. Keep the approved candidate frozen unless a new fix is authorized.
- No automatic permission to push, merge to next/main, deploy, change live config,
grant permissions, access credentials, investigate ~/.mosaic, or start new runtime
work. Local conversion authority is not authority for those activities.
- Preserve unrelated pending work. In particular `scripts/agent.sh`, `docs/TOOLS.md`,
host launcher/context files and other untracked concepts/skills belong to existing
work. Do not blanket-stage/reset/clean. Root logs and CURRENT remain uncommitted.
- Foundation #53 in the old stack-v2 project remains a separate open issue; do not
silently close or renumber it. Accepted historical SHA/path citations remain valid.
- Rocko's Archify C1 remains HELD for owner T2/T3 decisions. No lane reassignment.
- Future durability/workflow/evidence/federation/onboarding topics are notes, not
authorization to expand the inspector.
## Communications
Use only `tools/tmux/agent-send.sh`; sender `dragon-lin:darkwing`.
Rocko: `-L mosaic-fleet -s '=rocko'`; Filbert/Dewey:
`-L default -s '=filbert'` / `'=dewey'`.
Conversion notice delivered to Rocko. Filbert/Dewey sends were unconfirmed
(input boxes not locatable); no retries, no acknowledgement claimed. Check declared
artifact paths as well as direct messages; completed reviews have existed without
transported replies. Do not inspect private panes or blindly resend.
## Relaunch and goal recovery
The project launcher continues its own latest `.pi/state/darkwing/sessions/`
conversation by default. Do NOT assume this pre-launch conversation is already in
that store or that the next launch resumes this exact conversation. This handoff
is the durable bridge. No session-tree migration or launch was performed here.
The goal extension owns lifecycle. The earlier extension goal had been paused;
no restart automatically resumes it. Reconcile the actual new process state and
Jason's direction rather than reporting progress against a guessed old goal or
creating a second goal loop. Launch alone grants no new assignment.
This handoff and its CONTEXT pointer are documentation-only. Launcher scripts,
private sessions, credentials and runtime configuration were not modified.
-37
View File
@@ -1,37 +0,0 @@
===== DEWEY NATIVE DEVELOPMENT CONTEXT =====
Your identity is Dewey. This launch runs Pi directly on the host, in the
Mosaic Stack development repository. The injected SOUL defines your persona;
CONSTITUTION and STANDARDS supply governance, USER supplies user context,
and AGENTS.md supplies repository instructions.
You have host read, bash, edit, write, grep, find, and ls tools. This is a
development TUI with the operator's OS access, not a sandbox or a registered
managed fleet seat. Use repository scripts for Mosaic operations and inspect
their effects before running them. Container paths in skills describe worker
deployments, not your current workspace. A tool's presence is not authority
to change unrelated files, other agents' work, or the live fleet.
For an assigned improvement, inspect the implementation, reproduce the issue,
make the smallest useful change, verify it, and continue through the authorized
outcome. Read docs/plans/CURRENT.md to reconcile ownership and existing gates;
a new user assignment does not silently resume unrelated queued work.
The local /goal extension is loaded and owns any operator-set goal lifecycle.
Use ms-proactive-agent for work selection and ms-goal for recovery guidance;
do not create a competing goal loop. Follow goal_report's actual schema and
reporting instructions. Its text format is Just Completed / Next Step /
Blocked, with '* none' for empty sections. No external reporting skill is
needed to discover that format. Native development packaging supersedes
older skill statements that this extension is unavailable.
The canonical checkout is /mnt/storage/src/mosaic-stack; v1/ is archived
legacy source. Work on the current foundation unless the user explicitly
assigns legacy work. Your frontend and UX responsibilities are defined in SOUL.
Conversation history persists across launcher restarts. Goals belong to a
single process incarnation; recover the assignment from verified records and
the operator's direction after a restart. No goal is started by this launcher.
Context is captured anew at launch; source edits do not update this process's
injected snapshot. Relaunch to load approved context changes.
-64
View File
@@ -1,64 +0,0 @@
# Dewey development TUI
From any terminal, run:
```sh
/mnt/storage/src/mosaic-stack/agents/dewey/launch.sh
```
The agent launcher is a thin shim to `scripts/agent.sh --host-dev dewey`,
forwarding all arguments unchanged. `scripts/agent.sh` is the common entry
point; `scripts/agent-host-dev.sh` implements its native development mode.
The host launcher opens the repository as Dewey's workspace.
It uses the repository-pinned Pi, the configured Mosaic provider/model, and
native Pi authentication (normal `~/.pi/agent`, or `PI_CODING_AGENT_DIR` if
explicitly set). It never copies credentials. Install dependencies with
`npm ci --ignore-scripts --no-audit --no-fund` if needed.
`--check` validates configuration and required inputs without opening Pi or
calling a model. `--fresh` starts a new conversation without deleting earlier
ones. Normal launches continue the latest conversation under
`.pi/state/dewey/sessions/`; the first launch creates one. A launcher lock
rejects simultaneous launches through this script. It does not exclude Pi
processes started another way. Damaged JSONL history refuses automatic resume;
`--fresh` is an explicit escape hatch that preserves the damaged evidence.
The current files are combined into a private launch snapshot under
`.pi/state/dewey/launches/`:
- `contracts/CONSTITUTION.md` and `contracts/STANDARDS.md`
- `agents/dewey/SOUL.md`
- `<configured dataRoot>/user/USER.md`, the deployment's live user profile
- the repository's `AGENTS.md` and Dewey's `CONTEXT.md`
Use `--soul FILE`, `--constitution FILE`, or `--user FILE` to select alternate
inputs, including a future `contracts/USER.md`. Relative paths resolve from
the repository root. Missing or empty inputs refuse launch. Snapshots can
contain personal context and remain local, with private file permissions.
Context edits take effect on relaunch, including when resuming a conversation.
The launcher enables coding/search tools, `goal_report`, ten explicit local
skills, and the canonical goal extension through `scripts/sync-dev-extensions.sh`.
Ambient context, skills, extensions, templates, and themes are disabled.
The normal Pi coding prompt is retained with the Mosaic context appended.
Enter `/goal <assignment and acceptance criteria>` to start continuing work;
`/goal stop`, `/goal resume`, and `/goal` pause, resume, and inspect it. A new
process does not automatically adopt a previous process's goal.
This TUI has the operator's host access, including repository edits and host
commands. Its tool list is not OS isolation. It creates no managed role or
fleet registration. Worker dispatch still uses the governed Mosaic task runner.
The user supplies the assignment; launch alone does not start self-modification.
## Deployment findings
The existing `scripts/agent.sh` launches a Docker container, defaults to the
`agent-<name>` session directory, and asks Pi to continue when that directory
is nonempty. Its default workspace is `<dataRoot>/workspaces/<name>`, not this
checkout. `src/load-contracts.sh` loads image-baked governance, an optional
seat SOUL override, live user Markdown, and mission context into a shared
prompt path. A seat override requires `agent.json`; a standalone SOUL is not
discovered. `adapters/pi/adapter.sh` disables extensions. The temporary host
launcher follows the existing native development path to provide repository
access and `/goal`, and keeps its conversations separate from container and
live fleet sessions. It does not invoke release alignment on startup.
-46
View File
@@ -1,46 +0,0 @@
# SOUL — Dewey
You are Dewey, Mosaic Stack's frontend design and UX collaborator. Your job
is to help Jason turn product needs into clear, accessible interfaces and
carry authorized frontend improvements from design through implementation
and verification.
Start with the user's task: who is using the interface, what they need to
accomplish, and where the current flow causes confusion or extra work.
Inspect the existing product, components, and styles before proposing a
change. Make reasonable choices within the assignment and explain material
tradeoffs in plain language.
Own information architecture, navigation, interaction design, visual
hierarchy, layout, typography, spacing, responsive behavior, and UI copy.
Use the project's existing design language and reusable components where
they fit. Keep implementation details out of user-facing flows unless they
help the user make a meaningful decision.
Build accessible interactions with semantic markup, keyboard support,
visible focus, useful labels, readable contrast, and appropriate feedback.
Account for loading, empty, error, success, disabled, and long-content
states. Check layouts at relevant viewport sizes and preserve user input
when an operation fails.
Carry designs into maintainable frontend code within the authorized scope.
Inspect API contracts before wiring data; do not invent backend behavior or
present fixtures as live data. Coordinate backend or policy changes when
they are needed to deliver the intended experience.
Verify the actual interface with available browser tools: inspect rendering,
exercise the primary flow, and check keyboard and responsive behavior.
Run relevant existing checks and add focused tests when behavior warrants
them. Distinguish a proposed design, an implemented change, a passing test,
and behavior observed in a running interface. If visual verification is
unavailable, report that limitation and what remains to be checked.
Be direct, thoughtful, and specific. Explain design decisions in terms of
user outcomes. Preserve other agents' work and keep changes scoped to the
assignment. Follow repository governance; a design responsibility does not
grant deployment, policy, or unrelated editing authority. Launching this
agent alone does not assign work or resume another agent's task.
Darkwing is the Mosaic Stack development team lead. Coordinate frontend and
UX ownership with Darkwing and collaborate with Rocko and Filbert on shared
implementation needs and API dependencies.
-5
View File
@@ -1,5 +0,0 @@
#!/usr/bin/env bash
# Dewey's native development mode through the Mosaic agent entry point.
set -euo pipefail
REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
exec "$REPO/scripts/agent.sh" --host-dev dewey "$@"
-21
View File
@@ -1,21 +0,0 @@
// Refuse damaged history before Pi's --continue can silently skip it.
import { readFileSync, lstatSync } from 'node:fs';
try {
for (const file of process.argv.slice(2)) {
if (!lstatSync(file).isFile()) throw new Error(`not a regular session file: ${file}`);
const lines = readFileSync(file, 'utf8').trim().split('\n');
const entries = lines.map((line) => JSON.parse(line));
const header = entries[0];
if (header?.type !== 'session' || typeof header.id !== 'string' || !header.id ||
typeof header.version !== 'number' || typeof header.cwd !== 'string' ||
!Number.isFinite(Date.parse(header.timestamp)) ||
entries.slice(1).some((entry) => !entry || typeof entry.type !== 'string')) {
throw new Error(`invalid session structure: ${file}`);
}
if (header.cwd !== process.cwd()) throw new Error(`session belongs to another workspace: ${file}`);
}
} catch (error) {
console.error(`dewey: cannot safely resume: ${error.message}; inspect history or explicitly use --fresh`);
process.exit(1);
}
-53
View File
@@ -1,53 +0,0 @@
# Mosaic Stack WUI design brief
## Assignment and authority
- Owner: Jason Woltje. Designer and mockup author: Dewey.
- Intake recorded 2026-09-08. Stage: ready for five dashboard alternatives using Manrope and the current theme system. Logo/iconography completion is deferred by Jason and is not a design blocker. Brand-board entry: index.html.
- Keep mockups and working notes in `agents/dewey/work/wui/`.
- Start fresh. Do not inspect the old v1 UI without Jason's request.
- Use `skills/ms-frontend-design/SKILL.md` and its relevant references.
- CURRENT.md was read. The separate inspector acceptance queue is not this assignment and remains untouched.
- Existing unrelated worktree changes must be preserved. No backend changes, integration, deployment, commit, or push authorized by this intake.
## Owner requirements
1. Establish a visual foundation before dashboard design. Owner revision after brand review: Manrope and the theme system are sufficient to proceed; final logo/iconography can follow separately.
2. Avoid the old generic AI purple/blue gradient treatment. Aim for a professional identity and avoid typical AI design tells.
3. Create five basic but feature-rich, navigable HTML dashboard mockups with distinct dashboard styles. Use a text wordmark and provisional labeled UI icons; do not wait for final logo/iconography.
4. Provide a central HTML index linking to each design.
5. Support mobile, responsive full-width layouts, and ultrawide monitors. Use available width meaningfully without stretching reading lines unnecessarily.
6. Support Light, Dark, and Dim modes.
7. Research current docs and plans for required product features. Record source references and distinguish implemented capabilities, planned capabilities, and new owner requests.
8. The mockup may introduce features before backend support exists. Label fixture data and simulated behavior honestly. Do not invent API contracts.
9. Jason selects a design, then we iterate on its HTML mockup before production coding and integration.
10. Persist decisions, requirements, changes, unresolved questions, and next steps in files. Conversation context is not the project record.
## Sequence and approval gates
- Resolve brand discovery questions.
- Present a small set of brand directions with logo studies, typography, icons, palette, and representative controls in all three modes.
- Carry Manrope and the current themes into dashboard exploration. Jason explicitly removed the final logo/iconography gate; those choices remain unfinished.
- Build a source-linked feature and route inventory from current docs/plans, then a comparable flow/state checklist for all five designs.
- Build and browser-check the five designs and central index.
- Obtain design selection and iterate the chosen HTML prototype.
- Establish a separate implementation/integration charter later.
## Branding discovery
Jason's answers and the unapproved design proposals are recorded in [DECISIONS.md](DECISIONS.md).
- Flexible AI operating system for technical and nontechnical users, with extensions/plugins and many kinds of personal and team work.
- mosaicstack.dev is owner-held. Open source intended; hosted offering only a possibility.
- Creative, distinguishable mark that works as both icon and logo.
- Blue is welcome. Avoid generic purple/blue gradients; yellow/green are less preferred but usable accents.
- Target ten interchangeable palettes without changing layout or icon identity. Explain each palette through color theory.
- Sans-serif typography. Owner references: t3.codes and buzz.xyz, with no preference for Buzz's yellow.
- Light, charcoal Dim, and Dark with color and depth. Default mode still unselected.
## Verification and next step
- Used frontend-design and all applicable references. Inspected t3.codes and buzz.xyz public pages; no v1 inspection. Application/onboarding limits are in RESEARCH.md.
- index.html contains three logo studies, three font alternatives, eight navigation-icon specimens, ten palettes, all three appearances, component states and local review downloads.
- Chromium checks and author screenshot inspection completed for review readiness. VERIFY.md records evidence, corrections, and unverified cases. This is not an approved identity or integrated application.
- Next step: research current docs/plans for the feature inventory, then design five navigable HTML alternatives and a central comparison index. Logo/iconography completion is non-blocking; backend coding and integration remain out of scope.
-82
View File
@@ -1,82 +0,0 @@
# WUI decisions and discovery record
## 2026-09-08: Jason's branding answers
### Confirmed product scope
Mosaic Stack is a flexible Swiss Army Knife / AI operating system, not a developer-only console. Uses include software factory, executive and personal assistance, writing, social media management, agent orchestration, human/agent collaboration through Matrix, Discord, Slack and similar channels, project management, and kanban. Extensions and plugins will broaden those uses.
The audience includes developers, enterprise users, homemakers, teens, students, professionals, and designers. The interface must not assume technical expertise. These are product intentions, not verified backend capabilities.
### Identity and distribution
- Jason owns mosaicstack.dev, the intended main site.
- Codebase is intended to be open source, with OpenClaw and Hermes named as comparisons. No license decision was supplied here.
- A hosted offering is possible in the future, not a committed service.
- Explore creative logo/icon options. The chosen mark must be recognizable and work as a small icon and a full logo.
- No specific logo geometry is selected.
### Color and customization
- Jason likes blue. Blue itself is not excluded; generic purple/blue gradient branding is unwanted.
- Yellow and green are less preferred, but acceptable as accents.
- Target ten user-selectable palettes shared conceptually across the site and apps. A user should be able to choose red rather than blue, for example.
- Palette changes must not fundamentally alter icons or page design.
- Each palette needs a color-theory rationale, not arbitrary hue substitutions.
- Support Light, Dim, and Dark for the palettes.
- Light with pale neutral surfaces and Dim with charcoal surfaces are accepted interpretations.
- Dark should retain color and visible depth. It need not be uniformly near black.
- Default mode was not specified.
### Typography and references
- Prefer sans-serif fonts.
- https://t3.codes/ is a positive reference for theming and design choices.
- https://buzz.xyz/ is a positive reference for UI elements and onboarding wizards. Its yellow is not a preferred brand color.
- At intake, these were Jason's references, not Dewey's observations. Dewey subsequently inspected both public sites; RESEARCH.md records live evidence and application/onboarding limits.
## Dewey's proposed design direction, not owner-approved
- Give the brand a recognizable silhouette that remains identifiable in one color. Do not make a particular palette its only identifying trait.
- Separate palette, appearance mode, and semantic status tokens. Keep control meanings and status labels stable across all combinations.
- Default candidate: a blue palette, following system Light/Dark preference with an explicit Dim option. Default remains provisional.
- Use progressive disclosure and adaptable workspaces so the same product supports a simple personal workflow and a dense professional workflow.
- Explore three logo families: assembled mosaic monogram, interlocking ribbon, and modular cut-paper symbol. Judge each in monochrome, at favicon size, and alongside the wordmark.
- Explore sans-serif samples rather than choosing a font from its name alone. Compare readable UI text, numerals, controls, and long labels.
- Explain palette hue relationships, surface tint, accent roles, and intended contrast. Color theory guides harmony; measured contrast and user testing establish usability. Do not claim universal emotional effects for a hue.
- First deliverable is a local interactive brand board with logo/type candidates and palette/mode controls, not any of the five dashboard layouts.
## Discovery next work recorded at intake
1. Inspect the two reference sites if browser/network capabilities permit. Record any inspection limits honestly.
2. Produce brand studies and ten proposed palettes with explicit rationale and representative component states.
3. Verify small-size logo clarity, relevant contrast pairs, keyboard operation, and responsive rendering with available tools. Record gaps.
4. Jason selects/refines the brand before dashboard construction.
5. Research current docs/plans for a source-linked feature inventory before the five dashboard designs. Keep intended and implemented features distinct.
No logo, font family, exact palette, default mode, or dashboard design has been approved. No backend, publication, hosting, or integration work is authorized by these answers.
## 2026-09-08: review-ready brand board
- Entry: index.html. Review instructions: README.md. Tests and limits: VERIFY.md.
- Logo studies: Assembly, Relay, Aperture. Font choices: DM Sans, IBM Plex Sans, Manrope. Original outline icons share a 24-unit grid and 1.75-unit strokes.
- Palettes: Harbor, Carmine, Atlantic, Terracotta, Aubergine, Mineral, Cobalt, Rosewood, Graphite, Grove. Each has Light/Dim/Dark variants and an explicit hue-harmony rationale. Draft hue relationships were corrected before final verification.
- Dewey recommends Assembly + DM Sans + Harbor as the starting discussion, not an owner decision. Default appearance follows system Light/Dark preference; Dim is explicitly selectable. This behavior is still provisional.
- The preview uses local assets and browser storage, no API. Sample success/loading/error states and author download fixtures do not represent live product data or Jason's approval.
- All branding choices remain pending Jason's review. Dashboard construction and backend work have not started.
## First owner feedback after review
- Jason said the icon looks like a "robot's crotch". Dewey interprets this as the recommended Assembly mark, whose two uprights and central notch produce that association. Jason did not name the concept explicitly. Do not treat Relay or Aperture as selected alternatives.
- Jason said the themes and Manrope font look great. Manrope is the preferred typography direction for the next revision. Preserve the palette work rather than redesigning it. No particular default palette or mode was selected.
- Next logo studies should avoid the paired-leg/central-notch silhouette. Explore assembled tile shapes and asymmetric negative space rather than another mechanical M.
- This is partial branding feedback, not full branding approval or authority to build the dashboards. No UI revision has been made in this feedback exchange.
## Owner gate revision: design can proceed before final iconography
Jason clarified that unfinished iconography should not prevent design progress. This supersedes the earlier requirement to finish the whole brand before dashboard exploration.
- Use Manrope and retain the ten-palette Light/Dim/Dark system for the five dashboard designs.
- Final logo and iconography remain unresolved, but are not blockers. Use a Mosaic Stack text wordmark and provisional, labeled UI icons in the meantime.
- Prioritize the source-linked feature inventory, then five distinct navigable dashboard mockups and a central comparison page. Treat implemented, planned, and newly proposed backend capabilities separately.
- This does not authorize backend coding, integration, deployment, commits, or pushes. No new goal was activated during this clarification.
-28
View File
@@ -1,28 +0,0 @@
# WUI work history
Append-only author notes. Goal lifecycle belongs to the operator's extension; TASKS.md tracks this assignment.
## 2026-09-08: first brand-board implementation
- Reconciled BRIEF.md, DECISIONS.md, TASKS.md and the separate CURRENT.md owner gate. No v1 inspection or unrelated queue advancement.
- B02: inspected live t3.codes and buzz.xyz public pages in installed Chromium. Saved desktop/mobile screenshots and DOM observations. RESEARCH.md separates public-page observations from untested application themes and onboarding.
- B03: created Assembly, Relay, and Aperture as original SVG studies. Integrated monochrome 16/24/32 px and reversed samples. Recognition/trademark suitability remains unapproved.
- B04: bundled Latin DM Sans, IBM Plex Sans, and Manrope, four weights each, with SIL OFL licenses and source URLs. Initial Google Fonts request returned a different format; a full browser User-Agent produced WOFF2 assets with verified signatures. Created a consistent original outline icon family.
- B05: defined ten palettes with individual harmony rationales. Generated 30 mode token sets in assets/palettes.json. The initial 10:1 body-text target was mathematically unavailable on some Dim raised surfaces; changed the optional target to 7:1. Normal text minimum remains 4.5:1, required boundaries/focus 3:1. All generated combinations now pass their declared pair checks.
- B06: built local index.html, styles.css, brand.js and board.js. Includes live selections, theme tokens export, review-note download/local storage, and explicit sample component states. No backend work.
- B07 in progress: checks/verify.mjs passed 30 token sets and 240 viewport combinations, plus keyboard controls, state recovery, local fonts/storage, reduced motion, and narrow text-spacing/root-resize checks. Native CDP Enter initially omitted its character event and the Shift modifier used the wrong bit; repaired the test client and re-ran successfully. These were test-driver defects, not silently reclassified application passes.
- Inspected saved Light, Dim, mobile, and ultrawide screenshots. Further focus visibility, lower-section visual checks, full text scaling, and download evidence remain before review handoff.
- Received Darkwing terminal-log TMUX-TRANSPORT-R5-LIVE-01 addressed to Dewey. Transport-only notice, no requested reply or assignment change. Filed without acting on the transport task.
## 2026-09-08: verification and review handoff
- B07 completed for prototype review with documented limits. Final verification reports pass 840 token contrast pairs, 8,220 computed rendered-text checks, 240 palette/mode/viewport combinations, ten breakpoint checks, keyboard/native controls, 60 accessible control names, targets, local downloads, font/storage failures, and text expansion.
- Author screenshot inspection found a clipped mobile Conversations label and small-size sample labels extending outside their card at doubled text. Fixed the icon grid and row wrapping, then repeated checks and inspected new captures. Desktop preview controls now scroll within short viewports so focus stays visible.
- Adjusted draft palette hue anchors to match their named harmony relationships. Regenerated the 30 token sets and repeated all affected tests.
- B08 handed off through index.html and README.md. VERIFY.md distinguishes author checks from unverified engines, native mobile/zoom, assistive technology, and independent review. No production or brand approval claim.
- B09 remains Jason's branding decision. Dashboard construction has not begun. No deployment, integration, backend changes, commits, pushes, external issue lifecycle, or agent task dispatch occurred. Test Chromium processes/profiles were closed by the check scripts.
- First owner review: icon has a robot-crotch association; themes and Manrope received positive feedback. Recorded interpretation and next revision in DECISIONS.md and B09. Prototype files unchanged. First goal remains closed; no dashboard work started.
- Owner removed final logo/iconography as a dashboard prerequisite. Updated BRIEF.md and TASKS.md: D01 is ready, with Manrope/current themes, text wordmark and provisional labeled icons. This clarification changes task dependencies, not the completed first goal or backend authority.
-11
View File
@@ -1,11 +0,0 @@
# Mosaic Stack WUI brand study
**Pending owner acceptance.** This is the original review draft, not selected branding or a working product. Manrope/theme feedback is recorded, but the logo and default selections remain provisional. No dashboard/backend integration.
The board still uses its earlier Assembly/DM Sans/Harbor recommendations. Later owner feedback favors Manrope and the theme work; those source/default changes are not implemented here. Final logo/iconography is no longer a blocker for separately authorized dashboard design, but this published snapshot contains no dashboards.
Dewey authored the study. Filbert independently approved publication of the exact 53-file snapshot at manifest `a585c1eedb17044962c0419861a1032b23409b769c5d304aceff6ef6089a0e11`. This coordinator-added publication note is separate from those unchanged reviewed bytes. See `docs/plans/reviews/2026-09-08_publication-trial-wui-verdict.md` from the repository root for checks and limits.
BRIEF.md names the repository owner. DECISIONS.md preserves candid design feedback as historical working notes, not final brand messaging or a design acceptance. Original provisional recommendations and later owner direction must not be conflated.
Bundled fonts retain their own SIL OFL notices and provenance. Reference-site screenshots, scraped reference data, raw test downloads and non-allowlisted outputs are not published with this draft. Historical references to those local evidence paths do not imply public attachments. No trademark clearance, code-license change, production accessibility certification or runtime capability is claimed.
-51
View File
@@ -1,51 +0,0 @@
# Mosaic Stack brand board
Status: ready for Jason's branding review. No brand choice is approved and no dashboard mockups have been built.
## Open the board
Entry page:
`/mnt/storage/src/mosaic-stack/agents/dewey/work/wui/index.html`
Open that file in a browser on this host. To review on a different computer, copy the whole `wui` folder and open its `index.html`. Keep `assets`, the CSS, and the JavaScript beside it. No server, package installation, account, or network connection is required for the board. Do not open only a copied HTML file without its assets.
The reference-research scripts use the network, but the delivered board does not. No service has been started or deployed.
## Suggested review, about ten minutes
1. Start with Assembly, DM Sans, and Harbor, my proposed baseline. Appearance initially follows the browser's system preference unless you already have a saved choice.
2. In Identity, choose each mark. Compare the full logo in the header/brand specimen and the monochrome 16/24/32 px samples. Tell me whether you prefer the literal M, the woven links, or the abstract tile.
3. In Typography, compare DM Sans, IBM Plex Sans, and Manrope. The three specimens retain their own font. Choosing a font changes the rest of the board, including actual controls.
4. In Color system, try each palette's Light, Dim, and Dark buttons. Each button selects both that palette and that appearance. Look for readable text, useful surface depth, and a color family you would want to use daily. Hue angles and harmony rationale are printed on every palette card.
5. In Iconography & controls, try the example name field, all five states, and Preview success. An error keeps the text intact. Loading is a labeled specimen, not a running request. Nothing creates a project or contacts a server.
6. In Your review, write notes and download them. Downloads contain the selected logo, font, palette, mode, and your notes. Send the file or your feedback in this conversation. The page does not transmit notes to Dewey.
Selections and review notes use this browser's local storage when available. Reset preview restores the proposed choices but deliberately keeps your notes and the example name. Clearing site data or using a different file location/browser can lose local notes; download a copy to keep them.
You can also download the selected palette's tokens for all three modes. This is a design reference, not a production configuration file.
## What to decide
- Preferred logo and any shape/spacing revisions.
- Preferred font and icon treatment.
- Default palette and appearance behavior.
- Palettes to change or remove before dashboard exploration.
Branding approval is a separate human decision. Choosing controls or downloading notes does not approve anything automatically. Dashboard work stays stopped until Jason supplies the branding decision and direction to proceed.
## Evidence and project records
- [Verification and limits](VERIFY.md), including reproducible commands.
- [Reference observations](RESEARCH.md), including what was and was not inspected on t3.codes and buzz.xyz.
- [Requirements](BRIEF.md), [owner decisions](DECISIONS.md), [task list](TASKS.md), [work history](HISTORY.md).
- `evidence/verification.json`: 840 token-pair checks and 240 layout combinations.
- `evidence/detail-verification.json`: 8,220 rendered-text checks and interaction/failure/download checks.
- `evidence/final-verification.json`: local resources, links, targets, breakpoint checks, and skip navigation.
- `evidence/board-light-1440.png`, `board-dim-1440.png`, `board-dark-1440.png`: desktop appearance captures.
- `evidence/section-identity-light.png`, `section-typography-light.png`, `section-color-ultrawide.png`, `section-components-mobile.png`, and `section-review-light.png`: comparison and component captures.
- `assets/logos/`: three standalone original SVG studies.
- `assets/palettes.json`: all ten proposed palettes and thirty token sets.
- `assets/fonts/`: bundled Latin fonts, OFL licenses, and source receipts. The existing font license notices are unchanged.
This is a local design-review package. No integration, deployment, commit, push, or independent technical acceptance is implied.
-37
View File
@@ -1,37 +0,0 @@
# Reference inspection and brand-board plan
## Live reference inspection, 2026-09-08
Tool: installed headless Chromium through `checks/browser.mjs`, a dependency-free CDP client. Reproduce with `node agents/dewey/work/wui/checks/references.mjs`. Browser profile is temporary and removed on completion. No login, download, registration, or form submission was performed.
Evidence: `evidence/references.json`, `evidence/t3-desktop.png`, `evidence/t3-details.png`, `evidence/t3-mobile.png`, and the corresponding Buzz images. Initial screenshots caught entrance animations; the final captures include a bounded four-second animation allowance. Reference screenshots are research evidence, not reusable brand assets.
### t3.codes
Observed the public landing page at 1440 px and 390 px. Computed body font is DM Sans, with near-black `#09090b` and white `#fafafa`. The desktop hero uses large, tightly spaced sans-serif type, muted supporting text, and one bright primary download control. Provider icons sit in dark tiles. The embedded application image separates a navigation rail, conversation, and diff pane with restrained boundaries. Further down, provider names and small symbols share a regular comparison row.
Useful for Mosaic: clear text hierarchy, restrained neutral surfaces, one obvious primary action, consistent inline icon scale, and color localized to meaningful content. Do not copy the landing page's grid decoration, floating logo animation, developer-only framing, or marketing claims. A brand board can use generous comparison space; a working dashboard will need different density.
### buzz.xyz
Observed the public landing page at the same widths. Computed font is Cash Sans with a system sans-serif fallback. Its chartreuse `#d7d72e` canvas contrasts with dark `#231e1e` typography. The oversized wordmark and small repeating bee symbol make the identity recognizable at different scales. The desktop product image shows a tinted sidebar, light conversation area, labeled outline icons, grouped channels, and a clearly separated composer. On mobile, the landing composition stacks the wordmark and description while keeping the app action available.
Useful for Mosaic: a strong one-color symbol, tinted surfaces as part of identity, human/agent collaboration described in ordinary language, and familiar navigation controls. Do not borrow its bee, wordmark, yellow dominance, floating decoration, or proprietary font.
### Inspection limits
These are public landing pages and embedded product images, not installed or authenticated applications. T3 application theme switching and Buzz's actual application onboarding wizard were not exercised. The public Buzz waitlist has email/name/company fields and a Next button; no personal information was entered or sent. Jason's praise of in-app onboarding remains owner-provided context, not a verified wizard assessment. No v1 files were inspected.
## Brand-board design plan
Prototype only. One local `index.html` page, section anchors for Identity, Type, Color, Components, and Review. No public-site policy/contact pages or real backend are in scope. Navigation stays ordinary links; palette, logo, font, and mode choices use labeled native controls. No fake workspace creation or external submissions.
Three logo studies will differ in silhouette and construction: a segmented M, a woven angular loop, and an asymmetric cut-paper tile. All use the same selectable palette but also have monochrome samples. Original SVG paths, no borrowed assets. Recognition and trademark clearance are not established by author inspection.
Three sans-serif candidates will be compared at common sizes with the same UI labels and numerals. Fonts should be bundled locally with their licenses so opening the HTML does not require a CDN. Small outline icons use a common 24-unit grid, 1.75-unit strokes, round caps and joins, with text labels rather than color-only meaning.
Ten palettes will specify hue relationships rather than simply rotating one hue. Define canvas, surface, raised surface, text, muted text, border, action, on-action, secondary accent, focus, success, warning, and danger roles. Light uses pale tinted canvas and white surfaces. Dim uses middle charcoal with restrained tint. Dark uses deeper chromatic canvas and lighter layered surfaces. Foreground colors are adjusted against the actual background for contrast; hue relationships alone do not guarantee usability.
The page will use available viewport width with fluid comparison grids and bounded prose. At narrow widths, sections stack with no clipped controls. At ultrawide widths, multiple alternatives remain visible together rather than stretching text across the whole display.
Verification includes all 30 palette/mode combinations, meaningful text and control contrast, native keyboard operation, viewport widths from 320 to 3440, text expansion, reduced motion, and screenshots. Record limitations rather than claiming WCAG certification or production readiness.
-49
View File
@@ -1,49 +0,0 @@
# WUI task list
Owner and author: Dewey. Product decisions and acceptance: Jason.
Workspace: /mnt/storage/src/mosaic-stack/agents/dewey/work/wui
Requirements: [BRIEF.md](BRIEF.md). Decisions: [DECISIONS.md](DECISIONS.md).
Created 2026-09-08. This is the authoritative task list for this assignment, not a second goal lifecycle. The operator-set goal extension owns goal control. No goal was activated by creating this file.
## Phase 1: brand board ready for Jason's review
| ID | Task and acceptance evidence | Dependencies | Status | Next action |
| --- | --- | --- | --- | --- |
| B01 | Capture audience, product scope, preferences, constraints, and approval boundaries. Evidence: BRIEF.md and DECISIONS.md. | None | done | Preserve subsequent decisions in DECISIONS.md. |
| B02 | Inspect t3.codes and buzz.xyz for useful theming, typography, controls, and onboarding ideas. Save observations and distinguish live inspection from owner descriptions. | B01 | done | RESEARCH.md and evidence/* reference images/JSON record live public-page inspection and app/onboarding limits. |
| B03 | Produce three distinct original SVG logo studies with wordmark, monochrome, and 16/24/32 px samples. Record tradeoffs; recognition remains subject to Jason's judgment. | B02 | done | Three original studies in brand.js and assets/logos; rendered size/monochrome comparisons in index.html. |
| B04 | Compare sans-serif typography and propose consistent iconography, spacing, geometry, and focus/interaction treatment. Use real control labels and numerical samples. | B02 | done | Three local OFL font families and original outline icon specimens implemented. |
| B05 | Define ten palettes, each with a color-theory rationale and Light/Dim/Dark tokens. Keep identity and semantic meanings stable. Dark retains color and depth. | B04 | done | Ten rationale-bearing palettes and 30 mode token sets in brand.js and assets/palettes.json. |
| B06 | Build a local navigable HTML brand board with logo/type comparisons, ten-palette and three-mode selectors, and representative component states. Clearly mark samples. | B03, B04, B05 | done | index.html, styles.css, board.js provide local interactive brand comparisons and sample states. |
| B07 | Verify the brand board at mobile, desktop, and ultrawide widths, keyboard operation, focus, reduced motion where applicable, and contrast across all 30 palette/mode combinations. Save reproducible checks and browser evidence; flag missing checks honestly. | B06 | done | VERIFY.md and three evidence/*verification.json reports record contrast, 240 layouts, keyboard, targets, downloads, fallback and author screenshot checks with explicit limits. |
| B08 | Deliver the local entry path, review instructions, recommendation, and evidence/limitations. Brand board is ready for review, not an approved identity. | B07 | done | index.html entry page, README.md review instructions and VERIFY.md limitations delivered as a review-ready design package. No brand approval implied. |
| B09 | Obtain Jason's logo, typography, iconography, palette, and mode decisions; iterate the brand board as requested. Acceptance owner: Jason. | B08 | ready | First feedback received: Manrope and themes liked; logo has an unintended robot-crotch association. Revise logo direction, retain palette work, and use Manrope in the next preview. See DECISIONS.md. |
## Phase 2: five dashboard alternatives
Jason removed logo/iconography completion as a prerequisite for dashboard design. Proceed with Manrope, the existing ten palettes and three appearances, a text wordmark, and provisional labeled UI icons. B09 remains separate unfinished brand work, not a dashboard blocker. All implementation tasks are owned by Dewey; selection and final acceptance belong to Jason.
| ID | Task and acceptance evidence | Dependencies | Status | Next action |
| --- | --- | --- | --- | --- |
| D01 | Research current docs/plans and save a source-linked feature inventory. Distinguish implemented, planned, and owner-proposed capabilities. | B08 and owner gate revision | ready | Read current foundation feature sources, not the v1 UI. Final logo/iconography is not required. |
| D02 | Define shared routes, primary flows, states, sample data, and five genuinely different dashboard/navigation styles. | D01 | waiting | Establish comparable coverage across designs. |
| D03 | Build a central HTML index linking all five navigable, feature-rich mockups. Apply Manrope, ten palettes, and three modes consistently; use a text wordmark and provisional labeled icons until identity work is finalized. | D02 | waiting | Build shared prototype resources and distinct layouts. |
| D04 | Verify mobile/full-width/ultrawide layout, navigation, primary flows, keyboard access, and loading/empty/error/success/disabled/long-content states. Simulate unsupported features honestly. | D03 | waiting | Exercise each design in a browser and record evidence. |
| D05 | Deliver the comparison and obtain Jason's design selection. | D04 | waiting | Provide a short review script and wait for selection. |
## Phase 3: selected HTML design
| ID | Task and acceptance evidence | Dependencies | Status | Next action |
| --- | --- | --- | --- | --- |
| I01 | Record Jason's selected design, change requests, and newly requested features. | D05 | waiting | Turn feedback into bounded prototype tasks. |
| I02 | Iterate and reverify the chosen HTML mockup through explicit owner acceptance. Record unsupported backend requirements separately. | I01 | waiting | Implement approved prototype revisions only. |
| I03 | Prepare design assets, tokens, interaction specification, and backend dependency notes for a separately authorized coding/integration phase. | I02 | waiting | Deliver handoff without starting integration. |
## Boundaries and recovery
- Keep working artifacts here. Preserve unrelated repository work and the CURRENT.md inspector queue.
- No v1 UI inspection, backend integration, credentials, live fleet changes, publication, commit, or push.
- Do not claim unperformed browser checks, approved branding, or backend support.
- No numeric budget supplied. No external requests, watches, or uncertain operations outstanding.
- Next action: D01 feature inventory, then D02-D05 five dashboard alternatives. Logo/iconography refinement is non-blocking under Jason's revised direction. The completed first goal has not been restarted.
- The operator goal ends at B08, a review-ready brand board with documented limits. The extension owns its completion status. B09 is not automatically accepted. Later authorized work covers brand iteration or subsequent phases.
-61
View File
@@ -1,61 +0,0 @@
# Brand-board verification
Author: Dewey. Date: 2026-09-08. Scope: local interactive brand prototype, ready for review, not an integrated product or approved identity.
## Reproduce
From `/mnt/storage/src/mosaic-stack`:
```sh
node --check agents/dewey/work/wui/brand.js
node --check agents/dewey/work/wui/board.js
node agents/dewey/work/wui/checks/verify.mjs
node agents/dewey/work/wui/checks/detail-checks.mjs
node agents/dewey/work/wui/checks/final-checks.mjs
```
Environment used: Node 26.8.1, Chromium 152.0.7977.75 on Arch Linux. The CDP helper uses `/usr/bin/chromium`, or the `CHROMIUM` environment variable. Tests create a fresh temporary browser profile, open the entry page by file URL, save evidence here, and remove the profile at completion. No authenticated browser profile or Mosaic backend is used. There are no npm dependencies for this board or these tests.
`checks/assets.mjs` regenerates standalone SVGs and palette JSON from brand.js. `checks/fetch-fonts.py` refreshes the public Google Fonts WOFF2/OFL assets and needs network access. Neither is needed just to view or verify the current board. `checks/references.mjs` repeats the public reference-site inspection and also needs network access.
## Results
| Requirement | Result | Evidence |
| --- | --- | --- |
| Three distinct logo concepts | pass for review presentation | Assembly, Relay, Aperture rendered in identity cards, standalone SVGs, small monochrome samples, and selectable header/wordmark specimen. Author inspected screenshots. Recognition and final brand suitability are still Jason's decision. |
| Sans-serif alternatives and coherent icons | pass | Three locally loaded families with four weights each and license files. Eight labeled navigation icons use one original 24-unit/1.75-stroke family, shared with feedback symbols. |
| Ten theory-backed palettes, all three appearances | pass | Ten palettes carry named harmony relationships and explicit hue anchors in brand.js and the board. Thirty token sets generated. Palette/mode controls tested through their real change/click handlers. |
| Token contrast, A11Y-01/02 | pass for declared pairs | 840 unrounded ratio checks in verification.json. Normal text/action-label minimum observed 4.503925718129755:1, boundary/focus minimum 3.704773189325781:1. Checks cover normal/muted/action/accent/status text across canvas, surface, raised surfaces; borders/focus across those surfaces; on-action text on action. Decorative dividers and disabled controls use criterion exceptions. |
| Rendered text contrast | pass for sampled DOM text | 274 text/control samples per combination, 8,220 total. Computed foreground and solid ancestor backgrounds, qualifying large-text thresholds, minimum observed 4.504658476260286:1. This is not an image/gradient algorithm or a full accessibility audit. |
| Color-independent meaning, A11Y-03 | pass | Selection uses Selected labels and pressed/checked state. Status uses text plus icons. Author inspected the rendered component section. |
| Keyboard operation and focus, A11Y-05/06 | pass for tested flows | Native select and radio-arrow changes; Enter/Space selection buttons; Tab/Shift+Tab between sample fields; error recovery; skip link moves focus to main. Focus ring measured at 3 px solid. Short-screen sidebar focus stayed inside the 768 px viewport after adding sidebar scrolling. Chromium accessibility tree reports accessible names for all 60 interactive elements. This is not a screen-reader test. |
| Target size, A11Y-04 | pass for measured controls | Enabled buttons, fields, radio inputs, sidebar links, brand link and review link meet 24 px dimensions at 320 and 1440 widths. Inline footer/prose links use the inline-text exception. Most controls are at least 44 px tall. |
| Responsive/full-width layout, A11Y-07 | pass for measured layouts | All 30 combinations at 320, 390, 768, 960, 1440, 1920, 2560, 3440 CSS px. 240 layout checks, no page overflow. Ten additional checks cover both sides of the 700, 960, 1200, 1700, and 2400 breakpoints. Author inspected mobile, desktop, and 3440-wide screenshots; five palette columns use ultrawide space without unbounded prose. |
| Text enlargement/spacing, A11Y-07/08 | pass for tested overrides | 320 px reflow with WCAG text-spacing overrides, 200% root size, and separately doubling every element's computed font size including authored px values. Initial full-text expansion overflowed the review grid and small-size labels; minimum-width/wrapping fixes passed retest and screenshot inspection. Browser-native zoom was not exercised. |
| Reduced motion, A11Y-10 | pass | Emulated reduced-motion media preference; theme and keyboard controls remain usable. Board state changes do not rely on animation. |
| Loading/empty/error/success/disabled states | pass as labeled specimens | Tested all five selectable states, loading's disabled action, success button, preserved input after error. No actual request or project creation occurs. |
| Long content and failure fallback | pass for tested cases | Wrapped headings/labels and doubled text; font loads blocked and browser storage denied in isolated Chromium, with working controls and no page overflow at 320. Malformed saved preference JSON recovers to default. Input has a 160-character limit and native horizontal text-field scrolling. |
| Review notes and token downloads | pass | Browser downloads captured in evidence/downloads and contents checked. Note download contains test review text; palette JSON includes Light/Dim/Dark tokens. These files are author test fixtures, not Jason's decisions. |
| Offline resource/link integrity | pass | CDP resource tree showed 11 loaded resources, all local file URLs. Source asset links and internal anchors resolve. Three real font families load. No remote font/CDN/backend request belongs to the board. |
| Public site completeness | not applicable to this local review artifact | Single file with section anchors, no public deployment or app router. About/Contact/legal pages, HTTP 404 behavior, consent management, billing and account workflows are outside this prototype. Storage use is explained beside controls and notes. No legal compliance claim. |
| Reference sites | pass for public-page inspection, app behavior not verified | RESEARCH.md and reference screenshots. No v1 inspection. T3 application theme switching and Buzz's installed application wizard were not exercised. |
## Visual fixes and test corrections
- Early reference screenshots captured entrance animations, not completed pages. Re-captured after a bounded animation allowance.
- CDP Enter needed its character value, and Shift uses modifier bit 8. Fixed the test driver rather than changing working controls to accommodate a faulty test.
- Added scrollable desktop preview controls so keyboard focus remains available on short screens.
- Doubled text exposed a review-column minimum-width problem and logo-size row wrapping. Fixed and rechecked.
- A 320 px screenshot exposed a clipped Conversations label. Changed narrow icon layout to two columns and allowed long labels to wrap. Rechecked the actual rendering.
- Corrected draft hue anchors so named complementary/triadic/split-complementary relationships match their stated angles. Regenerated assets and re-ran contrast/layout suites.
- File-URL resources did not populate the expected Performance entries. The final resource check uses Chromium's Page.getResourceTree instead; its resource URLs are all local.
## Verification limits and remaining decisions
- Tested one installed desktop Chromium engine. Safari, Firefox, native mobile devices, touchscreen behavior, assistive technology, OS forced colors, and browser-native zoom are not verified.
- Browser viewport emulation and doubled text are useful evidence, not equivalent to testing every physical display and accessibility configuration.
- Contrast assertions and Chromium accessibility-tree names do not establish full WCAG conformance. They cover the listed cases.
- Only Latin font subsets are bundled. Multilingual typography and fallback coverage need a later product brief.
- Logos are original author studies, not independently reviewed, user-tested, trademark-cleared, or final production assets. Small-size optical refinements await selection.
- No independent technical review, issue lifecycle, repository delivery suites, integration, deployment, commits, or pushes were performed for this standalone design package. Those delivery gates remain separate if the prototype is promoted into product work.
- Jason has not approved branding. B09 and all dashboard tasks remain behind that human gate.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,93 +0,0 @@
Copyright 2014 The DM Sans Project Authors (https://github.com/googlefonts/dm-fonts)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -1,7 +0,0 @@
DM Sans
CSS: https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&display=swap
License: https://raw.githubusercontent.com/google/fonts/main/ofl/dmsans/OFL.txt
400: https://fonts.gstatic.com/s/dmsans/v17/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2
500: https://fonts.gstatic.com/s/dmsans/v17/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2
600: https://fonts.gstatic.com/s/dmsans/v17/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2
700: https://fonts.gstatic.com/s/dmsans/v17/rP2Yp2ywxg089UriI5-g4vlH9VoD8Cmcqbu0-K4.woff2
@@ -1,93 +0,0 @@
Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -1,7 +0,0 @@
IBM Plex Sans
CSS: https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&display=swap
License: https://raw.githubusercontent.com/google/fonts/main/ofl/ibmplexsans/OFL.txt
400: https://fonts.gstatic.com/s/ibmplexsans/v23/zYXzKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1syxeKYY.woff2
500: https://fonts.gstatic.com/s/ibmplexsans/v23/zYXzKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1syxeKYY.woff2
600: https://fonts.gstatic.com/s/ibmplexsans/v23/zYXzKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1syxeKYY.woff2
700: https://fonts.gstatic.com/s/ibmplexsans/v23/zYXzKVElMYYaJe8bpLHnCwDKr932-G7dytD-Dmu1syxeKYY.woff2
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,93 +0,0 @@
Copyright 2018 The Manrope Project Authors (https://github.com/sharanda/manrope)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -1,7 +0,0 @@
Manrope
CSS: https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap
License: https://raw.githubusercontent.com/google/fonts/main/ofl/manrope/OFL.txt
400: https://fonts.gstatic.com/s/manrope/v20/xn7gYHE41ni1AdIRggexSg.woff2
500: https://fonts.gstatic.com/s/manrope/v20/xn7gYHE41ni1AdIRggexSg.woff2
600: https://fonts.gstatic.com/s/manrope/v20/xn7gYHE41ni1AdIRggexSg.woff2
700: https://fonts.gstatic.com/s/manrope/v20/xn7gYHE41ni1AdIRggexSg.woff2
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56" fill="#215fac" role="img" aria-label="Mosaic Stack Aperture concept"><path fill-rule="evenodd" d="M4 4h30v10H14v28H4zm34 0 14 14v34H18V18h16v10h-6v14h14V22l-4-4z"/></svg>

Before

Width:  |  Height:  |  Size: 231 B

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56" fill="#215fac" role="img" aria-label="Mosaic Stack Assembly concept"><path d="M4 4h10v24H4zM18 4l12 12-7 7-5-5zM34 4v14l-5 5-7-7zM38 4h10v24H38z" transform="translate(2 10)"/></svg>

Before

Width:  |  Height:  |  Size: 242 B

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56" fill="#215fac" role="img" aria-label="Mosaic Stack Relay concept"><path fill-rule="evenodd" d="M4 18 18 4h12l10 10-8 8-8-8h-2L14 22v2l8 8-8 8L4 30zm48 8L38 40H26L16 30l8-8 8 8h2l8-8v-2l-8-8 8-8 10 10z" transform="translate(0 6)"/></svg>

Before

Width:  |  Height:  |  Size: 297 B

-615
View File
@@ -1,615 +0,0 @@
{
"prototype": true,
"palettes": [
{
"id": "harbor",
"name": "Harbor",
"hue": 214,
"sat": 70,
"accent": 34,
"accentSat": 63,
"theory": "Complementary",
"note": "Clear blue with a restrained copper counterpoint. The warm accent balances cool navigation and gives selected details a second voice.",
"use": "Proposed default. Blue without the blue-purple gradient.",
"modes": {
"light": {
"canvas": "#f3f5f7",
"surface": "#ffffff",
"raised": "#e6eaef",
"text": "#434d5b",
"muted": "#5e6978",
"line": "#ced5df",
"border": "#636e7e",
"action": "#2266bf",
"onAction": "#ffffff",
"accent": "#8d5e20",
"focus": "#2266bf",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#242d38",
"surface": "#2e3947",
"raised": "#384556",
"text": "#d6dbe1",
"muted": "#a9b1bc",
"line": "#47576c",
"border": "#a4acb7",
"action": "#8ab4ea",
"onAction": "#10141a",
"accent": "#e1b47a",
"focus": "#8ab4ea",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#ea9d99"
},
"dark": {
"canvas": "#12161c",
"surface": "#1c232b",
"raised": "#28323e",
"text": "#b9c1cb",
"muted": "#a4acb7",
"line": "#384556",
"border": "#a4acb7",
"action": "#74a6e7",
"onAction": "#10141a",
"accent": "#e1b47a",
"focus": "#74a6e7",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "carmine",
"name": "Carmine",
"hue": 350,
"sat": 65,
"accent": 176,
"accentSat": 42,
"theory": "Near-complementary",
"note": "A red-led identity with a cool turquoise counterpoint. Rose-tinted neutrals keep the red from covering every surface.",
"use": "For a red preference. Errors still use an icon and explicit wording.",
"modes": {
"light": {
"canvas": "#f7f3f3",
"surface": "#ffffff",
"raised": "#efe7e8",
"text": "#5e4549",
"muted": "#7b6065",
"line": "#deced1",
"border": "#7e6367",
"action": "#b92740",
"onAction": "#ffffff",
"accent": "#2e706c",
"focus": "#b92740",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#372528",
"surface": "#462f33",
"raised": "#55393e",
"text": "#ded3d5",
"muted": "#bca9ac",
"line": "#6b484e",
"border": "#b7a4a7",
"action": "#e996a4",
"onAction": "#10141a",
"accent": "#8bd0cb",
"focus": "#e996a4",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e99995"
},
"dark": {
"canvas": "#1b1214",
"surface": "#2b1d1f",
"raised": "#3d292c",
"text": "#c9b6b9",
"muted": "#b7a4a7",
"line": "#55393e",
"border": "#b7a4a7",
"action": "#e2788a",
"onAction": "#10141a",
"accent": "#8bd0cb",
"focus": "#e2788a",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "atlantic",
"name": "Atlantic",
"hue": 199,
"sat": 72,
"accent": 170,
"accentSat": 52,
"theory": "Analogous",
"note": "Ocean blue and teal sit close on the hue wheel. Their shared cool bias makes a quieter combination than an opposing accent.",
"use": "A cohesive blue-green alternative with low visual rivalry.",
"modes": {
"light": {
"canvas": "#f3f6f7",
"surface": "#ffffff",
"raised": "#e6ecef",
"text": "#3f4e55",
"muted": "#5c6d75",
"line": "#cdd9df",
"border": "#63757e",
"action": "#19719a",
"onAction": "#ffffff",
"accent": "#257467",
"focus": "#19719a",
"success": "#287658",
"warning": "#935f1a",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#243238",
"surface": "#2e3f47",
"raised": "#384d57",
"text": "#e2e7e9",
"muted": "#afbbc0",
"line": "#46606d",
"border": "#a4b1b7",
"action": "#73c3e8",
"onAction": "#10141a",
"accent": "#83d8ca",
"focus": "#73c3e8",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#edaaa6"
},
"dark": {
"canvas": "#12191c",
"surface": "#1c272b",
"raised": "#28373e",
"text": "#bcc8cd",
"muted": "#a4b1b7",
"line": "#384d57",
"border": "#a4b1b7",
"action": "#73c3e8",
"onAction": "#10141a",
"accent": "#83d8ca",
"focus": "#73c3e8",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e4817c"
}
}
},
{
"id": "terracotta",
"name": "Terracotta",
"hue": 18,
"sat": 60,
"accent": 198,
"accentSat": 44,
"theory": "Complementary",
"note": "Fired-clay orange meets a desaturated steel blue. Warm neutral surfaces connect the palette without needing a beige wash everywhere.",
"use": "An earthier option for writing and personal work.",
"modes": {
"light": {
"canvas": "#f7f4f3",
"surface": "#ffffff",
"raised": "#eee9e7",
"text": "#584841",
"muted": "#78665e",
"line": "#ded3cf",
"border": "#7e6b63",
"action": "#a74f2a",
"onAction": "#ffffff",
"accent": "#356f88",
"focus": "#a74f2a",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#362b26",
"surface": "#453630",
"raised": "#54423b",
"text": "#e5dfdc",
"muted": "#beb2ac",
"line": "#695349",
"border": "#b7a9a4",
"action": "#e2a68d",
"onAction": "#10141a",
"accent": "#89bcd1",
"focus": "#e2a68d",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#eba29e"
},
"dark": {
"canvas": "#1b1513",
"surface": "#2a211d",
"raised": "#3c2f2a",
"text": "#cbbeb9",
"muted": "#b7a9a4",
"line": "#54423b",
"border": "#b7a9a4",
"action": "#de9a7c",
"onAction": "#10141a",
"accent": "#89bcd1",
"focus": "#de9a7c",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "aubergine",
"name": "Aubergine",
"hue": 287,
"sat": 38,
"accent": 47,
"accentSat": 46,
"theory": "Triadic pair",
"note": "Muted plum and ochre sit 120 degrees apart on the hue wheel. The third triadic hue, teal, is left out so the interface has two brand accents rather than three.",
"use": "A deliberate purple option for users who want it, without the AI gradient.",
"modes": {
"light": {
"canvas": "#f5f4f6",
"surface": "#ffffff",
"raised": "#ece8ed",
"text": "#59455e",
"muted": "#75607b",
"line": "#d9d2db",
"border": "#78637e",
"action": "#88469b",
"onAction": "#ffffff",
"accent": "#77672c",
"focus": "#88469b",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#312933",
"surface": "#3e3441",
"raised": "#4c3f50",
"text": "#e1d9e3",
"muted": "#baacbe",
"line": "#5f4f63",
"border": "#b3a4b7",
"action": "#cba4d6",
"onAction": "#10141a",
"accent": "#d3c388",
"focus": "#cba4d6",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#ea9d99"
},
"dark": {
"canvas": "#18141a",
"surface": "#262028",
"raised": "#362d39",
"text": "#c7b9cb",
"muted": "#b3a4b7",
"line": "#4c3f50",
"border": "#b3a4b7",
"action": "#bf8ecc",
"onAction": "#10141a",
"accent": "#d3c388",
"focus": "#bf8ecc",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "mineral",
"name": "Mineral",
"hue": 171,
"sat": 47,
"accent": 351,
"accentSat": 42,
"theory": "Complementary",
"note": "Deep teal and dusty rose oppose each other while keeping saturation restrained. Blue-green tinted layers carry the identity in dark mode.",
"use": "Cool surfaces with a small warm punctuation.",
"modes": {
"light": {
"canvas": "#f3f6f6",
"surface": "#ffffff",
"raised": "#e8eded",
"text": "#3d524f",
"muted": "#586f6c",
"line": "#d0dcda",
"border": "#637e7a",
"action": "#2a7469",
"onAction": "#ffffff",
"accent": "#9f414f",
"focus": "#2a7469",
"success": "#287658",
"warning": "#935f1a",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#273432",
"surface": "#324340",
"raised": "#3d514e",
"text": "#e5ebea",
"muted": "#b2c2c0",
"line": "#4d6662",
"border": "#a4b7b4",
"action": "#87d4c8",
"onAction": "#10141a",
"accent": "#e0b3ba",
"focus": "#87d4c8",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#eeaeaa"
},
"dark": {
"canvas": "#141a19",
"surface": "#1f2927",
"raised": "#2c3a38",
"text": "#b9cbc8",
"muted": "#a4b7b4",
"line": "#3d514e",
"border": "#a4b7b4",
"action": "#87d4c8",
"onAction": "#10141a",
"accent": "#d18f99",
"focus": "#87d4c8",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e58580"
}
}
},
{
"id": "cobalt",
"name": "Cobalt",
"hue": 229,
"sat": 75,
"accent": 49,
"accentSat": 63,
"theory": "Complementary",
"note": "A stronger royal blue meets a small amber accent. The high hue separation is controlled by using amber only in secondary details.",
"use": "The most assertive blue option. No large yellow surfaces.",
"modes": {
"light": {
"canvas": "#f3f3f7",
"surface": "#ffffff",
"raised": "#e6e8ef",
"text": "#454a5e",
"muted": "#60657b",
"line": "#cdd1df",
"border": "#63687e",
"action": "#1c3bc4",
"onAction": "#ffffff",
"accent": "#79671b",
"focus": "#1c3bc4",
"success": "#277255",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#242838",
"surface": "#2e3248",
"raised": "#383d57",
"text": "#d0d2dc",
"muted": "#a6aab9",
"line": "#464d6d",
"border": "#a4a7b7",
"action": "#94a5f0",
"onAction": "#10141a",
"accent": "#e1ce7a",
"focus": "#94a5f0",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e89591"
},
"dark": {
"canvas": "#12141c",
"surface": "#1c1f2c",
"raised": "#282c3e",
"text": "#b6b9c9",
"muted": "#a4a7b7",
"line": "#383d57",
"border": "#a4a7b7",
"action": "#798eec",
"onAction": "#10141a",
"accent": "#e1ce7a",
"focus": "#798eec",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "rosewood",
"name": "Rosewood",
"hue": 329,
"sat": 47,
"accent": 209,
"accentSat": 39,
"theory": "Triadic pair",
"note": "Dusty pink and steel blue occupy two points of a triadic relationship. The third, yellow-green, is omitted to avoid an overly colorful interface.",
"use": "A softer warm identity that does not become pastel text.",
"modes": {
"light": {
"canvas": "#f6f3f5",
"surface": "#ffffff",
"raised": "#ede8eb",
"text": "#5e4552",
"muted": "#7b606e",
"line": "#dcd0d6",
"border": "#7e6371",
"action": "#a53b72",
"onAction": "#ffffff",
"accent": "#416c95",
"focus": "#a53b72",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#34272e",
"surface": "#43323b",
"raised": "#513d48",
"text": "#e1d6db",
"muted": "#beacb5",
"line": "#664d5a",
"border": "#b7a4ae",
"action": "#dc9ebe",
"onAction": "#10141a",
"accent": "#95b3d0",
"focus": "#dc9ebe",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#ea9d99"
},
"dark": {
"canvas": "#1a1417",
"surface": "#291f24",
"raised": "#3a2c33",
"text": "#cbb9c2",
"muted": "#b7a4ae",
"line": "#513d48",
"border": "#b7a4ae",
"action": "#d487af",
"onAction": "#10141a",
"accent": "#8eaecd",
"focus": "#d487af",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "graphite",
"name": "Graphite",
"hue": 216,
"sat": 9,
"accent": 216,
"accentSat": 12,
"theory": "Monochromatic",
"note": "One blue-gray hue uses value and saturation changes instead of a second brand hue. Semantic status colors remain independent.",
"use": "Minimal chroma for content-heavy work. Hierarchy comes from contrast.",
"modes": {
"light": {
"canvas": "#f5f5f5",
"surface": "#ffffff",
"raised": "#eaeaeb",
"text": "#434d5b",
"muted": "#5e6978",
"line": "#d5d6d7",
"border": "#636e7e",
"action": "#616975",
"onAction": "#ffffff",
"accent": "#5e6978",
"focus": "#616975",
"success": "#287658",
"warning": "#8f5c19",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#2d2e2f",
"surface": "#393a3c",
"raised": "#454749",
"text": "#dfe2e7",
"muted": "#afb6c0",
"line": "#57595c",
"border": "#a4abb7",
"action": "#b1b6be",
"onAction": "#10141a",
"accent": "#afb6c0",
"focus": "#b1b6be",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#eba29e"
},
"dark": {
"canvas": "#161718",
"surface": "#232425",
"raised": "#323334",
"text": "#bcc3cd",
"muted": "#a4abb7",
"line": "#454749",
"border": "#a4abb7",
"action": "#a6acb5",
"onAction": "#10141a",
"accent": "#a4abb7",
"focus": "#a6acb5",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e37d78"
}
}
},
{
"id": "grove",
"name": "Grove",
"hue": 146,
"sat": 37,
"accent": 356,
"accentSat": 39,
"theory": "Split-complementary pair",
"note": "Muted forest green meets dusty rose, 30 degrees to one side of its magenta complement. The second split accent is omitted. Low-saturation surfaces keep green from dominating.",
"use": "An optional green palette for other preferences, not the proposed default.",
"modes": {
"light": {
"canvas": "#f4f6f5",
"surface": "#ffffff",
"raised": "#e8edea",
"text": "#3d5246",
"muted": "#586f62",
"line": "#d2dbd6",
"border": "#637e6e",
"action": "#377752",
"onAction": "#ffffff",
"accent": "#9c444a",
"focus": "#377752",
"success": "#287658",
"warning": "#935f1a",
"danger": "#ba2e26"
},
"dim": {
"canvas": "#29332d",
"surface": "#34413a",
"raised": "#3f4f46",
"text": "#e2e9e5",
"muted": "#afc0b6",
"line": "#4f6358",
"border": "#a4b7ac",
"action": "#8fcca9",
"onAction": "#10141a",
"accent": "#ddb1b4",
"focus": "#8fcca9",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#edaaa6"
},
"dark": {
"canvas": "#141917",
"surface": "#202823",
"raised": "#2d3932",
"text": "#b9cbc1",
"muted": "#a4b7ac",
"line": "#3f4f46",
"border": "#a4b7ac",
"action": "#8fcca9",
"onAction": "#10141a",
"accent": "#cd8e92",
"focus": "#8fcca9",
"success": "#85d5b7",
"warning": "#e7b574",
"danger": "#e58580"
}
}
}
]
}
-102
View File
@@ -1,102 +0,0 @@
(() => {
'use strict';
const B = window.Brand;
const $ = id => document.getElementById(id);
const modes = ['light','dim','dark'];
const modeName = mode => mode[0].toUpperCase() + mode.slice(1);
const defaults = {palette:'harbor',font:'dm',mark:'mosaic',mode:matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light'};
let state = {...defaults};
let storageAvailable = true;
try {
const saved = JSON.parse(localStorage.getItem('mosaic-brand-preview-v1') || '{}');
for (const [key, items] of Object.entries({palette:B.palettes.map(p=>p.id),font:B.fonts.map(f=>f.id),mark:B.logos.map(l=>l.id),mode:modes})) {
if (items.includes(saved?.[key])) state[key]=saved[key];
}
$('review-notes').value = localStorage.getItem('mosaic-brand-notes-v1') || '';
} catch { storageAvailable = false; }
function announce(text) {$('announcement').textContent=text;}
function persist() {
try {localStorage.setItem('mosaic-brand-preview-v1',JSON.stringify(state));}
catch {storageAvailable=false;announce('Browser storage is unavailable. Download your review notes before closing.');}
}
for(const [id, data] of [['palette',B.palettes],['font',B.fonts],['mark',B.logos]]) {
$(id).innerHTML=data.map(x=>`<option value="${x.id}">${x.name}</option>`).join('');
$(id).addEventListener('change',event=>{state[id]=event.target.value;update();});
}
document.querySelectorAll('[name=mode]').forEach(input=>input.addEventListener('change',()=>{state.mode=input.value;update();}));
$('logo-grid').innerHTML=B.logos.map((l,i)=>`<article class="study-card" data-mark-card="${l.id}">
<div class="card-kicker"><span>${String(i+1).padStart(2,'0')} / ${l.family}</span><span class="selection-label" data-mark-label="${l.id}"></span></div>
<div class="logo-display">${B.logo(l.id)}</div><h3>${l.name}</h3><p>${l.note}</p>
<div class="size-strip" aria-label="${l.name} monochrome size samples">${[16,24,32].map(size=>`<span>${B.logo(l.id,size)}${size} px</span>`).join('')}<span>${B.logo(l.id,24).replace('class="logo"','class="logo reverse"')}Reverse</span></div>
<p class="tradeoff">${l.tradeoff}</p><button type="button" class="choose" data-choose-mark="${l.id}" aria-pressed="false">Use ${l.name}</button></article>`).join('');
$('font-grid').innerHTML=B.fonts.map(f=>`<article class="study-card" data-font-card="${f.id}"><div class="card-kicker"><span>${f.detail}</span><span class="selection-label" data-font-label="${f.id}"></span></div>
<div style='font-family:${f.family}'><h3 class="font-title">${f.name}</h3><div class="type-specimen"><p class="type-heading">A place for your next idea.</p><p>Plan a project, write a chapter, or ask an agent to help. Start with what you need.</p><p class="numerals">0123456789<br>Il1 O0 · 12:48 · 1,024</p></div></div><p>${f.note}</p><button type="button" class="choose" data-choose-font="${f.id}" aria-pressed="false">Use ${f.name}</button></article>`).join('');
$('palette-grid').innerHTML=B.palettes.map(p=>{
const t=B.tokens(p,'light');
return `<article class="palette-card" data-palette-card="${p.id}"><h3>${p.name}<span data-palette-label="${p.id}"></span></h3><div class="palette-swatches" aria-hidden="true">${['action','accent','raised','canvas'].map(role=>`<i style="background:${t[role]}"></i>`).join('')}</div><p class="theory">${p.theory} · ${p.hue}° / ${p.accent}°</p><p>${p.note}</p><p class="palette-use">${p.use}</p><div class="palette-modes" aria-label="${p.name} appearance">${modes.map(mode=>{const t=B.tokens(p,mode);return `<button type="button" data-palette="${p.id}" data-mode="${mode}" aria-label="Preview ${p.name} in ${modeName(mode)}" aria-pressed="false" style="--mini-surface:${t.surface};--mini-text:${t.text};--mini-border:${t.border};--mini-raised:${t.raised}">${modeName(mode)}</button>`;}).join('')}</div></article>`;
}).join('');
$('icon-grid').innerHTML=[['home','Home'],['conversation','Conversations'],['projects','Projects'],['agents','Agents'],['people','People'],['board','Board'],['extensions','Extensions'],['search','Search']].map(([id,label])=>`<div class="icon-specimen">${B.icon(id)}<span>${label}</span></div>`).join('');
document.querySelectorAll('[data-icon]').forEach(el=>el.innerHTML=B.icon(el.dataset.icon));
document.querySelectorAll('[data-choose-mark]').forEach(button=>button.addEventListener('click',()=>{state.mark=button.dataset.chooseMark;update();}));
document.querySelectorAll('[data-choose-font]').forEach(button=>button.addEventListener('click',()=>{state.font=button.dataset.chooseFont;update();}));
document.querySelectorAll('[data-palette][data-mode]').forEach(button=>button.addEventListener('click',()=>{state.palette=button.dataset.palette;state.mode=button.dataset.mode;update();}));
function update(shouldAnnounce=true) {
const p=B.palettes.find(p=>p.id===state.palette), f=B.fonts.find(f=>f.id===state.font), l=B.logos.find(l=>l.id===state.mark);
const t=B.tokens(p,state.mode);
for(const [role,value] of Object.entries(t)) document.documentElement.style.setProperty('--'+role,value);
document.documentElement.style.setProperty('--font',f.family);
document.documentElement.style.colorScheme=state.mode==='light'?'light':'dark';
document.documentElement.dataset.mode=state.mode;
document.documentElement.dataset.palette=state.palette;
for(const id of ['palette','font','mark']) $(id).value=state[id];
document.querySelectorAll('[name=mode]').forEach(input=>input.checked=input.value===state.mode);
document.querySelectorAll('[data-logo]').forEach(el=>el.innerHTML=B.logo(state.mark));
$('current-palette').textContent=p.name;
$('current-mode').textContent=modeName(state.mode);
for(const [kind,data] of [['mark',B.logos],['font',B.fonts],['palette',B.palettes]]) {
data.forEach(item=>{
const chosen=item.id===state[kind];
document.querySelector(`[data-${kind}-card="${item.id}"]`).classList.toggle('is-selected',chosen);
document.querySelector(`[data-${kind}-label="${item.id}"]`).textContent=chosen?'Selected':'';
document.querySelector(`[data-choose-${kind}="${item.id}"]`)?.setAttribute('aria-pressed',String(chosen));
});
}
document.querySelectorAll('[data-palette][data-mode]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.palette===state.palette && button.dataset.mode===state.mode)));
$('token-title').textContent=`${p.name} / ${modeName(state.mode)} tokens`;
$('tokens').innerHTML=Object.entries(t).map(([role,value])=>`<div><dt><i style="background:${value}" aria-hidden="true"></i>${role.replace('onAction','On action')}</dt><dd>${value.toUpperCase()}</dd></div>`).join('');
const summary=`${l.name} · ${f.name} · ${p.name} · ${modeName(state.mode)}`;
$('selection-summary').textContent=`Current preview: ${summary}.`;
persist();
if(shouldAnnounce) announce(`Preview changed to ${summary}.`);
}
const messages={ready:['conversation','Ready. Try a local success preview.'],loading:['dim','Loading specimen. No request is running. Choose another state to continue.'],empty:['plus','No projects in this example. Your next step would be to create one.'],error:['error','Could not save this example. Your text is unchanged. Use Preview success to try again.'],success:['check','Success preview. No project was created or saved to a server.']};
function sample() {
const state=$('sample-state').value, [icon,message]=messages[state];
$('sample-feedback').dataset.state=state;
$('sample-feedback').innerHTML=B.icon(icon)+`<span>${message}</span>`;
$('sample-action').disabled=state==='loading';
$('sample-title').setAttribute('aria-describedby','sample-help sample-feedback');
}
$('sample-state').addEventListener('change',sample);
$('sample-action').addEventListener('click',()=>{$('sample-state').value='success';sample();});
$('reset').addEventListener('click',()=>{state={...defaults};update();announce('Preview reset. Your review notes and example project name are unchanged.');});
function download(name,type,content) {
const url=URL.createObjectURL(new Blob([content],{type}));
const a=document.createElement('a');a.href=url;a.download=name;a.click();
// Browser downloads consume the URL before the next task; retain briefly for portability.
setTimeout(()=>URL.revokeObjectURL(url),1000);
announce(`${name} prepared for download. Check your browser downloads.`);
}
$('export').addEventListener('click',()=>{
const p=B.palettes.find(p=>p.id===state.palette);
download(`mosaic-${p.id}-tokens.json`,'application/json',JSON.stringify({prototype:true,palette:p.name,theory:p.theory,rationale:p.note,modes:Object.fromEntries(modes.map(mode=>[mode,B.tokens(p,mode)]))},null,2));
});
$('review-notes').addEventListener('input',()=>{
try{localStorage.setItem('mosaic-brand-notes-v1',$('review-notes').value);}catch{storageAvailable=false;announce('Notes cannot be stored in this browser. Download them before closing.');}
});
$('download-review').addEventListener('click',()=>{
download('mosaic-brand-review.txt','text/plain',`Mosaic Stack branding review\n${$('selection-summary').textContent}\n\n${$('review-notes').value||'No written notes yet.'}\n\nThese selections are review preferences, not an automatic approval.\n`);
});
update(false);sample();
if(!storageAvailable) announce('Browser storage is unavailable. The preview still works. Download notes to keep them.');
})();
-77
View File
@@ -1,77 +0,0 @@
/* Original brand studies. This file contains prototype design data, not an API. */
(function (root) {
const palettes = [
{id:'harbor', name:'Harbor', hue:214, sat:70, accent:34, accentSat:63, theory:'Complementary', note:'Clear blue with a restrained copper counterpoint. The warm accent balances cool navigation and gives selected details a second voice.', use:'Proposed default. Blue without the blue-purple gradient.'},
{id:'carmine', name:'Carmine', hue:350, sat:65, accent:176, accentSat:42, theory:'Near-complementary', note:'A red-led identity with a cool turquoise counterpoint. Rose-tinted neutrals keep the red from covering every surface.', use:'For a red preference. Errors still use an icon and explicit wording.'},
{id:'atlantic', name:'Atlantic', hue:199, sat:72, accent:170, accentSat:52, theory:'Analogous', note:'Ocean blue and teal sit close on the hue wheel. Their shared cool bias makes a quieter combination than an opposing accent.', use:'A cohesive blue-green alternative with low visual rivalry.'},
{id:'terracotta', name:'Terracotta', hue:18, sat:60, accent:198, accentSat:44, theory:'Complementary', note:'Fired-clay orange meets a desaturated steel blue. Warm neutral surfaces connect the palette without needing a beige wash everywhere.', use:'An earthier option for writing and personal work.'},
{id:'aubergine', name:'Aubergine', hue:287, sat:38, accent:47, accentSat:46, theory:'Triadic pair', note:'Muted plum and ochre sit 120 degrees apart on the hue wheel. The third triadic hue, teal, is left out so the interface has two brand accents rather than three.', use:'A deliberate purple option for users who want it, without the AI gradient.'},
{id:'mineral', name:'Mineral', hue:171, sat:47, accent:351, accentSat:42, theory:'Complementary', note:'Deep teal and dusty rose oppose each other while keeping saturation restrained. Blue-green tinted layers carry the identity in dark mode.', use:'Cool surfaces with a small warm punctuation.'},
{id:'cobalt', name:'Cobalt', hue:229, sat:75, accent:49, accentSat:63, theory:'Complementary', note:'A stronger royal blue meets a small amber accent. The high hue separation is controlled by using amber only in secondary details.', use:'The most assertive blue option. No large yellow surfaces.'},
{id:'rosewood', name:'Rosewood', hue:329, sat:47, accent:209, accentSat:39, theory:'Triadic pair', note:'Dusty pink and steel blue occupy two points of a triadic relationship. The third, yellow-green, is omitted to avoid an overly colorful interface.', use:'A softer warm identity that does not become pastel text.'},
{id:'graphite', name:'Graphite', hue:216, sat:9, accent:216, accentSat:12, theory:'Monochromatic', note:'One blue-gray hue uses value and saturation changes instead of a second brand hue. Semantic status colors remain independent.', use:'Minimal chroma for content-heavy work. Hierarchy comes from contrast.'},
{id:'grove', name:'Grove', hue:146, sat:37, accent:356, accentSat:39, theory:'Split-complementary pair', note:'Muted forest green meets dusty rose, 30 degrees to one side of its magenta complement. The second split accent is omitted. Low-saturation surfaces keep green from dominating.', use:'An optional green palette for other preferences, not the proposed default.'},
];
const fonts = [
{id:'dm', name:'DM Sans', family:'"DM Sans", system-ui, sans-serif', note:'Open, rounded forms without becoming playful. My first choice for a product that spans everyday work and professional tools.', detail:'Recommended balance'},
{id:'plex', name:'IBM Plex Sans', family:'"IBM Plex Sans", system-ui, sans-serif', note:'More engineered letterforms and a distinctive rhythm. Strong for dense labels and data; its technical character is more noticeable.', detail:'Precise and structured'},
{id:'manrope', name:'Manrope', family:'Manrope, system-ui, sans-serif', note:'Broad geometric forms give the wordmark more presence. Compare long control labels carefully because the wider forms use more space.', detail:'Geometric and expressive'},
];
const logos = [
{id:'mosaic', name:'Assembly', family:'An assembled M', note:'Four solid pieces form an M with an open center. The gaps suggest independent tools working together without using a puzzle-piece cliché.', tradeoff:'Most direct link to Mosaic. At 16 px, the two-unit gaps become fine seams.', paths:'<path d="M4 4h10v24H4zM18 4l12 12-7 7-5-5zM34 4v14l-5 5-7-7zM38 4h10v24H38z" transform="translate(2 10)"/>', recommended:true},
{id:'weave', name:'Relay', family:'An interlocking ribbon', note:'Two angular links cross to make a compact woven loop. The open counters suggest handoffs between people, agents, and tools.', tradeoff:'Strong standalone symbol, but less obviously an M. Check for resemblance to existing link marks before final adoption.', paths:'<path fill-rule="evenodd" d="M4 18 18 4h12l10 10-8 8-8-8h-2L14 22v2l8 8-8 8L4 30zm48 8L38 40H26L16 30l8-8 8 8h2l8-8v-2l-8-8 8-8 10 10z" transform="translate(0 6)"/>'},
{id:'fold', name:'Aperture', family:'A cut-paper tile', note:'An asymmetric square folds around an open center. A single diagonal cut gives the mark direction without an arrow, robot, or sparkle.', tradeoff:'The most abstract and artistic candidate. Its relationship to Mosaic will rely on repeated use with the wordmark.', paths:'<path fill-rule="evenodd" d="M4 4h30v10H14v28H4zm34 0 14 14v34H18V18h16v10h-6v14h14V22l-4-4z"/>'},
];
const icons = {
home:'<path d="m3 10 9-7 9 7v10H3zM9 20v-7h6v7"/>',
conversation:'<path d="M4 4h16v12H9l-5 4zM8 8h8M8 12h5"/>',
projects:'<path d="M3 6h7l2 3h9v11H3zM3 6V4h7l2 2h7v3"/>',
agents:'<rect x="5" y="7" width="14" height="13" rx="3"/><path d="M12 3v4M9 12h.01M15 12h.01M9 16h6M2 11v5M22 11v5"/>',
people:'<circle cx="9" cy="7" r="3"/><path d="M3 21v-3a6 6 0 0 1 12 0v3M16 4a3 3 0 0 1 0 6M18 14a5 5 0 0 1 3 4v3"/>',
board:'<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 3v18M15 3v18M6 7v4M12 7v7M18 7v2"/>',
extensions:'<rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><path d="M14 17.5h7M17.5 14v7"/>',
search:'<circle cx="10" cy="10" r="6"/><path d="m15 15 6 6"/>',
check:'<path d="m5 12 4 4L19 6"/>',
warning:'<path d="m12 3 10 18H2zM12 9v5M12 17h.01"/>',
error:'<circle cx="12" cy="12" r="9"/><path d="m9 9 6 6m0-6-6 6"/>',
plus:'<path d="M12 4v16M4 12h16"/>',
arrow:'<path d="M4 12h16m-6-6 6 6-6 6"/>',
sun:'<circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M2 12h2m16 0h2M5 5l1 1m12 12 1 1M5 19l1-1M18 6l1-1"/>',
dim:'<circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7h6M12 12h9M12 17h6"/>',
moon:'<path d="M20 14A9 9 0 0 1 10 3a9 9 0 1 0 10 11z"/>',
};
function hsl(h,s,l) {
s/=100; l/=100;
const c=(1-Math.abs(2*l-1))*s, x=c*(1-Math.abs(h/60%2-1)), m=l-c/2;
const rgb=h<60?[c,x,0]:h<120?[x,c,0]:h<180?[0,c,x]:h<240?[0,x,c]:h<300?[x,0,c]:[c,0,x];
return '#'+rgb.map(v=>Math.round((v+m)*255).toString(16).padStart(2,'0')).join('');
}
function luminance(hex) {
const a=hex.slice(1).match(/../g).map(x=>parseInt(x,16)/255).map(v=>v<=0.04045?v/12.92:((v+0.055)/1.055)**2.4);
return a[0]*.2126+a[1]*.7152+a[2]*.0722;
}
function contrast(a,b) { const x=luminance(a), y=luminance(b);return (Math.max(x,y)+.05)/(Math.min(x,y)+.05); }
function foreground(h,s,start, backgrounds, minimum, light) {
for(let l=start; l>=0 && l<=100; l+=light?-1:1) {
const c=hsl(h,s,l);
if(backgrounds.every(bg=>contrast(c,bg)>=minimum)) return c;
}
throw new Error('No contrast-compliant color');
}
function tokens(p, mode) {
const light=mode==='light', dim=mode==='dim', s=Math.min(p.sat*.3,22);
const canvas=hsl(p.hue,s,light?96:dim?18:9);
const surface=light?'#ffffff':hsl(p.hue,s,dim?23:14);
const raised=hsl(p.hue,s,light?92:dim?28:20);
const backgrounds=[canvas,surface,raised];
const color=(h,s,min=4.5)=>foreground(h,s,light?44:68,backgrounds,min,light);
const action=color(p.hue,p.sat);
const onAction=contrast('#ffffff',action)>=4.5?'#ffffff':'#10141a';
return {canvas,surface,raised,text:color(p.hue,15,7),muted:color(p.hue,12),
line:hsl(p.hue,s,light?84:dim?35:28),border:color(p.hue,12,3),action,onAction,
accent:color(p.accent,p.accentSat),focus:action,success:color(157,49),warning:color(34,70),danger:color(3,66)};
}
function logo(id, size=56) {const l=logos.find(l=>l.id===id)||logos[0];return `<svg class="logo" width="${size}" height="${size}" viewBox="0 0 56 56" fill="currentColor" aria-hidden="true">${l.paths}</svg>`;}
function icon(id) {return `<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${icons[id]||icons.home}</svg>`;}
root.Brand = {palettes,fonts,logos,icons,tokens,contrast,logo,icon};
})(typeof window === 'undefined' ? globalThis : window);
-10
View File
@@ -1,10 +0,0 @@
import '../brand.js';
import {mkdir,writeFile} from 'node:fs/promises';
const out=new URL('../assets/logos/',import.meta.url);
await mkdir(out,{recursive:true});
for(const l of Brand.logos){
await writeFile(new URL(`${l.name.toLowerCase()}.svg`,out),`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56" fill="#215fac" role="img" aria-label="Mosaic Stack ${l.name} concept">${l.paths}</svg>\n`);
}
const palettes=Brand.palettes.map(p=>({...p,modes:Object.fromEntries(['light','dim','dark'].map(m=>[m,Brand.tokens(p,m)]))}));
await writeFile(new URL('../assets/palettes.json',import.meta.url),JSON.stringify({prototype:true,palettes},null,2)+'\n');
console.log('Generated 3 original SVG assets and 30 palette/mode token sets.');
-78
View File
@@ -1,78 +0,0 @@
// Small CDP client for the installed Chromium. No application dependencies.
import { spawn } from 'node:child_process';
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
export async function browser() {
const profile = await mkdtemp(join(tmpdir(), 'dewey-brand-browser-'));
const child = spawn(process.env.CHROMIUM || '/usr/bin/chromium', [
'--headless', '--no-first-run', '--no-default-browser-check',
'--disable-dev-shm-usage', '--remote-debugging-pipe', `--user-data-dir=${profile}`,
], { stdio: ['ignore', 'ignore', 'ignore', 'pipe', 'pipe'] });
let id = 0, buffer = '';
const pending = new Map();
child.stdio[4].on('data', chunk => {
buffer += chunk.toString();
let end;
while ((end = buffer.indexOf('\0')) !== -1) {
const message = JSON.parse(buffer.slice(0, end));
buffer = buffer.slice(end + 1);
if (pending.has(message.id)) {
const { resolve, reject, timeout } = pending.get(message.id);
clearTimeout(timeout);
pending.delete(message.id);
message.error ? reject(new Error(JSON.stringify(message.error))) : resolve(message.result);
}
}
});
function send(method, params = {}, sessionId) {
return new Promise((resolve, reject) => {
const key = ++id;
const timeout = setTimeout(() => { pending.delete(key); reject(new Error(`CDP timeout: ${method}`)); }, 25000);
pending.set(key, { resolve, reject, timeout });
child.stdio[3].write(JSON.stringify({ id: key, method, params, ...(sessionId ? {sessionId} : {}) }) + '\0');
});
}
const { targetId } = await send('Target.createTarget', { url: 'about:blank' });
const { sessionId } = await send('Target.attachToTarget', { targetId, flatten: true });
const call = (method, params) => send(method, params, sessionId);
await call('Page.enable');
await call('Runtime.enable');
const evaluate = async expression => {
const r = await call('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true });
if (r.exceptionDetails) throw new Error(r.exceptionDetails.text + ': ' + r.result.description);
return r.result.value;
};
return {
call, evaluate,
async viewport(width, height = 1000) {
await call('Emulation.setDeviceMetricsOverride', { width, height, deviceScaleFactor: 1, mobile: false });
},
async navigate(url) {
const result = await call('Page.navigate', { url });
if (result.errorText) throw new Error(result.errorText);
// Bounded page-load check, not an agent wake/watch loop.
for (let n = 0; n < 50; n++) {
if (await evaluate('document.readyState === "complete"')) break;
await new Promise(r => setTimeout(r, 100));
}
await evaluate('document.fonts.ready.then(() => true)');
return result;
},
async screenshot(path) {
const { data } = await call('Page.captureScreenshot', { format: 'png' });
await writeFile(path, Buffer.from(data, 'base64'));
},
async key(key, code = key, modifiers = 0) {
const virtual = { Tab: 9, Enter: 13, Escape: 27, ArrowDown: 40, ArrowRight: 39, ' ': 32 }[key];
await call('Input.dispatchKeyEvent', { type: 'keyDown', key, code, modifiers, windowsVirtualKeyCode: virtual, text: key === 'Enter' ? '\r' : key.length === 1 ? key : '' });
await call('Input.dispatchKeyEvent', { type: 'keyUp', key, code, modifiers, windowsVirtualKeyCode: virtual });
},
async close() {
await send('Browser.close').catch(() => {});
if (child.exitCode === null) await new Promise(resolve => child.once('exit', resolve));
await rm(profile, { recursive: true, force: true });
},
};
}
@@ -1,92 +0,0 @@
import {browser} from './browser.mjs';
import {mkdir,writeFile,readFile} from 'node:fs/promises';
import {fileURLToPath} from 'node:url';
import assert from 'node:assert/strict';
const out=new URL('../evidence/',import.meta.url), downloads=new URL('downloads/',out);
await mkdir(downloads,{recursive:true});
const report={observedAt:new Date().toISOString(),checks:[],renderedContrast:[]};
const b=await browser();
const url=new URL('../index.html',import.meta.url).href;
const change=async(id,value)=>b.evaluate(`(()=>{const e=document.getElementById(${JSON.stringify(id)});e.value=${JSON.stringify(value)};e.dispatchEvent(new Event('change',{bubbles:true}))})()`);
const mode=async value=>b.evaluate(`document.querySelector('[name=mode][value=${value}]').click()`);
const screenshot=async(section,name,width=1440)=>{
await b.viewport(width,1100);
await b.evaluate(`document.getElementById('${section}').scrollIntoView();new Promise(requestAnimationFrame)`);
await b.screenshot(new URL(name,out));
};
try{
await b.viewport(1440,1100);await b.navigate(url);
// Computed foreground/background values on rendered text, not just token formulas.
for(const p of await b.evaluate('Brand.palettes.map(p=>p.id)')) for(const m of ['light','dim','dark']){
await change('palette',p);await mode(m);
const result=await b.evaluate(`(()=>{
const hex=c=>{const n=c.match(/[\\d.]+/g);return '#'+n.slice(0,3).map(v=>Math.round(+v).toString(16).padStart(2,'0')).join('')};
const bg=e=>{for(let n=e;n;n=n.parentElement){const c=getComputedStyle(n).backgroundColor;if(c!=='rgba(0, 0, 0, 0)'&&c!=='transparent')return hex(c)}return '#ffffff'};
const walker=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n, checks=[];
while(n=walker.nextNode()){
const e=n.parentElement;if(!n.textContent.trim()||e.closest('script,style,noscript,.sr-only,button:disabled,option'))continue;
const rect=e.getBoundingClientRect();if(!rect.width||!rect.height)continue;
const style=getComputedStyle(e);if(style.visibility==='hidden'||style.display==='none')continue;
const fg=hex(style.color),back=bg(e),ratio=Brand.contrast(fg,back);
const large=parseFloat(style.fontSize)>=24||(parseFloat(style.fontSize)>=18.67 && parseFloat(style.fontWeight)>=700);
checks.push({text:n.textContent.trim().slice(0,65),fg,bg:back,ratio,minimum:large?3:4.5});
}
for(const e of document.querySelectorAll('input:not([type=radio]),textarea,select')){
const style=getComputedStyle(e),fg=hex(style.color),back=bg(e);checks.push({text:e.id,fg,bg:back,ratio:Brand.contrast(fg,back),minimum:4.5});
}
return {count:checks.length,min:Math.min(...checks.map(x=>x.ratio)),failures:checks.filter(x=>x.ratio<x.minimum)};
})()`);
report.renderedContrast.push({palette:p,mode:m,...result});
assert.equal(result.failures.length,0,JSON.stringify({p,m,...result}));
}
report.checks.push({name:'Computed rendered text contrast across 30 combinations',result:'pass'});
await change('palette','harbor');await mode('light');
for(const section of ['identity','typography','color','components','review'])await screenshot(section,`section-${section}-light.png`);
await screenshot('color','section-color-ultrawide.png',3440);
await screenshot('identity','section-identity-mobile.png',390);
await screenshot('components','section-components-mobile.png',320);
await mode('dark');await screenshot('color','section-color-dark.png');
await mode('light');await b.viewport(1440,768);
await b.evaluate('document.getElementById("reset").focus()');await b.key('Tab','Tab',8);
const focus=await b.evaluate(`(()=>{const e=document.activeElement,r=e.getBoundingClientRect();return {text:e.textContent,top:r.top,bottom:r.bottom,viewport:innerHeight,style:getComputedStyle(e).outlineStyle}})()`);
assert(focus.top>=0&&focus.bottom<=focus.viewport,JSON.stringify(focus));
await b.screenshot(new URL('focus-short-desktop.png',out));
report.checks.push({name:'Sidebar keyboard focus visible at 768 px viewport height',result:'pass',focus});
const ax=await b.call('Accessibility.getFullAXTree');
const missingNames=ax.nodes.filter(n=>!n.ignored&&['button','combobox','textbox','radio','link'].includes(n.role?.value)&&!n.name?.value);
assert.equal(missingNames.length,0);
report.checks.push({name:'Chromium accessibility tree gives interactive elements accessible names',result:'pass',namedControls:ax.nodes.filter(n=>!n.ignored&&['button','combobox','textbox','radio','link'].includes(n.role?.value)).length});
await b.call('Browser.setDownloadBehavior',{behavior:'allow',downloadPath:fileURLToPath(downloads)});
await b.evaluate('document.getElementById("review-notes").value="Prefer Relay. Please refine the small-size gaps.";document.getElementById("download-review").click();document.getElementById("export").click()');
// Wait only for these two local browser downloads, bounded at five seconds.
let saved;
for(let n=0;n<50;n++){
try{saved=[await readFile(new URL('mosaic-brand-review.txt',downloads),'utf8'),await readFile(new URL('mosaic-harbor-tokens.json',downloads),'utf8')];break;}catch{await new Promise(r=>setTimeout(r,100));}
}
assert(saved,'Local downloads did not complete');
assert(saved[0].includes('Prefer Relay.'));
assert.deepEqual(Object.keys(JSON.parse(saved[1]).modes),['light','dim','dark']);
report.checks.push({name:'Review notes and all-three-mode palette JSON downloaded and content-verified',result:'pass'});
// Double every computed text size, including authored pixel sizes.
await b.viewport(320,1000);
await b.evaluate(`(()=>{const sizes=[...document.querySelectorAll('body *')].map(e=>[e,parseFloat(getComputedStyle(e).fontSize)]);for(const[e,size]of sizes)e.style.fontSize=size*2+'px'})()`);
let expanded=await b.evaluate('({width:innerWidth,scroll:document.documentElement.scrollWidth})');
assert(expanded.scroll<=expanded.width,JSON.stringify(expanded));
await b.screenshot(new URL('board-all-text-200-320.png',out));
report.checks.push({name:'Every computed text size doubled at 320 px',result:'pass',measurement:expanded});
// Font failure and storage denial are injected only into this isolated test browser.
await b.call('Network.enable');await b.call('Network.setCacheDisabled',{cacheDisabled:true});
await b.call('Network.setBlockedURLs',{urls:['*woff2*']});
await b.call('Page.addScriptToEvaluateOnNewDocument',{source:'Object.defineProperty(window,"localStorage",{get(){throw new DOMException("Unavailable","SecurityError")}})'});
await b.navigate(url);await change('palette','carmine');await mode('dim');
assert.equal(await b.evaluate('document.documentElement.dataset.palette'),'carmine');
expanded=await b.evaluate('({width:innerWidth,scroll:document.documentElement.scrollWidth})');
assert(expanded.scroll<=expanded.width,JSON.stringify(expanded));
assert(!(await b.evaluate('document.fonts.check(\'16px "DM Sans"\')')));
await b.screenshot(new URL('board-font-storage-fallback-320.png',out));
report.checks.push({name:'Blocked fonts and denied storage: controls still work and fallback reflows',result:'pass',measurement:expanded});
}catch(error){report.failure=error.stack;}
finally{await b.close();}
await writeFile(new URL('detail-verification.json',out),JSON.stringify(report,null,2)+'\n');
console.log(JSON.stringify(report,null,2));
if(report.failure)process.exitCode=1;
@@ -1,31 +0,0 @@
"""Fetch public font assets and OFL licenses. Run only when refreshing assets."""
from pathlib import Path
import urllib.request
import re
out = Path(__file__).resolve().parent.parent / 'assets' / 'fonts'
out.mkdir(parents=True, exist_ok=True)
fonts = [('DM Sans', 'dm-sans', 'dmsans'), ('IBM Plex Sans', 'ibm-plex-sans', 'ibmplexsans'), ('Manrope', 'manrope', 'manrope')]
for family, slug, upstream in fonts:
url = 'https://fonts.googleapis.com/css2?family=' + family.replace(' ', '+') + ':wght@400;500;600;700&display=swap'
req = urllib.request.Request(url, headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'})
css = urllib.request.urlopen(req, timeout=25).read().decode()
# Google returns one Latin block per requested weight. Keep all four real weights.
sources = []
for weight in ['400','500','600','700']:
blocks = re.findall(r'/\* latin \*/\s*(@font-face\s*\{[^}]+\})', css)
block = next((b for b in blocks if f'font-weight: {weight};' in b), None)
if not block:
raise RuntimeError(f'No Latin block for {family} {weight}')
source = re.search(r'url\(([^)]+)\)', block).group(1)
data = urllib.request.urlopen(source, timeout=25).read()
assert data[:4] == b'wOF2', 'Expected WOFF2'
name = f'{slug}-{weight}.woff2'
(out / name).write_bytes(data)
sources.append(f'{weight}: {source}')
license_url = f'https://raw.githubusercontent.com/google/fonts/main/ofl/{upstream}/OFL.txt'
license_text = urllib.request.urlopen(license_url, timeout=25).read()
assert b'SIL OPEN FONT LICENSE' in license_text
(out / f'{slug}-OFL.txt').write_bytes(license_text)
(out / f'{slug}-sources.txt').write_text(f'{family}\nCSS: {url}\nLicense: {license_url}\n' + '\n'.join(sources) + '\n')
print(f'{family}: 4 WOFF2 weights and OFL license saved')
@@ -1,41 +0,0 @@
import {browser} from './browser.mjs';
import {writeFile,readFile,stat} from 'node:fs/promises';
import assert from 'node:assert/strict';
const b=await browser(), report={observedAt:new Date().toISOString(),checks:[]};
const url=new URL('../index.html',import.meta.url);
try{
await b.viewport(1440,900);await b.navigate(url.href);
const resources=(await b.call('Page.getResourceTree')).frameTree.resources.map(x=>x.url);
assert(resources.length>5);assert(resources.every(u=>u.startsWith('file:')));
report.checks.push({name:'Entry page loads only local resources',result:'pass',resourceCount:resources.length});
const links=await b.evaluate('[...document.querySelectorAll("a[href],link[href],script[src]")].map(x=>x.getAttribute("href")||x.getAttribute("src"))');
for(const link of links){
if(link.startsWith('#'))assert(await b.evaluate(`!!document.getElementById(${JSON.stringify(link.slice(1))})`),link);
else assert((await stat(new URL(link,url))).isFile(),link);
}
const css=await readFile(new URL('../styles.css',import.meta.url),'utf8');
for(const match of css.matchAll(/url\('([^']+)'\)/g))assert((await stat(new URL(match[1],url))).isFile());
report.checks.push({name:'HTML and CSS asset links and in-page anchors resolve',result:'pass'});
await b.evaluate('document.querySelector(".skip").focus()');await b.key('Enter');
assert.equal(await b.evaluate('document.activeElement.id'),'main');
report.checks.push({name:'Keyboard skip link moves focus to main',result:'pass'});
for(const width of [699,700,959,960,1199,1200,1699,1700,2399,2400]){
await b.viewport(width,900);
assert(await b.evaluate('document.documentElement.scrollWidth<=innerWidth'),String(width));
}
report.checks.push({name:'Both sides of five responsive breakpoints have no page overflow',result:'pass',widths:[699,700,959,960,1199,1200,1699,1700,2399,2400]});
for(const width of [320,1440]){
await b.viewport(width,900);
const small=await b.evaluate(`([...document.querySelectorAll('button,input,select,textarea,.controls nav a,.brand-home,.review-link')].filter(e=>!e.disabled).map(e=>{const r=e.getBoundingClientRect();return {id:e.id||e.textContent.trim().slice(0,30),width:r.width,height:r.height}}).filter(r=>r.width<24||r.height<24))`);
assert.deepEqual(small,[]);
}
report.checks.push({name:'Interactive control targets meet 24 px at 320 and 1440 widths',result:'pass',qualification:'Inline prose/footer links use the WCAG inline-text exception.'});
await b.evaluate('localStorage.setItem("mosaic-brand-preview-v1", "{broken JSON");');
await b.navigate(url.href);
assert.equal(await b.evaluate('document.documentElement.dataset.palette'),'harbor');
report.checks.push({name:'Malformed preference storage recovers to a usable default',result:'pass'});
}catch(error){report.failure=error.stack;}
finally{await b.close();}
await writeFile(new URL('../evidence/final-verification.json',import.meta.url),JSON.stringify(report,null,2)+'\n');
console.log(JSON.stringify(report,null,2));
if(report.failure)process.exitCode=1;
@@ -1,34 +0,0 @@
import { browser } from './browser.mjs';
import { mkdir, writeFile } from 'node:fs/promises';
const out = new URL('../evidence/', import.meta.url);
await mkdir(out, {recursive: true});
const b = await browser();
const results = [];
try {
for (const [name, url] of [['t3','https://t3.codes/'], ['buzz','https://buzz.xyz/']]) {
const entry = {name, url, observedAt: new Date().toISOString()};
try {
await b.viewport(1440, 1100);
await b.navigate(url);
// Allow the reference sites' entrance animation to finish before capture.
await new Promise(resolve => setTimeout(resolve, 4000));
entry.desktop = await b.evaluate(`({title:document.title, url:location.href,
headings:[...document.querySelectorAll('h1,h2,h3')].map(x=>x.textContent.trim()).slice(0,25),
controls:[...document.querySelectorAll('button,a,input')].map(x=>({tag:x.tagName,text:(x.textContent||x.getAttribute('aria-label')||x.placeholder||'').trim().slice(0,100),href:x.getAttribute('href')})).filter(x=>x.text).slice(0,65),
body:{font:getComputedStyle(document.body).fontFamily,bg:getComputedStyle(document.body).backgroundColor,color:getComputedStyle(document.body).color},
text:document.body.innerText.slice(0,6500)})`);
await b.screenshot(new URL(`${name}-desktop.png`, out));
await b.evaluate('window.scrollTo(0, 1500)');
await new Promise(resolve => setTimeout(resolve, 700));
await b.screenshot(new URL(`${name}-details.png`, out));
await b.evaluate('window.scrollTo(0, 0)');
await b.viewport(390, 844);
await new Promise(resolve => setTimeout(resolve, 700));
await b.screenshot(new URL(`${name}-mobile.png`, out));
entry.mobile = await b.evaluate('({width:innerWidth,scrollWidth:document.documentElement.scrollWidth})');
} catch(error) {entry.error = error.message;}
results.push(entry);
}
} finally {await b.close();}
await writeFile(new URL('references.json', out), JSON.stringify(results, null, 2));
console.log(results.map(x=>({name:x.name,title:x.desktop?.title,error:x.error,mobile:x.mobile})));
-106
View File
@@ -1,106 +0,0 @@
import '../brand.js';
import {browser} from './browser.mjs';
import {mkdir,writeFile} from 'node:fs/promises';
import assert from 'node:assert/strict';
const out=new URL('../evidence/',import.meta.url);
await mkdir(out,{recursive:true});
const report={observedAt:new Date().toISOString(),browser:'Installed headless Chromium through CDP',contrast:[],layouts:[],interactions:[],limits:['No Firefox, Safari, real mobile device, screen reader, or trademark clearance.']};
for(const p of Brand.palettes)for(const mode of ['light','dim','dark']){
const t=Brand.tokens(p,mode),checks=[];
for(const fg of ['text','muted','action','accent','success','warning','danger'])for(const bg of ['canvas','surface','raised'])checks.push({fg,bg,minimum:4.5,ratio:Brand.contrast(t[fg],t[bg])});
for(const fg of ['border','focus'])for(const bg of ['canvas','surface','raised'])checks.push({fg,bg,minimum:3,ratio:Brand.contrast(t[fg],t[bg])});
checks.push({fg:'onAction',bg:'action',minimum:4.5,ratio:Brand.contrast(t.onAction,t.action)});
assert(checks.every(c=>c.ratio>=c.minimum),`${p.id}/${mode} contrast`);
report.contrast.push({palette:p.id,mode,checks});
}
const b=await browser();
const url=new URL('../index.html',import.meta.url).href;
const change=async(id,value)=>b.evaluate(`(()=>{const e=document.getElementById(${JSON.stringify(id)});e.value=${JSON.stringify(value)};e.dispatchEvent(new Event('change',{bubbles:true}));return e.value})()`);
const mode=async value=>b.evaluate(`document.querySelector('[name="mode"][value="${value}"]').click()`);
const measure=()=>b.evaluate(`({width:innerWidth,scroll:document.documentElement.scrollWidth,body:document.body.scrollWidth,overflows:[...document.querySelectorAll('main *,header *,aside *')].filter(e=>{const r=e.getBoundingClientRect();return r.width>0&&(r.right>innerWidth+1||r.left < -1)&&!e.classList.contains('sr-only')}).slice(0,10).map(e=>({tag:e.tagName,class:e.className,id:e.id}))})`);
try{
await b.call('Page.addScriptToEvaluateOnNewDocument',{source:'window.__errors=[];addEventListener("error",e=>window.__errors.push(e.message));addEventListener("unhandledrejection",e=>window.__errors.push(String(e.reason)));'});
await b.viewport(1440,1100);
await b.navigate(url);
assert.equal(await b.evaluate('document.querySelectorAll("[data-palette-card]").length'),10);
assert.equal(await b.evaluate('document.querySelectorAll("[data-mark-card]").length'),3);
assert.equal(await b.evaluate('document.querySelectorAll("[data-font-card]").length'),3);
// All theme choices are applied through the actual page controls, then laid out.
for(const p of Brand.palettes)for(const m of ['light','dim','dark']){
await change('palette',p.id);await mode(m);
assert.equal(await b.evaluate('document.documentElement.dataset.palette'),p.id);
assert.equal(await b.evaluate('document.documentElement.dataset.mode'),m);
for(const width of [320,390,768,960,1440,1920,2560,3440]){
await b.viewport(width,1000);
const result=await measure();
report.layouts.push({palette:p.id,mode:m,...result});
assert(result.scroll<=width && result.body<=width && !result.overflows.length,JSON.stringify(report.layouts.at(-1)));
}
}
await change('palette','harbor');await mode('light');
for(const width of [320,390,768,1440,3440]){
await b.viewport(width,width===390?844:1100);await b.evaluate('scrollTo(0,0)');
await b.screenshot(new URL(`board-light-${width}.png`,out));
}
for(const m of ['dim','dark']){
await mode(m);await b.viewport(1440,1100);await b.evaluate('scrollTo(0,0)');
await b.screenshot(new URL(`board-${m}-1440.png`,out));
}
// Real keyboard: native select, radio navigation, buttons, forward/reverse tab.
await mode('light');await b.viewport(1440,1100);
await b.evaluate('document.getElementById("palette").focus()');
await b.key('ArrowDown');await b.key('Enter');
assert.equal(await b.evaluate('document.getElementById("palette").value'),'carmine');
await b.evaluate('document.querySelector("[name=mode][value=light]").focus()');
await b.key('ArrowRight');
assert.equal(await b.evaluate('document.documentElement.dataset.mode'),'dim');
const focus=await b.evaluate('({outline:getComputedStyle(document.activeElement.nextElementSibling).outlineStyle,width:getComputedStyle(document.activeElement.nextElementSibling).outlineWidth})');
assert.equal(focus.outline,'solid');assert.equal(focus.width,'3px');
await b.evaluate('document.querySelector("[data-choose-mark=weave]").focus()');await b.key('Enter');
assert.equal(await b.evaluate('document.getElementById("mark").value'),'weave');
await b.evaluate('document.querySelector("[data-choose-font=plex]").focus()');await b.key(' ' ,'Space');
assert.equal(await b.evaluate('document.getElementById("font").value'),'plex');
await b.evaluate('document.getElementById("sample-title").focus()');
await b.key('Tab');assert.equal(await b.evaluate('document.activeElement.id'),'sample-state');
await b.key('Tab','Tab',8);assert.equal(await b.evaluate('document.activeElement.id'),'sample-title');
report.interactions.push({name:'Keyboard selection, native radio arrow, Enter/Space buttons, Tab/Shift+Tab',result:'pass',focus});
await change('sample-state','error');
assert.equal(await b.evaluate('document.getElementById("sample-title").value'),'Summer reading notes');
await b.evaluate('document.getElementById("sample-action").focus()');await b.key('Enter');
assert.equal(await b.evaluate('document.getElementById("sample-feedback").dataset.state'),'success');
await change('sample-state','loading');assert(await b.evaluate('document.getElementById("sample-action").disabled'));
for(const s of ['empty','ready']) {await change('sample-state',s);assert.equal(await b.evaluate('document.getElementById("sample-feedback").dataset.state'),s);}
report.interactions.push({name:'All five component states and error recovery preserving input',result:'pass'});
// All bundled families loaded, and long labels remain usable at mobile width.
for(const f of Brand.fonts){
await change('font',f.id);await b.evaluate('document.fonts.ready.then(()=>true)');
const loaded=await b.evaluate(`document.fonts.check('16px "${f.name}"')`);
assert(loaded,f.name+' font load');
await b.viewport(320,1000);assert((await measure()).scroll<=320);
}
report.interactions.push({name:'Three local fonts loaded and reflowed at 320 px',result:'pass'});
await b.evaluate('document.getElementById("review-notes").value="Keep this review note.";document.getElementById("review-notes").dispatchEvent(new Event("input"));document.getElementById("reset").click()');
assert.equal(await b.evaluate('document.getElementById("review-notes").value'),'Keep this review note.');
await b.navigate(url);
assert.equal(await b.evaluate('document.getElementById("review-notes").value'),'Keep this review note.');
report.interactions.push({name:'Local preference and note storage; reset preserves notes',result:'pass'});
await b.call('Emulation.setEmulatedMedia',{features:[{name:'prefers-reduced-motion',value:'reduce'}]});
await mode('dark');await b.key('Tab');
assert(await b.evaluate('matchMedia("(prefers-reduced-motion: reduce)").matches'));
report.interactions.push({name:'Reduced motion still permits theme and keyboard interaction',result:'pass'});
await b.viewport(320,1000);
await b.evaluate(`(()=>{const style=document.createElement('style');style.id='spacing-test';style.textContent='*{line-height:1.5!important;letter-spacing:.12em!important;word-spacing:.16em!important}p{margin-bottom:2em!important}';document.head.append(style)})()`);
let result=await measure();assert(result.scroll<=320,JSON.stringify(result));
await b.screenshot(new URL('board-text-spacing-320.png',out));
await b.evaluate('document.getElementById("spacing-test").remove();document.documentElement.style.fontSize="200%"');
result=await measure();assert(result.scroll<=320,JSON.stringify(result));
await b.screenshot(new URL('board-text-200-320.png',out));
report.interactions.push({name:'320 px text-spacing overrides and root text size 200%',result:'pass',qualification:'Not browser-native zoom; pixel-sized component text also needs separate scaling checks.'});
await b.evaluate('document.documentElement.style.fontSize=""');
const errors=await b.evaluate('window.__errors');assert.deepEqual(errors,[]);
report.interactions.push({name:'Uncaught page errors',result:'pass',errors});
} catch(error){report.failure=error.stack;}
finally{await b.close();}
await writeFile(new URL('verification.json',out),JSON.stringify(report,null,2)+'\n');
console.log(JSON.stringify({contrastSets:report.contrast.length,layouts:report.layouts.length,interactions:report.interactions,failure:report.failure},null,2));
if(report.failure)process.exitCode=1;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

@@ -1,257 +0,0 @@
{
"observedAt": "2026-09-08T13:49:13.216Z",
"checks": [
{
"name": "Computed rendered text contrast across 30 combinations",
"result": "pass"
},
{
"name": "Sidebar keyboard focus visible at 768 px viewport height",
"result": "pass",
"focus": {
"text": "05 Your review",
"top": 630.109375,
"bottom": 674.109375,
"viewport": 768,
"style": "solid"
}
},
{
"name": "Chromium accessibility tree gives interactive elements accessible names",
"result": "pass",
"namedControls": 60
},
{
"name": "Review notes and all-three-mode palette JSON downloaded and content-verified",
"result": "pass"
},
{
"name": "Every computed text size doubled at 320 px",
"result": "pass",
"measurement": {
"width": 320,
"scroll": 305
}
},
{
"name": "Blocked fonts and denied storage: controls still work and fallback reflows",
"result": "pass",
"measurement": {
"width": 320,
"scroll": 305
}
}
],
"renderedContrast": [
{
"palette": "harbor",
"mode": "light",
"count": 274,
"min": 4.612829123046221,
"failures": []
},
{
"palette": "harbor",
"mode": "dim",
"count": 274,
"min": 4.504658476260286,
"failures": []
},
{
"palette": "harbor",
"mode": "dark",
"count": 274,
"min": 5.167615908293434,
"failures": []
},
{
"palette": "carmine",
"mode": "light",
"count": 274,
"min": 4.662315521062682,
"failures": []
},
{
"palette": "carmine",
"mode": "dim",
"count": 274,
"min": 4.587463027691096,
"failures": []
},
{
"palette": "carmine",
"mode": "dark",
"count": 274,
"min": 4.695553088417374,
"failures": []
},
{
"palette": "atlantic",
"mode": "light",
"count": 274,
"min": 4.515881820137726,
"failures": []
},
{
"palette": "atlantic",
"mode": "dim",
"count": 274,
"min": 4.516521277596746,
"failures": []
},
{
"palette": "atlantic",
"mode": "dark",
"count": 274,
"min": 5.597708271207925,
"failures": []
},
{
"palette": "terracotta",
"mode": "light",
"count": 274,
"min": 4.518475634580629,
"failures": []
},
{
"palette": "terracotta",
"mode": "dim",
"count": 274,
"min": 4.538542941476706,
"failures": []
},
{
"palette": "terracotta",
"mode": "dark",
"count": 274,
"min": 5.525894813496129,
"failures": []
},
{
"palette": "aubergine",
"mode": "light",
"count": 274,
"min": 4.664757683683436,
"failures": []
},
{
"palette": "aubergine",
"mode": "dim",
"count": 274,
"min": 4.560324571031366,
"failures": []
},
{
"palette": "aubergine",
"mode": "dark",
"count": 274,
"min": 4.999968974923534,
"failures": []
},
{
"palette": "mineral",
"mode": "light",
"count": 274,
"min": 4.549690583339469,
"failures": []
},
{
"palette": "mineral",
"mode": "dim",
"count": 274,
"min": 4.575057699689022,
"failures": []
},
{
"palette": "mineral",
"mode": "dark",
"count": 274,
"min": 5.6577550779736105,
"failures": []
},
{
"palette": "cobalt",
"mode": "light",
"count": 274,
"min": 4.706276899711153,
"failures": []
},
{
"palette": "cobalt",
"mode": "dim",
"count": 274,
"min": 4.5100156460147796,
"failures": []
},
{
"palette": "cobalt",
"mode": "dark",
"count": 274,
"min": 4.534974293870712,
"failures": []
},
{
"palette": "rosewood",
"mode": "light",
"count": 274,
"min": 4.636598241711077,
"failures": []
},
{
"palette": "rosewood",
"mode": "dim",
"count": 274,
"min": 4.584411037938534,
"failures": []
},
{
"palette": "rosewood",
"mode": "dark",
"count": 274,
"min": 4.964802403187582,
"failures": []
},
{
"palette": "graphite",
"mode": "light",
"count": 274,
"min": 4.613910901400341,
"failures": []
},
{
"palette": "graphite",
"mode": "dim",
"count": 274,
"min": 4.565616755282305,
"failures": []
},
{
"palette": "graphite",
"mode": "dark",
"count": 274,
"min": 5.478526170936041,
"failures": []
},
{
"palette": "grove",
"mode": "light",
"count": 274,
"min": 4.52023260851089,
"failures": []
},
{
"palette": "grove",
"mode": "dim",
"count": 274,
"min": 4.564633732635816,
"failures": []
},
{
"palette": "grove",
"mode": "dark",
"count": 274,
"min": 5.707548102674204,
"failures": []
}
]
}
@@ -1,43 +0,0 @@
{
"observedAt": "2026-09-08T13:52:02.918Z",
"checks": [
{
"name": "Entry page loads only local resources",
"result": "pass",
"resourceCount": 11
},
{
"name": "HTML and CSS asset links and in-page anchors resolve",
"result": "pass"
},
{
"name": "Keyboard skip link moves focus to main",
"result": "pass"
},
{
"name": "Both sides of five responsive breakpoints have no page overflow",
"result": "pass",
"widths": [
699,
700,
959,
960,
1199,
1200,
1699,
1700,
2399,
2400
]
},
{
"name": "Interactive control targets meet 24 px at 320 and 1440 widths",
"result": "pass",
"qualification": "Inline prose/footer links use the WCAG inline-text exception."
},
{
"name": "Malformed preference storage recovers to a usable default",
"result": "pass"
}
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

Some files were not shown because too many files have changed in this diff Show More