Bases Interface Gaps Report

Scope: QA validation of _catalog.base (15 views) and _browse.md (15 inline base blocks) against all 59 entries in entries/, using _audit.md as reference. All verification was done by parsing the files and simulating the Bases filter logic in Python (see Render warnings). Round 2 (2026-09-14) implemented 9 additional views from the candidate list below. Round 3 (2026-09-14) converted _browse.md from .base file embeds to inline base blocks after the first live Flowershow publish failed — see Render warnings.

Views that could not be expressed in current Bases syntax

  • No cross-facet interactive filtering. A reader cannot combine facets ad hoc (e.g. Beginner + Free + China) — every combination must be pre-baked as a named view. Since round 3, _browse.md carries each view as a self-contained inline base block (filters + single view) rather than embedding _catalog.base, because Flowershow does not support .base file embeds; _catalog.base remains the canonical catalog for Obsidian-native use and the two must be kept in sync (the validator enforces name and count parity).
  • No "warning" or badge semantics. There is no way to surface a status warning (e.g. visually flagging Dormant entries) inside a view; Dormant entries simply appear in the lists with a status column.
  • No derived/fallback values. Views cannot synthesize a value (e.g. a type-based icon as a card image fallback for the missing media property — audit finding c), so the Cards view ships with no image slot at all.
  • No "unknown-inclusive" toggle. The 13 entries with unknown skill_level and/or cost fall out of any value-filtered view (audit finding a). A view must choose to either filter on concrete values or include everything; there is no per-reader toggle.

Implemented in round 2 (2026-09-14)

All counts verified by re-running qa_validate.py against live frontmatter within the 56-entry non-Archived base set; every view matched its expected count.

ViewFilter (Bases syntax)Entries
Region — USAregion.contains("USA")10
Region — EUregion.contains("EU")5
Region — Globalregion.contains("Global")23
Region — Africaregion.contains("Africa")4
Language — Chinese Sourceslanguage.contains("zh")11
Curricula — Freetype == "Curriculum" + cost == "Free"8
Outcome — 3D Printinglearning_outcomes.contains("3D Printing")17
Space — Classroomspace.contains("Classroom")34
Beginner + Free — Programsskill_level == "Beginner" + cost == "Free" + type == "Program"6

Notes on implementation choices:

  • Region — Africa: all 4 Africa-tagged entries also carry South Africa in their region list, so the single-value region.contains("Africa") filter is sufficient; the previously suggested or region.contains("South Africa") is redundant today (documented in a comment in _catalog.base).
  • Beginner + Free — Programs (6) was added as the only Beginner + Free sub-slice judged substantial enough for browsing.

Deliberately deferred (thin slices)

Verified non-empty but too small to justify a named view — revisit if the vault grows:

Candidate viewFilter (Bases syntax)Entries
Region — Latin Americaregion.contains("Latin America")2
Language — Spanish sourceslanguage.contains("es")3
Beginner + Free — Hardware/Componentsskill_level == "Beginner" + cost == "Free" + type == "Hardware" or "Component"3
Beginner + Free — Curriculasame + type == "Curriculum" (largely covered by Curricula — Free)4
Beginner + Free — Chinasame + region.contains("China")2
translation_available == truetranslation_available == true6

Populated fields not yet exposed as filters

Strong candidates (well populated, clean enums, per _audit.md):

  • maintenance — 51 of 59 known (Low 28 / Moderate 21 / High 2). Strong filter; useful for builders budgeting effort. Currently only a display column.
  • space — 52 of 59 populated (7 empty lists, mostly software/policy). Partially exposed in round 2 via Space — Classroom (34); Greenhouse (24) is a plausible future slice.
  • climate — 52 of 59 populated (7 empty lists incl. 1 unknown). Strong but skewed: Versatile 43 dominates; Temperate 6 / Tropical 4 / Arid 3 / Cold 1.
  • learning_outcomes — 57 of 59 known, rich 14-value enum. Partially exposed via Outcome — 3D Printing (17); no other outcome value is large enough to stand alone today.
  • language — 57 of 59 known. Exposed for zh (11); es (3) deferred as thin.
  • status — fully populated (Active 45 / Dormant 11 / Archived 3). Strong, but currently only used as a global exclusion; a dedicated "Dormant" surfacing view (11 entries) or a status column on every view (already present on table views) covers it.
  • audience — 58 of 59 known, but heavily skewed (Educators 51). Moderate: works as a column, weak as a browse facet.
  • translation_available — boolean on 56 of 59 (3 are the string unknown). Moderate; a strict == true filter is safe (6 entries); now also shown as a column in Language — Chinese Sources.

