Files
tiennm99 c5388349c0 v0.0.1.0 chore: scaffold Hình Học Sống (Astro + GitHub Pages) (#1)
* chore: add gstack skill routing rules to CLAUDE.md

Append a "## Skill routing" section so future Claude Code sessions in this repo route
each task through the matching gstack skill (e.g., /investigate for bugs, /ship for PRs,
/office-hours for product brainstorming).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: scaffold Astro 5 + TypeScript strict with base /try-gstack/

Initialize the project per the autoplan-locked decisions:
- Astro 5 SSG, output static, base path /try-gstack/ for GitHub Pages subdirectory hosting
- TypeScript strict (Astro's strict tsconfig + path alias ~/* -> src/*)
- @astrojs/sitemap for SEO meta
- bun as the package manager (lockfile committed)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: Vietnamese landing page with Be Vietnam Pro + i18n stub

Implement the locked design decisions D2 (typography) and D3 (palette) plus the i18n
discipline from autoplan eng review:
- Be Vietnam Pro single family (woff2, weights 400/500/700, vietnamese subset) self-hosted
  via @fontsource so KaTeX/CDN-blocking ISPs cannot break the page
- font-feature-settings: "kern", "locl" for proper VN diacritic positioning
- 17px body / 1.6 line-height / max-w-prose 56ch (denser than English)
- 3-color SGK-aligned palette in tailwind config: pair1 #D7263D, pair2 #1B998B, pair3 #F46036
- BaseLayout with lang="vi", canonical URL, OpenGraph (vi_VN), X-Frame-Options DENY
- src/i18n/vi.ts holds every user-facing string; t() helper resolves the active locale.
  Adding English later means adding en.ts; no string churn through templates.
- Landing page lists three grade cards with "Sắp ra mắt" status (modules ship later)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test: bootstrap Vitest with pure geom-engine vec module

Establish the math-engine boundary and test discipline from autoplan eng decision E2:
- src/geom-engine/ is pure (no DOM imports allowed); first module is vec.ts
- Vec2 helpers: vec, add, sub, scale, dot, len, dist, normalize, approxEqualLen
- EPSILON_LEN=0.5 viewBox units justified vs ~4px human drag precision
- scale() normalizes IEEE-754 -0 back to +0 so consumers don't see signed-zero ghosts
- Vitest config gates the module at 95% line/function/statement, 90% branch
- 16 unit tests covering commutativity, mutation safety, orthogonality, normalization,
  and EPSILON tolerance behavior

Property tests via fast-check come with the first canvas module; this commit establishes
the test scaffold so adding them later is one dependency away.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ci: GitHub Actions test workflow + Pages deploy via deploy-pages@v4

Wire the autoplan-locked CI/CD pipeline (decision E3) for GitHub Pages hosting:
- ci.yml: typecheck + tests + build on every PR and push to main
- deploy.yml: build + actions/deploy-pages@v4 on push to main, concurrency-grouped
  so a force-push retry doesn't abort an in-flight rollback
- Build env pins SITE_URL=https://tiennm99.github.io and SITE_BASE=/try-gstack so
  astro.config.mjs produces correct canonical/OG URLs against the subdirectory host
- bun 1.3.13 pinned for both workflows

Lighthouse-CI + size-limit gates deferred until the first canvas module ships
(no JS bundle to budget yet — current pages are zero-JS).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.1.0 + CHANGELOG + RUNBOOK + README rewrite

Initial 4-digit gstack version (matches package.json), changelog entry for the scaffold,
operations runbook covering rollback and the deferred .vn domain trigger (500 sessions/30d
OR 1 organic teacher share OR 5+ modules shipped). README rewritten as the project README
for Hình Học Sống with the locked architectural decisions visible to teammates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: TODOS.md tracking deferred autoplan items

Capture the deferred work surfaced by the /office-hours + /autoplan reviews so the
backlog is visible to teammates and bisectable from the source-of-truth design doc.
Organized by component (Phase 0 distribution, TheoremCanvas, Module 3/1/2, testing
infrastructure, retention, domain) then priority P0–P4. Per the gstack TODOS.md
format conventions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:43:37 +07:00

2.6 KiB
Raw Permalink Blame History

Runbook — Hình Học Sống

Deployment

Production deploys from main via GitHub Actions (.github/workflows/deploy.yml).

  • Live URL: https://tiennm99.github.io/try-gstack/
  • Build: bun run build (Astro static, output to dist/)
  • Deploy mechanism: actions/upload-pages-artifact@v3 + actions/deploy-pages@v4
  • Concurrency: pages-deploy group, cancel-in-progress disabled (so a force-pushed retry doesn't abort an in-flight rollback)

Rollback

GitHub Pages keeps the last successful deployment. To roll back:

  1. Find the offending commit on main: git log --oneline main
  2. Revert it: git revert <sha> and push to main
  3. The next workflow run rebuilds and re-deploys the prior good state
  4. Verify the live site

If the workflow itself is broken (e.g., bad deploy.yml change), use the GitHub UI to re-run a previous successful deployment from the Deployments tab.

CI

  • .github/workflows/ci.yml runs typecheck + Vitest + build on every PR and push to main. Build failure on main blocks the deploy job.
  • Local equivalent: bun install && bun run typecheck && bun run test && bun run build

Domain migration trigger

Per autoplan plan, buy a .vn / .com.vn domain only when ANY of:

  1. 500 unique sessions in any rolling 30-day window post-launch, OR
  2. 1 organic teacher share (Facebook group, Zalo, or school chat — verified, not founder-initiated), OR
  3. ≥5 modules shipped (signals content sustainability and amortizes the domain cost)

If none hit within 90 days of soft launch, stay on tiennm99.github.io/try-gstack/.

When the trigger fires:

  1. Register the domain (VN registration: passport scan + address proof + MIC filing, 714 days)
  2. Add CNAME file at repo root with the new domain (e.g. hinhhocsong.vn)
  3. Configure custom domain in GitHub Pages settings (Settings → Pages → Custom domain)
  4. Update astro.config.mjs: change SITE_BASE env from /try-gstack to /, point SITE_URL at the new domain. Or update the workflow env: block.
  5. Update OpenGraph + canonical URLs (handled automatically once astro.config.mjs reflects the new domain)
  6. Wait 24h, then update sitemap submission in Google Search Console
  7. Set up 301 redirects (GitHub Pages handles this automatically once the custom domain is the primary)

Things to NOT do

  • Never git push --force to main.
  • Never edit VERSION or package.json.version independently — they must agree (/ship enforces this).
  • Never change astro.config.mjs base without simultaneously updating the deploy workflow env: and any hardcoded internal links.