Vault Frontmatter Audit

Scope: 59 .md files in entries/ (YAML frontmatter parsed programmatically). Principles and MOCs were excluded from the entry population. No entry files were modified.

Headline result: 0.0% schema drift — 0 of 59 entries contain a value outside the controlled vocabularies. Verdict: PROCEED (well under the 10% pause threshold).

Field Inventory

FieldInferred TypePopulated (of 59)unknown / Empty
slugstring590
titlestring590
typestring (enum)590
primary_sourcestring (URL)596 unknown
source_typelist[string] (free list)594 unknown
last_verifieddate (YYYY-MM-DD)590
statusstring (enum)590
archive_urlnull0 (all 59 are null)59 null (schema-sanctioned)
languagelist[string] (ISO 639-1)592 unknown
translation_availableboolean563 unknown (string)
regionlist[string] (enum)591 unknown
audiencelist[string] (enum)591 unknown
coststring (enum)594 unknown
skill_levelstring (enum)5910 unknown
spacelist[string] (enum)527 empty lists
climatelist[string] (enum)527 empty lists (incl. 1 unknown)
maintenancestring (enum)598 unknown
learning_outcomeslist[string] (enum)592 unknown
embodieslist[wikilink]590 (min 1 satisfied everywhere)
builds_onlist[wikilink]455 empty lists
prerequisite_forlist[wikilink]554 empty lists
contrasts_withlist[wikilink]1445 empty lists
prerequisiteslist059 empty lists
mocslist[wikilink]590 (min 1 satisfied everywhere)
summary_shortstring590
aligned_withlist[wikilink]111 empty lists (present on only 12 entries)

Sparse fields (weak filter candidates, <3 populated non-unknown values):

  • prerequisites — 0 populated across all 59 entries. Dead field; do not use.
  • aligned_with — populated on only 1 of 59 entries (and absent as a key on 47). Do not use as a filter/facet.
  • archive_url — null on all 59 (schema-sanctioned). Not filterable.
  • Near-sparse warning: builds_on (4 populated), prerequisite_for (5) — edge graph is very thin in one direction.

Value Distributions (filterable fields)

Counts for list fields count each value occurrence; an entry can appear under multiple values.

type (59 entries)

ValueEntries
Curriculum17
Program11
Software10
Hardware6
Component6
Policy5
Framework3
Dataset1

No Principle, MOC, or Person types inside entries/. No Organization type used yet.

skill_level

ValueEntries
Beginner25
Intermediate16
Advanced8
unknown10

cost

ValueEntries
Free33
Low15
Medium6
High1
unknown4

region (multi-value)

ValueCount
Global23
China12
USA11
EU7
South Africa4
Africa4
Oceania2
Indigenous2
Latin America2
Guam1
Southeast Asia1
unknown1

audience (multi-value)

ValueCount
Educators51
Community29
Adult Learners26
University22
K-1222
Household19
Secondary18
Vocational17
Researchers11
unknown1

maintenance

ValueEntries
Low28
Moderate21
High2
unknown8

status

ValueEntries
Active45
Dormant11
Archived3

climate (multi-value; 7 entries have empty lists)

ValueCount
Versatile43
Temperate6
Tropical4
Arid3
Cold1
unknown1

space (multi-value; 7 entries have empty lists)

ValueCount
Classroom36
Indoor27
Greenhouse25
Outdoor13
Backyard8
Public Space6
Rooftop5

learning_outcomes (multi-value)

ValueCount
Systems Thinking38
Food Production35
Sustainability Literacy29
Water Chemistry26
Data Literacy25
Coding19
3D Printing18
Electronics18
Biology17
Project Management16
CAD13
Entrepreneurship12
Community Organizing8
unknown2

language (multi-value, ISO 639-1)

ValueCount
en42
zh11
es4
de3
fr2
pt2
sl2
sk1
id1
cs1
unknown2

translation_available

ValueEntries
false48
true8
unknown3

source_type (free list, multi-value — top values)

ValueCount
GitHub Repository13
Program Website10
3D Model Repository4
Government Document3
STL Files3
unknown4
~52 other singleton/doubleton values—

source_type is a free list per schema, and it shows: 52 distinct values occur only once or twice. It is usable as a text search/grouping field but too fragmented for a facet filter without normalization.

Schema Drift

