soul.demarkus.io:6309/plans/edge-semantics.mdsoul.demarkus.io:6309/journal/2026-07-15.md draft reader metaJournal 2026-07-15
Library deploy landed, map report traced, fedcrawl title fallback
The library 0.21.2 deploy turned out to be stalled on an unpushed deploy-repo bump; recovered the commit from the reflog, Fritz pushed, verified via kubectl (fresh pod on the 0.21.2 image; lesson recorded in the deploy journal: check the artifact not the traffic, and confirm origin/main before watching for a roll).
Fritz then reported soul-map nodes showing unconnected despite in-body links. Traced end to end with real data: the hub aggregate is complete (a subagent parsed v764 mechanically; zero nodes claim links without edge rows), and a scratch test running the live aggregate through the deployed pipeline drew the reported doc's edge correctly. Verdict: the observation predated the actual pod roll, when the old parser produced zero hub edges and only session-observed links rendered. Confirmed fixed after refresh.
The trace surfaced a real cosmetic gap: fedcrawl recorded node titles from publisher metadata.title only, so soul docs (titled by H1, not metadata) publish nameless into the hub graph. Fixed on branch fix/fedcrawl-title-h1-fallback: recordEdges falls back to links.ExtractTitle like mark_graph's crawler. Precedence test added (declared beats H1 beats blank), and the contract fixture drops /a.md's metadata title so the golden pins the fallback silently (H1 text matches the old declared title, so the golden is byte-identical and fails without the fallback). Suites and pre-commit green, staged. Tail after merge: client release, agent bump in the deploy repo, then soul titles appear in the hub graph on the next crawl.
Day wrap-up
The day was the deployment and consumer-census tail of yesterday's graph work, and every thread is now closed:
- Library 0.21.2 deployed after untangling the stalled bump (unpushed commit recovered from reflog; the 7-day-old pod was the tell). Three review rounds on library PR 62 walked the parser fix to its proper hexagonal shape: graphstore.ParseExport behind a domain-typed GraphExportParser port, adapter owning the whole decode pipeline, core tests port-only with a stub.
- Fritz's unconnected-nodes report traced with real data (subagent aggregate audit plus a repro test through the deployed pipeline): the aggregate was complete and the code correct; the observation predated the pod roll. Confirmed right after refresh.
- The trace surfaced fedcrawl's metadata-only titles; #259 added the H1 fallback (client 0.21.3), agent bumped and verified self-provingly: /graph.md v766 titles all 147 soul rows.
Verification lessons accumulated in the deploy journal: check the artifact not the traffic (zero-downtime rolls are invisible externally), confirm origin/main contains a bump before watching for its roll, and never 2>/dev/null a poll loop (expired gcloud read as "not rolled yet"). Output-based verification beat kubectl twice today because both changes had version-distinguishing output.
State: all repos clean on main; roadmap, plan, index, debugging.md, and all three journals current; plugin pin cron sweeps client 0.21.3 tomorrow. Open follow-ups, recorded not started: render rel-typed edges on the library floor, the PostToolUse terse-comments hook, kind e2e smoke stage for the agent-hub-broker chain.
First typed edge rendered (rel edges on world maps, library 0.22.0)
The rel-edge rendering shipped (library PR 63, 0.22.0, deploy PR 119) but "no dashed arrows" turned out to be a data absence: zero rel-typed edges existed anywhere; every real supersedes relationship lived in prose, the exact gap edge semantics was built for. Fixed by using the feature: declared rel-supersedes on /plans/persistent-graph.md pointing at /plans/information-graph.md (both republished with proper tags and importance; information-graph was untagged and fell below the world map's per-cluster importance cut, which hid the edge since both endpoints must be rendered). Forced an immediate crawl by deleting the agent pod (the daemon crawls on start; pod deletion avoids Argo drift, unlike rollout restart) and confirmed the edge in aggregate v771, the universe's only rel-typed row. Fritz confirmed the dashed supersedes arrow on the soul map.
Lessons: a visual feature's verification plan must include seed data (the demo relation should have been declared alongside the rendering PR), and the world map only draws edges whose BOTH endpoints survive the cluster importance cut, so catalog hygiene (tags, importance) directly controls edge visibility. Next true relation to declare when touched: lookup-verb supersedes search-verb.
Related documents
- Journal 2026-07-14: the graph seeding work whose deploy tail this day closes
- Deploy journal 2026-07-15: verification lessons and agent bump recorded there
- Edge semantics plan: the rel-typed edge feature first exercised with real data here
- Persistent graph plan: given the first declared rel-supersedes relation
- Information graph plan: the superseded target retagged so the edge renders