An internal Nortal prediction pool for the FIFA World Cup 2026 — a "March Madness for soccer." Eligible Nortal employees sign in via corporate identity, predict match scores (locked one hour before kickoff) plus four tournament-wide picks (champion, runner-up, top scorer, best player; locked at first kickoff), and compete on a live leaderboard scored automatically against official results.
- docs/architecture/README.md — index of all product/architecture artifacts
- docs/architecture/high-level-architecture.md — full Nortal architecture document
- docs/architecture/acceptance-criteria.md — test scenarios and acceptance criteria
- docs/architecture/open-decisions.md — unresolved questions (OD-001…OD-008)
- docs/architecture/scoring-model.md — locking + scoring + tie-breakers
- docs/architecture/stack-decision.md — proposed implementation stack (draft ADR)
This repository uses a standardized pattern for:
- Repository organization via an auto-generated INDEX
- Secret management with local plaintext (gitignored) and encrypted (committed) secrets using age
- Pre-commit enforcement to prevent accidental secret leaks
- Claude Code integration with startup instructions
# Clone the repository
git clone <repository-url>
cd <repository-name>
# Run bootstrap (requires age to be installed)
./scripts/bootstrap.sh| Tool | Check | Install (macOS) |
|---|---|---|
| Git 2.9+ | git --version |
brew install git |
| Python 3.9+ | python3 --version |
brew install python |
| age | age --version |
brew install age |
.
├── .claude/ # Claude Code instructions
├── .githooks/ # Git hooks (pre-commit)
├── docs/ # Documentation
├── scripts/ # Automation scripts
│ ├── bootstrap.sh # First-time setup
│ ├── install_hooks.sh
│ ├── index/ # INDEX.md generation
│ └── secrets/ # Secret encryption/decryption
├── secrets/
│ ├── plain/ # Plaintext secrets (gitignored)
│ ├── enc/ # Encrypted secrets (committed)
│ ├── recipients.txt # Public keys for encryption
│ └── manifest.json # Secret metadata
├── CLAUDE.md # Project nickname and agent rules
├── CLAUDE_START.md # Agent getting started guide
├── INDEX.md # Repository map (auto-generated)
└── README.md # This file
-
Create plaintext file in
secrets/plain/:echo "API_KEY=secret123" > secrets/plain/my_secret.env
-
Encrypt all secrets:
./scripts/secrets/encrypt_all.sh
-
Commit encrypted files:
git add secrets/enc/ secrets/manifest.json git commit -m "Add encrypted secret"
After cloning or pulling:
./scripts/secrets/decrypt_all.sh- Get their public key (they run
age-keygenand share theage1...line) - Add to
secrets/recipients.txt - Re-encrypt:
./scripts/secrets/encrypt_all.sh - Commit and push
The pre-commit hook blocks commits containing:
- Files in
secrets/plain/ - Files matching
*.env,.env.*,*.pem,*.key,credentials.*
To bypass (not recommended):
git commit --no-verifyThe repository map in INDEX.md is auto-generated. To update:
./scripts/index/generate.shHuman-editable sections are preserved across regenerations.
This repository is configured for Claude Code with:
CLAUDE_START.md- Entry point for agentsCLAUDE.md- Project nickname and behavior rules.claude/instructions.md- Detailed agent guidanceINDEX.md- Repository structure for context
Agents are instructed to read these files first in any session.