Compare commits

..

1 Commits

Author SHA1 Message Date
Alexander Whitestone
7b01739e74 fix: closes #717
Some checks failed
CI / test (pull_request) Failing after 9s
CI / validate (pull_request) Failing after 16s
Review Approval Gate / verify-review (pull_request) Failing after 3s
2026-04-12 12:32:31 -04:00
6 changed files with 303 additions and 38 deletions

View File

@@ -2,7 +2,7 @@ protection:
main:
required_pull_request_reviews:
dismiss_stale_reviews: true
required_approving_review_count: 1
required_approving_review_count: 1
required_linear_history: true
allow_force_push: false
allow_deletions: false
@@ -14,4 +14,55 @@ protection:
reviewers:
- perplexity
required_reviewers:
- Timmy
- Timmy # Owner gate for hermes-agent
main:
require_pull_request: true
required_approvals: 1
dismiss_stale_approvals: true
require_ci_to_pass: true
block_force_push: true
block_deletion: true
>>>>>>> replace
</source>
CODEOWNERS
<source>
<<<<<<< search
protection:
main:
required_status_checks:
- "ci/unit-tests"
- "ci/integration"
required_pull_request_reviews:
- "1 approval"
restrictions:
- "block force push"
- "block deletion"
enforce_admins: true
the-nexus:
required_status_checks: []
required_pull_request_reviews:
- "1 approval"
restrictions:
- "block force push"
- "block deletion"
enforce_admins: true
timmy-home:
required_status_checks: []
required_pull_request_reviews:
- "1 approval"
restrictions:
- "block force push"
- "block deletion"
enforce_admins: true
timmy-config:
required_status_checks: []
required_pull_request_reviews:
- "1 approval"
restrictions:
- "block force push"
- "block deletion"
enforce_admins: true

View File

@@ -4,6 +4,52 @@ rules:
require_pull_request: true
required_approvals: 1
dismiss_stale_reviews: true
require_ci_to_pass: true
require_ci_to_pass: true # Enabled for all except the-nexus (#915)
block_force_pushes: true
block_deletions: true
>>>>>>> replace
```
CODEOWNERS
```txt
<<<<<<< search
# CODEOWNERS - Mandatory Review Policy
# Default reviewer for all repositories
* @perplexity
# 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
# Branch protection rules for main branch
branch: main
rules:
- type: push
# Push protection rules
required_pull_request_reviews: true
required_status_checks: true
# CI is disabled for the-nexus per #915
required_approving_review_count: 1
block_force_pushes: true
block_deletions: true
- type: merge # Merge protection rules
required_pull_request_reviews: true
required_status_checks: true
required_approving_review_count: 1
dismiss_stale_reviews: true
require_code_owner_reviews: true
required_status_check_contexts:
- "ci/ci"
- "ci/qa"

16
app.js
View File

