feat(adventure): add The Accessibility Nightmare - #243
Closed
offon-data-refresh[bot] wants to merge 2 commits into
Closed
feat(adventure): add The Accessibility Nightmare#243offon-data-refresh[bot] wants to merge 2 commits into
offon-data-refresh[bot] wants to merge 2 commits into
Conversation
… descriptions The Sync Adventure workflow failed on adventure-accessibility-nightmare with two unrelated schema errors. Both are fixed here. **meta_description length no longer fails the build** - Dropped `.max(160)` from the adventure and level schemas - `warnIfMetaDescriptionLong` logs the over-run instead, called from `renderLevel` and the adventure transform - Search engines truncate a long description rather than reject it, so this was never worth failing a whole sync run over **Contributors now sync from the challenges repo** - The adventure designer is read from `contributor:` in `docs/index.yaml`. The sync previously kept only one already hand-written into the website YAML, so a freshly synced adventure got none - The challenge builder already flowed through from the level YAML, but unfiltered. `pickContributor` now keeps only the four fields the strict content schema accepts, on both paths - A contributor already credited on the website wins over the upstream value at both levels, and `mergeLevels` warns when the two diverge rather than dropping the divergence silently The missing designer alongside levels naming their own builder is what tripped `creditIntegrityError` and produced the second error. - Tests: `pickContributor`, `buildLevel` and `mergeLevels` credit rules - Docs: ADVENTURES.md field and preservation tables, sync PR checklist - Corrected two comments claiming the sync deliberately omits `contributor` Signed-off-by: Sinduri Guntupalli <sinduri.guntupalli@dynatrace.com>
sinduri-g
added a commit
that referenced
this pull request
Sep 7, 2026
Follow-up to the review of the previous commit, plus the route-coverage failure on PR #243. **Contributor data is now validated, not copied verbatim** - `contributor.url` is `z.url()` in the content schema, which rejects a bare domain like `ksick.dev`. An unvalidated copy failed `npm run sync` in the next workflow step, which runs before PR creation, so the run went red with no branch to hand-fix. The url is dropped with a warning and the name kept - `new URL()` is the gate, verified to match `z.url()` on every sample tested - A present-but-unusable block (no `name`, not an object) now warns instead of returning null in silence, which had reported "No contributor found" as fact and re-credited the level to the designer via the fallback - `pickContributor` takes a `where` label so each warning names its source file **Two failures moved to where they are actionable** - No designer upstream plus a level naming its own builder tripped `creditIntegrityError` during "Validate adventure YAML", before the PR existed. `missingDesignerError` now fails the sync early, naming `docs/index.yaml` in the challenges repo. A parity test holds it in step with the schema rule - A designer changed upstream was discarded with neither log branch firing; it now warns, matching the level builder **Challenge tag routes now come from the adventure tags** - `/challenges/<tag>/` routes are built from adventure `tags`, but the sync derived them from level `topics`. Narrowing a level's topics to a subset, which the PR checklist invites, left those tags building unregistered routes - This is what failed route-coverage.spec.ts on #243 for `/challenges/accessibility/` and `/challenges/guidepup-virtual-screen-reader/` - `challengeTagsOf` unions adventure tags with level topics; `tagToSlug` has a parity test against `src/lib/challenges.ts` - Tests: 49 in the sync spec, including three parity guards against the TypeScript rules this script has to restate - Docs: ADVENTURES.md contributor url, early designer failure, routes step Signed-off-by: Sinduri Guntupalli <sinduri.guntupalli@dynatrace.com>
sinduri-g
deleted the
feat/adventure-adventure-accessibility-nightmare
branch
September 7, 2026 09:59
Contributor
|
sinduri-g
added a commit
that referenced
this pull request
Sep 7, 2026
A /challenges/<tag>/ page listed every challenge in any adventure carrying that tag, including challenges that never touch the tech. `getChallengeData` gave each entry `adventureTags: a.tags`, and `level.topics` was declared on the type but never read. **Three routes were affected, two of them live** - `/challenges/guidepup-virtual-screen-reader/` (PR #243) showed the beginner challenge; Guidepup belongs to the intermediate level, which is not live yet - `/challenges/python/` and `/challenges/terraform/` had the same defect already **The fix** - `ChallengeEntry.adventureTags` becomes `topics`, taken from the level, falling back to adventure tags only for a level carrying none - The tag set is derived from the entries, so a tag exists exactly when some challenge teaches it. A tag no live level carries builds no route rather than an empty or misleading one, and appears when that level ships - `challengeTagsOf` in the sync now mirrors this, deriving from level topics. Registering an adventure tag would list a route the build never emits and trip the drift gate from the other side **Data** - Python added to all three the-ai-observatory level topics. It is genuinely taught there (6-8 mentions per level) and was simply missing, so the route stays and is now correct - Terraform removed from building-cloudhaven tags. That adventure teaches OpenTofu; "Terraform" appeared once, inside an OpenTofu help link. No redirect, so the slug stays free for a future adventure that does teach Terraform - `/challenges/terraform/` dropped from ROUTES_WITHOUT_FULL_COVERAGE Verified against the built output: /challenges/prometheus/ now shows 1 challenge rather than all three ai-observatory levels, and every visible card carries the filtered tag. Signed-off-by: Sinduri Guntupalli <sinduri.guntupalli@dynatrace.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
create: The Accessibility Nightmare
Auto-synced from the challenges repo.
Source: https://github.com/off-on-dev/open-source-challenges/tree/main/adventures/planned/adventure-accessibility-nightmare
Levels in this PR:
beginnerBefore merging
contributor:block insrc/data/adventures/adventure-accessibility-nightmare/adventure.yaml. It is synced fromdocs/index.yamlin the challenges repo; add it by hand only if the sync log says none was found.month:is correct for the planned releasecommunity_category_id:insrc/data/adventures/adventure-accessibility-nightmare/adventure.yaml(look up at https://community.offon.dev/categories.json) - [ ] Updaterewards.deadline:fromTODOto ISO 8601 (e.g.2026-07-01T23:59:00+01:00)meta_description:inadventure.yaml— auto-generated from the first level summary; refine to cover all levels in one technical sentence (max 160 chars)topics:on each level, auto-set to all adventure tags, refine to level-specific subset if neededdiscussion_url:in each level once the Discourse threads are createddiscussionUrlin each*-posts.jsonstubManual steps (only if needed)
architecture_diagramSVG was not auto-fetched (check the sync logs for a warning), add the SVG manually tosrc/assets/diagrams/and addarchitecture_diagram: <file>.svgto that level inadventure.yaml- [ ] If a level has anarchitecture_diagrambut nodiagram_alt, adddiagram_alt:to that level inadventure.yamlwith a one-sentence description of the diagram - [ ] Runnode scripts/refresh-leaderboard.mjsaftercommunity_category_idis setnode scripts/refresh-discussions.mjsafterdiscussionUrlvalues are setRoutes & sitemap
Routes are generated from
adventure.yamlby the Astro content collectionat build time (
getStaticPaths) — there is nothing to regenerate or commit.The leaderboard registry derives from adventure.yaml at runtime via
buildAdventureCategories()in refresh-leaderboard.mjs -- nothing to hand-maintain.Checks