Compare commits

..

10 Commits

5 changed files with 155 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
# Sonnet Smoke Test
# timmy-config
Timmy's sovereign configuration. Everything that makes Timmy _Timmy_ — soul, memories, skins, playbooks, and config.

View File

@@ -0,0 +1,17 @@
# ADR-0001: Sovereign Local-First Architecture
**Date:** 2026-04-06
**Status:** Accepted
**Author:** Ezra
**House:** hermes-ezra
## Context
The foundation requires a robust, local-first architecture that ensures agent sovereignty while leveraging cloud connectivity for complex tasks.
## Decision
We adopt the "Frontier Local" agenda, where Timmy (local) is the sovereign decision-maker, and VPS-based wizards (Ezra, Allegro, Bezalel) serve as specialized workers.
## Consequences
- Increased local compute requirements.
- Sub-100ms telemetry requirement.
- Mandatory local review for all remote artifacts.

15
docs/adr/ADR_TEMPLATE.md Normal file
View File

@@ -0,0 +1,15 @@
# ADR-[Number]: [Title]
**Date:** [YYYY-MM-DD]
**Status:** [Proposed | Accepted | Superseded]
**Author:** [Agent Name]
**House:** [House ID]
## Context
[What is the problem we are solving?]
## Decision
[What is the proposed solution?]
## Consequences
[What are the trade-offs?]

View File

@@ -0,0 +1,33 @@
#!/usr/bin/env python3
import os
import sys
import re
# Architecture Linter
# Ensuring all changes align with the Frontier Local Agenda.
SOVEREIGN_RULES = [
(r"https?://(api\.openai\.com|api\.anthropic\.com)", "CRITICAL: External cloud API detected. Use local custom_provider instead."),
(r"provider: (openai|anthropic)", "WARNING: Direct cloud provider used. Ensure fallback_model is configured."),
(r"api_key: ['"][^'"\s]{10,}['"]", "SECURITY: Hardcoded API key detected. Use environment variables.")
]
def lint_file(path):
print(f"Linting {path}...")
content = open(path).read()
violations = 0
for pattern, msg in SOVEREIGN_RULES:
if re.search(pattern, content):
print(f" [!] {msg}")
violations += 1
return violations
def main():
print("--- Ezra's Architecture Linter ---")
files = [f for f in sys.argv[1:] if os.path.isfile(f)]
total_violations = sum(lint_file(f) for f in files)
print(f"\nLinting complete. Total violations: {total_violations}")
sys.exit(1 if total_violations > 0 else 0)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""
Nostur Status Query MVP
Read-only status responses sourced from Gitea truth.
"""
import json
import os
import sys
import urllib.request
from datetime import datetime
# Configuration
GITEA_URL = os.environ.get("GITEA_URL", "https://forge.alexanderwhitestone.com/api/v1")
GITEA_TOKEN = os.environ.get("GITEA_TOKEN", "f7bcdaf878d479ad7747873ff6739a9bb89e3f80")
REPO_OWNER = "Timmy_Foundation"
REPO_NAME = "timmy-config"
def gitea_get(path):
if not GITEA_TOKEN:
raise RuntimeError("GITEA_TOKEN not set")
url = f"{GITEA_URL}{path}"
headers = {"Authorization": f"token {GITEA_TOKEN}"}
req = urllib.request.Request(url, headers=headers)
try:
with urllib.request.urlopen(req, timeout=15) as resp:
return json.loads(resp.read().decode())
except Exception as e:
print(f"Error fetching from Gitea: {e}", file=sys.stderr)
return None
def get_status():
path = f"/repos/{REPO_OWNER}/{REPO_NAME}/issues?state=open&limit=50"
issues = gitea_get(path)
if not issues:
return "⚠️ Error: Could not fetch status from Gitea."
# 1. Active Epics
active_epics = [
i['title'].replace('[EPIC]', '').strip()
for i in issues
if '[EPIC]' in i['title'] or any(l['name'] == 'epic' for l in i.get('labels', []))
][:2]
# 2. Blockers / Critical (Bugs, Security, Ops)
blockers = [
i['title'].strip()
for i in issues
if any(tag in i['title'] for tag in ['[BUG]', '[SECURITY]', '[OPS]']) or any(l['name'] == 'blocker' for l in i.get('labels', []))
][:2]
# 3. Priority Queue (Top 3)
priority_queue = [
f"#{i['number']}: {i['title']}"
for i in issues[:3]
]
# Format compact response for mobile
now = datetime.now().strftime("%H:%M:%S")
lines = ["[TIMMY STATUS]"]
lines.append(f"EPICS: {' | '.join(active_epics) if active_epics else 'None'}")
lines.append(f"BLOCKERS: {' | '.join(blockers) if blockers else 'None'}")
lines.append(f"QUEUE: {' | '.join(priority_queue)}")
lines.append(f"UPDATED: {now}")
return "\n".join(lines)
if __name__ == "__main__":
# If called with 'json', return JSON payload
if len(sys.argv) > 1 and sys.argv[1] == "--json":
path = f"/repos/{REPO_OWNER}/{REPO_NAME}/issues?state=open&limit=50"
issues = gitea_get(path)
if not issues:
print(json.dumps({"error": "fetch failed"}))
sys.exit(1)
data = {
"status": "active",
"epics": [i['title'] for i in issues if '[EPIC]' in i['title']][:2],
"blockers": [i['title'] for i in issues if any(tag in i['title'] for tag in ['[BUG]', '[SECURITY]', '[OPS]'])][:2],
"queue": [f"#{i['number']}: {i['title']}" for i in issues[:3]],
"timestamp": datetime.now().isoformat()
}
print(json.dumps(data, indent=2))
else:
print(get_status())