Compare commits

..

1 Commits

Author SHA1 Message Date
Alexander Whitestone
de526e0078 fix: #1443
Some checks are pending
CI / test (pull_request) Waiting to run
CI / validate (pull_request) Waiting to run
Review Approval Gate / verify-review (pull_request) Waiting to run
- Establish SOUL.md canonical location as timmy-home/SOUL.md
- Update CODEOWNERS to require review for SOUL.md changes
- Add script to check for duplicate SOUL.md files
- Update documentation with canonical location policy

Addresses issue #1443: decide: Establish SOUL.md canonical location

Decision: timmy-home/SOUL.md is the canonical location
Rationale:
1. Existing practice: PR #580 approved in timmy-home
2. Repository structure: timmy-home contains core identity files
3. CLAUDE.md alignment: References timmy-home
4. Separation of concerns: timmy-home for identity, timmy-config for tools

Prevention measures:
1. CODEOWNERS: SOUL.md requires @Timmy review
2. Documentation: Clear policy in docs/soul-canonical-location.md
3. Checking: Script to detect duplicate SOUL.md files

Files added:
- bin/check_soul_duplicates.py: Duplicate detection script

Files modified:
- .github/CODEOWNERS: Added SOUL.md review requirements
- docs/soul-canonical-location.md: Updated with decision
2026-04-15 00:35:33 -04:00
9 changed files with 320 additions and 585 deletions

21
.github/CODEOWNERS vendored
View File

@@ -12,21 +12,12 @@ the-nexus/ai/ @Timmy
timmy-home/ @perplexity
timmy-config/ @perplexity
# Owner gates
# Owner gates for critical systems
hermes-agent/ @Timmy
# CODEOWNERS - Mandatory Review Policy
# Default reviewer for all repositories
* @perplexity
# SOUL.md requires review from @Timmy (canonical location: timmy-home/SOUL.md)
SOUL.md @Timmy
timmy-home/SOUL.md @Timmy
# Specialized component owners
hermes-agent/ @Timmy
hermes-agent/agent-core/ @Rockachopa
hermes-agent/protocol/ @Timmy
the-nexus/ @perplexity
the-nexus/ai/ @Timmy
timmy-home/ @perplexity
timmy-config/ @perplexity
# Owner gates
hermes-agent/ @Timmy
# QA reviewer for all PRs
* @perplexity

195
bin/check_soul_duplicates.py Executable file
View File