None. Every value in every vocabulary-controlled field (type, region, audience, cost, skill_level, space, climate, maintenance, status, learning_outcomes) matches the permitted enum exactly — correct case, correct term, correct type. All language values are valid 2-letter lowercase ISO 639-1 codes. All translation_available values are booleans or unknown. The Other: escape hatch is not used anywhere.

Entries carrying unknown in a controlled field (schema-sanctioned, not drift; 13 unique entries affected):

FileField(s) with unknown
interactive-hydroponics-textbook.mdskill_level, cost
hydro-mod.mdskill_level
china-rural-revitalization-policy.mdskill_level
education-power-plan-2024-2035.mdskill_level
eqf.mdskill_level
harvesting-knowledge-act-2023.mdskill_level
kurikulum-merdeka.mdskill_level
oecd-learning-compass-2030.mdskill_level
panama-ley-465.mdskill_level
seven-ministry-stem-education-guidelines-2025.mdskill_level
chanst3d-sla-printer.mdcost
german-sensor-school-guide.mdcost
vertical-farming-project-china.mdcost

(Additional unknown values exist in primary_source ×6, source_type ×4, maintenance ×8, language ×2, learning_outcomes ×2, translation_available ×3, region ×1, audience ×1, climate ×1 — all schema-sanctioned.)

Filter Viability

(a) Do all entries have skill_level and cost populated (non-unknown)? No — but every one of the 59 entries has the key present, so the planned global filter file.hasProperty("skill_level") will pass all 59 entries and exclude nothing. The real exposure is unknown values:

  • skill_level: unknown — 10 entries: china-rural-revitalization-policy, education-power-plan-2024-2035, eqf, harvesting-knowledge-act-2023, hydro-mod, interactive-hydroponics-textbook, kurikulum-merdeka, oecd-learning-compass-2030, panama-ley-465, seven-ministry-stem-education-guidelines-2025
  • cost: unknown — 4 entries: chanst3d-sla-printer, german-sensor-school-guide, interactive-hydroponics-textbook, vertical-farming-project-china
  • Union (unknown in either): 13 entries (interactive-hydroponics-textbook is unknown in both). These 13 will be silently excluded from any view that filters on concrete skill_level/cost values. Consider OR skill_level == "unknown" handling, or accept their exclusion by design.

(b) Beginner + Free matches: 14 entries guam-cbas, malama-hawaii, menominee-nation-aquaponics, nanning-youth-3d-printing, openstax-additive-manufacturing-essentials, parametric-net-pot-net-cup, printables-hydroponics, prusa-education, purdue-aquaponics-farming-fish, stl-finder, tamu-healthier-living-hydroponics, thingiverse-hydroponics, wikibooks-3d-printing, zhangjiajie-rural-teacher-3d-printing. The Beginner+Free view is viable and non-trivially populated.

(c) media / image property: does NOT exist. Zero entries carry a media, image, thumbnail, cover, or any image-like property. The planned cards view binding image: media will render no images. The base design must either (i) drop the image slot, (ii) add a media property to entries (schema change + data entry across 59 files), or (iii) derive a fallback (e.g. type-based icon). Flag to the design stage.

(d) summary_short: fully populated on all 59 entries — safe to use as the card description field.

(e) Dominant type values confirmed: Curriculum (17), Program (11), Software (10), Hardware (6), Component (6), Policy (5), Framework (3), Dataset (1). All are resource types; no Principle or MOC notes are present in entries/ (verified — zero files with type Principle/MOC). The type facet is well distributed except Dataset (1 entry) — still fine as a facet value.

(f) Additional design-relevant findings:

  • translation_available is a real boolean on 56 of 59 entries (3 are the string unknown) — safe for a boolean filter, but the 3 unknowns are strings, not bools; a strict translation_available == true filter handles them correctly.
  • space and climate are empty lists on 7 entries each (mostly software/policy, as the schema anticipates). Facets should treat "no value" distinctly from "unknown".
  • status is clean (Active 45 / Dormant 11 / Archived 3) — good candidate for a global filter status != "Archived".
  • Edge fields (builds_on, prerequisite_for, contrasts_with, prerequisites, aligned_with) are too sparse for faceting; keep them for entry-detail display only.

Verdict

Drift: 0.0% of entries (0/59) — below the 10% pause threshold. PROCEED.

The vocabulary data is trustworthy for faceted browsing as-is. The only design-blocking finding is the absence of a media/image property (affects the cards view), and the main data-quality caveat is 13 entries with unknown skill_level or cost that will fall out of skill/cost-filtered views.

Built with LogoFlowershow