TODO¶
Working task list for cloud-data-ai-security-zero-to-hero. Read this at the start of a work session and keep it current as work completes - check items off with a date, add follow-ups as they surface. Stale TODOs are worse than none. Security debt (if any) is tracked separately in SECURITY-DEBT.md.
Open¶
Discoverability (added 2026-08-31)¶
- Upload the social preview image. GitHub serves an auto-generated card for this repo, so every share on X/LinkedIn/Slack renders as a generic placeholder. A 1280x640 card is rendered at
/tmp/claude-1000/-home-plw-coding/4ffb6de8-198a-4962-8a8b-1f54e9ab4159/scratchpad/social/cloud-data-ai-security-zero-to-hero-social-1280x640-31AUG2026.png. Upload via Settings β General β Social preview (the GitHub API does not expose this). - Commit and push the new
LICENSE(CC BY 4.0) andLICENSE-CODE(MIT). Until they land, GitHub shows this repo as unlicensed - all rights reserved - which is the opposite of the "free to use for educational purposes with attribution" the README already states. Content is CC BY; the ~9,500 embedded code samples andscripts/are MIT so a reader can copy a snippet without an attribution obligation.
Backlog derived from the repo-wide gap analysis in docs/improvement-roadmap.md (2026-07-28). See that document for evidence, counts, and reasoning behind each item.
Add items as - [ ] task, grouped by priority or theme. Mark done inline: - [x] ~~task~~ β
done YYYY-MM-DD.
Priority 1 - correctness¶
- ~~Fix
build-freshness-ledger.shpath bug, then regeneratedocs/freshness.md~~ β done 2026-07-29 (cleared 191 broken links) - ~~Rewrite 87 absolute
/exams/...links as relative~~ β done 2026-07-29 - ~~Repoint or remove 28 links to the old directory layout~~ β done 2026-07-29
- ~~Update
STUDY-HUB.mdprovider table~~ β done 2026-07-29 (added ISACA, Offensive Security, Palo Alto, ServiceNow, VMware; corrected AWS 18, CompTIA 4, Cisco 2, Salesforce 3) - ~~Update cert/provider badge counts~~ β done 2026-07-29 (133 certs / 26 providers, not 127/27 - see note below)
- ~~Split
link-check.ymlinto a blocking internal-link job and an advisory external-URL job~~ β done 2026-07-29 - ~~Fix cert discovery in
validate-cert-structure.shandbuild-freshness-ledger.sh~~ β done 2026-07-29
Count correction. The gap analysis first reported 127 certs because both scripts discovered cert dirs by looking for a
notes/subdir, which skipped the 10 certs whose notes were never drafted. Counting byfact-sheet.mdgives 137 cert dirs: 133 certifications across 26 providers, plus 4 Anthropic study tracks. Both scripts now usefact-sheet.md, so the validator checks all 137 instead of 127.
Priority 2 - content substance¶
- ~~Write notes for the 10 outline-stage certs~~ β done 2026-07-29. All now active with drafted notes, links restored, banners removed. No cert is at outline stage.
- ~~comptia/cysa-plus~~ (4 notes)
- ~~comptia/network-plus~~ (5 notes)
- ~~cisco/ccnp-enterprise-encor-350-401~~ (6 notes)
- ~~isaca/cisa~~ (5 notes)
- ~~isaca/cism~~ (4 notes)
- ~~offensive-security/oscp-pen-200~~ (6 notes)
- ~~palo-alto-networks/pcnsa~~ (4 notes + scenarios + strategy)
- ~~salesforce/platform-developer-2~~ (6 notes + strategy)
- ~~servicenow/csa~~ (6 notes + scenarios + strategy)
- ~~vmware/vcp-dcv-2v0-21-23~~ (6 notes)
- ~~Resolve the diagram standard~~ β
done 2026-07-29 - Mermaid is now the documented default, PNG the exception. Updated
CLAUDE.md,docs/ARCHITECTURE.md,CONTRIBUTING.md,assets/diagrams/README.md. - ~~Add index READMEs to the 21 provider directories that lack one~~ β
done 2026-07-29 (all 27 now generated from
docs/certs.json; the 6 hand-written ones kept their editorial content) - ~~Complete
aws/professional/genai-developer-aip-c01~~ β done 2026-07-29 - practice-plan, scenarios, strategy written. Structure validator is at zero warnings. - ~~Move
exams/aws/genaiunderfoundational/; reconcileazure/genaiandgcp/genaiplacement~~ β done 2026-07-29 (AI Practitioner moved toexams/aws/foundational/ai-practitioner-aif-c01/; the Azure and GCP dirs are study tracks, kept in place and now counted astrackrather than certification) - ~~Replace the 2 remaining
last-updated: YYYY-MM-DDplaceholders~~ β 2026-07-29 - not applicable. Both live inside``yaml fenced blocks inCLAUDE.mdandCONTRIBUTING.md` that document the frontmatter convention. The original scan did not skip code fences. No stale frontmatter exists.
Priority 3 - leverage¶
- ~~Build
docs/certs.jsonfrom fact-sheets; generate the hub table and provider indexes from it~~ β done 2026-07-29 (CI fails if either is stale). Freshness ledger still generates independently - fold it in if it drifts. - Add practice questions for uncovered certs. 47 of 150 covered; 103 have none. Use the template. Highest value first: the certs that already have complete notes but no question bank. Next batch by volume: NVIDIA (10 certs, 0 banks), GitHub (5), IBM (5), Anthropic (4), CompTIA (4), MongoDB (3), Salesforce (3).
- ~~Add Tier 1 certifications~~ β done 2026-08-09. All 13 added: SC-100, SC-300, SC-401 (SC-400 is retired and was replaced by SC-401 - the roadmap entry was out of date), PL-300, the five CNCF associates (OTCA/CGOA/CAPA/CCA/CNPA), ISC2 CC, Oracle OCI AI Foundations + OCI GenAI Professional, Google Generative AI Leader. 137 β 150 cert directories, each with README, fact-sheet, practice-plan, scenarios, strategy, domain notes, a practice question bank, and a generated flashcard deck.
- ~~Stagger
last-updatedre-verification by provider batch~~ β done 2026-07-29 -check-cert-freshness.pyassigns each provider a review month and reports what is due. The rotation exists; the re-verification work itself is ongoing (12 certs due in month 7).
Priority 4 - differentiation¶
- ~~Per-cert
flashcards.csv(Anki-importable)~~ β done 2026-07-29 - 80 decks, 6,487 cards. 57 certs fall below the 15-card threshold and get no deck; raising that means writing more- **Term** - definitionlines in their notes. - ~~Map labs to the certs they support~~ β done 2026-07-29 - 15 labs mapped to 46 certs, generated both directions. 91 certs still have no lab.
- ~~Add
status:andexam-version:frontmatter plus a revision-warning script~~ β done 2026-07-29 -statusis derived incerts.jsonrather than hand-declared (no drift).exam-version:/exam-retires:are optional frontmatter, seeded on the 4 retired AWS certs;check-cert-freshness.pywarns ahead of a known retirement. - ~~Wire
check-orphan-links.shinto CI~~ β done 2026-07-29 - runs advisory (never blocking, since orphan detection is heuristic). Orphans are currently 0. - ~~Prune
.claude/settings.json~~ β done 2026-07-29 - ~~Publish the repo as a searchable site~~ β
done 2026-08-14 - MkDocs Material on GitHub Pages, generated from the markdown tree by
build-site.py. See below.
Completed 2026-08-14 - published as a searchable website¶
The repo's 3.0M words had no search: navigation was GitHub's file listing. Every page is now also published at patrickwiloak.github.io/cloud-data-ai-security-zero-to-hero.
The markdown tree is unchanged and stays the source of truth. build-site.py adapts the tree to MkDocs at build time rather than restructuring the tree for MkDocs, so there is no second copy of any page.
-
.github/scripts/build-site.py- staging, generated directory landing pages, fence-aware link rewriting, and all 2,032 nav entries generated from the tree plusdocs/certs.json -
mkdocs.yml(hand-maintained, nonav),requirements-docs.txt(fully pinned),.github/site/extra.css -
.github/workflows/docs-site.yml---strictbuild blocks every PR; deploys to Pages on push to main - Docs updated: README, CONTRIBUTING (local preview),
docs/ARCHITECTURE.md(design + conventions),.github/AUTOMATION.md, CHANGELOG
Defects the strict build surfaced and fixed¶
All three were broken on GitHub too, and none was catchable by the existing link checker:
- An unclosed code fence in
exams/gcp/cloud-architect/notes/compute-containers.mdswallowed ~130 lines including four headings. A stray duplicate fence in the same file compounded it. A repo-wide scan found no other instance. - 14 broken heading anchors:
resources/community-resources.md(11 - its whole table of contents),README.md,docs/improvement-roadmap.md, and one AWS note. Most omitted the leading hyphen an emoji heading produces. - Links into
.templates/had no working site target; it is staged asprovider-resources/and the ~144 inbound links are rewritten.
Follow-ups closed 2026-08-14 (same day)¶
- ~~Pages must be enabled once: Settings > Pages > Source > GitHub Actions~~ β
enabled via
gh api -X POST .../pages -f build_type=workflow; the previously failing deploy job was re-run and the site is live. Verified 200 on the homepage, Study Hub, a deep cert page, a generated directory index, and the stagedprovider-resources/. - ~~Theme was Material's default indigo~~ β
switched to monochrome (Nobler Works house style).
mkdocs.ymlsetsprimary: custom/accent: customon all three palette entries - the auto entry renders before the palette JS runs, so leaving it unset kept showing indigo - and the black/white values live in.github/site/extra.css. Links carry underlines instead of colour, and slate's blue-grey dark surfaces are overridden to neutral black. Dark mode is true#000000as of the same day: the banners are flattened PNGs on pure black, so a near-black page drew a rectangle around each one. - ~~The themed site still read like a styled README~~ β
same day, restyled to the gitGood design language, extracted from gitgood.dev's source: green accent (
#22c55e) on links/CTAs/hover borders/glow shadows, Geist + Geist Mono, centred staggered hero with accent kickers, card hover = accent border + tinted shadow + 2px lift. Also fixed two dark-mode defects the monochrome pass shipped (black-on-black hero buttons, washed-out h1), hid the header's star/fork repo widget, and stripped leading heading emoji on the site only (strip_heading_emoji()in build-site.py pins each original anchor slug, so no inbound anchor link moved; the repo markdown and the sidebar's landmark labels are untouched). See CHANGELOG 2026-08-14. - ~~Both sidebars were rendered, and the populated one appeared to switch sides between pages~~ β
navigation.tabsoff, so the left sidebar is the same full tree everywhere, andtoc.integratefolds the page contents into it so there is no right column.toc.integratealone drops the ToC on every section-index page - Material only emits it for leaf pages - so.github/site-overrides/partials/nav-item.htmloverrides that partial. This couples the repo to Material's template internals: after a version bump, re-copy the partial, re-apply the marked block, and check a cert landing page by eye. A--strictbuild will not catch a drifted template. - ~~No promotion of gitGood.dev, the flagship product~~ β
promo block in the README header and on the landing page, with
assets/brand/gitgood-banner.pngcropped from gitGood's loading splash (it ships no marketing banner, and the splash carries a progress bar and an "84%" label). Copy names 21 role-targeted paths and the cert banks by exam code, for search; the long lists sit in a collapsed<details>so they cost no visible height. - ~~README counts drifted unnoticed~~ β
check-readme-counts.pyadded and wired intostructure-validate.ymlas a blocking check. It caught "37 concept pages" (actually 46), "8 topic indexes" (actually 13), and the2.6M wordsfigure copied out of the datedimprovement-roadmap.mdsnapshot (the tree is at 3.0M). Run--fixwhen you add content. Then it caught a bug in itself: the first version walked the filesystem and counted the.site-src/staged copy a local site build leaves behind, reporting 6.1M words against a real 3.0M. It now counts viagit ls-files, so no build artifact can inflate a total. - ~~The site's home page was the repo README~~ β
.github/site/home.mdis now rendered over the stagedREADME.mdbybuild-site.py: hero with three entry points, counts strip, four pillars as cards, a two-column jump list, 27 provider chips, and the three most recent release notes. GitHub keeps its repo front page; the site gets a landing page. No number is typed into it - every figure is a token filled fromcerts.jsonandcheck-readme-counts.py, and the release notes are extracted from the README, so neither page can drift from the other. - ~~The README's per-provider table was stale in 8 of 22 rows and missing 5 providers~~ β
Kubernetes/CNCF read 7 against 12, Azure 23 against 26, CompTIA 2 against 4, Oracle 5 against 7; ISACA, Offensive Security, Palo Alto Networks, ServiceNow and VMware had no row at all, five days after the Tier 1 batch added them. The table is now generated by
build-provider-indexes.pybetween markers, like theSTUDY-HUB.mdone, so counts and the row set come fromcerts.json. - ~~The table's "Highlights" column was hand-written and unchecked~~ β
It is one curated string per provider in
PROVIDER_HIGHLIGHTS, shared by both tables, and the generator refuses to run if a provider has no highlight or noPROVIDER_EMOJIicon - so a new provider fails CI instead of rendering a blank row. Four lines were describing half a provider and were feeding STUDY-HUB while they did: Kubernetes/CNCF listed 7 of 12, ISC2 omitted CC, Oracle omitted both OCI AI certs, AWS omitted GenAI Developer. All fixed, and both tables now say plainly that Highlights is a sample and the Certs column is the total. - ~~Two scripts could rewrite the README's provider rows~~ β
The stopgap provider-table check in
check-readme-counts.pywas removed once the table became generated. Its--fixwould have corrected a count inside a generated block, leaving the generator reporting the file stale. One table, one owner. - ~~The "Repository Statistics" block was outside CLAIMS~~ β
It still read 37 concept pages against 46, 8 topic indexes against 13, and 5 compliance guides against 8 - the same drift the checker was written to stop, in the one section that is nothing but counts. 17 numbers added to
CLAIMS, including the three restated in the repository-structure block.
Known follow-ups¶
- The search index is 28 MB uncompressed. It is lazy-loaded and served gzipped, but if first-search latency becomes a complaint, the options are splitting the index per section or excluding the deepest cert notes from it.
check-internal-links.pyand the site build now overlap but are not redundant: the former checks the source tree offline, the latter checks rendered URLs and heading anchors. Worth folding anchor validation into the standalone checker so the failure is reported without a full site build.- No CI check for unbalanced code fences. The site build catches them only indirectly, as missing anchors on the affected page. A direct validator would name the file and line.
PROVIDER_HIGHLIGHTSis the last hand-written thing in either provider table. Nothing can check that a sample is a good sample, only that it exists - so a provider that gains a cert can still keep a blurb that does not mention it. The blast radius is now one string feeding both tables rather than two that drift apart, and both tables state that Highlights is a sample. Worth a look whenever a provider's count changes.
Completed 2026-08-09 - content gap expansion¶
A repo-wide gap analysis found four holes. All four are now closed. Counts below are measured, not estimated.
AI security and governance (new)¶
The repo is named cloud-data-ai-security-zero-to-hero and had no dedicated AI security material: "OWASP LLM Top 10" appeared in exactly one file, "model supply chain" in zero, and resources/compliance-guides/ covered FedRAMP, GDPR, HIPAA, PCI-DSS and SOC 2 with nothing AI-specific.
-
resources/ai-security/- OWASP LLM Top 10, prompt injection defense, agent and tool security, model supply chain, LLM red teaming, plus an index -
resources/compliance-guides/- EU AI Act, NIST AI RMF, ISO/IEC 42001 -
learn/concepts/- prompt injection explained, AI threat modeling -
topics/ai-security.mdcross-pillar hub
Tier 1 certifications (13 added)¶
- Microsoft: SC-100, SC-300, SC-401, PL-300
- CNCF: OTCA, CGOA, CAPA, CCA, CNPA
- ISC2 CC - the free, no-prerequisite entry point the "zero to hero" framing implied but the repo did not have (the security path started at Security+)
- Oracle: OCI AI Foundations, OCI Generative AI Professional - Oracle had five certs here and zero AI ones
- Google: Generative AI Leader
- OTCA also closes the "no observability certification anywhere in exams/" gap, and CCA is the only cert in the repo teaching eBPF
Learn pillar¶
Was 54k words against 2.17M in exams/.
- 8 new concept pages: caching, SQL vs NoSQL, load balancing, secrets management, autoscaling, deployment strategies, cloud cost basics, GPUs for AI
- 3 new day-one pages: file permissions, JSON and YAML, reading error messages
-
topics/platform-engineering.mdhub - Concepts index gained a Data and Databases section; 34 β 46 concept pages
Practice questions¶
- 13 new banks, one per new cert. Coverage 34/137 β 47/150
Housekeeping¶
- All generated indexes rebuilt:
docs/certs.json, 27 provider indexes, STUDY-HUB table, flashcards (90 β 103 decks, 9,545 cards), lab map, freshness - Hand-maintained counts corrected in README, STUDY-HUB, CLAUDE.md, learn/README
-
.cspell.jsonextended with 100+ legitimate technical terms - Validators at zero: structure 0 failures / 0 warnings, 4,053 internal links 0 broken, frontmatter 0 failures, orphans 0
Known follow-ups¶
- Practice question banks for the 103 certs that still have none
- 47 certs remain below the 15-card flashcard threshold; raising them means writing more
- **Term** - definitionlines in their notes markdownlintMD060 (table-column-style) fires across the whole repo, including files untouched by this work. It is a newer rule than the pinned CI action, so it is version drift rather than a content defect. Decide whether to disable it in.markdownlint.jsonor reformat every table
Completed 2026-08-11 - Anthropic certification program refresh¶
Anthropic launched an official certification program in 2026 (Architect Foundations in March; Associate, Developer, and Architect Professional in July). The four repo "study tracks" predated it. This pass aligned the repo with the real program.
- Renamed
claude-certified-architect-advancedβclaude-certified-architect-professionalandclaude-application-developerβclaude-certified-developer-foundations(git mv, practice banks renamed too, all inbound links repointed) - Retargeted all three existing technical tracks to the official exams with verified blueprints: CCAR-F ($125, 60q), CCAR-P ($175, 63q, 7 domains), CCDV-F ($125, 53q, 8 domains) - real domain weights, Pearson VUE delivery, Partner Academy registration, 12-month validity, retake policy
- New cert dir
claude-certified-associate-foundations(CCAO-F, $99, 60q, 7 domains): full skeleton + 7 notes + 15-question bank, 2,335 lines - 5 new notes filling blueprint gaps: governance/safety/risk and stakeholder lifecycle (CCAR-P); model selection, agents/workflows, security+Claude Code+evals (CCDV-F)
- Prompt Engineering Specialist stays a study track (no official prompt exam); banner updated to say so
- Provider promoted from "Anthropic Claude (study tracks)" to a certification provider in both generator scripts; STUDY-HUB table now lists it with the cloud/AI providers
- All indexes regenerated: certs.json (148 certs / 27 providers / 3 tracks), 27 provider indexes, STUDY-HUB table, lab map, freshness ledger, flashcards (105 decks, 9,660 cards)
- Hand-maintained counts corrected in README, STUDY-HUB, CLAUDE.md, docs/ARCHITECTURE.md
- Validators at zero: structure 0/0, 4,832 internal links 0 broken
Known follow-ups¶
- Exam facts came from the official Pearson VUE page plus secondary 2026 guides; domain weights for CCAO-F and CCAR-P could not be confirmed against the official exam guides (Partner Academy login required). Verify when Partner Network access is available and stamp
docs/freshness.md. docs/improvement-roadmap.md(2026-07-28 snapshot) still describes 4 Anthropic study tracks; left as a dated historical analysis.