Vault Frontmatter Audit
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
| Field | Inferred Type | Populated (of 59) | unknown / Empty |
|---|---|---|---|
slug | string | 59 | 0 |
title | string | 59 | 0 |
type | string (enum) | 59 | 0 |
primary_source | string (URL) | 59 | 6 unknown |
source_type | list[string] (free list) | 59 | 4 unknown |
last_verified | date (YYYY-MM-DD) | 59 | 0 |
status | string (enum) | 59 | 0 |
archive_url | null | 0 (all 59 are null) | 59 null (schema-sanctioned) |
language | list[string] (ISO 639-1) | 59 | 2 unknown |
translation_available | boolean | 56 | 3 unknown (string) |
region | list[string] (enum) | 59 | 1 unknown |
audience | list[string] (enum) | 59 | 1 unknown |
cost | string (enum) | 59 | 4 unknown |
skill_level | string (enum) | 59 | 10 unknown |
space | list[string] (enum) | 52 | 7 empty lists |
climate | list[string] (enum) | 52 | 7 empty lists (incl. 1 unknown) |
maintenance | string (enum) | 59 | 8 unknown |
learning_outcomes | list[string] (enum) | 59 | 2 unknown |
embodies | list[wikilink] | 59 | 0 (min 1 satisfied everywhere) |
builds_on | list[wikilink] | 4 | 55 empty lists |
prerequisite_for | list[wikilink] | 5 | 54 empty lists |
contrasts_with | list[wikilink] | 14 | 45 empty lists |
prerequisites | list | 0 | 59 empty lists |
mocs | list[wikilink] | 59 | 0 (min 1 satisfied everywhere) |
summary_short | string | 59 | 0 |
aligned_with | list[wikilink] | 1 | 11 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)
| Value | Entries |
|---|---|
| Curriculum | 17 |
| Program | 11 |
| Software | 10 |
| Hardware | 6 |
| Component | 6 |
| Policy | 5 |
| Framework | 3 |
| Dataset | 1 |
No Principle, MOC, or Person types inside entries/. No Organization type used yet.
skill_level
| Value | Entries |
|---|---|
| Beginner | 25 |
| Intermediate | 16 |
| Advanced | 8 |
unknown | 10 |
cost
| Value | Entries |
|---|---|
| Free | 33 |
| Low | 15 |
| Medium | 6 |
| High | 1 |
unknown | 4 |
region (multi-value)
| Value | Count |
|---|---|
| Global | 23 |
| China | 12 |
| USA | 11 |
| EU | 7 |
| South Africa | 4 |
| Africa | 4 |
| Oceania | 2 |
| Indigenous | 2 |
| Latin America | 2 |
| Guam | 1 |
| Southeast Asia | 1 |
unknown | 1 |
audience (multi-value)
| Value | Count |
|---|---|
| Educators | 51 |
| Community | 29 |
| Adult Learners | 26 |
| University | 22 |
| K-12 | 22 |
| Household | 19 |
| Secondary | 18 |
| Vocational | 17 |
| Researchers | 11 |
unknown | 1 |
maintenance
| Value | Entries |
|---|---|
| Low | 28 |
| Moderate | 21 |
| High | 2 |
unknown | 8 |
status
| Value | Entries |
|---|---|
| Active | 45 |
| Dormant | 11 |
| Archived | 3 |
climate (multi-value; 7 entries have empty lists)
| Value | Count |
|---|---|
| Versatile | 43 |
| Temperate | 6 |
| Tropical | 4 |
| Arid | 3 |
| Cold | 1 |
unknown | 1 |
space (multi-value; 7 entries have empty lists)
| Value | Count |
|---|---|
| Classroom | 36 |
| Indoor | 27 |
| Greenhouse | 25 |
| Outdoor | 13 |
| Backyard | 8 |
| Public Space | 6 |
| Rooftop | 5 |
learning_outcomes (multi-value)
| Value | Count |
|---|---|
| Systems Thinking | 38 |
| Food Production | 35 |
| Sustainability Literacy | 29 |
| Water Chemistry | 26 |
| Data Literacy | 25 |
| Coding | 19 |
| 3D Printing | 18 |
| Electronics | 18 |
| Biology | 17 |
| Project Management | 16 |
| CAD | 13 |
| Entrepreneurship | 12 |
| Community Organizing | 8 |
unknown | 2 |
language (multi-value, ISO 639-1)
| Value | Count |
|---|---|
| en | 42 |
| zh | 11 |
| es | 4 |
| de | 3 |
| fr | 2 |
| pt | 2 |
| sl | 2 |
| sk | 1 |
| id | 1 |
| cs | 1 |
unknown | 2 |
translation_available
| Value | Entries |
|---|---|
| false | 48 |
| true | 8 |
unknown | 3 |
source_type (free list, multi-value â top values)
| Value | Count |
|---|---|
| GitHub Repository | 13 |
| Program Website | 10 |
| 3D Model Repository | 4 |
| Government Document | 3 |
| STL Files | 3 |
unknown | 4 |
| ~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):
| File | Field(s) with unknown |
|---|---|
| interactive-hydroponics-textbook.md | skill_level, cost |
| hydro-mod.md | skill_level |
| china-rural-revitalization-policy.md | skill_level |
| education-power-plan-2024-2035.md | skill_level |
| eqf.md | skill_level |
| harvesting-knowledge-act-2023.md | skill_level |
| kurikulum-merdeka.md | skill_level |
| oecd-learning-compass-2030.md | skill_level |
| panama-ley-465.md | skill_level |
| seven-ministry-stem-education-guidelines-2025.md | skill_level |
| chanst3d-sla-printer.md | cost |
| german-sensor-school-guide.md | cost |
| vertical-farming-project-china.md | cost |
(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-2025cost: 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_availableis a real boolean on 56 of 59 entries (3 are the stringunknown) â safe for a boolean filter, but the 3 unknowns are strings, not bools; a stricttranslation_available == truefilter handles them correctly.spaceandclimateare empty lists on 7 entries each (mostly software/policy, as the schema anticipates). Facets should treat "no value" distinctly from "unknown".statusis clean (Active 45 / Dormant 11 / Archived 3) â good candidate for a global filterstatus != "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.