wiki notes with unquoted colon in title: produce invalid YAML frontmatter (8 files found) #90
Closed
opened 2026-07-27 12:29:29 +00:00 by mathias
·
2 comments
No Branch/Tag Specified
main
fix/pipeline-writes-158
fix/edit-path-io-192
fix/create-regular-188
fix/guard-special-179
fix/linkcheck-keeps-write-178
fix/write-dir-redirect-173
fix/tunnel-detect-174
fix/pipeline-root-157
w3/154-mcp-auth-wiring
fix/tunnel-traversal
test/in-brain-targets-171
fix/brain-scan-root-157
fix/graph-wiki-root-157
fix/vectorstore-root-157
fix/notes-root-157
fix/search-root-157
fix/brainwide-root-157
fix/raw-symlinks-153
feat/symlink-tripwire-157
fix/rest-auth-149
fix/123-brain-edit-envelope-check
feat/106-page-aware-extraction
fix/105-source-drift-on-main
fix/104-surface-merge-conflicts-on-main
agent/b1-compile-on-ingest
agent/104-surface-merge-conflicts
agent/105-source-drift
agent/107-loud-unconfigured-alerting
feat/brain-read-edit
fix/capture-i1-refusal-names-target
renovate/configure
feat/consolidate-single-harness
icebox/cmd-routing
feat/brain-pending-promote
fix/close-session-classification-refresh
fix/capture-summarywriter
v0.24.0
v0.23.1
v0.23.0
v0.22.0
v0.21.1
v0.21.0
v0.20.1
v0.20.0
v0.19.1
v0.19.0
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.0
v0.16.1
v0.16.0
v0.15.0
v0.14.0
v0.13.2
v0.13.1
v0.13.0
v0.12.1
v0.12.0
v0.11.2
icebox/cmd-routing-2026-07-01
v0.11.1
v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.0
v0.1.0
Labels
Clear labels
agent/ready
blocked/client
blocked/supplier
blocked/upstream
risk/high
risk/low
risk/medium
size/l
size/m
size/s
size/xs
status:dispatch
status:dispatched
status:review
status:reviewing
type/chore
type/decision
type/docs
type/feat
type/fix
type/ops
type/research
type/test
Meets the agent-ready contract; authorizes unattended execution
Waiting on the client
Waiting on a supplier
Waiting on an upstream project or vendor
Irreversible, security-relevant, or control plane
Reversible, local, test-covered
Touches shared state, deploys or data
Too big - split it
Under two days
Under half a day
Under an hour
Maintenance, no behaviour change
Human decision required; never agent/ready
Documentation only
New capability
Corrects broken behaviour
Infrastructure, deploy, runtime
Investigate; output is a finding, not code
Test coverage only
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mathias/hyperguild#90
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Found while repairing #86's stacked-frontmatter bug. Independent of stacking — these files already had a single frontmatter block, but their
title:(or other scalar) line contains an unescaped:and isn't quoted, soyaml.safe_loadchokes with "mapping values are not allowed here".Example (
wiki/homelab/failures/dispatch-headless-bash-denied-git-via-gitea-mcp.md):8 files repo-wide currently affected (ran a YAML-parse pass over every
wiki/**/*.mdfrontmatter block inmathias/brain):Root cause
buildFrontmatter(ingestioninternal/pipeline/build.go) already quotes title/aliases viayamlScalar()for LLM-extracted pages. These 8 are hand-written or promoted notes where the frontmatter was authored directly (not throughBuildPages), so nothing enforced quoting.Suggested scope
fix(malformed)/fix(stale-date)classes.Repro / verification script
Done — lint shipped, 17 files repaired, 1 left that is not a quoting problem
Code (
3da0eca,7c9293f):ingestion/internal/frontmatter—Lint,Fix,Scan, pluscmd/frontmatterlint.Content (
mathias/braina5865ca,86ccf37): 17 files repaired — the 8 in this issue plus 9 written since.The count was 18, not 8
Re-scanning found 17 broken frontmatter blocks (this issue's 4 named ones among them) and one file broken for a different reason. Every repaired value was verified to round-trip byte-identically and every body left untouched, checked by a separate script rather than by reading the diff.
Two design calls worth recording
Sequence items are deliberately not repaired.
- Headless dispatch: deniedis valid YAML — it loads as{"Headless dispatch": "denied"}rather than a string. That is a silent type corruption, not a parse failure, and repairing it would rewrite notes that currently load fine. Left as a documented gap in theLinttest table; worth its own issue if aliases turning into maps ever bites something.The colon heuristic was wrong and the first pass shipped it. Two files resisted repair:
That opens with a double quote and keeps going past the closing one. A "starts with a quote ⇒ already quoted" check reads it as fine and leaves it broken forever. Replaced with a probe that asks YAML itself whether the value stands alone as the right-hand side of a mapping — which answers the actual question and also leaves flow sequences, numbers and bools untouched because they already parse.
tags: [prompting, llm]is still a sequence afterward, verified.Fixrefuses to return a document that still fails to parse, so an unfixable file comes back byte-identical rather than half-repaired.Scanreports an unreadable file as a finding rather than aborting the walk — one poisoned note must not hide the others, which is exactly what happened withwiki/index.mdbelow.Verified: brain-sync merges, it does not clobber
Worth recording because it gated whether this repair was safe to push at all.
mathias/brainis written from koala on a 15-minute cycle, so a content fix pushed from a laptop could plausibly have been reverted by the next sync. It was not — the sync landed abrain-sync: merge origin/maincommit on top and all 15 repairs survived. Confirmed by re-running the lint against the post-sync tree, not by reasoning about it.Left open, needs a human —
wiki/index.mdis not a quoting bug\xe2\x80then another\xe2\x80\xa6— a truncated UTF-8 sequence where an em-dash or ellipsis was cut mid-character. The file is generated, so patching the bytes would only paper over whatever produced them. Filed separately as #92 rather than fixed here: it is a writer-side truncation bug, and this issue is about frontmatter quoting.Closing this one.
Correction to the comment above: the
wiki/index.mdtruncation bug is #93, not #92.