Weak candidates (too sparse to facet — keep for entry-detail display only, per audit): builds_on (4 populated), prerequisite_for (5), contrasts_with (14), prerequisites (0 — dead field), aligned_with (1), archive_url (null everywhere), source_type (free list, ~52 singleton/doubleton values — usable for search/grouping, not faceting without normalization).

Render warnings / errors

  • FIXED (2026-09-14): .mdx extension incompatible with Obsidian indexing. Obsidian only indexes .md notes, so _browse.mdx was invisible in the app and unavailable to the Flowershow publish plugin. The page was renamed to _browse.md; MDX parsing is preserved via the syntaxMode: mdx frontmatter flag, which Flowershow supports as an alternative to the file extension. Lesson recorded: always use .md + frontmatter syntaxMode: mdx, never the .mdx extension, for pages that must be visible inside Obsidian.
  • FIXED (2026-09-14): Flowershow does not support .base file embeds. The first live publish of _browse.md failed with Error parsing MDX â€Ķ Cannot handle unknown node 'raw'. Root cause: the page embedded views via ![[_catalog.base#View Name]] inside ```base blocks — valid in Obsidian, but Flowershow's Bases (Beta) only renders inline base YAML blocks and explicitly does not support base-file embeds yet (flowershow/flowershow#861). Fix: all 15 sections of _browse.md now carry self-contained inline base blocks (filters + single view each); _catalog.base is unchanged in view semantics and remains the Obsidian-side catalog. A file.inFolder("entries") guard was added to every block (and to _catalog.base) as the primary scoping filter. Validator updated to parse and simulate the inline blocks; all 15 pass with their expected counts.
  • Live rendering after round 3 is UNVERIFIED. The human's final check must be: (1) republish _browse.md via the Flowershow plugin and confirm each ```base block renders as an interactive view rather than erroring; (2) open _catalog.base in Obsidian and confirm all 15 views render.
  • Embed format now matches Flowershow's documented inline pattern (```base fenced block containing filters + views YAML) — all 15 blocks parse as YAML, hold exactly one view each, and reproduce the expected entry counts under simulation, including the em dash (U+2014) in all Region —, Language —, Outcome —, Space —, Curricula —, and Beginner + Free — names.
  • Byte-level checks clean: _catalog.base has no BOM, no tabs, no CRLF, no smart quotes; _browse.md likewise (LF endings, no smart quotes, syntaxMode: mdx present in frontmatter).
  • Obsidian-version caveat: file.hasProperty(...) and list.contains(...) in filter expressions require a recent Obsidian Bases build; on older versions these expressions may silently fail to parse. Not verifiable here.
  • Cards view has no image by design (no media property exists on any entry — audit finding c). If a future schema change adds media, the Cards view should gain an image binding.

Verification results summary

Filter simulation (Python, global filters + view filters, against all 59 real entry files, 2026-09-14):

ViewExpectedActualResult
All Resources — Table5656PASS
All Resources — Cards5656PASS
Beginner + Free1414PASS
Beginner + Free — Programs66PASS
Curricula1616PASS
Curricula — Free88PASS
Hardware & Components1212PASS
Outcome — 3D Printing1717PASS
Space — Classroom3434PASS
Language — Chinese Sources1111PASS
Region — Global2323PASS
Region — USA1010PASS
Region — China1212PASS
Region — EU55PASS
Region — Africa44PASS
  • Every view has â‰Ĩ 1 entry (empty-state check passes).
  • Beginner + Free membership verified by hand: all 14 matched 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) are genuinely skill_level: Beginner AND cost: Free AND status: Active — matching the audit's list exactly.
  • YAML/structure: _catalog.base parses cleanly; top-level filters + views list; all 15 views have valid type (table/cards/list) and unique exact name; every filter expression follows plausible Bases syntax (!=, ==, file.hasProperty(), .contains()).
  • Embed integrity: exactly 15 ```base embeds in _browse.md, each matching a view name character-for-character (em dashes included); no missing or extra views.
  • Link integrity: [[Contribute Here]] → mocs/Contribute Here.md exists; [[Start Here]] → mocs/Start Here.md exists.
  • Fixes made during QA: none — no defects found in _catalog.base or _browse.md.
  • Open for human verification: live Obsidian Bases editor rendering; live Flowershow build output.
Built with LogoFlowershow