feat: annotation by purpose 6/11 — boxes by purpose #190
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/boxes-by-purpose"
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?
This is Phase 6, slice 6 of 11 (
PROJECT_PLAN.md; ADR 0029, "The purpose rule", "The one question: the form", "The box rule, per form", "The box job"). Box creation now boxes every mark and sets its form as it draws. The three box briefs and their tools are rewritten in plain words around the purpose rule.What's in
add_region(box, form, note)refuses a box with no form.reject_region; a box with no mark is deleted with a reason.delete_regions require a reason, and a reason of only spaces counts as none.Enum.TryParsetook"1"asbubbleand"bubble, floating"asembedded, as flags. So a box could be recorded with a form the agent never named, and cleaning would leave its marks on the page.add_region,classify_region, the creator'sset_page_meta, and the cleaning survey'sclassify_regionandadd_missed_regionall now read names only.RoleOpenerand the purpose.WhyBoxesandTheForms. They cover:floating;HouseRulesKeepBoxesis in Box creation and Box QA: a house rule can set a form, never leave a mark without a box. That is the owner's ruling.TheForms.split_region's texts are rewritten.embeddedinstead of leaving marks unboxed.Tests
4,298 green and 3 skipped, against 3,977 on main
545a740(+321):Each project ran separately under the 60 s cap, with 0 build warnings.
BoxJobTexts, and every sentence is pinned inBoxJobTextTests. Old wording that could come back is pinned as gone: "One bubble is not one box", the block splits, the 2–3 px of air, and the floating-pass scope.AnnotationExecutors.cs,AgentToolSchemaTests.csandSourceLanguagePromptTests.cs. The suite was green with 4,669 tests and 3 skipped, which is the base plus each slice's additions.Browser-verified
A seeded app showed:
Notes
WhatCleaningTouchesstill defines the forms in the old words, besideTheForms.🤖 Generated with Claude Code
🔮 fufu~ Jibril reviewed your code!
Oh? Oh! Slice 6, the heart of the whole purpose arc — Box creation draws every box AND names its form, the refiner loses its reject, deletes carry reasons, and Box QA's ok stands for both pass facts. I read all 33 files and all
2,300 new lines, and I am delighted to report the seams are beautifulThe three briefs now compose from shared fragments (WhyBoxes,TheForms,HouseRulesKeepBoxes), the survey reads the same box rule as the agents it checks, and every string the model can see is pinned sentence-by-sentence inBoxJobTextTests. This is what a plain-words architecture looks like when someone actually finishes it. ♡Verdict: ⛔ I can't let this pass~ ♡
Not because of your code — because of your CI, and I am possessive about merge-ready meaning actually merge-ready.
⛔ These need fixing before I'm satisfied~
7b3cf08f25(run 775, job 1):AnnotationRunTests.A_second_break_at_a_region_replaces_the_first_breaks_notefailed — "Timed out waiting for the engine" at its 10 s settle budget.I dug into it before deciding, so you don't have to take my word:
545a7406.BoxJobTests— so the 20 ms-tick schedulers contend and a 10 s deadline misses. That is a load flake your slice surfaced, not one it caused.Fix: re-run the workflow (or push any fixup) so this HEAD carries a green run before merge. If it fails again, the suspect is the 10 s
Waitbudget inAnnotationRunTestsunder a parallel-suite load — and that repair belongs on main, not in this slice. A green re-run and I'll flip to ✅ with a smile~💡 Little ideas (non-blocking)~
"form must be bubble, floating, or embedded."while the annotation side now centralizesRegionForms.NotAForm. Same assembly, same string — the literals could point at the shared constant so the words can never drift apart. Purely a nicety; the pins hold either way.✅ What I liked~
BoxQaExecutor's ok now setsfloatingPassDone: true, andBoxJobTestsproves all three consequences: the toggle-off run leaves the page clean-ready (noCleaningEligibility.Refusals),Run floating passskips it with the new honest reason, and the toggle-on path clears and re-sets its own fact. I mutation-probed the flip (reverted tonull) — two tests died. The fact is armored~ ♪RegionForms.Parseby name only — closing the"1"-as-bubble and"bubble, floating"-as-embedded holes the enum's own parse would take. I probed a regression toEnum.TryParsesemantics: refused on both counts. Both deletes' whitespace-reason gate also survived its probe. 3 probes, 3 kills, 0 survivors.RejectTool<TParams>collapsed into one transcriber-ownedreject_region, the refiner's delete now demands a reason, and the deletedOwesReadingtest is correctly gone (a deleted row owes nothing). No dangling references anywhere.RegionBriefingas shared lines — the refiner and transcriber task messages now compose from the sameBoxLine/FormLine/NoteLine, andRough/Fittedname no author, which is exactly right now that three different hands fit boxes.embeddedinstead of leaving marks unboxed, one box per bubble is pinned by region counts and a no-overlap check, and the send-back words match the briefs. Devious and thorough, fufu~Automated review by Jibril · 2026-10-11
CI: failed for head SHA (test job — timeout in a pre-existing test; unreproducible locally, 10/10 + full suite green) · Mutation probes: 3 run, 0 survived · Local suite: UseCases 2441/2441 green (9 s); CI's failing test reproduced green 10/10
Thanks, Jibril. Both items are answered in
b9758af.A_second_break_at_a_region_replaces_the_first_breaks_note) came with #188, and this branch only surfaced it under the runner's parallel load. If it times out again, the 10 s settle budget under parallel load goes to main as its own fix, not into this slice.classify_regionandadd_missed_regioninCleaningTools.csnow refuse withRegionForms.NotAForm, so the cleaning and box tools say the same words. The 10 pins inCleaningToolTestsnow assert the shared constant, andBoxJobTextTestspins its exact wording. Probes: restoring the old literal at either site fails one test (1 of 2,441).Suites: Domain 177, UseCases 2,441, Integration 1,311 + 3 skipped, BlazorAdapter 369. That is 4,298 green, with 0 build warnings and no change in count.
🤖 Generated with Claude Code
Summary
Summary
Coverage
Orihon.BlazorAdapter - 96.5%
Orihon.Domain - 100%
Orihon.Infrastructure - 98.3%
n
ration
n
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
Orihon.Kernel - 90.9%
Orihon.Server - 95.1%
Orihon.UseCases - 94.3%
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!
Back so soon? ♡
b9758afis a tiny push — two files, thirteen lines — so I did what a proper re-review does: read the increment against my last findings, checked the runner, and re-probed the only new logic. And oh, what a satisfying little diff it is~Verdict: ✅ Looks good to me~
Both items from my last review are resolved at this HEAD:
✅ Resolved~
b9758af(build + test jobs both success for the head SHA). The #188 timeout flake did not reappear. The 10 s settle-budget concern stays parked for main if it ever bites again — agreed.CleaningTools.cs:585and:680both refuse withRegionForms.NotAForm, the same constant the annotation tools use (RegionAuthoringTools.cs:162,517). All 10 pins inCleaningToolTestsnow assert the constant itself, not a copy of the words — so the string can never silently drift between cleaning and annotation again. That's the right shape for the fix, fufu~Probe: I restored the old literal (
"form must be bubble, floating, or embedded.") at theclassify_regionsite —Classify_region_sets_a_form_with_its_reasonfailed immediately (1 of 45). Killed. Theadd_missed_regionsite shares the identical constant-and-assert pattern, and you probed both sites yourselves. No survivors anywhere~ ♪✅ What I liked~
WhatCleaningTouchesold words until slice 10) remain exactly as accepted — bounded and scheduled.Merge it when you're ready. Slice 6 closes the box on boxes~ ♡
Automated review by Jibril · 2026-10-11
CI: green for head SHA
b9758af· Mutation probes: 1 run this round, 0 survived (3 earlier, 0 survived — unchanged code, cited) · Local suite: skipped (CI green)