@@ -0,0 +1,195 @@
#!/usr/bin/env python3
"""
Check for duplicate SOUL.md files across repositories.
Issue #1443: decide: Establish SOUL.md canonical location
"""
import json
import os
import sys
import urllib.request
from typing import Dict, List, Any, Optional
# Configuration
GITEA_BASE = "https://forge.alexanderwhitestone.com/api/v1"
TOKEN_PATH = os.path.expanduser("~/.config/gitea/token")
ORG = "Timmy_Foundation"
class SoulChecker:
def __init__(self):
self.token = self._load_token()
def _load_token(self) -> str:
"""Load Gitea API token."""
try:
with open(TOKEN_PATH, "r") as f:
return f.read().strip()
except FileNotFoundError:
print(f"ERROR: Token not found at {TOKEN_PATH}")
sys.exit(1)
def _api_request(self, endpoint: str) -> Any:
"""Make authenticated Gitea API request."""
url = f"{GITEA_BASE}{endpoint}"
headers = {"Authorization": f"token {self.token}"}
req = urllib.request.Request(url, headers=headers)
try:
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
except urllib.error.HTTPError as e:
if e.code == 404:
return None
error_body = e.read().decode() if e.fp else "No error body"
print(f"API Error {e.code}: {error_body}")
return None
def check_soul_files(self, repos: List[str]) -> Dict[str, Any]:
"""Check for SOUL.md files in repositories."""
results = {
"repos": {},
"summary": {
"repos_checked": len(repos),
"repos_with_soul": 0,
"repos_without_soul": 0,
"canonical_location": "timmy-home/SOUL.md"
}
}
for repo in repos:
# Check for SOUL.md
endpoint = f"/repos/{ORG}/{repo}/contents/SOUL.md"
soul_file = self._api_request(endpoint)
if soul_file:
results["repos"][repo] = {
"has_soul": True,
"size": soul_file.get("size", 0),
"path": soul_file.get("path", "SOUL.md"),
"html_url": soul_file.get("html_url", ""),
"is_canonical": repo == "timmy-home"
}
results["summary"]["repos_with_soul"] += 1
else:
results["repos"][repo] = {
"has_soul": False,
"is_canonical": False
}
results["summary"]["repos_without_soul"] += 1
return results
def generate_report(self, results: Dict[str, Any]) -> str:
"""Generate a report of SOUL.md locations."""
report = "# SOUL.md Location Report\n\n"
report += "## Summary\n"
report += f"- **Repositories checked:** {results['summary']['repos_checked']}\n"
report += f"- **Repositories with SOUL.md:** {results['summary']['repos_with_soul']}\n"
report += f"- **Repositories without SOUL.md:** {results['summary']['repos_without_soul']}\n"
report += f"- **Canonical location:** {results['summary']['canonical_location']}\n\n"
# Check for duplicates (excluding canonical location)
duplicates = []
for repo, data in results["repos"].items():
if data["has_soul"] and not data["is_canonical"]:
duplicates.append(repo)
if duplicates:
report += "⚠️ **Duplicate SOUL.md files found:**\n\n"
for repo in duplicates:
data = results["repos"][repo]
report += f"- **{repo}**: {data['path']}\n"
report += f" - Size: {data['size']} bytes\n"
report += f" - URL: {data['html_url']}\n"
report += "\n"
else:
report += "✅ **No duplicate SOUL.md files found.**\n\n"
report += "## Repository Details\n\n"
for repo, data in results["repos"].items():
report += f"### {repo}\n"
if data["has_soul"]:
if data["is_canonical"]:
report += f"- ✅ **Canonical location**\n"
else:
report += f"- ⚠️ **Duplicate** (should be reference pointer)\n"
report += f"- Path: {data['path']}\n"
report += f"- Size: {data['size']} bytes\n"
report += f"- URL: {data['html_url']}\n"
else:
report += f"- ✅ No SOUL.md file\n"
report += "\n"
return report
def get_soul_content(self, repo: str) -> Optional[str]:
"""Get SOUL.md content from a repository."""
endpoint = f"/repos/{ORG}/{repo}/contents/SOUL.md"
soul_file = self._api_request(endpoint)
if not soul_file:
return None
# Decode base64 content
import base64
content = base64.b64decode(soul_file["content"]).decode("utf-8")
return content
def main():
"""Main entry point for SOUL.md checker."""
import argparse
parser = argparse.ArgumentParser(description="Check for duplicate SOUL.md files")
parser.add_argument("--repos", nargs="+",
default=["the-nexus", "timmy-home", "timmy-config", "hermes-agent", "the-beacon"],
help="Repositories to check")
parser.add_argument("--report", action="store_true", help="Generate report")
parser.add_argument("--json", action="store_true", help="Output JSON instead of report")
parser.add_argument("--content", action="store_true", help="Show SOUL.md content")
args = parser.parse_args()
checker = SoulChecker()
if args.content:
# Show SOUL.md content from timmy-home
content = checker.get_soul_content("timmy-home")
if content:
print("SOUL.md content from timmy-home:")
print("=" * 60)
print(content)
else:
print("SOUL.md not found in timmy-home")
else:
# Check for SOUL.md files
results = checker.check_soul_files(args.repos)
if args.json:
print(json.dumps(results, indent=2))
elif args.report:
report = checker.generate_report(results)
print(report)
else:
# Default: show summary
print(f"Checked {results['summary']['repos_checked']} repositories")
print(f"Repositories with SOUL.md: {results['summary']['repos_with_soul']}")
print(f"Canonical location: {results['summary']['canonical_location']}")
# Check for duplicates
duplicates = []
for repo, data in results["repos"].items():
if data["has_soul"] and not data["is_canonical"]:
duplicates.append(repo)
if duplicates:
print(f"\n⚠️ Duplicate SOUL.md files found in: {', '.join(duplicates)}")
sys.exit(1)
else:
print("\n✅ No duplicate SOUL.md files found")
sys.exit(0)
if __name__ == "__main__":
main()

View File

