feat(field-guide): creature habitat/kind schema (FG-1) #93
No reviewers
Labels
No labels
area: arcade
area: art-studio
area: calendar
area: chapel
area: content
area: design
area: field-guide
area: infra
area: library
area: os
area: portal
area: sync
area: typing
blocked
breaking
bug
content: approved
content: changes-requested
content: drafting
content: needs-doctrinal-review
content: needs-review
dependencies
documentation
duplicate
enhancement
epic
github_actions
good first issue
help wanted
invalid
javascript
needs-triage
priority: high
priority: low
priority: medium
question
type: enhancement
type: feature
type: fix
type: perf
type: security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Bosco/bosco!93
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/field-guide-schema"
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?
FG-1 of v0.4.0 — the schema spine the Field Guide's indices browse. Part of #92. Architecture:
docs/architecture/field-guide.md.What's here
Two closed-enum frontmatter fields on creature topics:
habitat— multi-valued (a fox is[woodland, farmland]); the "by habitat" axis.kind— single-valued; the "by kind" axis.bestiarycovers symbolic creatures (the basilisk).Enforced with a
.superRefineontopicFrontmatterSchema: required oncreatures, forbidden elsewhere. The enums are closed, so a typo fails at parse and no axis page can ever be minted empty. Because the plugin spreads the whole parsedmeta, the fields flow intovirtual:bosco/content→TopicMeta/Topicwith zero plugin changes, andisPublishedstays category-blind — taxonomy never touches the doctrine gate.Blast radius, threaded end to end. The standalone content pipeline (
scripts/content/) carries a deliberate mirror of the frontmatter, so the two lists move together:spec-schema.mjs— the mirror gains the sameHABITATS/KINDS+.superRefine(byte-identical lists;emit.test.tsre-parses the tool's output through the real schema, which catches any drift).emit.mjs—buildFrontmattercopieshabitat/kindinto the emittedindex.md.new-spec.mjs— scaffolds validhabitat/kinddefaults for a creature stub.Backfilled
creatures/red-foxand the gatedcreatures/basilisk-draft(which is schema-validated before the review gate excludes it, so it must parse — it exercises thebestiarykind).Scope fence
No
anatomy/rangesub-schemas here (they land with their artifacts in FG-6/FG-7). No rendered-surface change — the hub, axis routes, and views land in FG-3a/FG-3b.Verification (local gauntlet, all green)
check(0 errors) ·lint·guard:colour·build(2 search records; basilisk gated out) ·guard:external·guard:content·guard:provenance(3 topics, doctrine invariant holds) ·guard:offline· 150 unit tests (+7). A focused adversarial pass confirmed the blast radius is fully covered (enum lists identical, gate-ordering handled, superRefine fail-closed, emit round-trip clean). e2e not run — no rendered surface changed.