Node 22 + Astro 5 (output: 'static') — sitio personal one-pager bilingüe EN/ES de Sebastián Rojas, migración 1:1 desde mockup estático; deploy a GitHub Pages (repo Sreddx/Rojas-web, base '/Rojas-web/')
Bootstrapped by agent-prep. Edit only via an agent-prep re-run.
- Runtime: Node 22 (v22.22.2)
- Language: TypeScript (strict) for
src/data/; .astro components; vanilla JS ported - Framework: Astro 5.x,
output: 'static'(no React/Vue/Svelte/Tailwind) - Package manager: npm (10.x)
- ORM / DB: none (typed content in
src/data/*.ts) - Test runner: Vitest (unit: data/i18n) + Playwright CLI (e2e smoke)
- Lint / format:
astro check(@astrojs/check)
frontend_paths:src/pages/,src/layouts/,src/components/,src/styles/,src/scripts/,src/data/,public/backend_paths: (empty)database_paths: (empty)test_frontend_paths:tests/test_backend_paths: (empty)config_paths:astro.config.mjs,tsconfig.json,package.json,.github/workflows/
| Action | Command |
|---|---|
| Install | npm install |
| Dev | npm run dev |
| Build | npm run build |
| Test | npm test (Vitest unit) · e2e: npm run test:e2e (Playwright) |
| Lint | npm run check (astro check) |
| Migrate | n/a (static site) |
Use these verbatim. Do not invent variants.
This is a standalone single-repo project. No coordination hub or peer repos.
Cross-repo state (wave status, contracts, handoffs) lives in Engram — never in files. This section holds slow-changing facts only.
- No code without an active named change folder (
openspec/changes/<name>/withproposal.md,design.md,tasks.mdall present). - All implementation uses TDD — tests before code.
- Multi-wave specs use explicit
## Wave N — [scope]sections; tasks reference the wave slice. - Verify before archive — always.
- Commits reference
<change-name>(never an issue number). - Brownfield repos:
forge:exploreruns first to seed Engramtopic_key=project/memory.
| Gate | Emoji | Trigger | Resolved by |
|---|---|---|---|
| Greenfield intake | 📥 | New greenfield project | User confirms PRD or "proceed without" |
| Plan approval | 📋 | Any spec/proposal/tasks.md written | User approves or returns feedback |
| Clarification | ❓ | Agent encounters genuinely blocking ambiguity | User answers |
| Manual test | ✅ | Validator issues PASS | User confirms or reports issues |
Humans use forge:* skills as the default interface. opsx:* is the underlying engine; direct use is an expert exception.
See agent_docs/dispatch-*.md for the full cycle, multi-wave handling, and orchestration detail.
Engram is the persistent memory backend. The protocol follows schemas/memory-topics.md and the per-turn budget in agent_docs/memory-budget.md.
Engram access tiers (W4-W5):
- save-only —
validator,tester-front,tester-back,github-ops,agent-sync.mem_saveonly; prior context arrives via orchestrator briefing cards (engram_context: [...]). If cards are insufficient, returnBLOCKED [CONTEXT] missing: <topic_prefix>. - search-capable —
planner,researcher,frontend,backend,database,agent-prep,devstart,bugfix-pr. Full Engram access. Check briefing cards first; search only if a new domain emerges. Per-turn budget: max 2mem_search, max 1 L3 fetch, max 1200 mem-tokens injected. - orchestrator (main session only) — full access plus exclusive
mem_contextrights (post-compaction / explicit recall / session resume only).
When to save (mem_save): immediately after a decision, bugfix, pattern, config change, or discovery. Use topic_key per schema namespace for your role. Cross-namespace writes are forbidden and rejected.
Topic schema: <namespace>/<scope>[/<subscope>] — see schemas/memory-topics.md.
Briefing cards pattern: the orchestrator pre-resolves memory cards ONCE per dispatch via bash scripts/sdd-memory-governor.sh --need <X> --topic-prefix <Y> and injects the result as engram_context: [...] in the subagent envelope. Subagents do NOT search on start when cards are present.
mem_context: forbidden for all subagents. Allowed only for the orchestrator after compaction / on explicit user recall / on session resume.
Engram unavailable: continue with [MEMORY] WARNING. Exception: if .engram/ exists in repo, BLOCK with install instructions (see agent_docs/engram-install.md).
Memory sync (orchestrator-owned): after every opsx:archive, the orchestrator runs engram sync to export the change's new memories to .engram/<chunk>.json.gz and commits the chunk with the PR. Without this, memories stay local and teammates cannot consume them. Optional triggers: end of long sessions, before context compaction, before multi-repo handoffs. See .claude/rules/orchestrator-dispatch.md → "Memory Sync".
- Never edit auto-generated directories (resolved at bootstrap; example:
src/generated/,dist/,.next/,target/,__pycache__/). - Never commit secrets —
.env*files use.exampleconvention. - Never bypass approval gates 📋 ✅.
- See
agent_docs/for: workflow detail, multi-repo setup, skill catalog, MCP integrations, profiles, architecture, Engram install.