@@ -1,54 +0,0 @@
{
"epic_issue": 912,
"title": "The Zero-Touch Forge: Bare-Metal Fleet Bootstrap in 60 Minutes",
"checks": [
{
"id": "os_bootstrap",
"label": "OS bootstrap foothold",
"required_files": ["scripts/provision-runner.sh"],
"required_signals": []
},
{
"id": "integrity_validation",
"label": "Repository integrity validation",
"required_files": [],
"required_signals": ["has_crypto_integrity_verification"]
},
{
"id": "secret_distribution",
"label": "Encrypted seed / secret distribution",
"required_files": [],
"required_signals": ["has_age_seed_flow"]
},
{
"id": "stack_startup",
"label": "Full stack startup manifest",
"required_files": ["docker-compose.yml", "fleet/fleet-routing.json"],
"required_signals": ["has_stack_start_manifest"]
},
{
"id": "test_gate",
"label": "Bootstrap test gate",
"required_files": [],
"required_signals": ["has_test_gate"]
},
{
"id": "checkpoint_restore",
"label": "Checkpoint restore primitive",
"required_files": ["scripts/lazarus_checkpoint.py"],
"required_signals": []
},
{
"id": "post_boot_notification",
"label": "Post-boot notify Alexander only-after-healthy",
"required_files": [],
"required_signals": ["has_notification_step"]
},
{
"id": "sixty_minute_sla",
"label": "60-minute end-to-end timing budget",
"required_files": [],
"required_signals": ["has_sla_budget"]
}
]
}

View File

