docs(adr): ADR-179, a dropped forced source is recorded on the run - #828
Conversation
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
There was a problem hiding this comment.
Automated approval for maintainer PR
All automated quality gates passed. See SECURITY_CONTROLS.md for compensating controls.
|
Review record — the Copilot review did not run (monthly, account-wide quota), so The anchor claim was wrong when I first made it, and I corrected it before writing the record. I had said Each of the three decisions carries its reason, and two of them turn on something other than cost. Not refusing the run is decided on who pays: switching off a snippet is routine maintenance, and making it fail other people's queued work turns a safe action into one nobody dares take. Splitting "deleted" from "switched off" is decided on remedy: one is reversible, the other is not, so a single "dropped" would send a reader looking. The scope exclusions were checked against the records they cite, not asserted: ADR-166 and ADR-175 do keep a deactivated source resolving on a resume, so nothing is dropped there and a report would imply otherwise.
68 ADR-suite tests pass; the three repo checks pass. No PHP is touched, so no CHANGELOG entry and no behaviour moves. The implementation follows as its own PR — deliberately split, so the decision can be argued before the code exists. Merging on that basis. |
|
Self-review: a1a2479 The review this pull request demands is unsatisfiable (Copilot quota wall or repeated bot failures on this head). Per the documented fallback, the diff on this head was reviewed by the PR author; this comment is the on-the-record attestation the merge gate reads back. It stops matching on the next push. |
ADR-175 settled which sources enter a queued run when it is dequeued. It left what the operator is told, which today is nothing: the source is dropped, the run proceeds without it, and the only way to notice is to compare the queued request against the transcript. Three decisions, and the reasons are the load-bearing part. Recorded on the run rather than only logged. A log answers "did it happen"; the operator asks "why did this run differ from the one I queued", and that is asked at the run. It travels on RunAugmentation from the rehydration that drops it and is written through RunTrace — ADR-151's channel, already rendered by Backend/AgentRun/Show.html. No new surface. The run is not refused. Refusing is defensible on cost, and rejected on who pays: switching off a snippet is routine maintenance, and making it fail other people's queued work turns a safe action into one nobody dares take. Deleted and switched off read differently. A single "dropped" would flatten two operator actions with different remedies — one is reversible, the other is not. Deliberately out: the resume path, where ADR-166 and ADR-175 keep a deactivated source resolving on purpose, so nothing is dropped; and notifications, because answering that here for one case would settle it for all of them by accident. Numbered 179, not 178. PR #827 claimed 178 eleven minutes before this branch existed, and I had checked the highest number on main instead of across the open branches — which is exactly the collision the worktree rule warns about. The earlier claim keeps the number. Refs #809 Signed-off-by: Sebastian Mendel <sebastian.mendel@netresearch.de>
a1a2479 to
367ed08
Compare
|
Renumbered from ADR-178 to ADR-179, now #827 claimed 178 at 14:04, eleven minutes before this branch existed. I had checked the highest number on Renamed the record, its The previous self-review attestation died with this push, as designed. It rested on the old head and this is a different one. The toctree now reads … 177, 179 with a gap where #827's 178 lands. Whichever of the two merges second will conflict on that line and the resolution is to keep both in ascending order — mechanical, and worth naming here so it is not re-derived under time pressure. |
|
There was a problem hiding this comment.
Automated approval for maintainer PR
All automated quality gates passed. See SECURITY_CONTROLS.md for compensating controls.
|
Review record for head What changed since the last record is the number and every reference to it: the record file, its The decision content is unchanged and reviewed as before: recorded on the run rather than only logged, the run is not refused, and "deleted" reads differently from "switched off". The two exclusions were checked against the records they cite — ADR-166 and ADR-175 do keep a deactivated source resolving on a resume, so nothing is dropped there. 74 checks pass, 0 fail, 0 unresolved threads. No PHP is touched, so no CHANGELOG entry and no behaviour moves. Merging on that basis. |
|
Self-review: 367ed08 The review this pull request demands is unsatisfiable (Copilot quota wall or repeated bot failures on this head). Per the documented fallback, the diff on this head was reviewed by the PR author; this comment is the on-the-record attestation the merge gate reads back. It stops matching on the next push. |



The decision behind #809, before any code. No behaviour changes here.
The problem: a run queued with a forced snippet or skill loses it if someone switches that record off before the run starts. The run proceeds without it and says nothing. The only way to notice is to compare the queued request against the transcript.
ADR-175 made this uniform rather than lopsided — before it, a snippet disappeared and a skill survived — which is what turns it into one question with one answer.
Three decisions
Recorded on the run, not only logged. A log answers "did it happen", which serves support. The operator asks "why did this run differ from the one I queued", and that is asked at the run. It travels on
RunAugmentationfrom the rehydration that drops it and is written throughRunTrace— ADR-151's channel, whose stepsBackend/AgentRun/Show.htmlalready renders. No new surface is invented.The run is not refused. Refusing a queued run is defensible on cost — nothing has been sent, so it costs only a message. Rejected on who pays: switching off a snippet is routine operator maintenance, and making it fail other people's queued work turns a safe action into one nobody dares take. A run that proceeds and says so is recoverable; a refused run is somebody else's incident.
"Deleted" and "switched off" read differently. Both resolve to nothing today and a single "dropped" would flatten them. They are different actions with different remedies — one is reversible, the other is not — and a reader who cannot tell them apart has to go looking.
Deliberately out
One correction I made while writing this
I had told the user the anchor was step metadata, citing
droppedTurnsinToolLoopService. That line is a log call, not a step. Its own comment names the real one — the context step ADR-151 records throughRunTrace. The decision above uses that channel; the sentence I said out loud first was wrong.Why this is its own PR
The implementation is roughly the size of #823: a field on
RunAugmentation, the codec computing the difference, the trace write, the template, and tests. Splitting the decision out means it can be argued before that exists, and it gives an early checkpoint rather than a long silent stretch — which is the pattern that went wrong earlier today.68 ADR-suite tests pass; the three repo checks pass. No PHP is touched.
Refs #809