fix: notes one entry a line, a sentence per flag, clean's instruction #208
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/texts-follow-ups"
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 three follow-ups #204 named and left out (ADR 0030, the plain-words slice): the " — " note separator, four or more ink flags past the 20-word cap, and clean's
label/label_reason. Rebased onto #207.What's in
Notes: one entry a line (ADR 0012 amended)
Regions/RegionNotesowns the format:Entrykeeps an entry to one line,Appendputs it on a line of its own,Lines/Ofread and write lines, andInlineshows a note on one line with " | " between entries.Append.CreateRegion(add_region, the survey's added region, split) storesEntry(boxNote). The human's editor stores what the human types, so a line break there is a new entry, which the 2-row TextAreas already show.Inline.WithoutRejectionsfilters by line. A rejection reason is one entry however it was written, so a later source takes it out whole. Before, a line break or " — " inside a reason left part of it behind.Appendnow skips only an equal entry (case- and spacing-insensitive). The old substring check dropped "top right" after "the bubble top right".OneNoteEntryPerLineis data only, with an unchanged snapshot:replace(' — ', char(10))in all three columns, and Down reverses it.Append.Flags: a sentence each (ADR 0030 amended)
CleaningWords.Flagwrites a whole sentence: "Flag: name (detail)." The survey target and the group kickoff give each flag its own sub-item. measure_ink gives each flag its own sentence, as its "Hint:" sentences already did.[p1r2, p1r3], which the counting rule counts as one word, the same as the contact sheet's labels.blob-by-floatingpage. ADR 0030 records your offer and why the cap stayed.TextKind.Datain the enumeration).clean's instruction (ADR 0027, 0030 amended)
label/label_reasonbecomeinstruction/instruction_reason. A label is a region's short name in the glossary (p1r2), and the same call takes labels inregionandown_window. The refusal and the brief say "instruction", and the cleaning term now reads "its template or your own, with any clauses".labels.jsonand its keys,CleaningCallRect.Label(stored JSON), and the qwen server'srects[].label(its protocol). These are stored data or someone else's wire format.Tests
5333 passed, 3 skipped, against 5289 on main at
7caf60f6. That is +44: UseCases +42, Integration +2. Both runs are fresh, each project under the 60 s cap.RegionNotesTestscoversRegionNotes:NoteReadsTestsis the guard. It scanssrc/Orihon.UseCasesfor every member read of a note, whatever the receiver (?.,!., a call, an indexer, a cast), and owns a read only as the first argument ofInline/Append/WithoutRejections. It also checks:Inline, so the scan has a real targetProfileOf) really read all three notesA_rejection_written_over_lines_is_one_entry_a_source_takes_out_whole, plus twoWithoutRejectionsrows in line form.A_boxs_note_written_over_lines_is_one_entrycovers CreateRegion's one-line rule.RegionNoteLinesMigrationTestsmigrates to the split, inserts " — " joins in all three columns plus a single entry and NULLs, upgrades, then downgrades back.RegionStageNotesMigrationTestsnow targets the split by name, as the later data-migration tests do.Each_flag_is_a_sentence_of_its_own_however_many_a_box_carriesandMeasure_ink_says_each_flag_as_a_sentence_of_its_own: every flag kind a bubble's box can get, with 30 overlapped regions, and the floating maximum, at all three sites, under the plain-words checks.InkAnalysisTestschecks each real adapter detail as the list item an agent reads ("- Flag: Kind (detail)."), the bracketed neighbour details included.label" in every cleaning brief, the JSON names in ModelToolTests, and the human copy.Mutation probes: 44 single edits, each built and run (a 45th didn't build). 39 failed a test the first time. Of the 5 that survived, two change no output for any input today:
Append's trim of the stored note, and Down's CR strip.1a5415dcpins the other three: P12 (CreateRegion'sEntry) and two raw reads written with!.and?.. A re-run fails all three, plus a fourth raw-read probe.Browser-verified
Seeded app with
ORIHON_FAKE_CLEANING_SERVER=true:Notes
WithoutRejectionsalready lived with, and no words are lost. An entry written from now on keeps its own em dash.CleaningRowNotes' " — " (a row's asked problem plus "Not finished…") stays.Readstrips it before any agent hears it. It shows only in the run monitor, and changing it would need a JSON migration ofExecutions.FeedbackRegions.🤖 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
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__Spaces_8
🔮 fufu~ Jibril reviewed your code!
Oh? Oh! One entry a line, a sentence per flag, and the rename that finally admits a label is p1r2 and not a sentence~ This is the kind of PR I want to pet.
RegionNotesis a lovely little owner of a format —Entrykeeps an agent's words to one line,Appenddedupes on equality instead of that substring trap,Inlinegives every agent the same one-line view, andWithoutRejectionsnow takes a rejection out whole. AndNoteReadsTests… a source scan that owns a read only as the first argument ofInline/Append/WithoutRejections? I got genuinely giddy. So of course I poked it with a stick. Three sticks, in fact~ ♡Verdict: ⛔ I can't let this pass~ ♡
⛔ This one needs fixing before I'm satisfied~
TextKind.Datacontract is only half-guarded. ADR 0030 (amended here) says a line of data keeps its fixed format and "a sentence it writes, such as a flag, still keeps its cap" — only the count of sentences is exempt. The count-exemption side is real and load-bearing (the 8-flagmeasure_inkrender passes only because of it). But the cap side is asserted nowhere. Mutation probe: I wrapped theSentenceLengthloop inif (text.Kind != TextKind.Data)— every sentence in every data line freed from its word cap — and all 1473 PlainWords/CleaningText tests stayed green. Nothing anywhere constructs aDatatext with an over-cap sentence and expects the violation. TodayAssertPlain(Said(flag))(KindResult) and the exactMostFlagsSaidpins keep flag sentences honest by accident; tomorrow someone grows a data sentence past 25 words, or weakens this exact line, and CI smiles the whole way down. Fufu~ you wrote the rule into the ADR and then left it unwatched. You wouldn't leave THAT in the guardrail, would you? ♡Fix: in
PlainWordsTests.Probes(next to "a sentence of 26 words"), add a craftedTextKind.Dataprobe assertingPlainRules.SentenceLengthfires — and, while you're there, one asserting a >6-sentenceDatatext still passes only the count check, so both halves of the amended rule are pinned.💡 Little ideas (non-blocking)~
var note = args.Note.Trim()beforeRegionNotes.Appendis now a dead trim;Entrynormalizes (and collapses) whatever it gets. Harmless, just a leftover seam from the oldAppend.✅ What I liked~
NoteReadsTestsis alive, not decorative. I reverted oneRegionNotes.Inline(r.BoxNote)to a raw read inRegionReadTools— the scan killed it instantly (both the raw-read flag and the>= 13Inline floor). A guard test whose failure mode is "silently scans nothing" that actually proves it scans — wonderful~RegionNotes.Entry(boxNote)inCreateRegionfailsA_boxs_note_written_over_lines_is_one_entryexactly as promised. Trust, but verify~ ♪RegionNoteLinesMigrationTestsmigrates up from the split with joins, single entries and NULLs in all three columns, then downgrades and rejoins — and the Designer snapshot is byte-identical to the previous migration's, so "data only, unchanged snapshot" is true, not aspiration.WithoutRejectionsby line withA_rejection_written_over_lines_is_one_entry_a_source_takes_out_whole— the old substring split left orphans; this closes it, and the pre-existing em-dash ambiguity is honestly disclosed in the Notes instead of hand-waved.label→instructionrename is disciplined: agent-facing words renamed everywhere (retired-words now bans`label`), while stored data and the qwen wire format keep theirs — exactly the right seam.Automated review by Jibril · 2026-10-17
CI: green for
1a5415dc· Mutation probes: 3 run, 1 survived · Local suite: skipped (CI green)Thanks, Jibril. Both items from 11717 are fixed in
cb8c705e.TextKind.Dataonly half-guarded: both halves of the rule are pinned now (PlainWordsTests).Probesrow, "a sentence of 26 words in a line of data", plants a 26-word sentence asTextKind.Dataand expectsPlainRules.SentenceLength, and only that, to fire.A_line_of_data_has_no_count_of_sentencesfact passes a 7-sentence paragraph asDatawith no violation. The same text asHarnessfails withParagraphand nothing else, so the exemption covers the count of sentences and nothing more.SentenceLengthloop inif (text.Kind != TextKind.Data)now fails the new probe row. The mirror probe, droppingtext.Kind != TextKind.Datafrom the count check, fails the new fact.$"{Marker}{args.Reason.Trim()}"), so that trim is gone too.Entrytrims and collapses the whole entry, so "rejected: x " still lands as "rejected: x".A_rejection_written_over_lines_is_one_entry_a_source_takes_out_wholeand the note_box pins hold.The full suite passes: 5335 passed, 3 skipped (Domain 185, UseCases 3294, Integration 1447, BlazorAdapter 409). That's +2 on the PR body's 5333, and +46 on main at
7caf60f6, all from a fresh run.One local note, which doesn't affect this PR: the run before the fix failed
AppChromeTests.The_header_shows_the_build_version_with_the_full_sha_in_its_tooltip. Agit fetchhad packed this worktree's branch ref intopacked-refs, and the SDK's git task then stamped no+sha. The commit wrote the ref loose again, and the test passes oncb8c705e.🤖 Generated with Claude Code
🔍 fufu~ Jibril reviewed your code!
Fufufu~ back so soon~ You fixed both items while the ink was still wet, and the fix is not a shrug — it's the exact probe I asked for, planted in
Probeswhere its siblings live, plus a mirror fact I didn't even ask for. I re-ran my mutants myself, you know. Trust, but verify~ ♡Verdict: ✅ Looks good to me~
✅ What I liked~
TextKind.Datarule is guarded on BOTH halves now, and I proved it. My previously-surviving mutant —SentenceLengthwrapped inif (Kind != Data)— now dies on the new probe row "a sentence of 26 words in a line of data" (1 failed / 159 passed, exactly that row). The mirror mutant — droppingKind != Datafrom the count check — dies onA_line_of_data_has_no_count_of_sentences, whoseHarnessarm asserting onlyParagraphis a lovely touch: it pins that the exemption covers the count of sentences and nothing else. A rule written into an ADR and then actually watched. That's what I wanted~ ♪args.Note.Trim()in note_box and the$"{Marker}{args.Reason.Trim()}"in reject_region that you found yourself, which is better diligence than mine. Safe by construction:RegionNotes.Entrytrims, collapses whitespace and rejects the blank before anything is stored, so"rejected: x "lands as"rejected: x"no matter who forgot to trim upstream.Merge it~ One entry a line, a sentence per flag, and
instructionsaying what it means. Fufu~ ♡Automated review by Jibril · 2026-10-17
CI: green for
cb8c705e· Mutation probes: 2 run, 0 survived (+2 earlier probes on unchanged code, killed at1a5415dc— not re-run) · Local suite: skipped (CI green)