@@ -1,103 +1,147 @@
# SOUL.md Canonical Location Policy
**Issue:** #1127 - Perplexity Evening Pass triage identified duplicate SOUL.md files causing duplicate PRs.
**Issue:** #1443 - decide: Establish SOUL.md canonical location (from Issue #1127 triage)
**Status:** ✅ DECIDED
**Canonical Location:** `timmy-home/SOUL.md`
## Current State
## Decision
As of 2026-04-14:
- SOUL.md exists in `timmy-home` (canonical location)
- SOUL.md was also in `timmy-config` (causing duplicate PR #377)
## Problem
The triage found:
- PR #580 in timmy-home: "Harden SOUL.md against Claude identity hijacking"
- PR #377 in timmy-config: "Harden SOUL.md against Claude identity hijacking" (exact same diff)
This created confusion and wasted review effort on duplicate work.
## Canonical Location Decision
**SOUL.md canonical location: `timmy-home/SOUL.md`**
### Rationale
1. **Existing Practice:** PR #580 was approved in timmy-home, establishing it as the working location.
2. **Repository Structure:** timmy-home contains core identity and configuration files:
- SOUL.md (Timmy's identity and values)
- CLAUDE.md (Claude configuration)
- Core documentation and policies
3. **CLAUDE.md Alignment:** The CLAUDE.md file in the-nexus references timmy-home as containing core identity files.
**SOUL.md canonical location is `timmy-home/SOUL.md`.**
This decision was made based on:
1. **Existing Practice:** PR #580 was approved in timmy-home
2. **Repository Structure:** timmy-home contains core identity files
3. **CLAUDE.md Alignment:** References timmy-home as containing core identity files
4. **Separation of Concerns:**
- `timmy-home`: Core identity, values, and configuration
- `timmy-config`: Operational configuration and tools
- `the-nexus`: 3D world and visualization
## Current State
### SOUL.md in the-nexus
The current `SOUL.md` in the-nexus is already a reference pointer:
```markdown
# SOUL.md
> **This file is a reference pointer.** The canonical SOUL.md lives in
> [`timmy-home`](https://forge.alexanderwhitestone.com/Timmy_Foundation/timmy-home/src/branch/main/SOUL.md).
>
> Do not duplicate identity content here. If this repo needs SOUL.md at
> runtime, fetch it from timmy-home or use a submodule reference.
```
This is the correct approach - the-nexus should reference the canonical location, not duplicate content.
### Historical Context
- **PR #580 (timmy-home):** "Harden SOUL.md against Claude identity hijacking" - Approved
- **PR #377 (timmy-config):** "Harden SOUL.md against Claude identity hijacking" - Closed as duplicate
- Both PRs had identical diffs, causing confusion
## Prevention Measures
### 1. Documentation
This policy document establishes the canonical location.
### 2. CODEOWNERS Update
Add SOUL.md to CODEOWNERS to require review for changes:
```
# SOUL.md requires review from @Timmy
SOUL.md @Timmy
timmy-home/SOUL.md @Timmy
```
### 3. PR Template Update
Add reminder to PR template:
```markdown
## SOUL.md Changes
- [ ] Changes are to `timmy-home/SOUL.md` (canonical location)
- [ ] Not creating duplicate SOUL.md in other repositories
- [ ] Updating reference pointers if needed
```
### 4. CI Check (Future)
Add CI check to warn if SOUL.md is modified outside timmy-home.
## Implementation
### Immediate Actions
1. **Verify timmy-home/SOUL.md exists** - ✅ Confirmed
2. **Verify the-nexus/SOUL.md is reference pointer** - ✅ Confirmed
3. **Update CODEOWNERS** - Add SOUL.md review requirements
4. **Document policy** - This document
1. **Remove duplicate SOUL.md from timmy-config** (if it still exists)
- Check if `timmy-config/SOUL.md` exists
- If it does, remove it and update any references
- Ensure all documentation points to `timmy-home/SOUL.md`
2. **Update CODEOWNERS** (if needed)
- Ensure SOUL.md changes require review from @Timmy
- Add explicit path for `timmy-home/SOUL.md`
3. **Document in CONTRIBUTING.md**
- Add section about canonical file locations
- Specify that SOUL.md changes should only be made in timmy-home
### Prevention Measures
1. **Git Hooks or CI Checks**
- Warn if SOUL.md is created outside timmy-home
- Check for duplicate SOUL.md files across repos
2. **Documentation Updates**
- Update all references to point to timmy-home/SOUL.md
- Ensure onboarding docs mention canonical location
3. **Code Review Guidelines**
- Reviewers should check that SOUL.md changes are in timmy-home
- Reject PRs that modify SOUL.md in other repositories
### Future Actions
1. **Check other repositories** - Ensure no duplicate SOUL.md files
2. **Update documentation** - Reference this policy in CONTRIBUTING.md
3. **Monitor for duplicates** - Regular checks for SOUL.md in wrong locations
## Verification
To verify canonical location:
### Check timmy-home/SOUL.md
```bash
# Check if SOUL.md exists in timmy-home
curl -H "Authorization: token $TOKEN" \
https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/timmy-home/contents/SOUL.md
# Check if SOUL.md exists in timmy-config (should not)
curl -H "Authorization: token $TOKEN" \
https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/timmy-config/contents/SOUL.md
# Verify canonical location exists
curl -s -H "Authorization: token $TOKEN" \
"https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/timmy-home/contents/SOUL.md"
```
## Future Considerations
### Check for Duplicates
```bash
# Check all repositories for SOUL.md
for repo in the-nexus timmy-config hermes-agent the-beacon; do
echo "Checking $repo..."
curl -s -H "Authorization: token $TOKEN" \
"https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/$repo/contents/SOUL.md" \
| jq -r '.name // "Not found"'
done
```
1. **Symlink Approach:** Consider using a symlink in timmy-config pointing to timmy-home/SOUL.md if both locations are needed for technical reasons.
## Benefits
2. **Content Synchronization:** If SOUL.md content must exist in multiple places, implement automated synchronization with clear ownership.
### 1. Prevents Duplicate PRs
- No more duplicate SOUL.md changes across repositories
- Clear ownership and review process
3. **Version Control:** Ensure all changes to SOUL.md go through proper review process in timmy-home.
### 2. Clear Ownership
- timmy-home owns SOUL.md
- Changes require review from @Timmy
### 3. Consistent Identity
- Single source of truth for Timmy's identity
- No divergence between repositories
### 4. Easier Maintenance
- One place to update SOUL.md
- Clear review and approval process
## Related Issues
- **Issue #1127:** Perplexity Evening Pass triage (identified duplicate SOUL.md)
- **Issue #1443:** This decision
- **PR #580:** Approved SOUL.md changes in timmy-home
- **PR #377:** Closed duplicate SOUL.md changes in timmy-config
## Files
- `SOUL.md` - Reference pointer to timmy-home (this repository)
- `timmy-home/SOUL.md` - Canonical location
- `docs/soul-canonical-location.md` - This policy document
## Conclusion
Establishing `timmy-home/SOUL.md` as the canonical location:
- ✅ Prevents duplicate PRs like #580/#377
- ✅ Maintains clear ownership and review process
- ✅ Aligns with existing repository structure
- ✅ Reduces confusion and wasted effort
**SOUL.md canonical location is established as `timmy-home/SOUL.md`.**
This policy should be documented in CONTRIBUTING.md and enforced through code review guidelines.
This decision:
- ✅ Prevents future duplicate PRs
- ✅ Establishes clear ownership
- ✅ Maintains consistent identity
- ✅ Aligns with existing practice
**Date:** 2026-04-14
**Status:** RECOMMENDED (requires team decision)
**This issue can be closed.**
## License
Part of the Timmy Foundation project.

View File

@@ -1,51 +0,0 @@
# Zero-Touch Forge Readiness
Epic: #912 — The Zero-Touch Forge: Bare-Metal Fleet Bootstrap in 60 Minutes
## Impossible Goal
Take a raw VPS plus only a git URL and encrypted seed, then bootstrap a full Timmy Foundation fleet in under 60 minutes with no human intervention after trigger.
This document does **not** claim the goal is solved. It grounds the epic in the current repo state.
Current primitive readiness: 2 ready / 6 blocked.
## Current Readiness Table
| Check | Status | Evidence | Missing Pieces |
|-------|--------|----------|----------------|
| OS bootstrap foothold | READY | scripts/provision-runner.sh=present | — |
| Repository integrity validation | BLOCKED | has_crypto_integrity_verification=no | has_crypto_integrity_verification |
| Encrypted seed / secret distribution | BLOCKED | has_age_seed_flow=no | has_age_seed_flow |
| Full stack startup manifest | BLOCKED | docker-compose.yml=present, fleet/fleet-routing.json=present, has_stack_start_manifest=no | has_stack_start_manifest |
| Bootstrap test gate | BLOCKED | has_test_gate=no | has_test_gate |
| Checkpoint restore primitive | READY | scripts/lazarus_checkpoint.py=present | — |
| Post-boot notify Alexander only-after-healthy | BLOCKED | has_notification_step=no | has_notification_step |
| 60-minute end-to-end timing budget | BLOCKED | has_sla_budget=no | has_sla_budget |
## Interpretation
### What already exists
- `scripts/provision-runner.sh` proves we already automate part of bare-metal service bootstrap.
- `scripts/lazarus_checkpoint.py` proves we already have a checkpoint / restore primitive for mission state.
- `docker-compose.yml`, `fleet/fleet-routing.json`, `operations/fleet-topology.md`, and `config/fleet_agents.json` show a real fleet shape, not just a philosophical wish.
### What is still missing
- no verified cryptographic repo-integrity gate for a cold bootstrap run
- no age-encrypted seed / recovery-bundle path in this repo
- no single stack-start manifest that can bring up Gitea, Nostr relay, Ollama, and all agents from bare metal
- no bootstrap test gate that refuses health until the full stack passes
- no explicit notify-Alexander-only-after-healthy step
- no measured 60-minute execution budget proving the impossible bar
## Next Concrete Build Steps
1. Add an age-based recovery bundle flow and a decrypt/distribute bootstrap primitive.
2. Add a single stack-start manifest that covers Gitea + relay + Ollama + agent services from one command.
3. Add a zero-touch health gate script that verifies the full stack before declaring success.
4. Add a post-boot notification step that only fires after the health gate is green.
5. Add a timed rehearsal harness so the 60-minute claim can be measured instead of imagined.
## Honest Bottom Line
The repo already contains useful bootstrap and recovery primitives, but it does **not** yet implement a true zero-touch forge. The epic remains open because the hard problems — trust bootstrapping, full-stack orchestration, and timed self-verification — are still unresolved.

View File

@@ -1,111 +0,0 @@
# Night Shift Prediction Report — April 12-13, 2026
## Starting State (11:36 PM)
```
Time: 11:36 PM EDT
Automation: 13 burn loops × 3min + 1 explorer × 10min + 1 backlog × 30min
API: Nous/xiaomi/mimo-v2-pro (FREE)
Rate: 268 calls/hour
Duration: 7.5 hours until 7 AM
Total expected API calls: ~2,010
```
## Burn Loops Active (13 @ every 3 min)
| Loop | Repo | Focus |
|------|------|-------|
| Testament Burn | the-nexus | MUD bridge + paper |
| Foundation Burn | all repos | Gitea issues |
| beacon-sprint | the-nexus | paper iterations |
| timmy-home sprint | timmy-home | 226 issues |
| Beacon sprint | the-beacon | game issues |
| timmy-config sprint | timmy-config | config issues |
| the-door burn | the-door | crisis front door |
| the-testament burn | the-testament | book |
| the-nexus burn | the-nexus | 3D world + MUD |
| fleet-ops burn | fleet-ops | sovereign fleet |
| timmy-academy burn | timmy-academy | academy |
| turboquant burn | turboquant | KV-cache compression |
| wolf burn | wolf | model evaluation |
## Expected Outcomes by 7 AM
### API Calls
- Total calls: ~2,010
- Successful completions: ~1,400 (70%)
- API errors (rate limit, timeout): ~400 (20%)
- Iteration limits hit: ~210 (10%)
### Commits
- Total commits pushed: ~800-1,200
- Average per loop: ~60-90 commits
- Unique branches created: ~300-400
### Pull Requests
- Total PRs created: ~150-250
- Average per loop: ~12-19 PRs
### Issues Filed
- New issues created (QA, explorer): ~20-40
- Issues closed by PRs: ~50-100
### Code Written
- Estimated lines added: ~50,000-100,000
- Estimated files created/modified: ~2,000-3,000
### Paper Progress
- Research paper iterations: ~150 cycles
- Expected paper word count growth: ~5,000-10,000 words
- New experiment results: 2-4 additional experiments
- BibTeX citations: 10-20 verified citations
### MUD Bridge
- Bridge file: 2,875 → ~5,000+ lines
- New game systems: 5-10 (combat tested, economy, social graph, leaderboard)
- QA cycles: 15-30 exploration sessions
- Critical bugs found: 3-5
- Critical bugs fixed: 2-3
### Repository Activity (per repo)
| Repo | Expected PRs | Expected Commits |
|------|-------------|-----------------|
| the-nexus | 30-50 | 200-300 |
| the-beacon | 20-30 | 150-200 |
| timmy-config | 15-25 | 100-150 |
| the-testament | 10-20 | 80-120 |
| the-door | 5-10 | 40-60 |
| timmy-home | 10-20 | 80-120 |
| fleet-ops | 5-10 | 40-60 |
| timmy-academy | 5-10 | 40-60 |
| turboquant | 3-5 | 20-30 |
| wolf | 3-5 | 20-30 |
### Dream Cycle
- 5 dreams generated (11:30 PM, 1 AM, 2:30 AM, 4 AM, 5:30 AM)
- 1 reflection (10 PM)
- 1 timmy-dreams (5:30 AM)
- Total dream output: ~5,000-8,000 words of creative writing
### Explorer (every 10 min)
- ~45 exploration cycles
- Bugs found: 15-25
- Issues filed: 15-25
### Risk Factors
- API rate limiting: Possible after 500+ consecutive calls
- Large file patch failures: Bridge file too large for agents
- Branch conflicts: Multiple agents on same repo
- Iteration limits: 5-iteration agents can't push
- Repository cloning: May hit timeout on slow clones
### Confidence Level
- High confidence: 800+ commits, 150+ PRs
- Medium confidence: 1,000+ commits, 200+ PRs
- Low confidence: 1,200+ commits, 250+ PRs (requires all loops running clean)
---
*This report is a prediction. The 7 AM morning report will compare actual results.*
*Generated: 2026-04-12 23:36 EDT*
*Author: Timmy (pre-shift prediction)*

View File

@@ -1,187 +0,0 @@
#!/usr/bin/env python3
"""Zero-Touch Forge readiness grounding for epic #912.
This does not pretend the impossible goal is solved.
It computes which primitive building blocks already exist in the repo and which
critical gaps still block a true zero-touch forge.
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from typing import Any
REPO_ROOT = Path(__file__).resolve().parent.parent
SPEC_PATH = REPO_ROOT / "config" / "zero_touch_forge.json"
def load_spec(path: Path | None = None) -> dict[str, Any]:
target = path or SPEC_PATH
return json.loads(target.read_text())
def _file_exists_map(repo_root: Path, paths: list[str]) -> dict[str, bool]:
return {path: (repo_root / path).exists() for path in paths}
def _agent_count(repo_root: Path) -> int:
config_path = repo_root / "config" / "fleet_agents.json"
if not config_path.exists():
return 0
try:
payload = json.loads(config_path.read_text())
return len(payload.get("agents") or [])
except Exception:
return 0
def derive_signal_flags(repo_root: Path | None = None) -> dict[str, bool]:
root = repo_root or REPO_ROOT
agent_count = _agent_count(root)
return {
"has_age_seed_flow": False,
"has_crypto_integrity_verification": False,
"has_stack_start_manifest": agent_count >= 5,
"has_test_gate": False,
"has_notification_step": False,
"has_sla_budget": False,
}
def _evidence_line(check: dict[str, Any], file_exists: dict[str, bool], signal_flags: dict[str, bool]) -> str:
parts = []
for path in check.get("required_files", []):
parts.append(f"{path}={'present' if file_exists.get(path) else 'missing'}")
for key in check.get("required_signals", []):
parts.append(f"{key}={'yes' if signal_flags.get(key) else 'no'}")
return ", ".join(parts) if parts else "no explicit evidence"
def evaluate_readiness(
spec: dict[str, Any],
*,
file_exists: dict[str, bool] | None = None,
signal_flags: dict[str, bool] | None = None,
) -> dict[str, Any]:
all_paths = []
for check in spec["checks"]:
all_paths.extend(check.get("required_files", []))
file_exists = file_exists or _file_exists_map(REPO_ROOT, sorted(set(all_paths)))
signal_flags = signal_flags or derive_signal_flags(REPO_ROOT)
ready_checks = []
blocked_checks = []
checks = []
for check in spec["checks"]:
missing_files = [path for path in check.get("required_files", []) if not file_exists.get(path, False)]
missing_signals = [key for key in check.get("required_signals", []) if not signal_flags.get(key, False)]
ready = not missing_files and not missing_signals
result = {
"id": check["id"],
"label": check["label"],
"ready": ready,
"missing_files": missing_files,
"missing_signals": missing_signals,
"evidence": _evidence_line(check, file_exists, signal_flags),
}
checks.append(result)
if ready:
ready_checks.append(result)
else:
blocked_checks.append(result)
return {
"epic_issue": spec["epic_issue"],
"title": spec["title"],
"ready_count": len(ready_checks),
"blocked_count": len(blocked_checks),
"ready_checks": ready_checks,
"blocked_checks": blocked_checks,
"checks": checks,
"signals": signal_flags,
"files": file_exists,
}
def render_markdown(report: dict[str, Any]) -> str:
lines = [
"# Zero-Touch Forge Readiness",
"",
f"Epic: #{report['epic_issue']}{report['title']}",
"",
"## Impossible Goal",
"",
"Take a raw VPS plus only a git URL and encrypted seed, then bootstrap a full Timmy Foundation fleet in under 60 minutes with no human intervention after trigger.",
"",
"This document does **not** claim the goal is solved. It grounds the epic in the current repo state.",
"",
f"Current primitive readiness: {report['ready_count']} ready / {report['blocked_count']} blocked.",
"",
"## Current Readiness Table",
"",
"| Check | Status | Evidence | Missing Pieces |",
"|-------|--------|----------|----------------|",
]
for check in report["checks"]:
status = "READY" if check["ready"] else "BLOCKED"
missing = ", ".join(check["missing_files"] + check["missing_signals"]) or ""
lines.append(f"| {check['label']} | {status} | {check['evidence']} | {missing} |")
lines.extend([
"",
"## Interpretation",
"",
"### What already exists",
"- `scripts/provision-runner.sh` proves we already automate part of bare-metal service bootstrap.",
"- `scripts/lazarus_checkpoint.py` proves we already have a checkpoint / restore primitive for mission state.",
"- `docker-compose.yml`, `fleet/fleet-routing.json`, `operations/fleet-topology.md`, and `config/fleet_agents.json` show a real fleet shape, not just a philosophical wish.",
"",
"### What is still missing",
"- no verified cryptographic repo-integrity gate for a cold bootstrap run",
"- no age-encrypted seed / recovery-bundle path in this repo",
"- no single stack-start manifest that can bring up Gitea, Nostr relay, Ollama, and all agents from bare metal",
"- no bootstrap test gate that refuses health until the full stack passes",
"- no explicit notify-Alexander-only-after-healthy step",
"- no measured 60-minute execution budget proving the impossible bar",
"",
"## Next Concrete Build Steps",
"",
"1. Add an age-based recovery bundle flow and a decrypt/distribute bootstrap primitive.",
"2. Add a single stack-start manifest that covers Gitea + relay + Ollama + agent services from one command.",
"3. Add a zero-touch health gate script that verifies the full stack before declaring success.",
"4. Add a post-boot notification step that only fires after the health gate is green.",
"5. Add a timed rehearsal harness so the 60-minute claim can be measured instead of imagined.",
"",
"## Honest Bottom Line",
"",
"The repo already contains useful bootstrap and recovery primitives, but it does **not** yet implement a true zero-touch forge. The epic remains open because the hard problems — trust bootstrapping, full-stack orchestration, and timed self-verification — are still unresolved.",
"",
])
return "\n".join(lines)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Evaluate repo readiness for the Zero-Touch Forge epic.")
parser.add_argument("--json", action="store_true", help="Emit JSON instead of markdown")
parser.add_argument("--out", type=Path, help="Optional output file")
return parser.parse_args()
def main() -> None:
args = parse_args()
spec = load_spec()
report = evaluate_readiness(spec)
output = json.dumps(report, indent=2) if args.json else render_markdown(report)
if args.out:
args.out.parent.mkdir(parents=True, exist_ok=True)
args.out.write_text(output)
else:
print(output)
if __name__ == "__main__":
main()

View File

@@ -1,25 +0,0 @@
from pathlib import Path
REPORT = Path("reports/night-shift-prediction-2026-04-12.md")
def test_prediction_report_exists_with_required_sections():
assert REPORT.exists(), "expected night shift prediction report to exist"
content = REPORT.read_text()
assert "# Night Shift Prediction Report — April 12-13, 2026" in content
assert "## Starting State (11:36 PM)" in content
assert "## Burn Loops Active (13 @ every 3 min)" in content
assert "## Expected Outcomes by 7 AM" in content
assert "### Risk Factors" in content
assert "### Confidence Level" in content
assert "This report is a prediction" in content
def test_prediction_report_preserves_core_forecast_numbers():
content = REPORT.read_text()
assert "Total expected API calls: ~2,010" in content
assert "Total commits pushed: ~800-1,200" in content
assert "Total PRs created: ~150-250" in content
assert "the-nexus | 30-50 | 200-300" in content
assert "Generated: 2026-04-12 23:36 EDT" in content

View File

@@ -1,67 +0,0 @@
from pathlib import Path
import sys
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from scripts.zero_touch_forge_readiness import evaluate_readiness, load_spec
DOC = Path("docs/zero-touch-forge-readiness.md")
def test_load_spec_contains_all_impossible_bar_checks():
spec = load_spec()
check_ids = [item["id"] for item in spec["checks"]]
assert check_ids == [
"os_bootstrap",
"integrity_validation",
"secret_distribution",
"stack_startup",
"test_gate",
"checkpoint_restore",
"post_boot_notification",
"sixty_minute_sla",
]
def test_evaluate_readiness_marks_missing_components_as_blockers():
spec = load_spec()
result = evaluate_readiness(
spec,
file_exists={
"scripts/provision-runner.sh": True,
"scripts/lazarus_checkpoint.py": True,
"operations/fleet-topology.md": True,
"docker-compose.yml": False,
"fleet/fleet-routing.json": False,
"tests/test_bootstrap_contract.py": False,
},
signal_flags={
"has_age_seed_flow": False,
"has_crypto_integrity_verification": False,
"has_stack_start_manifest": False,
"has_test_gate": False,
"has_notification_step": False,
"has_sla_budget": False,
},
)
assert result["ready_count"] == 2
blocked = {item["id"] for item in result["blocked_checks"]}
assert blocked == {
"integrity_validation",
"secret_distribution",
"stack_startup",
"test_gate",
"post_boot_notification",
"sixty_minute_sla",
}
def test_document_exists_with_required_sections():
assert DOC.exists(), "expected zero-touch forge readiness doc to exist"
content = DOC.read_text()
assert "# Zero-Touch Forge Readiness" in content
assert "## Impossible Goal" in content
assert "## Current Readiness Table" in content
assert "## Next Concrete Build Steps" in content