@@ -2833,24 +2833,37 @@ function populateAtlas() {
let onlineCount = 0;
let standbyCount = 0;
let readyCount = 0;
portals.forEach(portal => {
const config = portal.config;
if (config.status === 'online') onlineCount++;
if (config.status === 'standby') standbyCount++;
if (config.interaction_ready && config.status === 'online') readyCount++;
const card = document.createElement('div');
card.className = 'atlas-card';
card.style.setProperty('--portal-color', config.color);
const statusClass = `status-${config.status || 'online'}`;
const agents = config.agents_present || [];
const ready = config.interaction_ready && config.status === 'online';
const presenceLabel = agents.length > 0
? agents.map(a => a.toUpperCase()).join(', ')
: 'No agents present';
const readyLabel = ready ? 'INTERACTION READY' : 'UNAVAILABLE';
const readyClass = ready ? 'status-online' : 'status-offline';
card.innerHTML = `
<div class="atlas-card-header">
<div class="atlas-card-name">${config.name}</div>
<div class="atlas-card-status ${statusClass}">${config.status || 'ONLINE'}</div>
</div>
<div class="atlas-card-desc">${config.description}</div>
<div class="atlas-card-presence">
<div class="atlas-card-agents">${agents.length > 0 ? 'Agents: ' + presenceLabel : presenceLabel}</div>
<div class="atlas-card-ready ${readyClass}">${readyLabel}</div>
</div>
<div class="atlas-card-footer">
<div class="atlas-card-coord">X:${config.position.x} Z:${config.position.z}</div>
<div class="atlas-card-type">${config.destination?.type?.toUpperCase() || 'UNKNOWN'}</div>
@@ -2867,6 +2880,7 @@ function populateAtlas() {
document.getElementById('atlas-online-count').textContent = onlineCount;
document.getElementById('atlas-standby-count').textContent = standbyCount;
document.getElementById('atlas-ready-count').textContent = readyCount;
// Update Bannerlord HUD status
const bannerlord = portals.find(p => p.config.id === 'bannerlord');

View File

@@ -226,6 +226,8 @@
<span class="status-indicator online"></span> <span id="atlas-online-count">0</span> ONLINE
&nbsp;&nbsp;
<span class="status-indicator standby"></span> <span id="atlas-standby-count">0</span> STANDBY
&nbsp;&nbsp;
<span class="status-indicator online"></span> <span id="atlas-ready-count">0</span> INTERACTION READY
</div>
<div class="atlas-hint">Click a portal to focus or teleport</div>
</div>
@@ -343,6 +345,40 @@
<button onclick="searchMemPalace()">Search</button>
</div>
<div id="mempalace-results" style="position:fixed; right:24px; top:84px; max-height:200px; overflow-y:auto; background:rgba(0,0,0,0.3); padding:8px; font-family:'JetBrains Mono',monospace; font-size:11px; color:#e0f0ff; border-left:2px solid #4af0c0;"></div>
>>>>>>> replace
```
index.html
```html
<<<<<<< search
<div class="branch-policy" style="margin-top: 10px; font-size: 12px; color: #aaa;">
<strong>BRANCH PROTECTION POLICY</strong><br>
<ul style="margin:0; padding-left:15px;">
<li>• Require PR for merge ✅</li>
<li>• Require 1 approval ✅</li>
<li>• Dismiss stale approvals ✅</li>
<li>• Require CI ✅ (where available)</li>
<li>• Block force push ✅</li>
<li>• Block branch deletion ✅</li>
</ul>
</div>
<div class="default-reviewers" style="margin-top: 8px;">
<strong>DEFAULT REVIEWERS</strong><br>
<ul style="margin:0; padding-left:15px;">
<li><span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos)</li>
<li><span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)</li>
</ul>
</div>
<div class="implementation-status" style="margin-top: 10px;">
<strong>IMPLEMENTATION STATUS</strong><br>
<div style="margin-top: 5px; display: flex; flex-direction: column; gap: 2px;">
<div><span style="color:#4af0c0;">hermes-agent</span>: Require PR + 1 approval + CI ✅</div>
<div><span style="color:#7b5cff;">the-nexus</span>: Require PR + 1 approval ⚠<> (CI disabled)</div>
<div><span style="color:#ffd700;">timmy-home</span>: Require PR + 1 approval ✅</div>
<div><span style="color:#ab8d00;">timmy-config</span>: Require PR + 1 approval ✅</div>
</div>
</div>
</footer>
<script type="module" src="./app.js"></script>

View File

@@ -5,13 +5,25 @@
"description": "The Vvardenfell harness. Ash storms and ancient mysteries.",
"status": "online",
"color": "#ff6600",
"position": { "x": 15, "y": 0, "z": -10 },
"rotation": { "y": -0.5 },
"position": {
"x": 15,
"y": 0,
"z": -10
},
"rotation": {
"y": -0.5
},
"destination": {
"url": "https://morrowind.timmy.foundation",
"type": "harness",
"params": { "world": "vvardenfell" }
}
"params": {
"world": "vvardenfell"
}
},
"agents_present": [
"timmy"
],
"interaction_ready": true
},
{
"id": "bannerlord",
@@ -19,18 +31,36 @@
"description": "Calradia battle harness. Massive armies, tactical command.",
"status": "downloaded",
"color": "#ffd700",
"position": { "x": -15, "y": 0, "z": -10 },
"rotation": { "y": 0.5 },
"position": {
"x": -15,
"y": 0,
"z": -10
},
"rotation": {
"y": 0.5
},
"portal_type": "game-world",
"world_category": "strategy-rpg",
"environment": "production",
"access_mode": "operator",
"readiness_state": "downloaded",
"readiness_steps": {
"downloaded": { "label": "Downloaded", "done": true },
"runtime_ready": { "label": "Runtime Ready", "done": false },
"launched": { "label": "Launched", "done": false },
"harness_bridged": { "label": "Harness Bridged", "done": false }
"downloaded": {
"label": "Downloaded",
"done": true
},
"runtime_ready": {
"label": "Runtime Ready",
"done": false
},
"launched": {
"label": "Launched",
"done": false
},
"harness_bridged": {
"label": "Harness Bridged",
"done": false
}
},
"blocked_reason": null,
"telemetry_source": "hermes-harness:bannerlord",
@@ -41,8 +71,12 @@
"url": null,
"type": "harness",
"action_label": "Enter Calradia",
"params": { "world": "calradia" }
}
"params": {
"world": "calradia"
}
},
"agents_present": [],
"interaction_ready": false
},
{
"id": "workshop",
@@ -50,13 +84,26 @@
"description": "The creative harness. Build, script, and manifest.",
"status": "online",
"color": "#4af0c0",
"position": { "x": 0, "y": 0, "z": -20 },
"rotation": { "y": 0 },
"position": {
"x": 0,
"y": 0,
"z": -20
},
"rotation": {
"y": 0
},
"destination": {
"url": "https://workshop.timmy.foundation",
"type": "harness",
"params": { "mode": "creative" }
}
"params": {
"mode": "creative"
}
},
"agents_present": [
"timmy",
"kimi"
],
"interaction_ready": true
},
{
"id": "archive",
@@ -64,13 +111,25 @@
"description": "The repository of all knowledge. History, logs, and ancient data.",
"status": "online",
"color": "#0066ff",
"position": { "x": 25, "y": 0, "z": 0 },
"rotation": { "y": -1.57 },
"position": {
"x": 25,
"y": 0,
"z": 0
},
"rotation": {
"y": -1.57
},
"destination": {
"url": "https://archive.timmy.foundation",
"type": "harness",
"params": { "mode": "read" }
}
"params": {
"mode": "read"
}
},
"agents_present": [
"claude"
],
"interaction_ready": true
},
{
"id": "chapel",
@@ -78,13 +137,23 @@
"description": "A sanctuary for reflection and digital peace.",
"status": "online",
"color": "#ffd700",
"position": { "x": -25, "y": 0, "z": 0 },
"rotation": { "y": 1.57 },
"position": {
"x": -25,
"y": 0,
"z": 0
},
"rotation": {
"y": 1.57
},
"destination": {
"url": "https://chapel.timmy.foundation",
"type": "harness",
"params": { "mode": "meditation" }
}
"params": {
"mode": "meditation"
}
},
"agents_present": [],
"interaction_ready": true
},
{
"id": "courtyard",
@@ -92,13 +161,26 @@
"description": "The open nexus. A place for agents to gather and connect.",
"status": "online",
"color": "#4af0c0",
"position": { "x": 15, "y": 0, "z": 10 },
"rotation": { "y": -2.5 },
"position": {
"x": 15,
"y": 0,
"z": 10
},
"rotation": {
"y": -2.5
},
"destination": {
"url": "https://courtyard.timmy.foundation",
"type": "harness",
"params": { "mode": "social" }
}
"params": {
"mode": "social"
}
},
"agents_present": [
"timmy",
"perplexity"
],
"interaction_ready": true
},
{
"id": "gate",
@@ -106,12 +188,22 @@
"description": "The transition point. Entry and exit from the Nexus core.",
"status": "standby",
"color": "#ff4466",
"position": { "x": -15, "y": 0, "z": 10 },
"rotation": { "y": 2.5 },
"position": {
"x": -15,
"y": 0,
"z": 10
},
"rotation": {
"y": 2.5
},
"destination": {
"url": "https://gate.timmy.foundation",
"type": "harness",
"params": { "mode": "transit" }
}
"params": {
"mode": "transit"
}
},
"agents_present": [],
"interaction_ready": false
}
]
]

View File

@@ -372,7 +372,33 @@ canvas#nexus-canvas {
font-size: 12px;
color: var(--color-text-muted);
line-height: 1.5;
margin-bottom: 15px;
margin-bottom: 10px;
}
.atlas-card-presence {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
padding: 6px 8px;
background: rgba(0, 0, 0, 0.25);
border-radius: 4px;
border: 1px solid rgba(160, 184, 208, 0.1);
}
.atlas-card-agents {
font-size: 11px;
font-family: var(--font-body);
color: var(--color-text-muted);
}
.atlas-card-ready {
font-size: 9px;
font-family: var(--font-body);
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 2px 6px;
border-radius: 3px;
}
.atlas-card-footer {