Spec: §10 (credentials), §16.3 (secrets), §16.1; CLAUDE.md "Secrets by reference, never by value".
Resolve secrets from the environment by the names declared in project.yaml, never from committed values. Establish the committed .env.example that lists names only.
Acceptance criteria
Dependencies
Depends on: #1
(Ordering: ideally lands alongside #4 so the resolver can consume the validated secrets map.)
Spec: §10 (credentials), §16.3 (
secrets), §16.1; CLAUDE.md "Secrets by reference, never by value".Resolve secrets from the environment by the names declared in
project.yaml, never from committed values. Establish the committed.env.examplethat lists names only.Acceptance criteria
secretsmap fromproject.yaml(project.yaml Pydantic schema and fail-fast loader #4), reads actual values fromos.environat runtime..env.examplelists every expected env-var name with no real values:GITHUB_PAT,ANTHROPIC_API_KEY,NOTION_TOKEN,TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID,AUTH_PASSWORD_HASH, and optionalRESEND_API_KEY..envis gitignored;.env.exampleis committed.Dependencies
Depends on: #1
(Ordering: ideally lands alongside #4 so the resolver can consume the validated
secretsmap.)