Norma Platform
Search the build
-
26263612026-09-14 Stop video re-bloat on feature branch: gitignore cta/rec + demos videos (TK-11533) -
437e1dc2026-09-10 Add donation refund reconciliation slice (TK-11335 Section A, local-safe) -
2c3739d2026-09-09 chore: lint, refactor, v0.2.0 (session close) -
b18aac02026-09-09 Add donation reconciliation slice (TK-11335 Section A, local-safe) -
6d613072026-09-09 Apply consent red-team fixes: fail-closed token secret + per-IP rate limit -
f6bd2e42026-09-09 Add verified-consent state machine, immutable log, and sandbox-only mock provider -
f1431e12026-09-09 Refresh campaign verification after field assignment update -
fba8ff62026-09-09 Add local field assignment and shift planning to campaign follow-ups -
1e82ed22026-09-09 Capture populated campaign preview at desktop width -
4de70562026-09-09 Record campaign browser proof and explicit provider integration gaps -
c2e108f2026-09-09 Build unified campaign workspace with five action journeys and supporter history -
1113c0b2026-09-09 auto-data-snapshot: 2026-09-09T11:09:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fc631f62026-09-09 Update Norma UX evidence from isolated run -
d02cb542026-09-09 auto-data-snapshot: 2026-09-09T10:04:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2f246a72026-09-09 auto-data-snapshot: 2026-09-09T09:32:15 (4 data files) — agents/instagram-agent/public/ig-activity.json cta/CTA-REPORT.md cta/cta-mini.json cta/route-check.json -
152d0072026-09-09 auto-data-snapshot: 2026-09-09T08:59:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3d903d42026-09-09 Record Norma UX browser evidence -
f3552f72026-09-09 auto-data-snapshot: 2026-09-09T08:26:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b70d36d2026-09-09 Clear Norma release lint and type gate -
55fb2ea2026-09-09 Clean lint autofix whitespace -
494dad32026-09-09 Align Norma lint toolchain and autofix safe issues -
318ab902026-09-08 Make session secret narrowing explicit -
9a97f8a2026-09-08 Harden Norma OAuth webhooks and release checks -
db3be272026-09-08 auto-data-snapshot: 2026-09-08T20:11:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ac036522026-09-08 auto-data-snapshot: 2026-09-08T19:39:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ddd386c2026-09-08 auto-data-snapshot: 2026-09-08T19:07:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4fe632a2026-09-08 auto-data-snapshot: 2026-09-08T18:35:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fc89a412026-09-08 auto-data-snapshot: 2026-09-08T18:03:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f133f552026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
40c5bce2026-09-08 auto-data-snapshot: 2026-09-08T14:56:20 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6911c0e2026-09-08 auto-data-snapshot: 2026-09-08T14:18:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f71b9c32026-09-08 auto-data-snapshot: 2026-09-08T13:39:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d63f76f2026-09-08 auto-data-snapshot: 2026-09-08T12:55:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
158d3c02026-09-08 auto-data-snapshot: 2026-09-08T12:16:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d40b9cc2026-09-08 auto-data-snapshot: 2026-09-08T11:37:41 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4d4f9ab2026-09-08 auto-data-snapshot: 2026-09-08T10:58:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bce41422026-09-08 auto-data-snapshot: 2026-09-08T10:19:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
60a5e152026-09-08 auto-data-snapshot: 2026-09-08T09:40:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c3dbf272026-09-08 auto-data-snapshot: 2026-09-08T09:02:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
44ce45b2026-09-08 auto-data-snapshot: 2026-09-08T08:24:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5f0326a2026-09-07 auto-data-snapshot: 2026-09-07T19:41:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a53f7122026-09-07 auto-data-snapshot: 2026-09-07T19:03:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
202b70e2026-09-07 auto-data-snapshot: 2026-09-07T18:25:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5e9b3502026-09-07 auto-data-snapshot: 2026-09-07T17:47:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
98efb142026-09-07 auto-data-snapshot: 2026-09-07T17:09:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b38bcfa2026-09-07 auto-data-snapshot: 2026-09-07T16:31:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0e5da272026-09-07 auto-data-snapshot: 2026-09-07T15:53:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
81a0af52026-09-07 auto-data-snapshot: 2026-09-07T15:15:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c3504752026-09-07 auto-data-snapshot: 2026-09-07T14:38:12 (1 data files) — agents/instagram-agent/public/ig-activity.json -
95c833a2026-09-07 auto-data-snapshot: 2026-09-07T14:00:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2d6006f2026-09-07 auto-data-snapshot: 2026-09-07T13:22:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ac0b5012026-09-07 auto-data-snapshot: 2026-09-07T12:38:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8afe3432026-09-07 auto-data-snapshot: 2026-09-07T12:00:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a95d93f2026-09-07 auto-data-snapshot: 2026-09-07T11:21:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d8fcf782026-09-07 auto-data-snapshot: 2026-09-07T10:43:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bb2e9322026-09-07 auto-data-snapshot: 2026-09-07T10:04:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3c2ed322026-09-07 auto-data-snapshot: 2026-09-07T09:25:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d46e7c02026-09-07 auto-data-snapshot: 2026-09-07T08:47:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b01709d2026-09-07 auto-data-snapshot: 2026-09-07T08:09:05 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2e29d6c2026-09-05 auto-data-snapshot: 2026-09-05T20:16:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1c383442026-09-05 auto-data-snapshot: 2026-09-05T19:38:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
de727f82026-09-05 auto-data-snapshot: 2026-09-05T19:00:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9289eee2026-09-05 auto-data-snapshot: 2026-09-05T18:21:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
689ad592026-09-05 auto-data-snapshot: 2026-09-05T17:43:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b09567d2026-09-05 auto-data-snapshot: 2026-09-05T15:09:59 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5e6cde32026-09-05 auto-data-snapshot: 2026-09-05T14:31:27 (1 data files) — agents/instagram-agent/public/ig-activity.json -
afcd15f2026-09-05 auto-data-snapshot: 2026-09-05T13:53:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
60242132026-09-05 auto-data-snapshot: 2026-09-05T13:15:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
faf4a412026-09-05 auto-data-snapshot: 2026-09-05T12:36:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c79f07f2026-09-05 auto-data-snapshot: 2026-09-05T11:58:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
833ccff2026-09-05 auto-data-snapshot: 2026-09-05T11:20:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f29b4402026-09-05 auto-data-snapshot: 2026-09-05T10:42:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
219ac642026-09-05 auto-data-snapshot: 2026-09-05T10:03:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
df6fe092026-09-05 auto-data-snapshot: 2026-09-05T09:24:41 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d368c382026-09-05 auto-data-snapshot: 2026-09-05T08:46:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
eaf71752026-09-04 auto-data-snapshot: 2026-09-04T19:59:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f9276852026-09-04 auto-data-snapshot: 2026-09-04T19:20:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b0d29972026-09-04 auto-data-snapshot: 2026-09-04T18:42:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3c230582026-09-04 auto-data-snapshot: 2026-09-04T18:04:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fa4859a2026-09-04 auto-data-snapshot: 2026-09-04T17:26:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
baf3fb92026-09-04 auto-data-snapshot: 2026-09-04T15:31:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
360fef92026-09-04 auto-data-snapshot: 2026-09-04T14:52:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
784b4b92026-09-04 auto-data-snapshot: 2026-09-04T14:13:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
08fe7b62026-09-04 auto-data-snapshot: 2026-09-04T13:35:12 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2b32aed2026-09-04 auto-data-snapshot: 2026-09-04T12:55:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2b2cdb92026-09-04 auto-data-snapshot: 2026-09-04T12:10:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c4439f72026-09-04 auto-data-snapshot: 2026-09-04T11:31:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
40ad9192026-09-04 auto-data-snapshot: 2026-09-04T10:48:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e6506242026-09-04 auto-data-snapshot: 2026-09-04T10:10:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
105b6582026-09-04 auto-data-snapshot: 2026-09-04T09:09:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
35f19212026-09-04 auto-data-snapshot: 2026-09-04T08:26:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
531a4a42026-09-03 auto-data-snapshot: 2026-09-03T20:10:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a2a082e2026-09-03 auto-data-snapshot: 2026-09-03T19:32:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
66e15b32026-09-03 auto-data-snapshot: 2026-09-03T18:54:12 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0d3e8892026-09-03 auto-data-snapshot: 2026-09-03T18:17:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3e9fbec2026-09-03 auto-data-snapshot: 2026-09-03T17:39:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
381eecd2026-09-03 auto-data-snapshot: 2026-09-03T15:45:08 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6843c462026-09-03 auto-data-snapshot: 2026-09-03T15:07:41 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6bba4fa2026-09-03 auto-data-snapshot: 2026-09-03T14:29:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8d6ad092026-09-03 auto-data-snapshot: 2026-09-03T13:47:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
da3c94d2026-09-03 auto-data-snapshot: 2026-09-03T13:07:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d3df7242026-09-03 auto-data-snapshot: 2026-09-03T12:32:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
75844f82026-09-03 auto-data-snapshot: 2026-09-03T11:49:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0edb69d2026-09-03 auto-data-snapshot: 2026-09-03T11:10:51 (1 data files) — agents/instagram-agent/public/ig-activity.json -
77c12db2026-09-03 auto-data-snapshot: 2026-09-03T10:32:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3424b882026-09-03 auto-data-snapshot: 2026-09-03T09:53:05 (1 data files) — agents/instagram-agent/public/ig-activity.json -
52410172026-09-03 auto-data-snapshot: 2026-09-03T09:14:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1b4d5fa2026-09-03 auto-data-snapshot: 2026-09-03T08:35:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
26a21882026-09-02 auto-data-snapshot: 2026-09-02T19:55:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d47bb932026-09-02 auto-data-snapshot: 2026-09-02T19:17:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1308b512026-09-02 auto-data-snapshot: 2026-09-02T18:39:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c3a185b2026-09-02 auto-data-snapshot: 2026-09-02T18:02:03 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7c3d21c2026-09-02 auto-data-snapshot: 2026-09-02T17:24:05 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5fa7cd92026-09-02 auto-data-snapshot: 2026-09-02T16:03:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a82dd032026-09-02 auto-data-snapshot: 2026-09-02T15:21:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e4feac52026-09-02 auto-data-snapshot: 2026-09-02T14:42:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
846e7902026-09-02 auto-data-snapshot: 2026-09-02T14:03:59 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8cd45152026-09-02 auto-data-snapshot: 2026-09-02T13:25:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
533c5c62026-09-02 auto-data-snapshot: 2026-09-02T12:46:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0c42c772026-09-02 auto-data-snapshot: 2026-09-02T12:07:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bd729232026-09-02 auto-data-snapshot: 2026-09-02T11:28:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f4e158e2026-09-02 auto-data-snapshot: 2026-09-02T10:48:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a324bd72026-09-02 auto-data-snapshot: 2026-09-02T10:09:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
daa09d92026-09-02 auto-data-snapshot: 2026-09-02T09:35:20 (1 data files) — agents/instagram-agent/public/ig-activity.json -
24803732026-09-02 auto-data-snapshot: 2026-09-02T09:04:08 (1 data files) — agents/instagram-agent/public/ig-activity.json -
43a6b322026-09-02 auto-data-snapshot: 2026-09-02T08:25:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8195dc42026-09-01 auto-data-snapshot: 2026-09-01T19:53:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3b5d7982026-09-01 auto-data-snapshot: 2026-09-01T19:16:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ceacd852026-09-01 auto-data-snapshot: 2026-09-01T18:38:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c3684d92026-09-01 auto-data-snapshot: 2026-09-01T18:00:51 (1 data files) — agents/instagram-agent/public/ig-activity.json -
18ab19b2026-09-01 auto-data-snapshot: 2026-09-01T17:22:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
430062e2026-09-01 auto-data-snapshot: 2026-09-01T16:07:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bc141302026-09-01 auto-data-snapshot: 2026-09-01T15:29:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0acd26d2026-09-01 auto-data-snapshot: 2026-09-01T14:52:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9b1947d2026-09-01 auto-data-snapshot: 2026-09-01T14:14:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
941e0432026-09-01 auto-data-snapshot: 2026-09-01T13:36:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4605cdd2026-09-01 auto-data-snapshot: 2026-09-01T12:55:30 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1edc8702026-09-01 auto-data-snapshot: 2026-09-01T12:16:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fc99c842026-09-01 auto-data-snapshot: 2026-09-01T11:38:20 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7b0c23f2026-09-01 auto-data-snapshot: 2026-09-01T10:56:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b91e7cf2026-09-01 auto-data-snapshot: 2026-09-01T10:19:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
49a86b82026-09-01 auto-data-snapshot: 2026-09-01T09:42:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a61acb42026-09-01 auto-data-snapshot: 2026-09-01T09:05:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d9d84fe2026-09-01 auto-data-snapshot: 2026-09-01T08:28:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
09918402026-08-31 auto-data-snapshot: 2026-08-31T20:06:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
58bd8342026-08-31 auto-data-snapshot: 2026-08-31T19:29:32 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c526f802026-08-31 auto-data-snapshot: 2026-08-31T18:52:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
071fb8b2026-08-31 auto-data-snapshot: 2026-08-31T18:15:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
222d28f2026-08-31 auto-data-snapshot: 2026-08-31T17:38:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cfcb8d12026-08-31 auto-data-snapshot: 2026-08-31T16:59:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c9689762026-08-31 auto-data-snapshot: 2026-08-31T16:22:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ab3efbb2026-08-31 auto-data-snapshot: 2026-08-31T15:44:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b414d0e2026-08-31 auto-data-snapshot: 2026-08-31T15:07:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
20f8e1c2026-08-31 auto-data-snapshot: 2026-08-31T14:28:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
abf140c2026-08-31 auto-data-snapshot: 2026-08-31T13:51:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
49422972026-08-31 auto-data-snapshot: 2026-08-31T13:13:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
023e8a72026-08-31 auto-data-snapshot: 2026-08-31T12:34:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
331fc8b2026-08-31 auto-data-snapshot: 2026-08-31T11:55:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1e14ffe2026-08-31 auto-data-snapshot: 2026-08-31T11:17:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
61b4acb2026-08-31 auto-data-snapshot: 2026-08-31T10:38:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2f54b802026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
be89cc32026-08-31 auto-data-snapshot: 2026-08-31T09:29:05 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1e76e1a2026-08-31 auto-data-snapshot: 2026-08-31T08:52:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4c30e512026-08-31 auto-data-snapshot: 2026-08-31T08:15:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c7d0a872026-08-29 auto-data-snapshot: 2026-08-29T20:09:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d238df42026-08-29 auto-data-snapshot: 2026-08-29T19:32:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
06a97dd2026-08-29 auto-data-snapshot: 2026-08-29T18:56:11 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5ae95562026-08-29 auto-data-snapshot: 2026-08-29T18:19:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0b22a6a2026-08-29 auto-data-snapshot: 2026-08-29T17:42:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9f376482026-08-29 auto-data-snapshot: 2026-08-29T15:52:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bf429972026-08-29 auto-data-snapshot: 2026-08-29T15:15:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e17d0a12026-08-29 auto-data-snapshot: 2026-08-29T14:38:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
52359bc2026-08-29 auto-data-snapshot: 2026-08-29T14:01:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a1f23442026-08-29 auto-data-snapshot: 2026-08-29T13:24:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c9da9b32026-08-29 auto-data-snapshot: 2026-08-29T12:47:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b4f28772026-08-29 auto-data-snapshot: 2026-08-29T12:10:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
04e0c112026-08-29 auto-data-snapshot: 2026-08-29T11:33:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cf09a7a2026-08-29 auto-data-snapshot: 2026-08-29T10:56:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0c2e0852026-08-29 auto-data-snapshot: 2026-08-29T10:19:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
678bc692026-08-29 auto-data-snapshot: 2026-08-29T09:43:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e5f3bcc2026-08-29 auto-data-snapshot: 2026-08-29T09:06:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a45f28a2026-08-29 auto-data-snapshot: 2026-08-29T08:29:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3c619db2026-08-28 auto-data-snapshot: 2026-08-28T19:30:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6def0172026-08-28 auto-data-snapshot: 2026-08-28T18:53:51 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3cbdc472026-08-28 auto-data-snapshot: 2026-08-28T18:16:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
62081502026-08-28 auto-data-snapshot: 2026-08-28T17:39:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f7dda892026-08-28 auto-data-snapshot: 2026-08-28T17:02:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
425bdab2026-08-28 auto-data-snapshot: 2026-08-28T15:48:59 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c831e8d2026-08-28 auto-data-snapshot: 2026-08-28T15:12:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6551ffb2026-08-28 auto-data-snapshot: 2026-08-28T14:34:59 (1 data files) — agents/instagram-agent/public/ig-activity.json -
09259db2026-08-28 auto-data-snapshot: 2026-08-28T13:58:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
96ad14e2026-08-28 auto-data-snapshot: 2026-08-28T13:21:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a7cab9b2026-08-28 auto-data-snapshot: 2026-08-28T12:44:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bd8aa332026-08-28 auto-data-snapshot: 2026-08-28T12:07:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fe374272026-08-28 auto-data-snapshot: 2026-08-28T11:30:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
16c82052026-08-28 auto-data-snapshot: 2026-08-28T10:53:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
41d4f792026-08-28 auto-data-snapshot: 2026-08-28T10:16:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a278a272026-08-28 auto-data-snapshot: 2026-08-28T09:39:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0aed9bf2026-08-28 auto-data-snapshot: 2026-08-28T09:02:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cbd83212026-08-28 auto-data-snapshot: 2026-08-28T08:24:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4b4bb892026-08-28 auto-data-snapshot: 2026-08-28T07:45:44 (1 data files) — scripts/password-restore/admin-2026-08-28T14-32-40-840Z.json -
159c3e52026-08-28 scripts: restore-admin-hash helper (revert a tier_credentials hash from a saved restore file) -
db0ecc22026-08-28 feat(set-admin-password): NEW_PW_B64 input to survive shell '!' mangling -
7c027a12026-08-28 fix(set-admin-password): read .env.local first, echo DB host, abort on multi-row (Cody gate) -
c5e8f582026-08-28 scripts: reversible set-admin-password helper (bcrypt, captures old hash) -
1ea90de2026-08-27 auto-data-snapshot: 2026-08-27T20:01:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f08a3ee2026-08-27 auto-data-snapshot: 2026-08-27T19:24:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5e380e22026-08-27 auto-data-snapshot: 2026-08-27T18:47:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
3e6347f2026-08-27 auto-data-snapshot: 2026-08-27T18:10:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c756e292026-08-27 auto-data-snapshot: 2026-08-27T17:33:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
735514a2026-08-27 auto-data-snapshot: 2026-08-27T15:43:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f93292f2026-08-27 auto-data-snapshot: 2026-08-27T15:06:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
edaf1f52026-08-27 auto-data-snapshot: 2026-08-27T14:29:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
042267e2026-08-27 auto-data-snapshot: 2026-08-27T13:51:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d43ec192026-08-27 auto-data-snapshot: 2026-08-27T13:15:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c575b9a2026-08-27 auto-data-snapshot: 2026-08-27T12:38:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f3efdf72026-08-27 auto-data-snapshot: 2026-08-27T12:01:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2c3fe952026-08-27 auto-data-snapshot: 2026-08-27T11:24:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
afb0c092026-08-27 TK-10449: regenerate IG registry from live token — @grassclothwallpaper link dropped (35->34 postable, verified) -
0045a7c2026-08-27 auto-data-snapshot: 2026-08-27T10:47:06 (1 data files) — agents/instagram-agent/public/ig-activity.json -
63141e32026-08-27 auto-data-snapshot: 2026-08-27T10:10:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7abb93e2026-08-27 auto-data-snapshot: 2026-08-27T09:33:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
00f0dfd2026-08-27 auto-data-snapshot: 2026-08-27T08:56:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cae79462026-08-27 auto-data-snapshot: 2026-08-27T08:19:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5e7147f2026-08-26 auto-data-snapshot: 2026-08-26T20:07:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5f5472e2026-08-26 auto-data-snapshot: 2026-08-26T19:31:35 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1dbcd5a2026-08-26 auto-data-snapshot: 2026-08-26T18:55:11 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4355e0f2026-08-26 auto-data-snapshot: 2026-08-26T18:18:32 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e12abed2026-08-26 auto-data-snapshot: 2026-08-26T17:42:06 (1 data files) — agents/instagram-agent/public/ig-activity.json -
73e83b32026-08-26 auto-data-snapshot: 2026-08-26T17:05:40 (1 data files) — agents/instagram-agent/public/ig-activity.json -
549be2e2026-08-26 auto-data-snapshot: 2026-08-26T16:29:03 (1 data files) — agents/instagram-agent/public/ig-activity.json -
dddca162026-08-26 auto-data-snapshot: 2026-08-26T15:52:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f4b84bd2026-08-26 auto-data-snapshot: 2026-08-26T15:16:03 (1 data files) — agents/instagram-agent/public/ig-activity.json -
449fa922026-08-26 auto-data-snapshot: 2026-08-26T14:39:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a60fb442026-08-26 auto-data-snapshot: 2026-08-26T14:02:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
362538b2026-08-26 auto-data-snapshot: 2026-08-26T13:25:11 (1 data files) — agents/instagram-agent/public/ig-activity.json -
745fed22026-08-26 auto-data-snapshot: 2026-08-26T12:47:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
13c81bc2026-08-26 auto-data-snapshot: 2026-08-26T12:08:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9df48682026-08-26 auto-data-snapshot: 2026-08-26T11:30:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
69077d02026-08-26 auto-data-snapshot: 2026-08-26T10:53:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c8be6e52026-08-26 auto-data-snapshot: 2026-08-26T10:15:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
560e3c12026-08-26 auto-data-snapshot: 2026-08-26T09:38:32 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8d639f12026-08-26 auto-data-snapshot: 2026-08-26T09:01:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ca257a92026-08-26 auto-data-snapshot: 2026-08-26T08:21:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6d4b1d02026-08-25 auto-data-snapshot: 2026-08-25T19:29:44 (1 data files) — agents/instagram-agent/public/ig-activity.json -
44723242026-08-25 auto-data-snapshot: 2026-08-25T18:53:12 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ea61d892026-08-25 auto-data-snapshot: 2026-08-25T18:16:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6dcc6802026-08-25 auto-data-snapshot: 2026-08-25T17:39:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
99f3fe22026-08-25 auto-data-snapshot: 2026-08-25T17:03:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6697b0e2026-08-25 auto-data-snapshot: 2026-08-25T16:26:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f70a2792026-08-25 auto-data-snapshot: 2026-08-25T15:49:32 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c8193532026-08-25 auto-data-snapshot: 2026-08-25T15:12:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fdd80a02026-08-25 auto-data-snapshot: 2026-08-25T14:34:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
419678e2026-08-25 auto-data-snapshot: 2026-08-25T13:58:08 (1 data files) — agents/instagram-agent/public/ig-activity.json -
276ac8f2026-08-25 auto-data-snapshot: 2026-08-25T13:21:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9677aff2026-08-25 auto-data-snapshot: 2026-08-25T12:44:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f2d128e2026-08-25 auto-data-snapshot: 2026-08-25T12:06:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
52bbfee2026-08-25 auto-data-snapshot: 2026-08-25T11:28:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
be054e02026-08-25 auto-data-snapshot: 2026-08-25T10:46:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fcabb6e2026-08-25 auto-data-snapshot: 2026-08-25T10:08:44 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9d967d32026-08-25 auto-data-snapshot: 2026-08-25T09:32:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
29e25052026-08-25 auto-data-snapshot: 2026-08-25T08:55:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
60d2b882026-08-25 Add delete-novasuede-graph.js — gated Graph-API removal of 33 Novasuede IG posts (dry-run default, --go to execute) -
b2e74132026-08-24 auto-data-snapshot: 2026-08-24T20:06:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
64979542026-08-24 auto-data-snapshot: 2026-08-24T19:34:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
993670d2026-08-24 auto-data-snapshot: 2026-08-24T18:33:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6dfdfbf2026-08-24 auto-data-snapshot: 2026-08-24T18:03:09 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cd870f82026-08-24 auto-data-snapshot: 2026-08-24T17:32:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b7e398b2026-08-24 auto-data-snapshot: 2026-08-24T17:02:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6f489312026-08-24 auto-data-snapshot: 2026-08-24T16:31:44 (1 data files) — agents/instagram-agent/public/ig-activity.json -
62a177a2026-08-24 auto-data-snapshot: 2026-08-24T15:30:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
44be7e92026-08-24 auto-data-snapshot: 2026-08-24T15:00:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
fe68aed2026-08-24 auto-data-snapshot: 2026-08-24T14:29:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
48108a42026-08-24 auto-data-snapshot: 2026-08-24T13:59:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2759e572026-08-24 auto-data-snapshot: 2026-08-24T13:25:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d4ae3a22026-08-24 auto-data-snapshot: 2026-08-24T12:55:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d451e582026-08-24 auto-data-snapshot: 2026-08-24T12:20:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
223ab9d2026-08-24 auto-data-snapshot: 2026-08-24T11:44:27 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bdb262c2026-08-24 auto-data-snapshot: 2026-08-24T11:12:29 (1 data files) — agents/instagram-agent/public/ig-activity.json -
674adb12026-08-24 auto-data-snapshot: 2026-08-24T10:40:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c1c2d222026-08-24 auto-data-snapshot: 2026-08-24T10:08:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b2932af2026-08-24 auto-data-snapshot: 2026-08-24T09:36:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c868ff82026-08-24 auto-data-snapshot: 2026-08-24T09:04:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ee56ffa2026-08-24 auto-data-snapshot: 2026-08-24T08:30:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d521f5c2026-08-22 auto-data-snapshot: 2026-08-22T20:21:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c52f42e2026-08-22 auto-data-snapshot: 2026-08-22T19:49:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8862da52026-08-22 auto-data-snapshot: 2026-08-22T19:18:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c01c4e02026-08-22 auto-data-snapshot: 2026-08-22T18:46:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2df7cff2026-08-22 auto-data-snapshot: 2026-08-22T18:14:40 (1 data files) — agents/instagram-agent/public/ig-activity.json -
13869212026-08-22 auto-data-snapshot: 2026-08-22T17:42:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ab7e6f22026-08-22 auto-data-snapshot: 2026-08-22T17:10:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
27a23782026-08-22 auto-data-snapshot: 2026-08-22T16:38:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ae293622026-08-22 auto-data-snapshot: 2026-08-22T16:06:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2e0c17b2026-08-22 auto-data-snapshot: 2026-08-22T15:34:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5ee131f2026-08-22 auto-data-snapshot: 2026-08-22T15:02:59 (1 data files) — agents/instagram-agent/public/ig-activity.json -
aff723e2026-08-22 auto-data-snapshot: 2026-08-22T14:31:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0ef65b82026-08-22 auto-data-snapshot: 2026-08-22T13:59:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
15e89a32026-08-22 auto-data-snapshot: 2026-08-22T13:27:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4b722b02026-08-22 auto-data-snapshot: 2026-08-22T12:55:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1061cc72026-08-22 auto-data-snapshot: 2026-08-22T12:23:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e11994d2026-08-22 auto-data-snapshot: 2026-08-22T11:52:06 (1 data files) — agents/instagram-agent/public/ig-activity.json -
069fb022026-08-22 auto-data-snapshot: 2026-08-22T10:47:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e3de0b42026-08-22 auto-data-snapshot: 2026-08-22T10:15:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f0d65772026-08-22 auto-data-snapshot: 2026-08-22T09:43:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ce53f0e2026-08-22 auto-data-snapshot: 2026-08-22T09:11:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7b7c7622026-08-22 auto-data-snapshot: 2026-08-22T08:40:11 (1 data files) — agents/instagram-agent/public/ig-activity.json -
999d36a2026-08-21 auto-data-snapshot: 2026-08-21T19:54:30 (1 data files) — agents/instagram-agent/public/ig-activity.json -
288ffe72026-08-21 auto-data-snapshot: 2026-08-21T19:22:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
eb4f51b2026-08-21 auto-data-snapshot: 2026-08-21T18:51:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b83df232026-08-21 auto-data-snapshot: 2026-08-21T18:19:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2cb74262026-08-21 auto-data-snapshot: 2026-08-21T17:47:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
79b0b6f2026-08-21 auto-data-snapshot: 2026-08-21T17:15:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
549a3602026-08-21 auto-data-snapshot: 2026-08-21T16:12:08 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0324fdc2026-08-21 auto-data-snapshot: 2026-08-21T15:40:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
63161822026-08-21 auto-data-snapshot: 2026-08-21T15:08:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
619aa112026-08-21 auto-data-snapshot: 2026-08-21T14:05:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f107a6e2026-08-21 auto-data-snapshot: 2026-08-21T13:33:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
668801f2026-08-21 auto-data-snapshot: 2026-08-21T13:00:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7c3a14c2026-08-21 auto-data-snapshot: 2026-08-21T12:28:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
239fa122026-08-21 auto-data-snapshot: 2026-08-21T11:56:19 (1 data files) — agents/instagram-agent/public/ig-activity.json -
78c00122026-08-21 auto-data-snapshot: 2026-08-21T11:24:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
677b9132026-08-21 auto-data-snapshot: 2026-08-21T10:52:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
649ef2d2026-08-21 auto-data-snapshot: 2026-08-21T10:21:05 (1 data files) — agents/instagram-agent/public/ig-activity.json -
83d491f2026-08-21 auto-data-snapshot: 2026-08-21T09:49:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
41fb8dd2026-08-21 auto-data-snapshot: 2026-08-21T09:17:35 (1 data files) — agents/instagram-agent/public/ig-activity.json -
28e34db2026-08-21 auto-data-snapshot: 2026-08-21T08:45:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1d1def02026-08-20 auto-data-snapshot: 2026-08-20T20:00:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f0bfecf2026-08-20 auto-data-snapshot: 2026-08-20T19:28:34 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d8a11b02026-08-20 auto-data-snapshot: 2026-08-20T18:56:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
762d1212026-08-20 auto-data-snapshot: 2026-08-20T17:52:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ca1c6ed2026-08-20 auto-data-snapshot: 2026-08-20T17:19:08 (1 data files) — agents/instagram-agent/public/ig-activity.json -
23c99ec2026-08-20 TK-10573: finish-fabric-fridays.sh wrapper (bakes the ™ handle to dodge paste truncation) -
75071112026-08-20 TK-10758: reshare-erase pacing 15s->5s (browser-free, own accounts) -
404bd152026-08-20 TK-10758: stop+erase sassy reposts of others' content - disabled reshare launchd jobs, browser-free erase reconciler (114 live across 4 accts) -
75f97622026-08-20 TK-10573 GATE2: browser-free Graph-API reconcile + delete tooling (57 eligible, canary-first) -
4c96ddd2026-08-20 auto-data-snapshot: 2026-08-20T15:43:22 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ef9b5f42026-08-20 auto-data-snapshot: 2026-08-20T15:11:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7ed8cc62026-08-20 auto-data-snapshot: 2026-08-20T14:39:47 (1 data files) — agents/instagram-agent/public/ig-activity.json -
35f7f912026-08-20 auto-data-snapshot: 2026-08-20T14:07:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ee8f0c12026-08-20 auto-data-snapshot: 2026-08-20T13:34:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d56dad62026-08-20 auto-data-snapshot: 2026-08-20T13:00:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f5631e82026-08-20 auto-data-snapshot: 2026-08-20T12:27:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
44890cf2026-08-20 auto-data-snapshot: 2026-08-20T11:53:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b4eecbd2026-08-20 auto-data-snapshot: 2026-08-20T11:21:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
590a7182026-08-20 auto-data-snapshot: 2026-08-20T10:47:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8b169232026-08-20 auto-data-snapshot: 2026-08-20T10:13:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d101cd62026-08-20 auto-data-snapshot: 2026-08-20T09:38:44 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0efb5772026-08-20 auto-data-snapshot: 2026-08-20T09:06:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9210e352026-08-20 auto-data-snapshot: 2026-08-20T08:33:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
053f8cb2026-08-19 auto-data-snapshot: 2026-08-19T20:02:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
98f14b12026-08-19 auto-data-snapshot: 2026-08-19T19:30:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bfbd18d2026-08-19 auto-data-snapshot: 2026-08-19T18:57:31 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4c4f0042026-08-19 auto-data-snapshot: 2026-08-19T18:24:30 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1dcd27f2026-08-19 auto-data-snapshot: 2026-08-19T17:51:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d1aab432026-08-19 auto-data-snapshot: 2026-08-19T15:07:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d68b1ae2026-08-19 auto-data-snapshot: 2026-08-19T14:34:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a27e1292026-08-19 auto-data-snapshot: 2026-08-19T14:01:25 (1 data files) — agents/instagram-agent/public/ig-activity.json -
66676d52026-08-19 auto-data-snapshot: 2026-08-19T13:27:48 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9e411fa2026-08-19 auto-data-snapshot: 2026-08-19T12:54:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
41dd04e2026-08-19 auto-data-snapshot: 2026-08-19T12:22:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7bdb1f62026-08-19 auto-data-snapshot: 2026-08-19T11:48:49 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e98056b2026-08-19 auto-data-snapshot: 2026-08-19T11:14:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0530e762026-08-19 auto-data-snapshot: 2026-08-19T10:40:44 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8a9b8bf2026-08-19 auto-data-snapshot: 2026-08-19T09:34:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
22bbd5f2026-08-19 auto-data-snapshot: 2026-08-19T09:03:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
93fc1672026-08-19 auto-data-snapshot: 2026-08-19T08:31:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
bcb37cc2026-08-18 auto-data-snapshot: 2026-08-18T19:51:40 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2f1d84f2026-08-18 auto-data-snapshot: 2026-08-18T19:20:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c6f58012026-08-18 auto-data-snapshot: 2026-08-18T18:16:14 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4292ee72026-08-18 auto-data-snapshot: 2026-08-18T17:44:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5aaef1d2026-08-18 auto-data-snapshot: 2026-08-18T17:12:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
128ac1b2026-08-18 chore: refactor (named consts, optional chaining) + v1.4.0 (session close) -
f60474f2026-08-18 auto-data-snapshot: 2026-08-18T15:36:46 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6512f672026-08-18 auto-data-snapshot: 2026-08-18T15:04:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
965f96d2026-08-18 instagram: per-account 'what to post next from DW Shopify' notes board (/notes) -
f85f2582026-08-18 auto-data-snapshot: 2026-08-18T14:32:35 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8cfcfe22026-08-18 instagram: keep ALL accounts live via cron (not just DW) -
835c0322026-08-18 instagram: cross-account post Calendar view (/calendar) -
d987feb2026-08-18 auto-data-snapshot: 2026-08-18T13:28:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d86e0272026-08-18 auto-data-snapshot: 2026-08-18T12:56:03 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ea7bf522026-08-18 instagram-agent: harden getJSON (response-stream error + retry, fixes mid-body ECONNRESET crash) + backfill-all.js driver; gitignore regenerable live-media caches -
85104372026-08-18 auto-data-snapshot: 2026-08-18T12:24:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e25f2702026-08-18 instagram-agent /live: account dropdown — switch between all 35 IG accounts (one shared META token), per-account cache, whitelist-guarded, auto-loads an empty account on select -
5b9bed42026-08-18 auto-data-snapshot: 2026-08-18T11:49:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2900a0c2026-08-18 instagram-agent: gitignore .env* (holds live IG token) -
7ff01522026-08-18 instagram-agent: add /live daily-posts board — real DW feed (Graph /media, paginated+cached, grouped by day) with delete-any (reuses proven openclaw delete path), sort+density controls, hourly refresh cron -
db594452026-08-18 auto-data-snapshot: 2026-08-18T11:17:58 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6f7c8f22026-08-18 auto-data-snapshot: 2026-08-18T10:46:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2f0ec642026-08-18 auto-data-snapshot: 2026-08-18T10:14:32 (2 data files) — agents/instagram-agent/package-lock.json agents/instagram-agent/public/ig-activity.json -
7db7ec92026-08-18 chore: correct version bump — instagram-agent 1.3.0->1.3.1 (prior commit bumped root package.json by mistake; restored root to 0.1.4) -
8b971152026-08-18 auto-data-snapshot: 2026-08-18T09:42:51 (1 data files) — package-lock.json -
62527ad2026-08-18 chore: instagram-agent v1.3.1 (session close — IG delete hardening + button-role selector fix) -
490f67a2026-08-18 auto-data-snapshot: 2026-08-18T09:11:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b1d73e32026-08-18 auto-data-snapshot: 2026-08-18T08:40:41 (1 data files) — agents/instagram-agent/public/ig-activity.json -
05271462026-08-17 auto-data-snapshot: 2026-08-17T20:02:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
1bc0edc2026-08-17 auto-data-snapshot: 2026-08-17T19:32:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4d823872026-08-17 auto-data-snapshot: 2026-08-17T18:31:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
135cd412026-08-17 auto-data-snapshot: 2026-08-17T18:01:33 (1 data files) — agents/instagram-agent/public/ig-activity.json -
58ce89f2026-08-17 auto-data-snapshot: 2026-08-17T17:31:10 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6350ced2026-08-17 auto-data-snapshot: 2026-08-17T17:00:51 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e166f172026-08-17 auto-data-snapshot: 2026-08-17T16:30:27 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cc615682026-08-17 auto-data-snapshot: 2026-08-17T15:29:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ac04e282026-08-17 auto-data-snapshot: 2026-08-17T14:59:21 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d0fd9c22026-08-17 auto-data-snapshot: 2026-08-17T14:29:06 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8293e852026-08-17 auto-data-snapshot: 2026-08-17T13:58:50 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4c9304a2026-08-17 IG TK-10617: Option A helper — detect logged-in account + delete its posts (owner-check safe) -
84174632026-08-17 Fix IG delete: target the Delete BUTTON, not the 'Delete post?' heading -
d73a58c2026-08-17 auto-data-snapshot: 2026-08-17T12:27:54 (1 data files) — agents/instagram-agent/public/ig-activity.json -
121aa262026-08-17 auto-data-snapshot: 2026-08-17T11:57:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2aff5972026-08-17 auto-data-snapshot: 2026-08-17T11:27:07 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f079a272026-08-17 auto-data-snapshot: 2026-08-17T10:56:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
15fb56b2026-08-17 auto-data-snapshot: 2026-08-17T10:26:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
80a6ffe2026-08-17 chore: instagram-agent v1.3.0 (session close — /spoonflower purge viewer) -
04b7ade2026-08-17 Harden IG delete-originals.js: retry stale refs, recover dead tabs, patient positive-signal login check -
1e26b112026-08-17 IG /spoonflower: server-inject data into the page so it renders without an authed XHR -
c573cf52026-08-17 IG: add /spoonflower purge viewer (thumbnails + live delete-status board) -
3f46ac82026-08-17 auto-data-snapshot: 2026-08-17T09:04:04 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f5dd47f2026-08-17 chore: instagram-agent package-lock v1.2.1 (session close) -
7098b6c2026-08-17 chore: instagram-agent v1.2.1 (session close — Spoonflower blocklist + delete tooling) -
4533e802026-08-17 snapshot before restart: preserve in-flight work -
eca6e1e2026-08-17 chore: lint, refactor, v1.2.0 (session close) -
a843c5b2026-08-17 auto-data-snapshot: 2026-08-17T08:03:25 (1 data files) — agents/instagram-agent/.gitignore -
c90044b2026-08-17 IG: add serialized, per-account-aware Spoonflower delete script (openclaw) -
ffc93032026-08-17 Bulk-select delete on IG auto-post viewer -
1b1e7d42026-08-17 ig: wrong-image delete tooling — 4 posts (metallic/suede), pre-approved, hold execution -
b5cd4412026-08-17 IG reshare: blocklist Spoonflower (competitor) fleet-wide + scrub vendor file + add scan tool -
ec918712026-08-17 Gate live IG delete behind IG_LIVE_DELETE flag (default off, tombstone-only) -
8529d5a2026-08-17 IG auto-post viewer with inline delete (GET /posts on :9810) -
06c151b2026-08-17 docs(sessions): resume — outage recovery, pm2 reconcile (TK-10606), TK-10293 gate verified green + Playwright env-fix learnings -
acd40042026-08-17 ig(TK-10573): GATE2 fan-out — split 85 originals into 10 batch tickets + iTerm2 delete windows -
ca8370c2026-08-16 auto-data-snapshot: 2026-08-16T09:54:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8ac3cb32026-08-16 ig(TK-10573): repost the held metallicwallpaper post; lift HOLD -
447e5e52026-08-15 docs(sessions): resume TK-10573 IG redo — HOLD safety fix + gated remainders -
00269092026-08-15 ig(TK-10573): HOLD unpublished repost from delete tooling + commit redo viewers -
3166e1b2026-08-15 auto-data-snapshot: 2026-08-15T20:14:06 (1 data files) — agents/instagram-agent/public/ig-activity.json -
9ecd8cd2026-08-15 auto-data-snapshot: 2026-08-15T19:12:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
aeeb37a2026-08-15 auto-data-snapshot: 2026-08-15T18:52:36 (1 data files) — agents/instagram-agent/public/ig-activity.json -
e77fc0f2026-08-15 auto-data-snapshot: 2026-08-15T18:22:11 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f214d2f2026-08-15 auto-data-snapshot: 2026-08-15T17:51:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
19af23e2026-08-15 auto-data-snapshot: 2026-08-15T17:21:18 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0f30e212026-08-15 auto-data-snapshot: 2026-08-15T16:50:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
059e3cc2026-08-15 auto-data-snapshot: 2026-08-15T16:20:27 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d2d94042026-08-15 auto-data-snapshot: 2026-08-15T15:50:00 (1 data files) — agents/instagram-agent/public/ig-activity.json -
da1e4e92026-08-15 auto-data-snapshot: 2026-08-15T14:18:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
996d8402026-08-15 auto-data-snapshot: 2026-08-15T13:48:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0625c5f2026-08-15 auto-data-snapshot: 2026-08-15T13:17:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
c27c9572026-08-15 auto-data-snapshot: 2026-08-15T12:46:51 (1 data files) — agents/instagram-agent/public/ig-activity.json -
4b1e4c02026-08-15 auto-data-snapshot: 2026-08-15T11:45:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f1b2aea2026-08-15 auto-data-snapshot: 2026-08-15T10:44:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ba37fdd2026-08-15 auto-data-snapshot: 2026-08-15T10:14:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
279017c2026-08-15 auto-data-snapshot: 2026-08-15T09:43:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
ea9baa02026-08-15 auto-data-snapshot: 2026-08-15T09:13:26 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b4a10be2026-08-15 auto-data-snapshot: 2026-08-15T08:12:28 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0ff33f92026-08-15 Norma IG cadence: 8s timeout on Boost fetch (Cody FIX-FIRST, yoloforever cycle 1) -
4b58e972026-08-15 IG cadence: close carousel room-image dedup gap (Cody gate) — ledger now records ALL slides + dedup skips candidates whose room OR swatch was already posted, so room photos no longer repeat across accounts -
43de9ea2026-08-15 Norma IG cadence: fresh-source via Boost API (fixes clean-product pool exhaustion) -
191eee12026-08-15 IG cadence: dedup by IMAGE filename (not just product handle) — stops creating same-image duplicates (multiple handles share one image, e.g. Quick Ship Durable Walls) -
eb6bf212026-08-15 IG: duplicate-image detector — md5-hash each post's image per account, flag OLDEST of each dup set for deletion (feeds delete cockpit; deletion stays manual) -
d822b582026-08-15 IG posts: 2-slide carousel — room-setting photo first, product swatch second (Steve 8/15); leak-guarded, single-image fallback when no room setting; cadence inherits it via post-to --product -
e654e892026-08-15 IG cadence: exclude @beverlyhillsvideos (dedicated LIVE reel poster bhv-ig-6h owns it) — was double-served, mixing off-brand static images into a curated luxury-store-reel feed -
c6b549a2026-08-15 auto-data-snapshot: 2026-08-15T07:41:54 (1 data files) — agents/instagram-agent/IG-RESHARE-OPS.md -
1e765082026-08-15 IG cadence: fix 4 dormant accounts (hospitality/interiorvideos/shelter/library) - multi-word keywords returned 0 storefront results; swap to clean-product keywords so they post on the live cadence -
6b1c0df2026-08-14 auto-data-snapshot: 2026-08-14T19:30:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cce6e172026-08-14 auto-data-snapshot: 2026-08-14T19:00:16 (1 data files) — agents/instagram-agent/public/ig-activity.json -
a1279172026-08-14 auto-data-snapshot: 2026-08-14T18:29:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
003881c2026-08-14 auto-data-snapshot: 2026-08-14T17:28:57 (1 data files) — agents/instagram-agent/public/ig-activity.json -
039ad5d2026-08-14 chore: lint fixes (guard JSONL parses, __dirname paths, fix reshare href), v1.1.1 -> v1.1.2 (session close) -
aca7fab2026-08-14 IG reshare: curate real populated community hashtags for all 32 accounts (drop dead handle-tags) — previously-empty accounts now find vendor-matched posts; regen preserves curation -
d165d002026-08-14 IG reshare: fix robustness gap — track vendor list + hashtag map as config (were gitignored), add build-ig-data.js regen script -
86d4ac62026-08-14 IG: robust 48h Phase-1 check reminder (launchd one-shot Aug 16 -> verify accounts + CNCP card + notification, self-unloads) -
ed1358f2026-08-14 IG fleet interaction: phased reshare-fleet + comment auto-reply (positivity-filtered, spam+self skip) + reply-fleet + staged launchd plists (phase 1: 5 accounts) -
1079fad2026-08-14 IG: generic per-account hashtag-reshare engine (all 32 niche accounts, per-account hashtags, DW-vendor credit, same 6/day+dedup+own-exclude rails) -
8ad73fc2026-08-14 IG: fabric-friday reshare launchd plist (4x/day spaced, cap 6/day) — Steve installs -
0ba22ac2026-08-14 IG fabric-friday reshare: daily auto-mode — dedup, exclude own posts, hard cap 6/day, business-hours gate; + engagement monitor -
05e17862026-08-14 IG: delete-viewer cockpit generator — visual selectable board of old dupes, one-tap open-to-delete + progress tracking -
9cc01ed2026-08-14 IG fabric-friday reshare: match #fabricfriday posts against DW vendor DB (FileMaker Supplier + registry, 505 names), normalized matching for correct credit, posts via Graph API -
5dec32d2026-08-14 IG: #fabricfriday reshare tool (hashtag-search picks + sassy credit caption, draft/gated --go); crediting blocked on oEmbed perm/login -
abf763c2026-08-14 IG cadence: 3 posts/day per account, spaced ~3.3h during business hours (was 1/day); batch 4->6 -
41aaea02026-08-14 IG cadence: exclude @goldleafwallpaper (owned by dedicated RML poster) to end double-serving -
93908bc2026-08-14 auto-data-snapshot: 2026-08-14T11:23:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
0e010342026-08-14 auto-data-snapshot: 2026-08-14T10:52:23 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f92f6e22026-08-14 IG redo: openclaw deletion driver for originals (probe-first, canary, paced --go, verify-each) -
70e6d072026-08-14 IG redo: make driver idempotent/resumable (skip already-reposted keys from redo-results) -
6e373042026-08-14 IG redo: caption polish (quote-strip colors, broaden SKU suffix, 429 retry) + redo-last5 driver (dry-run + gated --go) -
285fb062026-08-14 IG captions: show name+color+SKU (DW model), remove http link from autoCaption -
f9e68db2026-08-14 auto-data-snapshot: 2026-08-14T08:19:45 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d39a8c42026-08-13 auto-data-snapshot: 2026-08-13T19:38:43 (1 data files) — agents/instagram-agent/public/ig-activity.json -
36693e62026-08-13 auto-data-snapshot: 2026-08-13T19:08:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
7b0cfcd2026-08-13 auto-data-snapshot: 2026-08-13T18:37:41 (1 data files) — agents/instagram-agent/public/ig-activity.json -
221265d2026-08-13 auto-data-snapshot: 2026-08-13T18:07:15 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6bfef8e2026-08-13 auto-data-snapshot: 2026-08-13T17:06:27 (1 data files) — agents/instagram-agent/public/ig-activity.json -
635e4e12026-08-13 auto-data-snapshot: 2026-08-13T08:21:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
92189152026-08-12 auto-data-snapshot: 2026-08-12T19:37:30 (1 data files) — agents/instagram-agent/public/ig-activity.json -
d6ec6752026-08-12 auto-data-snapshot: 2026-08-12T19:06:56 (1 data files) — agents/instagram-agent/public/ig-activity.json -
5c95fa72026-08-12 auto-data-snapshot: 2026-08-12T18:36:17 (1 data files) — agents/instagram-agent/public/ig-activity.json -
012d3752026-08-12 auto-data-snapshot: 2026-08-12T18:04:53 (1 data files) — agents/instagram-agent/public/ig-activity.json -
6a1df862026-08-12 auto-data-snapshot: 2026-08-12T17:03:39 (1 data files) — agents/instagram-agent/public/ig-activity.json -
52237e52026-08-12 auto-data-snapshot: 2026-08-12T11:28:02 (1 data files) — agents/instagram-agent/public/ig-activity.json -
001e0e92026-08-12 auto-data-snapshot: 2026-08-12T10:57:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
970272b2026-08-12 IG runbook: add Phase 0b — link the 5 email-discovered owned accounts -
5b914e42026-08-12 IG fleet: fold 5 email-discovered owned accounts into manifest + stage themes -
2da89802026-08-12 auto-data-snapshot: 2026-08-12T10:26:55 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f619a9d2026-08-12 fix(instagram): correct #36 record — @hospitalityfabrics NOT linked to its Page (Connect never completed); needs IG login, not a role-assign -
0f9872f2026-08-12 auto-data-snapshot: 2026-08-12T09:56:27 (1 data files) — agents/instagram-agent/accounts.json -
603bf3a2026-08-12 auto-data-snapshot: 2026-08-12T09:25:42 (1 data files) — agents/instagram-agent/public/ig-activity.json -
aa159ab2026-08-12 chore(instagram): reload registry from live token — 35/35 accounts verified active+postable -
05a2f9e2026-08-12 auto-data-snapshot: 2026-08-12T08:54:38 (1 data files) — agents/instagram-agent/public/ig-activity.json -
87153f02026-08-12 feat(instagram): 23 launch-ready onboarding kits (bio+captions+visual+tags+email), built via 4 parallel subagents -
54d99eb2026-08-12 docs(instagram): phone-verify decision = Steve's phone manual relay -
c76b9712026-08-12 docs(instagram): openclaw-driven paced fleet-build runbook (phase 0 hospitality fabrics, phase 1 pilot, phase 2 scale) -
10b76952026-08-12 feat(instagram): IG fleet build manifest + pre-staged cadence themes for 22 new lines -
344ee9b2026-08-12 docs(instagram): record hospitalityfabrics Page decision (create Hospitality Fabrics Page, DTD 8/8) -
5f056582026-08-12 auto-data-snapshot: 2026-08-12T08:23:24 (1 data files) — agents/instagram-agent/public/ig-activity.json -
b83f6172026-08-12 auto-data-snapshot: 2026-08-12T07:52:17 (1 data files) — agents/instagram-agent/package-lock.json -
aa2a34b2026-08-12 chore: lint fixes (surface local feed write errors, non-blocking intra-batch sleep) + version bump (session close) -
2fa68ee2026-08-12 daily-cadence: ffepurchasing -> woven texture (broader clean pool) -
5fd46842026-08-12 daily-cadence: broaden beverlyhillsvideos/ffepurchasing keywords (narrow pools exhausted, couldn't source) -
8c1fc0a2026-08-11 auto-data-snapshot: 2026-08-11T13:51:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
40f38252026-08-11 auto-data-snapshot: 2026-08-11T13:21:01 (1 data files) — agents/instagram-agent/public/ig-activity.json -
f700cdd2026-08-11 daily-cadence: posting-hours guard (Mon-Sat 08:00-20:00) + draft launchd plist for durable cadence -
1ec24352026-08-11 daily-cadence: velocity tripwire (stop batch on 'restricted') + intra-batch pacing -
18ad4012026-08-11 IG daily cadence: 1 post/day per account, 6 days/week (rest Sun) — ledger-derived coverage, auto-sourced guard-passed products per account theme, sensitive→Cody -
f0e553d2026-08-11 IG captions: strip internal mfr SKU numbers from title (Koroseal '2308790' was leaking) -
4dbe72e2026-08-11 IG: private-label leak guard — refuse to post products whose image URL/vendor exposes a hidden upstream (luca/momentum/wallquest/etc.) -
c9d175d2026-08-11 auto-data-snapshot: 2026-08-11T11:45:12 (1 data files) — agents/instagram-agent/public/ig-activity.json -
cf737ee2026-08-11 IG post skill: poll container readiness before publish (fixes 'Media ID is not available' race) -
56427de2026-08-11 auto-data-snapshot: 2026-08-11T10:12:37 (1 data files) — agents/instagram-agent/public/ig-activity.json -
eee32bd2026-08-11 auto-data-snapshot: 2026-08-11T09:10:52 (1 data files) — agents/instagram-agent/public/ig-activity.json -
8fe7c412026-08-11 auto-data-snapshot: 2026-08-11T08:39:13 (1 data files) — agents/instagram-agent/public/ig-activity.json -
2d8bec82026-08-11 ig-activity: best-effort scp to live marketing.dw after each post (keeps panel fresh) -
37895ae2026-08-11 IG captions: strip price + raw vendor (was leaking $4.25 memo price); quality + DW-service messaging, per-product variation (anti-spam) -
85c76192026-08-10 auto-data-snapshot: 2026-08-10T13:03:09 (1 data files) — agents/instagram-agent/package-lock.json -
02b2ffa2026-08-10 chore: lint (0 fixes) + refactor (STORY_TTL_MS) + v1.1.0 (session close) -
8a9959f2026-08-10 IG poster: --product <handle> pulls a real DW product (live storefront) and auto-composes image+caption; verified dry-run on Shakespeare Mural -
5dd450b2026-08-10 IG poster hardening: carousel (2-10 img) posts, verify/health-sweep, --all throttle, follower-ranked list, account param wired into reel+story (registry-first, legacy env preserved), POSTING.md docs -
dfc3f022026-08-10 IG: verified inside Business Suite — 35 = complete existing postable fleet; 45 unlinked pages have no IG; only @hospitalityfabrics exists-but-unlinked (parked for Steve) -
0daec042026-08-10 IG: linking checklist for the 45 unlinked Pages (tiered by brand value) -
57ebb5d2026-08-10 IG poster: poll container to FINISHED for images too (fixes 'Media ID is not available'); verified live post to @patterndesignlab -
6b3ec242026-08-10 IG multi-account posting: registry + resolver + post-to CLI over 35 linked accounts (shared META token, dry-run-gated) -
564be772026-08-10 TK-10395: cap reel container poll at 12x4s so 3x-retry worst case < client 240s -
98970112026-08-10 TK-10395: bounded retry-on-2207076 in reel skill (Meta transient media-upload failure) -
cbfbf082026-08-08 Norma pre-deploy gate: run durable smoke battery before any live restart -
f2f2df62026-08-08 deploy hygiene (TK-10370): build-then-restart-then-health-gate reload + silence lockfile-root warning -
bc9cfde2026-08-07 auto-data-snapshot: 2026-08-07T18:31:41 (2 data files) — package-lock.json package.json -
dd761042026-08-07 security: npm audit fix --omit=dev (non-breaking) — resolves 4 vulns (3 moderate, 1 critical/uuid) leaving 4 sharp-libvips highs (need next@16 major bump, gated) -
efc419d2026-08-06 chore: refactor (drop dead testpulse login in api-smoke) + v0.1.4 (session close) -
a9459082026-08-06 test(cycle7 Cody-gate): mutation role-matrix + isolation positive-control -
f7e95d82026-08-06 test(cycle7): authorization-matrix + tenant-isolation suite (real tenant fixtures) -
2a8a6c72026-08-06 test(cycle6 Cody-gate): CRUD tests real org id-space; non-hollow admin E2E -
e958e072026-08-06 test(cycle6): CRUD lifecycle suite (create->read->update->delete) + admin E2E journey -
d26f6c62026-08-06 fix(cycle5 Cody-gate): truly-empty-body probe + readJson across 93 routes -
959da8b2026-08-06 test+fix(cycle5): write-path smoke (216 mutations) + Playwright E2E (3 tiers) + fixes surfaced -
9ba79402026-08-06 auto-data-snapshot: 2026-08-06T10:52:46 (2 data files) — package-lock.json package.json -
39264f32026-08-06 fix(api)+test: close Cody-gate gaps — all 14 uuid=text casts + org-scoped smoke + deterministic fixture -
eb853c32026-08-06 fix(api): 4 GET-500s surfaced by api-smoke (onboard/library real; auth-google/clickup status) -
8bbee182026-08-06 test(api-smoke): durable fs-enumerated GET sweep over all 271 routes (test:api/test:smoke) -
f4c16152026-08-06 auto-data-snapshot: 2026-08-06T10:21:57 (1 data files) — package.json -
24209b82026-08-05 auto-save: 2026-08-05T14:42:56 (14 files) — app/api/cron/gmail-sync/route.ts app/api/cron/ingest-news/route.ts app/api/geo/advocacy/route.ts app/api/geo/hotspots/route.ts app/api/geo/moveon/route.ts -
b98a5b62026-08-05 security(yoloforever c1): rate-limit public petition CREATE (anon spam vector Cody reproduced); drop admin /api/petitions from pulse-public middleware bypass (defense-in-depth); +2 regression assertions (20 green) -
89bc5322026-08-05 test: add green security-regression suite (18 assertions) + wire npm test / npm run test:instance — asserts every 2026-08-05 campaign fix holds -
e390f1a2026-08-05 security(cycle-2): pin retired gemini-2.0-flash -> 2.5-flash (35 files); /api/users admin-only (was staff-readable); rate-limit public petition-sign; retire legacy-token->admin path; guard gmail/send null-org; ingest-news reports failure honestly (no more success:true on 0-inserted) -
e0ef0092026-08-05 security(A-prime): scope login brute-force limiter per (ip,username) to kill tenant-wide lockout DoS; prefer cf-connecting-ip/x-real-ip over forgeable XFF; stop CRON_SECRET falling back to AUTH_PASSWORD -
f63804e2026-08-05 security: fix cycle-1 defects — add requireRole to 5 social routes (were pulse-open), validate norma-imp-by token in impersonate DELETE (privilege-escalation), HMAC-verify registry session (was 403-for-all + crafted-token bypass); add scratch-DB test instance + durable test suite -
d9cb4a22026-08-05 auto-save: 2026-08-05T13:12:15 (2 files) — scripts/test-instance.sh tests/ -
df259fc2026-08-05 login: standard username/password only (remove Google/Apple OAuth); harden /api/auth/login to 400 on non-JSON body -
19d20a62026-07-29 SECURITY incident 2026-07-29: agent-base fail-closed on empty AUTH_PASSWORD + bind 127.0.0.1 by default (was the empty-password all-interfaces RCE vector) -
0ecc4bb2026-07-23 instagram-agent fully LIVE: real token installed, monitor/discover/report un-stubbed (Steve-authorized), Graph v21 metrics fixed -
009cc0e2026-07-23 auto-save: 2026-07-23T08:19:35 (2 files) — agents/instagram-agent/skills/discover.js agents/instagram-agent/skills/monitor.js -
d6a46ba2026-07-23 auto-save: 2026-07-23T07:19:17 (1 files) — scripts/gmail-backfill.mjs -
71ee9902026-07-14 instagram-agent: env-configurable Graph host (IG_GRAPH_HOST) — support Facebook-Login flow (page token + IG business id) alongside Instagram-Login -
42967672026-07-13 instagram-agent: make reel skill account-aware (close cross-brand IG-token leak) -
4b35b8b2026-07-13 chore: v0.1.3 (dashboard CSS refactor) -
06efeb42026-07-13 refactor(agent-base): hoist static dashboard CSS to a module const -
3f1fb792026-07-13 chore: version bump (session close — SSRF guard + security P0 verification) -
d89eedb2026-07-12 docs(security): record P0#1-3 + P1 SSRF remediation as resolved in April audit -
339bfa12026-07-12 security(P1): add shared SSRF guard blocking private/reserved/loopback hosts on user-URL fetches -
e849e5e2026-07-12 chore: version bump (session close — Norma platform + agent recovery, login/schema-drift fixes, dashboard) -
56c18192026-07-11 Fix tier_credentials schema drift in users + gmail routes -
67b9d9d2026-07-11 Fix tier_credentials schema drift in auth + impersonate routes -
34faae12026-07-11 Fix tier_credentials schema drift in settings CRUD routes -
02aa4652026-07-11 auto-save: 2026-07-11T08:42:28 (1 files) — app/api/auth/login/route.ts -
a56a5b22026-07-10 dashboard: harden escaping for attribute context (contrarian gate) -
e1711092026-07-10 Norma dashboard: enrich GET / with insights + media grid (cache-backed) -
d5eb7cb2026-07-10 Norma instagram-agent: add RECOVERY.md (deps-location gotcha, auth, durability) -
c3b02e42026-07-10 agent-base: fix route shadowing + server-render status dashboard -
d870e862026-07-10 Norma agents: add read-only status dashboard at GET / (behind auth) -
6bfda492026-06-01 Global search: mount on Supervisor + Pulse tiers -
d1e1e9f2026-05-31 fix: add rel=noopener noreferrer to 32 target=_blank links in inbox mockup index; expand .gitignore backup patterns -
de055dc2026-05-30 security: strip hardcoded dw_admin DSN password -> env-first (.mjs straggler). No rotation/deploy. -
351dc6f2026-05-30 security: strip hardcoded dw_admin DSN password -> env-first/passwordless. No rotation/deploy. -
9f230e82026-05-30 security: strip hardcoded dw_admin DSN password -> env-first (DATABASE_URL); passwordless localhost fallback. No rotation/deploy. -
d7ebee02026-05-28 wire Morning Batch + weekly_intelligence to PM2 cron — fixes 77d/72d stale tables -
1c814a52026-05-28 norma-scraper: load .env.local via interpreter_args so SESSION_SECRET reaches the cron — fixes 401 loop -
9da39712026-05-21 defensive: explicit body[data-inbox-theme='classic-dense'] selector -
e7eb3fb2026-05-21 feat(theme): hoist InboxThemeBanner + AgeThemeSlider into app/layout.tsx -
da7d4032026-05-20 docs(sessions): log brute-force-protection learnings (commit a934a3b) -
a934a3b2026-05-20 feat(auth): brute-force-resistant login rate-limit (10 fails/15min per IP, 30min lockout) -
27ac3982026-05-20 tasks: mark #52 (admin impersonation UI) DONE -
983afae2026-05-20 feat(impersonate): wire the View-as dropdown + Acting-as banner into AppShell -
6427fe32026-05-20 session 2026-05-20: log roles+perms+modal-fanout+gmail-per-user+disk-save+admin-union -
491a4692026-05-20 docs+infra: gmail connect note (password redacted) + linter-touched messages route -
6daaa2a2026-05-20 fix(theme): apply 32 inbox-theme skins at body level so dropdown clicks visibly re-skin the whole page -
1b1cbbd2026-05-20 fix(theme): apply inbox-theme skins at body level so dropdown clicks re-skin the whole page immediately -
493c5ca2026-05-20 feat(theme): full-width inbox-theme banner at top of AppShell -
aff91062026-05-20 feat(theme): hoist inbox theme switcher to global AppShell header -
52b42ae2026-05-20 fix(gmail): scope Gmail CRM to current user's mailbox, not hardcoded natalia -
1a1a9c92026-05-20 feat(modals): fan out ResizableModal to 22 modals across 15 files -
48c4ff82026-05-20 feat(inbox): +16 themes (v17-v32) — total 32 live + dropdown-wired -
66f0f442026-05-20 feat(inbox): 10 more theme mockups (v7-v16) + live theme dropdown in GmailCRMTab -
c0401852026-05-20 session 2026-05-20: log roles/perms/modals + infra fires + 4 user seed -
0cc4fc02026-05-20 feat(mockups): 6 inbox UI variants — Classic Dense / Notion Cards / Linear Keyboard / Apple Mail / Front Conversation / Hey Zero-Distraction -
0b3e6f52026-05-20 feat(modals): shared ResizableModal with full-screen toggle + drag-resize -
364302c2026-05-20 feat(gmail): per-message Assign-to + per-user read receipts + inline-expand layout -
4cf48122026-05-20 feat(auth): intern role + user fields + admin-editable role × feature permissions matrix -
cfcf5512026-05-20 feat(admin): comprehensive API/Token/MCP registry + age-adaptive theme slider -
806aa472026-05-20 ux(gmail): land with full-width inbox — default showContacts to false so users see all mail first; Contacts toggle stays in toolbar for outreach drilldown -
be67c762026-05-20 session 2026-05-20: log 9 task entries (petition debounce, modal video, 4 pay-down todos) -
48eadf22026-05-20 docs: modal training one-pager for SDCC staff (companion to walkthrough video) -
4974b872026-05-20 fix(editor): set immediatelyRender:false on Tiptap useEditor — Next 15 + React 19 SSR hydration error blocked petition pipeline editor render -
e4d293d2026-05-20 fix(pipeline/reorder): cast org_id param as ::uuid not ::text — pipeline drag-drop was 500-ing for staff role with non-null orgId due to same uuid=text operator mismatch already fixed in pipeline/stats + settings -
8e332652026-05-20 petition create: debounce double-submit via useRef guard + 30-min server-side merge window -
bb7a05d2026-05-20 fix(api): cast org_id param as ::uuid not ::text in pipeline/stats + settings -
15fe5082026-05-20 docs: morning wakeup brief — DB password fix + verification path -
433445a2026-05-20 fix(pulse-public): silence 401 spam, unblock topics for guests, hide Apple OAuth stub, add sign-in CTA -
b7eda892026-05-20 fix(types): unblock SocialTab render, IntegrationsTab metadata, credentials rowCount null -
3defa0e2026-05-19 instagram-agent: enable live reel/story/post publishing via graph.instagram.com (Instagram Login API) -
36f759a2026-05-13 snapshot: 12 file(s) changed, ~12 modified -
e5b64d82026-05-06 initial scaffold (gitify-all 2026-05-06)
Authors
- auto-commit-fleet431
- Steve193
- steve4
Agents used
Skills used
- /instagram-agent429
- /ig-activity421
- /pulse11
- /posts9
- /login9
- /petitions9
- /route9
- /auth8
- /day7
- /messages7
- /live6
- /gmail6
- /spoonflower5
- /grants5
- /mockups5
- /inbox5
- /claude4
- /code4
- /page4
- /library4
- /cron4
- /index4
- /donations3
- /consent3
- /calendar3
- /package-lock3
- /registry3
- /send3
- /staff3
- /drafts3
Creative ideas + design notes
2626361 · 2026-09-14 · Stop video re-bloat on feature branch: gitignore cta/rec + demos videos (TK-11533)
27 demo/CTA videos were staged to commit on this branch with no gitignore rule — committing them would re-bloat the shared .git object store the main-branch purge just shrank (1.1G->168M). Unstage them (files kept on disk) + gitignore, matching main's e6e5582. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
437e1dc · 2026-09-10 · Add donation refund reconciliation slice (TK-11335 Section A, local-safe)
Sandbox-only mock provider refund ingest, mirroring the shipped one-time reconciliation rails. No money moves; real keys, live signature-verified webhooks, card collection, recurring billing, receipts, and prod deploy all remain gated milestone-2 work. - migration 030: append-only org-scoped organizing_donation_refunds ledger (cents, UNIQUE(org,provider,refund_ref) idempotency, FK->donations CASCADE), because a charge can be partially refunded multiple times. - ingestRefund(): throws outside the sandbox; org from the authenticated scope never a payload field; locks the target contribution FOR UPDATE so concurrent refunds are serialized and can't over-refund past the unrefunded balance (rejects over-balance 400); 404 on unknown/cross-tenant ref. - idempotency is identity-guarded (Cody red-team fix): a refund_ref already recorded against a DIFFERENT contribution is a 409 conflict, never a false "idempotent success" that silently drops the caller's refund. Guard applied to both the pre-insert dup check and the 23505 savepoint recovery. - refunds netted into report + workspace stats + Insights card (refunded_cents, net_received_cents). Pledge match left intact; auto-releasing a fulfilled pledge on full refund deferred to milestone 2. - tests: partial-nets, idempotent, over-balance 400, unknown-ref 404, tenant-scope 404, sequential cross-donation reuse 409, concurrent race (one 200 / one 409); sandbox-gate 409; migration 030 wired into harness. 17/17 campaign integration journeys pass; tsc clean; eslint 0 errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2c3739d · 2026-09-09 · chore: lint, refactor, v0.2.0 (session close)
Lint clean (0 errors). Refactor: consolidated duplicate validation import in reconcile.ts (behavior-preserving). Minor bump for the two backward-compatible features shipped this session (verified consent, donation reconciliation). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTfwQCiPbW99SJV5RYRe4L
b18aac0 · 2026-09-09 · Add donation reconciliation slice (TK-11335 Section A, local-safe)
Links a pledge (giving intention) to the real donation that fulfills it, with NO money movement. Reviewed by the contrarian (Cody) before commit; all three of its FIX-FIRST findings folded in and re-verified. - Migration 029: org-scoped organizing_donations ledger (cents), idempotent on (org, provider, provider_ref). A partial UNIQUE index on matched_participation_id makes one-time reconciliation race-proof (a pledge is fulfilled by at most one donation). Deliberately separate from the legacy non-tenant `donations` table to preserve tenant isolation. - lib/campaigns/reconcile.ts: deterministic FIFO matcher for ONE-TIME giving (org + email + exact amount, pledge-before-donation), with a savepoint/23505 catch so a concurrent race leaves a donation honestly unattributed rather than double-counting. Recurring (monthly) reconciliation is intentionally deferred to milestone 2 (one-to-many) — monthly donations show as unattributed, never falsely matched. ingestDonation is SANDBOX-ONLY (throws outside sandbox), uses the authenticated scope.org (never a payload org), and accepts a validated provider donated_at. - GET /api/campaigns/reconcile + POST /donations/ingest; workspace reconcile totals; a "Giving reconciliation" Insights card; RUNBOOK boundaries updated. Section B (real Stripe/ActBlue keys, live signature-verified webhook transport, card collection/recurring billing/refunds/receipts, prod deploy) stays gated. Verified on a fresh build: tsc clean, eslint 0 errors, 16/16 API journeys (match, idempotency, one-to-one, monthly-deferred, donated_at, tenant-scope), 8/8 Chromium+WebKit browser, production-default gate (ingest 409 outside sandbox). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTfwQCiPbW99SJV5RYRe4L
6d61307 · 2026-09-09 · Apply consent red-team fixes: fail-closed token secret + per-IP rate limit
Cody (contrarian) red-team of the verified-consent slice surfaced two real holes; both fixed and re-verified: 1. Token signing now FAILS CLOSED on a missing SESSION_SECRET (secret() helper) instead of falling back to the literal 'invalid' — that fallback would have minted a publicly-computable, forgeable consent token in a misconfigured deploy. SESSION_SECRET already underpins the auth cookies, so a real deployment always has it. 2. Public /api/consent (confirm/unsubscribe) now carries the same per-IP rate limiter as every other public write (consentRateLimit, 60/5min), reusing intake.ts's proven organizing_intake_limits pattern. 3. RUNBOOK documents that NORMA_PUBLIC_ORIGIN MUST be pinned before a live email provider is wired (Host-header phishing vector; moot while dispatch is sandbox-only). Re-verified on a fresh build with the fixes on disk: tsc clean, eslint 0 errors, 15/15 API journeys, 8/8 Chromium+WebKit browser tests, and the production-default gate (dispatcher refused outside sandbox). Verification evidence refreshed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTfwQCiPbW99SJV5RYRe4L
f6bd2e4 · 2026-09-09 · Add verified-consent state machine, immutable log, and sandbox-only mock provider
TK-11334 local-safe slice: supporter consent_state (none->pending->confirmed, sticky unsubscribe, bounce->suppressed) with an append-only organizing_consent_events log (BEFORE-UPDATE trigger enforces immutability). Public token-gated confirm/unsubscribe (/api/consent + /act/consent) and an organizer Send-confirmation dispatch that is a sandbox-only MOCK provider — deterministic delivered/bounced/failed result, logged, never sends live and throws outside the sandbox. Live email provider transmission stays gated. Verified: tsc, eslint 0 errors, 15/15 API journeys, 8/8 Chromium+WebKit browser tests, full pre-deploy gate green, and the non-sandbox dispatch-gate check. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VW8Ux2uR4hRuoTSPL62rPP
965f96d · 2026-08-18 · instagram: per-account 'what to post next from DW Shopify' notes board (/notes)
Human-authored posting plan per Instagram account. New account-notes.js (store + GET/POST /api/live/account-notes + GET /notes board) and notes-viewer.html — a 35-account grid with an auto-saving note textarea each, filter (all/with/without), search, per-card updated date+time stamp, and deep-links to that account's posts. Notes stored in data/account-notes.json (separate from the media caches so a refresh sweep never clobbers them). Cross-linked from /live + /calendar. Verified: read/save/clear round-trip, unknown-account 400, UI auto-save persists, board renders 35 cards no errors, public tunnel gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8cfcfe2 · 2026-08-18 · instagram: keep ALL accounts live via cron (not just DW)
- refreshAllAccounts(): serialized, per-account error-isolated sweep of the whole 35-account roster (incremental by default; full+onlyIncomplete for backfill). - live-media-refresh cron now sweeps ALL accounts hourly (was DW-only), so the cross-account /calendar stays live for the whole roster. - new live-media-backfill-sweep cron (daily 04:40): full-backfills up to 5 not-yet- complete accounts/run as a safety net; no-ops once all complete. Verified: one-shot incremental sweep = 35 accounts, +14 new, 0 errors, ~56s. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
835c032 · 2026-08-18 · instagram: cross-account post Calendar view (/calendar)
Day-major transpose of the /live board: a month calendar of what posted each day across all 35 IG accounts, with an all/select-accounts filter (color-dotted, localStorage-persisted), per-day count pills + thumbnails, and a click-through day drawer listing that day's posts across accounts (account chip, time, caption, stats, permalink). Read-only over the same per-account caches; no Graph API call on page view. New: calendar.js (monthView/dayView + routes), calendar-viewer.html. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8417463 · 2026-08-17 · Fix IG delete: target the Delete BUTTON, not the 'Delete post?' heading
The confirm dialog renders a heading 'Delete post? Are you sure...' whose ref
matched the broad /Delete/ selector BEFORE the actual Delete button, so the
script clicked a no-op heading ('clicked but not verified gone') and nothing
deleted. Now matches button "More options" / button "Delete" specifically.
Proven: @ffepurchasing 3/3 deleted + verified gone.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
04b7ade · 2026-08-17 · Harden IG delete-originals.js: retry stale refs, recover dead tabs, patient positive-signal login check
- clickByText() defeats the snapshot->click stale-ref race on IG's dynamic DOM - navigate()/snapshot() recover from openclaw 'tab not found' (dead shared tab) - preflight uses a retried positive login signal (app nav visible) instead of a too-early negative check that gave false 'not logged in' readings No change to deletion semantics/gates (canary-stops-1, verify-gone, skip-on-missing-Delete). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1e26b11 · 2026-08-17 · IG /spoonflower: server-inject data into the page so it renders without an authed XHR
Chrome strips URL-embedded basic-auth creds, so fetch('/api/spoonflower') 401'd and
the board showed empty. Now the route injects the JSON into #sf-data and the page
first-paints from that; the XHR is refresh-only and fails silently.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c573cf5 · 2026-08-17 · IG: add /spoonflower purge viewer (thumbnails + live delete-status board)
The 4 flagged Spoonflower posts are reshares (not in post-ledger.jsonl), so /posts can't show them. New /spoonflower route + board shows each with thumbnail, caption, reshare-vs-incidental-hashtag class, and pending/deleted status that updates live. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
eca6e1e · 2026-08-17 · chore: lint, refactor, v1.2.0 (session close)
- load() now surfaces a failed initial fetch via toast (was silent empty grid) - lint: all files parse clean, no autofixes needed; refactor: no change - minor bump for the /posts viewer + inline/bulk delete feature
c90044b · 2026-08-17 · IG: add serialized, per-account-aware Spoonflower delete script (openclaw)
Reads the confirmed hitlist and deletes via logged-in Chrome (··· -> Delete -> confirm -> verify gone). Serialized + fails loudly if not logged in as the owning account. --dry does a reachability probe that deletes nothing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ffc9303 · 2026-08-17 · Bulk-select delete on IG auto-post viewer
- Checkbox per card + bulk bar (select all shown / clear / delete selected) - Sequential deletion; LIVE mode paced 60s between deletes (Meta ban-safe) with live countdown + Stop button; tombstone mode runs back-to-back - Per-item failure surfaces inline (open in IG / remove anyway); button label + confirm text adapt to tombstone vs live mode - Verified in real Chrome: render, select, select-all, clear, mode label Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1b1e7d4 · 2026-08-17 · ig: wrong-image delete tooling — 4 posts (metallic/suede), pre-approved, hold execution
Steve 8/17 delete-all directive for incorrect image md5 c1e6edc. Runner is probe-only by default; --go is ungated/pre-approved but held until Steve says run. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b5cd441 · 2026-08-17 · IG reshare: blocklist Spoonflower (competitor) fleet-wide + scrub vendor file + add scan tool
Spoonflower is a print-on-demand competitor, not a DW vendor, but it was in dw-vendors.txt (and vendor_registry), so the reshare engine credited it on grassclothwallpaper/suedewallpaper. Added a code-level BLOCKLIST guard in attribute() in both hashtag-reshare.js and fabric-friday-reshare.js so a competitor is never credited/reshared even if it re-enters the vendor file. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ec91871 · 2026-08-17 · Gate live IG delete behind IG_LIVE_DELETE flag (default off, tombstone-only)
- Server refuses live deletes with 403 unless IG_LIVE_DELETE=1 - /api/posts reports liveEnabled; viewer hides the Live toggle + forces tombstone mode when disabled, with an inline note on how to enable Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8529d5a · 2026-08-17 · IG auto-post viewer with inline delete (GET /posts on :9810)
- GET /posts: per-account grid of all 275 auto-posts (post-ledger.jsonl), sort + density + account filter + search, created date+time on each card - Inline delete, two modes: tombstone (remove from viewer/ledger, no IG touch) and live (openclaw drives Chrome to delete on IG + verify gone, serialized) - GET /api/posts, GET /api/posts/oc-status, POST /api/posts/delete - Routes registered before start()'s 404 catch-all, behind existing Basic Auth Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8ac3cb3 · 2026-08-16 · ig(TK-10573): repost the held metallicwallpaper post; lift HOLD
@metallicwallpaper Diamond Vector (dwqw-58467-handle) reposted live with the corrected name+color+SKU caption -> https://www.instagram.com/p/DcG5n5VG3I_/ (new post-ledger row confirms). redo-results updated with the new permalink, HOLD set cleared, delete-viewer regenerated. All 85 old originals now have a confirmed replacement (or are the archived orphan) = safe to delete via openclaw. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0026909 · 2026-08-15 · ig(TK-10573): HOLD unpublished repost from delete tooling + commit redo viewers
The @metallicwallpaper Diamond Vector repost (DcAHGAcgUIc) landed in redo-results with new_permalink=null and NO post-ledger row — its corrected caption never published, but the product is still live/re-postable. Deleting its original would lose the post. gen-delete-viewer.js now marks it HOLD (red, excluded from Select-all) so it can't be swept into the openclaw deletion. Also commits the previously uncommitted redo tooling: delete-viewer.html, actions-today.html, install-schedules.sh. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0ff33f9 · 2026-08-15 · Norma IG cadence: 8s timeout on Boost fetch (Cody FIX-FIRST, yoloforever cycle 1)
3rd-party mybcapps endpoint on a 35-min launchd cron had no fetch timeout -> a hung call would stack zombie processes. AbortSignal.timeout(8000); abort falls through to the suggest.json fallback. TK-10588. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43de9ea · 2026-08-15 · Norma IG cadence: fresh-source via Boost API (fixes clean-product pool exhaustion)
Root cause: findProduct sourced only 10 candidates/keyword from suggest.json; as everPosted grew, narrow-keyword pools exhausted -> 'no clean product … all reused'. Fix pages the Boost SF-filter search API (50/page, thousands available) for the SAME keyword, applying the IDENTICAL leak/no-image guard to every candidate + suggest.json fallback. Widens the guard-gated pool WITHOUT loosening the private-label guard. DTD 7/9 Option C, Cody-scoped. TK-10588. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
564be77 · 2026-08-10 · TK-10395: cap reel container poll at 12x4s so 3x-retry worst case < client 240s
Contrarian find: waitForContainer default 30x4s=120s/attempt made the 3-attempt worst case ~375s > the reels-repo client 240s timeout, so the client could time out MID-legit-retry and mislabel a still-in-flight post 'posted-unverified'. Scope the reel poll to 12x4s=48s/attempt => 3x48+15s backoff=159s < 240s. Short 9:16 reels finish well under 48s. CODE-ONLY: going live needs a gated pm2 restart of norma-instagram (memo'd to pending-approval). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9897011 · 2026-08-10 · TK-10395: bounded retry-on-2207076 in reel skill (Meta transient media-upload failure)
createContainer+waitForContainer now retry up to 3x on IG error 2207076 / 'Media upload has failed' / processing-timeout; publish only fires after a FINISHED container so retry is double-post-safe. Approved by Steve. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cbfbf08 · 2026-08-08 · Norma pre-deploy gate: run durable smoke battery before any live restart
Makes the TK-10293 suites actually DURABLE by wiring them into the deploy path
so a REGRESSION (not just a broken build) can't reach :7400:
- scripts/predeploy-gate.sh (npm run gate): spins an isolated instance on its
own port (sdcc_test, all sends sinked, reuses test-instance.sh), runs the full
battery (api/regression/write/crud/authz/e2e), tears down via EXIT trap, exits
non-zero on the first failing suite. Readiness gates on Next's "Ready" marker +
two consecutive /login 200s + settle (a single non-000 poll raced the boot and
ECONNREFUSED'd the early suites).
- scripts/deploy-local.sh (npm run deploy:local): build -> gate -> restart+health.
- scripts/reload.sh: SKIP_BUILD hook so deploy:local doesn't build twice; stays
the fast no-gate emergency-recovery path.
- scripts/test-instance.sh: PORT now overridable (${PORT:-7411}) for the gate.
Verified: gate exits 0 all-green on a clean tree and 1 (BLOCKED) when a suite
fails; live :7400 never touched (isolated ports + sdcc_test).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f2f2df6 · 2026-08-08 · deploy hygiene (TK-10370): build-then-restart-then-health-gate reload + silence lockfile-root warning
- scripts/reload.sh (npm run reload): builds FIRST (broken build never reaches live), restarts pm2 norma-email, then health-gates :7400 and fails loud if it doesn't answer — closes the TK-10293 gap where a stale .next after a dep change crash-looped with no deploy-time signal. - next.config.ts: outputFileTracingRoot=import.meta.dirname to pin the tracing root and silence the stray-lockfile "inferred workspace root" warning. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
efc419d · 2026-08-06 · chore: refactor (drop dead testpulse login in api-smoke) + v0.1.4 (session close)
Lint via subagent hit an internal error; next build typechecked all touched files successfully this session, so types are clean. Refactor: removed one unused login call. All 6 suites green after: api 195 / write 216 / crud 35 / authz 12 / regression 20 / e2e 9.
a945908 · 2026-08-06 · test(cycle7 Cody-gate): mutation role-matrix + isolation positive-control
Cody VERIFIED 3 real gaps: (1) matrix was GET-only — 216 mutation handlers untested for role-gating; (2) tenant-isolation passed VACUOUSLY (asserted B absent but never that staff sees an A record — an empty-for-everyone list passes falsely); (3) bespoke-auth routes (/api/registry) silently skipped. - Matrix now covers mutations too: for each POST/PUT/PATCH/DELETE handler, every DISALLOWED role must 403 (requireRole rejects before any write/send side-effect, so probing is safe). 180 GET + 201 mutation handlers, 0 under-restrictions. - Isolation positive control: admin creates a tenant-A AND a tenant-B record; assert staff(A) SEES the A record (list + by-id 200) BEFORE asserting B is absent (by-id 404/403 + not in list). Kills the vacuous-truth trap. Both records cleaned up. - Added /api/registry (bespoke admin-only auth) as an explicit matrix entry. Full battery (6 suites): api 195 / write 216 / crud 35 / authz 12 / regression 20 / e2e 9.
f7e95d8 · 2026-08-06 · test(cycle7): authorization-matrix + tenant-isolation suite (real tenant fixtures)
test:authz (tests/api-authz-matrix.mjs) — the security coverage the null-org fixtures couldn't give. Self-provisions two tenant accounts in sdcc_test and scopes teststaff to tenant A BEFORE login (org_id is baked into the session token at login). 1) ROLE MATRIX: derives each GET route's allowed roles from its requireRole(...) call (resolving ...VAR spreads to their local const) and asserts admin/staff/pulse each get the right access across 179 guarded routes. 0 under-restrictions (no disallowed role ever bypasses 403 = no privilege-escalation) + 0 over-restrictions. 2) TENANT ISOLATION: admin creates a tenant-B-owned donation + grant; asserts staff scoped to tenant A CANNOT read them by id (404/403) and they never leak into staff's list. Parser fix: ...ROLES is NOT always all roles — email-analyzer files define a local const ROLES=['admin','staff']; the resolver reads the local const so pulse's correct 403 isn't miscounted as over-restriction. Full battery (6 suites): api 195 / write 216 / crud 35 / authz 8 / regression 20 / e2e 9.
2a8a6c7 · 2026-08-06 · test(cycle6 Cody-gate): CRUD tests real org id-space; non-hollow admin E2E
Cody VERIFIED the CRUD suite only tested the null/global path (which no real tenant takes) and the admin E2E was hollow (silent skip + fixed sleep + body-visible-always-true). - CRUD: scope each entity with the id-space its org_id FK actually requires — donations/ grants now POST with a real nonprofit_accounts.id (201, genuine org-scoped write path), clients/library with a real organizations.id, journalists org-less. Proves the routes work under real tenant scoping (not org=null). 35 assertions green. - admin E2E: removed the silent-skip; each navigated tab must settle #main-content to non-empty content, and >=3 tabs must be navigated (can't pass by skipping all). Waits on networkidle, not a fixed timeout. - Expanded the gated memo: the split FK makes a coherent staff org_id impossible (all seeded users have org_id=null; null-org staff reads cross-tenant) — a second-order symptom of the same data-model bug, gated to Steve (not app-fixable without the schema decision). Full battery: api 195 / write 216 / crud 35 / regression 20 / e2e 9.
e958e07 · 2026-08-06 · test(cycle6): CRUD lifecycle suite (create->read->update->delete) + admin E2E journey
test:crud (tests/api-crud-lifecycle.mjs) — the 'does the write actually WORK' coverage write-smoke doesn't give. Full round-trip per entity: CREATE (real payload) -> READ-BACK (field persisted) -> UPDATE -> DELETE -> CONFIRM-GONE (404). Self-cleaning. 5 core entities (clients/donations/grants/library/journalists), per-entity org scope. 35 assertions green. It surfaced a FLEET-WIDE data-model bug (VERIFIED): org_id FKs are split across two org tables — contacts/donations/drafts/grants/petitions/sessions -> nonprofit_accounts, but library_items -> organizations, and the app scopes by organizations. So org-scoped CREATE on the nonprofit_accounts-FK tables 500s (donations/grants reproduced). Expanded the gated memo (pending-approval/norma-sessions-org-fk-datamodel.md) from sessions-only to all 6 tables — schema decision, NOT auto-fixed. Suite runs those entities org-less (valid global path) so it proves CRUD logic; org-scoped assertions get added once the FK is reconciled. test:e2e — added admin.spec.ts: login -> app shell -> navigate Grants/Donations/Petitions/ News tabs, assert no console errors. E2E now 9 specs. Full battery: api 195 / write 216 / crud 35 / regression 20 / e2e 9.
d26f6c6 · 2026-08-06 · fix(cycle5 Cody-gate): truly-empty-body probe + readJson across 93 routes
Cody VERIFIED my write-smoke gave false confidence: the admin probe sent '{}' (valid
JSON), so it MISSED routes that crash on an absent body — the real prod scenario. He
reproduced no-body 500s on clients/drafts/grants/donations-insights POST.
- Suite: admin+unauth probe now sends NO body (undefined), replicating a client omitting
the body — the case that makes unguarded request.json() throw -> 500.
- readJson() codemod across ALL 93 non-excluded routes still on raw request.json()
(returns {} on empty; behavior-preserving for valid JSON). lib/body.ts default T=any so
the swap is type-neutral. Cody's 4 now return 400, not 500.
- sessions.org_id FK inconsistency (references nonprofit_accounts, not organizations) is a
data-model decision -> drafted to pending-approval (norma-sessions-org-fk-datamodel.md),
not auto-migrated. The 23503->409 guard stays (stops the crash; feature still gated).
- pulse public topics: redirect:'manual' stops the crash but the section shows nothing
because /api/petitions/topics is auth-gated — flagged as a follow-up (public topics
source needed), NOT claimed as fully fixed.
Full battery green: api-smoke 195 / write-smoke 216 (no-body probe) / regression 20 / e2e 8.
959da8b · 2026-08-06 · test+fix(cycle5): write-path smoke (216 mutations) + Playwright E2E (3 tiers) + fixes surfaced
WRITE-PATH (tests/api-write-smoke.mjs, npm run test:write): enumerates all 216
mutating (route,verb) pairs; asserts every one gates unauth (4xx, never 2xx/500) and
does not 500 on an empty body. Empty bodies keep it side-effect-free; external/AI/send
families are probed unauth-only (never fired). Resolves a real org id so tenant-path
inserts satisfy FKs (the null-org blind spot Cody flagged, applied to writes).
Fixes it surfaced (all reversible, verified on :7411):
- lib/body.ts readJson(): safe body parse ({} on empty, typed error on malformed).
Applied to 5 routes that crashed on empty body via unguarded request.json()
(outreach-pipeline, settings/news-watch-people, social/competitors, social/posts,
pulse/tracked).
- webhooks/pulse-topic: not-configured 500 -> 503. contacts/import: wrong content-type
500 -> 415. donations/insights: removed org_id filter (table has no org_id column) +
readJson. community: guarded the unauth proxy to :7400 (non-JSON/upstream-fail -> 502,
not a 500 crash). sessions: FK violation (23503) -> 409, not 500.
E2E (playwright.config.ts + tests/e2e/, npm run test:e2e): chromium installed + working
in this env. 8 specs — admin/staff/pulse login + land + no console errors; pulse-tier
lands on /pulse; wrong creds surface an error; public /pulse,/pulse/petitions,/pulse/about
render with no login wall. Caught a real public-surface bug: /pulse fetched the auth-gated
/api/petitions/topics which 307s to HTML /login -> JSON parse crash; fixed with
redirect:'manual' so the existing .ok guard degrades gracefully.
Suites: api-smoke 195 / write-smoke 216 / regression 20 / e2e 8 — all green.
39264f3 · 2026-08-06 · fix(api)+test: close Cody-gate gaps — all 14 uuid=text casts + org-scoped smoke + deterministic fixture
Cody (contrarian gate) VERIFIED my first pass fixed only 1 of 14 identical $N::text-forces-uuid=text casts, and that the 500-only suite MISSED analytics/charts (safeQuery swallows the error → HTTP 200 + _queryErrors:5 → blank dashboard for any org-scoped admin, live on :7400). - Fixed the remaining 13 casts: analytics/charts (5), pipeline approve(2)/dispatch(4)/ schedule(1), library PATCH+DELETE (2). Now $N::uuid IS NULL OR org_id = $N::uuid. - api-smoke: admin requests now send x-org-id (exercise the tenant-scoped path where the casts actually fire — null-org fixtures left them dormant); a 200 body with _queryErrors>0 is now a hard failure (catches swallowed errors the 500-check missed). - test-instance.sh: fixture preflight ensures idempotent migrations 024+025 on boot and FAILS FAST + LOUD if required schema is still absent, so a recreated sdcc_test can't silently regress the suite (Cody risk #3). Verified on :7411: analytics/charts org-scoped _queryErrors 5→0; api-smoke 0 crashes + 0 swallowed across 195 GET routes; security-regression 20/20.
eb853c3 · 2026-08-06 · fix(api): 4 GET-500s surfaced by api-smoke (onboard/library real; auth-google/clickup status)
- onboard/[id]: SELECT referenced organizations.employee_count (never existed) -> o.staff_size AS employee_count. Crashed on every request, live too. - library/[id]: $2::text forced the param to text -> 'uuid = text' operator error -> $2::uuid IS NULL OR org_id = $2::uuid. Crashed on every request, live too. - auth/google + clickup: missing-integration-config is a dependency state -> 503 not 500. clickup guarded in both GET and POST. Verified on :7411: api-smoke 27->0 crashes; security-regression 20/20 (no regressions). Fixture gap (role_permissions / gmail assigned_*) = migrations 024+025 not applied to sdcc_test; patched scratch DB, no app change.
8bbee18 · 2026-08-06 · test(api-smoke): durable fs-enumerated GET sweep over all 271 routes (test:api/test:smoke)
Enumerates every app/api/**/route.ts at runtime (auto-covers new routes), hits
each GET as {anon,admin} against :7411, hard-fails on any 500, and emits a
visibility census of GET routes that answer 200 unauthenticated. Uses a valid-
format nil UUID for [id] segments so healthy routes 404 rather than pg-cast 500.
4296767 · 2026-07-13 · instagram-agent: make reel skill account-aware (close cross-brand IG-token leak)
- resolveAccount(account): 'dw' → IG_USER_ID/IG_ACCESS_TOKEN (unchanged);
other id X → IG_USER_ID_<X> / IG_ACCESS_TOKEN_<X> (X=upper, dashes→underscores),
mirroring dw-marketing-reels publish-social.mjs IG_AGENT_AUTH_<ID> naming.
- non-dw account with NO token now returns { status:'no-creds-for-account',
account, note } instead of silently posting from the DW account (the bug).
- echoes resolved account in response + logs; dw single-account simulation/live
path 100% intact. node --check passes; verified via in-process skill calls.
06efeb4 · 2026-07-13 · refactor(agent-base): hoist static dashboard CSS to a module const
Behavior-preserving — moves the 26-line inline <style> block out of the per-request GET / handler into a DASHBOARD_CSS const (defined once, not rebuilt per page load). Rendered HTML identical; verified node --check + norma-instagram boots + GET / 200 with CSS intact. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
339bfa1 · 2026-07-12 · security(P1): add shared SSRF guard blocking private/reserved/loopback hosts on user-URL fetches
Wire lib/ssrf-guard.assertPublicUrl() into /api/nonprofit/enrich and /api/email-analyzer/fetch-url before the outbound fetch. Blocks non-http(s) protocols, localhost, RFC1918 (10/172.16-31/192.168), loopback (127/::1), link-local + cloud-metadata (169.254.0.0/16 incl. 169.254.169.254), and other reserved ranges; resolves DNS so hostnames pointing at private IPs are also blocked. Verified: private/reserved/file:// -> 400, public URL -> 200. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
56c1819 · 2026-07-11 · Fix tier_credentials schema drift in users + gmail routes
users: drop full_name/email/is_active; name from display_name, email from email-shaped username, no is_active filter. gmail messages/[id]/assign/oauth: swap full_name->display_name in COALESCE, resolve email from username (no tier_credentials.email), drop is_active filter on the assign target lookup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
67b9d9d · 2026-07-11 · Fix tier_credentials schema drift in auth + impersonate routes
login: remove dead is_active block + swap row.full_name -> display_name. session: drop full_name/email from SELECT (email inferred from username). impersonate: drop is_active from SELECT + remove disabled-account guard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34faae1 · 2026-07-11 · Fix tier_credentials schema drift in settings CRUD routes
Drop full_name/email/is_active/last_login_at/created_by column refs that do not exist in this deployment. SELECT/INSERT/dynamic-UPDATE/RETURNING now match the real schema; admin-disable guard removed (no is_active). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a56a5b2 · 2026-07-10 · dashboard: harden escaping for attribute context (contrarian gate)
Contrarian flagged attribute-context XSS: esc() escaped &<> but not quotes, while permalink->href and thumb->src render in double-quoted attributes; in live mode discover() pulls hashtag-search results (other users' captions/ permalinks) and helmet CSP is disabled, so an injection would be unmitigated. Fixes: esc() now also escapes " and ', and href/src accept only http(s) URLs (blocks javascript: scheme). Proven via headless Playwright with a hostile payload: no dialog, window.__pwned=false, 0 rogue img[onerror]/script nodes, malicious permalink -> href='#', caption rendered as literal escaped text. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e171109 · 2026-07-10 · Norma dashboard: enrich GET / with insights + media grid (cache-backed)
Steve: dashboard was 'very little info, no images'. Now: - shared agent-base gains a generic dashboard() hook: renders a metrics[] stat-card row + a media[] thumbnail grid + live/simulation badge. Base stays generic (no IG specifics); agents supply the data. - instagram-agent supplies dashboard(): reads cache-backed monitor insights (reach/impressions/followers/etc) + discover media. DTD-committed (2/2) CACHE design: crons persist latest result to data/*.json; GET / reads the cache and NEVER fires a metered Graph API call from a page view. Simulation computes on-empty (free/local). Non-loading sim media_url -> placeholder tile. - data/ gitignored (runtime cache). Verified (simulation): mode badge, 6 metric cards, media grid w/ captions, cache files written, GET / 200 authed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d5eb7cb · 2026-07-10 · Norma instagram-agent: add RECOVERY.md (deps-location gotcha, auth, durability)
Documents the shared/node_modules dependency-resolution gotcha the contrarian flagged: npm install in agents/shared/ (not the agent dir) when non-dotenv deps go missing. Also records the .env/empty-password trap + reboot durability + the dw-uptime-probe watchlist follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c3b02e4 · 2026-07-10 · agent-base: fix route shadowing + server-render status dashboard
Contrarian gate caught two real defects:
- app.use('*') 404 catch-all was registered inside createAgentServer,
shadowing caller-added routes: instagram-agent /api/skill/reel + /story
were 404. Now deferred to start() (called last) -> custom routes win.
Verified reel/story now 200, bogus routes still 404.
- GET / dashboard fetched /api/status client-side, which was fragile re:
Basic-auth on sub-requests. Now server-renders data inline (const S).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d870e86 · 2026-07-10 · Norma agents: add read-only status dashboard at GET / (behind auth)
Renders /api/status + cron + recent audit client-side; no write controls. Fixes the 'open it in a browser -> 401/404' gap. Shared base, so all 11 agents inherit it; only norma-instagram is currently live. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6bfda49 · 2026-06-01 · Global search: mount on Supervisor + Pulse tiers
Norma had GlobalSearch wired only into AppShell (admin) and NikkiShell (staff). Extend to the remaining two tiers: - Supervisor: import GlobalSearch and render it top-right of app/supervisor/page.tsx. onNavigate pushes /?tab=<id>&id=<id>; teach AppShell to read those params on mount so deep-links land on the right tab. - Pulse: build a new PulseSearch component that matches the Pulse Georgia-serif / cream / dark-green / gold theme (the existing GlobalSearch is dark-themed and would clash). Hits a new /api/search/public route that requires no auth and only returns entities safe for end-users: petitions, politicians, organizations, topics, articles. Intentionally excludes journalists, contacts, grants, foundations — those are staff/admin tooling. Files: app/api/search/public/route.ts (new — 5-entity public search) components/PulseSearch.tsx (new — Pulse-themed search bar + modal) components/AppShell.tsx (read ?tab=&id= deep-link params) app/supervisor/page.tsx (mount GlobalSearch top-right) app/pulse/layout.tsx (mount PulseSearch in nav) Cmd+K / Ctrl+K opens search on both surfaces. Esc closes, arrow keys navigate, Enter selects. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
File tree
- .gitignore
- CHANGES.md
- CHANGES2.md
- CLAUDE.md
- NORMA-WAKEUP-2026-05-20.md
- README.md
- agents/bluesky-agent/ecosystem.config.js
- agents/bluesky-agent/lib/bluesky.js
- agents/bluesky-agent/package-lock.json
- agents/bluesky-agent/package.json
- agents/bluesky-agent/server.js
- agents/bluesky-agent/skills/post.js
- agents/datasource-agent/ecosystem.config.js
- agents/datasource-agent/lib/api-registry.js
- agents/datasource-agent/lib/frontpage-parser.js
- agents/datasource-agent/lib/newspaper-registry.js
- agents/datasource-agent/lib/petition-registry.js
- agents/datasource-agent/package-lock.json
- agents/datasource-agent/package.json
- agents/datasource-agent/server.js
- agents/datasource-agent/skills/collect-statements.js
- agents/datasource-agent/skills/discover-apis.js
- agents/datasource-agent/skills/rate-sources.js
- agents/datasource-agent/skills/report.js
- agents/datasource-agent/skills/scrape-frontpages.js
- agents/datasource-agent/skills/scrape-petitions.js
- agents/discord-agent/ecosystem.config.js
- agents/discord-agent/lib/discord.js
- agents/discord-agent/package-lock.json
- agents/discord-agent/package.json
- agents/discord-agent/server.js
- agents/discord-agent/skills/discover.js
- agents/discord-agent/skills/monitor.js
- agents/discord-agent/skills/post.js
- agents/discord-agent/skills/reply.js
- agents/discord-agent/skills/report.js
- agents/facebook-agent/ecosystem.config.js
- agents/facebook-agent/package-lock.json
- agents/facebook-agent/package.json
- agents/facebook-agent/server.js
- agents/facebook-agent/skills/discover.js
- agents/facebook-agent/skills/monitor.js
- agents/facebook-agent/skills/post.js
- agents/facebook-agent/skills/report.js
- agents/instagram-agent/.gitignore
- agents/instagram-agent/IG-FLEET-OPENCLAW-RUNBOOK.md
- agents/instagram-agent/IG-RESHARE-OPS.md
- agents/instagram-agent/POSTING.md
- agents/instagram-agent/RECOVERY.md
- agents/instagram-agent/UNLINKED-PAGES-CHECKLIST.md
- agents/instagram-agent/account-notes.js
- agents/instagram-agent/account-themes.json
- agents/instagram-agent/accounts.js
- agents/instagram-agent/accounts.json
- agents/instagram-agent/backfill-all.js
- agents/instagram-agent/build-ig-data.js
- agents/instagram-agent/build-manifest.json
- agents/instagram-agent/build-registry.js
- agents/instagram-agent/calendar.js
- agents/instagram-agent/comment-reply.js
- agents/instagram-agent/content.js
- agents/instagram-agent/daily-cadence.js
- agents/instagram-agent/data/account-hashtags.json
- agents/instagram-agent/data/dw-vendors.txt
- agents/instagram-agent/delete-current-account.js
- agents/instagram-agent/delete-gate2-graph.js
- agents/instagram-agent/delete-novasuede-graph.js
- agents/instagram-agent/delete-originals.js
- agents/instagram-agent/delete-spoonflower.js
- agents/instagram-agent/delete-wrong-image.js
- agents/instagram-agent/deploy/com.steve.dw-ig-cadence.plist
- agents/instagram-agent/deploy/com.steve.dw-ig-fabricfriday-reshare.plist
- agents/instagram-agent/deploy/com.steve.dw-ig-phase1-check.plist
- agents/instagram-agent/deploy/com.steve.dw-ig-reply-fleet.plist
- agents/instagram-agent/deploy/com.steve.dw-ig-reshare-fleet.plist
- agents/instagram-agent/deploy/install-schedules.sh
- agents/instagram-agent/ecosystem.config.js
- agents/instagram-agent/fabric-friday-reshare.js
- agents/instagram-agent/find-dup-images.js
- agents/instagram-agent/finish-fabric-fridays.sh
- agents/instagram-agent/gen-actions-viewer.js
- agents/instagram-agent/gen-delete-batches.js
- agents/instagram-agent/gen-delete-viewer.js
- agents/instagram-agent/gen-ig-activity.js
- agents/instagram-agent/hashtag-reshare.js
- agents/instagram-agent/live-media.js
- agents/instagram-agent/monitor-reshares.js
- agents/instagram-agent/onboarding-kits.json
- agents/instagram-agent/package-lock.json
- agents/instagram-agent/package.json
- agents/instagram-agent/phase1-check.sh
- agents/instagram-agent/post-to.js
- agents/instagram-agent/posts-api.js
- agents/instagram-agent/probe-unlinked.js
- agents/instagram-agent/public/actions-today.html
- agents/instagram-agent/public/calendar-viewer.html
- agents/instagram-agent/public/delete-viewer.html
- agents/instagram-agent/public/ig-activity.json
- agents/instagram-agent/public/live-viewer.html
- agents/instagram-agent/public/notes-viewer.html
- agents/instagram-agent/public/posts-viewer.html
- agents/instagram-agent/public/spoonflower-viewer.html
- agents/instagram-agent/reconcile-gate2.js
- agents/instagram-agent/redo-last5.js
- agents/instagram-agent/reply-fleet.js
- agents/instagram-agent/reshare-erase.js
- agents/instagram-agent/reshare-fleet.js
- agents/instagram-agent/scan-spoonflower.js
- agents/instagram-agent/server.js
- agents/instagram-agent/setup-ig-token.js
- agents/instagram-agent/skills/_ig-api.js
- agents/instagram-agent/skills/discover.js
- agents/instagram-agent/skills/monitor.js
- agents/instagram-agent/skills/post.js
- agents/instagram-agent/skills/reel.js
- agents/instagram-agent/skills/report.js
- agents/instagram-agent/skills/story.js
- agents/instagram-agent/spoonflower-api.js
- agents/moveon-agent/ecosystem.config.js
- agents/moveon-agent/lib/moveon.js
- agents/moveon-agent/package-lock.json
- agents/moveon-agent/package.json
- agents/moveon-agent/server.js
- agents/moveon-agent/skills/discover.js
- agents/moveon-agent/skills/monitor.js
- agents/moveon-agent/skills/post.js
- agents/moveon-agent/skills/report.js
- agents/onboard-agent/ecosystem.config.js
- agents/onboard-agent/lib/foundation-matcher.js
- agents/onboard-agent/lib/ntee-matcher.js
- agents/onboard-agent/lib/propublica.js
- agents/onboard-agent/package-lock.json
- agents/onboard-agent/package.json
- agents/onboard-agent/server.js
- agents/onboard-agent/skills/discover.js
- agents/onboard-agent/skills/monitor.js
- agents/onboard-agent/skills/post.js
- agents/onboard-agent/skills/reply.js
- agents/onboard-agent/skills/report.js
- agents/price-agent/ecosystem.config.js
- agents/price-agent/lib/ca-schools-registry.js
- agents/price-agent/lib/change-detector.js
- agents/price-agent/lib/html-parser.js
- agents/price-agent/lib/scorecard-fields.js
- agents/price-agent/package-lock.json
- agents/price-agent/package.json
- agents/price-agent/server.js
- agents/price-agent/skills/crawl-ccc.js
- agents/price-agent/skills/crawl-csu.js
- agents/price-agent/skills/crawl-federal.js
- agents/price-agent/skills/crawl-scorecard.js
- agents/price-agent/skills/crawl-uc.js
- agents/price-agent/skills/detect-changes.js
- agents/price-agent/skills/enrich.js
- agents/price-agent/skills/report.js
- agents/reddit-agent/ecosystem.config.js
- agents/reddit-agent/lib/reddit.js
- agents/reddit-agent/package-lock.json
- agents/reddit-agent/package.json
- agents/reddit-agent/server.js
- agents/reddit-agent/skills/discover.js
- agents/reddit-agent/skills/monitor.js
- agents/reddit-agent/skills/post.js
- agents/reddit-agent/skills/reply.js
- agents/reddit-agent/skills/report.js
- agents/shared/agent-base.js
- agents/shared/ai.js
- agents/shared/audit-logger.js
- agents/shared/credentials.js
- agents/shared/cron-scheduler.js
- agents/shared/db.js
- agents/shared/package-lock.json
- agents/shared/package.json
- agents/shared/pulse-reporter.js
- agents/shared/rate-limiter.js
- agents/twitch-agent/ecosystem.config.js
- agents/twitch-agent/lib/twitch.js
- agents/twitch-agent/package-lock.json
- agents/twitch-agent/package.json
- agents/twitch-agent/server.js
- agents/twitch-agent/skills/discover.js
- agents/twitch-agent/skills/monitor.js
- agents/twitch-agent/skills/post.js
- agents/twitch-agent/skills/reply.js
- agents/twitch-agent/skills/report.js
- agents/twitter-agent/ecosystem.config.js
- agents/twitter-agent/lib/twitter.js
- agents/twitter-agent/package-lock.json
- agents/twitter-agent/package.json
- agents/twitter-agent/server.js
- agents/twitter-agent/skills/discover.js
- agents/twitter-agent/skills/monitor.js
- agents/twitter-agent/skills/post.js
- agents/twitter-agent/skills/reply.js
- agents/twitter-agent/skills/report.js
- app/act/[id]/page.tsx
- app/act/consent/page.tsx
- app/api/accounts/[id]/keywords/route.ts
- app/api/accounts/route.ts
- app/api/action-center/[id]/route.ts
- app/api/action-network/route.ts
- app/api/admin/impersonate/route.ts
- app/api/admin/permissions/route.ts
- app/api/agents/advocacy/generate/route.ts
- app/api/agents/congress-by-zip/route.ts
- app/api/agents/grants/match/route.ts
- app/api/agents/org/register/route.ts
- app/api/agents/petition/generate/route.ts
- app/api/ai-chat/route.ts
- app/api/ai/generate/route.ts
- app/api/alerts/route.ts
- app/api/analytics/charts/route.ts
- app/api/archives/[id]/route.ts
- app/api/archives/route.ts
- app/api/articles/discover/route.ts
- app/api/articles/link/route.ts
- app/api/audit/route.ts
- app/api/auth/google/callback/route.ts
- app/api/auth/google/route.ts
- app/api/auth/login/route.ts
- app/api/auth/logout/route.ts
- app/api/auth/session/route.ts
- app/api/boilerplate/route.ts
- app/api/campaigns/[[...path]]/route.ts
- app/api/census/route.ts
- app/api/chat/route.ts
- app/api/clickup/route.ts
- app/api/clients/[id]/route.ts
- app/api/clients/route.ts
- app/api/collaborations/discover/route.ts
- app/api/collaborations/route.ts
- app/api/community/route.ts
- app/api/congress/route.ts
- app/api/connections/deep-insights/route.ts
- app/api/connections/entity/[type]/[id]/route.ts
- app/api/connections/graph/route.ts
- app/api/connections/opportunities/route.ts
- app/api/connections/power-map/route.ts
- app/api/connections/viz/route.ts
- app/api/consent/route.ts
- app/api/contacts/[id]/route.ts
- app/api/contacts/counts/route.ts
- app/api/contacts/coworkers/route.ts
- app/api/contacts/enrich/route.ts
- app/api/contacts/import/route.ts
- app/api/contacts/related/route.ts
- app/api/contacts/route.ts
- app/api/cron/credential-health/route.ts
- app/api/cron/daily/route.ts
- app/api/cron/dispatch-scheduler/route.ts
- app/api/cron/gmail-sync/route.ts
- app/api/cron/ingest-news/route.ts
- app/api/data-explorer/apis/route.ts
- app/api/data-explorer/frontpages/route.ts
- app/api/data-explorer/route.ts
- app/api/datasource/[id]/route.ts
- app/api/datasource/route.ts
- app/api/datasource/stats/route.ts
- app/api/dispatch/route.ts
- app/api/donations/[id]/route.ts
- app/api/donations/insights/[id]/route.ts
- app/api/donations/insights/route.ts
- app/api/donations/route.ts
- app/api/drafts/[id]/export/route.ts
- app/api/drafts/[id]/route.ts
- app/api/drafts/[id]/send-test/route.ts
- app/api/drafts/[id]/versions/route.ts
- app/api/drafts/auto-generate/route.ts
- app/api/drafts/route.ts
- app/api/drive/search/route.ts
- app/api/email-analyzer/drafts/[id]/route.ts
- app/api/email-analyzer/drafts/route.ts
- app/api/email-analyzer/fetch-url/route.ts
- app/api/email-analyzer/learnings/route.ts
- app/api/email-analyzer/references/route.ts
- app/api/email-analyzer/rewrite/route.ts
- app/api/email-analyzer/score/route.ts
- app/api/email-analyzer/search/route.ts
- app/api/email-analyzer/skills/route.ts
- app/api/email-analyzer/subject-lines/generate/route.ts
- app/api/email-analyzer/subject-lines/route.ts
- app/api/email-analyzer/suggestions/route.ts
- app/api/email-analyzer/universal-references/route.ts
- app/api/email-sends/route.ts
- app/api/fred/route.ts
- app/api/generate/route.ts
- app/api/geo/advocacy/route.ts
- app/api/geo/crosswalk/route.ts
- app/api/geo/hotspots/route.ts
- app/api/geo/moveon/route.ts
- app/api/geo/orchestrate/route.ts
- app/api/geo/report-card/route.ts
- app/api/geo/scatter/route.ts
- app/api/geo/state-heat/route.ts
- app/api/geo/topic-grid/route.ts
- app/api/geo/trends/route.ts
- app/api/globe/countries/route.ts
- app/api/globe/country/[code]/route.ts
- app/api/globe/states/[code]/route.ts
- app/api/globe/states/route.ts
- app/api/gmail/contacts/route.ts
- app/api/gmail/draft-reply/route.ts
- app/api/gmail/mailboxes/route.ts
- app/api/gmail/messages/[id]/assign/route.ts
- app/api/gmail/messages/[id]/mark-read/route.ts
- app/api/gmail/messages/[id]/route.ts
- app/api/gmail/messages/route.ts
- app/api/gmail/oauth/callback/route.ts
- app/api/gmail/oauth/route.ts
- app/api/gmail/send/route.ts
- app/api/gmail/sync-status/route.ts
- app/api/gmail/sync/route.ts
- app/api/grants/[id]/proposals/[pid]/export/route.ts
- app/api/grants/[id]/proposals/[pid]/route.ts
- app/api/grants/[id]/proposals/[pid]/send/route.ts
- app/api/grants/[id]/proposals/generate/route.ts
- app/api/grants/[id]/proposals/route.ts
- app/api/grants/[id]/route.ts
- app/api/grants/calendar/route.ts
- app/api/grants/route.ts
- app/api/grants/student-finder/route.ts
- app/api/grants/suggest/route.ts
- app/api/graph/ideas/route.ts
- app/api/graph/journalist/[id]/route.ts
- app/api/graph/mindmap-enhanced/route.ts
- app/api/graph/partners/route.ts
- app/api/graph/pipeline-overlay/route.ts
- app/api/graph/pulse-overlay/route.ts
- app/api/ingest/action-network/route.ts
- app/api/ingest/charity-navigator/route.ts
- app/api/ingest/community/route.ts
- app/api/ingest/congress-gov/route.ts
- app/api/ingest/congress/route.ts
- app/api/ingest/gmail/route.ts
- app/api/ingest/govt-data/route.ts
- app/api/ingest/grants-gov/route.ts
- app/api/ingest/hend/route.ts
- app/api/ingest/news/route.ts
- app/api/ingest/open-states/route.ts
- app/api/ingest/regulations/route.ts
- app/api/ingest/sam-gov/route.ts
- app/api/ingest/site/route.ts
- app/api/ingest/x/route.ts
- app/api/integrations/route.ts
- app/api/intelligence/activity/route.ts
- app/api/intelligence/briefing/route.ts
- app/api/intelligence/compute/route.ts
- app/api/intelligence/digest/route.ts
- app/api/intelligence/paths/route.ts
- app/api/intelligence/power-scores/route.ts
- app/api/journalists/[id]/entity-flow/route.ts
- app/api/journalists/[id]/route.ts
- app/api/journalists/directory/route.ts
- app/api/journalists/route.ts
- app/api/journalists/scrape/route.ts
- app/api/leads/discover/route.ts
- app/api/leads/route.ts
- app/api/library/[id]/route.ts
- app/api/library/generate/route.ts
- app/api/library/route.ts
- app/api/member-email/route.ts
- app/api/news/[id]/route.ts
- app/api/news/detect-mentions/route.ts
- app/api/news/fetch-article/route.ts
- app/api/news/live/route.ts
- app/api/news/outlets/route.ts
- app/api/news/resolve-authors/route.ts
- app/api/news/route.ts
- app/api/news/tags/route.ts
- app/api/nonprofit/enrich/route.ts
- app/api/nonprofit/signup/route.ts
- app/api/onboard/[id]/route.ts
- app/api/onboard/route.ts
- app/api/onboard/stats/route.ts
- app/api/onboard/trigger/route.ts
- app/api/orgs/enrich/route.ts
- app/api/orgs/match/route.ts
- app/api/orgs/route.ts
- app/api/orgs/signup/route.ts
- app/api/outreach-pipeline/generate/route.ts
- app/api/outreach-pipeline/route.ts
- app/api/outreach-templates/route.ts
- app/api/outreach/generate/route.ts
- app/api/partners/posts/route.ts
- app/api/partners/route.ts
- app/api/petitions/[id]/campaigns/route.ts
- app/api/petitions/[id]/geo/route.ts
- app/api/petitions/[id]/route.ts
- app/api/petitions/[id]/signatures/route.ts
- app/api/petitions/draft/route.ts
- app/api/petitions/ideas/route.ts
- app/api/petitions/route.ts
- app/api/petitions/suggest/route.ts
- app/api/petitions/topics/route.ts
- app/api/petitions/trending/route.ts
- app/api/pipeline/[id]/approve/route.ts
- app/api/pipeline/[id]/dispatch/route.ts
- app/api/pipeline/[id]/route.ts
- app/api/pipeline/[id]/schedule/route.ts
- app/api/pipeline/generate/route.ts
- app/api/pipeline/reorder/route.ts
- app/api/pipeline/route.ts
- app/api/pipeline/stats/route.ts
- app/api/price-tracker/route.ts
- app/api/price-tracker/stats/route.ts
- app/api/pulse/activity/route.ts
- app/api/pulse/articles/route.ts
- app/api/pulse/fetch/route.ts
- app/api/pulse/petitions/[id]/route.ts
- app/api/pulse/petitions/[id]/sign/route.ts
- app/api/pulse/petitions/route.ts
- app/api/pulse/profile/route.ts
- app/api/pulse/stats/route.ts
- app/api/pulse/topics/generate/route.ts
- app/api/pulse/topics/route.ts
- app/api/pulse/tracked/route.ts
- app/api/radar/route.ts
- app/api/registry/route.ts
- app/api/schedule/route.ts
- app/api/scheduled/[id]/route.ts
- app/api/scheduled/route.ts
- app/api/scraper/petitions/route.ts
- app/api/scraper/run/route.ts
- app/api/scraper/student-debt/route.ts
- app/api/scraper/suggestions/route.ts
- app/api/scraper/trending/route.ts
- app/api/search/public/route.ts
- app/api/search/route.ts
- app/api/sessions/[id]/route.ts
- app/api/sessions/route.ts
- app/api/settings/api-keys/[id]/route.ts
- app/api/settings/api-keys/route.ts
- app/api/settings/credential-health/route.ts
- app/api/settings/credentials/route.ts
- app/api/settings/intelligence/route.ts
- app/api/settings/news-watch-people/route.ts
- app/api/settings/people/route.ts
- app/api/settings/pulse-config/route.ts
- app/api/settings/route.ts
- app/api/settings/tier-credentials/[id]/route.ts
- app/api/settings/tier-credentials/route.ts
- app/api/slack/notify/route.ts
- app/api/slack/route.ts
- app/api/social/accounts/route.ts
- app/api/social/ai-compose/route.ts
- app/api/social/ai-image/route.ts
- app/api/social/analytics/dashboard/route.ts
- app/api/social/analytics/route.ts
- app/api/social/bulk-schedule/route.ts
- app/api/social/competitors/crawl/route.ts
- app/api/social/competitors/posts/route.ts
- app/api/social/competitors/route.ts
- app/api/social/competitors/suggest/route.ts
- app/api/social/connect/route.ts
- app/api/social/my-posts/route.ts
- app/api/social/posts/approve/route.ts
- app/api/social/posts/pending/route.ts
- app/api/social/posts/route.ts
- app/api/social/publish/route.ts
- app/api/social/schedule/route.ts
- app/api/social/scoreboard/route.ts
- app/api/statements/[id]/route.ts
- app/api/statements/generate/route.ts
- app/api/statements/route.ts
- app/api/user-preferences/route.ts
- app/api/users/route.ts
- app/api/v1/health/route.ts
- app/api/webhooks/pulse-topic/route.ts
- app/api/xsessions/[id]/route.ts
- app/api/xsessions/posts/route.ts
- app/api/xsessions/route.ts
- app/campaigns/page.tsx
- app/error.tsx
- app/favicon.ico
- app/globals.css
- app/icon.svg
- app/layout.tsx
- app/login/page.tsx
- app/page.tsx
- app/pulse/about/page.tsx
- app/pulse/activity/page.tsx
- app/pulse/layout.tsx
- app/pulse/page.tsx
- app/pulse/petition/[id]/page.tsx
- app/pulse/petitions/create/page.tsx
- app/pulse/petitions/page.tsx
- app/pulse/profile/page.tsx
- app/pulse/tracked/page.tsx
- app/signup/_SignupWizardWrapper.tsx
- app/signup/page.tsx
- app/supervisor/page.tsx
- components/AgeThemeSlider.tsx
- components/AppShell.tsx
- components/AuthProvider.tsx
- components/ChatBar.tsx
- components/ChatPanel.tsx
- components/CypressAwardsTab.tsx
- components/GlobalSearch.tsx
- components/ImpersonateMenu.tsx
- components/InboxThemeBanner.tsx