No items match the current filters. Clear filters
mindboost-studio (confirmed 2026-07-16), but every currently-active repo — mindboost-ops, calebfoster.ai, social-dashboard, scorm-lms, lesson-shell — still lives under the personal fosterc1 account, where GitHub gates branch/tag protection behind a paid Team account. Until each repo moves, the branch ladder is enforced manually only: client-side .githooks (pre-commit version bump, pre-push main-guard) activated per-clone via sh setup.sh, plus process discipline — confirmed bypassable this session when a scratchpad clone skipped setup.sh and pushed straight to main unblocked. Residual (optional, Low): once a repo migrates, also add PR description templates (QA tested · a11y checked · preview URL · Caleb acceptance)./showcase/learning-carousel/) describe how to use a learning component — a natural fit for HowTo JSON-LD. Blocked on the showcase pages existing (still placeholders today). When built: if they render through the journal/article pipeline, HowTo is auto-derived from ≥3 numbered-step H2s (no manual schema) — so the task is to confirm the render path emits it, and only hand-author HowTo if the showcase uses a different path./showcase/ index lists a "Lesson Shell" entry but it links to a placeholder. Build out a live demo page — similar to the Card Carousel showcase — showing the lesson shell component in action with usage notes and a code snippet. This is the Freedom Framework's core output and deserves a flagship showcase treatment before the Freedom phase 1 ships.mb CLI; Card Carousel ported as first component; CSS custom property theme system; XLIFF localisation pipeline. Private repo: mindboost-studio/freedom. Phase 1 gate: developer can clone, create a course, and ship a valid SCORM zip in 15 minutes. Full brief: workspace/team/briefs/STU-BRIEF-freedom-framework.md./showcase/learning-carousel/ — identify and build the other 4 placeholders.scorm-lms/index.html calls backend API routes that don't exist. Build the full backend using Cloudflare Pages Functions + R2 (file storage) + D1 (SQLite database). Scope: upload SCORM zip → parse manifest → store files in R2 → register in D1 → enrol learner → generate launch token → serve course in iframe with SCORM 1.2 API shim → track completion → reports page. Full brief at workspace/team/briefs/STU-BRIEF-scorm-lms-backend.md.fosterc1/calebfoster.ai → the mindboost-studio org, switch its deploy to CI/wrangler (off the Pages git-integration), and hand off to Claw to re-point the journal worker (which commits article HTML into this repo) + update Claw's skill/cron repo references. Tracked: lesson-shell#394.fosterc1/social-dashboard → mindboost-studio, switch deploy to CI/wrangler (preserving its Pages Functions + R2/KV bindings), and directly update the ~16 workflow files' repo references (they already use secrets.GITHUB_TOKEN, so an org transfer should be a path/owner rename, not a re-point of the automation model). The most complex of the site moves. Tracked: lesson-shell#394.fosterc1/lesson-shell → mindboost-studio/freedom as part of the engine/content split (D11/D42), reconnect freedom.calebfoster.ai via CI/wrangler, and hand off to Claw to update the freedom skill repo references. Foundational — blocks the course-distribution pipeline. Tracked: lesson-shell#395.scorm-lms is already transferred to mindboost-studio + deploying to lms.calebfoster.ai via its GitHub Action. Residual: Disconnect the vestigial Pages git-integration (clears the "repository cannot be accessed" warning), and hand off to Claw to update the ops-and-lms skill repo references.fosterc1/mindboost-ops → mindboost-studio, switch deploy to CI/wrangler (preserving the uptime-status Pages Function + UPTIME_KV binding). Note: health-check.yml commits health-check.json directly to main daily (keep that working) and the separate uptime-monitor Worker deploys independently. Hand off to Claw to update the caleb-ops/studio-ops skill repo references. (This is the repo the backlog itself lives in.) Tracked: lesson-shell#394.workspace/tmp-7steps.pdf.mindboost-studio org account (unlike the personal fosterc1 account, which GitHub gates behind a paid Team tier for private-repo protection) can and does enforce rulesets automatically — org-wide MFA + Advanced Security, no force-push/deletion on protected branches and v* tags, live on repos hosted there (#134, closed). Split out of the old "PR description templates (branch/tag protection now enforced)" item — that item's claim didn't hold for any of the three actually-active repos, all still on fosterc1; see the new open item "Migrate fosterc1 repos to mindboost-studio for automatic enforcement" for what's still outstanding. CODEOWNERS / required review stays parked — a solo owner can't self-approve a PR, so Caleb's review-before-merge remains the gate until there's a 2nd contributor.uc.js (1,500ms) + GSAP/ScrollTrigger loaded via blocking <script src> (1,500ms). Both are structurally untouchable: Cookiebot is legally-required synchronous-by-design (consent-before-tracking), and GSAP/ScrollTrigger's obvious fix — adding defer — is a confirmed landmine (breaks the intro loader; Caleb's hit this before, see memory calebfoster-ai-gsap-defer-landmine) because the loader's inline script runs synchronously right after those tags with no DOMContentLoaded gate. The only real fix would be restructuring the loader's script dependency entirely (not a bare attribute change), which is a bigger job than "LCP optimisation" — closing this as investigated-and-accepted rather than leaving it open against work that isn't going to happen. Font async-load fix from the earlier pass is done and stands on its own merit.--mb-* tokens in shared.css as the single source of truth — the ~23 hard-coded pinks/ad-hoc colours are gone. Iterated live against a Cloudflare preview across several review rounds with Caleb; the footer ended up on --slate with inverted white text (his call), not plain white. Found and fixed a real bug along the way — the services auto-cycle-highlight JS was tweening card colours via inline gsap.to({background:'#2a2a2a'}), invisible to a pure CSS review. Applied consistently across all 5 templated surfaces: the 4 main pages (calebfoster.ai PR #20) plus the 13 individually-templated journal articles + their Worker generator source (social-dashboard PRs #6/#7, so the next Re-publish All doesn't regenerate the old dark styling). Also cleaned up 31 orphaned branches across calebfoster.ai/social-dashboard/mindboost-ops as part of the same pass.llms.txt) held back by the already-known LCP problem, the 5 dead showcase placeholders, and 2 small nits — both nits fixed same-day: sitemap.xml's legal-page URLs now match their canonical trailing-slash form (social-dashboard@77c4ee8, calebfoster.ai@2e3530f), and /showcase/learning-carousel/ — confirmed by Caleb as a pre-Freedom leftover that should never have shipped — deleted. LocalBusiness/GeoCoordinates schema confirmed intentional (real registered office). Full report: report published as a Claude Artifact (score breakdown + full findings table).#servicePanel's aria-labelledby pointed at #servicePanelTitle, an empty <div> until JS populates it on open — Lighthouse audits the closed-state DOM and correctly flagged an empty accessible name. Restored a static aria-label="Service details" alongside the existing aria-labelledby as a fallback for the pre-open state; aria-labelledby still wins once populated (calebfoster.ai@d25baed). #faqPanel doesn't have this problem — its title text is static.calebfoster.ai@9a128b9) — the real live pages (terms/index.html etc.) are unaffected._redirects stays; deleted showcase/studio-team/index.html since it can never be served (calebfoster.ai@9a128b9). The OG/Twitter tags added to it earlier are now moot — the page no longer exists.role="button" elsewhere, so the migration was safe. Converted all 3 to native <button>, dropped the now-redundant role="button"/tabindex="0"/onkeydown Enter-or-Space workaround, added a standard button CSS reset (appearance:none; border:none; width:100%; text-align:left; font:inherit). Verified no outline:none override exists, so the default focus ring stays visible (calebfoster.ai@38a26b6).<link rel="stylesheet"> to the standard non-blocking preload+swap pattern, sitewide: homepage, about, showcase index, journal index, all 13 journal articles, the 3 legal pages, and the Worker's article-generation template (so future articles get it too — social-dashboard@b599e40, calebfoster.ai@38a26b6).getUpdatedJournalIndex() only ever prepended a new entry to the Blog JSON-LD's blogPost array when publishing a single article, and handleRepublishAll called it without that path at all — so the visible journal cards stayed fresh but the schema silently accumulated stale/renamed/deleted article URLs forever (one was a confirmed 404). Fixed the generator to always rebuild the array from the canonical published-posts list, same as the visible cards (social-dashboard@bbfd7a5). Ran Re-publish All (with Caleb's go-ahead) — live schema now has exactly 13 correct entries, zero stale. Also deleted 2 more orphan journal HTML files left over from before the fix (calebfoster.ai@5381d13).llms.txt at the site root (Site + Journal + Optional sections, per the llmstxt.org convention). Wired generation into the Worker's handleRepublishAll and single-article publish paths alongside sitemap.xml — regenerates from the canonical published-posts list every time instead of ever going stale (social-dashboard@094c197).calebfoster.ai@5232983).og-image.png (calebfoster.ai@5232983). Caveat found in the process: the page is currently 301-redirected away by _redirects, so these tags have no live effect until that's resolved — see the new Operational item above.openServicePanel/closeServicePanel and openFaqPanel/closeFaqPanel already set aria-expanded dynamically on open/close, and the mobile-nav hamburger does too. Item was stale.color overrides on .section-label that were compounding multiplicatively with the base class's opacity instead of replacing it — worked out to ~0.15–0.35 effective alpha, worse than either value alone (calebfoster.ai@5232983).calebfoster.ai@5232983).cookies.html/privacy.html/terms.html at repo root — turned out those are dead orphan files; _redirects sends every path variant (/terms, /terms.html) to /terms/ etc., which serve cookies/index.html/privacy/index.html/terms/index.html instead. Those real live pages already had skip-links independently — no actual gap existed there. Wasted edit landed on unreachable files (harmless, but see new Operational item on the orphan-file cleanup) (calebfoster.ai@5232983).aria-label with aria-labelledby pointing at each panel's visible title (added id="faqPanelTitle" — servicePanel's title already had one) (calebfoster.ai@5232983)..service-link is a decorative span inside the parent role="button" div, not an independently-focusable element — so the 3 cards already had distinct accessible names (their full text content), not a WCAG 2.4.4 failure as originally diagnosed. Real issue was that the auto-computed name (the whole card paragraph) was needlessly verbose for screen readers. Added a concise aria-label per card instead (calebfoster.ai@5232983).calebfoster.ai@5232983).404.html matching the dark aesthetic, with links home and to the Journal — Cloudflare Pages serves it automatically for unmatched routes (calebfoster.ai@5232983).wrangler pages deploy with no auto-deploy on push. Checked live: wrangler pages deployment list for mindboost-ops shows every commit pushed during this session auto-deployed to Production within 1–6 minutes via Cloudflare's native git integration (no wrangler.toml or deploy workflow exists in that repo — nothing there ever calls wrangler manually). scorm-lms has a real .github/workflows/deploy.yml firing on: push: branches: [main] via cloudflare/pages-action@v1. Both properties already auto-deploy on every push — no silent-deploy-miss risk exists, so no hook is needed.logError(endpoint, type, message, extra) — one JSON line per failure (severity, endpoint, error type, message, context) so real infra failures (GitHub API down, tree/commit creation failed, R2 not configured, etc.) actually show up in Cloudflare Workers Logs instead of only surfacing as a generic client-side error. Wired into the 2 top-level fetch() catches (covers any unhandled exception, with method+pathname) plus all 15 explicit 500/502 guard-clause returns across handleData, handleUpload, handleHealth, handleRepublishAll, and handlePublishArticle. Left the 400/401/404 client-input-validation returns alone — expected user/data errors, not infra failures (social-dashboard@ca82185).ops.calebfoster.ai/architecture/) documenting the GitHub PAT's two-place sync requirement (config/github.env on the Mac mini + Cloudflare Pages env var on social-dashboard), the Cloudflare Access service token, and Worker environment secrets — tied into the existing 18 Nov 2026 credentials rotation schedule (mindboost-ops@3a1cd2b).slug field added to blog-posts.json to preserve the original URL — but 6 call sites in the Worker (publish-article's canonical/OG/schema tags, related-articles builder, republish-all, journal-index new-post entry, both sitemap generators) always re-derived the slug fresh from the current title instead of reading post.slug, so every republish regenerated the wrong-slug file again. Fixed all 6 (social-dashboard@15e0dc1), ran Re-publish All, verified live that sitemap.xml/journal index/every article's related-links now use only the canonical slugs, then deleted the 2 orphan files (calebfoster.ai@a6925a2).GET /api/health to the social-dashboard Worker (social-dashboard@15e0dc1) — rolls up the latest GitHub Actions run status for all 17 workflows (list workflow defs + list recent runs, 2 API calls, reusing the existing GITHUB_TOKEN secret, no new credential). Closes the gap health-check.js doesn't cover: whether each cron actually ran, not just whether its output looks sane. Live at https://social.calebfoster.ai/api/health.media.calebfoster.ai added as a Cloudflare custom domain on the social-dashboard Pages project (Caleb: DNS CNAME + Custom domain). Added a root-level Pages Function (functions/[[path]].js, social-dashboard@99214a1) that rewrites requests on that host to the existing R2 handler, dropping the /media/ prefix — every other host falls through unchanged. Verified live: correct content-type/bytes served from the new subdomain, old /media/ path and main dashboard unaffected.social-dashboard/worker/index.js ~L953) derives FAQPage only from bare <h2>plain text</h2> — its regex /<h2>([^<]+)<\/h2>/ silently skips any heading with inner markup or attributes (exactly what dropped the FAQPage on skills-gaps, whose H2s were <h2><strong>…). Relax to /<h2[^>]*>([\s\S]*?)<\/h2>/ and strip inner tags before the question-pattern test + before building the question name, so a bolded or linked heading can't kill a FAQPage again..github/workflows/deploy.yml to fosterc1/social-dashboard — runs wrangler pages deploy . on every push to main (single Pages project covers the dashboard, API, and R2/KV Functions; worker/index.js is bundled in via functions/api/[[path]].js, no separate Worker deploy needed). CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID repo secrets added by Caleb — fully live.ghPut/the Contents API; the only fs.writeFileSync calls left are temp files for building API payloads or a gated no-op local convenience save. No active violations found. Found 2 confirmed-dead files in the process (send-monday-digest.js referenced the defunct OpenClaw gateway, regen-draft-images.js was an orphaned one-off utility superseded by generate-draft-media.js) — Caleb confirmed, both deleted.<div onclick> elements not keyboard-accessible<div onclick> without tabindex, role, or keyboard event handlers. Keyboard-only users cannot reach or activate them. Add role="button", tabindex="0", and onkeydown Enter/Space handling — or replace with native <button> elements.--mb-text-muted and stat label contrast failures--mb-text-muted from rgba(13,13,13,0.55) to 0.6, which clears both backgrounds with margin (4.6-5.1:1). Stat labels already used this token, so one change fixed both halves of the finding.aria-modal to post and blog modals.modal-overlay is dead CSS never applied to any element in index.html. The post-detail and blog-draft views are rendered inline in a split-pane layout (click a day slot → content replaces the right-hand panel on the same page), not in a dialog overlay. This backlog item describes a UI pattern from an earlier iteration of the dashboard./api/save posts writes against null/non-object entries.filter(p => p != null && typeof p === 'object') before the write in handleSave's post branch, with a console.error log line naming how many entries were filtered so corrupt data can still be investigated after the fact.draft_copy contains scaffolding markershandlePublishArticle now returns a 400 with a clear error message if draft_copy still contains a Meta description: scaffolding line, in addition to the existing silent strip during HTML conversion (kept as a second line of defence for anything that slips past the new guard some other way).checkSessionValid(): navigates to /feed/ right after browser launch and checks the resulting URL for a redirect to /login, /authwall, or /checkpoint. If redirected, logs a clear message and exits non-zero before any scraping starts, so the GitHub Actions run shows as failed instead of silently recording nothing. (Superseded the old raw-CDP mechanism this item originally described.)FAQPage JSON-LD. Amanda fixed the last two — skills-gaps (bold-wrapped H2s <h2><strong> → stripped **) + why-behaviour-change (too few question H2s → reworded 3) — and republished; Claude retested live: both ✅, 4 questions each, bare H2s, no self-links. Answer engines (Perplexity, AI Overviews, People Also Ask) lift these directly.why-behaviour-change reworded + republished by Amanda; Claude retested live ✅.design-system/ reference bundle + HANDOFF.md now live in the vault (references/mindboost-design-system/) and are installed as the user-invocable mindboost-design skill for Claude Code to build from in Freedom / lesson-shell.mfa_required_for_all_apps=true, 24h auth duration) and enabled the App Launcher (Caleb-only policy) for device enrolment; hardened cookies on Ops + LMS (HTTP Only + binding cookie + SameSite=Lax); single-identity "Caleb only" policy retained. Session duration left at 24h — acceptable now MFA + binding cookies are in place; optional 8h tighten not pursued.blog-posts.json and posts.json — "published", "draft", "scheduled", "pending", and "live" appear in different contexts. Define a canonical status enum (draft | scheduled | published | archived), run a one-off migration across all stored posts, and update the Worker to enforce the enum on write.og:image:width/height (currently 1400/600 in worker/index.js) to match./journal/) shows article cards with title and excerpt only. Adding estimated read time (word count ÷ 200, rounded up) and publish date improves perceived content quality and matches professional blog conventions. Static data — update the journal index HTML and the automated publish pipeline's card template.alt="" is intentional; for informational images ensure the alt meaningfully describes the content. Log findings in a short checklist per article.og:image that is 1200×630px, loads quickly, and is not a placeholder. Audit all 7 articles. Missing or broken og:image tags cause LinkedIn and X share previews to render as plain-text cards — reducing click-through from social shares. Also verify twitter:image is set consistently.--mb-* set (the 12 May dark-era values are superseded) — bundle in the vault at references/mindboost-design-system/ + installed as the mindboost-design skill. Brief: workspace/team/briefs/OWEN-BRIEF-mindboost-design-system.md.blog-posts.json. Prevents silent publishes of incomplete or broken posts.ops.calebfoster.ai) showing current uptime status for all four properties. Pull from a public status JSON endpoint (UptimeRobot or Better Uptime) once uptime monitoring is in place. Tile should show green/amber/red per property and time of last check. Depends on: Uptime monitoring item.Offer schema. This is the primary remaining AEO/GEO gap on the homepage.jobs.json (17 active jobs) into social-dashboard/cron/ with restore notes in SCHEDULE.md..githooks (pre-push blocks direct pushes to main; pre-commit self-heals the app-version across all pages) rolled out to all four ladder repos, and every dev/staging branch resynced to main. (True server-side branch protection still needs GitHub Pro.)FAQPage schema surfaces questions in Google's "People also ask" feature and passes structured data directly to AI search engines (Perplexity, ChatGPT Search). ~30 minutes: write the schema block and add it to the page <head>./author/caleb-foster/ page exists with structured Person schema. Adding one (name, jobTitle, worksFor, url, sameAs linking to LinkedIn and GitHub) strengthens E-E-A-T signals and gives AI search engines a canonical identity anchor for the author. One new page, ~1 hour of work.calebfoster.ai, add a tile to the ops dashboard (similar to the existing Card Carousel tile) linking to it and summarising the component's purpose, usage, and source location. Keeps ops.calebfoster.ai as the single reference point for all learning components. Depends on: lesson shell showcase page./architecture/ page that documents the full tech stack, repo structure, Worker endpoints, D1/R2/KV namespaces, and Cloudflare Access policies — kept up to date as a living reference. Single-page HTML in the same design system as this backlog. This becomes the onboarding document for any new team member touching the infrastructure.calebfoster.ai, social.calebfoster.ai, ops.calebfoster.ai, and lms.calebfoster.ai. Alert to caleb.foster@mindboostlearning.com on downtime. ~20 minutes total setup.fosterc1/calebfoster.ai running Lighthouse CI on every PR against the Cloudflare Pages preview URL. Fails the PR if Performance <90, Accessibility <90, Best Practices <90, or SEO <90. Enforces quality gates before any code reaches production.scripts/bump-version.sh. Running ./scripts/bump-version.sh 1.x.x updates the version string in all 7 pages' footer in a single command, then stages the changes ready to commit. Eliminates the risk of version drift between pages.fosterc1/mindboost-ops (private). Git history provides a full audit trail of all backlog and ops infrastructure changes. Repo is the source of truth for all ops tooling.fosterc1/mindboost-ops connected to the calebfoster-ai-ops Cloudflare Pages project. Push to main triggers automatic deployment to ops.calebfoster.ai within ~60 seconds — no manual wrangler publish needed. Confirmed working end-to-end.published: true on article publishstatus: "published" on article publish but never sets the published boolean field. Cron scripts that filter blog-posts.json on published: true silently miss all newly published articles. One-line fix in the publish handler in worker/index.js.sitemap.xml; (3) prepend a new BlogPosting entry to Blog JSON-LD in journal/index.html. Extended the Worker publish handler to include all three files in the same Git Trees API commit — making publish fully one-click.calebfoster-dashboard-api.mindboost.workers.dev/media/... in blog-posts.json, posts.json, and published journal article HTML with social.calebfoster.ai/media/....generate-weekly-content.js, regen-draft-images.js) to use token headers against social.calebfoster.ai/api/* instead of old Worker URL.blogPost array in journal Blog schemajournal/index.html contains a Blog JSON-LD block with "blogPost": [] — an empty array. Google indexes zero articles from this signal. Populate the array with all published article slugs (title, url, datePublished, author) so the Blog entity reflects the actual content. Update this array every time a new article is published.broken-learning-design-principles-ruin-2026-strategies.html has a meta description that appears to be cut off mid-sentence. A truncated description renders poorly in SERPs and may signal low-quality content to crawlers. Rewrite to a complete, compelling sentence under 155 characters that accurately reflects the article's angle.Article/BlogPosting JSON-LD block with author, datePublished, dateModified, image, and headline. Audit all 7 articles for completeness and accuracy. The publish pipeline now adds a BlogPosting entry to the journal index — verify the article pages themselves are also correct and consistent.calebfoster.ai must have a self-referencing <link rel="canonical" href="..."> to prevent duplicate content issues. Audit all pages and all 7 articles for canonical presence and correctness — flag any missing, relative (not absolute), or duplicated canonicals. One-pass fix once audit is complete.calebfoster.ai. Under UK GDPR / PECR, analytics scripts must only fire after explicit user consent. Verify that the GA4 snippet is gated behind consent and does not fire on page load for new visitors. If it currently fires unconditionally, add a consent banner and implement conditional script loading.sitemap.xml. Googlebot crawling these gets soft 404s or thin-content pages, which drags crawl budget and can dilute overall site quality signals. Remove all Coming Soon entries from the sitemap until they have real content. Biggest single SEO drag remaining on the site.