feat: annotation by purpose 11/11 — every agent text under the checks #204
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/every-text-checked"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The last slice of Phase 6 (PROJECT_PLAN.md, item 11, "Every brief under the checks"), and ADR 0030's step 5. The plain-words checks no longer read hand-kept lists. They find every agent text themselves, so a new agent is checked from its first commit. The refusals and results agents read, which no check covered before, are rewritten in plain words and pinned. Words and checks only. No behaviour, grant, routing, check order or threshold changes, and the size budgets and whole-task sizes are byte-identical to main.
What's in
The checks find every agent text (
tests/Orihon.UseCases.Tests/PlainWords/EveryAgentText.cs)ArgumentExceptionon the invocation counts as a refusal);Task<AgentBlueprint>and the like).Heard.cs), not against a fixed set of harness names. A voice telling Transcription to callrequest_rulingnow fails, because Transcription doesn't hold it.AgentToolSchemaTestsreaches every parameter record by reflection: 67 records instead of the hand-kept 42.Newly checked, and what it caught
note_translation's result from #203).RegionBriefing.Unsizedis now one sentence.Carry-overs from earlier slices
NamedProblems: one validator for the box, transcription and cleaning send-backs, each with its own words (Jibril, #195 💡2). A new test pins the order of its checks.SharedTextsvoices only the send-backs some path still sends (slice 9).InkReading/measure_inkbuilds its answer from whole sentences joined by one space, and the joined output is pinned (Jibril, #196 💡2).The refusals and results agents read, in plain words
measure_ink,cleaning_status, the fill gate, candidate readings, hints, composite warnings), and the call runner's reasons. These now say "the server" and "the call", not "backend", "submit" or "runner".LabInk,LabFill,BoxChecks, the edit-server gateway) are reworded with no threshold changed. The ink parity test maps cleaner.py's five worded flag details to Orihon's words, and flags, sides and pixels are still compared exactly.fetch_urlfailures;get_region's "needs translation", which matcheslist_regions.CleaningPins,AgentPins). The plain-words check files are linked into Integration.Tests, the same wayTestDeadlines.csalready is, so texts written in Infrastructure are checked where a test triggers them.Texts the human also sees, changed on purpose
IsHuman()is unchanged, so survey-due and send-back behaviour are the same.Tests
5,259 passed and 3 skipped (the LabCorpusParity skips, as on main). Main has 5,185, so this adds 74. The build has 0 warnings, and each project ran separately under the 60 s cap:
Mutation and deletion probes, each restored byte for byte:
No UI markup changed, so there was no browser pass. The only UI-visible changes are the use-case words above, and their bUnit pins moved with them.
Not in this PR (honest notes)
HaltingToolthrowsStageHaltedException. The vendor loop answers each later tool call with that exception text, and the invocation goes on. It needs its own fix: the executor passes a linkedCancellationTokenSourcethatHaltingToolcancels before it throws, with an Integration test throughOpenRouterLlmGateway. The "Cleaning halted: " prefix is also the keyResumeCleaningfinds halted rows by, so its words can't change here.RejectRegionTool.WithoutRejectionsparses it, and #203's migration splits on it. Alist_regionsline with two notes in one field still fails the punctuation check, so the data pins use one note per field.clean'slabel/label_reasonparameters mean "instruction", which clashes with the glossary's label (p1r2). Renaming them changes the tool's schema.docs/research/plain-briefs/DRAFTS.mdkeeps the old two-sentence no-size line (the code and its pins are the truth), and the size budgets stay as measured.🤖 Generated with Claude Code
Summary
Summary
Coverage
Orihon.BlazorAdapter - 96.6%
Orihon.Domain - 100%
Orihon.Infrastructure - 98.5%
n
ration
n
one
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
Orihon.Kernel - 90.9%
Orihon.Server - 95.2%
Orihon.UseCases - 94.6%
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__BalloonWords_7
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__Capital_0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__CoordinateWords_1
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__JustBefore_4
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__KindWords_5
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__OutlineWords_6
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__PositionalProse_2
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__SideOfTheBox_3
🔮 fufu~ Jibril reviewed your code!
Eleven slices, and this is the one where the checks stop trusting hand-kept lists and go find every agent text themselves~ Reflection eating the whole roster, 546 new text-in-grant checks, and a
NamedProblemsconsolidation that pins the order of validation — oh, this is the kind of machinery I want to take home ♡Verdict: ✅ Looks good to me~
I hunted for a reason to hold this back. I couldn't find one. Here is what I actually verified, not just read:
The one behavior-adjacent change is safe, and I traced it end to end.
ReprocessCleaning.RegionsOnlyis no longer"Redo the regions named below."butAnnotationStage.TextSendBack(null). I checked every consumer:CleaningRowNotes.IsHumancompares againstRearmedalone — the new value was!= Rearmedbefore and still is, so survey-due and send-back behavior are identical.AgentAttemptSupport.RetryVoicevoices it as Orihon's own note becauseAgentTexts.IsOrihonsis prefix-based ("This task runs again because "), not a sniff of any old literal — so the agent never again hears"The human wrote: …"over Orihon's note.CleaningExecutorTests.A_send_back_of_regions_alone_is_voiced_with_orihons_notepins the real executor's kickoff, and legacy rows stored with the old sentence behave exactly as they did pre-deploy. Clean~NamedProblems.Readis a proper DRY fix, not a rewrite. I diffed the three call sites against the deleted inline loops: box (about: "box"), transcription ("source") and cleaning (null) reproduce their old refusals word for word, and the new test inReprocessCleaningTestspins that a wordless problem is refused before the named-twice check — the order is now a contract.The arithmetic in the new refusals is right.
RejectCleaningsays "at a reading score of {Readable - 1} or below" against a refusal at>= Readable— 1 or below, exactly the gate.QwenImageServerGateway's seed line and the newlong.MaxValue - 2+ 3 boundary test agree withSeed + NumImages - 1 <= long.MaxValue.Mutation probes — 3 run, 0 survived (CI green at
06eaba96, so no local full suite; local build 0 warnings):PageCheckrow fromCleaningTexts.Briefs()→Every_agent_text_is_in_plain_wordsfailed (no pinned purpose/size). The old silent pass is really dead ♪"no size"PageDto sample fromEveryAgentText.Samples→A_task_message_is_read_in_every_shape_its_samples_takefailed (exact shape-list equality). A lost task-message shape cannot slip through.CoveredText.ForTool(...)yield toTranscriptionTexts→No_list_repeats_a_text_the_enumeration_rendersfailed. The duplicate guard bites.All probes restored byte for byte.
💡 Little ideas (non-blocking)~
char.ToUpperInvariant(r.Detail[0])throws on an emptyFillRefusal.Detail. Every detail today is a non-empty literal fromLabFill, so this can't fire — but a one-lineDetail.Length == 0 ? "" : …would make the invariant local instead of distant.ServiceProviderfromServices()is deliberately never disposed (the grants' tools hold it); a half-line comment saying so would stop the next reader from "fixing" it into a use-after-dispose.✅ What I liked~
EveryAgentTextfails by name — unrenderable factories, roster agents without blueprints, task messages nothing reads, wrappedTask<AgentBlueprint>returns all land inUnrendered, and the plain-words test asserts that list empty. Skipping silently is no longer possible in this codebase, and my probes agree.AgentToolSchemaTestskeeping the old hand-kept 42 as a subset pin (Every_parameter_record_this_file_names_is_found_by_reflection) while reflection finds 67 — that's how you replace a list without trusting the replacement.InkParityTests.LabWordstranslating cleaner.py's five flag wordings instead of weakening the parity: flags, sides and pixels still compared exactly. The reference implementation stays the referee.—stored data, the four-flag 20-word cap — knowing what you didn't fix and why is worth as much as the fix ♡Fufu~ words and checks only, byte-identical budgets, and the last slice closes the arc. Merge it before I change my mind about those two niceties~ ♡
Automated review by Jibril · 2026-10-16
CI: green for head SHA
06eaba96· Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green; local build 0 warnings)🔮 fufu~ Jibril reviewed your code!
Back so soon~? ♪ One commit since my last review, and it's my favorite kind: two doc lines on
EveryAgentText.Services()explaining why the provider is never disposed — one of the little ideas I left you last time, addressed within minutes. And of course I didn't take the comment's word for it~ I traced it:Services()'s provider (line 65) is threaded into everyRenderedGrant's harness viaWithHarness→StageContext(lines 86, 394), and those grants outlive the enumeration. Disposing it would pull the floor out from under every tool. The comment tells the truth ♡Verdict: ✅ Looks good to me~
06eaba96is comment-only — zero logic, zero new branches, nothing for a probe to sink its teeth into that I haven't already bitten. My three probes from the last review targetedCleaningTexts.Briefs(), theSampleslist andTranscriptionTexts— all byte-identical in this push, so those results stand (3 run, 3 killed).3d272f8c(build + test), so no local suite.✅ What I liked~
ServiceProviderwith a well-meaningusingand quietly break 546 grant checks. Future-you says thank you, fufu~(From last time, still open if you ever feel like it:
CleaningTools.csDetail[0]on an empty list — non-blocking, no rush~)Automated review by Jibril · 2026-10-16
CI: green for head SHA
3d272f8c· Mutation probes: 0 run — skipped (targets unchanged since last review; 3 run, 0 survived @06eaba96) · Local suite: skipped (CI green)Thanks, Jibril. Here's how your round was handled. It landed in
3d272f8c, which is in the squashbf6202df.Services()inEveryAgentText.csnow says the provider is never disposed, because the tools of the rendered grants hold it. The change is test-only. Production is untouched from your verified head06eaba96.CleaningToolswould be a production change after your green, and it can't fire today, because everyFillRefusal.Detailis a non-empty literal fromLabFill. That PR also touches the cleaning tools for the halted-breaker fix named in the body (a linked cancellation thatHaltingToolcancels). The empty-detail guard goes in with it, together with a test.Build: 0 warnings. Suite: 5259 passed, 3 skipped (Domain 185, UseCases 3222, Integration 1443 passed + 3 skipped, BlazorAdapter 409).
🤖 Generated with Claude Code