notes: shared strict frontmatter splice planner #813
Closed
kayg
wants to merge 0 commits from
feat/strict-frontmatter-writer into dev
pull from: feat/strict-frontmatter-writer
merge into: kayg:dev
kayg:main
kayg:feat/style-sheet-fixes
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:feat/contrast
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg:train/2026-11-02-bm9
kayg:archive/port/port-attachments-3
kayg:archive/port/contacts-merge
kayg:fix/motion-audit-859
kayg:train/2026-11-02-bm8
kayg:archive/scratch/bm8-prep
kayg:archive/port/port-pickers
kayg:archive/port/port-tables-2
kayg:archive/port/port-tables
kayg:archive/feat/sharing-s1-pr3-code
kayg:archive/scratch/bm7-fixed
kayg:train/2026-11-02-bm7
kayg:archive/fix/parallel-test-flakes-code-minipc01
kayg:train/2026-11-02-bm6
kayg:docs/imap-766-readonly-slice
kayg:feat/dav-recorder-v3
kayg:research/788-diagnosis
kayg:archive/fix/parallel-test-flakes
kayg:archive/perf/pr792-cold-index-edit
kayg:docs/sharing-slice-1
kayg:archive/docs/imap-766-plan-v2
kayg:feat/dav-recorder-v2
kayg:archive/docs/dav-recorder-v2-plan
kayg:spike/imap-766-s0-cases
kayg:archive/fix/undo-768
kayg:feat/dav-recorder
kayg:archive/docs/contacts-import-v2-plan
kayg:archive/feat/calendar-ical-converter
kayg:feat/contacts-import
kayg:perf/cold-growth-on-764
kayg:perf/cold-growth-on-tiering
kayg:archive/docs/tasks-writes-v2-plan
kayg:archive/docs/calendar-backend-v2-plan
kayg:archive/feat/contacts-companion-pure
kayg:feat/tasks-set-status
kayg:feat/tasks-move-reorder
kayg:archive/docs/carddav-writes-v2-plan
kayg:archive/feat/calendar-v2-s1-containment
kayg:feat/tasks-delete-promote-duplicate
kayg:archive/feat/dav-transport
kayg:archive/fix/carddav-rebuild-r1
kayg:archive/fix/carddav-retention-r1
kayg:feat/carddav-writes
kayg:perf/quota-on-tiering
kayg:perf/quota-simple
kayg:perf/cold-growth-on-quota-stack
kayg:feat/calendar-identity
kayg:feat/calendar-event-parser
kayg:feat/calendar-props-maps
kayg:port/glass-when-ring
kayg:feat/tiering-761-s1
kayg:wip/10by32-01-impl-759b-scratch-20261030
kayg:wip/6by32-01-bm3-webkit-pause-20261030
kayg:wip/10by32-01-bm3-chromium-pause-20261030
kayg:wip/6by32-01-tier-761-s1-pause-20261030
kayg:spike/imap-766-s0
kayg:wip/6by32-02-calternal-pause-20261030
kayg:wip/8by64-01-review-688-pause-20261030
kayg:wip/6by32-01-verify-744-pause-20261030
kayg:wip/6by32-01-verify-742-pause-20261030
kayg:fix/private-staging-759b
kayg:wip/6by32-01-review-748-pause-20261030
kayg:wip/6by32-01-review-733c-pause-20261030
kayg:wip/6by32-01-review-733b-pause-20261030
kayg:wip/6by32-01-perf-idle-8-pause-20261030
kayg:wip/6by32-01-perf767-base-pause-20261030
kayg:wip/6by32-01-perf767b-767-pause-20261030
kayg:wip/6by32-01-perf767b-764-pause-20261030
kayg:wip/6by32-01-perf767-767-pause-20261030
kayg:wip/6by32-01-perf767-764-pause-20261030
kayg:wip/6by32-01-lists-b-pause-20261030
kayg:wip/6by32-01-ids-verify5-pause-20261030
kayg:wip/6by32-01-ids-verify4-pause-20261030
kayg:review/calendar-month
kayg:wip/10by32-02-undo-768-20261030
kayg:test/ids-verify3
kayg:wip/10by32-02-bm3-chromium-20261030
kayg:wip/10by32-01-review-753-20261030
kayg:wip/10by32-01-perf-idle-2-20261030
kayg:wip/10by32-01-bm2-webkit2-20261030
kayg:plan/759b-staging
kayg:train/2026-10-30-bm2
kayg:review/758b-tests
kayg:review/758-tests
kayg:review/764d-tests
kayg:review/767b-tests
kayg:review/preview-2026-10-29
kayg:review/767-tests
kayg:docs/tiering-731-plan
kayg:wip/c6b02-when2
kayg:wip/c6b02-tasks-create-fix5
kayg:wip/c6b02-settings-frost-mock
kayg:wip/c6b02-settings-frost-base
kayg:wip/c6b02-settings-frost
kayg:wip/c6b02-ring
kayg:wip/c6b02-review-733d
kayg:wip/c6b02-bm1-full-a
kayg:wip/compute02-when-field
kayg:wip/compute02-webkit-lists-repro
kayg:wip/compute02-train-bl2-dev
kayg:wip/compute02-dev-green-pw164
kayg:docs/deploy-plan
kayg:review/764c-tests
kayg:review/764b-tests
kayg:review/748g-tests
kayg:review/764-tests
kayg:review/759b-tests
kayg:fix/storage-owner-liveness-642
kayg:fix/storage-fix-7
kayg:wip/compute02-storage-fix-7
kayg:review/759-tests
kayg:feat/tiering-731
kayg:wip/tiering-731-first-attempt
kayg:wip/compute02-storage-fix-1
kayg:review/754g-tests
kayg:perf/idle-honest-2
kayg:review/754f-tests
kayg:review/754e-tests
kayg:review/755-tests
kayg:review/754d-tests
kayg:review/754c-tests
kayg:review/754b-tests
kayg:review/754-tests
kayg:fix/storage-private-tmp-642-dev
kayg:wip/compute02-verify-750
kayg:test/ids-verify5
kayg:test/ids-verify4
kayg:fix/storage-exact-file-quarantine-642
kayg:wip/compute02-verify-740
kayg:perf/one-flush-save
kayg:review/calendar-static
kayg:wip/compute02-verify-737
kayg:review/indexing-ring
kayg:review/when-field-2
kayg:wip/compute02-review-733
kayg:proto/block-identity-2-review
kayg:proto/block-identity-review
kayg:wip/c6b02-tc-design
kayg:review/when-field
kayg:issue/tasks-create-ids
kayg:issue/tasks-create
kayg:review/combined
kayg:wip/compute02-review-combined
kayg:review/task-polish
kayg:review/top-buttons
kayg:review/q1-q5
kayg:train/2026-10-26-bl2
kayg:archive/wt-398h
kayg:archive/train-bm-proptest-seed
kayg:archive/integ325-293
kayg:archive/integ325-ci
kayg:archive/client-auth-review-baseline
kayg:archive/wt-sim-4853
kayg:archive/wt-sim-4811
kayg:archive/wt-448m
kayg:archive/wt-398a-allocator
kayg:issue/calendar-adr
kayg:archive/old/train/2026-10-23bk2
kayg:archive/old/train/2026-10-23bk
kayg:issue/469-mockup-9a
kayg:issue/smart-tasks-mockup
kayg:issue/469-menus
kayg:issue/652-signout-flake
kayg:issue/652-history-fix7
kayg:issue/652-history-fix6
kayg:archive/old/issue/spring-check-perf
kayg:issue/spring-check-perf
kayg:issue/659-rename-fast
kayg:archive/old/train/2026-10-21ar
kayg:issue/search-hardening-3
kayg:issue/652-history-fix5
kayg:issue/660-port-sheets-glass
kayg:issue/652-history-fix4
kayg:issue/652-history-fix3
kayg:issue/652-history-fix2
kayg:issue/652-history-flake
kayg:train/2026-10-21an
kayg:issue/settings-admin-port
kayg:issue/search-port
kayg:train/2026-10-20am
kayg:issue/storage-split-fix2
kayg:issue/storage-split
kayg:archive/old/issue/folder-ids-fix
kayg:train/2026-10-20al
kayg:archive/old/issue/folder-ids
kayg:train/2026-10-20ak
kayg:issue/tables-mockup
kayg:train/2026-10-19aj
kayg:train/2026-10-19ai
kayg:issue/469-merge-fixes
kayg:issue/sidebar-band
kayg:archive/old/issue/608-settings-spec
kayg:train/2026-10-19ah
kayg:issue/swipe-offscreen
kayg:train/2026-10-19ag
kayg:archive/old/issue/590-nlp-adr
kayg:archive/old/issue/587-event-after-write-2
kayg:train/2026-10-19af
kayg:archive/old/issue/587-event-after-write
kayg:issue/469-pill-room-c
kayg:issue/469-pill-room
kayg:train/2026-10-19ae
kayg:issue/469-narrow-handle
kayg:issue/397-ios-swipe-2
kayg:archive/old/issue/adrs-photos-files-tasks
kayg:issue/469-desk-fixes
kayg:archive/old/issue/auto-update-adr
kayg:issue/469-filter-gap
kayg:issue/469-port-1b
kayg:issue/442-opacity-flake
kayg:archive/397-ios-swipe-2
kayg:issue/327-web-fast-3
kayg:archive/old/issue/469-port-1
kayg:issue/469-port-1
kayg:issue/327-web-fast-2
kayg:archive/old/issue/327-web-fast
kayg:archive/old/issue/425-stt-bench-vq1
kayg:archive/old/issue/445-no-bleed
kayg:archive/old/issue/400-swipe-mockup-2
kayg:issue/426-client-review
kayg:issue/426-client-2
kayg:issue/426-client
kayg:archive/old/issue/476-safe-area-lab
kayg:archive/445-top-light-2
kayg:archive/old/issue/445-top-light
kayg:issue/471-blocks-mockup
kayg:archive/old/issue/448-links-app-2
kayg:archive/old/issue/448-links-app
kayg:archive/old/issue/398-cold-links
kayg:issue/434-442-small-2
kayg:issue/434-442-small
kayg:archive/old/issue/398-unload
kayg:archive/old/issue/445-bottom-band
kayg:issue/445-bottom-band
kayg:issue/351-rem-3
kayg:archive/312-views-mockup
kayg:issue/351-rem-2
kayg:issue/351-rem
kayg:archive/old/issue/327-first-note
kayg:issue/395-width-phone
kayg:archive/old/issue/327-typing
kayg:issue/396-ios-edges
kayg:issue/397-ios-swipe
kayg:archive/398-allocator
kayg:archive/old/issue/327-notes-index
kayg:issue/345-347-contrast-empty-2
kayg:archive/old/issue/44-arenas
kayg:issue/44-arenas
kayg:archive/integ325
kayg:archive/old/issue/327-perf-harness
kayg:archive/old/issue/44-thp
kayg:issue/44-thp
kayg:archive/old/issue/285-sticky-pills
kayg:archive/old/issue/44-trim-3
kayg:issue/44-trim-3
kayg:archive/old/issue/165-cards
kayg:archive/old/issue/165-picker-2
kayg:archive/old/issue/212-multi-select
No reviewers
Labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal!813
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/strict-frontmatter-writer"
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?
Plan, sizes and cost
Provide the shared, opt-in pure
strict_frontmatterprerequisite for #802 and #808. Input note/frontmatter bytes plus decoded leaf changes produce exact guarded forward/inverse byte splices, or a refusal. No existing caller migrates and no action is enabled. Never merge.Input metadata <=64 KiB, generated metadata <=128 KiB, complete input/output note <=8 MiB, depth <=8, keys <=1,024, list items <=4,096, changes <=1,024. Requested paths/value payload and total rendered replacements are each capped at 128 KiB. Parsing/auditing are linear in bounded metadata; sorting is O(m log m) comparisons, with request key bytes counted; map lookups add O(log keys) per path component. Full-note construction/inverse verification also count O(note bytes + replacements) time and memory. No Home scan or persistent state.
Result
New module only:
crates/notes/src/strict_frontmatter.rsand small grammar, lexical, renderer, audit, typed-model and splice modules. The README specifies the full contract.yaml-rust2with default features disabled supplies the independent YAML decoder; lexical parsing uses JSON decoding for quoted values. Tests use a third decoder (serde_yaml) and authored expected values/spans, never production rendering/expected helpers as their oracle.The grammar supports exact LF envelopes, two-space block maps, unique safe decoded keys, canonical i64/bool/null scalars, safe atoms, complete JSON strings and scalar block lists (
[]only as a flow exception). Any literal hash/comment, interior plain quote, single quote, other flow syntax, physical multiline scalar, anchor/alias/tag, malformed/duplicate key or unsupported envelope refuses the whole input, including unrelated fields. Generated hashes/control/line characters use JSON Unicode escapes. Input and output are both revalidated. Tests exposed and retained two decoder differences: plainNULLand raw DEL; lexical validation and escaping handle them explicitly.An independent line walk does not consume planner entry spans: every non-target line, blank line and body byte must match. Forward/inverse offsets address their respective original images. No-op values preserve raw spelling. Absent frontmatter can be inserted without changing body bytes; empty envelopes remain on last top-level field removal.
Compatibility and explicit limits
logremains unsupported. No substitute log representation or permissive fallback is introduced.Verification
All gates ran on
calternal-dev-01-compute02, in this branch's VM worktree through the Nix dev shell; every heavy command used the slot wrapper. No build/test/toolchain ran on the control host. Log:~/strict-fm-final.logon the VM.Passed: 16 strict-writer tests, including generated property families at 512/512/256 cases plus a retained minimized seed; full notes suite 459 passed / 6 existing ignored / 0 failed; doctests 0. Fmt and clippy passed. Only the VM's formatting and optional-decoder lockfile cleanup were committed after these gates; the tested file bytes are the committed bytes. Nix scaffolding is excluded.
No independent PR review, full frontend matrix, executor durability, action enablement or performance result is claimed. Later action ports retain the plans' compatibility and executor gates.
WIP: notes: shared strict frontmatter splice plannerto notes: shared strict frontmatter splice plannerIndependent review, round 1
verdict: ready for the scoped pure planner at
11230729efd7356c254336a23cbdd07857733bf9. No P0–P3 findings. No code pushed or merged.Read the shared brief, all three independent reviews and fix responses on #781, the new module and its tests, and relevant frontmatter/corruption/undo ADRs. Existing callers are unchanged; the public module and decoder dependency are additive.
Checks and evidence:
crates/notes/src/strict_frontmatter/audit.rs:29walks raw lines and reconstructs decoded paths itself. It does not calllocate,lexical::pair, consumeEntry.span, or use proposed splice ranges. It retains blank lines, compares the ordered non-target raw lines, and separately compares the complete body. It shares validated envelope boundaries and the JSON string decoder, not the planner's target-span calculation. My direct audit probes independently changed sibling key spelling, a sibling list item, a blank line, another leaf, a top-level neighbor and body bytes; all six were rejected.serde_yaml, authored byte boundaries and explicit expected objects, without production render/model helpers. Tested every Unicode scalar through U+FFFF plus three supplementary values as requested strings (63,491 accepted, all decoded exactly), and corresponding BMP JSON Unicode escape spellings as existing input. A separate 1,080-attempt scalar/list lexeme corpus included comments, quotes, flow forms, aliases, tags and multiline continuations; all 81 accepted plans retained the intended third-decoder values and exact inverses.Fresh verification on dev-01 in detached, uncommitted
~/Developer/Worktrees/review-813-r1, using the Nix shell and slot wrapper:20 passed / 0 failed / 449 filtered out, including the 16 committed tests and four independent review tests. The reviewed source was rebuilt; the target directory only reused build artifacts. Final log:
~/review-813-r1-probes-complete.log. Probe source:~/Developer/Worktrees/review-813-r1/crates/notes/src/strict_frontmatter/independent_review.rs. Probes and Nix scaffolding remain uncommitted on the VM. No build/test/install ran on the control host. CONTEXT.md and TASTE.md were absent from this checkout.Scope limits remain explicit: missing parent maps, map-list logs, whole-map edits and empty structural parents refuse. Complete-image admission, durability, recovery and executor integration remain pending. This review does not establish those gates or claim a fresh full notes suite, clippy, frontend or performance run.
Follow-up plan: retain the bounded line parser, restricted target types, exact splices and independent byte audit. Structurally valid non-target plain scalar leaves/lists may be opaque; editing/removing an opaque leaf refuses. The independent YAML decoder checks map/list structure and typed leaves while opaque scalar values require no type agreement. Bounds and O(metadata bytes + note bytes + request sorting) costs are unchanged. Failure → effect → detection → recovery → test: ambiguous syntax or envelope → whole refusal → lexical structure checks → source correction → retained #781 corpus; opaque target → whole refusal → target lookup → explicit source correction → scalar/list target tests; changed non-target bytes → whole refusal → independent raw-line audit → planner correction → exact prefix/suffix/inverse corpus. Gates: fmt, notes clippy -D warnings, full notes tests on dev-01, then merge into #812 only and rerun its documented gates.
Follow-up implemented at
81c339725bb674710c4ed50ab982a196b355f11c. Non-target single-line plain scalars and scalar block lists may pass through as opaque raw lexemes, including UUIDs, ISO timestamps/dates, non-target numbers, words, URL fragments and IPv6 URLs. Opaque leaves cannot be selected for replacement/removal. Target types and independent raw-line/body byte audit are unchanged. The independent YAML decoder checks opaque scalar/list shape and continues checking typed editable leaves. Existing structural, quote/comment, flow-collection (except the existing empty-list form), multiline, alias/tag, duplicate-key and envelope refusals remain. Existing map/key/depth/size limits remain.Regression was first observed failing with
Grammaron the original writer (~/strict-fm-opaque-red.log). Final gates on dev-01 in the Nix shell, with every heavy command through the slot wrapper (~/strict-fm-opaque-verified.log, endingOPAQUE_VERIFIED):Passed: notes 462 / 6 existing ignored / 0 failed; doctests 0. This includes all 19 strict-writer tests, the retained #781 review cases and generated punctuation refusals, plus real-looking Calternal/Obsidian metadata, exact non-target bytes/inverses, opaque-target refusals and direct opaque-neighbor audit probes. The tested VM formatting is committed. No independent review of this follow-up is claimed; the prior ready review covered
11230729. No merge into dev and no repository settings changed. Next: merge this branch into #812 and rerun its gates.Independent review, round 2
verdict: ready for the scoped pure writer at
81c339725bb674710c4ed50ab982a196b355f11c. New P0–P3 findings: none identified. No code pushed or merged.#and interior-quote/comment combinations refuse, including on unrelated leaves and list items. No accepted comment-loss reproduction found.:, leading structural indicators, flow collections, block/multiline scalars, anchors/aliases/tags, document markers, duplicate decoded keys, tabs and CRLF/BOM envelopes. Raw U+2028/U+2029/NEL refuse in scalar and list positions. Unspaced colons and interior punctuation that YAML treats as plain scalar content retain their bytes.serde_yamlexpectations, and restored the original image through the inverse. Requested strings included punctuation and U+2028/U+2029/NEL. Direct sibling-byte changes were rejected by the independent audit. No production renderer/model/span helper supplied the expected bytes or semantic values.Fresh validation on dev-01, detached uncommitted
~/Developer/Worktrees/review-813-r2, at the reviewed head:21 passed / 0 failed / 449 filtered out: 19 committed tests plus two independent review tests. Probe source:
crates/notes/src/strict_frontmatter/independent_r2.rs; final log:~/review-813-r2-final.log. The reviewed source was rebuilt; only artifacts were reused. Probes and Nix scaffolding remain uncommitted on the VM. No build/test/install ran on the control host.This is scoped review evidence, not an exhaustive YAML proof or a fresh full-suite/clippy result. Executor admission/durability, map-list logs and structural parent creation/removal remain outside this pure writer's scope.
Closing: head
81c33972is already in dev (reached via01dbcbd1); nothing left to merge. Branch kept.Pull request closed