* chore: ignore .gstack/ deploy reports /land-and-deploy writes per-deploy artifacts to .gstack/deploy-reports/. Those shouldn't enter the repo. Captured here so future runs don't surface stale diffs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(geom-engine): circle module + inscribed-angle invariance test Add the second pure module per autoplan eng decision E1: src/geom-engine/circle.ts with circle(), pointOnCircle(), projectToCircle() (snap-to-circle for Module 3 drag), and angleAtVertex() (clamped against IEEE-754 drift to prevent acos NaN at exactly collinear angles). The killer-demo property test pins the inscribed-angle theorem as a CI gate: pick two fixed points A and B on a unit circle, sample 7 different M positions on the major arc, and assert all sampled inscribed angles AMB stay within 0.5° of the reference. If this test ever fails, Module 3's central premise is broken. 13 new unit tests, total 29 passing. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(module-3): drag-to-explore góc nội tiếp page (lớp 9) Ship the first interactive theorem demo. Page lives at /lop-9/goc-noi-tiep/. Component: src/components/inscribed-angle.ts wires Pointer Events + setPointerCapture per autoplan eng decision E1. Drag M; on every pointermove, project the pointer to the circle (M = center + r·normalize(pointer − center)) so M never escapes the circle. Live readouts: ∠AMB at M (inscribed, pair1 red), ∠AOB at center O (central, pair2 teal). All listeners use AbortController keyed on astro:before-swap so view-transition navigation doesn't leak. Page: src/pages/lop-9/goc-noi-tiep.astro holds the SVG canvas (viewBox 400x400, touch-action: none scoped to canvas), theorem panel, and one worked example walking the 120°/60° canonical case. Astro bundles the script inline so the single page ships ~7KB total (including the entire geom-engine + component). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(hub): link lớp 9 card to góc nội tiếp module Hub landing page now branches each grade card on grade.href: - live cards render as <a> with hover affordance (lớp 9 only, for now) - coming-soon cards stay as <li> with opacity 0.7 and "Sắp ra mắt" badge Status taxonomy extended: 'sap-ra-mat' | 'live' so future modules just flip the status when their page ships. i18n/vi.ts gains module3.* (intro, theorem, example, instruction copy) plus a new 'live' status string ("Khám phá") so every user-facing string stays inside vi.ts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: VERSION 0.0.2.0 + CHANGELOG entry First feature release. v0.0.2.0 = scaffold + Module 3 góc nội tiếp. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore: mark TODOS items completed by v0.0.2.0 - Drag M with circle constraint → DONE in src/components/inscribed-angle.ts - TheoremCanvas primitive first cut → DONE (built directly in Astro) - Theorem panel + worked examples → PARTIAL (1 of 3 examples shipped) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.4 KiB
TODOS
Tracked work, organized by component then priority (P0 highest → P4 lowest). See ~/.gstack/projects/tiennm99-try-gstack/tiennm99-main-design-20260429-160610.md for the full plan.
Distribution & Validation (Phase 0, pre-build)
-
Phase 0 SERP audit Priority: P0 What: 2-hour Google.com.vn / YouTube VN / TikTok VN audit on
góc nội tiếp,tam giác bằng nhau,tam giác đồng dạng. Document positions 1–10 + dominant content type. Why: Determines whether text page can win SERP or whether we pivot to video-first. Output:competitive-landscape.mdcompanion file. -
Phase 0 TikTok / Shorts validation Priority: P0 What: 5 short videos (10–30s) of mock drag interactions (Figma + Lottie + screen-record). Post to test the visual-wow thesis BEFORE writing module code. Why: If videos flop, the entire visualizer wedge is dead before a weekend is invested.
-
Vetted Facebook group entry Priority: P1 What: Join "Hỏi đáp Toán THCS", "Toán học vui", "Giáo viên Toán". Post one helpful, non-self-promotional answer in each. Earn standing. Why: Distribution plan depends on these groups; founder must have presence before the launch post.
TheoremCanvas primitive (weekend 1, before any module)
-
Build TheoremCanvas as single HTML file first Priority: P1 What:
<TheoremCanvas mode="..." initial={...} client:visible />API. SVG canvas + Pointer Events drag + setPointerCapture per vertex. AbortController teardown. Per autoplan eng decision E1. Where: prototype as standaloneprototype.html, then port intosrc/components/TheoremCanvas.astroonce API feels right. -
Vertex drag affordance + 48px hit-target Priority: P1 What: 14px filled circle, 2px white stroke, 4px drop shadow, 48px transparent square hit-target,
tabindex=0, focused = 3px #D7263D ring. Per Design Decision D1. -
Keyboard navigation for vertices Priority: P1 What: Tab cycles vertices; arrows ±4px; shift+arrow ±16px; Enter snaps to nearest interesting position. Per Design F6.1.
Module 3 — Lớp 9 Góc nội tiếp (weekend 2, hero module)
-
Theorem panel + 3 worked SGK-style examples Priority: P1 Status: PARTIAL — v0.0.2.0 ships theorem panel + 1 worked example. 2 more examples remain.
-
First-load coaching state (per Design F2.2) Priority: P2 What: Animated ghost-finger gesture for 1.5s, "Kéo điểm M để khám phá" caption, dismissible, persisted in localStorage.
-
ARIA-live announcements on dragend Priority: P2 What: "Góc AMB bằng 47 độ" announced via
aria-live="polite". Per Design F6.4. -
Multi-toggle theorem variants Priority: P2 What: Toggle between "góc nội tiếp" / "góc nội tiếp chắn nửa đường tròn = 90°" / "góc tạo bởi tiếp tuyến và dây cung". Each variant uses the same canvas with different fixed-point setup.
-
KaTeX inline rendering for theorem text Priority: P3 What: Currently uses Unicode (∠AMB, °) which renders fine in Be Vietnam Pro. Switch to KaTeX when notation gets richer (cung, đường tròn (O), etc.).
Module 1 — Lớp 7 Tam giác bằng nhau (weekend 3)
-
SSS / SAS / ASA / AAS / cạnh huyền-góc nhọn / cạnh huyền-cạnh góc vuông detectors Priority: P1 What: Pure geometry functions in
src/geom-engine/congruence.ts. UseEPSILON_LEN = 0.5. Color-pair highlighting + green "Hai tam giác bằng nhau" badge. Note: Rigid-motion overlay animation EXPLICITLY DROPPED per autoplan (was scope creep). -
SGK tick-mark encoding Priority: P1 What: 1/2/3 ticks for matching sides, 1/2/3 arcs for matching angles. Always paired with the 3-color palette (#D7263D / #1B998B / #F46036). Per Design Decision D3 — single largest a11y + pedagogical unlock.
Module 2 — Lớp 8 Tam giác đồng dạng (weekend 4)
-
Similarity ratio + AA/SAS/SSS-similar detectors Priority: P1 What:
src/geom-engine/similarity.ts. Live ratio display via numeric text-node updates only (KaTeX template rendered at build, never re-parsed during drag). -
Scale slider clamped to [0.5, 2.0] Priority: P1 What:
min=0.5, max=2, step=0.05. Cannot reach 0. Per Eng failure mode #3.
Testing & CI infrastructure (with first canvas module)
-
fast-check property tests Priority: P1 What:
∀ M on arc, |∠AMB − ∠AM₀B| < 0.5°(inscribed-angle invariance).∀ pointer, dist(projectToCircle(p, c), c.center) = c.r ± ε. -
Playwright e2e + multi-touch tests Priority: P1 What: Per-module happy-path + keyboard-path + multi-touch-path. Use
device: 'Pixel 5'for touch profiles. Per autoplan test plan. -
size-limit bundle gate Priority: P2 What: 200KB gz JS / 50KB gz CSS / 80KB woff2 fonts. CI fail-fast.
-
Lighthouse-CI gate Priority: P2 What: Mobile preset, ≥90 Perf + A11y. Run against
bun preview. -
axe-playwright a11y tests Priority: P2 What: Zero axe-violations on every module page.
-
Visual regression for tick-marks + Vietnamese diacritics Priority: P2 What: Argos / Playwright snapshot baselines.
Retention & Distribution (post-MVP)
-
Zalo / Telegram subscribe CTA on every module Priority: P2 What: "Nhận theorem mới mỗi tuần" — turns hub into sequence. Per CEO finding (theme 4).
-
Lớp-9 course-spine "next theorem" footer card Priority: P2 What: Each lớp-9 module links forward to next theorem. Per Design F3.5.
-
OpenGraph image generation per module Priority: P2 What: Pre-rendered SVG-to-PNG of canvas hero state. Critical for FB / Zalo shares.
-
Schema.org
LearningResourcemeta Priority: P3 What: Per-module structured data for Google rich results.
Domain & infra (post-validation trigger)
-
Buy
.vn/.com.vndomain Priority: P1 What: TRIGGER: 500 sessions/30d OR 1 organic teacher share OR ≥5 modules shipped (per RUNBOOK). VN registration takes 7–14 days. -
Cloudflare Web Analytics Priority: P2 What: JS-injected, no cookies, no consent banner. Activate after first 50 daily sessions.
-
PUBLIC_VERSIONenv wiring Priority: P3 What: Currentlyindex.astroreadsimport.meta.env.PUBLIC_VERSION ?? '0.0.1.0'— env never set. Wire it from CI build (read VERSION file) so footer doesn't rot on bump.
Out of scope (deferred indefinitely or to v2)
- English / bilingual support
- Embed-as-iframe API (CSP frame-ancestors work)
- Comments via Giscus
- Account / auth / email capture
- Browser extension overlay (out of static scope)
- Anki-style spaced-repetition deck (different product shape)
- Print → digital QR bridge (distribution experiment, not engineering)
- Teacher-tool / B2B2C demo mode (build after Module 3 ships)
Completed
- Drag M around circle, project to circle constraint —
src/components/inscribed-angle.ts+src/geom-engine/circle.ts:projectToCircle. Completed: v0.0.2.0 (2026-04-29) - TheoremCanvas primitive first cut — vanilla TS in Astro
<script>tag, AbortController teardown onastro:before-swap. Completed: v0.0.2.0 (2026-04-29). Note: built directly in Astro rather than as a single HTML prototype first; the inscribed-angle pattern proved the shape, and the next module (lớp 7 / 8) will reuse this pattern.