Norma Platform

repo: ~/Projects/Norma-platform · 628 commits · 0 in last 24h, 0 in last 7d ·

Search the build

628 commits indexed

  1. 2626361 2026-09-14 Stop video re-bloat on feature branch: gitignore cta/rec + demos videos (TK-11533)
  2. 437e1dc 2026-09-10 Add donation refund reconciliation slice (TK-11335 Section A, local-safe)
  3. 2c3739d 2026-09-09 chore: lint, refactor, v0.2.0 (session close)
  4. b18aac0 2026-09-09 Add donation reconciliation slice (TK-11335 Section A, local-safe)
  5. 6d61307 2026-09-09 Apply consent red-team fixes: fail-closed token secret + per-IP rate limit
  6. f6bd2e4 2026-09-09 Add verified-consent state machine, immutable log, and sandbox-only mock provider
  7. f1431e1 2026-09-09 Refresh campaign verification after field assignment update
  8. fba8ff6 2026-09-09 Add local field assignment and shift planning to campaign follow-ups
  9. 1e82ed2 2026-09-09 Capture populated campaign preview at desktop width
  10. 4de7056 2026-09-09 Record campaign browser proof and explicit provider integration gaps
  11. c2e108f 2026-09-09 Build unified campaign workspace with five action journeys and supporter history
  12. 1113c0b 2026-09-09 auto-data-snapshot: 2026-09-09T11:09:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  13. fc631f6 2026-09-09 Update Norma UX evidence from isolated run
  14. d02cb54 2026-09-09 auto-data-snapshot: 2026-09-09T10:04:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  15. 2f246a7 2026-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
  16. 152d007 2026-09-09 auto-data-snapshot: 2026-09-09T08:59:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  17. 3d903d4 2026-09-09 Record Norma UX browser evidence
  18. f3552f7 2026-09-09 auto-data-snapshot: 2026-09-09T08:26:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  19. b70d36d 2026-09-09 Clear Norma release lint and type gate
  20. 55fb2ea 2026-09-09 Clean lint autofix whitespace
  21. 494dad3 2026-09-09 Align Norma lint toolchain and autofix safe issues
  22. 318ab90 2026-09-08 Make session secret narrowing explicit
  23. 9a97f8a 2026-09-08 Harden Norma OAuth webhooks and release checks
  24. db3be27 2026-09-08 auto-data-snapshot: 2026-09-08T20:11:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  25. ac03652 2026-09-08 auto-data-snapshot: 2026-09-08T19:39:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  26. ddd386c 2026-09-08 auto-data-snapshot: 2026-09-08T19:07:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  27. 4fe632a 2026-09-08 auto-data-snapshot: 2026-09-08T18:35:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  28. fc89a41 2026-09-08 auto-data-snapshot: 2026-09-08T18:03:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  29. f133f55 2026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  30. 40c5bce 2026-09-08 auto-data-snapshot: 2026-09-08T14:56:20 (1 data files) — agents/instagram-agent/public/ig-activity.json
  31. 6911c0e 2026-09-08 auto-data-snapshot: 2026-09-08T14:18:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  32. f71b9c3 2026-09-08 auto-data-snapshot: 2026-09-08T13:39:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  33. d63f76f 2026-09-08 auto-data-snapshot: 2026-09-08T12:55:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  34. 158d3c0 2026-09-08 auto-data-snapshot: 2026-09-08T12:16:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  35. d40b9cc 2026-09-08 auto-data-snapshot: 2026-09-08T11:37:41 (1 data files) — agents/instagram-agent/public/ig-activity.json
  36. 4d4f9ab 2026-09-08 auto-data-snapshot: 2026-09-08T10:58:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  37. bce4142 2026-09-08 auto-data-snapshot: 2026-09-08T10:19:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  38. 60a5e15 2026-09-08 auto-data-snapshot: 2026-09-08T09:40:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  39. c3dbf27 2026-09-08 auto-data-snapshot: 2026-09-08T09:02:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  40. 44ce45b 2026-09-08 auto-data-snapshot: 2026-09-08T08:24:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  41. 5f0326a 2026-09-07 auto-data-snapshot: 2026-09-07T19:41:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  42. a53f712 2026-09-07 auto-data-snapshot: 2026-09-07T19:03:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  43. 202b70e 2026-09-07 auto-data-snapshot: 2026-09-07T18:25:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  44. 5e9b350 2026-09-07 auto-data-snapshot: 2026-09-07T17:47:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  45. 98efb14 2026-09-07 auto-data-snapshot: 2026-09-07T17:09:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  46. b38bcfa 2026-09-07 auto-data-snapshot: 2026-09-07T16:31:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  47. 0e5da27 2026-09-07 auto-data-snapshot: 2026-09-07T15:53:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  48. 81a0af5 2026-09-07 auto-data-snapshot: 2026-09-07T15:15:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  49. c350475 2026-09-07 auto-data-snapshot: 2026-09-07T14:38:12 (1 data files) — agents/instagram-agent/public/ig-activity.json
  50. 95c833a 2026-09-07 auto-data-snapshot: 2026-09-07T14:00:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  51. 2d6006f 2026-09-07 auto-data-snapshot: 2026-09-07T13:22:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  52. ac0b501 2026-09-07 auto-data-snapshot: 2026-09-07T12:38:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  53. 8afe343 2026-09-07 auto-data-snapshot: 2026-09-07T12:00:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  54. a95d93f 2026-09-07 auto-data-snapshot: 2026-09-07T11:21:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  55. d8fcf78 2026-09-07 auto-data-snapshot: 2026-09-07T10:43:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  56. bb2e932 2026-09-07 auto-data-snapshot: 2026-09-07T10:04:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  57. 3c2ed32 2026-09-07 auto-data-snapshot: 2026-09-07T09:25:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  58. d46e7c0 2026-09-07 auto-data-snapshot: 2026-09-07T08:47:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  59. b01709d 2026-09-07 auto-data-snapshot: 2026-09-07T08:09:05 (1 data files) — agents/instagram-agent/public/ig-activity.json
  60. 2e29d6c 2026-09-05 auto-data-snapshot: 2026-09-05T20:16:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  61. 1c38344 2026-09-05 auto-data-snapshot: 2026-09-05T19:38:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  62. de727f8 2026-09-05 auto-data-snapshot: 2026-09-05T19:00:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  63. 9289eee 2026-09-05 auto-data-snapshot: 2026-09-05T18:21:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  64. 689ad59 2026-09-05 auto-data-snapshot: 2026-09-05T17:43:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  65. b09567d 2026-09-05 auto-data-snapshot: 2026-09-05T15:09:59 (1 data files) — agents/instagram-agent/public/ig-activity.json
  66. 5e6cde3 2026-09-05 auto-data-snapshot: 2026-09-05T14:31:27 (1 data files) — agents/instagram-agent/public/ig-activity.json
  67. afcd15f 2026-09-05 auto-data-snapshot: 2026-09-05T13:53:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  68. 6024213 2026-09-05 auto-data-snapshot: 2026-09-05T13:15:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  69. faf4a41 2026-09-05 auto-data-snapshot: 2026-09-05T12:36:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  70. c79f07f 2026-09-05 auto-data-snapshot: 2026-09-05T11:58:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  71. 833ccff 2026-09-05 auto-data-snapshot: 2026-09-05T11:20:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  72. f29b440 2026-09-05 auto-data-snapshot: 2026-09-05T10:42:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  73. 219ac64 2026-09-05 auto-data-snapshot: 2026-09-05T10:03:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  74. df6fe09 2026-09-05 auto-data-snapshot: 2026-09-05T09:24:41 (1 data files) — agents/instagram-agent/public/ig-activity.json
  75. d368c38 2026-09-05 auto-data-snapshot: 2026-09-05T08:46:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  76. eaf7175 2026-09-04 auto-data-snapshot: 2026-09-04T19:59:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  77. f927685 2026-09-04 auto-data-snapshot: 2026-09-04T19:20:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  78. b0d2997 2026-09-04 auto-data-snapshot: 2026-09-04T18:42:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  79. 3c23058 2026-09-04 auto-data-snapshot: 2026-09-04T18:04:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  80. fa4859a 2026-09-04 auto-data-snapshot: 2026-09-04T17:26:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  81. baf3fb9 2026-09-04 auto-data-snapshot: 2026-09-04T15:31:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  82. 360fef9 2026-09-04 auto-data-snapshot: 2026-09-04T14:52:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  83. 784b4b9 2026-09-04 auto-data-snapshot: 2026-09-04T14:13:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  84. 08fe7b6 2026-09-04 auto-data-snapshot: 2026-09-04T13:35:12 (1 data files) — agents/instagram-agent/public/ig-activity.json
  85. 2b32aed 2026-09-04 auto-data-snapshot: 2026-09-04T12:55:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  86. 2b2cdb9 2026-09-04 auto-data-snapshot: 2026-09-04T12:10:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  87. c4439f7 2026-09-04 auto-data-snapshot: 2026-09-04T11:31:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  88. 40ad919 2026-09-04 auto-data-snapshot: 2026-09-04T10:48:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  89. e650624 2026-09-04 auto-data-snapshot: 2026-09-04T10:10:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  90. 105b658 2026-09-04 auto-data-snapshot: 2026-09-04T09:09:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  91. 35f1921 2026-09-04 auto-data-snapshot: 2026-09-04T08:26:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  92. 531a4a4 2026-09-03 auto-data-snapshot: 2026-09-03T20:10:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  93. a2a082e 2026-09-03 auto-data-snapshot: 2026-09-03T19:32:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  94. 66e15b3 2026-09-03 auto-data-snapshot: 2026-09-03T18:54:12 (1 data files) — agents/instagram-agent/public/ig-activity.json
  95. 0d3e889 2026-09-03 auto-data-snapshot: 2026-09-03T18:17:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  96. 3e9fbec 2026-09-03 auto-data-snapshot: 2026-09-03T17:39:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  97. 381eecd 2026-09-03 auto-data-snapshot: 2026-09-03T15:45:08 (1 data files) — agents/instagram-agent/public/ig-activity.json
  98. 6843c46 2026-09-03 auto-data-snapshot: 2026-09-03T15:07:41 (1 data files) — agents/instagram-agent/public/ig-activity.json
  99. 6bba4fa 2026-09-03 auto-data-snapshot: 2026-09-03T14:29:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  100. 8d6ad09 2026-09-03 auto-data-snapshot: 2026-09-03T13:47:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  101. da3c94d 2026-09-03 auto-data-snapshot: 2026-09-03T13:07:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  102. d3df724 2026-09-03 auto-data-snapshot: 2026-09-03T12:32:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  103. 75844f8 2026-09-03 auto-data-snapshot: 2026-09-03T11:49:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  104. 0edb69d 2026-09-03 auto-data-snapshot: 2026-09-03T11:10:51 (1 data files) — agents/instagram-agent/public/ig-activity.json
  105. 77c12db 2026-09-03 auto-data-snapshot: 2026-09-03T10:32:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  106. 3424b88 2026-09-03 auto-data-snapshot: 2026-09-03T09:53:05 (1 data files) — agents/instagram-agent/public/ig-activity.json
  107. 5241017 2026-09-03 auto-data-snapshot: 2026-09-03T09:14:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  108. 1b4d5fa 2026-09-03 auto-data-snapshot: 2026-09-03T08:35:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  109. 26a2188 2026-09-02 auto-data-snapshot: 2026-09-02T19:55:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  110. d47bb93 2026-09-02 auto-data-snapshot: 2026-09-02T19:17:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  111. 1308b51 2026-09-02 auto-data-snapshot: 2026-09-02T18:39:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  112. c3a185b 2026-09-02 auto-data-snapshot: 2026-09-02T18:02:03 (1 data files) — agents/instagram-agent/public/ig-activity.json
  113. 7c3d21c 2026-09-02 auto-data-snapshot: 2026-09-02T17:24:05 (1 data files) — agents/instagram-agent/public/ig-activity.json
  114. 5fa7cd9 2026-09-02 auto-data-snapshot: 2026-09-02T16:03:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  115. a82dd03 2026-09-02 auto-data-snapshot: 2026-09-02T15:21:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  116. e4feac5 2026-09-02 auto-data-snapshot: 2026-09-02T14:42:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  117. 846e790 2026-09-02 auto-data-snapshot: 2026-09-02T14:03:59 (1 data files) — agents/instagram-agent/public/ig-activity.json
  118. 8cd4515 2026-09-02 auto-data-snapshot: 2026-09-02T13:25:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  119. 533c5c6 2026-09-02 auto-data-snapshot: 2026-09-02T12:46:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  120. 0c42c77 2026-09-02 auto-data-snapshot: 2026-09-02T12:07:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  121. bd72923 2026-09-02 auto-data-snapshot: 2026-09-02T11:28:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  122. f4e158e 2026-09-02 auto-data-snapshot: 2026-09-02T10:48:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  123. a324bd7 2026-09-02 auto-data-snapshot: 2026-09-02T10:09:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  124. daa09d9 2026-09-02 auto-data-snapshot: 2026-09-02T09:35:20 (1 data files) — agents/instagram-agent/public/ig-activity.json
  125. 2480373 2026-09-02 auto-data-snapshot: 2026-09-02T09:04:08 (1 data files) — agents/instagram-agent/public/ig-activity.json
  126. 43a6b32 2026-09-02 auto-data-snapshot: 2026-09-02T08:25:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  127. 8195dc4 2026-09-01 auto-data-snapshot: 2026-09-01T19:53:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  128. 3b5d798 2026-09-01 auto-data-snapshot: 2026-09-01T19:16:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  129. ceacd85 2026-09-01 auto-data-snapshot: 2026-09-01T18:38:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  130. c3684d9 2026-09-01 auto-data-snapshot: 2026-09-01T18:00:51 (1 data files) — agents/instagram-agent/public/ig-activity.json
  131. 18ab19b 2026-09-01 auto-data-snapshot: 2026-09-01T17:22:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  132. 430062e 2026-09-01 auto-data-snapshot: 2026-09-01T16:07:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  133. bc14130 2026-09-01 auto-data-snapshot: 2026-09-01T15:29:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  134. 0acd26d 2026-09-01 auto-data-snapshot: 2026-09-01T14:52:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  135. 9b1947d 2026-09-01 auto-data-snapshot: 2026-09-01T14:14:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  136. 941e043 2026-09-01 auto-data-snapshot: 2026-09-01T13:36:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  137. 4605cdd 2026-09-01 auto-data-snapshot: 2026-09-01T12:55:30 (1 data files) — agents/instagram-agent/public/ig-activity.json
  138. 1edc870 2026-09-01 auto-data-snapshot: 2026-09-01T12:16:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  139. fc99c84 2026-09-01 auto-data-snapshot: 2026-09-01T11:38:20 (1 data files) — agents/instagram-agent/public/ig-activity.json
  140. 7b0c23f 2026-09-01 auto-data-snapshot: 2026-09-01T10:56:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  141. b91e7cf 2026-09-01 auto-data-snapshot: 2026-09-01T10:19:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  142. 49a86b8 2026-09-01 auto-data-snapshot: 2026-09-01T09:42:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  143. a61acb4 2026-09-01 auto-data-snapshot: 2026-09-01T09:05:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  144. d9d84fe 2026-09-01 auto-data-snapshot: 2026-09-01T08:28:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  145. 0991840 2026-08-31 auto-data-snapshot: 2026-08-31T20:06:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  146. 58bd834 2026-08-31 auto-data-snapshot: 2026-08-31T19:29:32 (1 data files) — agents/instagram-agent/public/ig-activity.json
  147. c526f80 2026-08-31 auto-data-snapshot: 2026-08-31T18:52:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  148. 071fb8b 2026-08-31 auto-data-snapshot: 2026-08-31T18:15:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  149. 222d28f 2026-08-31 auto-data-snapshot: 2026-08-31T17:38:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  150. cfcb8d1 2026-08-31 auto-data-snapshot: 2026-08-31T16:59:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  151. c968976 2026-08-31 auto-data-snapshot: 2026-08-31T16:22:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  152. ab3efbb 2026-08-31 auto-data-snapshot: 2026-08-31T15:44:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  153. b414d0e 2026-08-31 auto-data-snapshot: 2026-08-31T15:07:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  154. 20f8e1c 2026-08-31 auto-data-snapshot: 2026-08-31T14:28:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  155. abf140c 2026-08-31 auto-data-snapshot: 2026-08-31T13:51:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  156. 4942297 2026-08-31 auto-data-snapshot: 2026-08-31T13:13:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  157. 023e8a7 2026-08-31 auto-data-snapshot: 2026-08-31T12:34:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  158. 331fc8b 2026-08-31 auto-data-snapshot: 2026-08-31T11:55:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  159. 1e14ffe 2026-08-31 auto-data-snapshot: 2026-08-31T11:17:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  160. 61b4acb 2026-08-31 auto-data-snapshot: 2026-08-31T10:38:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  161. 2f54b80 2026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  162. be89cc3 2026-08-31 auto-data-snapshot: 2026-08-31T09:29:05 (1 data files) — agents/instagram-agent/public/ig-activity.json
  163. 1e76e1a 2026-08-31 auto-data-snapshot: 2026-08-31T08:52:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  164. 4c30e51 2026-08-31 auto-data-snapshot: 2026-08-31T08:15:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  165. c7d0a87 2026-08-29 auto-data-snapshot: 2026-08-29T20:09:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  166. d238df4 2026-08-29 auto-data-snapshot: 2026-08-29T19:32:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  167. 06a97dd 2026-08-29 auto-data-snapshot: 2026-08-29T18:56:11 (1 data files) — agents/instagram-agent/public/ig-activity.json
  168. 5ae9556 2026-08-29 auto-data-snapshot: 2026-08-29T18:19:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  169. 0b22a6a 2026-08-29 auto-data-snapshot: 2026-08-29T17:42:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  170. 9f37648 2026-08-29 auto-data-snapshot: 2026-08-29T15:52:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  171. bf42997 2026-08-29 auto-data-snapshot: 2026-08-29T15:15:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  172. e17d0a1 2026-08-29 auto-data-snapshot: 2026-08-29T14:38:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  173. 52359bc 2026-08-29 auto-data-snapshot: 2026-08-29T14:01:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  174. a1f2344 2026-08-29 auto-data-snapshot: 2026-08-29T13:24:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  175. c9da9b3 2026-08-29 auto-data-snapshot: 2026-08-29T12:47:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  176. b4f2877 2026-08-29 auto-data-snapshot: 2026-08-29T12:10:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  177. 04e0c11 2026-08-29 auto-data-snapshot: 2026-08-29T11:33:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  178. cf09a7a 2026-08-29 auto-data-snapshot: 2026-08-29T10:56:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  179. 0c2e085 2026-08-29 auto-data-snapshot: 2026-08-29T10:19:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  180. 678bc69 2026-08-29 auto-data-snapshot: 2026-08-29T09:43:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  181. e5f3bcc 2026-08-29 auto-data-snapshot: 2026-08-29T09:06:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  182. a45f28a 2026-08-29 auto-data-snapshot: 2026-08-29T08:29:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  183. 3c619db 2026-08-28 auto-data-snapshot: 2026-08-28T19:30:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  184. 6def017 2026-08-28 auto-data-snapshot: 2026-08-28T18:53:51 (1 data files) — agents/instagram-agent/public/ig-activity.json
  185. 3cbdc47 2026-08-28 auto-data-snapshot: 2026-08-28T18:16:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  186. 6208150 2026-08-28 auto-data-snapshot: 2026-08-28T17:39:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  187. f7dda89 2026-08-28 auto-data-snapshot: 2026-08-28T17:02:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  188. 425bdab 2026-08-28 auto-data-snapshot: 2026-08-28T15:48:59 (1 data files) — agents/instagram-agent/public/ig-activity.json
  189. c831e8d 2026-08-28 auto-data-snapshot: 2026-08-28T15:12:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  190. 6551ffb 2026-08-28 auto-data-snapshot: 2026-08-28T14:34:59 (1 data files) — agents/instagram-agent/public/ig-activity.json
  191. 09259db 2026-08-28 auto-data-snapshot: 2026-08-28T13:58:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  192. 96ad14e 2026-08-28 auto-data-snapshot: 2026-08-28T13:21:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  193. a7cab9b 2026-08-28 auto-data-snapshot: 2026-08-28T12:44:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  194. bd8aa33 2026-08-28 auto-data-snapshot: 2026-08-28T12:07:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  195. fe37427 2026-08-28 auto-data-snapshot: 2026-08-28T11:30:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  196. 16c8205 2026-08-28 auto-data-snapshot: 2026-08-28T10:53:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  197. 41d4f79 2026-08-28 auto-data-snapshot: 2026-08-28T10:16:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  198. a278a27 2026-08-28 auto-data-snapshot: 2026-08-28T09:39:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  199. 0aed9bf 2026-08-28 auto-data-snapshot: 2026-08-28T09:02:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  200. cbd8321 2026-08-28 auto-data-snapshot: 2026-08-28T08:24:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  201. 4b4bb89 2026-08-28 auto-data-snapshot: 2026-08-28T07:45:44 (1 data files) — scripts/password-restore/admin-2026-08-28T14-32-40-840Z.json
  202. 159c3e5 2026-08-28 scripts: restore-admin-hash helper (revert a tier_credentials hash from a saved restore file)
  203. db0ecc2 2026-08-28 feat(set-admin-password): NEW_PW_B64 input to survive shell '!' mangling
  204. 7c027a1 2026-08-28 fix(set-admin-password): read .env.local first, echo DB host, abort on multi-row (Cody gate)
  205. c5e8f58 2026-08-28 scripts: reversible set-admin-password helper (bcrypt, captures old hash)
  206. 1ea90de 2026-08-27 auto-data-snapshot: 2026-08-27T20:01:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  207. f08a3ee 2026-08-27 auto-data-snapshot: 2026-08-27T19:24:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  208. 5e380e2 2026-08-27 auto-data-snapshot: 2026-08-27T18:47:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  209. 3e6347f 2026-08-27 auto-data-snapshot: 2026-08-27T18:10:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  210. c756e29 2026-08-27 auto-data-snapshot: 2026-08-27T17:33:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  211. 735514a 2026-08-27 auto-data-snapshot: 2026-08-27T15:43:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  212. f93292f 2026-08-27 auto-data-snapshot: 2026-08-27T15:06:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  213. edaf1f5 2026-08-27 auto-data-snapshot: 2026-08-27T14:29:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  214. 042267e 2026-08-27 auto-data-snapshot: 2026-08-27T13:51:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  215. d43ec19 2026-08-27 auto-data-snapshot: 2026-08-27T13:15:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  216. c575b9a 2026-08-27 auto-data-snapshot: 2026-08-27T12:38:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  217. f3efdf7 2026-08-27 auto-data-snapshot: 2026-08-27T12:01:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  218. 2c3fe95 2026-08-27 auto-data-snapshot: 2026-08-27T11:24:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  219. afb0c09 2026-08-27 TK-10449: regenerate IG registry from live token — @grassclothwallpaper link dropped (35->34 postable, verified)
  220. 0045a7c 2026-08-27 auto-data-snapshot: 2026-08-27T10:47:06 (1 data files) — agents/instagram-agent/public/ig-activity.json
  221. 63141e3 2026-08-27 auto-data-snapshot: 2026-08-27T10:10:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  222. 7abb93e 2026-08-27 auto-data-snapshot: 2026-08-27T09:33:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  223. 00f0dfd 2026-08-27 auto-data-snapshot: 2026-08-27T08:56:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  224. cae7946 2026-08-27 auto-data-snapshot: 2026-08-27T08:19:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  225. 5e7147f 2026-08-26 auto-data-snapshot: 2026-08-26T20:07:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  226. 5f5472e 2026-08-26 auto-data-snapshot: 2026-08-26T19:31:35 (1 data files) — agents/instagram-agent/public/ig-activity.json
  227. 1dbcd5a 2026-08-26 auto-data-snapshot: 2026-08-26T18:55:11 (1 data files) — agents/instagram-agent/public/ig-activity.json
  228. 4355e0f 2026-08-26 auto-data-snapshot: 2026-08-26T18:18:32 (1 data files) — agents/instagram-agent/public/ig-activity.json
  229. e12abed 2026-08-26 auto-data-snapshot: 2026-08-26T17:42:06 (1 data files) — agents/instagram-agent/public/ig-activity.json
  230. 73e83b3 2026-08-26 auto-data-snapshot: 2026-08-26T17:05:40 (1 data files) — agents/instagram-agent/public/ig-activity.json
  231. 549be2e 2026-08-26 auto-data-snapshot: 2026-08-26T16:29:03 (1 data files) — agents/instagram-agent/public/ig-activity.json
  232. dddca16 2026-08-26 auto-data-snapshot: 2026-08-26T15:52:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  233. f4b84bd 2026-08-26 auto-data-snapshot: 2026-08-26T15:16:03 (1 data files) — agents/instagram-agent/public/ig-activity.json
  234. 449fa92 2026-08-26 auto-data-snapshot: 2026-08-26T14:39:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  235. a60fb44 2026-08-26 auto-data-snapshot: 2026-08-26T14:02:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  236. 362538b 2026-08-26 auto-data-snapshot: 2026-08-26T13:25:11 (1 data files) — agents/instagram-agent/public/ig-activity.json
  237. 745fed2 2026-08-26 auto-data-snapshot: 2026-08-26T12:47:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  238. 13c81bc 2026-08-26 auto-data-snapshot: 2026-08-26T12:08:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  239. 9df4868 2026-08-26 auto-data-snapshot: 2026-08-26T11:30:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  240. 69077d0 2026-08-26 auto-data-snapshot: 2026-08-26T10:53:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  241. c8be6e5 2026-08-26 auto-data-snapshot: 2026-08-26T10:15:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  242. 560e3c1 2026-08-26 auto-data-snapshot: 2026-08-26T09:38:32 (1 data files) — agents/instagram-agent/public/ig-activity.json
  243. 8d639f1 2026-08-26 auto-data-snapshot: 2026-08-26T09:01:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  244. ca257a9 2026-08-26 auto-data-snapshot: 2026-08-26T08:21:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  245. 6d4b1d0 2026-08-25 auto-data-snapshot: 2026-08-25T19:29:44 (1 data files) — agents/instagram-agent/public/ig-activity.json
  246. 4472324 2026-08-25 auto-data-snapshot: 2026-08-25T18:53:12 (1 data files) — agents/instagram-agent/public/ig-activity.json
  247. ea61d89 2026-08-25 auto-data-snapshot: 2026-08-25T18:16:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  248. 6dcc680 2026-08-25 auto-data-snapshot: 2026-08-25T17:39:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  249. 99f3fe2 2026-08-25 auto-data-snapshot: 2026-08-25T17:03:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  250. 6697b0e 2026-08-25 auto-data-snapshot: 2026-08-25T16:26:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  251. f70a279 2026-08-25 auto-data-snapshot: 2026-08-25T15:49:32 (1 data files) — agents/instagram-agent/public/ig-activity.json
  252. c819353 2026-08-25 auto-data-snapshot: 2026-08-25T15:12:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  253. fdd80a0 2026-08-25 auto-data-snapshot: 2026-08-25T14:34:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  254. 419678e 2026-08-25 auto-data-snapshot: 2026-08-25T13:58:08 (1 data files) — agents/instagram-agent/public/ig-activity.json
  255. 276ac8f 2026-08-25 auto-data-snapshot: 2026-08-25T13:21:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  256. 9677aff 2026-08-25 auto-data-snapshot: 2026-08-25T12:44:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  257. f2d128e 2026-08-25 auto-data-snapshot: 2026-08-25T12:06:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  258. 52bbfee 2026-08-25 auto-data-snapshot: 2026-08-25T11:28:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  259. be054e0 2026-08-25 auto-data-snapshot: 2026-08-25T10:46:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  260. fcabb6e 2026-08-25 auto-data-snapshot: 2026-08-25T10:08:44 (1 data files) — agents/instagram-agent/public/ig-activity.json
  261. 9d967d3 2026-08-25 auto-data-snapshot: 2026-08-25T09:32:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  262. 29e2505 2026-08-25 auto-data-snapshot: 2026-08-25T08:55:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  263. 60d2b88 2026-08-25 Add delete-novasuede-graph.js — gated Graph-API removal of 33 Novasuede IG posts (dry-run default, --go to execute)
  264. b2e7413 2026-08-24 auto-data-snapshot: 2026-08-24T20:06:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  265. 6497954 2026-08-24 auto-data-snapshot: 2026-08-24T19:34:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  266. 993670d 2026-08-24 auto-data-snapshot: 2026-08-24T18:33:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  267. 6dfdfbf 2026-08-24 auto-data-snapshot: 2026-08-24T18:03:09 (1 data files) — agents/instagram-agent/public/ig-activity.json
  268. cd870f8 2026-08-24 auto-data-snapshot: 2026-08-24T17:32:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  269. b7e398b 2026-08-24 auto-data-snapshot: 2026-08-24T17:02:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  270. 6f48931 2026-08-24 auto-data-snapshot: 2026-08-24T16:31:44 (1 data files) — agents/instagram-agent/public/ig-activity.json
  271. 62a177a 2026-08-24 auto-data-snapshot: 2026-08-24T15:30:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  272. 44be7e9 2026-08-24 auto-data-snapshot: 2026-08-24T15:00:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  273. fe68aed 2026-08-24 auto-data-snapshot: 2026-08-24T14:29:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  274. 48108a4 2026-08-24 auto-data-snapshot: 2026-08-24T13:59:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  275. 2759e57 2026-08-24 auto-data-snapshot: 2026-08-24T13:25:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  276. d4ae3a2 2026-08-24 auto-data-snapshot: 2026-08-24T12:55:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  277. d451e58 2026-08-24 auto-data-snapshot: 2026-08-24T12:20:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  278. 223ab9d 2026-08-24 auto-data-snapshot: 2026-08-24T11:44:27 (1 data files) — agents/instagram-agent/public/ig-activity.json
  279. bdb262c 2026-08-24 auto-data-snapshot: 2026-08-24T11:12:29 (1 data files) — agents/instagram-agent/public/ig-activity.json
  280. 674adb1 2026-08-24 auto-data-snapshot: 2026-08-24T10:40:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  281. c1c2d22 2026-08-24 auto-data-snapshot: 2026-08-24T10:08:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  282. b2932af 2026-08-24 auto-data-snapshot: 2026-08-24T09:36:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  283. c868ff8 2026-08-24 auto-data-snapshot: 2026-08-24T09:04:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  284. ee56ffa 2026-08-24 auto-data-snapshot: 2026-08-24T08:30:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  285. d521f5c 2026-08-22 auto-data-snapshot: 2026-08-22T20:21:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  286. c52f42e 2026-08-22 auto-data-snapshot: 2026-08-22T19:49:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  287. 8862da5 2026-08-22 auto-data-snapshot: 2026-08-22T19:18:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  288. c01c4e0 2026-08-22 auto-data-snapshot: 2026-08-22T18:46:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  289. 2df7cff 2026-08-22 auto-data-snapshot: 2026-08-22T18:14:40 (1 data files) — agents/instagram-agent/public/ig-activity.json
  290. 1386921 2026-08-22 auto-data-snapshot: 2026-08-22T17:42:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  291. ab7e6f2 2026-08-22 auto-data-snapshot: 2026-08-22T17:10:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  292. 27a2378 2026-08-22 auto-data-snapshot: 2026-08-22T16:38:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  293. ae29362 2026-08-22 auto-data-snapshot: 2026-08-22T16:06:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  294. 2e0c17b 2026-08-22 auto-data-snapshot: 2026-08-22T15:34:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  295. 5ee131f 2026-08-22 auto-data-snapshot: 2026-08-22T15:02:59 (1 data files) — agents/instagram-agent/public/ig-activity.json
  296. aff723e 2026-08-22 auto-data-snapshot: 2026-08-22T14:31:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  297. 0ef65b8 2026-08-22 auto-data-snapshot: 2026-08-22T13:59:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  298. 15e89a3 2026-08-22 auto-data-snapshot: 2026-08-22T13:27:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  299. 4b722b0 2026-08-22 auto-data-snapshot: 2026-08-22T12:55:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  300. 1061cc7 2026-08-22 auto-data-snapshot: 2026-08-22T12:23:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  301. e11994d 2026-08-22 auto-data-snapshot: 2026-08-22T11:52:06 (1 data files) — agents/instagram-agent/public/ig-activity.json
  302. 069fb02 2026-08-22 auto-data-snapshot: 2026-08-22T10:47:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  303. e3de0b4 2026-08-22 auto-data-snapshot: 2026-08-22T10:15:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  304. f0d6577 2026-08-22 auto-data-snapshot: 2026-08-22T09:43:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  305. ce53f0e 2026-08-22 auto-data-snapshot: 2026-08-22T09:11:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  306. 7b7c762 2026-08-22 auto-data-snapshot: 2026-08-22T08:40:11 (1 data files) — agents/instagram-agent/public/ig-activity.json
  307. 999d36a 2026-08-21 auto-data-snapshot: 2026-08-21T19:54:30 (1 data files) — agents/instagram-agent/public/ig-activity.json
  308. 288ffe7 2026-08-21 auto-data-snapshot: 2026-08-21T19:22:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  309. eb4f51b 2026-08-21 auto-data-snapshot: 2026-08-21T18:51:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  310. b83df23 2026-08-21 auto-data-snapshot: 2026-08-21T18:19:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  311. 2cb7426 2026-08-21 auto-data-snapshot: 2026-08-21T17:47:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  312. 79b0b6f 2026-08-21 auto-data-snapshot: 2026-08-21T17:15:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  313. 549a360 2026-08-21 auto-data-snapshot: 2026-08-21T16:12:08 (1 data files) — agents/instagram-agent/public/ig-activity.json
  314. 0324fdc 2026-08-21 auto-data-snapshot: 2026-08-21T15:40:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  315. 6316182 2026-08-21 auto-data-snapshot: 2026-08-21T15:08:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  316. 619aa11 2026-08-21 auto-data-snapshot: 2026-08-21T14:05:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  317. f107a6e 2026-08-21 auto-data-snapshot: 2026-08-21T13:33:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  318. 668801f 2026-08-21 auto-data-snapshot: 2026-08-21T13:00:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  319. 7c3a14c 2026-08-21 auto-data-snapshot: 2026-08-21T12:28:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  320. 239fa12 2026-08-21 auto-data-snapshot: 2026-08-21T11:56:19 (1 data files) — agents/instagram-agent/public/ig-activity.json
  321. 78c0012 2026-08-21 auto-data-snapshot: 2026-08-21T11:24:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  322. 677b913 2026-08-21 auto-data-snapshot: 2026-08-21T10:52:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  323. 649ef2d 2026-08-21 auto-data-snapshot: 2026-08-21T10:21:05 (1 data files) — agents/instagram-agent/public/ig-activity.json
  324. 83d491f 2026-08-21 auto-data-snapshot: 2026-08-21T09:49:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  325. 41fb8dd 2026-08-21 auto-data-snapshot: 2026-08-21T09:17:35 (1 data files) — agents/instagram-agent/public/ig-activity.json
  326. 28e34db 2026-08-21 auto-data-snapshot: 2026-08-21T08:45:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  327. 1d1def0 2026-08-20 auto-data-snapshot: 2026-08-20T20:00:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  328. f0bfecf 2026-08-20 auto-data-snapshot: 2026-08-20T19:28:34 (1 data files) — agents/instagram-agent/public/ig-activity.json
  329. d8a11b0 2026-08-20 auto-data-snapshot: 2026-08-20T18:56:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  330. 762d121 2026-08-20 auto-data-snapshot: 2026-08-20T17:52:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  331. ca1c6ed 2026-08-20 auto-data-snapshot: 2026-08-20T17:19:08 (1 data files) — agents/instagram-agent/public/ig-activity.json
  332. 23c99ec 2026-08-20 TK-10573: finish-fabric-fridays.sh wrapper (bakes the ™ handle to dodge paste truncation)
  333. 7507111 2026-08-20 TK-10758: reshare-erase pacing 15s->5s (browser-free, own accounts)
  334. 404bd15 2026-08-20 TK-10758: stop+erase sassy reposts of others' content - disabled reshare launchd jobs, browser-free erase reconciler (114 live across 4 accts)
  335. 75f9762 2026-08-20 TK-10573 GATE2: browser-free Graph-API reconcile + delete tooling (57 eligible, canary-first)
  336. 4c96ddd 2026-08-20 auto-data-snapshot: 2026-08-20T15:43:22 (1 data files) — agents/instagram-agent/public/ig-activity.json
  337. ef9b5f4 2026-08-20 auto-data-snapshot: 2026-08-20T15:11:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  338. 7ed8cc6 2026-08-20 auto-data-snapshot: 2026-08-20T14:39:47 (1 data files) — agents/instagram-agent/public/ig-activity.json
  339. 35f7f91 2026-08-20 auto-data-snapshot: 2026-08-20T14:07:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  340. ee8f0c1 2026-08-20 auto-data-snapshot: 2026-08-20T13:34:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  341. d56dad6 2026-08-20 auto-data-snapshot: 2026-08-20T13:00:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  342. f5631e8 2026-08-20 auto-data-snapshot: 2026-08-20T12:27:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  343. 44890cf 2026-08-20 auto-data-snapshot: 2026-08-20T11:53:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  344. b4eecbd 2026-08-20 auto-data-snapshot: 2026-08-20T11:21:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  345. 590a718 2026-08-20 auto-data-snapshot: 2026-08-20T10:47:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  346. 8b16923 2026-08-20 auto-data-snapshot: 2026-08-20T10:13:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  347. d101cd6 2026-08-20 auto-data-snapshot: 2026-08-20T09:38:44 (1 data files) — agents/instagram-agent/public/ig-activity.json
  348. 0efb577 2026-08-20 auto-data-snapshot: 2026-08-20T09:06:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  349. 9210e35 2026-08-20 auto-data-snapshot: 2026-08-20T08:33:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  350. 053f8cb 2026-08-19 auto-data-snapshot: 2026-08-19T20:02:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  351. 98f14b1 2026-08-19 auto-data-snapshot: 2026-08-19T19:30:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  352. bfbd18d 2026-08-19 auto-data-snapshot: 2026-08-19T18:57:31 (1 data files) — agents/instagram-agent/public/ig-activity.json
  353. 4c4f004 2026-08-19 auto-data-snapshot: 2026-08-19T18:24:30 (1 data files) — agents/instagram-agent/public/ig-activity.json
  354. 1dcd27f 2026-08-19 auto-data-snapshot: 2026-08-19T17:51:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  355. d1aab43 2026-08-19 auto-data-snapshot: 2026-08-19T15:07:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  356. d68b1ae 2026-08-19 auto-data-snapshot: 2026-08-19T14:34:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  357. a27e129 2026-08-19 auto-data-snapshot: 2026-08-19T14:01:25 (1 data files) — agents/instagram-agent/public/ig-activity.json
  358. 66676d5 2026-08-19 auto-data-snapshot: 2026-08-19T13:27:48 (1 data files) — agents/instagram-agent/public/ig-activity.json
  359. 9e411fa 2026-08-19 auto-data-snapshot: 2026-08-19T12:54:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  360. 41dd04e 2026-08-19 auto-data-snapshot: 2026-08-19T12:22:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  361. 7bdb1f6 2026-08-19 auto-data-snapshot: 2026-08-19T11:48:49 (1 data files) — agents/instagram-agent/public/ig-activity.json
  362. e98056b 2026-08-19 auto-data-snapshot: 2026-08-19T11:14:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  363. 0530e76 2026-08-19 auto-data-snapshot: 2026-08-19T10:40:44 (1 data files) — agents/instagram-agent/public/ig-activity.json
  364. 8a9b8bf 2026-08-19 auto-data-snapshot: 2026-08-19T09:34:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  365. 22bbd5f 2026-08-19 auto-data-snapshot: 2026-08-19T09:03:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  366. 93fc167 2026-08-19 auto-data-snapshot: 2026-08-19T08:31:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  367. bcb37cc 2026-08-18 auto-data-snapshot: 2026-08-18T19:51:40 (1 data files) — agents/instagram-agent/public/ig-activity.json
  368. 2f1d84f 2026-08-18 auto-data-snapshot: 2026-08-18T19:20:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  369. c6f5801 2026-08-18 auto-data-snapshot: 2026-08-18T18:16:14 (1 data files) — agents/instagram-agent/public/ig-activity.json
  370. 4292ee7 2026-08-18 auto-data-snapshot: 2026-08-18T17:44:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  371. 5aaef1d 2026-08-18 auto-data-snapshot: 2026-08-18T17:12:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  372. 128ac1b 2026-08-18 chore: refactor (named consts, optional chaining) + v1.4.0 (session close)
  373. f60474f 2026-08-18 auto-data-snapshot: 2026-08-18T15:36:46 (1 data files) — agents/instagram-agent/public/ig-activity.json
  374. 6512f67 2026-08-18 auto-data-snapshot: 2026-08-18T15:04:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  375. 965f96d 2026-08-18 instagram: per-account 'what to post next from DW Shopify' notes board (/notes)
  376. f85f258 2026-08-18 auto-data-snapshot: 2026-08-18T14:32:35 (1 data files) — agents/instagram-agent/public/ig-activity.json
  377. 8cfcfe2 2026-08-18 instagram: keep ALL accounts live via cron (not just DW)
  378. 835c032 2026-08-18 instagram: cross-account post Calendar view (/calendar)
  379. d987feb 2026-08-18 auto-data-snapshot: 2026-08-18T13:28:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  380. d86e027 2026-08-18 auto-data-snapshot: 2026-08-18T12:56:03 (1 data files) — agents/instagram-agent/public/ig-activity.json
  381. ea7bf52 2026-08-18 instagram-agent: harden getJSON (response-stream error + retry, fixes mid-body ECONNRESET crash) + backfill-all.js driver; gitignore regenerable live-media caches
  382. 8510437 2026-08-18 auto-data-snapshot: 2026-08-18T12:24:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  383. e25f270 2026-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
  384. 5b9bed4 2026-08-18 auto-data-snapshot: 2026-08-18T11:49:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  385. 2900a0c 2026-08-18 instagram-agent: gitignore .env* (holds live IG token)
  386. 7ff0152 2026-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
  387. db59445 2026-08-18 auto-data-snapshot: 2026-08-18T11:17:58 (1 data files) — agents/instagram-agent/public/ig-activity.json
  388. 6f7c8f2 2026-08-18 auto-data-snapshot: 2026-08-18T10:46:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  389. 2f0ec64 2026-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
  390. 7db7ec9 2026-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)
  391. 8b97115 2026-08-18 auto-data-snapshot: 2026-08-18T09:42:51 (1 data files) — package-lock.json
  392. 62527ad 2026-08-18 chore: instagram-agent v1.3.1 (session close — IG delete hardening + button-role selector fix)
  393. 490f67a 2026-08-18 auto-data-snapshot: 2026-08-18T09:11:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  394. b1d73e3 2026-08-18 auto-data-snapshot: 2026-08-18T08:40:41 (1 data files) — agents/instagram-agent/public/ig-activity.json
  395. 0527146 2026-08-17 auto-data-snapshot: 2026-08-17T20:02:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  396. 1bc0edc 2026-08-17 auto-data-snapshot: 2026-08-17T19:32:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  397. 4d82387 2026-08-17 auto-data-snapshot: 2026-08-17T18:31:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  398. 135cd41 2026-08-17 auto-data-snapshot: 2026-08-17T18:01:33 (1 data files) — agents/instagram-agent/public/ig-activity.json
  399. 58ce89f 2026-08-17 auto-data-snapshot: 2026-08-17T17:31:10 (1 data files) — agents/instagram-agent/public/ig-activity.json
  400. 6350ced 2026-08-17 auto-data-snapshot: 2026-08-17T17:00:51 (1 data files) — agents/instagram-agent/public/ig-activity.json
  401. e166f17 2026-08-17 auto-data-snapshot: 2026-08-17T16:30:27 (1 data files) — agents/instagram-agent/public/ig-activity.json
  402. cc61568 2026-08-17 auto-data-snapshot: 2026-08-17T15:29:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  403. ac04e28 2026-08-17 auto-data-snapshot: 2026-08-17T14:59:21 (1 data files) — agents/instagram-agent/public/ig-activity.json
  404. d0fd9c2 2026-08-17 auto-data-snapshot: 2026-08-17T14:29:06 (1 data files) — agents/instagram-agent/public/ig-activity.json
  405. 8293e85 2026-08-17 auto-data-snapshot: 2026-08-17T13:58:50 (1 data files) — agents/instagram-agent/public/ig-activity.json
  406. 4c9304a 2026-08-17 IG TK-10617: Option A helper — detect logged-in account + delete its posts (owner-check safe)
  407. 8417463 2026-08-17 Fix IG delete: target the Delete BUTTON, not the 'Delete post?' heading
  408. d73a58c 2026-08-17 auto-data-snapshot: 2026-08-17T12:27:54 (1 data files) — agents/instagram-agent/public/ig-activity.json
  409. 121aa26 2026-08-17 auto-data-snapshot: 2026-08-17T11:57:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  410. 2aff597 2026-08-17 auto-data-snapshot: 2026-08-17T11:27:07 (1 data files) — agents/instagram-agent/public/ig-activity.json
  411. f079a27 2026-08-17 auto-data-snapshot: 2026-08-17T10:56:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  412. 15fb56b 2026-08-17 auto-data-snapshot: 2026-08-17T10:26:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  413. 80a6ffe 2026-08-17 chore: instagram-agent v1.3.0 (session close — /spoonflower purge viewer)
  414. 04b7ade 2026-08-17 Harden IG delete-originals.js: retry stale refs, recover dead tabs, patient positive-signal login check
  415. 1e26b11 2026-08-17 IG /spoonflower: server-inject data into the page so it renders without an authed XHR
  416. c573cf5 2026-08-17 IG: add /spoonflower purge viewer (thumbnails + live delete-status board)
  417. 3f46ac8 2026-08-17 auto-data-snapshot: 2026-08-17T09:04:04 (1 data files) — agents/instagram-agent/public/ig-activity.json
  418. f5dd47f 2026-08-17 chore: instagram-agent package-lock v1.2.1 (session close)
  419. 7098b6c 2026-08-17 chore: instagram-agent v1.2.1 (session close — Spoonflower blocklist + delete tooling)
  420. 4533e80 2026-08-17 snapshot before restart: preserve in-flight work
  421. eca6e1e 2026-08-17 chore: lint, refactor, v1.2.0 (session close)
  422. a843c5b 2026-08-17 auto-data-snapshot: 2026-08-17T08:03:25 (1 data files) — agents/instagram-agent/.gitignore
  423. c90044b 2026-08-17 IG: add serialized, per-account-aware Spoonflower delete script (openclaw)
  424. ffc9303 2026-08-17 Bulk-select delete on IG auto-post viewer
  425. 1b1e7d4 2026-08-17 ig: wrong-image delete tooling — 4 posts (metallic/suede), pre-approved, hold execution
  426. b5cd441 2026-08-17 IG reshare: blocklist Spoonflower (competitor) fleet-wide + scrub vendor file + add scan tool
  427. ec91871 2026-08-17 Gate live IG delete behind IG_LIVE_DELETE flag (default off, tombstone-only)
  428. 8529d5a 2026-08-17 IG auto-post viewer with inline delete (GET /posts on :9810)
  429. 06c151b 2026-08-17 docs(sessions): resume — outage recovery, pm2 reconcile (TK-10606), TK-10293 gate verified green + Playwright env-fix learnings
  430. acd4004 2026-08-17 ig(TK-10573): GATE2 fan-out — split 85 originals into 10 batch tickets + iTerm2 delete windows
  431. ca8370c 2026-08-16 auto-data-snapshot: 2026-08-16T09:54:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  432. 8ac3cb3 2026-08-16 ig(TK-10573): repost the held metallicwallpaper post; lift HOLD
  433. 447e5e5 2026-08-15 docs(sessions): resume TK-10573 IG redo — HOLD safety fix + gated remainders
  434. 0026909 2026-08-15 ig(TK-10573): HOLD unpublished repost from delete tooling + commit redo viewers
  435. 3166e1b 2026-08-15 auto-data-snapshot: 2026-08-15T20:14:06 (1 data files) — agents/instagram-agent/public/ig-activity.json
  436. 9ecd8cd 2026-08-15 auto-data-snapshot: 2026-08-15T19:12:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  437. aeeb37a 2026-08-15 auto-data-snapshot: 2026-08-15T18:52:36 (1 data files) — agents/instagram-agent/public/ig-activity.json
  438. e77fc0f 2026-08-15 auto-data-snapshot: 2026-08-15T18:22:11 (1 data files) — agents/instagram-agent/public/ig-activity.json
  439. f214d2f 2026-08-15 auto-data-snapshot: 2026-08-15T17:51:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  440. 19af23e 2026-08-15 auto-data-snapshot: 2026-08-15T17:21:18 (1 data files) — agents/instagram-agent/public/ig-activity.json
  441. 0f30e21 2026-08-15 auto-data-snapshot: 2026-08-15T16:50:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  442. 059e3cc 2026-08-15 auto-data-snapshot: 2026-08-15T16:20:27 (1 data files) — agents/instagram-agent/public/ig-activity.json
  443. d2d9404 2026-08-15 auto-data-snapshot: 2026-08-15T15:50:00 (1 data files) — agents/instagram-agent/public/ig-activity.json
  444. da1e4e9 2026-08-15 auto-data-snapshot: 2026-08-15T14:18:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  445. 996d840 2026-08-15 auto-data-snapshot: 2026-08-15T13:48:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  446. 0625c5f 2026-08-15 auto-data-snapshot: 2026-08-15T13:17:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  447. c27c957 2026-08-15 auto-data-snapshot: 2026-08-15T12:46:51 (1 data files) — agents/instagram-agent/public/ig-activity.json
  448. 4b1e4c0 2026-08-15 auto-data-snapshot: 2026-08-15T11:45:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  449. f1b2aea 2026-08-15 auto-data-snapshot: 2026-08-15T10:44:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  450. ba37fdd 2026-08-15 auto-data-snapshot: 2026-08-15T10:14:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  451. 279017c 2026-08-15 auto-data-snapshot: 2026-08-15T09:43:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  452. ea9baa0 2026-08-15 auto-data-snapshot: 2026-08-15T09:13:26 (1 data files) — agents/instagram-agent/public/ig-activity.json
  453. b4a10be 2026-08-15 auto-data-snapshot: 2026-08-15T08:12:28 (1 data files) — agents/instagram-agent/public/ig-activity.json
  454. 0ff33f9 2026-08-15 Norma IG cadence: 8s timeout on Boost fetch (Cody FIX-FIRST, yoloforever cycle 1)
  455. 4b58e97 2026-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
  456. 43de9ea 2026-08-15 Norma IG cadence: fresh-source via Boost API (fixes clean-product pool exhaustion)
  457. 191eee1 2026-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)
  458. eb6bf21 2026-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)
  459. d822b58 2026-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
  460. e654e89 2026-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
  461. c6b549a 2026-08-15 auto-data-snapshot: 2026-08-15T07:41:54 (1 data files) — agents/instagram-agent/IG-RESHARE-OPS.md
  462. 1e76508 2026-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
  463. 6b1c0df 2026-08-14 auto-data-snapshot: 2026-08-14T19:30:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  464. cce6e17 2026-08-14 auto-data-snapshot: 2026-08-14T19:00:16 (1 data files) — agents/instagram-agent/public/ig-activity.json
  465. a127917 2026-08-14 auto-data-snapshot: 2026-08-14T18:29:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  466. 003881c 2026-08-14 auto-data-snapshot: 2026-08-14T17:28:57 (1 data files) — agents/instagram-agent/public/ig-activity.json
  467. 039ad5d 2026-08-14 chore: lint fixes (guard JSONL parses, __dirname paths, fix reshare href), v1.1.1 -> v1.1.2 (session close)
  468. aca7fab 2026-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
  469. d165d00 2026-08-14 IG reshare: fix robustness gap — track vendor list + hashtag map as config (were gitignored), add build-ig-data.js regen script
  470. 86d4ac6 2026-08-14 IG: robust 48h Phase-1 check reminder (launchd one-shot Aug 16 -> verify accounts + CNCP card + notification, self-unloads)
  471. ed1358f 2026-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)
  472. 1079fad 2026-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)
  473. 8ad73fc 2026-08-14 IG: fabric-friday reshare launchd plist (4x/day spaced, cap 6/day) — Steve installs
  474. 0ba22ac 2026-08-14 IG fabric-friday reshare: daily auto-mode — dedup, exclude own posts, hard cap 6/day, business-hours gate; + engagement monitor
  475. 05e1786 2026-08-14 IG: delete-viewer cockpit generator — visual selectable board of old dupes, one-tap open-to-delete + progress tracking
  476. 9cc01ed 2026-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
  477. 5dec32d 2026-08-14 IG: #fabricfriday reshare tool (hashtag-search picks + sassy credit caption, draft/gated --go); crediting blocked on oEmbed perm/login
  478. abf763c 2026-08-14 IG cadence: 3 posts/day per account, spaced ~3.3h during business hours (was 1/day); batch 4->6
  479. 41aaea0 2026-08-14 IG cadence: exclude @goldleafwallpaper (owned by dedicated RML poster) to end double-serving
  480. 93908bc 2026-08-14 auto-data-snapshot: 2026-08-14T11:23:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  481. 0e01034 2026-08-14 auto-data-snapshot: 2026-08-14T10:52:23 (1 data files) — agents/instagram-agent/public/ig-activity.json
  482. f92f6e2 2026-08-14 IG redo: openclaw deletion driver for originals (probe-first, canary, paced --go, verify-each)
  483. 70e6d07 2026-08-14 IG redo: make driver idempotent/resumable (skip already-reposted keys from redo-results)
  484. 6e37304 2026-08-14 IG redo: caption polish (quote-strip colors, broaden SKU suffix, 429 retry) + redo-last5 driver (dry-run + gated --go)
  485. 285fb06 2026-08-14 IG captions: show name+color+SKU (DW model), remove http link from autoCaption
  486. f9e68db 2026-08-14 auto-data-snapshot: 2026-08-14T08:19:45 (1 data files) — agents/instagram-agent/public/ig-activity.json
  487. d39a8c4 2026-08-13 auto-data-snapshot: 2026-08-13T19:38:43 (1 data files) — agents/instagram-agent/public/ig-activity.json
  488. 36693e6 2026-08-13 auto-data-snapshot: 2026-08-13T19:08:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  489. 7b0cfcd 2026-08-13 auto-data-snapshot: 2026-08-13T18:37:41 (1 data files) — agents/instagram-agent/public/ig-activity.json
  490. 221265d 2026-08-13 auto-data-snapshot: 2026-08-13T18:07:15 (1 data files) — agents/instagram-agent/public/ig-activity.json
  491. 6bfef8e 2026-08-13 auto-data-snapshot: 2026-08-13T17:06:27 (1 data files) — agents/instagram-agent/public/ig-activity.json
  492. 635e4e1 2026-08-13 auto-data-snapshot: 2026-08-13T08:21:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  493. 9218915 2026-08-12 auto-data-snapshot: 2026-08-12T19:37:30 (1 data files) — agents/instagram-agent/public/ig-activity.json
  494. d6ec675 2026-08-12 auto-data-snapshot: 2026-08-12T19:06:56 (1 data files) — agents/instagram-agent/public/ig-activity.json
  495. 5c95fa7 2026-08-12 auto-data-snapshot: 2026-08-12T18:36:17 (1 data files) — agents/instagram-agent/public/ig-activity.json
  496. 012d375 2026-08-12 auto-data-snapshot: 2026-08-12T18:04:53 (1 data files) — agents/instagram-agent/public/ig-activity.json
  497. 6a1df86 2026-08-12 auto-data-snapshot: 2026-08-12T17:03:39 (1 data files) — agents/instagram-agent/public/ig-activity.json
  498. 52237e5 2026-08-12 auto-data-snapshot: 2026-08-12T11:28:02 (1 data files) — agents/instagram-agent/public/ig-activity.json
  499. 001e0e9 2026-08-12 auto-data-snapshot: 2026-08-12T10:57:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  500. 970272b 2026-08-12 IG runbook: add Phase 0b — link the 5 email-discovered owned accounts
  501. 5b914e4 2026-08-12 IG fleet: fold 5 email-discovered owned accounts into manifest + stage themes
  502. 2da8980 2026-08-12 auto-data-snapshot: 2026-08-12T10:26:55 (1 data files) — agents/instagram-agent/public/ig-activity.json
  503. f619a9d 2026-08-12 fix(instagram): correct #36 record — @hospitalityfabrics NOT linked to its Page (Connect never completed); needs IG login, not a role-assign
  504. 0f9872f 2026-08-12 auto-data-snapshot: 2026-08-12T09:56:27 (1 data files) — agents/instagram-agent/accounts.json
  505. 603bf3a 2026-08-12 auto-data-snapshot: 2026-08-12T09:25:42 (1 data files) — agents/instagram-agent/public/ig-activity.json
  506. aa159ab 2026-08-12 chore(instagram): reload registry from live token — 35/35 accounts verified active+postable
  507. 05a2f9e 2026-08-12 auto-data-snapshot: 2026-08-12T08:54:38 (1 data files) — agents/instagram-agent/public/ig-activity.json
  508. 87153f0 2026-08-12 feat(instagram): 23 launch-ready onboarding kits (bio+captions+visual+tags+email), built via 4 parallel subagents
  509. 54d99eb 2026-08-12 docs(instagram): phone-verify decision = Steve's phone manual relay
  510. c76b971 2026-08-12 docs(instagram): openclaw-driven paced fleet-build runbook (phase 0 hospitality fabrics, phase 1 pilot, phase 2 scale)
  511. 10b7695 2026-08-12 feat(instagram): IG fleet build manifest + pre-staged cadence themes for 22 new lines
  512. 344ee9b 2026-08-12 docs(instagram): record hospitalityfabrics Page decision (create Hospitality Fabrics Page, DTD 8/8)
  513. 5f05658 2026-08-12 auto-data-snapshot: 2026-08-12T08:23:24 (1 data files) — agents/instagram-agent/public/ig-activity.json
  514. b83f617 2026-08-12 auto-data-snapshot: 2026-08-12T07:52:17 (1 data files) — agents/instagram-agent/package-lock.json
  515. aa2a34b 2026-08-12 chore: lint fixes (surface local feed write errors, non-blocking intra-batch sleep) + version bump (session close)
  516. 2fa68ee 2026-08-12 daily-cadence: ffepurchasing -> woven texture (broader clean pool)
  517. 5fd4684 2026-08-12 daily-cadence: broaden beverlyhillsvideos/ffepurchasing keywords (narrow pools exhausted, couldn't source)
  518. 8c1fc0a 2026-08-11 auto-data-snapshot: 2026-08-11T13:51:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  519. 40f3825 2026-08-11 auto-data-snapshot: 2026-08-11T13:21:01 (1 data files) — agents/instagram-agent/public/ig-activity.json
  520. f700cdd 2026-08-11 daily-cadence: posting-hours guard (Mon-Sat 08:00-20:00) + draft launchd plist for durable cadence
  521. 1ec2435 2026-08-11 daily-cadence: velocity tripwire (stop batch on 'restricted') + intra-batch pacing
  522. 18ad401 2026-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
  523. f0e553d 2026-08-11 IG captions: strip internal mfr SKU numbers from title (Koroseal '2308790' was leaking)
  524. 4dbe72e 2026-08-11 IG: private-label leak guard — refuse to post products whose image URL/vendor exposes a hidden upstream (luca/momentum/wallquest/etc.)
  525. c9d175d 2026-08-11 auto-data-snapshot: 2026-08-11T11:45:12 (1 data files) — agents/instagram-agent/public/ig-activity.json
  526. cf737ee 2026-08-11 IG post skill: poll container readiness before publish (fixes 'Media ID is not available' race)
  527. 56427de 2026-08-11 auto-data-snapshot: 2026-08-11T10:12:37 (1 data files) — agents/instagram-agent/public/ig-activity.json
  528. eee32bd 2026-08-11 auto-data-snapshot: 2026-08-11T09:10:52 (1 data files) — agents/instagram-agent/public/ig-activity.json
  529. 8fe7c41 2026-08-11 auto-data-snapshot: 2026-08-11T08:39:13 (1 data files) — agents/instagram-agent/public/ig-activity.json
  530. 2d8bec8 2026-08-11 ig-activity: best-effort scp to live marketing.dw after each post (keeps panel fresh)
  531. 37895ae 2026-08-11 IG captions: strip price + raw vendor (was leaking $4.25 memo price); quality + DW-service messaging, per-product variation (anti-spam)
  532. 85c7619 2026-08-10 auto-data-snapshot: 2026-08-10T13:03:09 (1 data files) — agents/instagram-agent/package-lock.json
  533. 02b2ffa 2026-08-10 chore: lint (0 fixes) + refactor (STORY_TTL_MS) + v1.1.0 (session close)
  534. 8a9959f 2026-08-10 IG poster: --product <handle> pulls a real DW product (live storefront) and auto-composes image+caption; verified dry-run on Shakespeare Mural
  535. 5dd450b 2026-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
  536. dfc3f02 2026-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)
  537. 0daec04 2026-08-10 IG: linking checklist for the 45 unlinked Pages (tiered by brand value)
  538. 57ebb5d 2026-08-10 IG poster: poll container to FINISHED for images too (fixes 'Media ID is not available'); verified live post to @patterndesignlab
  539. 6b3ec24 2026-08-10 IG multi-account posting: registry + resolver + post-to CLI over 35 linked accounts (shared META token, dry-run-gated)
  540. 564be77 2026-08-10 TK-10395: cap reel container poll at 12x4s so 3x-retry worst case < client 240s
  541. 9897011 2026-08-10 TK-10395: bounded retry-on-2207076 in reel skill (Meta transient media-upload failure)
  542. cbfbf08 2026-08-08 Norma pre-deploy gate: run durable smoke battery before any live restart
  543. f2f2df6 2026-08-08 deploy hygiene (TK-10370): build-then-restart-then-health-gate reload + silence lockfile-root warning
  544. bc9cfde 2026-08-07 auto-data-snapshot: 2026-08-07T18:31:41 (2 data files) — package-lock.json package.json
  545. dd76104 2026-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)
  546. efc419d 2026-08-06 chore: refactor (drop dead testpulse login in api-smoke) + v0.1.4 (session close)
  547. a945908 2026-08-06 test(cycle7 Cody-gate): mutation role-matrix + isolation positive-control
  548. f7e95d8 2026-08-06 test(cycle7): authorization-matrix + tenant-isolation suite (real tenant fixtures)
  549. 2a8a6c7 2026-08-06 test(cycle6 Cody-gate): CRUD tests real org id-space; non-hollow admin E2E
  550. e958e07 2026-08-06 test(cycle6): CRUD lifecycle suite (create->read->update->delete) + admin E2E journey
  551. d26f6c6 2026-08-06 fix(cycle5 Cody-gate): truly-empty-body probe + readJson across 93 routes
  552. 959da8b 2026-08-06 test+fix(cycle5): write-path smoke (216 mutations) + Playwright E2E (3 tiers) + fixes surfaced
  553. 9ba7940 2026-08-06 auto-data-snapshot: 2026-08-06T10:52:46 (2 data files) — package-lock.json package.json
  554. 39264f3 2026-08-06 fix(api)+test: close Cody-gate gaps — all 14 uuid=text casts + org-scoped smoke + deterministic fixture
  555. eb853c3 2026-08-06 fix(api): 4 GET-500s surfaced by api-smoke (onboard/library real; auth-google/clickup status)
  556. 8bbee18 2026-08-06 test(api-smoke): durable fs-enumerated GET sweep over all 271 routes (test:api/test:smoke)
  557. f4c1615 2026-08-06 auto-data-snapshot: 2026-08-06T10:21:57 (1 data files) — package.json
  558. 24209b8 2026-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
  559. b98a5b6 2026-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)
  560. 89bc532 2026-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
  561. e390f1a 2026-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)
  562. e0ef009 2026-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
  563. f63804e 2026-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
  564. d9cb4a2 2026-08-05 auto-save: 2026-08-05T13:12:15 (2 files) — scripts/test-instance.sh tests/
  565. df259fc 2026-08-05 login: standard username/password only (remove Google/Apple OAuth); harden /api/auth/login to 400 on non-JSON body
  566. 19d20a6 2026-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)
  567. 0ecc4bb 2026-07-23 instagram-agent fully LIVE: real token installed, monitor/discover/report un-stubbed (Steve-authorized), Graph v21 metrics fixed
  568. 009cc0e 2026-07-23 auto-save: 2026-07-23T08:19:35 (2 files) — agents/instagram-agent/skills/discover.js agents/instagram-agent/skills/monitor.js
  569. d6a46ba 2026-07-23 auto-save: 2026-07-23T07:19:17 (1 files) — scripts/gmail-backfill.mjs
  570. 71ee990 2026-07-14 instagram-agent: env-configurable Graph host (IG_GRAPH_HOST) — support Facebook-Login flow (page token + IG business id) alongside Instagram-Login
  571. 4296767 2026-07-13 instagram-agent: make reel skill account-aware (close cross-brand IG-token leak)
  572. 4b35b8b 2026-07-13 chore: v0.1.3 (dashboard CSS refactor)
  573. 06efeb4 2026-07-13 refactor(agent-base): hoist static dashboard CSS to a module const
  574. 3f1fb79 2026-07-13 chore: version bump (session close — SSRF guard + security P0 verification)
  575. d89eedb 2026-07-12 docs(security): record P0#1-3 + P1 SSRF remediation as resolved in April audit
  576. 339bfa1 2026-07-12 security(P1): add shared SSRF guard blocking private/reserved/loopback hosts on user-URL fetches
  577. e849e5e 2026-07-12 chore: version bump (session close — Norma platform + agent recovery, login/schema-drift fixes, dashboard)
  578. 56c1819 2026-07-11 Fix tier_credentials schema drift in users + gmail routes
  579. 67b9d9d 2026-07-11 Fix tier_credentials schema drift in auth + impersonate routes
  580. 34faae1 2026-07-11 Fix tier_credentials schema drift in settings CRUD routes
  581. 02aa465 2026-07-11 auto-save: 2026-07-11T08:42:28 (1 files) — app/api/auth/login/route.ts
  582. a56a5b2 2026-07-10 dashboard: harden escaping for attribute context (contrarian gate)
  583. e171109 2026-07-10 Norma dashboard: enrich GET / with insights + media grid (cache-backed)
  584. d5eb7cb 2026-07-10 Norma instagram-agent: add RECOVERY.md (deps-location gotcha, auth, durability)
  585. c3b02e4 2026-07-10 agent-base: fix route shadowing + server-render status dashboard
  586. d870e86 2026-07-10 Norma agents: add read-only status dashboard at GET / (behind auth)
  587. 6bfda49 2026-06-01 Global search: mount on Supervisor + Pulse tiers
  588. d1e1e9f 2026-05-31 fix: add rel=noopener noreferrer to 32 target=_blank links in inbox mockup index; expand .gitignore backup patterns
  589. de055dc 2026-05-30 security: strip hardcoded dw_admin DSN password -> env-first (.mjs straggler). No rotation/deploy.
  590. 351dc6f 2026-05-30 security: strip hardcoded dw_admin DSN password -> env-first/passwordless. No rotation/deploy.
  591. 9f230e8 2026-05-30 security: strip hardcoded dw_admin DSN password -> env-first (DATABASE_URL); passwordless localhost fallback. No rotation/deploy.
  592. d7ebee0 2026-05-28 wire Morning Batch + weekly_intelligence to PM2 cron — fixes 77d/72d stale tables
  593. 1c814a5 2026-05-28 norma-scraper: load .env.local via interpreter_args so SESSION_SECRET reaches the cron — fixes 401 loop
  594. 9da3971 2026-05-21 defensive: explicit body[data-inbox-theme='classic-dense'] selector
  595. e7eb3fb 2026-05-21 feat(theme): hoist InboxThemeBanner + AgeThemeSlider into app/layout.tsx
  596. da7d403 2026-05-20 docs(sessions): log brute-force-protection learnings (commit a934a3b)
  597. a934a3b 2026-05-20 feat(auth): brute-force-resistant login rate-limit (10 fails/15min per IP, 30min lockout)
  598. 27ac398 2026-05-20 tasks: mark #52 (admin impersonation UI) DONE
  599. 983afae 2026-05-20 feat(impersonate): wire the View-as dropdown + Acting-as banner into AppShell
  600. 6427fe3 2026-05-20 session 2026-05-20: log roles+perms+modal-fanout+gmail-per-user+disk-save+admin-union
  601. 491a469 2026-05-20 docs+infra: gmail connect note (password redacted) + linter-touched messages route
  602. 6daaa2a 2026-05-20 fix(theme): apply 32 inbox-theme skins at body level so dropdown clicks visibly re-skin the whole page
  603. 1b1cbbd 2026-05-20 fix(theme): apply inbox-theme skins at body level so dropdown clicks re-skin the whole page immediately
  604. 493c5ca 2026-05-20 feat(theme): full-width inbox-theme banner at top of AppShell
  605. aff9106 2026-05-20 feat(theme): hoist inbox theme switcher to global AppShell header
  606. 52b42ae 2026-05-20 fix(gmail): scope Gmail CRM to current user's mailbox, not hardcoded natalia
  607. 1a1a9c9 2026-05-20 feat(modals): fan out ResizableModal to 22 modals across 15 files
  608. 48c4ff8 2026-05-20 feat(inbox): +16 themes (v17-v32) — total 32 live + dropdown-wired
  609. 66f0f44 2026-05-20 feat(inbox): 10 more theme mockups (v7-v16) + live theme dropdown in GmailCRMTab
  610. c040185 2026-05-20 session 2026-05-20: log roles/perms/modals + infra fires + 4 user seed
  611. 0cc4fc0 2026-05-20 feat(mockups): 6 inbox UI variants — Classic Dense / Notion Cards / Linear Keyboard / Apple Mail / Front Conversation / Hey Zero-Distraction
  612. 0b3e6f5 2026-05-20 feat(modals): shared ResizableModal with full-screen toggle + drag-resize
  613. 364302c 2026-05-20 feat(gmail): per-message Assign-to + per-user read receipts + inline-expand layout
  614. 4cf4812 2026-05-20 feat(auth): intern role + user fields + admin-editable role × feature permissions matrix
  615. cfcf551 2026-05-20 feat(admin): comprehensive API/Token/MCP registry + age-adaptive theme slider
  616. 806aa47 2026-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
  617. be67c76 2026-05-20 session 2026-05-20: log 9 task entries (petition debounce, modal video, 4 pay-down todos)
  618. 48eadf2 2026-05-20 docs: modal training one-pager for SDCC staff (companion to walkthrough video)
  619. 4974b87 2026-05-20 fix(editor): set immediatelyRender:false on Tiptap useEditor — Next 15 + React 19 SSR hydration error blocked petition pipeline editor render
  620. e4d293d 2026-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
  621. 8e33265 2026-05-20 petition create: debounce double-submit via useRef guard + 30-min server-side merge window
  622. bb7a05d 2026-05-20 fix(api): cast org_id param as ::uuid not ::text in pipeline/stats + settings
  623. 15fe508 2026-05-20 docs: morning wakeup brief — DB password fix + verification path
  624. 433445a 2026-05-20 fix(pulse-public): silence 401 spam, unblock topics for guests, hide Apple OAuth stub, add sign-in CTA
  625. b7eda89 2026-05-20 fix(types): unblock SocialTab render, IntegrationsTab metadata, credentials rowCount null
  626. 3defa0e 2026-05-19 instagram-agent: enable live reel/story/post publishing via graph.instagram.com (Instagram Login API)
  627. 36f759a 2026-05-13 snapshot: 12 file(s) changed, ~12 modified
  628. e5b64d8 2026-05-06 initial scaffold (gitify-all 2026-05-06)

Authors

Agents used

  • none detected

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

Commits with substantial prose (≥120 chars) — the rationale behind each move.

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

986 files tracked. Click any to browse the source at HEAD.

Other build journals

← Norma  ·  all 4 projects  ·  Patty →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 6ms