Let a thread's transcript hold what happened
The 16 KB payload ceiling on `thread_events` was inherited, not reasoned. The
same bound sits on `voice_events`, `scv_run_events`, and program receipts, and
the schema said outright that it followed `OpenAgents.SCV.ExecutionEvent`. Where
that bound is justified, it is justified by those tables carrying no content:
the SCV audit records that an event payload is reduced to a fixed key allowlist
and that no file path, tool argument, tool output, or report prose reaches a
row, and `ComputerActivity` states that its events are a projection and never
the authority.
`thread_events` is the authority, and the bar is a full ATIF trajectory. A
ceiling designed to keep content out of a projection is the wrong rule for the
table that holds the content, and the previous change proposed splitting
reasoning across events to satisfy it — solving a wire problem in the store, and
charging every future reader a reassembly step for it. A single reasoning block
observed in a live session is 38,791 characters.
So the ceiling is dropped. The floor stays at "is a JSON object", which an event
carrying nothing but its type satisfies; the schema pin and the append-only
shape are untouched. `INVARIANTS.md` moves with it, and says why the number is
gone rather than only that it is.
Storing and sending are now stated as separate questions. The record holds every
turn, all of the reasoning, and every tool result whole. What a client sends to
a model stays bounded by the client, where a context budget belongs.
One claim corrected on the way: the remaining floor does not mean an event
"says something" — `{}` is two bytes and passes, and the route defaults an
absent payload to exactly that. The test now asserts what the constraint does
rather than what I first said it did.
Also, the precommit gate is scaled to the change. It compiled, audited, built
assets, and ran four thousand tests for a one-line documentation edit, which is
how a gate stops being run. A change touching only Markdown that no code or test
names by path now runs only the checks that read prose; everything else, and
anything ambiguous, takes the whole gate as before. Several documents here are
read by the suite, so the rule is by path rather than by extension.
4155 tests pass.
Let a thread's transcript hold what happened
Deploy story
What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.
- pushed
- by user · WAL seq 292 · 2026-08-24T18:57:55.529249Z
Changed files
-
modified
INVARIANTS.md -
modified
docs/2026-08-24-coder-account-integration-audit.md -
modified
lib/openagents/threads/event.ex -
modified
mix.exs -
added
ops/dev/precommit.sh -
modified
priv/migration_lineages/prior-2026-08-19.json -
added
priv/repo/migrations/20260824184030_relax_thread_event_payload_ceiling.exs -
modified
test/openagents/threads_test.exs -
modified
test/openagents_web/controllers/thread_controller_test.exs
Diff
9 files changed, +258 -54
INVARIANTS.md modified +12 -5
@@ -1968,11 +1968,18 @@ conversation, and a thread is not one.
| 1968 | 1968 |
|
| 1969 | 1969 |
|
| 1970 | 1970 |
|
| 1971 |
|
|
| 1972 |
|
|
| 1973 |
|
|
| 1974 |
|
|
| 1975 |
|
|
| 1971 |
|
|
| 1972 |
|
|
| 1973 |
|
|
| 1974 |
|
|
| 1975 |
|
|
| 1976 |
|
|
| 1977 |
|
|
| 1978 |
|
|
| 1979 |
|
|
| 1980 |
|
|
| 1981 |
|
|
| 1982 |
|
|
| 1976 | 1983 |
|
| 1977 | 1984 |
|
| 1978 | 1985 |
|
docs/2026-08-24-coder-account-integration-audit.md modified +54 -26
@@ -141,11 +141,13 @@ about taste.
| 141 | 141 |
|
| 142 | 142 |
|
| 143 | 143 |
|
| 144 |
|
|
| 145 |
|
|
| 144 |
|
|
| 145 |
|
|
| 146 |
|
|
| 146 | 147 |
|
| 147 | 148 |
|
| 148 |
|
|
| 149 |
|
|
| 150 |
|
|
| 149 | 151 |
|
| 150 | 152 |
|
| 151 | 153 |
|
@@ -156,16 +158,15 @@ Measured against four real coder sessions from the same afternoon:
| 156 | 158 |
|
| 157 | 159 |
|
| 158 | 160 |
|
| 159 |
|
|
| 160 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 165 |
|
|
| 165 | 166 |
|
| 166 | 167 |
|
| 167 | 168 |
|
| 168 |
|
|
| 169 |
|
|
| 169 | 170 |
|
| 170 | 171 |
|
| 171 | 172 |
|
@@ -184,8 +185,8 @@ Recorded, in the order they happen:
| 184 | 185 |
|
| 185 | 186 |
|
| 186 | 187 |
|
| 187 |
|
|
| 188 |
|
|
| 188 |
|
|
| 189 |
|
|
| 189 | 190 |
|
| 190 | 191 |
|
| 191 | 192 |
|
@@ -199,20 +200,47 @@ A delta is how a reply arrived rather than what it is, and a transcript that
| 199 | 200 |
|
| 200 | 201 |
|
| 201 | 202 |
|
| 202 |
|
|
| 203 |
|
|
| 204 |
|
|
| 205 |
|
|
| 206 |
|
|
| 207 |
|
|
| 208 |
|
|
| 209 |
|
|
| 210 |
|
|
| 211 |
|
|
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
|
|
| 203 |
|
|
| 204 |
|
|
| 205 |
|
|
| 206 |
|
|
| 207 |
|
|
| 208 |
|
|
| 209 |
|
|
| 210 |
|
|
| 211 |
|
|
| 212 |
|
|
| 213 |
|
|
| 214 |
|
|
| 215 |
|
|
| 216 |
|
|
| 217 |
|
|
| 218 |
|
|
| 219 |
|
|
| 220 |
|
|
| 221 |
|
|
| 222 |
|
|
| 223 |
|
|
| 224 |
|
|
| 225 |
|
|
| 226 |
|
|
| 227 |
|
|
| 228 |
|
|
| 229 |
|
|
| 230 |
|
|
| 231 |
|
|
| 232 |
|
|
| 233 |
|
|
| 234 |
|
|
| 235 |
|
|
| 236 |
|
|
| 237 |
|
|
| 238 |
|
|
| 239 |
|
|
| 240 |
|
|
| 241 |
|
|
| 242 |
|
|
| 243 |
|
|
| 216 | 244 |
|
| 217 | 245 |
|
| 218 | 246 |
|
lib/openagents/threads/event.ex modified +11 -4
@@ -3,9 +3,16 @@ defmodule OpenAgents.Threads.Event do
| 3 | 3 |
|
| 4 | 4 |
|
| 5 | 5 |
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 9 | 16 |
|
| 10 | 17 |
|
| 11 | 18 |
|
@@ -39,6 +46,6 @@ defmodule OpenAgents.Threads.Event do
| 39 | 46 |
|
| 40 | 47 |
|
| 41 | 48 |
|
| 42 |
|
|
| 49 |
|
|
| 43 | 50 |
|
| 44 | 51 |
|
mix.exs modified +4 -12
@@ -152,18 +152,10 @@ defmodule OpenAgents.MixProject do
| 152 | 152 |
|
| 153 | 153 |
|
| 154 | 154 |
|
| 155 |
|
|
| 156 |
|
|
| 157 |
|
|
| 158 |
|
|
| 159 |
|
|
| 160 |
|
|
| 161 |
|
|
| 162 |
|
|
| 163 |
|
|
| 164 |
|
|
| 165 |
|
|
| 166 |
|
|
| 155 |
|
|
| 156 |
|
|
| 157 |
|
|
| 158 |
|
|
| 167 | 159 |
|
| 168 | 160 |
|
| 169 | 161 |
|
ops/dev/precommit.sh added +81
@@ -0,0 +1,81 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
|
|
| 49 |
|
|
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
|
|
| 57 |
|
|
| 58 |
|
|
| 59 |
|
|
| 60 |
|
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|
|
| 64 |
|
|
| 65 |
|
|
| 66 |
|
|
| 67 |
|
|
| 68 |
|
|
| 69 |
|
|
| 70 |
|
|
| 71 |
|
|
| 72 |
|
|
| 73 |
|
|
| 74 |
|
|
| 75 |
|
|
| 76 |
|
|
| 77 |
|
|
| 78 |
|
|
| 79 |
|
|
| 80 |
|
|
| 81 |
|
priv/migration_lineages/prior-2026-08-19.json modified +2 -1
priv/repo/migrations/20260824184030_relax_thread_event_payload_ceiling.exs added +40
@@ -0,0 +1,40 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
test/openagents/threads_test.exs modified +16 -6
@@ -87,16 +87,26 @@ defmodule OpenAgents.ThreadsTest do
| 87 | 87 |
|
| 88 | 88 |
|
| 89 | 89 |
|
| 90 |
|
|
| 90 |
|
|
| 91 | 91 |
|
| 92 | 92 |
|
| 93 | 93 |
|
| 94 |
|
|
| 95 |
|
|
| 96 |
|
|
| 97 |
|
|
| 94 |
|
|
| 95 |
|
|
| 96 |
|
|
| 97 |
|
|
| 98 |
|
|
| 99 |
|
|
| 100 |
|
|
| 101 |
|
|
| 102 |
|
|
| 103 |
|
|
| 104 |
|
|
| 105 |
|
|
| 106 |
|
|
| 107 |
|
|
| 98 | 108 |
|
| 99 |
|
|
| 109 |
|
|
| 100 | 110 |
|
| 101 | 111 |
|
| 102 | 112 |
|
test/openagents_web/controllers/thread_controller_test.exs modified +38
@@ -571,6 +571,44 @@ defmodule OpenAgentsWeb.ThreadControllerTest do
| 571 | 571 |
|
| 572 | 572 |
|
| 573 | 573 |
|
| 574 |
|
|
| 575 |
|
|
| 576 |
|
|
| 577 |
|
|
| 578 |
|
|
| 579 |
|
|
| 580 |
|
|
| 581 |
|
|
| 582 |
|
|
| 583 |
|
|
| 584 |
|
|
| 585 |
|
|
| 586 |
|
|
| 587 |
|
|
| 588 |
|
|
| 589 |
|
|
| 590 |
|
|
| 591 |
|
|
| 592 |
|
|
| 593 |
|
|
| 594 |
|
|
| 595 |
|
|
| 596 |
|
|
| 597 |
|
|
| 598 |
|
|
| 599 |
|
|
| 600 |
|
|
| 601 |
|
|
| 602 |
|
|
| 603 |
|
|
| 604 |
|
|
| 605 |
|
|
| 606 |
|
|
| 607 |
|
|
| 608 |
|
|
| 609 |
|
|
| 610 |
|
|
| 611 |
|
|
| 574 | 612 |
|
| 575 | 613 |
|
| 576 | 614 |
|