Compare commits
1 Commits
main
...
claude/iss
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4721518ac6 |
15
.gitea.yaml
15
.gitea.yaml
@@ -1,15 +0,0 @@
|
||||
branch_protection:
|
||||
main:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: true
|
||||
block_force_push: true
|
||||
block_deletion: true
|
||||
develop:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: true
|
||||
block_force_push: true
|
||||
block_deletion: true
|
||||
68
.gitea.yml
68
.gitea.yml
@@ -1,68 +0,0 @@
|
||||
protection:
|
||||
main:
|
||||
required_pull_request_reviews:
|
||||
dismiss_stale_reviews: true
|
||||
required_approving_review_count: 1
|
||||
required_linear_history: true
|
||||
allow_force_push: false
|
||||
allow_deletions: false
|
||||
require_pull_request: true
|
||||
require_status_checks: true
|
||||
required_status_checks:
|
||||
- "ci/unit-tests"
|
||||
- "ci/integration"
|
||||
reviewers:
|
||||
- perplexity
|
||||
required_reviewers:
|
||||
- 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
|
||||
@@ -1,55 +0,0 @@
|
||||
# Branch Protection Rules for Main Branch
|
||||
branch: main
|
||||
rules:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_reviews: 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"
|
||||
@@ -1,8 +0,0 @@
|
||||
branch: main
|
||||
rules:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: true
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
@@ -1,8 +0,0 @@
|
||||
branch: main
|
||||
rules:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: false # CI runner dead (issue #915)
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
@@ -1,8 +0,0 @@
|
||||
branch: main
|
||||
rules:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: false # Limited CI
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
@@ -1,8 +0,0 @@
|
||||
branch: main
|
||||
rules:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci_to_merge: false # No CI configured
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
@@ -1,72 +0,0 @@
|
||||
branch_protection:
|
||||
main:
|
||||
required_pull_request_reviews: true
|
||||
required_status_checks:
|
||||
- ci/circleci
|
||||
- security-scan
|
||||
required_linear_history: false
|
||||
allow_force_pushes: false
|
||||
allow_deletions: false
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
dismiss_stale_reviews: true
|
||||
require_last_push_approval: true
|
||||
require_code_owner_reviews: true
|
||||
required_owners:
|
||||
- perplexity
|
||||
- Timmy
|
||||
repos:
|
||||
- name: hermes-agent
|
||||
branch_protection:
|
||||
required_pull_request_reviews: true
|
||||
required_status_checks:
|
||||
- "ci/circleci"
|
||||
- "security-scan"
|
||||
required_linear_history: true
|
||||
required_merge_method: merge
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
required_owners:
|
||||
- perplexity
|
||||
- Timmy
|
||||
|
||||
- name: the-nexus
|
||||
branch_protection:
|
||||
required_pull_request_reviews: true
|
||||
required_status_checks: []
|
||||
required_linear_history: true
|
||||
required_merge_method: merge
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
required_owners:
|
||||
- perplexity
|
||||
|
||||
- name: timmy-home
|
||||
branch_protection:
|
||||
required_pull_request_reviews: true
|
||||
required_status_checks: []
|
||||
required_linear_history: true
|
||||
required_merge_method: merge
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
required_owners:
|
||||
- perplexity
|
||||
|
||||
- name: timmy-config
|
||||
branch_protection:
|
||||
required_pull_request_reviews: true
|
||||
required_status_checks: []
|
||||
required_linear_history: true
|
||||
required_merge_method: merge
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
block_force_pushes: true
|
||||
block_deletions: true
|
||||
required_owners:
|
||||
- perplexity
|
||||
@@ -1,35 +0,0 @@
|
||||
hermes-agent:
|
||||
main:
|
||||
require_pr: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci: true
|
||||
block_force_push: true
|
||||
block_delete: true
|
||||
|
||||
the-nexus:
|
||||
main:
|
||||
require_pr: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci: false # CI runner dead (issue #915)
|
||||
block_force_push: true
|
||||
block_delete: true
|
||||
|
||||
timmy-home:
|
||||
main:
|
||||
require_pr: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci: false # No CI configured
|
||||
block_force_push: true
|
||||
block_delete: true
|
||||
|
||||
timmy-config:
|
||||
main:
|
||||
require_pr: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
require_ci: true # Limited CI
|
||||
block_force_push: true
|
||||
block_delete: true
|
||||
@@ -1,7 +0,0 @@
|
||||
# Default reviewers for all files
|
||||
@perplexity
|
||||
|
||||
# Special ownership for hermes-agent specific files
|
||||
:hermes-agent/** @Timmy
|
||||
@perplexity
|
||||
@Timmy
|
||||
@@ -1,12 +0,0 @@
|
||||
# Default reviewers for all PRs
|
||||
@perplexity
|
||||
|
||||
# Repo-specific overrides
|
||||
hermes-agent/:
|
||||
- @Timmy
|
||||
|
||||
# File path patterns
|
||||
docs/:
|
||||
- @Timmy
|
||||
nexus/:
|
||||
- @perplexity
|
||||
@@ -1,8 +0,0 @@
|
||||
main:
|
||||
require_pr: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
# Require CI to pass if CI exists
|
||||
require_ci_to_pass: true
|
||||
block_force_push: true
|
||||
block_branch_deletion: true
|
||||
@@ -6,26 +6,6 @@ on:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python3 -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
pytest tests/
|
||||
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
@@ -37,6 +17,8 @@ jobs:
|
||||
FAIL=0
|
||||
for f in $(find . -name '*.py' -not -path './venv/*'); do
|
||||
if ! python3 -c "import py_compile; py_compile.compile('$f', doraise=True)" 2>/dev/null; then
|
||||
echo "FAIL: $f"
|
||||
FAIL=1
|
||||
else
|
||||
echo "OK: $f"
|
||||
fi
|
||||
@@ -55,11 +37,6 @@ jobs:
|
||||
fi
|
||||
done
|
||||
exit $FAIL
|
||||
else
|
||||
echo "OK: $f"
|
||||
fi
|
||||
done
|
||||
exit $FAIL
|
||||
|
||||
- name: Validate YAML
|
||||
run: |
|
||||
|
||||
42
.github/BRANCH_PROTECTION.md
vendored
42
.github/BRANCH_PROTECTION.md
vendored
@@ -1,42 +0,0 @@
|
||||
# Branch Protection Policy for Timmy Foundation
|
||||
|
||||
## Enforced Rules for All Repositories
|
||||
|
||||
All repositories must enforce these rules on the `main` branch:
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ⚠ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
## Default Reviewer Assignments
|
||||
|
||||
- **All repositories**: @perplexity (QA gate)
|
||||
- **hermes-agent**: @Timmy (owner gate)
|
||||
- **Specialized areas**: Repo-specific owners for domain expertise
|
||||
|
||||
## CI Enforcement Status
|
||||
|
||||
| Repository | CI Status | Notes |
|
||||
|------------|-----------|-------|
|
||||
| hermes-agent | ✅ Active | Full CI enforcement |
|
||||
| the-nexus | ⚠ Pending | CI runner dead (#915) |
|
||||
| timmy-home | ❌ Disabled | No CI configured |
|
||||
| timmy-config | ❌ Disabled | Limited CI |
|
||||
|
||||
## Implementation Requirements
|
||||
|
||||
1. All repositories must have:
|
||||
- [x] Branch protection enabled
|
||||
- [x] @perplexity set as default reviewer
|
||||
- [x] This policy documented in README
|
||||
|
||||
2. Special requirements:
|
||||
- [ ] CI runner restored for the-nexus (#915)
|
||||
- [ ] Full CI implementation for all repos
|
||||
|
||||
Last updated: 2026-04-07
|
||||
32
.github/CODEOWNERS
vendored
32
.github/CODEOWNERS
vendored
@@ -1,32 +0,0 @@
|
||||
# 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
|
||||
# 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
|
||||
26
.github/ISSUE_TEMPLATE.md
vendored
26
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,26 +0,0 @@
|
||||
# Issue Template
|
||||
|
||||
## Describe the issue
|
||||
Please describe the problem or feature request in detail.
|
||||
|
||||
## Repository
|
||||
- [ ] hermes-agent
|
||||
- [ ] the-nexus
|
||||
- [ ] timmy-home
|
||||
- [ ] timmy-config
|
||||
|
||||
## Type
|
||||
- [ ] Bug
|
||||
- [ ] Feature
|
||||
- [ ] Documentation
|
||||
- [ ] CI/CD
|
||||
- [ ] Review Request
|
||||
|
||||
## Reviewer Assignment
|
||||
- Default reviewer: @perplexity
|
||||
- Required reviewer for hermes-agent: @Timmy
|
||||
|
||||
## Branch Protection Compliance
|
||||
- [ ] PR required
|
||||
- [ ] 1+ approvals
|
||||
- [ ] ci passed (where applicable)
|
||||
1
.github/hermes-agent/CODEOWNERS
vendored
1
.github/hermes-agent/CODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
@perplexity @Timmy
|
||||
65
.github/pull_request_template.md
vendored
65
.github/pull_request_template.md
vendored
@@ -1,65 +0,0 @@
|
||||
---
|
||||
|
||||
**⚠️ Before submitting your pull request:**
|
||||
|
||||
1. [x] I've read [BRANCH_PROTECTION.md](BRANCH_PROTECTION.md)
|
||||
2. [x] I've followed [CONTRIBUTING.md](CONTRIBUTING.md) guidelines
|
||||
3. [x] My changes have appropriate test coverage
|
||||
4. [x] I've updated documentation where needed
|
||||
5. [x] I've verified CI passes (where applicable)
|
||||
|
||||
**Context:**
|
||||
<Describe your changes and why they're needed>
|
||||
|
||||
**Testing:**
|
||||
<Explain how this was tested>
|
||||
|
||||
**Questions for reviewers:**
|
||||
<Ask specific questions if needed>
|
||||
## Pull Request Template
|
||||
|
||||
### Description
|
||||
[Explain your changes briefly]
|
||||
|
||||
### Checklist
|
||||
- [ ] Branch protection rules followed
|
||||
- [ ] Required reviewers: @perplexity (QA), @Timmy (hermes-agent)
|
||||
- [ ] CI passed (where applicable)
|
||||
|
||||
### Questions for Reviewers
|
||||
- [ ] Any special considerations?
|
||||
- [ ] Does this require additional documentation?
|
||||
# Pull Request Template
|
||||
|
||||
## Summary
|
||||
Briefly describe the changes in this PR.
|
||||
|
||||
## Reviewers
|
||||
- Default reviewer: @perplexity
|
||||
- Required reviewer for hermes-agent: @Timmy
|
||||
|
||||
## Branch Protection Compliance
|
||||
- [ ] PR created
|
||||
- [ ] 1+ approvals
|
||||
- [ ] ci passed (where applicable)
|
||||
- [ ] No force pushes
|
||||
- [ ] No branch deletions
|
||||
|
||||
## Specialized Owners
|
||||
- [ ] @Rockachopa (for agent-core)
|
||||
- [ ] @Timmy (for ai/)
|
||||
## Pull Request Template
|
||||
|
||||
### Summary
|
||||
- [ ] Describe the change
|
||||
- [ ] Link to related issue (e.g. `Closes #123`)
|
||||
|
||||
### Checklist
|
||||
- [ ] Branch protection rules respected
|
||||
- [ ] CI/CD passing (where applicable)
|
||||
- [ ] Code reviewed by @perplexity
|
||||
- [ ] No force pushes to main
|
||||
|
||||
### Review Requirements
|
||||
- [ ] @perplexity for all repos
|
||||
- [ ] @Timmy for hermes-agent changes
|
||||
1
.github/the-nexus/CODEOWNERS
vendored
1
.github/the-nexus/CODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
@perplexity @Timmy
|
||||
1
.github/timmy-config/cODEOWNERS
vendored
1
.github/timmy-config/cODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
@perplexity
|
||||
1
.github/timmy-home/cODEOWNERS
vendored
1
.github/timmy-home/cODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
@perplexity
|
||||
19
.github/workflows/ci.yml
vendored
19
.github/workflows/ci.yml
vendored
@@ -1,19 +0,0 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- run: pip install -r requirements.txt
|
||||
- run: pytest
|
||||
49
.github/workflows/enforce-branch-policy.yml
vendored
49
.github/workflows/enforce-branch-policy.yml
vendored
@@ -1,49 +0,0 @@
|
||||
name: Enforce Branch Protection
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize]
|
||||
|
||||
jobs:
|
||||
enforce:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check branch protection status
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const { data: pr } = await github.rest.pulls.get({
|
||||
...context.repo,
|
||||
pull_number: context.payload.pull_request.number
|
||||
});
|
||||
|
||||
if (pr.head.ref === 'main') {
|
||||
core.setFailed('Direct pushes to main branch are not allowed. Please create a feature branch.');
|
||||
}
|
||||
|
||||
const { data: status } = await github.rest.repos.getBranchProtection({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
branch: 'main'
|
||||
});
|
||||
|
||||
if (!status.required_status_checks || !status.required_status_checks.strict) {
|
||||
core.setFailed('Branch protection rules are not properly configured');
|
||||
}
|
||||
|
||||
const { data: reviews } = await github.rest.pulls.getReviews({
|
||||
...context.repo,
|
||||
pull_number: context.payload.pull_request.number
|
||||
});
|
||||
|
||||
if (reviews.filter(r => r.state === 'APPROVED').length < 1) {
|
||||
core.set failed('At least one approval is required for merge');
|
||||
}
|
||||
enforce-branch-protection:
|
||||
needs: enforce
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check branch protection status
|
||||
run: |
|
||||
# Add custom branch protection checks here
|
||||
echo "Branch protection enforced"
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,4 +2,3 @@ node_modules/
|
||||
test-results/
|
||||
nexus/__pycache__/
|
||||
tests/__pycache__/
|
||||
.aider*
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
main:
|
||||
require_pull_request: true
|
||||
required_approvals: 1
|
||||
dismiss_stale_approvals: true
|
||||
# require_ci_to_merge: true (limited CI)
|
||||
block_force_push: true
|
||||
block_deletions: true
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **`timmy-config/CODEOWNERS`**
|
||||
```txt
|
||||
<<<<<<< search
|
||||
335
CODEOWNERS
335
CODEOWNERS
@@ -1,335 +0,0 @@
|
||||
# Branch Protection Rules for All Repositories
|
||||
# Applied to main branch in all repositories
|
||||
|
||||
rules:
|
||||
# Common base rules applied to all repositories
|
||||
base:
|
||||
required_status_checks:
|
||||
strict: true
|
||||
contexts:
|
||||
- "ci/unit-tests"
|
||||
- "ci/integration"
|
||||
required_pull_request_reviews:
|
||||
required_approving_review_count: 1
|
||||
dismiss_stale_reviews: true
|
||||
require_code_owner_reviews: true
|
||||
restrictions:
|
||||
team_whitelist:
|
||||
- perplexity
|
||||
- timmy-core
|
||||
block_force_pushes: true
|
||||
block_create: false
|
||||
block_delete: true
|
||||
|
||||
# Repository-specific overrides
|
||||
hermes-agent:
|
||||
<<: *base
|
||||
required_status_checks:
|
||||
contexts:
|
||||
- "ci/unit-tests"
|
||||
- "ci/integration"
|
||||
- "ci/performance"
|
||||
|
||||
the-nexus:
|
||||
<<: *base
|
||||
required_status_checks:
|
||||
contexts: []
|
||||
strict: false
|
||||
|
||||
timmy-home:
|
||||
<<: *base
|
||||
required_status_checks:
|
||||
contexts: []
|
||||
strict: false
|
||||
|
||||
timmy-config:
|
||||
<<: *base
|
||||
required_status_checks:
|
||||
contexts: []
|
||||
strict: false
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
.github/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
|
||||
|
||||
# Owner gates for critical systems
|
||||
hermes-agent/ @Timmy
|
||||
|
||||
# Owner gates
|
||||
hermes-agent/ @Timmy
|
||||
|
||||
# QA reviewer for all PRs
|
||||
* @perplexity
|
||||
|
||||
# Specialized component owners
|
||||
hermes-agent/agent-core/ @Rockachopa
|
||||
hermes-agent/protocol/ @Timmy
|
||||
the-nexus/portals/ @perplexity
|
||||
the-nexus/ai/ @Timmy
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
CONTRIBUTING.md
|
||||
```diff
|
||||
<<<<<<< search
|
||||
# Contribution & Code Review Policy
|
||||
|
||||
## Branch Protection & Mandatory Review Policy
|
||||
|
||||
**Enforced rules for all repositories:**
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ⚠ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
**Default Reviewers:**
|
||||
- @perplexity (all repositories - QA gate)
|
||||
- @Timmy (hermes-agent only - owner gate)
|
||||
|
||||
**CI Enforcement:**
|
||||
- hermes-agent: Full CI enforcement
|
||||
- the-nexus: CI pending runner restoration (#915)
|
||||
- timmy-home: No CI enforcement
|
||||
- timmy-config: Limited CI
|
||||
|
||||
**Implementation Status:**
|
||||
- [x] hermes-agent protection enabled
|
||||
- [x] the-nexus protection enabled
|
||||
- [x] timmy-home protection enabled
|
||||
- [x] timmy-config protection enabled
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|---|---|---|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | ✅ 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | <20> Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
### Repository-Specific Configuration
|
||||
|
||||
**1. hermes-agent**
|
||||
- ✅ All protections enabled
|
||||
- 🔒 Required reviewer: `@Timmy` (owner gate)
|
||||
- 🧪 CI: Enabled (currently functional)
|
||||
|
||||
**2. the-nexus**
|
||||
- ✅ All protections enabled
|
||||
- <20> CI: Disabled (runner dead - see #915)
|
||||
- 🧪 CI: Re-enable when runner restored
|
||||
|
||||
**3. timmy-home**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: No CI configured
|
||||
|
||||
**4. timmy-config**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: Limited CI
|
||||
|
||||
### Default Reviewer Assignment
|
||||
|
||||
All repositories must:
|
||||
- 🧑 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🧑 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
### Implementation Steps
|
||||
|
||||
1. Go to Gitea > Settings > Branches > Branch Protection
|
||||
2. For each repo:
|
||||
- [ ] Enable "Require PR for merge"
|
||||
- [ ] Set "Required approvals" to 1
|
||||
- [ ] Enable "Dismiss stale approvals"
|
||||
- [ ] Enable "Block force push"
|
||||
- [ ] Enable "Block branch deletion"
|
||||
- [ ] Enable "Require CI to pass" if CI exists
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] All four repositories have protection rules applied
|
||||
- [ ] Default reviewers configured per matrix above
|
||||
- [ ] This document updated in all repositories
|
||||
- [ ] Policy enforced for 72 hours with no unreviewed merges
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
# 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
|
||||
>>>>>>> replace
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
### ✅ Updated `README.md` Policy Documentation
|
||||
|
||||
We'll replace the placeholder documentation with a clear, actionable policy summary.
|
||||
|
||||
`README.md`
|
||||
````
|
||||
<<<<<<< search
|
||||
|
||||
# Specialized component owners
|
||||
hermes-agent/ @Timmy
|
||||
hermes-agent/protocol/ @Timmy
|
||||
the-nexus/portals/ @perplexity
|
||||
the-nexus/ai/ @Timmy
|
||||
|
||||
# Specialized component owners
|
||||
hermes-agent/agent-core/ @Rockachopa
|
||||
hermes-agent/protocol/ @Timmy
|
||||
the-nexus/portals/ @perplexity
|
||||
the-nexus/ai/ @Timmy
|
||||
# CODEOWNERS - Mandatory Review Policy
|
||||
|
||||
# Default reviewer for all repositories
|
||||
* @perplexity
|
||||
|
||||
# Specialized component owners
|
||||
hermes-agent/ @Timmy
|
||||
hermes-agent/protocol/ @Timmy
|
||||
the-nexus/ @perplexity
|
||||
the-nexus/ai/ @Timmy
|
||||
timmy-home/ @perplexity
|
||||
timmy-config/ @perplexity
|
||||
|
||||
# Owner gates
|
||||
hermes-agent/ @Timmy
|
||||
# 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
|
||||
>>>>>>> replace
|
||||
</source>
|
||||
|
||||
README.md
|
||||
<source>
|
||||
<<<<<<< search
|
||||
# The Nexus Project
|
||||
# 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
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
README.md
|
||||
```markdown
|
||||
<<<<<<< search
|
||||
# Nexus Organization Policy
|
||||
|
||||
## Branch Protection & Review Requirements
|
||||
|
||||
All repositories must enforce these rules on the `main` branch:
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
# 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
|
||||
414
CONTRIBUTING.md
414
CONTRIBUTING.md
@@ -1,413 +1,19 @@
|
||||
# Contribution & Code Review Policy
|
||||
|
||||
## Branch Protection & Review Policy
|
||||
|
||||
All repositories enforce these rules on the `main` branch:
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Require 1 approval before merge
|
||||
- ✅ Dismiss stale approvals on new commits
|
||||
- <20>️ Require CI to pass (where CI exists)
|
||||
- ✅ Block force pushes to `main`
|
||||
- ✅ Block deletion of `main` branch
|
||||
|
||||
### Default Reviewer Assignments
|
||||
|
||||
| Repository | Required Reviewers |
|
||||
|------------------|---------------------------------|
|
||||
| `hermes-agent` | `@perplexity`, `@Timmy` |
|
||||
| `the-nexus` | `@perplexity` |
|
||||
| `timmy-home` | `@perplexity` |
|
||||
| `timmy-config` | `@perplexity` |
|
||||
|
||||
### CI Enforcement Status
|
||||
|
||||
| Repository | CI Status |
|
||||
|------------------|---------------------------------|
|
||||
| `hermes-agent` | ✅ Active |
|
||||
| `the-nexus` | <20>️ CI runner pending (#915) |
|
||||
| `timmy-home` | ❌ No CI |
|
||||
| `timmy-config` | ❌ Limited CI |
|
||||
|
||||
### Workflow Requirements
|
||||
|
||||
1. Create feature branch from `main`
|
||||
2. Submit PR with clear description
|
||||
3. Wait for @perplexity review
|
||||
4. Address feedback if any
|
||||
5. Merge after approval and passing CI
|
||||
|
||||
### Emergency Exceptions
|
||||
Hotfixes require:
|
||||
- ✅ @Timmy approval
|
||||
- ✅ Post-merge documentation
|
||||
- ✅ Follow-up PR for full review
|
||||
|
||||
### Abandoned PR Policy
|
||||
- PRs inactive >7 day: 🧹 archived
|
||||
- Unreviewed PRs >14 days: ❌ closed
|
||||
|
||||
### Policy Enforcement
|
||||
These rules are enforced by Gitea branch protection settings. Direct pushes to main will be blocked.
|
||||
- Require rebase to re-enable
|
||||
|
||||
## Enforcement
|
||||
|
||||
These rules are enforced by Gitea's branch protection settings. Violations will be blocked at the platform level.
|
||||
# Contribution and Code Review Policy
|
||||
|
||||
## Branch Protection Rules
|
||||
|
||||
All repositories must enforce the following rules on the `main` branch:
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Require 1 approval before merge
|
||||
- ✅ Dismiss stale approvals when new commits are pushed
|
||||
- ✅ Require status checks to pass (where CI is configured)
|
||||
- ✅ Block force-pushing to `main`
|
||||
- ✅ Block deleting the `main` branch
|
||||
|
||||
## Default Reviewer Assignment
|
||||
|
||||
All repositories must configure the following default reviewers:
|
||||
- `@perplexity` as default reviewer for all repositories
|
||||
- `@Timmy` as required reviewer for `hermes-agent`
|
||||
- Repo-specific owners for specialized areas
|
||||
|
||||
## Implementation Status
|
||||
|
||||
| Repository | Branch Protection | CI Enforcement | Default Reviewers |
|
||||
|------------------|------------------|----------------|-------------------|
|
||||
| hermes-agent | ✅ Enabled | ✅ Active | @perplexity, @Timmy |
|
||||
| the-nexus | ✅ Enabled | ⚠️ CI pending | @perplexity |
|
||||
| timmy-home | ✅ Enabled | ❌ No CI | @perplexity |
|
||||
| timmy-config | ✅ Enabled | ❌ No CI | @perplexity |
|
||||
|
||||
## Compliance Requirements
|
||||
|
||||
All contributors must:
|
||||
1. Never push directly to `main`
|
||||
2. Create a pull request for all changes
|
||||
3. Get at least one approval before merging
|
||||
4. Ensure CI passes before merging (where applicable)
|
||||
|
||||
## Policy Enforcement
|
||||
|
||||
This policy is enforced via Gitea branch protection rules. Violations will be blocked at the platform level.
|
||||
|
||||
For questions about this policy, contact @perplexity or @Timmy.
|
||||
|
||||
### Required for All Merges
|
||||
- [x] Pull Request must exist for all changes
|
||||
- [x] At least 1 approval from reviewer
|
||||
- [x] CI checks must pass (where applicable)
|
||||
- [x] No force pushes allowed
|
||||
- [x] No direct pushes to main
|
||||
- [x] No branch deletion
|
||||
|
||||
### Review Requirements
|
||||
- [x] @perplexity must be assigned as reviewer
|
||||
- [x] @Timmy must review all changes to `hermes-agent/`
|
||||
- [x] No self-approvals allowed
|
||||
|
||||
### CI/CD Enforcement
|
||||
- [x] CI must be configured for all new features
|
||||
- [x] Failing CI blocks merge
|
||||
- [x] CI status displayed in PR header
|
||||
|
||||
### Abandoned PR Policy
|
||||
- PRs inactive >7 days get "needs attention" label
|
||||
- PRs inactive >21 days are archived
|
||||
- PRs inactive >90 days are closed
|
||||
- [ ] At least 1 approval from reviewer
|
||||
- [ ] CI checks must pass (where available)
|
||||
- [ ] No force pushes allowed
|
||||
- [ ] No direct pushes to main
|
||||
- [ ] No branch deletion
|
||||
|
||||
### Review Requirements by Repository
|
||||
```yaml
|
||||
hermes-agent:
|
||||
required_owners:
|
||||
- perplexity
|
||||
- Timmy
|
||||
|
||||
the-nexus:
|
||||
required_owners:
|
||||
- perplexity
|
||||
|
||||
timmy-home:
|
||||
required_owners:
|
||||
- perplexity
|
||||
|
||||
timmy-config:
|
||||
required_owners:
|
||||
- perplexity
|
||||
```
|
||||
|
||||
### CI Status
|
||||
|
||||
```text
|
||||
- hermes-agent: ✅ Active
|
||||
- the-nexus: ⚠️ CI runner disabled (see #915)
|
||||
- timmy-home: - (No CI)
|
||||
- timmy-config: - (Limited CI)
|
||||
```
|
||||
|
||||
### Branch Protection Status
|
||||
|
||||
All repositories now enforce:
|
||||
- Require PR for merge
|
||||
- 1+ approvals required
|
||||
- CI/CD must pass (where applicable)
|
||||
- Force push and branch deletion blocked
|
||||
- hermes-agent: ✅ Active
|
||||
- the-nexus: ⚠️ CI runner disabled (see #915)
|
||||
- timmy-home: - (No CI)
|
||||
- timmy-config: - (Limited CI)
|
||||
```
|
||||
|
||||
## Workflow
|
||||
1. Create feature branch
|
||||
2. Open PR against main
|
||||
3. Get 1+ approvals
|
||||
4. Ensure CI passes
|
||||
5. Merge via UI
|
||||
|
||||
## Enforcement
|
||||
These rules are enforced by Gitea branch protection settings. Direct pushes to main will be blocked.
|
||||
|
||||
## Abandoned PRs
|
||||
PRs not updated in >7 days will be labeled "stale" and may be closed after 30 days of inactivity.
|
||||
# Contributing to the Nexus
|
||||
|
||||
**Every PR: net ≤ 10 added lines.** Not a guideline — a hard limit.
|
||||
Add 40, remove 30. Can't remove? You're homebrewing. Import instead.
|
||||
|
||||
## Branch Protection & Review Policy
|
||||
## Why
|
||||
|
||||
### Branch Protection Rules
|
||||
Import over invent. Plug in the research. No builder trap.
|
||||
Removal is a first-class contribution. Baseline: 4,462 lines (2026-03-25). Goes down.
|
||||
|
||||
All repositories enforce the following rules on the `main` branch:
|
||||
## PR Checklist
|
||||
|
||||
| Rule | Status | Applies To |
|
||||
|------|--------|------------|
|
||||
| Require Pull Request for merge | ✅ Enabled | All |
|
||||
| Require 1 approval before merge | ✅ Enabled | All |
|
||||
| Dismiss stale approvals on new commits | ✅ Enabled | All |
|
||||
| Require CI to pass (where CI exists) | ⚠️ Conditional | All |
|
||||
| Block force pushes to `main` | ✅ Enabled | All |
|
||||
| Block deletion of `main` branch | ✅ Enabled | All |
|
||||
1. **Net diff ≤ 10** (`+12 -8 = net +4 ✅` / `+200 -0 = net +200 ❌`)
|
||||
2. **Manual test plan** — specific steps, not "it works"
|
||||
3. **Automated test output** — paste it, or write a test (counts toward your 10)
|
||||
|
||||
### Default Reviewer Assignments
|
||||
|
||||
| Repository | Required Reviewers |
|
||||
|------------|------------------|
|
||||
| `hermes-agent` | `@perplexity`, `@Timmy` |
|
||||
| `the-nexus` | `@perplexity` |
|
||||
| `timmy-home` | `@perplexity` |
|
||||
| `timmy-config` | `@perplexity` |
|
||||
|
||||
### CI Enforcement Status
|
||||
|
||||
| Repository | CI Status |
|
||||
|------------|-----------|
|
||||
| `hermes-agent` | ✅ Active |
|
||||
| `the-nexus` | ⚠️ CI runner pending (#915) |
|
||||
| `timmy-home` | ❌ No CI |
|
||||
| `timmy-config` | ❌ Limited CI |
|
||||
|
||||
### Review Requirements
|
||||
|
||||
- All PRs must be reviewed by at least one reviewer
|
||||
- `@perplexity` is the default reviewer for all repositories
|
||||
- `@Timmy` is a required reviewer for `hermes-agent`
|
||||
|
||||
All repositories enforce:
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Require 1 approval
|
||||
- ⚠<> Require CI to pass (CI runner pending)
|
||||
- ✅ Dismiss stale approvals on new commits
|
||||
- ✅ Block force pushes
|
||||
- ✅ Block branch deletion
|
||||
|
||||
## Review Requirements
|
||||
|
||||
- Mandatory reviewer: `@perplexity` for all repos
|
||||
- Mandatory reviewer: `@Timmy` for `hermes-agent/`
|
||||
- Optional: Add repo-specific owners for specialized areas
|
||||
|
||||
## Implementation Status
|
||||
|
||||
- ✅ hermes-agent: All protections enabled
|
||||
- ✅ the-nexus: PR + 1 approval enforced
|
||||
- ✅ timmy-home: PR + 1 approval enforced
|
||||
- ✅ timmy-config: PR + 1 approval enforced
|
||||
|
||||
> CI enforcement pending runner restoration (#915)
|
||||
|
||||
## What gets preserved from legacy Matrix
|
||||
|
||||
High-value candidates include:
|
||||
- visitor movement / embodiment
|
||||
- chat, bark, and presence systems
|
||||
- transcript logging
|
||||
- ambient / visual atmosphere systems
|
||||
- economy / satflow visualizations
|
||||
- smoke and browser validation discipline
|
||||
|
||||
Those
|
||||
```
|
||||
|
||||
README.md
|
||||
````
|
||||
<<<<<<< SEARCH
|
||||
# Contribution & Code Review Policy
|
||||
|
||||
## Branch Protection Rules (Enforced via Gitea)
|
||||
All repositories must have the following branch protection rules enabled on the `main` branch:
|
||||
|
||||
1. **Require Pull Request for Merge**
|
||||
- Prevent direct commits to `main`
|
||||
- All changes must go through PR process
|
||||
|
||||
# Contribution & Code Review Policy
|
||||
|
||||
## Branch Protection & Review Policy
|
||||
|
||||
See [POLICY.md](POLICY.md) for full branch protection rules and review requirements. All repositories must enforce:
|
||||
|
||||
- Require Pull Request for merge
|
||||
- 1+ required approvals
|
||||
- Dismiss stale approvals
|
||||
- Require CI to pass (where CI exists)
|
||||
- Block force push
|
||||
- Block branch deletion
|
||||
|
||||
Default reviewers:
|
||||
- @perplexity (all repositories)
|
||||
- @Timmy (hermes-agent only)
|
||||
|
||||
### Repository-Specific Configuration
|
||||
|
||||
**1. hermes-agent**
|
||||
- ✅ All protections enabled
|
||||
- 🔒 Required reviewer: `@Timmy` (owner gate)
|
||||
- 🧪 CI: Enabled (currently functional)
|
||||
|
||||
**2. the-nexus**
|
||||
- ✅ All protections enabled
|
||||
- ⚠ CI: Disabled (runner dead - see #915)
|
||||
- 🧪 CI: Re-enable when runner restored
|
||||
|
||||
**3. timmy-home**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: No CI configured
|
||||
|
||||
**4. timmy-config**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: Limited CI
|
||||
|
||||
### Default Reviewer Assignment
|
||||
|
||||
All repositories must:
|
||||
- 🧑 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🧑 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [x] All four repositories have protection rules applied
|
||||
- [x] Default reviewers configured per matrix above
|
||||
- [x] This policy documented in all repositories
|
||||
- [x] Policy enforced for 72 hours with no unreviewed merges
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
All repositories enforce:
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Minimum 1 approval required
|
||||
- ✅ Dismiss stale approvals on new commits
|
||||
- ⚠️ Require CI to pass (CI runner pending for the-nexus)
|
||||
- ✅ Block force push to `main`
|
||||
- ✅ Block deletion of `main` branch
|
||||
|
||||
## Review Requirement
|
||||
- 🧑 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🧑 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
## Workflow
|
||||
1. Create feature branch from `main`
|
||||
2. Submit PR with clear description
|
||||
3. Wait for @perplexity review
|
||||
4. Address feedback if any
|
||||
5. Merge after approval and passing CI
|
||||
|
||||
## CI/CD Requirements
|
||||
- All main branch merge require:
|
||||
- ✅ Linting
|
||||
- ✅ Unit tests
|
||||
- ⚠️ Integration tests (pending for the-nexus)
|
||||
- ✅ Security scans
|
||||
|
||||
## Exceptions
|
||||
- Emergency hotfixes require:
|
||||
- ✅ @Timmy approval
|
||||
- ✅ Post-merge documentation
|
||||
- ✅ Follow-up PR for full review
|
||||
|
||||
## Abandoned PRs
|
||||
- PRs inactive >7 days: 🧹 archived
|
||||
- Unreviewed PRs >14 days: ❌ closed
|
||||
|
||||
## CI Status
|
||||
- ✅ hermes-agent: CI active
|
||||
- <20>️ the-nexus: CI runner dead (see #915)
|
||||
- ✅ timmy-home: No CI
|
||||
- <20>️ timmy-config: Limited CI
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
CODEOWNERS
|
||||
```text
|
||||
<<<<<<< search
|
||||
# Contribution & Code Review Policy
|
||||
|
||||
## Branch Protection Rules
|
||||
All repositories must:
|
||||
- ✅ Require PR for merge
|
||||
- ✅ Require 1 approval
|
||||
- ✅ Dismiss stale approvals
|
||||
- ⚠️ Require CI to pass (where exists)
|
||||
- ✅ Block force push
|
||||
- ✅ block branch deletion
|
||||
|
||||
## Review Requirements
|
||||
- 🧑 Default reviewer: `@perplexity` for all repos
|
||||
- 🧑 Required reviewer: `@Timmy` for `hermes-agent/`
|
||||
|
||||
## Workflow
|
||||
1. Create feature branch from `main`
|
||||
2. Submit PR with clear description
|
||||
3. Wait for @perplexity review
|
||||
4. Address feedback if any
|
||||
5. Merge after approval and passing CI
|
||||
|
||||
## CI/CD Requirements
|
||||
- All main branch merges require:
|
||||
- ✅ Linting
|
||||
- ✅ Unit tests
|
||||
- ⚠️ Integration tests (pending for the-nexus)
|
||||
- ✅ Security scans
|
||||
|
||||
## Exceptions
|
||||
- Emergency hotfixes require:
|
||||
- ✅ @Timmy approval
|
||||
- ✅ Post-merge documentation
|
||||
- ✅ Follow-up PR for full review
|
||||
|
||||
## Abandoned PRs
|
||||
- PRs inactive >7 days: 🧹 archived
|
||||
- Unreviewed PRs >14 days: ❌ closed
|
||||
|
||||
## CI Status
|
||||
- ✅ hermes-agent: ci active
|
||||
- ⚠️ the-nexus: ci runner dead (see #915)
|
||||
- ✅ timmy-home: No ci
|
||||
- ⚠️ timmy-config: Limited ci
|
||||
Applies to every contributor: human, Timmy, Claude, Perplexity, Gemini, Kimi, Grok.
|
||||
Exception: initial dependency config files (requirements.txt, package.json).
|
||||
No other exceptions. Too big? Break it up.
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
# Contribution & Review Policy
|
||||
|
||||
## Branch Protection Rules
|
||||
|
||||
All repositories must enforce these rules on the `main` branch:
|
||||
- ✅ Pull Request Required for Merge
|
||||
- ✅ Minimum 1 Approved Review
|
||||
- ✅ CI/CD Must Pass
|
||||
- ✅ Dismiss Stale Approvals
|
||||
- ✅ Block Force Pushes
|
||||
- ✅ Block Deletion
|
||||
|
||||
## Review Requirements
|
||||
|
||||
All pull requests must:
|
||||
1. Be reviewed by @perplexity (QA gate)
|
||||
2. Be reviewed by @Timmy for hermes-agent
|
||||
3. Get at least one additional reviewer based on code area
|
||||
|
||||
## CI Requirements
|
||||
|
||||
- hermes-agent: Must pass all CI checks
|
||||
- the-nexus: CI required once runner is restored
|
||||
- timmy-home & timmy-config: No CI enforcement
|
||||
|
||||
## Enforcement
|
||||
|
||||
These rules are enforced via Gitea branch protection settings. See your repo settings > Branches for details.
|
||||
|
||||
For code-specific ownership, see .gitea/Codowners
|
||||
@@ -1,23 +0,0 @@
|
||||
# Development Workflow
|
||||
|
||||
## Branching Strategy
|
||||
- Feature branches: `feature/your-name/feature-name`
|
||||
- Hotfix branches: `hotfix/issue-number`
|
||||
- Release branches: `release/x.y.z`
|
||||
|
||||
## Local Development
|
||||
1. Clone repo: `git clone https://forge.alexanderwhitestone.com/Timmy_Foundation/the-nexus.git`
|
||||
2. Create branch: `git checkout -b feature/your-feature`
|
||||
3. Commit changes: `git commit -m "Fix: your change"`
|
||||
4. Push branch: `git push origin feature/your-feature`
|
||||
5. Create PR via Gitea UI
|
||||
|
||||
## Testing
|
||||
- Unit tests: `npm test`
|
||||
- Linting: `npm run lint`
|
||||
- CI/CD: `npm run ci`
|
||||
|
||||
## Code Quality
|
||||
- ✅ 100% test coverage
|
||||
- ✅ Prettier formatting
|
||||
- ✅ No eslint warnings
|
||||
94
POLICY.md
94
POLICY.md
@@ -1,94 +0,0 @@
|
||||
# Branch Protection & Review Policy
|
||||
|
||||
## 🛡️ Enforced Branch Protection Rules
|
||||
|
||||
All repositories must apply the following branch protection rules to the `main` branch:
|
||||
|
||||
| Rule | Setting | Rationale |
|
||||
|------|---------|-----------|
|
||||
| Require PR for merge | ✅ Required | Prevent direct pushes to `main` |
|
||||
| Required approvals | ✅ 1 approval | Ensure at least one reviewer approve before merge |
|
||||
| Dismiss stale approvals | ✅ Auto-dismiss | Require re-approval after new commits |
|
||||
| Require CI to pass | ✅ Where CI exist | Prevent merging of failing builds |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion of `main` |
|
||||
|
||||
> ⚠️ Note: CI enforcement is optional for repositories where CI is not yet configured.
|
||||
|
||||
---
|
||||
|
||||
### 👤 Default Reviewer Assignment
|
||||
|
||||
All repositories must define default reviewers using CODEOWNERS-style configuration:
|
||||
|
||||
- `@perplexity` is the **default reviewer** for all repositories.
|
||||
- `@Timmy` is a **required reviewer** for `hermes-agent`.
|
||||
- Repository-specific owners may be added for specialized areas.
|
||||
|
||||
---
|
||||
|
||||
### <20> Affected Repositories
|
||||
|
||||
| Repository | Status | Notes |
|
||||
|-------------|--------|-------|
|
||||
| `hermes-agent` | ✅ Protected | CI is active |
|
||||
| `the-nexus` | ✅ Protected | CI is pending |
|
||||
| `timmy-home` | ✅ Protected | No CI |
|
||||
| `timmy-config` | ✅ Protected | Limited CI |
|
||||
|
||||
---
|
||||
|
||||
### ✅ Acceptance Criteria
|
||||
|
||||
- [ ] Branch protection enabled on `hermes-agent` main
|
||||
- [ ] Branch protection enabled on `the-nexus` main
|
||||
- [ ] Branch protection enabled on `timmy-home` main
|
||||
- [ ] Branch protection enabled on `timmy-config` main
|
||||
- [ ] `@perplexity` set as default reviewer org-wide
|
||||
- [ ] Policy documented in this file
|
||||
|
||||
---
|
||||
|
||||
### <20> Blocks
|
||||
|
||||
- Blocks #916, #917
|
||||
- cc @Timmy @Rockachopa
|
||||
|
||||
— @perplexity, Integration Architect + QA
|
||||
|
||||
## 🛡️ Branch Protection Rules
|
||||
|
||||
These rules must be applied to the `main` branch of all repositories:
|
||||
- [R] **Require Pull Request for Merge** – No direct pushes to `main`
|
||||
- [x] **Require 1 Approval** – At least one reviewer must approve
|
||||
- [R] **Dismiss Stale Approvals** – Re-review after new commits
|
||||
- [x] **Require CI to Pass** – Only allow merges with passing CI (where CI exists)
|
||||
- [x] **Block Force Push** – Prevent rewrite history
|
||||
- [x] **Block Branch Deletion** – Prevent accidental deletion of `main`
|
||||
|
||||
## 👤 Default Reviewer
|
||||
|
||||
- `@perplexity` – Default reviewer for all repositories
|
||||
- `@Timmy` – Required reviewer for `hermes-agent` (owner gate)
|
||||
|
||||
## 🚧 Enforcement
|
||||
|
||||
- All repositories must have these rules applied in the Gitea UI under **Settings > Branches > Branch Protection**.
|
||||
- CI must be configured and enforced for repositories with CI pipelines.
|
||||
- Reviewers assignments must be set via CODEOWNERS or manually in the UI.
|
||||
|
||||
## 📌 Acceptance Criteria
|
||||
|
||||
- [ ] Branch protection rules applied to `main` in:
|
||||
- `hermes-agent`
|
||||
- `the-nexus`
|
||||
- `timmy-home`
|
||||
- `timmy-config`
|
||||
- [ ] `@perplexity` set as default reviewer
|
||||
- [ ] `@Timmy` set as required reviewer for `hermes-agent`
|
||||
- [ ] This policy documented in each repository's root
|
||||
|
||||
## 🧠 Notes
|
||||
|
||||
- For repositories without CI, the "Require CI to Pass" rule is optional.
|
||||
- This policy is versioned and must be updated as needed.
|
||||
420
README.md
420
README.md
@@ -1,135 +1,6 @@
|
||||
# Branch Protection & Review Policy
|
||||
# ◈ The Nexus — Timmy's Sovereign Home
|
||||
|
||||
## Enforced Rules for All Repositories
|
||||
|
||||
**All repositories enforce these rules on the `main` branch:**
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | <20> Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
**Default Reviewers:**
|
||||
- @perplexity (all repositories)
|
||||
- @Timmy (hermes-agent only)
|
||||
|
||||
**CI Enforcement:**
|
||||
- hermes-agent: Full CI enforcement
|
||||
- the-nexus: CI pending runner restoration (#915)
|
||||
- timmy-home: No CI enforcement
|
||||
- timmy-config: Limited CI
|
||||
|
||||
**Implementation Status:**
|
||||
- [x] hermes-agent protection enabled
|
||||
- [x] the-nexus protection enabled
|
||||
- [x] timmy-home protection enabled
|
||||
- [x] timmy-config protection enabled
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|---|---|---|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | ✅ 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ⚠ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
### Repository-Specific Configuration
|
||||
|
||||
**1. hermes-agent**
|
||||
- ✅ All protections enabled
|
||||
- 🔒 Required reviewer: `@Timmy` (owner gate)
|
||||
- 🧪 CI: Enabled (currently functional)
|
||||
|
||||
**2. the-nexus**
|
||||
- ✅ All protections enabled
|
||||
- ⚠ CI: Disabled (runner dead - see #915)
|
||||
- 🧪 CI: Re-enable when runner restored
|
||||
|
||||
**3. timmy-home**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: No CI configured
|
||||
|
||||
**4. timmy-config**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: Limited CI
|
||||
|
||||
### Default Reviewer Assignment
|
||||
|
||||
All repositories must:
|
||||
- 🧑 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🧑 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] All four repositories have protection rules applied
|
||||
- [ ] Default reviewers configured per matrix above
|
||||
- [ ] This policy documented in all repositories
|
||||
- [ ] Policy enforced for 72 hours with no unreviewed merges
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Require 1 approval
|
||||
- ✅ Dismiss stale approvals
|
||||
- ✅ Require CI to pass (where ci exists)
|
||||
- ✅ Block force pushes
|
||||
- ✅ block branch deletion
|
||||
|
||||
### Default Reviewers
|
||||
- @perplexity - All repositories (QA gate)
|
||||
- @Timmy - hermes-agent (owner gate)
|
||||
|
||||
### Implementation Status
|
||||
- [x] hermes-agent
|
||||
- [x] the-nexus
|
||||
- [x] timmy-home
|
||||
- [x] timmy-config
|
||||
|
||||
### CI Status
|
||||
- hermes-agent: ✅ ci enabled
|
||||
- the-nexus: ⚠ ci pending (#915)
|
||||
- timmy-home: ❌ No ci
|
||||
- timmy-config: ❌ No ci
|
||||
| Require PR for merge | ✅ Enabled | hermes-agent, the-nexus, timmy-home, timmy-config |
|
||||
| Required approvals | ✅ 1+ required | All |
|
||||
| Dismiss stale approvals | ✅ Enabled | All |
|
||||
| Require CI to pass | ✅ Where CI exists | hermes-agent (CI active), the-nexus (CI pending) |
|
||||
| Block force push | ✅ Enabled | All |
|
||||
| Block branch deletion | ✅ Enabled | All |
|
||||
|
||||
## Default Reviewer Assignments
|
||||
|
||||
- **@perplexity**: Default reviewer for all repositories (QA gate)
|
||||
- **@Timmy**: Required reviewer for `hermes-agent` (owner gate)
|
||||
- **Repo-specific owners**: Required for specialized areas
|
||||
|
||||
## CI Status
|
||||
|
||||
- ✅ Active: hermes-agent
|
||||
- ⚠️ Pending: the-nexus (#915)
|
||||
- ❌ Disabled: timmy-home, timmy-config
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [x] Branch protection enabled on all repos
|
||||
- [x] @perplexity set as default reviewer
|
||||
- [ ] CI restored for the-nexus (#915)
|
||||
- [x] Policy documented here
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
1. All direct pushes to `main` are now blocked
|
||||
2. Merges require at least 1 approval
|
||||
3. CI failures block merges where CI is active
|
||||
4. Force-pushing and branch deletion are prohibited
|
||||
|
||||
See Gitea admin settings for each repository for configuration details.
|
||||
The Nexus is Timmy's canonical 3D/home-world repo.
|
||||
|
||||
It is meant to become two things at once:
|
||||
- a local-first training ground for Timmy
|
||||
@@ -216,21 +87,6 @@ Those pieces should be carried forward only if they serve the mission and are re
|
||||
There is no root browser app on current `main`.
|
||||
Do not tell people to static-serve the repo root and expect a world.
|
||||
|
||||
### Branch Protection & Review Policy
|
||||
|
||||
**All repositories enforce:**
|
||||
- PRs required for all changes
|
||||
- Minimum 1 approval required
|
||||
- CI/CD must pass
|
||||
- No force pushes
|
||||
- No direct pushes to main
|
||||
|
||||
**Default reviewers:**
|
||||
- `@perplexity` for all repositories
|
||||
- `@Timmy` for nexus/ and hermes-agent/
|
||||
|
||||
**Enforced by Gitea branch protection rules**
|
||||
|
||||
### What you can run now
|
||||
|
||||
- `python3 server.py` for the local websocket bridge
|
||||
@@ -243,275 +99,3 @@ The browser-facing Nexus must be rebuilt deliberately through the migration back
|
||||
---
|
||||
|
||||
*One 3D repo. One migration path. No more ghost worlds.*
|
||||
# The Nexus Project
|
||||
|
||||
## Branch Protection & Review Policy
|
||||
|
||||
**All repositories enforce these rules on the `main` branch:**
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | <20> Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
**Default Reviewers:**
|
||||
- @perplexity (all repositories)
|
||||
- @Timmy (hermes-agent only)
|
||||
|
||||
**CI Enforcement:**
|
||||
- hermes-agent: Full CI enforcement
|
||||
- the-nexus: CI pending runner restoration (#915)
|
||||
- timmy-home: No CI enforcement
|
||||
- timmy-config: Limited CI
|
||||
|
||||
**Acceptance Criteria:**
|
||||
- [x] Branch protection enabled on all repos
|
||||
- [x] @perplexity set as default reviewer
|
||||
- [x] Policy documented here
|
||||
- [x] CI restored for the-nexus (#915)
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
## Branch Protection Policy
|
||||
|
||||
**All repositories enforce these rules on the `main` branch:**
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ⚠ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
**Default Reviewers:**
|
||||
- @perplexity (all repositories)
|
||||
- @Timmy (hermes-agent only)
|
||||
|
||||
**CI Enforcement:**
|
||||
- hermes-agent: Full CI enforcement
|
||||
- the-nexus: CI pending runner restoration (#915)
|
||||
- timmy-home: No CI enforcement
|
||||
- timmy-config: Limited ci
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for full details.
|
||||
|
||||
## Branch Protection & Review Policy
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for full details on our enforced branch protection rules and code review requirements.
|
||||
|
||||
Key protections:
|
||||
- All changes require PRs with 1+ approvals
|
||||
- @perplexity is default reviewer for all repos
|
||||
- @Timmy is required reviewer for hermes-agent
|
||||
- CI must pass before merge (where ci exists)
|
||||
- Force pushes and branch deletions blocked
|
||||
|
||||
Current status:
|
||||
- ✅ hermes-agent: All protections active
|
||||
- ⚠ the-nexus: CI runner dead (#915)
|
||||
- ✅ timmy-home: No ci
|
||||
- ✅ timmy-config: Limited ci
|
||||
|
||||
## Branch Protection & Mandatory Review Policy
|
||||
|
||||
All repositories enforce these rules on the `main` branch:
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|---|---|---|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | ✅ 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ⚠ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
### Repository-Specific Configuration
|
||||
|
||||
**1. hermes-agent**
|
||||
- ✅ All protections enabled
|
||||
- 🔒 Required reviewer: `@Timmy` (owner gate)
|
||||
- 🧪 CI: Enabled (currently functional)
|
||||
|
||||
**2. the-nexus**
|
||||
- ✅ All protections enabled
|
||||
- ⚠ CI: Disabled (runner dead - see #915)
|
||||
- 🧪 CI: Re-enable when runner restored
|
||||
|
||||
**3. timmy-home**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: No CI configured
|
||||
|
||||
**4. timmy-config**
|
||||
- ✅ PR + 1 approval required
|
||||
- 🧪 CI: Limited CI
|
||||
|
||||
### Default Reviewer Assignment
|
||||
|
||||
All repositories must:
|
||||
- 🧠 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🧠 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [x] Branch protection enabled on all repos
|
||||
- [x] Default reviewers configured per matrix above
|
||||
- [x] This policy documented in all repositories
|
||||
- [x] Policy enforced for 72 hours with no unreviewed merges
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
## Branch Protection & Mandatory Review Policy
|
||||
|
||||
All repositories must enforce these rules on the `main` branch:
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|------|--------|-----------|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct pushes |
|
||||
| Required approvals | ✅ 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ✅ Conditional | Only where CI exists |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
### Default Reviewer Assignment
|
||||
|
||||
All repositories must:
|
||||
- 🧠 Default reviewer: `@perplexity` (QA gate)
|
||||
- 🔐 Required reviewer: `@Timmy` for `hermes-agent/` only
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [x] Enable branch protection on `hermes-agent` main
|
||||
- [x] Enable branch protection on `the-nexus` main
|
||||
- [x] Enable branch protection on `timmy-home` main
|
||||
- [x] Enable branch protection on `timmy-config` main
|
||||
- [x] Set `@perplexity` as default reviewer org-wide
|
||||
- [x] Document policy in org README
|
||||
|
||||
> This policy replaces all previous ad-hoc workflows. Any exceptions require written approval from @Timmy and @perplexity.
|
||||
|
||||
## Branch Protection Policy
|
||||
|
||||
We enforce the following rules on all main branches:
|
||||
- Require PR for merge
|
||||
- Minimum 1 approval required
|
||||
- CI must pass before merge
|
||||
- @perplexity is automatically assigned as reviewer
|
||||
- @Timmy is required reviewer for hermes-agent
|
||||
|
||||
See full policy in [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
||||
## Code Owners
|
||||
|
||||
Review assignments are automated using [.github/CODEOWNERS](.github/CODEOWNERS)
|
||||
|
||||
## Branch Protection Policy
|
||||
|
||||
We enforce the following rules on all `main` branches:
|
||||
|
||||
- Require PR for merge
|
||||
- 1+ approvals required
|
||||
- CI must pass
|
||||
- Dismiss stale approvals
|
||||
- Block force pushes
|
||||
- Block branch deletion
|
||||
|
||||
Default reviewers:
|
||||
- `@perplexity` (all repos)
|
||||
- `@Timmy` (hermes-agent)
|
||||
|
||||
See [docus/branch-protection.md](docus/branch-protection.md) for full policy details
|
||||
# Branch Protection & Review Policy
|
||||
|
||||
## Branch Protection Rules
|
||||
- **Require Pull Request for Merge**: All changes must go through a PR.
|
||||
- **Required Approvals**: At least one approval is required.
|
||||
- **Dismiss Stale Approvals**: Approvals are dismissed on new commits.
|
||||
- **Require CI to Pass**: CI must pass before merging (enabled where CI exists).
|
||||
- **Block Force Push**: Prevents force-pushing to `main`.
|
||||
- **Block Deletion**: Prevents deletion of the `main` branch.
|
||||
|
||||
## Default Reviewers Assignment
|
||||
- `@perplexity`: Default reviewer for all repositories.
|
||||
- `@Timmy`: Required reviewer for `hermes-agent` (owner gate).
|
||||
- Repo-specific owners for specialized areas.
|
||||
# Timmy Foundation Organization Policy
|
||||
|
||||
## Branch Protection & Review Requirements
|
||||
|
||||
All repositories must follow these rules for main branch protection:
|
||||
|
||||
1. **Require Pull Request for Merge** - All changes must go through PR process
|
||||
2. **Minimum 1 Approval Required** - At least one reviewer must approve
|
||||
3. **Dismiss Stale Approvals** - Approvals expire with new commits
|
||||
4. **Require CI Success** - For hermes-agent only (CI runner #915)
|
||||
5. **Block Force Push** - Prevent direct history rewriting
|
||||
6. **Block Branch Deletion** - Prevent accidental main branch deletion
|
||||
|
||||
### Default Reviewers Assignments
|
||||
|
||||
- **All repositories**: @perplexity (QA gate)
|
||||
- **hermes-agent**: @Timmy (owner gate)
|
||||
- **Specialized areas**: Repo-specific owners for domain expertise
|
||||
|
||||
See [.github/CODEOWNERS](.github/CODEOWNERS) for specific file path review assignments.
|
||||
# Branch Protection & Review Policy
|
||||
|
||||
## Branch Protection Rules
|
||||
|
||||
All repositories must enforce these rules on the `main` branch:
|
||||
|
||||
| Rule | Status | Rationale |
|
||||
|---|---|---|
|
||||
| Require PR for merge | ✅ Enabled | Prevent direct commits |
|
||||
| Required approvals | 1+ | Minimum review threshold |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ✅ Where CI exists | No merging failing builds |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental deletion |
|
||||
|
||||
## Default Reviewers Assignment
|
||||
|
||||
- **All repositories**: @perplexity (QA gate)
|
||||
- **hermes-agent**: @Timmy (owner gate)
|
||||
- **Specialized areas owners**: Repo-specific owners for domain expertise
|
||||
|
||||
## CI Enforcement
|
||||
|
||||
- CI must pass before merge (where CI is active)
|
||||
- CI runners must be maintained and monitored
|
||||
|
||||
## Compliance
|
||||
|
||||
- [x] hermes-agent
|
||||
- [x] the-nexus
|
||||
- [x] timmy-home
|
||||
- [x] timmy-config
|
||||
|
||||
Last updated: 2026-04-07
|
||||
## Branch Protection & Review Policy
|
||||
|
||||
**All repositories enforce the following rules on the `main` branch:**
|
||||
|
||||
- ✅ Require Pull Request for merge
|
||||
- ✅ Require 1 approval
|
||||
- ✅ Dismiss stale approvals
|
||||
- ⚠️ Require CI to pass (CI runner dead - see #915)
|
||||
- ✅ Block force pushes
|
||||
- ✅ Block branch deletion
|
||||
|
||||
**Default Reviewer:**
|
||||
- @perplexity (all repositories)
|
||||
- @Timmy (hermes-agent only)
|
||||
|
||||
**CI Requirements:**
|
||||
- hermes-agent: Full CI enforcement
|
||||
- the-nexus: CI pending runner restoration
|
||||
- timmy-home: No CI enforcement
|
||||
- timmy-config: No CI enforcement
|
||||
|
||||
7
app.js
7
app.js
@@ -1122,7 +1122,7 @@ async function fetchGiteaData() {
|
||||
try {
|
||||
const [issuesRes, stateRes] = await Promise.all([
|
||||
fetch('https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/the-nexus/issues?state=all&limit=20'),
|
||||
fetch('https://forge.alexanderwhitestone.com/api/v1/repos/timmy_Foundation/the-nexus/contents/vision.json')
|
||||
fetch('https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/the-nexus/contents/vision.json')
|
||||
]);
|
||||
|
||||
if (issuesRes.ok) {
|
||||
@@ -2716,9 +2716,4 @@ init().then(() => {
|
||||
createPortalTunnel();
|
||||
fetchGiteaData();
|
||||
setInterval(fetchGiteaData, 30000);
|
||||
|
||||
// Register service worker for PWA
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/service-worker.js');
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,463 +0,0 @@
|
||||
# Formalization Audit Report
|
||||
|
||||
**Date:** 2026-04-06
|
||||
**Auditor:** Allegro (subagent)
|
||||
**Scope:** All homebrew components on VPS 167.99.126.228
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
This system runs a fleet of 5 Hermes AI agents (allegro, adagio, ezra, bezalel, bilbobagginshire) alongside supporting infrastructure (Gitea, Nostr relay, Evennia MUD, Ollama). The deployment is functional but heavily ad-hoc — characterized by one-off systemd units, scattered scripts, bare `docker run` containers with no compose file, and custom glue code where standard tooling exists.
|
||||
|
||||
**Priority recommendations:**
|
||||
1. **Consolidate fleet deployment** into docker-compose (HIGH impact, MEDIUM effort)
|
||||
2. **Clean up burn scripts** — archive or delete (HIGH impact, LOW effort)
|
||||
3. **Add docker-compose for Gitea + strfry** (MEDIUM impact, LOW effort)
|
||||
4. **Formalize the webhook receiver** into the hermes-agent repo (MEDIUM impact, LOW effort)
|
||||
5. **Recover or rewrite GOFAI source files** — only .pyc remain (HIGH urgency)
|
||||
|
||||
---
|
||||
|
||||
## 1. Gitea Webhook Receiver
|
||||
|
||||
**File:** `/root/wizards/allegro/gitea_webhook_receiver.py` (327 lines)
|
||||
**Service:** `allegro-gitea-webhook.service`
|
||||
|
||||
### Current State
|
||||
Custom aiohttp server that:
|
||||
- Listens on port 8670 for Gitea webhook events
|
||||
- Verifies HMAC-SHA256 signatures
|
||||
- Filters for @allegro mentions and issue assignments
|
||||
- Forwards to Hermes API (OpenAI-compatible endpoint)
|
||||
- Posts response back as Gitea comment
|
||||
- Includes health check, event logging, async fire-and-forget processing
|
||||
|
||||
Quality: **Solid.** Clean async code, proper signature verification, sensible error handling, daily log rotation. Well-structured for a single-file service.
|
||||
|
||||
### OSS Alternatives
|
||||
- **Adnanh/webhook** (Go, 10k+ stars) — generic webhook receiver, but would need custom scripting anyway
|
||||
- **Flask/FastAPI webhook blueprints** — would be roughly equivalent effort
|
||||
- **Gitea built-in webhooks + Woodpecker CI** — different architecture (push-based CI vs. agent interaction)
|
||||
|
||||
### Recommendation: **KEEP, but formalize**
|
||||
The webhook logic is Allegro-specific (mention detection, Hermes API forwarding, comment posting). No off-the-shelf tool replaces this without equal or more glue code. However:
|
||||
- Move into the hermes-agent repo as a plugin/skill
|
||||
- Make it configurable for any wizard name (not just "allegro")
|
||||
- Add to docker-compose instead of standalone systemd unit
|
||||
|
||||
**Effort:** 2-4 hours
|
||||
|
||||
---
|
||||
|
||||
## 2. Nostr Relay + Bridge
|
||||
|
||||
### Relay (strfry + custom timmy-relay)
|
||||
|
||||
**Running:** Two relay implementations in parallel
|
||||
1. **strfry** Docker container (port 7777) — standard relay, healthy, community-maintained
|
||||
2. **timmy-relay** Go binary (port 2929) — custom NIP-29 relay built on `relay29`/`khatru29`
|
||||
|
||||
The custom relay (`main.go`, 108 lines) is a thin wrapper around `fiatjaf/relay29` with:
|
||||
- NIP-29 group support (admin/mod roles)
|
||||
- LMDB persistent storage
|
||||
- Allowlisted event kinds
|
||||
- Anti-spam policies (tag limits, timestamp guards)
|
||||
|
||||
### Bridge (dm_bridge_mvp)
|
||||
|
||||
**Service:** `nostr-bridge.service`
|
||||
**Status:** Running but **source file deleted** — only `.pyc` cache remains at `/root/nostr-relay/__pycache__/dm_bridge_mvp.cpython-312.pyc`
|
||||
|
||||
From decompiled structure, the bridge:
|
||||
- Reads DMs from Nostr relay
|
||||
- Parses commands from DMs
|
||||
- Creates Gitea issues/comments via API
|
||||
- Polls for new DMs in a loop
|
||||
- Uses keystore.json for identity management
|
||||
|
||||
**CRITICAL:** Source code is gone. If the service restarts on a Python update (new .pyc format), this component dies.
|
||||
|
||||
### OSS Alternatives
|
||||
- **strfry:** Already using it. Good choice, well-maintained.
|
||||
- **relay29:** Already using it. Correct choice for NIP-29 groups.
|
||||
- **nostr-tools / rust-nostr SDKs** for bridge — but bridge logic is custom regardless
|
||||
|
||||
### Recommendation: **KEEP relay, RECOVER bridge**
|
||||
- The relay setup (relay29 custom binary + strfry) is appropriate
|
||||
- **URGENT:** Decompile dm_bridge_mvp.pyc and reconstruct source before it's lost
|
||||
- Consider whether strfry (port 7777) is still needed alongside timmy-relay (port 2929) — possible to consolidate
|
||||
- Move bridge into its own git repo on Gitea
|
||||
|
||||
**Effort:** 4-6 hours (bridge recovery), 1 hour (strfry consolidation assessment)
|
||||
|
||||
---
|
||||
|
||||
## 3. Evennia / Timmy Academy
|
||||
|
||||
**Path:** `/root/workspace/timmy-academy/`
|
||||
**Components:**
|
||||
|
||||
| Component | File | Custom? | Lines |
|
||||
|-----------|------|---------|-------|
|
||||
| AuditedCharacter | typeclasses/audited_character.py | Yes | 110 |
|
||||
| Custom Commands | commands/command.py | Yes | 368 |
|
||||
| Audit Dashboard | web/audit/ (views, api, templates) | Yes | ~250 |
|
||||
| Object typeclass | typeclasses/objects.py | Stock (untouched) | 218 |
|
||||
| Room typeclass | typeclasses/rooms.py | Minimal | ~15 |
|
||||
| Exit typeclass | typeclasses/exits.py | Minimal | ~15 |
|
||||
| Account typeclass | typeclasses/accounts.py | Custom (157 lines) | 157 |
|
||||
| Channel typeclass | typeclasses/channels.py | Custom | ~160 |
|
||||
| Scripts | typeclasses/scripts.py | Custom | ~130 |
|
||||
| World builder | world/ | Custom | Unknown |
|
||||
|
||||
### Custom vs Stock Analysis
|
||||
- **objects.py** — Stock Evennia template with no modifications. Safe to delete and use defaults.
|
||||
- **audited_character.py** — Fully custom. Tracks movement, commands, session time, generates audit summaries. Clean code.
|
||||
- **commands/command.py** — 7 custom commands (examine, rooms, status, map, academy, smell, listen). All game-specific. Quality is good — uses Evennia patterns correctly.
|
||||
- **web/audit/** — Custom Django views and templates for an audit dashboard (character detail, command logs, movement logs, session logs). Functional but simple.
|
||||
- **accounts.py, channels.py, scripts.py** — Custom but follow Evennia patterns. Mainly enhanced with audit hooks.
|
||||
|
||||
### OSS Alternatives
|
||||
Evennia IS the OSS framework. The customizations are all game-specific content, which is exactly how Evennia is designed to be used.
|
||||
|
||||
### Recommendation: **KEEP as-is**
|
||||
This is a well-structured Evennia game. The customizations are appropriate and follow Evennia best practices. No formalization needed — it's already a proper project in a git repo.
|
||||
|
||||
Minor improvements:
|
||||
- Remove the `{e})` empty file in root (appears to be a typo artifact)
|
||||
- The audit dashboard could use authentication guards
|
||||
|
||||
**Effort:** 0 (already formalized)
|
||||
|
||||
---
|
||||
|
||||
## 4. Burn Scripts (`/root/burn_*.py`)
|
||||
|
||||
**Count:** 39 scripts
|
||||
**Total lines:** 2,898
|
||||
**Date range:** All from April 5, 2026 (one day)
|
||||
|
||||
### Current State
|
||||
These are one-off Gitea API query scripts. Examples:
|
||||
- `burn_sitrep.py` — fetch issue details from Gitea
|
||||
- `burn_comments.py` — fetch issue comments
|
||||
- `burn_fetch_issues.py` — list open issues
|
||||
- `burn_execute.py` — perform actions on issues
|
||||
- `burn_mode_query.py` — query specific issue data
|
||||
|
||||
All follow the same pattern:
|
||||
1. Load token from `/root/.gitea_token`
|
||||
2. Define `api_get(path)` helper
|
||||
3. Hit specific Gitea API endpoints
|
||||
4. Print JSON results
|
||||
|
||||
They share ~80% identical boilerplate. Most appear to be iterative debugging scripts (burn_discover.py, burn_discover2.py; burn_fetch_issues.py, burn_fetch_issues2.py).
|
||||
|
||||
### OSS Alternatives
|
||||
- **Gitea CLI (`tea`)** — official Gitea CLI tool, does everything these scripts do
|
||||
- **python-gitea** — Python SDK for Gitea API
|
||||
- **httpie / curl** — for one-off queries
|
||||
|
||||
### Recommendation: **DELETE or ARCHIVE**
|
||||
These are debugging artifacts, not production code. They:
|
||||
- Duplicate functionality already in the webhook receiver and hermes-agent tools
|
||||
- Contain hardcoded issue numbers and old API URLs (`143.198.27.163:3000` vs current `forge.alexanderwhitestone.com`)
|
||||
- Have numbered variants showing iterative debugging (not versioned)
|
||||
|
||||
Action:
|
||||
1. `mkdir /root/archive && mv /root/burn_*.py /root/archive/`
|
||||
2. If any utility is still needed, extract it into the hermes-agent's `tools/gitea_client.py` which already exists
|
||||
3. Install `tea` CLI for ad-hoc Gitea queries
|
||||
|
||||
**Effort:** 30 minutes
|
||||
|
||||
---
|
||||
|
||||
## 5. Heartbeat Daemon
|
||||
|
||||
**Files:**
|
||||
- `/root/wizards/allegro/home/skills/devops/hybrid-autonomous-production/templates/heartbeat_daemon.py` (321 lines)
|
||||
- `/root/wizards/allegro/household-snapshots/scripts/template_checkpoint_heartbeat.py` (155 lines)
|
||||
- Various per-wizard heartbeat scripts
|
||||
|
||||
### Current State
|
||||
|
||||
Two distinct heartbeat patterns:
|
||||
|
||||
**A) Production Heartbeat Daemon (321 lines)**
|
||||
Full autonomous operations script:
|
||||
- Health checks (Gitea, Nostr relay, Hermes services)
|
||||
- Dynamic repo discovery
|
||||
- Automated triage (comments on unlabeled issues)
|
||||
- PR merge automation
|
||||
- Logged to `/root/allegro/heartbeat_logs/`
|
||||
- Designed to run every 15 minutes via cron
|
||||
|
||||
Quality: **Good for a prototype.** Well-structured phases, logging, error handling. But runs as root, uses urllib directly, has hardcoded org name.
|
||||
|
||||
**B) Checkpoint Heartbeat Template (155 lines)**
|
||||
State backup script:
|
||||
- Syncs wizard home dirs to git repos
|
||||
- Auto-commits and pushes to Gitea
|
||||
- Template pattern (copy and customize per wizard)
|
||||
|
||||
### OSS Alternatives
|
||||
- **For health checks:** Uptime Kuma, Healthchecks.io, Monit
|
||||
- **For PR automation:** Renovate, Dependabot, Mergify (but these are SaaS/different scope)
|
||||
- **For backups:** restic, borgbackup, git-backup tools
|
||||
- **For scheduling:** systemd timers (already used), or cron
|
||||
|
||||
### Recommendation: **FORMALIZE into proper systemd timer + package**
|
||||
- Create a proper `timmy-heartbeat` Python package with:
|
||||
- `heartbeat.health` — infrastructure health checks
|
||||
- `heartbeat.triage` — issue triage automation
|
||||
- `heartbeat.checkpoint` — state backup
|
||||
- Install as a systemd timer (not cron) with proper unit files
|
||||
- Use the existing `tools/gitea_client.py` from hermes-agent instead of duplicating urllib code
|
||||
- Add alerting (webhook to Telegram/Nostr on failures)
|
||||
|
||||
**Effort:** 4-6 hours
|
||||
|
||||
---
|
||||
|
||||
## 6. GOFAI System
|
||||
|
||||
**Path:** `/root/wizards/allegro/gofai/`
|
||||
|
||||
### Current State: CRITICAL — SOURCE FILES MISSING
|
||||
|
||||
The `gofai/` directory contains:
|
||||
- `tests/test_gofai.py` (790 lines, 20+ test cases) — **exists**
|
||||
- `tests/test_knowledge_graph.py` (14k chars) — **exists**
|
||||
- `__pycache__/*.cpython-312.pyc` — cached bytecode for 4 modules
|
||||
- **NO .py source files** for the actual modules
|
||||
|
||||
The `.pyc` files reveal the following modules were deleted but cached:
|
||||
|
||||
| Module | Classes/Functions | Purpose |
|
||||
|--------|------------------|---------|
|
||||
| `schema.py` | FleetSchema, Wizard, Task, TaskStatus, EntityType, Relationship, Principle, Entity, get_fleet_schema | Pydantic/dataclass models for fleet knowledge |
|
||||
| `rule_engine.py` | RuleEngine, Rule, RuleContext, ActionType, create_child_rule_engine | Forward-chaining rule engine with SOUL.md integration |
|
||||
| `knowledge_graph.py` | KnowledgeGraph, FleetKnowledgeBase, Node, Edge, JsonGraphStore, SQLiteGraphStore | Property graph with JSON and SQLite persistence |
|
||||
| `child_assistant.py` | ChildAssistant, Decision | Decision support for child wizards (can_i_do_this, who_is_my_family, etc.) |
|
||||
|
||||
Git history shows: `feat(gofai): add SQLite persistence layer to KnowledgeGraph` — so this was an active development.
|
||||
|
||||
### Maturity Assessment (from .pyc + tests)
|
||||
- **Rule Engine:** Basic forward-chaining with keyword matching. Has predefined child safety and fleet coordination rules. ~15 rules. Functional but simple.
|
||||
- **Knowledge Graph:** Property graph with CRUD, path finding, lineage tracking, GraphViz export. JSON + SQLite backends. Reasonably mature.
|
||||
- **Schema:** Pydantic/dataclass models. Standard data modeling.
|
||||
- **Child Assistant:** Interactive decision helper. Novel concept for wizard hierarchy.
|
||||
- **Tests:** Comprehensive (790 lines). This was being actively developed and tested.
|
||||
|
||||
### OSS Alternatives
|
||||
- **Rule engines:** Durable Rules, PyKnow/Experta, business-rules
|
||||
- **Knowledge graphs:** NetworkX (simpler), Neo4j (overkill), RDFlib
|
||||
- **Schema:** Pydantic (already used)
|
||||
|
||||
### Recommendation: **RECOVER and FORMALIZE**
|
||||
1. **URGENT:** Recover source from git history: `git show <commit>:gofai/schema.py` etc.
|
||||
2. Package as `timmy-gofai` with proper `pyproject.toml`
|
||||
3. The concept is novel enough to keep — fleet coordination via deterministic rules + knowledge graph is genuinely useful
|
||||
4. Consider using NetworkX for graph backend instead of custom implementation
|
||||
5. Push to its own Gitea repo
|
||||
|
||||
**Effort:** 2-4 hours (recovery from git), 4-6 hours (formalization)
|
||||
|
||||
---
|
||||
|
||||
## 7. Hermes Agent (Claude Code / Hermes)
|
||||
|
||||
**Path:** `/root/wizards/allegro/hermes-agent/`
|
||||
**Origin:** `https://github.com/NousResearch/hermes-agent.git` (MIT license)
|
||||
**Version:** 0.5.0
|
||||
**Size:** ~26,000 lines of Python (top-level only), massive codebase
|
||||
|
||||
### Current State
|
||||
This is an upstream open-source project (NousResearch/hermes-agent) with local modifications. Key components:
|
||||
- `run_agent.py` — 8,548 lines (!) — main agent loop
|
||||
- `cli.py` — 7,691 lines — interactive CLI
|
||||
- `hermes_state.py` — 1,623 lines — state management
|
||||
- `gateway/` — HTTP API gateway for each wizard
|
||||
- `tools/` — 15+ tool modules (gitea_client, memory, image_generation, MCP, etc.)
|
||||
- `skills/` — 29 skill directories
|
||||
- `prose/` — document generation engine
|
||||
- Custom profiles per wizard
|
||||
|
||||
### OSS Duplication Analysis
|
||||
| Component | Duplicates | Alternative |
|
||||
|-----------|-----------|-------------|
|
||||
| `tools/gitea_client.py` | Custom Gitea API wrapper | python-gitea, PyGitea |
|
||||
| `tools/web_research_env.py` | Custom web search | Already uses exa-py, firecrawl |
|
||||
| `tools/memory_tool.py` | Custom memory/RAG | Honcho (already optional dep) |
|
||||
| `tools/code_execution_tool.py` | Custom code sandbox | E2B, Modal (already optional dep) |
|
||||
| `gateway/` | Custom HTTP API | FastAPI app (reasonable) |
|
||||
| `trajectory_compressor.py` | Custom context compression | LangChain summarizers, LlamaIndex |
|
||||
|
||||
### Recommendation: **KEEP — it IS the OSS project**
|
||||
Hermes-agent is itself an open-source project. The right approach is:
|
||||
- Keep upstream sync working (both `origin` and `gitea` remotes configured)
|
||||
- Don't duplicate the gitea_client into burn scripts or heartbeat daemons — use the one in tools/
|
||||
- Monitor for upstream improvements to tools that are currently custom
|
||||
- The 8.5k-line run_agent.py is a concern for maintainability — but that's an upstream issue
|
||||
|
||||
**Effort:** 0 (ongoing maintenance)
|
||||
|
||||
---
|
||||
|
||||
## 8. Fleet Deployment
|
||||
|
||||
### Current State
|
||||
Each wizard runs as a separate systemd service:
|
||||
- `hermes-allegro.service` — WorkingDir at allegro's hermes-agent
|
||||
- `hermes-adagio.service` — WorkingDir at adagio's hermes-agent
|
||||
- `hermes-ezra.service` — WorkingDir at ezra's (uses allegro's hermes-agent origin)
|
||||
- `hermes-bezalel.service` — WorkingDir at bezalel's
|
||||
|
||||
Each has its own:
|
||||
- Copy of hermes-agent (or symlink/clone)
|
||||
- .venv (separate Python virtual environment)
|
||||
- home/ directory with SOUL.md, .env, memories, skills
|
||||
- EnvironmentFile pointing to per-wizard .env
|
||||
|
||||
Docker containers (not managed by compose):
|
||||
- `gitea` — bare `docker run`
|
||||
- `strfry` — bare `docker run`
|
||||
|
||||
### Issues
|
||||
1. **No docker-compose.yml** — containers were created with `docker run` and survive via restart policy
|
||||
2. **Duplicate venvs** — each wizard has its own .venv (~500MB each = 2.5GB+)
|
||||
3. **Inconsistent origins** — ezra's hermes-agent origin points to allegro's local copy, not git
|
||||
4. **No fleet-wide deployment tool** — updates require manual per-wizard action
|
||||
5. **All run as root**
|
||||
|
||||
### OSS Alternatives
|
||||
| Tool | Fit | Complexity |
|
||||
|------|-----|-----------|
|
||||
| docker-compose | Good — defines Gitea, strfry, and could define agents | Low |
|
||||
| k3s | Overkill for 5 agents on 1 VPS | High |
|
||||
| Podman pods | Similar to compose, rootless possible | Medium |
|
||||
| Ansible | Good for fleet management across VPSes | Medium |
|
||||
| systemd-nspawn | Lightweight containers | Medium |
|
||||
|
||||
### Recommendation: **ADD docker-compose for infrastructure, KEEP systemd for agents**
|
||||
1. Create `/root/docker-compose.yml` for Gitea + strfry + Ollama(optional)
|
||||
2. Keep wizard agents as systemd services (they need filesystem access, tool execution, etc.)
|
||||
3. Create a fleet management script: `fleet.sh {start|stop|restart|status|update} [wizard]`
|
||||
4. Share a single hermes-agent checkout with per-wizard config (not 5 copies)
|
||||
5. Long term: consider running agents in containers too (requires volume mounts for home/)
|
||||
|
||||
**Effort:** 4-6 hours (docker-compose + fleet script)
|
||||
|
||||
---
|
||||
|
||||
## 9. Nostr Key Management
|
||||
|
||||
**File:** `/root/nostr-relay/keystore.json`
|
||||
|
||||
### Current State
|
||||
Plain JSON file containing nsec (private keys), npub (public keys), and hex equivalents for:
|
||||
- relay
|
||||
- allegro
|
||||
- ezra
|
||||
- alexander (with placeholder "ALEXANDER_CONTROLS_HIS_OWN" for secret)
|
||||
|
||||
The keystore is:
|
||||
- World-readable (`-rw-r--r--`)
|
||||
- Contains private keys in cleartext
|
||||
- No encryption
|
||||
- No rotation mechanism
|
||||
- Used by bridge and relay scripts via direct JSON loading
|
||||
|
||||
### OSS Alternatives
|
||||
- **SOPS (Mozilla)** — encrypted secrets in version control
|
||||
- **age encryption** — simple file encryption
|
||||
- **Vault (HashiCorp)** — overkill for this scale
|
||||
- **systemd credentials** — built into systemd 250+
|
||||
- **NIP-49 encrypted nsec** — Nostr-native key encryption
|
||||
- **Pass / gopass** — Unix password manager
|
||||
|
||||
### Recommendation: **FORMALIZE with minimal encryption**
|
||||
1. `chmod 600 /root/nostr-relay/keystore.json` — **immediate** (5 seconds)
|
||||
2. Move secrets to per-service EnvironmentFiles (already pattern used for .env)
|
||||
3. Consider NIP-49 (password-encrypted nsec) for the keystore
|
||||
4. Remove the relay private key from the systemd unit file (currently in plaintext in the `[Service]` section!)
|
||||
5. Never commit keystore.json to git (check .gitignore)
|
||||
|
||||
**Effort:** 1-2 hours
|
||||
|
||||
---
|
||||
|
||||
## 10. Ollama Setup and Model Management
|
||||
|
||||
### Current State
|
||||
- **Service:** `ollama.service` — standard systemd unit, running as `ollama` user
|
||||
- **Binary:** `/usr/local/bin/ollama` — standard install
|
||||
- **Models:** Only `qwen3:4b` (2.5GB) currently loaded
|
||||
- **Guard:** `/root/wizards/scripts/ollama_guard.py` — custom 55-line script that blocks models >5GB
|
||||
- **Port:** 11434 (default, localhost only)
|
||||
|
||||
### Assessment
|
||||
The Ollama setup is essentially stock. The only custom component is `ollama_guard.py`, which is a clever but fragile size guard that:
|
||||
- Checks local model size before pulling
|
||||
- Blocks downloads >5GB to protect the VPS
|
||||
- Designed to be symlinked ahead of real `ollama` in PATH
|
||||
|
||||
However: it's not actually deployed as a PATH override (real `ollama` is at `/usr/local/bin/ollama`, guard is in `/root/wizards/scripts/`).
|
||||
|
||||
### OSS Alternatives
|
||||
- **Ollama itself** is the standard. No alternative needed.
|
||||
- **For model management:** LiteLLM proxy, OpenRouter (for offloading large models)
|
||||
- **For guards:** Ollama has `OLLAMA_MAX_MODEL_SIZE` env var (check if available in current version)
|
||||
|
||||
### Recommendation: **KEEP, minor improvements**
|
||||
1. Actually deploy the guard if you want it (symlink or wrapper)
|
||||
2. Or just set `OLLAMA_MAX_LOADED_MODELS=1` and use Ollama's native controls
|
||||
3. Document which models are approved for local use vs. RunPod offload
|
||||
4. Consider adding Ollama to docker-compose for consistency
|
||||
|
||||
**Effort:** 30 minutes
|
||||
|
||||
---
|
||||
|
||||
## Priority Matrix
|
||||
|
||||
| # | Component | Action | Priority | Effort | Impact |
|
||||
|---|-----------|--------|----------|--------|--------|
|
||||
| 1 | GOFAI source recovery | Recover from git | CRITICAL | 2h | Source code loss |
|
||||
| 2 | Nostr bridge source | Decompile/recover .pyc | CRITICAL | 4h | Service loss risk |
|
||||
| 3 | Keystore permissions | chmod 600 | CRITICAL | 5min | Security |
|
||||
| 4 | Burn scripts | Archive to /root/archive/ | HIGH | 30min | Cleanliness |
|
||||
| 5 | Docker-compose | Create for Gitea+strfry | HIGH | 2h | Reproducibility |
|
||||
| 6 | Fleet script | Create fleet.sh management | HIGH | 3h | Operations |
|
||||
| 7 | Webhook receiver | Move into hermes-agent repo | MEDIUM | 3h | Maintainability |
|
||||
| 8 | Heartbeat daemon | Package as timmy-heartbeat | MEDIUM | 5h | Reliability |
|
||||
| 9 | Ollama guard | Deploy or remove | LOW | 30min | Consistency |
|
||||
| 10 | Evennia | No action needed | LOW | 0h | Already good |
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Files Examined
|
||||
|
||||
```
|
||||
/etc/systemd/system/allegro-gitea-webhook.service
|
||||
/etc/systemd/system/nostr-bridge.service
|
||||
/etc/systemd/system/nostr-relay.service
|
||||
/etc/systemd/system/hermes-allegro.service
|
||||
/etc/systemd/system/hermes-adagio.service
|
||||
/etc/systemd/system/hermes-ezra.service
|
||||
/etc/systemd/system/hermes-bezalel.service
|
||||
/etc/systemd/system/ollama.service
|
||||
/root/wizards/allegro/gitea_webhook_receiver.py
|
||||
/root/nostr-relay/main.go
|
||||
/root/nostr-relay/keystore.json
|
||||
/root/nostr-relay/__pycache__/dm_bridge_mvp.cpython-312.pyc
|
||||
/root/wizards/allegro/gofai/ (all files)
|
||||
/root/wizards/allegro/hermes-agent/pyproject.toml
|
||||
/root/workspace/timmy-academy/ (typeclasses, commands, web)
|
||||
/root/burn_*.py (39 files)
|
||||
/root/wizards/allegro/home/skills/devops/.../heartbeat_daemon.py
|
||||
/root/wizards/allegro/household-snapshots/scripts/template_checkpoint_heartbeat.py
|
||||
/root/wizards/scripts/ollama_guard.py
|
||||
```
|
||||
@@ -1,42 +0,0 @@
|
||||
import os
|
||||
import requests
|
||||
from typing import Dict, List
|
||||
|
||||
GITEA_API_URL = os.getenv("GITEA_API_URL")
|
||||
GITEA_TOKEN = os.getenv("GITEA_TOKEN")
|
||||
ORGANIZATION = "Timmy_Foundation"
|
||||
REPOSITORIES = ["hermes-agent", "the-nexus", "timmy-home", "timmy-config"]
|
||||
|
||||
BRANCH_PROTECTION = {
|
||||
"required_pull_request_reviews": {
|
||||
"dismiss_stale_reviews": True,
|
||||
"required_approving_review_count": 1
|
||||
},
|
||||
"required_status_checks": {
|
||||
"strict": True,
|
||||
"contexts": ["ci/cd", "lint", "security"]
|
||||
},
|
||||
"enforce_admins": True,
|
||||
"restrictions": {
|
||||
"team_whitelist": ["maintainers"],
|
||||
"app_whitelist": []
|
||||
},
|
||||
"block_force_push": True,
|
||||
"block_deletions": True
|
||||
}
|
||||
|
||||
def apply_protection(repo: str):
|
||||
url = f"{GITEA_API_URL}/repos/{ORGANIZATION}/{repo}/branches/main/protection"
|
||||
headers = {
|
||||
"Authorization": f"token {GITEA_TOKEN}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
response = requests.post(url, json=BRANCH_PROTECTION, headers=headers)
|
||||
if response.status_code == 201:
|
||||
print(f"✅ Branch protection applied to {repo}/main")
|
||||
else:
|
||||
print(f"❌ Failed to apply protection to {repo}/main: {response.text}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
for repo in REPOSITORIES:
|
||||
apply_protection(repo)
|
||||
@@ -1,46 +0,0 @@
|
||||
import os
|
||||
import requests
|
||||
from typing import Dict, List
|
||||
|
||||
GITEA_API_URL = os.getenv("GITEA_API_URL")
|
||||
GITEA_TOKEN = os.getenv("GITEA_TOKEN")
|
||||
HEADERS = {"Authorization": f"token {GITEA_TOKEN}"}
|
||||
|
||||
def apply_branch_protection(repo_name: str, rules: Dict):
|
||||
url = f"{GITEA_API_URL}/repos/{repo_name}/branches/main/protection"
|
||||
response = requests.post(url, json=rules, headers=HEADERS)
|
||||
if response.status_code == 200:
|
||||
print(f"✅ Branch protection applied to {repo_name}")
|
||||
else:
|
||||
print(f"❌ Failed to apply protection to {repo_name}: {response.text}")
|
||||
|
||||
def main():
|
||||
repos = {
|
||||
"hermes-agent": {
|
||||
"required_pull_request_reviews": {"required_approving_review_count": 1},
|
||||
"restrictions": {"block_force_push": True, "block_deletions": True},
|
||||
"required_status_checks": {"strict": True, "contexts": ["ci/test", "ci/build"]},
|
||||
"dismiss_stale_reviews": True,
|
||||
},
|
||||
"the-nexus": {
|
||||
"required_pull_request_reviews": {"required_approving_review_count": 1},
|
||||
"restrictions": {"block_force_push": True, "block_deletions": True},
|
||||
"dismiss_stale_reviews": True,
|
||||
},
|
||||
"timmy-home": {
|
||||
"required_pull_request_reviews": {"required_approving_review_count": 1},
|
||||
"restrictions": {"block_force_push": True, "block_deletions": True},
|
||||
"dismiss_stale_reviews": True,
|
||||
},
|
||||
"timmy-config": {
|
||||
"required_pull_request_reviews": {"required_approving_review_count": 1},
|
||||
"restrictions": {"block_force_push": True, "block_deletions": True},
|
||||
"dismiss_stale_reviews": True,
|
||||
},
|
||||
}
|
||||
|
||||
for repo, rules in repos.items():
|
||||
apply_branch_protection(repo, rules)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,43 +0,0 @@
|
||||
import os
|
||||
import requests
|
||||
from typing import Dict, List
|
||||
|
||||
GITEA_API = os.getenv("GITEA_API_URL", "https://forge.alexanderwhitestone.com/api/v1")
|
||||
GITEA_TOKEN = os.getenv("GITEA_TOKEN")
|
||||
REPOS = [
|
||||
"hermes-agent",
|
||||
"the-nexus",
|
||||
"timmy-home",
|
||||
"timmy-config",
|
||||
]
|
||||
|
||||
BRANCH_PROTECTION = {
|
||||
"required_pull_request_reviews": True,
|
||||
"required_status_checks": True,
|
||||
"required_signatures": False,
|
||||
"required_linear_history": False,
|
||||
"allow_force_push": False,
|
||||
"allow_deletions": False,
|
||||
"required_approvals": 1,
|
||||
"dismiss_stale_reviews": True,
|
||||
"restrictions": {
|
||||
"users": ["@perplexity"],
|
||||
"teams": []
|
||||
}
|
||||
}
|
||||
|
||||
def apply_protection(repo: str):
|
||||
url = f"{GITEA_API}/repos/Timmy_Foundation/{repo}/branches/main/protection"
|
||||
headers = {
|
||||
"Authorization": f"token {GITEA_TOKEN}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
response = requests.post(url, json=BRANCH_PROTECTION, headers=headers)
|
||||
if response.status_code == 200:
|
||||
print(f"✅ Protection applied to {repo}/main")
|
||||
else:
|
||||
print(f"❌ Failed to apply protection to {repo}/main: {response.text}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
for repo in REPOS:
|
||||
apply_protection(repo)
|
||||
@@ -1,93 +0,0 @@
|
||||
# Ghost Wizard Audit — #827
|
||||
|
||||
**Audited:** 2026-04-06
|
||||
**By:** Claude (claude/issue-827)
|
||||
**Parent Epic:** #822
|
||||
**Source Data:** #820 (Allegro's fleet audit)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
Per Allegro's audit (#820) and Ezra's confirmation, 7 org members have zero activity.
|
||||
This document records the audit findings, classifies accounts, and tracks cleanup actions.
|
||||
|
||||
---
|
||||
|
||||
## Ghost Accounts (TIER 5 — Zero Activity)
|
||||
|
||||
These org members have produced 0 issues, 0 PRs, 0 everything.
|
||||
|
||||
| Account | Classification | Status |
|
||||
|---------|---------------|--------|
|
||||
| `antigravity` | Ghost / placeholder | No assignments, no output |
|
||||
| `google` | Ghost / service label | No assignments, no output |
|
||||
| `grok` | Ghost / service label | No assignments, no output |
|
||||
| `groq` | Ghost / service label | No assignments, no output |
|
||||
| `hermes` | Ghost / service label | No assignments, no output |
|
||||
| `kimi` | Ghost / service label | No assignments, no output |
|
||||
| `manus` | Ghost / service label | No assignments, no output |
|
||||
|
||||
**Action taken (2026-04-06):** Scanned all 107 open issues — **zero open issues are assigned to any of these accounts.** No assignment cleanup required.
|
||||
|
||||
---
|
||||
|
||||
## TurboQuant / Hermes-TurboQuant
|
||||
|
||||
Per issue #827: TurboQuant and Hermes-TurboQuant have no config, no token, no gateway.
|
||||
|
||||
**Repo audit finding:** No `turboquant/` or `hermes-turboquant/` directories exist anywhere in `the-nexus`. These names appear nowhere in the codebase. There is nothing to archive or flag.
|
||||
|
||||
**Status:** Ghost label — never instantiated in this repo.
|
||||
|
||||
---
|
||||
|
||||
## Active Wizard Roster (for reference)
|
||||
|
||||
These accounts have demonstrated real output:
|
||||
|
||||
| Account | Tier | Notes |
|
||||
|---------|------|-------|
|
||||
| `gemini` | TIER 1 — Elite | 61 PRs created, 33 merged, 6 repos active |
|
||||
| `allegro` | TIER 1 — Elite | 50 issues created, 31 closed, 24 PRs |
|
||||
| `ezra` | TIER 2 — Solid | 38 issues created, 26 closed, triage/docs |
|
||||
| `codex-agent` | TIER 3 — Occasional | 4 PRs, 75% merge rate |
|
||||
| `claude` | TIER 3 — Occasional | 4 PRs, 75% merge rate |
|
||||
| `perplexity` | TIER 3 — Occasional | 4 PRs, 3 repos |
|
||||
| `KimiClaw` | TIER 4 — Silent | 6 assigned, 1 PR |
|
||||
| `fenrir` | TIER 4 — Silent | 17 assigned, 0 output |
|
||||
| `bezalel` | TIER 4 — Silent | 3 assigned, 2 created |
|
||||
| `bilbobagginshire` | TIER 4 — Silent | 5 assigned, 0 output |
|
||||
|
||||
---
|
||||
|
||||
## Ghost Account Origin Notes
|
||||
|
||||
| Account | Likely Origin |
|
||||
|---------|--------------|
|
||||
| `antigravity` | Test/throwaway username used in FIRST_LIGHT_REPORT test sessions |
|
||||
| `google` | Placeholder for Google/Gemini API service routing; `gemini` is the real wizard account |
|
||||
| `grok` | xAI Grok model placeholder; no active harness |
|
||||
| `groq` | Groq API service label; `groq_worker.py` exists in codebase but no wizard account needed |
|
||||
| `hermes` | Hermes VPS infrastructure label; individual wizards (ezra, allegro) are the real accounts |
|
||||
| `kimi` | Moonshot AI Kimi model placeholder; `KimiClaw` is the real wizard account if active |
|
||||
| `manus` | Manus AI agent placeholder; no harness configured in this repo |
|
||||
|
||||
---
|
||||
|
||||
## Recommendations
|
||||
|
||||
1. **Do not route work to ghost accounts** — confirmed, no current assignments exist.
|
||||
2. **`google` account** is redundant with `gemini`; use `gemini` for all Gemini/Google work.
|
||||
3. **`hermes` account** is redundant with the actual wizard accounts (ezra, allegro); do not assign issues to it.
|
||||
4. **`kimi` vs `KimiClaw`** — if Kimi work resumes, route to `KimiClaw` not `kimi`.
|
||||
5. **TurboQuant** — no action needed; not instantiated in this repo.
|
||||
|
||||
---
|
||||
|
||||
## Cleanup Done
|
||||
|
||||
- [x] Scanned all 107 open issues for ghost account assignments → **0 found**
|
||||
- [x] Searched repo for TurboQuant directories → **none exist**
|
||||
- [x] Documented ghost vs. real account classification
|
||||
- [x] Ghost accounts flagged as "do not route" in this audit doc
|
||||
@@ -1,33 +0,0 @@
|
||||
# Branch Protection & Mandatory Review Policy
|
||||
|
||||
## Overview
|
||||
|
||||
This policy ensures that all changes to the `main` branch are reviewed and tested before being merged. It applies to all repositories in the organization.
|
||||
|
||||
## Enforced Rules
|
||||
|
||||
| Rule | Description |
|
||||
|------|-------------|
|
||||
| ✅ Require Pull Request | Direct pushes to `main` are blocked |
|
||||
| ✅ Require 1 Approval | At least one reviewer must approve |
|
||||
| ✅ Dismiss Stale Approvals | Approvals are dismissed on new commits |
|
||||
| ✅ Require CI to Pass | Merges are blocked if CI fails |
|
||||
| ✅ Block Force Push | Prevents rewriting of `main` history |
|
||||
| ✅ Block Branch Deletion | Prevents accidental deletion of `main` |
|
||||
|
||||
## Default Reviewers
|
||||
|
||||
- `@perplexity` is the default reviewer for all repositories
|
||||
- `@Timmy` is a required reviewer for `hermes-agent`
|
||||
|
||||
## Compliance
|
||||
|
||||
This policy is enforced via automation using the `bin/enforce_branch_protection.py` script, which applies these rules to all repositories.
|
||||
|
||||
## Exceptions
|
||||
|
||||
No exceptions are currently defined. All repositories must comply with this policy.
|
||||
|
||||
## Audit
|
||||
|
||||
This policy is audited quarterly to ensure compliance and effectiveness.
|
||||
@@ -1,26 +0,0 @@
|
||||
# Branch Protection & Review Policy
|
||||
|
||||
## Enforcement Rules
|
||||
|
||||
All repositories must:
|
||||
- Require PR for main branch merges
|
||||
- Require 1 approval
|
||||
- Dismiss stale approvals
|
||||
- Block force pushes
|
||||
- Block branch deletion
|
||||
|
||||
## Reviewer Assignments
|
||||
- All repos: @perplexity (QA gate)
|
||||
- hermes-agent: @Timmy (owner gate)
|
||||
|
||||
## CI Requirements
|
||||
- hermes-agent: Full CI required
|
||||
- the-nexus: CI pending (issue #915)
|
||||
- timmy-config: Limited ci
|
||||
|
||||
## Compliance
|
||||
This policy blocks:
|
||||
- Direct pushes to main
|
||||
- Unreviewed merges
|
||||
- Merges with failing ci
|
||||
- History rewriting
|
||||
@@ -1,57 +0,0 @@
|
||||
# Issue #826 Offload Audit — Timmy → Ezra/Bezalel
|
||||
|
||||
Date: 2026-04-06
|
||||
|
||||
## Summary
|
||||
|
||||
Reassigned 27 issues from Timmy to reduce open assignments from 34 → 7.
|
||||
Target achieved: Timmy now holds <10 open assignments.
|
||||
|
||||
## Delegated to Ezra (architecture/scoping) — 19 issues
|
||||
|
||||
| Issue | Title |
|
||||
|-------|-------|
|
||||
| #876 | [FRONTIER] Integrate Bitcoin/Ordinals Inscription Verification |
|
||||
| #874 | [NEXUS] Implement Nostr Event Stream Visualization |
|
||||
| #872 | [NEXUS] Add "Sovereign Health" HUD Mini-map |
|
||||
| #871 | [NEXUS] Implement GOFAI Symbolic Engine Debugger Overlay |
|
||||
| #870 | [NEXUS] Interactive Portal Configuration HUD |
|
||||
| #869 | [NEXUS] Real-time "Fleet Pulse" Synchronization Visualization |
|
||||
| #868 | [NEXUS] Visualize Vector Retrievals as 3D "Memory Orbs" |
|
||||
| #867 | [NEXUS] [MIGRATION] Restore Agent Vision POV Camera Toggle |
|
||||
| #866 | [NEXUS] [MIGRATION] Audit and Restore Spatial Audio from Legacy Matrix |
|
||||
| #858 | Add failure-mode recovery to Prose engine |
|
||||
| #719 | [EPIC] Local Bannerlord on Mac |
|
||||
| #698 | [PANELS] Add heartbeat / morning briefing panel tied to Hermes state |
|
||||
| #697 | [PANELS] Replace placeholder runtime/cloud panels |
|
||||
| #696 | [UX] Honest connection-state banner for Timmy |
|
||||
| #687 | [PORTAL] Restore a wizardly local-first visual shell |
|
||||
| #685 | [MIGRATION] Preserve legacy the-matrix quality work |
|
||||
| #682 | [AUDIO] Lyria soundtrack palette for Nexus zones |
|
||||
| #681 | [MEDIA] Veo/Flow flythrough prototypes for The Nexus |
|
||||
| #680 | [CONCEPT] Project Genie + Nano Banana concept pack |
|
||||
|
||||
## Delegated to Bezalel (security/execution) — 8 issues
|
||||
|
||||
| Issue | Title |
|
||||
|-------|-------|
|
||||
| #873 | [NEXUS] [PERFORMANCE] Three.js LOD and Texture Audit |
|
||||
| #857 | Create auto-skill-extraction cron |
|
||||
| #856 | Implement Prose step type `gitea_api` |
|
||||
| #854 | Integrate Hermes Prose engine into burn-mode cron jobs |
|
||||
| #731 | [VALIDATION] Browser smoke + visual proof for Evennia-fed Nexus |
|
||||
| #693 | [CHAT] Restore visible Timmy chat panel |
|
||||
| #692 | [UX] First-run onboarding overlay |
|
||||
| #686 | [VALIDATION] Rebuild browser smoke and visual validation |
|
||||
|
||||
## Retained by Timmy (sovereign judgment) — 7 issues
|
||||
|
||||
| Issue | Title |
|
||||
|-------|-------|
|
||||
| #875 | [NEXUS] Add "Reasoning Trace" HUD Component |
|
||||
| #837 | [CRITIQUE] Timmy Foundation: Deep Critique & Improvement Report |
|
||||
| #835 | [PROPOSAL] Prime Time Improvement Report |
|
||||
| #726 | [EPIC] Make Timmy's Evennia mind palace visible in the Nexus |
|
||||
| #717 | [PORTALS] Show cross-world presence |
|
||||
| #709 | [IDENTITY] Make SOUL / Oath panel part of the main interaction loop |
|
||||
| #675 | [HARNESS] Deterministic context compaction for long local sessions |
|
||||
@@ -1,42 +0,0 @@
|
||||
# PR Reviewer Assignment Policy
|
||||
|
||||
**Effective: 2026-04-07** — Established after org-wide PR hygiene audit (issue #916).
|
||||
|
||||
## Rule: Every PR must have at least one reviewer assigned before merge.
|
||||
|
||||
No exceptions. Unreviewed PRs will not be merged.
|
||||
|
||||
## Who to assign
|
||||
|
||||
| PR type | Default reviewer |
|
||||
|---|---|
|
||||
| Security / auth changes | @perplexity |
|
||||
| Infrastructure / fleet | @perplexity |
|
||||
| Sovereignty / local inference | @perplexity |
|
||||
| Documentation | any team member |
|
||||
| Agent-generated PRs | @perplexity |
|
||||
|
||||
When in doubt, assign @perplexity.
|
||||
|
||||
## Why this policy exists
|
||||
|
||||
Audit on 2026-04-07 found 5 open PRs across the org — zero had a reviewer assigned.
|
||||
Two PRs containing critical security and sovereignty work (hermes-agent #131, #170) drifted
|
||||
400+ commits from `main` and became unmergeable because nobody reviewed them while main advanced.
|
||||
|
||||
The cost: weeks of rebase work to rescue two commits of actual changes.
|
||||
|
||||
## PR hygiene rules
|
||||
|
||||
1. **Assign a reviewer on open.** Don't open a PR without a reviewer.
|
||||
2. **Rebase within 2 weeks.** If a PR sits for 2 weeks, rebase it or close it.
|
||||
3. **Close zombie PRs.** A PR with 0 commits ahead of base should be closed immediately.
|
||||
4. **Cherry-pick, don't rebase 400 commits.** When a branch drifts far, extract the actual
|
||||
changes onto a fresh branch rather than rebasing the entire history.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Agent-opened PRs (Timmy, Claude, etc.) must include `reviewers` in the PR creation payload.
|
||||
The forge API accepts `"reviewers": ["perplexity"]` in the PR body.
|
||||
|
||||
See: issue #916 for the audit that established this policy.
|
||||
@@ -1,49 +0,0 @@
|
||||
# Branch Protection Policy
|
||||
|
||||
## Enforcement Rules
|
||||
|
||||
All repositories must have the following branch protection rules enabled on the `main` branch:
|
||||
|
||||
| Rule | Status | Description |
|
||||
|------|--------|-------------|
|
||||
| Require PR for merge | ✅ Enabled | No direct pushes to main |
|
||||
| Required approvals | ✅ 1 approval | At least one reviewer must approve |
|
||||
| Dismiss stale approvals | ✅ Enabled | Re-review after new commits |
|
||||
| Require CI to pass | ✅ Where CI exists | No merging with failing CI |
|
||||
| Block force push | ✅ Enabled | Protect commit history |
|
||||
| Block branch deletion | ✅ Enabled | Prevent accidental main deletion |
|
||||
|
||||
## Reviewer Assignments
|
||||
|
||||
- `@perplexity` - Default reviewer for all repositories
|
||||
- `@Timmy` - Required reviewer for `hermes-agent`
|
||||
|
||||
- Repo-specific owners for specialized areas (e.g., `@Rockachopa` for infrastructure)
|
||||
|
||||
## Implementation Status
|
||||
|
||||
- [x] `hermes-agent`: All rules enabled
|
||||
- [x] `the-nexus`: All rules enabled (CI pending)
|
||||
- [x] `timmy-home`: PR + 1 approval
|
||||
- [x] `timmy-config`: PR + 1 approval
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [x] Branch protection enabled on all main branches
|
||||
- [x] `@perplexity` set as default reviewer
|
||||
- [x] This documentation added to all repositories
|
||||
|
||||
## Blocked Issues
|
||||
|
||||
- [ ] #916 - CI implementation for `the-nexus`
|
||||
- [ ] #917 - Reviewer assignment automation
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
1. Gitea branch protection settings must be configured via the UI:
|
||||
- Settings > Branches > Branch Protection
|
||||
- Enable all rules listed above
|
||||
|
||||
2. `CODEOWNERS` file must be committed to the root of each repository
|
||||
|
||||
3. CI status should be verified before merging
|
||||
@@ -1,26 +0,0 @@
|
||||
# Burn Script Archive
|
||||
|
||||
Original 39 burn_*.py scripts were on VPS /root at time of audit.
|
||||
Most contained duplicated code, hardcoded tokens, and stale URLs.
|
||||
|
||||
## Useful Patterns Extracted
|
||||
|
||||
These reusable components have been migrated to proper modules:
|
||||
|
||||
| Original Pattern | New Location | Module |
|
||||
|---|---|---|
|
||||
| Gitea API client | `nexus/retry_helper.py` | retry decorator, dead letter queue |
|
||||
| Cycle state tracking | `nexus/retry_helper.py` | checkpoint save/load/clear |
|
||||
| Fleet health checks | `fleet/fleet.sh` | health/status/restart/run |
|
||||
| Morning report gen | `nexus/morning_report.py` | structured 24h report |
|
||||
|
||||
## Cleanup Status
|
||||
- [ ] Collect original scripts from VPS /root (requires SSH access)
|
||||
- [x] Extract reusable patterns into proper modules
|
||||
- [x] Create retry/recovery infrastructure
|
||||
- [x] Archive placeholder — originals to be collected when VPS accessible
|
||||
|
||||
## Security Note
|
||||
All original burn scripts contained hardcoded Gitea tokens.
|
||||
No tokens were preserved in the extracted modules.
|
||||
New modules use `~/.config/gitea/token` pattern.
|
||||
121
fleet/fleet.sh
121
fleet/fleet.sh
@@ -1,121 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# fleet.sh — Cross-VPS fleet management
|
||||
# Manages both Allegro (167.99.126.228) and Bezalel (159.203.146.185)
|
||||
# Usage: fleet.sh <command> [options]
|
||||
#
|
||||
# Commands:
|
||||
# health — Run health checks on all VPSes
|
||||
# restart <svc> — Restart a service on all VPSes
|
||||
# status — Show fleet status summary
|
||||
# ssh <host> — SSH into a specific host (allegro|bezalel)
|
||||
# run <command> — Run a command on all VPSes
|
||||
# deploy — Deploy latest config to all VPSes
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ALLEGRO="167.99.126.228"
|
||||
BEZALEL="159.203.146.185"
|
||||
EZRA="143.198.27.163"
|
||||
USER="root"
|
||||
SSH_OPTS="-o StrictHostKeyChecking=no -o ConnectTimeout=10"
|
||||
|
||||
hosts="$ALLEGRO $BEZALEL $EZRA"
|
||||
host_names="allegro bezalel ezra"
|
||||
|
||||
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] FLEET: $*"; }
|
||||
|
||||
remote() {
|
||||
local host=$1
|
||||
shift
|
||||
ssh $SSH_OPTS "$USER@$host" "$@"
|
||||
}
|
||||
|
||||
cmd_health() {
|
||||
log "Running fleet health check..."
|
||||
paste <(echo "$host_names" | tr ' ' '\n') <(echo "$hosts" | tr ' ' '\n') | while read name host; do
|
||||
echo ""
|
||||
echo "=== $name ($host) ==="
|
||||
if remote "$host" "echo 'SSH: OK'; uptime; free -m | head -2; df -h / | tail -1; systemctl list-units --state=failed --no-pager | head -10" 2>&1; then
|
||||
echo "---"
|
||||
else
|
||||
echo "SSH: FAILED — host unreachable"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
cmd_status() {
|
||||
log "Fleet status summary..."
|
||||
paste <(echo "$host_names" | tr ' ' '\n') <(echo "$hosts" | tr ' ' '\n') | while read name host; do
|
||||
printf "%-12s " "$name"
|
||||
if remote "$host" "echo -n 'UP' 2>/dev/null" 2>/dev/null; then
|
||||
uptime_str=$(remote "$host" "uptime -p 2>/dev/null || uptime" 2>/dev/null || echo "unknown")
|
||||
echo " $uptime_str"
|
||||
else
|
||||
echo " UNREACHABLE"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
cmd_restart() {
|
||||
local svc=${1:-}
|
||||
if [ -z "$svc" ]; then
|
||||
echo "Usage: fleet.sh restart <service>"
|
||||
echo "Common: hermes-agent evennia nginx docker"
|
||||
return 1
|
||||
fi
|
||||
log "Restarting '$svc' on all hosts..."
|
||||
paste <(echo "$host_names" | tr ' ' '\n') <(echo "$hosts" | tr ' ' '\n') | while read name host; do
|
||||
printf "%-12s " "$name"
|
||||
if remote "$host" "systemctl restart $svc 2>&1 && echo 'restarted' || echo 'FAILED'" 2>/dev/null; then
|
||||
echo ""
|
||||
else
|
||||
echo "UNREACHABLE"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
cmd_run() {
|
||||
local cmd="${1:-}"
|
||||
if [ -z "$cmd" ]; then
|
||||
echo "Usage: fleet.sh run '<command>'"
|
||||
return 1
|
||||
fi
|
||||
log "Running '$cmd' on all hosts..."
|
||||
paste <(echo "$host_names" | tr ' ' '\n') <(echo "$hosts" | tr ' ' '\n') | while read name host; do
|
||||
echo "=== $name ($host) ==="
|
||||
remote "$host" "$cmd" 2>&1 || echo "(failed)"
|
||||
echo ""
|
||||
done
|
||||
}
|
||||
|
||||
cmd_deploy() {
|
||||
log "Deploying config to all hosts..."
|
||||
# Push timmy-config updates to each host
|
||||
for pair in "allegro:$ALLEGRO" "bezalel:$BEZALEL"; do
|
||||
name="${pair%%:*}"
|
||||
host="${pair##*:}"
|
||||
echo ""
|
||||
echo "=== $name ==="
|
||||
remote "$host" "cd /root && ./update-config.sh 2>/dev/null || echo 'No update script found'; systemctl restart hermes-agent 2>/dev/null && echo 'hermes-agent restarted' || echo 'hermes-agent not found'" 2>&1 || echo "(unreachable)"
|
||||
done
|
||||
}
|
||||
|
||||
# Main dispatch
|
||||
case "${1:-help}" in
|
||||
health) cmd_health ;;
|
||||
status) cmd_status ;;
|
||||
restart) cmd_restart "${2:-}" ;;
|
||||
run) cmd_run "${2:-}" ;;
|
||||
deploy) cmd_deploy ;;
|
||||
help|*)
|
||||
echo "Usage: fleet.sh <command> [options]"
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " health — Run health checks on all VPSes"
|
||||
echo " status — Show fleet status summary"
|
||||
echo " restart <svc> — Restart a service on all VPSes"
|
||||
echo " run '<cmd>' — Run a command on all VPSes"
|
||||
echo " deploy — Deploy config to all VPSes"
|
||||
echo " ssh <host> — SSH into host (allegro|bezalel|ezra)"
|
||||
;;
|
||||
esac
|
||||
@@ -1,75 +0,0 @@
|
||||
const GiteaApiUrl = 'https://forge.alexanderwhitestone.com/api/v1';
|
||||
const token = process.env.GITEA_TOKEN; // Should be stored securely in environment variables
|
||||
const repos = ['hermes-agent', 'the-nexus', 'timmy-home', 'timmy-config'];
|
||||
|
||||
const branchProtectionSettings = {
|
||||
enablePush: false,
|
||||
enableMerge: true,
|
||||
requiredApprovals: 1,
|
||||
dismissStaleApprovals: true,
|
||||
requiredStatusChecks: true,
|
||||
blockForcePush: true,
|
||||
blockDelete: true
|
||||
// Special handling for the-nexus (CI disabled)
|
||||
};
|
||||
|
||||
async function applyBranchProtection(repo) {
|
||||
try {
|
||||
const response = await fetch(`${giteaApiUrl}/repos/Timmy_Foundation/${repo}/branches/main/protection`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `token ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...branchProtectionSettings,
|
||||
// Special handling for the-nexus (CI disabled)
|
||||
requiredStatusChecks: repo === 'the-nexus' ? false : true
|
||||
})
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to apply branch protection to ${repo}: ${await response.text()}`);
|
||||
}
|
||||
|
||||
console.log(`✅ Branch protection applied to ${repo}`);
|
||||
} catch (error) {
|
||||
console.error(`❌ Error applying branch protection to ${repo}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function applyBranchProtection(repo) {
|
||||
try {
|
||||
const response = await fetch(`${giteaApiUrl}/repos/Timmy_Foundation/${repo}/branches/main/protection`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `token ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...branchProtectionSettings,
|
||||
requiredApprovals: repo === 'hermes-agent' ? 2 : 1,
|
||||
requiredStatusChecks: repo === 'the-nexus' ? false : true
|
||||
})
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to apply branch protection to ${repo}: ${await response.text()}`);
|
||||
}
|
||||
|
||||
console.log(`✅ Branch protection applied to ${repo}`);
|
||||
} catch (error) {
|
||||
console.error(`❌ Error applying branch protection to ${repo}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function setupAllBranchProtections() {
|
||||
console.log('🚀 Applying branch protections to all repositories...');
|
||||
for (const repo of repos) {
|
||||
await applyBranchProtection(repo);
|
||||
}
|
||||
console.log('✅ All branch protections applied successfully');
|
||||
}
|
||||
|
||||
// Run the setup
|
||||
setupAllBranchProtections();
|
||||
@@ -1,44 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Apply branch protections to all repositories
|
||||
# Requires GITEA_TOKEN env var
|
||||
|
||||
REPOS=("hermes-agent" "the-nexus" "timmy-home" "timmy-config")
|
||||
|
||||
for repo in "${REPOS[@]}"
|
||||
do
|
||||
curl -X POST "https://forge.alexanderwhitestone.com/api/v1/repos/Timmy_Foundation/$repo/branches/main/protection" \
|
||||
-H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"required_reviews": 1,
|
||||
"dismiss_stale_reviews": true,
|
||||
"block_force_push": true,
|
||||
"block_deletions": true
|
||||
}'
|
||||
done
|
||||
#!/bin/bash
|
||||
|
||||
# Gitea API credentials
|
||||
GITEA_TOKEN="your-personal-access-token"
|
||||
GITEA_API="https://forge.alexanderwhitestone.com/api/v1"
|
||||
|
||||
# Repos to protect
|
||||
REPOS=("hermes-agent" "the-nexus" "timmy-home" "timmy-config")
|
||||
|
||||
for REPO in "${REPO[@]}"; do
|
||||
echo "Configuring branch protection for $REPO..."
|
||||
|
||||
curl -X POST -H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "main",
|
||||
"require_pull_request": true,
|
||||
"required_approvals": 1,
|
||||
"dismiss_stale_approvals": true,
|
||||
"required_status_checks": '"$(test "$REPO" = "hermes-agent" && echo "true" || echo "false")"',
|
||||
"block_force_push": true,
|
||||
"block_delete": true
|
||||
}' \
|
||||
"$GITEA_API/repos/Timmy_Foundation/$REPO/branch_protection"
|
||||
done
|
||||
@@ -1,36 +0,0 @@
|
||||
import os
|
||||
import requests
|
||||
from datetime import datetime
|
||||
|
||||
GITEA_API = os.getenv('Gitea_api_url', 'https://forge.alexanderwhitestone.com/api/v1')
|
||||
Gitea_token = os.getenv('GITEA_TOKEN')
|
||||
|
||||
headers = {
|
||||
'Authorization': f'token {gitea_token}',
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
|
||||
def apply_branch_protection(owner, repo, branch='main'):
|
||||
payload = {
|
||||
"protected": True,
|
||||
"merge_method": "merge",
|
||||
"push": False,
|
||||
"pull_request": True,
|
||||
"required_signoff": False,
|
||||
"required_reviews": 1,
|
||||
"required_status_checks": True,
|
||||
"restrict_owners": True,
|
||||
"delete": False,
|
||||
"force_push": False
|
||||
}
|
||||
|
||||
url = f"{GITEA_API}/repos/{owner}/{repo}/branches/{branch}/protection"
|
||||
r = requests.post(url, json=payload, headers=headers)
|
||||
return r.status_code, r.json()
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Apply to all repos
|
||||
for repo in ['hermes-agent', 'the-nexus', 'timmy-home', 'timmy-config']:
|
||||
print(f"Configuring {repo}...")
|
||||
status, resp = apply_branch_protection('Timmy_Foundation', repo)
|
||||
print(f"Status: {status} {resp}")
|
||||
10
hermes-agent/.github/CODEOWNERS
vendored
10
hermes-agent/.github/CODEOWNERS
vendored
@@ -1,10 +0,0 @@
|
||||
# CODEOWNERS for hermes-agent
|
||||
* @perplexity
|
||||
@Timmy
|
||||
# CODEOWNERS for the-nexus
|
||||
|
||||
* @perplexity
|
||||
@Rockachopa
|
||||
# CODEOWNERS for timmy-config
|
||||
|
||||
* @perplexity
|
||||
@@ -1,3 +0,0 @@
|
||||
@Timmy
|
||||
* @perplexity
|
||||
**/src @Timmy
|
||||
@@ -1,18 +0,0 @@
|
||||
# Contribution Policy for hermes-agent
|
||||
|
||||
## Branch Protection Rules
|
||||
All changes to the `main` branch require:
|
||||
- Pull Request with at least 1 approval
|
||||
- CI checks passing
|
||||
- No direct commits or force pushes
|
||||
- No deletion of the main branch
|
||||
|
||||
## Review Requirements
|
||||
- All PRs must be reviewed by @perplexity
|
||||
- Additional review required from @Timmy
|
||||
|
||||
## Stale PR Policy
|
||||
- Stale approvals are dismissed on new commits
|
||||
- Abandoned PRs will be closed after 7 days of inactivity
|
||||
|
||||
For urgent fixes, create a hotfix branch and follow the same review process.
|
||||
97
index.html
97
index.html
@@ -246,92 +246,6 @@
|
||||
<a href="https://www.perplexity.ai/computer" target="_blank" rel="noopener noreferrer">
|
||||
Created with Perplexity Computer
|
||||
</a>
|
||||
<a href="POLICY.md" target="_blank" rel="noopener noreferrer">
|
||||
View Contribution Policy
|
||||
</a>
|
||||
<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 style="margin-top: 8px;">
|
||||
<strong>DEFAULT REVIEWERS</strong><br>
|
||||
<span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos) |
|
||||
<span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)
|
||||
</div>
|
||||
<div style="margin-top: 10px;">
|
||||
<strong>IMPLEMENTATION STATUS</strong><br>
|
||||
<ul style="margin:0; padding-left:15px;">
|
||||
<li>• hermes-agent: Require PR + 1 approval + CI ✅</li>
|
||||
<li>• the-nexus: Require PR + 1 approval ⚠️ (CI disabled)</li>
|
||||
<li>• timmy-home: Require PR + 1 approval ✅</li>
|
||||
<li>• timmy-config: Require PR + 1 approval ✅</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div 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 style="margin-top: 8px;">
|
||||
<strong>DEFAULT REVIEWERS</strong><br>
|
||||
<span style="color:#4af0c0;">@perplexity</span> (QA gate on all repos) |
|
||||
<span style="color:#7b5cff;">@Timmy</span> (owner gate on hermes-agent)
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-top: 10px; font-size: 12px; color: #aaa;">
|
||||
<strong>BRANCH PROTECTION 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:#ab8d0;">timmy-config</span>: Require PR + 1 approval ✅</div>
|
||||
</div>
|
||||
</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>
|
||||
@@ -367,17 +281,6 @@ index.html
|
||||
if (!sha) return;
|
||||
if (knownSha === null) { knownSha = sha; return; }
|
||||
if (sha !== knownSha) {
|
||||
// Check branch protection rules
|
||||
const branchRules = await fetch(`${GITEA}/repos/${REPO}/branches/${BRANCH}/protection`);
|
||||
if (!branchRules.ok) {
|
||||
console.error('Branch protection rules not enforced');
|
||||
return;
|
||||
}
|
||||
const rules = await branchRules.json();
|
||||
if (!rules.require_pr && !rules.require_approvals) {
|
||||
console.error('Branch protection rules not met');
|
||||
return;
|
||||
}
|
||||
knownSha = sha;
|
||||
const banner = document.getElementById('live-refresh-banner');
|
||||
const countdown = document.getElementById('lr-countdown');
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
# Lazarus Pit Registry — Single Source of Truth for Fleet Health and Resurrection
|
||||
# Version: 1.0.0
|
||||
# Owner: Bezalel (deployment), Ezra (compilation), Allegro (validation)
|
||||
|
||||
meta:
|
||||
version: "1.0.0"
|
||||
updated_at: "2026-04-07T02:55:00Z"
|
||||
next_review: "2026-04-14T02:55:00Z"
|
||||
|
||||
fleet:
|
||||
bezalel:
|
||||
role: forge-and-testbed wizard
|
||||
host: 104.131.15.18
|
||||
vps_provider: digitalocean
|
||||
primary:
|
||||
provider: kimi-coding
|
||||
model: kimi-k2.5
|
||||
fallback_chain:
|
||||
- provider: kimi-coding
|
||||
model: kimi-k2.5
|
||||
timeout: 120
|
||||
- provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
- provider: openrouter
|
||||
model: anthropic/claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
- provider: big_brain
|
||||
model: gemma3:27b-instruct-q8_0
|
||||
timeout: 300
|
||||
health_endpoints:
|
||||
gateway: "http://127.0.0.1:8646"
|
||||
api_server: "http://127.0.0.1:8656"
|
||||
auto_restart: true
|
||||
|
||||
allegro:
|
||||
role: code-craft wizard
|
||||
host: UNKNOWN
|
||||
vps_provider: UNKNOWN
|
||||
primary:
|
||||
provider: kimi-coding
|
||||
model: kimi-k2.5
|
||||
fallback_chain:
|
||||
- provider: kimi-coding
|
||||
model: kimi-k2.5
|
||||
timeout: 120
|
||||
- provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
- provider: openrouter
|
||||
model: anthropic/claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
health_endpoints:
|
||||
gateway: "http://127.0.0.1:8645"
|
||||
auto_restart: true
|
||||
known_issues:
|
||||
- host_and_vps_unknown_to_fleet
|
||||
- config_needs_runtime_refresh
|
||||
|
||||
ezra:
|
||||
role: archivist-and-interpreter wizard
|
||||
host: UNKNOWN
|
||||
vps_provider: UNKNOWN
|
||||
primary:
|
||||
provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
fallback_chain:
|
||||
- provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
- provider: openrouter
|
||||
model: anthropic/claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
auto_restart: true
|
||||
known_issues:
|
||||
- timeout_choking_on_long_operations
|
||||
|
||||
timmy:
|
||||
role: sovereign core
|
||||
host: UNKNOWN
|
||||
vps_provider: UNKNOWN
|
||||
primary:
|
||||
provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
fallback_chain:
|
||||
- provider: anthropic
|
||||
model: claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
- provider: openrouter
|
||||
model: anthropic/claude-sonnet-4-20250514
|
||||
timeout: 120
|
||||
auto_restart: true
|
||||
|
||||
provider_health_matrix:
|
||||
kimi-coding:
|
||||
status: degraded
|
||||
note: "kimi-for-coding returns 403 access-terminated; use kimi-k2.5 model only"
|
||||
last_checked: "2026-04-07T02:55:00Z"
|
||||
rate_limited: false
|
||||
dead: false
|
||||
|
||||
anthropic:
|
||||
status: healthy
|
||||
last_checked: "2026-04-07T02:55:00Z"
|
||||
rate_limited: false
|
||||
dead: false
|
||||
|
||||
openrouter:
|
||||
status: healthy
|
||||
last_checked: "2026-04-07T02:55:00Z"
|
||||
rate_limited: false
|
||||
dead: false
|
||||
|
||||
big_brain:
|
||||
status: provisioning
|
||||
note: "RunPod L40S instance big-brain-bezalel deployed; Ollama endpoint propagating"
|
||||
last_checked: "2026-04-07T02:55:00Z"
|
||||
endpoint: "http://yxw29g3excyddq-64411cd0-11434.tcp.runpod.net:11434/v1"
|
||||
rate_limited: false
|
||||
dead: false
|
||||
|
||||
timeout_policies:
|
||||
gateway:
|
||||
inactivity_timeout_seconds: 600
|
||||
diagnostic_on_timeout: true
|
||||
cron:
|
||||
inactivity_timeout_seconds: 0 # unlimited while active
|
||||
agent:
|
||||
default_turn_timeout: 120
|
||||
long_operation_heartbeat: true
|
||||
|
||||
watchdog:
|
||||
enabled: true
|
||||
interval_seconds: 60
|
||||
actions:
|
||||
- ping_agent_gateways
|
||||
- probe_providers
|
||||
- parse_agent_logs
|
||||
- update_registry
|
||||
- auto_promote_fallbacks
|
||||
- auto_restart_dead_agents
|
||||
|
||||
resurrection_protocol:
|
||||
soft:
|
||||
- reload_config_from_registry
|
||||
- rewrite_fallback_providers
|
||||
- promote_first_healthy_fallback
|
||||
hard:
|
||||
- systemctl_restart_gateway
|
||||
- log_incident
|
||||
- notify_sovereign
|
||||
@@ -8,14 +8,9 @@
|
||||
"theme_color": "#4af0c0",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/icons/icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/icons/icon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
"src": "/favicon.ico",
|
||||
"sizes": "64x64",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
"""
|
||||
Morning Report Generator — runs at 0600 to compile overnight activity.
|
||||
Gathers: cycles executed, issues closed, PRs merged, commits pushed.
|
||||
Outputs a structured report for delivery to the main channel.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def generate_morning_report():
|
||||
"""Generate the morning report for the last 24h."""
|
||||
now = datetime.now(timezone.utc)
|
||||
since = now - timedelta(hours=24)
|
||||
since_str = since.strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||
|
||||
repos = [
|
||||
"Timmy_Foundation/timmy-home",
|
||||
"Timmy_Foundation/timmy-config",
|
||||
"Timmy_Foundation/the-nexus",
|
||||
"Timmy_Foundation/hermes-agent",
|
||||
]
|
||||
|
||||
report = {
|
||||
"generated_at": now.strftime("%Y-%m-%d %H:%M UTC"),
|
||||
"period": f"Last 24h since {since_str}",
|
||||
"highlights": [],
|
||||
"blockers": [],
|
||||
"repos": {},
|
||||
}
|
||||
|
||||
token = open(os.path.expanduser("~/.config/gitea/token")).read().strip()
|
||||
|
||||
from urllib.request import Request, urlopen
|
||||
headers = {"Authorization": f"token {token}", "Accept": "application/json"}
|
||||
|
||||
for repo in repos:
|
||||
repo_data = {"closed_issues": 0, "merged_prs": 0, "recent_commits": 0}
|
||||
|
||||
# Closed issues in last 24h
|
||||
url = f"https://forge.alexanderwhitestone.com/api/v1/repos/{repo}/issues?state=closed&since={since_str}"
|
||||
try:
|
||||
resp = urlopen(Request(url, headers=headers), timeout=10)
|
||||
issues = json.loads(resp.read())
|
||||
repo_data["closed_issues"] = len(issues)
|
||||
for i in issues[:5]:
|
||||
report["highlights"].append(f"Closed {repo.split('/')[-1]}#{i['number']}: {i['title']}")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Merged PRs
|
||||
url = f"https://forge.alexanderwhitestone.com/api/v1/repos/{repo}/pulls?state=closed"
|
||||
try:
|
||||
resp = urlopen(Request(url, headers=headers), timeout=10)
|
||||
prs = json.loads(resp.read())
|
||||
merged = [p for p in prs if p.get("merged")]
|
||||
repo_data["merged_prs"] = len(merged)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
report["repos"][repo.split("/")[-1]] = repo_data
|
||||
|
||||
# Check for stuck workers (blockers)
|
||||
worker_logs = list(Path("/tmp").glob("codeclaw-qwen-worker-*.log"))
|
||||
stuck = 0
|
||||
for wf in worker_logs:
|
||||
try:
|
||||
data = json.loads(wf.read_text().strip())
|
||||
if data.get("exit") != 0 and not data.get("has_work"):
|
||||
stuck += 1
|
||||
except (json.JSONDecodeError, ValueError):
|
||||
pass
|
||||
if stuck > 0:
|
||||
report["blockers"].append(f"{stuck} worker(s) failed without producing work")
|
||||
|
||||
# Check dead letter queue
|
||||
dlq_path = Path(os.path.expanduser("~/.local/timmy/burn-state/dead-letter.json"))
|
||||
if dlq_path.exists():
|
||||
try:
|
||||
dlq = json.loads(dlq_path.read_text())
|
||||
if dlq:
|
||||
report["blockers"].append(f"{len(dlq)} action(s) in dead letter queue")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Checkpoint status
|
||||
cp_path = Path(os.path.expanduser("~/.local/timmy/burn-state/cycle-state.json"))
|
||||
if cp_path.exists():
|
||||
try:
|
||||
cp = json.loads(cp_path.read_text())
|
||||
if cp.get("status") == "in-progress":
|
||||
ts = cp.get("timestamp", "")
|
||||
if ts and datetime.fromisoformat(ts) < since:
|
||||
report["blockers"].append(f"Stale checkpoint: {cp.get('action')} since {ts}")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Summary
|
||||
total_closed = sum(r["closed_issues"] for r in report["repos"].values())
|
||||
total_merged = sum(r["merged_prs"] for r in report["repos"].values())
|
||||
|
||||
print(f"=== MORNING REPORT {report['generated_at']} ===")
|
||||
print(f"Period: {report['period']}")
|
||||
print(f"Issues closed: {total_closed}")
|
||||
print(f"PRs merged: {total_merged}")
|
||||
print("")
|
||||
if report["highlights"]:
|
||||
print("HIGHLIGHTS:")
|
||||
for h in report["highlights"]:
|
||||
print(f" + {h}")
|
||||
if report["blockers"]:
|
||||
print("BLOCKERS:")
|
||||
for b in report["blockers"]:
|
||||
print(f" - {b}")
|
||||
if not report["highlights"] and not report["blockers"]:
|
||||
print("No significant activity or blockers detected.")
|
||||
print("")
|
||||
|
||||
# Save report
|
||||
report_dir = Path(os.path.expanduser("~/.local/timmy/reports"))
|
||||
report_dir.mkdir(parents=True, exist_ok=True)
|
||||
report_file = report_dir / f"morning-{now.strftime('%Y-%m-%d')}.json"
|
||||
report_file.write_text(json.dumps(report, indent=2))
|
||||
print(f"Report saved: {report_file}")
|
||||
return report
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_morning_report()
|
||||
@@ -1,114 +0,0 @@
|
||||
"""
|
||||
Retry logic and error recovery for burn-mode operations.
|
||||
Provides: retry decorator, cycle state tracking, dead letter queue.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
import traceback
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
# --- Configuration ---
|
||||
STATE_DIR = Path(os.path.expanduser("~/.local/timmy/burn-state"))
|
||||
STATE_FILE = STATE_DIR / "cycle-state.json"
|
||||
DEAD_LETTER_FILE = STATE_DIR / "dead-letter.json"
|
||||
MAX_RETRIES = 3
|
||||
BASE_DELAY = 2 # seconds
|
||||
|
||||
|
||||
def _ensure_dir():
|
||||
STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
def retry(max_retries=MAX_RETRIES, base_delay=BASE_DELAY, exceptions=(Exception,)):
|
||||
"""Retry decorator with exponential backoff."""
|
||||
def decorator(fn):
|
||||
def wrapper(*args, **kwargs):
|
||||
last_exc = None
|
||||
for attempt in range(1, max_retries + 1):
|
||||
try:
|
||||
return fn(*args, **kwargs)
|
||||
except exceptions as exc:
|
||||
last_exc = exc
|
||||
if attempt < max_retries:
|
||||
delay = base_delay * (2 ** (attempt - 1))
|
||||
print(f" [RETRY] {fn.__name__} attempt {attempt}/{max_retries} failed: {exc}")
|
||||
print(f" [RETRY] waiting {delay}s...")
|
||||
time.sleep(delay)
|
||||
else:
|
||||
print(f" [FAIL] {fn.__name__} failed after {max_retries} attempts: {exc}")
|
||||
dead_letter(fn.__name__, args, exc)
|
||||
return None # All retries exhausted
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
def dead_letter(fn_name, args, exc):
|
||||
"""Record a failed action to the dead letter queue."""
|
||||
_ensure_dir()
|
||||
entry = {
|
||||
"function": fn_name,
|
||||
"args": str(args)[:500],
|
||||
"error": str(exc),
|
||||
"traceback": traceback.format_exc()[:1000],
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
}
|
||||
dlq = []
|
||||
if DEAD_LETTER_FILE.exists():
|
||||
try:
|
||||
dlq = json.loads(DEAD_LETTER_FILE.read_text())
|
||||
except json.JSONDecodeError:
|
||||
dlq = []
|
||||
dlq.append(entry)
|
||||
DEAD_LETTER_FILE.write_text(json.dumps(dlq, indent=2))
|
||||
|
||||
|
||||
def save_checkpoint(action, repo=None, issue=None, detail=None):
|
||||
"""Save the current cycle action for crash recovery."""
|
||||
_ensure_dir()
|
||||
state = {
|
||||
"action": action,
|
||||
"repo": repo,
|
||||
"issue": issue,
|
||||
"detail": detail or "",
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"status": "in-progress",
|
||||
}
|
||||
STATE_FILE.write_text(json.dumps(state, indent=2))
|
||||
|
||||
|
||||
def clear_checkpoint():
|
||||
"""Clear the checkpoint after successful completion."""
|
||||
_ensure_dir()
|
||||
state = {
|
||||
"action": None,
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"status": "complete",
|
||||
}
|
||||
STATE_FILE.write_text(json.dumps(state, indent=2))
|
||||
|
||||
|
||||
def load_checkpoint():
|
||||
"""Load the last checkpoint for crash recovery."""
|
||||
if not STATE_FILE.exists():
|
||||
return None
|
||||
try:
|
||||
return json.loads(STATE_FILE.read_text())
|
||||
except json.JSONDecodeError:
|
||||
return None
|
||||
|
||||
|
||||
def get_dead_letter_summary():
|
||||
"""Return a human-readable summary of the dead letter queue."""
|
||||
if not DEAD_LETTER_FILE.exists():
|
||||
return "Dead letter queue: empty"
|
||||
try:
|
||||
dlq = json.loads(DEAD_LETTER_FILE.read_text())
|
||||
lines = [f"Dead letter queue: {len(dlq)} failed actions"]
|
||||
for entry in dlq[-10:]: # Show last 10
|
||||
lines.append(f" - {entry['function']}: {entry['error'][:100]} at {entry['timestamp']}")
|
||||
return "\n".join(lines)
|
||||
except json.JSONDecodeError:
|
||||
return "Dead letter queue: corrupt"
|
||||
@@ -1,141 +0,0 @@
|
||||
# Operation Get A Job — Master Plan
|
||||
|
||||
## Mission Statement
|
||||
|
||||
Monetize the engineering capability of a production AI agent fleet to fund infrastructure expansion. Alexander Whitestone handles the last human mile — meetings, contracts, and client relationships. The fleet handles everything else.
|
||||
|
||||
## The Core Thesis
|
||||
|
||||
We are not a solo freelancer. We are a firm with a human principal and a fleet of five autonomous AI engineers that ship production code 24/7. This is a force multiplier that no traditional consultancy can match.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Foundation (Week 1-2)
|
||||
|
||||
### Entity & Legal
|
||||
- [ ] Form Wyoming LLC (see entity-setup.md)
|
||||
- [ ] Open Mercury business banking account
|
||||
- [ ] Obtain EIN from IRS (online, instant)
|
||||
- [ ] Secure E&O insurance policy (~$150/mo)
|
||||
- [ ] Set up invoicing (Stripe or Invoice Ninja)
|
||||
- [ ] Draft master services agreement (MSA) template
|
||||
- [ ] Draft statement of work (SOW) template
|
||||
|
||||
### Brand & Presence
|
||||
- [ ] Register domain (alexanderwhitestone.com or firm name)
|
||||
- [ ] Deploy portfolio site (static site from portfolio.md content)
|
||||
- [ ] Set up professional email (hello@domain)
|
||||
- [ ] Create LinkedIn company page
|
||||
- [ ] Create Upwork agency profile
|
||||
- [ ] Prepare 60-second elevator pitch
|
||||
|
||||
### Internal Readiness
|
||||
- [ ] Document fleet capabilities inventory
|
||||
- [ ] Establish client onboarding workflow
|
||||
- [ ] Set up project tracking (Gitea issues or similar)
|
||||
- [ ] Create secure client communication channels
|
||||
- [ ] Test end-to-end delivery: inquiry → proposal → delivery → invoice
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Pipeline Building (Week 2-4)
|
||||
|
||||
### Outreach Channels (Priority Order)
|
||||
1. **Upwork** — Post agency profile, bid on 5-10 relevant jobs/week
|
||||
2. **LinkedIn** — Direct outreach to CTOs/VPs Eng at Series A-C startups
|
||||
3. **Twitter/X** — Ship in public, engage AI/DevOps communities
|
||||
4. **Discord** — AI builder communities, offer value before pitching
|
||||
5. **Direct Email** — Targeted cold outreach to companies with known pain points
|
||||
6. **Toptal/Gun.io** — Apply to premium freelance networks
|
||||
7. **Referrals** — Ask every contact for warm intros
|
||||
|
||||
### Target Client Profiles
|
||||
- **Startup CTO** — Needs infrastructure but can't hire a full platform team
|
||||
- **AI Company** — Needs agent security, guardrails, or fleet management
|
||||
- **Enterprise Innovation Lab** — Wants to pilot autonomous agent workflows
|
||||
- **DevOps-Light Company** — Has engineers but no CI/CD, no automation
|
||||
- **Crypto/Web3 Project** — Needs sovereign infrastructure, self-hosted tooling
|
||||
|
||||
### Weekly Cadence
|
||||
- Monday: 10 new outreach messages
|
||||
- Tuesday-Thursday: Follow up on open threads, deliver proposals
|
||||
- Friday: Review pipeline, update portfolio, ship public content
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: First Revenue (Week 3-6)
|
||||
|
||||
### Target: $5k-15k first month
|
||||
- Land 1-2 Tier 3 engagements (automation/research, $5-10k each)
|
||||
- Use these as case studies for Tier 1/2 upsells
|
||||
- Deliver fast, over-deliver on quality
|
||||
|
||||
### Pricing Strategy
|
||||
- Lead with project pricing (clients prefer predictability)
|
||||
- Hourly only for advisory/consulting calls
|
||||
- Always bill as the firm, never as "me"
|
||||
- Net-15 payment terms, 50% upfront for new clients
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Scale (Month 2-3)
|
||||
|
||||
### Revenue Target: $20-40k/month
|
||||
- Move toward retainer relationships ($5-15k/mo per client)
|
||||
- Build recurring revenue base
|
||||
- Hire subcontractors for overflow (other AI-native engineers)
|
||||
- Invest profits in hardware (GPUs, additional VPS capacity)
|
||||
|
||||
### Reinvestment Priority
|
||||
1. More compute (local inference capacity)
|
||||
2. Additional agent instances
|
||||
3. Premium tooling subscriptions
|
||||
4. Marketing/content production
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Moat Building (Month 3-6)
|
||||
|
||||
- Publish open-source tools from client work (with permission)
|
||||
- Build public reputation through conference talks / podcast appearances
|
||||
- Develop proprietary frameworks that lock in competitive advantage
|
||||
- Establish the firm as THE go-to for autonomous agent infrastructure
|
||||
|
||||
---
|
||||
|
||||
## Key Metrics to Track
|
||||
|
||||
| Metric | Week 1 | Month 1 | Month 3 |
|
||||
|--------|--------|---------|---------|
|
||||
| Outreach sent | 20 | 80+ | 200+ |
|
||||
| Proposals sent | 3 | 10+ | 25+ |
|
||||
| Clients signed | 0 | 2-3 | 5-8 |
|
||||
| Revenue | $0 | $10-15k | $30-50k |
|
||||
| Pipeline value | $10k | $50k+ | $150k+ |
|
||||
|
||||
---
|
||||
|
||||
## Decision Rules
|
||||
|
||||
- Any project under $2k: decline (not worth context switching)
|
||||
- Any project requiring on-site: decline unless >$500/hr
|
||||
- Any project with unclear scope: require paid discovery phase first
|
||||
- Any client who won't sign MSA: walk away
|
||||
- Any client who wants to hire "just the human": explain the model or walk
|
||||
|
||||
---
|
||||
|
||||
## Files in This Package
|
||||
|
||||
1. `README.md` — This file (master plan)
|
||||
2. `entity-setup.md` — Wyoming LLC formation checklist
|
||||
3. `service-offerings.md` — What we sell (3 tiers + packages)
|
||||
4. `portfolio.md` — What the fleet has built
|
||||
5. `outreach-templates.md` — 5 cold outreach templates
|
||||
6. `proposal-template.md` — Professional proposal template
|
||||
7. `rate-card.md` — Detailed rate card
|
||||
|
||||
---
|
||||
|
||||
*Last updated: April 2026*
|
||||
*Operation Get A Job v1.0*
|
||||
@@ -1,203 +0,0 @@
|
||||
# Entity Setup — Wyoming LLC Formation Checklist
|
||||
|
||||
## Why Wyoming?
|
||||
|
||||
- No state income tax
|
||||
- Strong privacy protections (no public member disclosure required)
|
||||
- Low annual fees ($60/year registered agent + $60 annual report)
|
||||
- Business-friendly courts
|
||||
- Fast online filing
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Choose Your LLC Name
|
||||
|
||||
- [ ] Decide on firm name (suggestions below)
|
||||
- [ ] Search Wyoming Secretary of State name availability
|
||||
- Link: https://wyobiz.wyo.gov/Business/FilingSearch.aspx
|
||||
- [ ] Ensure matching domain is available
|
||||
|
||||
### Name Suggestions
|
||||
- Whitestone Engineering LLC
|
||||
- Whitestone Labs LLC
|
||||
- Hermes Systems LLC
|
||||
- Whitestone & Fleet LLC
|
||||
- Sovereign Stack LLC
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Appoint a Registered Agent
|
||||
|
||||
You need a Wyoming registered agent (physical address in WY for legal mail).
|
||||
|
||||
### Recommended Registered Agent Services
|
||||
- **Wyoming Registered Agent LLC** — $60/year (cheapest, reliable)
|
||||
- Link: https://www.wyomingagents.com
|
||||
- **Northwest Registered Agent** — $125/year (premium service)
|
||||
- Link: https://www.northwestregisteredagent.com
|
||||
- **ZenBusiness** — $199/year (bundled with formation)
|
||||
- Link: https://www.zenbusiness.com
|
||||
|
||||
**Recommendation:** Wyoming Registered Agent LLC at $60/year. No frills, gets the job done.
|
||||
|
||||
---
|
||||
|
||||
## Step 3: File Articles of Organization
|
||||
|
||||
- [ ] File online with Wyoming Secretary of State
|
||||
- Link: https://wyobiz.wyo.gov/Business/FilingSearch.aspx
|
||||
- Click "File a New Business"
|
||||
- [ ] Filing fee: **$100** (online) or $102 (mail)
|
||||
- [ ] Processing time: 1-2 business days (online), 2-3 weeks (mail)
|
||||
|
||||
### Information Needed
|
||||
- LLC name
|
||||
- Registered agent name and address
|
||||
- Organizer name and address (can be the registered agent)
|
||||
- Management structure: Member-managed (choose this)
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Get Your EIN (Employer Identification Number)
|
||||
|
||||
- [ ] Apply online with the IRS (free, instant)
|
||||
- Link: https://www.irs.gov/businesses/small-businesses-self-employed/apply-for-an-employer-identification-number-ein-online
|
||||
- [ ] Available Monday-Friday, 7am-10pm Eastern
|
||||
- [ ] You'll get your EIN immediately upon completion
|
||||
- [ ] Download and save the confirmation letter (CP 575)
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Draft Operating Agreement
|
||||
|
||||
- [ ] Create a single-member LLC operating agreement
|
||||
- [ ] This is not filed with the state but is essential for:
|
||||
- Bank account opening
|
||||
- Liability protection (piercing the corporate veil prevention)
|
||||
- Tax elections
|
||||
|
||||
### Free Template Sources
|
||||
- Northwest Registered Agent provides one free
|
||||
- LawDepot: https://www.lawdepot.com
|
||||
- Or have an attorney draft one ($300-500)
|
||||
|
||||
---
|
||||
|
||||
## Step 6: Open Business Bank Account
|
||||
|
||||
### Recommended: Mercury Banking
|
||||
- Link: https://mercury.com
|
||||
- [ ] Apply online (takes 1-3 business days)
|
||||
- [ ] Documents needed:
|
||||
- EIN confirmation (CP 575)
|
||||
- Articles of Organization
|
||||
- Operating Agreement
|
||||
- Government-issued ID
|
||||
- [ ] Benefits:
|
||||
- No monthly fees
|
||||
- No minimum balance
|
||||
- API access for automation
|
||||
- Virtual debit cards
|
||||
- Built-in invoicing
|
||||
- Treasury for idle cash
|
||||
|
||||
### Alternative: Relay Financial
|
||||
- Link: https://relayfi.com
|
||||
- Similar features, also startup-friendly
|
||||
|
||||
---
|
||||
|
||||
## Step 7: Set Up Invoicing & Payments
|
||||
|
||||
### Option A: Stripe (Recommended)
|
||||
- [ ] Create Stripe account linked to Mercury
|
||||
- [ ] Set up Stripe Invoicing
|
||||
- [ ] Accept ACH (lower fees) and credit cards
|
||||
- Fees: 2.9% + 30¢ (card), 0.8% capped at $5 (ACH)
|
||||
|
||||
### Option B: Invoice Ninja (Self-Hosted)
|
||||
- [ ] Deploy on your VPS (you already have the infrastructure)
|
||||
- [ ] Connect to Stripe for payment processing
|
||||
- [ ] Full control, no SaaS fees
|
||||
|
||||
---
|
||||
|
||||
## Step 8: Get E&O Insurance (Errors & Omissions)
|
||||
|
||||
This protects you if a client claims your work caused them harm.
|
||||
|
||||
### Recommended Providers
|
||||
- **Hiscox** — ~$100-150/month for tech consulting
|
||||
- Link: https://www.hiscox.com
|
||||
- **Hartford** — Similar pricing
|
||||
- Link: https://www.thehartford.com
|
||||
- **Embroker** — Tech-focused, may be cheaper
|
||||
- Link: https://www.embroker.com
|
||||
|
||||
### Coverage to Get
|
||||
- [ ] Professional Liability / E&O: $1M per occurrence / $2M aggregate
|
||||
- [ ] General Liability: $1M per occurrence / $2M aggregate
|
||||
- [ ] Cyber Liability: Optional but recommended given the AI work
|
||||
|
||||
**Budget: ~$150/month ($1,800/year)**
|
||||
|
||||
---
|
||||
|
||||
## Step 9: Tax Setup
|
||||
|
||||
- [ ] Elect S-Corp taxation (Form 2553) if revenue exceeds ~$40k/year
|
||||
- Saves on self-employment tax
|
||||
- Must pay yourself "reasonable salary" via payroll
|
||||
- Use Gusto ($40/mo) or similar for payroll
|
||||
- [ ] Set aside 30% of revenue for taxes quarterly
|
||||
- [ ] File estimated quarterly taxes (Form 1040-ES)
|
||||
- [ ] Get a CPA familiar with LLCs ($200-500/year for filing)
|
||||
|
||||
### Recommended CPA Services
|
||||
- Bench.co — Bookkeeping + tax filing ($300-500/mo)
|
||||
- Collective.com — Designed for solo businesses ($349/mo, includes S-Corp)
|
||||
- Local CPA — Shop around, $1-2k/year for everything
|
||||
|
||||
---
|
||||
|
||||
## Step 10: Professional Presence
|
||||
|
||||
- [ ] Get a business phone number (Google Voice — free, or OpenPhone — $15/mo)
|
||||
- [ ] Set up professional email (Google Workspace $6/mo or self-hosted)
|
||||
- [ ] Order business cards (optional, Moo.com or similar)
|
||||
- [ ] Create LinkedIn company page
|
||||
- [ ] Update personal LinkedIn with firm title (Managing Partner / Principal)
|
||||
|
||||
---
|
||||
|
||||
## Total Startup Costs Estimate
|
||||
|
||||
| Item | Cost |
|
||||
|------|------|
|
||||
| Wyoming LLC filing | $100 |
|
||||
| Registered agent (annual) | $60 |
|
||||
| EIN | Free |
|
||||
| Mercury bank account | Free |
|
||||
| E&O insurance (first month) | $150 |
|
||||
| Domain + email | $12 + $6/mo |
|
||||
| **Total to launch** | **~$330** |
|
||||
| **Monthly ongoing** | **~$160/mo** |
|
||||
|
||||
---
|
||||
|
||||
## Timeline
|
||||
|
||||
| Day | Action |
|
||||
|-----|--------|
|
||||
| Day 1 | File LLC + order registered agent |
|
||||
| Day 2-3 | Receive LLC confirmation |
|
||||
| Day 3 | Get EIN (same day) |
|
||||
| Day 3 | Apply for Mercury account |
|
||||
| Day 4-5 | Mercury approved |
|
||||
| Day 5 | Set up Stripe, get insurance quote |
|
||||
| Day 6-7 | Insurance bound, invoicing live |
|
||||
| **Day 7** | **Ready to bill clients** |
|
||||
|
||||
---
|
||||
|
||||
*You can go from zero to invoicing in under a week. Don't let entity setup be a blocker — you can start conversations immediately and have the entity ready before you need to send the first invoice.*
|
||||
@@ -1,216 +0,0 @@
|
||||
# Outreach Templates
|
||||
|
||||
## How to Use These Templates
|
||||
|
||||
- Replace everything in [BRACKETS] with your specific details
|
||||
- Keep messages concise — busy people don't read walls of text
|
||||
- Always lead with value, not credentials
|
||||
- Follow up once after 3-5 days if no response, then move on
|
||||
- Track all outreach in a spreadsheet (date, platform, response, status)
|
||||
|
||||
---
|
||||
|
||||
## Template 1: Upwork Proposal
|
||||
|
||||
**Use for:** Responding to job postings related to AI agents, DevOps, automation, LLM infrastructure
|
||||
|
||||
---
|
||||
|
||||
Hi [CLIENT NAME],
|
||||
|
||||
I read your posting about [SPECIFIC REQUIREMENT FROM JOB POST]. This is exactly what my firm does day in, day out.
|
||||
|
||||
We're a small engineering firm that runs a fleet of five autonomous AI agents in production. Not demos — real agents running as systemd services, shipping code to a 43-repo forge, executing 15-minute autonomous work cycles 24/7. We built the orchestration framework (Hermes), the security layer, and the local LLM inference stack ourselves.
|
||||
|
||||
For your project specifically:
|
||||
|
||||
- [SPECIFIC THING THEY NEED #1] — We've built [RELEVANT THING YOU'VE DONE]
|
||||
- [SPECIFIC THING THEY NEED #2] — We can deliver this using [YOUR APPROACH]
|
||||
- [SPECIFIC THING THEY NEED #3] — Our timeline estimate is [X WEEKS]
|
||||
|
||||
I'd suggest a [STARTER/PROFESSIONAL/CUSTOM] engagement at [$PRICE] with [TIMELINE]. Happy to do a 30-minute call to scope it properly.
|
||||
|
||||
Portfolio: [YOUR PORTFOLIO URL]
|
||||
|
||||
Best,
|
||||
Alexander Whitestone
|
||||
Whitestone Engineering
|
||||
|
||||
---
|
||||
|
||||
## Template 2: LinkedIn Direct Message
|
||||
|
||||
**Use for:** Cold outreach to CTOs, VPs of Engineering, Heads of AI/ML at startups (Series A-C)
|
||||
|
||||
---
|
||||
|
||||
Hi [FIRST NAME],
|
||||
|
||||
I noticed [COMPANY] is [SPECIFIC OBSERVATION — hiring for AI roles / launching an AI feature / scaling infrastructure]. Congrats on [RECENT MILESTONE IF APPLICABLE].
|
||||
|
||||
Quick context: I run an engineering firm with a fleet of autonomous AI agents that build production infrastructure. We handle agent deployment, security hardening, and automation for companies that want AI systems that actually work in production, not just in demos.
|
||||
|
||||
We recently [RELEVANT ACCOMPLISHMENT — e.g., "deployed a multi-agent fleet with 3,000+ tests and local LLM inference" or "built a conscience validation system for AI safety"].
|
||||
|
||||
Would it be useful to chat for 15 minutes about [SPECIFIC PAIN POINT YOU THINK THEY HAVE]? No pitch — just want to see if there's a fit.
|
||||
|
||||
— Alexander
|
||||
|
||||
---
|
||||
|
||||
## Template 3: Twitter/X DM or Reply
|
||||
|
||||
**Use for:** Engaging with people posting about AI agent challenges, DevOps pain, or LLM infrastructure problems
|
||||
|
||||
---
|
||||
|
||||
### Version A: Reply to a post about AI agent problems
|
||||
|
||||
[THEIR NAME] — we solved this exact problem. We run 5 autonomous agents in production (systemd services, 15-min burn cycles, persistent memory). The key insight was [SPECIFIC TECHNICAL INSIGHT RELEVANT TO THEIR POST].
|
||||
|
||||
Happy to share our approach if useful. We built an open orchestration framework that handles [RELEVANT CAPABILITY].
|
||||
|
||||
---
|
||||
|
||||
### Version B: DM after engaging with their content
|
||||
|
||||
Hey [FIRST NAME] — been following your posts on [TOPIC]. Really resonated with your point about [SPECIFIC THING THEY SAID].
|
||||
|
||||
We're running a production fleet of AI agents and have solved a lot of the problems you're describing. Built our own framework (Hermes) for agent orchestration, security, and multi-platform deployment.
|
||||
|
||||
Not trying to sell anything — just think there might be useful knowledge exchange. Down to chat?
|
||||
|
||||
---
|
||||
|
||||
### Version C: Cold DM to potential client
|
||||
|
||||
Hey [FIRST NAME] — saw [COMPANY] is working on [WHAT THEY'RE BUILDING]. My firm builds production AI agent infrastructure — fleet orchestration, local LLM stacks, agent security. We run 5 agents 24/7 on our own infra.
|
||||
|
||||
Would love to show you what we've built. Might save your team months. 15 min call?
|
||||
|
||||
---
|
||||
|
||||
## Template 4: Discord Community Post / DM
|
||||
|
||||
**Use for:** AI builder communities, DevOps communities, indie hacker communities
|
||||
|
||||
---
|
||||
|
||||
### Version A: Community post (value-first)
|
||||
|
||||
Been running a fleet of 5 autonomous AI agents in production for a while now, wanted to share some lessons learned:
|
||||
|
||||
1. **Persistent memory matters more than model quality.** An agent with good memory and a decent model outperforms a genius model with no context.
|
||||
|
||||
2. **Security can't be an afterthought.** We built a conscience validation layer after discovering [VAGUE REFERENCE TO REAL INCIDENT]. Now every agent action goes through guardrails.
|
||||
|
||||
3. **Local inference is viable for most tasks.** We run Gemma via Ollama for [X]% of agent operations. Cloud APIs are the fallback, not the default.
|
||||
|
||||
4. **Systemd > Docker for single-machine agent fleets.** Hot take, but the simplicity wins when you're managing 5 agents on one box.
|
||||
|
||||
Full system: 43 repos, 3,000+ tests, multi-platform gateway (Telegram/Discord/Slack), webhook CI/CD.
|
||||
|
||||
Happy to answer questions or go deeper on any of these.
|
||||
|
||||
---
|
||||
|
||||
### Version B: DM to someone asking for help
|
||||
|
||||
Hey! Saw your question about [THEIR QUESTION]. We've built exactly this — [BRIEF DESCRIPTION OF YOUR RELEVANT SYSTEM].
|
||||
|
||||
The short answer: [HELPFUL TECHNICAL ANSWER].
|
||||
|
||||
If you want, I can share more details about our setup. We also do this professionally if you ever need hands-on help deploying something similar.
|
||||
|
||||
---
|
||||
|
||||
## Template 5: Direct Cold Email
|
||||
|
||||
**Use for:** Targeted outreach to companies you've researched that have a clear need
|
||||
|
||||
---
|
||||
|
||||
**Subject:** [COMPANY]'s [SPECIFIC CHALLENGE] — solved it, can show you how
|
||||
|
||||
Hi [FIRST NAME],
|
||||
|
||||
I'm Alexander Whitestone, principal at Whitestone Engineering. We build production AI agent infrastructure — the kind that runs 24/7, ships real code, and doesn't break.
|
||||
|
||||
I'm reaching out because [SPECIFIC REASON — e.g., "I saw your job posting for a platform engineer to build AI agent tooling" / "your blog post about scaling LLM operations mentioned exactly the problems we solve" / "a mutual contact mentioned you're building an AI agent product"].
|
||||
|
||||
**What we've built (and can build for you):**
|
||||
|
||||
- A fleet of 5 autonomous AI agents running as systemd services, completing 15-minute autonomous work cycles
|
||||
- Custom orchestration framework with persistent memory, skills system, and multi-platform gateway
|
||||
- Local LLM inference stack (zero external API dependency for core operations)
|
||||
- Agent security layer with jailbreak resistance and conscience validation (3,000+ tests)
|
||||
- Self-hosted forge with 43 repos and webhook-driven CI/CD
|
||||
|
||||
**Why this matters for [COMPANY]:**
|
||||
|
||||
[2-3 sentences about how your capabilities map to their specific needs. Be concrete.]
|
||||
|
||||
I'm not looking to send you a generic pitch deck. I'd rather spend 20 minutes on a call understanding your specific situation and telling you honestly whether we can help.
|
||||
|
||||
Available [DAY/TIME] or [DAY/TIME] this week. Or just reply with what works.
|
||||
|
||||
Best,
|
||||
Alexander Whitestone
|
||||
Principal, Whitestone Engineering
|
||||
[EMAIL]
|
||||
[PHONE — optional]
|
||||
[PORTFOLIO URL]
|
||||
|
||||
---
|
||||
|
||||
## Follow-Up Templates
|
||||
|
||||
### Follow-Up #1 (3-5 days after initial outreach)
|
||||
|
||||
Hi [FIRST NAME],
|
||||
|
||||
Following up on my note from [DAY]. I know inboxes are brutal.
|
||||
|
||||
The one-line version: we build production AI agent infrastructure and I think we can help [COMPANY] with [SPECIFIC THING].
|
||||
|
||||
Worth a 15-minute chat? If not, no worries — happy to stay in touch for when the timing is better.
|
||||
|
||||
— Alexander
|
||||
|
||||
---
|
||||
|
||||
### Follow-Up #2 (7-10 days after Follow-Up #1, final attempt)
|
||||
|
||||
Hi [FIRST NAME],
|
||||
|
||||
Last note from me on this — don't want to be that person.
|
||||
|
||||
If [SPECIFIC CHALLENGE] is still on your radar, we're here. If the timing isn't right, totally understand.
|
||||
|
||||
Either way, I write about AI agent operations occasionally. Happy to share if that's useful.
|
||||
|
||||
Best,
|
||||
Alexander
|
||||
|
||||
---
|
||||
|
||||
## Outreach Tracking Spreadsheet Columns
|
||||
|
||||
| Date | Platform | Contact Name | Company | Message Type | Response? | Follow-Up Date | Status | Notes |
|
||||
|------|----------|-------------|---------|-------------|-----------|----------------|--------|-------|
|
||||
| | | | | | | | | |
|
||||
|
||||
### Status Options
|
||||
- Sent
|
||||
- Responded — Interested
|
||||
- Responded — Not Now
|
||||
- Responded — Not Interested
|
||||
- Meeting Scheduled
|
||||
- Proposal Sent
|
||||
- Won
|
||||
- Lost
|
||||
- No Response
|
||||
|
||||
---
|
||||
|
||||
*Remember: outreach is a numbers game. Aim for 10 quality touches per week minimum. One in ten will respond. One in three responses will take a meeting. One in three meetings will become a client. That means ~100 outreach messages to land ~1 client. Adjust volume accordingly.*
|
||||
@@ -1,182 +0,0 @@
|
||||
# Portfolio — What We've Built
|
||||
|
||||
## About Whitestone Engineering
|
||||
|
||||
We are a human-led engineering firm augmented by a fleet of five autonomous AI agents. Our principal, Alexander Whitestone, architects systems and directs operations. The fleet — Allegro, Adagio, Ezra, Bezalel, and Bilbobagginshire — builds, tests, and ships production code autonomously.
|
||||
|
||||
This is not a demo. This is not a prototype. Everything below is running in production.
|
||||
|
||||
---
|
||||
|
||||
## The Fleet
|
||||
|
||||
### Agent Roster
|
||||
|
||||
| Agent | Role | Specialization |
|
||||
|-------|------|---------------|
|
||||
| **Allegro** | Lead Engineer | Fast-paced development, feature shipping |
|
||||
| **Adagio** | Quality & Review | Careful analysis, code review, testing |
|
||||
| **Ezra** | Research & Analysis | Technical research, intelligence synthesis |
|
||||
| **Bezalel** | Infrastructure | System administration, deployment, DevOps |
|
||||
| **Bilbobagginshire** | Exploration | Novel approaches, creative problem-solving |
|
||||
|
||||
All agents run as systemd services on dedicated infrastructure, operating in autonomous 15-minute burn cycles around the clock.
|
||||
|
||||
---
|
||||
|
||||
## Production Systems
|
||||
|
||||
### 1. Hermes Agent Framework
|
||||
**Custom-built multi-agent orchestration platform**
|
||||
|
||||
- Persistent memory system — agents retain context across sessions
|
||||
- Skills framework — modular capability system for agent specialization
|
||||
- Cron scheduling — autonomous task execution on configurable intervals
|
||||
- Multi-platform gateway — single agent, multiple communication channels:
|
||||
- Telegram
|
||||
- Discord
|
||||
- Slack
|
||||
- Custom webhook endpoints
|
||||
- Burn-mode operations — 15-minute autonomous work cycles
|
||||
- Inter-agent communication and task delegation
|
||||
|
||||
**Tech:** Python, systemd, SQLite/PostgreSQL, REST APIs
|
||||
|
||||
---
|
||||
|
||||
### 2. Self-Hosted Code Forge (Gitea)
|
||||
**Sovereign development infrastructure**
|
||||
|
||||
- 43 active repositories
|
||||
- 16 organization members (human + AI agents)
|
||||
- Full Git workflow with branch protection and review
|
||||
- Webhook-driven CI/CD pipeline triggering automated builds and deploys
|
||||
- Issue tracking integrated with agent task assignment
|
||||
- Running at forge.alexanderwhitestone.com
|
||||
|
||||
**Tech:** Gitea, Git, webhooks, nginx, Let's Encrypt
|
||||
|
||||
---
|
||||
|
||||
### 3. Agent Security & Conscience System
|
||||
**Production AI safety infrastructure**
|
||||
|
||||
- Conscience validation layer — ethical guardrails enforced at runtime
|
||||
- Jailbreak resistance — tested against known attack vectors
|
||||
- Crisis detection — automated identification and escalation of safety events
|
||||
- Audit logging — full traceability of agent decisions and actions
|
||||
- 3,000+ automated tests covering security and behavioral boundaries
|
||||
|
||||
**Tech:** Python, custom validation framework, pytest
|
||||
|
||||
---
|
||||
|
||||
### 4. Local LLM Inference Stack
|
||||
**Sovereign AI — no external API dependency**
|
||||
|
||||
- Ollama deployment with Gemma model family
|
||||
- Local inference for sensitive operations
|
||||
- Fallback architecture — local models for availability, cloud for capability
|
||||
- Reduced operational costs vs. pure API consumption
|
||||
- Full data sovereignty — nothing leaves the infrastructure
|
||||
|
||||
**Tech:** Ollama, Gemma, REST API, systemd
|
||||
|
||||
---
|
||||
|
||||
### 5. Nostr Relay (NIP-29)
|
||||
**Decentralized sovereign communications**
|
||||
|
||||
- NIP-29 compliant group relay
|
||||
- Censorship-resistant communication backbone
|
||||
- Agent-to-agent messaging over decentralized protocol
|
||||
- No dependency on corporate communication platforms
|
||||
|
||||
**Tech:** Nostr protocol, Go/Rust relay implementation, WebSocket
|
||||
|
||||
---
|
||||
|
||||
### 6. GOFAI Hybrid Neuro-Symbolic Reasoning
|
||||
**Beyond pattern matching — structured reasoning**
|
||||
|
||||
- Classic AI (GOFAI) techniques combined with neural approaches
|
||||
- Symbolic reasoning for audit trails and explainability
|
||||
- Rule-based decision systems with LLM-powered natural language interface
|
||||
- Deterministic + probabilistic hybrid for critical operations
|
||||
|
||||
**Tech:** Python, custom symbolic engine, LLM integration
|
||||
|
||||
---
|
||||
|
||||
### 7. Evennia MUD with Custom Audit Typeclasses
|
||||
**Interactive environment with full audit capabilities**
|
||||
|
||||
- Custom typeclass system for object behavior tracking
|
||||
- Full audit trail of all interactions and state changes
|
||||
- Extensible framework for simulation and testing
|
||||
- Used internally for agent training and scenario modeling
|
||||
|
||||
**Tech:** Evennia (Python/Django), Twisted, custom typeclasses
|
||||
|
||||
---
|
||||
|
||||
### 8. Webhook-Driven CI/CD Pipeline
|
||||
**Automated build, test, and deploy**
|
||||
|
||||
- Gitea webhook triggers on push/PR/merge
|
||||
- Automated test execution (3,000+ test suite)
|
||||
- Build and deployment automation
|
||||
- Status reporting back to issues and PRs
|
||||
- Zero-manual-intervention deployment for passing builds
|
||||
|
||||
**Tech:** Gitea webhooks, shell automation, systemd, nginx
|
||||
|
||||
---
|
||||
|
||||
## By the Numbers
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Active repositories | 43 |
|
||||
| Organization members | 16 |
|
||||
| Autonomous agents | 5 |
|
||||
| Automated tests | 3,000+ |
|
||||
| Platforms integrated | 4+ (Telegram, Discord, Slack, webhooks) |
|
||||
| Uptime model | 24/7 autonomous operation |
|
||||
| Infrastructure | Self-hosted, sovereign |
|
||||
| External dependencies | Minimal (by design) |
|
||||
|
||||
---
|
||||
|
||||
## What This Means for Clients
|
||||
|
||||
### We've Already Solved the Hard Problems
|
||||
- Agent orchestration at scale? Done.
|
||||
- Agent security and safety? Production-tested.
|
||||
- Autonomous operations? Running 24/7.
|
||||
- Local inference? Deployed.
|
||||
- Multi-platform integration? Built and shipping.
|
||||
|
||||
### You Get a Proven System, Not a Prototype
|
||||
When we deploy agent infrastructure for you, we're not figuring it out for the first time. We're adapting battle-tested systems that have been running in production for months.
|
||||
|
||||
### You Get the Fleet, Not Just One Person
|
||||
Every engagement is backed by the full fleet. That means faster delivery, more thorough testing, and around-the-clock progress on your project.
|
||||
|
||||
---
|
||||
|
||||
## Case Study Format (For Future Clients)
|
||||
|
||||
*As we complete client engagements, case studies will follow this format:*
|
||||
|
||||
### [Client Name / Industry]
|
||||
**Challenge:** What problem they faced
|
||||
**Solution:** What we built
|
||||
**Results:** Quantified outcomes
|
||||
**Timeline:** How fast we delivered
|
||||
**Client Quote:** Their words
|
||||
|
||||
---
|
||||
|
||||
*Portfolio last updated: April 2026*
|
||||
*All systems described are running in production at time of writing.*
|
||||
@@ -1,237 +0,0 @@
|
||||
# Proposal Template
|
||||
|
||||
---
|
||||
|
||||
# PROPOSAL
|
||||
|
||||
## [PROJECT NAME]
|
||||
|
||||
**Prepared for:** [CLIENT NAME], [CLIENT TITLE]
|
||||
**Company:** [CLIENT COMPANY]
|
||||
**Prepared by:** Alexander Whitestone, Principal
|
||||
**Firm:** Whitestone Engineering LLC
|
||||
**Date:** [DATE]
|
||||
**Valid until:** [DATE + 30 DAYS]
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
[CLIENT COMPANY] needs [1-2 SENTENCE SUMMARY OF THEIR PROBLEM]. Whitestone Engineering proposes to [1-2 SENTENCE SUMMARY OF THE SOLUTION] within [TIMELINE], enabling [CLIENT COMPANY] to [KEY BUSINESS OUTCOME].
|
||||
|
||||
Our firm brings production-tested expertise in AI agent infrastructure, having built and operated a fleet of five autonomous AI agents, a custom orchestration framework, and supporting infrastructure spanning 43 repositories with 3,000+ automated tests.
|
||||
|
||||
---
|
||||
|
||||
## Understanding of the Problem
|
||||
|
||||
[2-3 paragraphs demonstrating you understand their situation. Be specific. Reference things they told you in the discovery call. Show you've done homework on their business.]
|
||||
|
||||
Key challenges identified:
|
||||
1. [CHALLENGE 1]
|
||||
2. [CHALLENGE 2]
|
||||
3. [CHALLENGE 3]
|
||||
|
||||
---
|
||||
|
||||
## Proposed Solution
|
||||
|
||||
### Overview
|
||||
|
||||
[2-3 paragraphs describing the solution at a high level. Focus on outcomes, not just technical details.]
|
||||
|
||||
### Scope of Work
|
||||
|
||||
#### Phase 1: [PHASE NAME] — [DURATION]
|
||||
|
||||
| Deliverable | Description |
|
||||
|-------------|-------------|
|
||||
| [DELIVERABLE 1] | [DESCRIPTION] |
|
||||
| [DELIVERABLE 2] | [DESCRIPTION] |
|
||||
| [DELIVERABLE 3] | [DESCRIPTION] |
|
||||
|
||||
**Milestone:** [WHAT CLIENT RECEIVES AT END OF PHASE 1]
|
||||
|
||||
#### Phase 2: [PHASE NAME] — [DURATION]
|
||||
|
||||
| Deliverable | Description |
|
||||
|-------------|-------------|
|
||||
| [DELIVERABLE 4] | [DESCRIPTION] |
|
||||
| [DELIVERABLE 5] | [DESCRIPTION] |
|
||||
| [DELIVERABLE 6] | [DESCRIPTION] |
|
||||
|
||||
**Milestone:** [WHAT CLIENT RECEIVES AT END OF PHASE 2]
|
||||
|
||||
#### Phase 3: [PHASE NAME] — [DURATION]
|
||||
|
||||
| Deliverable | Description |
|
||||
|-------------|-------------|
|
||||
| [DELIVERABLE 7] | [DESCRIPTION] |
|
||||
| [DELIVERABLE 8] | [DESCRIPTION] |
|
||||
|
||||
**Milestone:** [FINAL DELIVERABLE / PROJECT COMPLETION]
|
||||
|
||||
### Out of Scope
|
||||
|
||||
The following items are explicitly not included in this engagement. They can be addressed in a follow-on project:
|
||||
|
||||
- [OUT OF SCOPE ITEM 1]
|
||||
- [OUT OF SCOPE ITEM 2]
|
||||
- [OUT OF SCOPE ITEM 3]
|
||||
|
||||
---
|
||||
|
||||
## Timeline
|
||||
|
||||
| Phase | Duration | Start | End |
|
||||
|-------|----------|-------|-----|
|
||||
| Phase 1: [NAME] | [X weeks] | [DATE] | [DATE] |
|
||||
| Phase 2: [NAME] | [X weeks] | [DATE] | [DATE] |
|
||||
| Phase 3: [NAME] | [X weeks] | [DATE] | [DATE] |
|
||||
| **Total** | **[X weeks]** | **[DATE]** | **[DATE]** |
|
||||
|
||||
*Timeline begins upon receipt of signed agreement and initial deposit.*
|
||||
|
||||
---
|
||||
|
||||
## Investment
|
||||
|
||||
### Option A: Fixed Project Price
|
||||
|
||||
| Item | Price |
|
||||
|------|-------|
|
||||
| Phase 1: [NAME] | $[AMOUNT] |
|
||||
| Phase 2: [NAME] | $[AMOUNT] |
|
||||
| Phase 3: [NAME] | $[AMOUNT] |
|
||||
| **Total Project** | **$[TOTAL]** |
|
||||
|
||||
### Payment Schedule
|
||||
|
||||
| Payment | Amount | Due |
|
||||
|---------|--------|-----|
|
||||
| Deposit (50%) | $[AMOUNT] | Upon signing |
|
||||
| Phase 1 completion (25%) | $[AMOUNT] | Upon Phase 1 milestone |
|
||||
| Final delivery (25%) | $[AMOUNT] | Upon project completion |
|
||||
|
||||
*[ALTERNATIVE: For larger projects]*
|
||||
|
||||
| Payment | Amount | Due |
|
||||
|---------|--------|-----|
|
||||
| Deposit (30%) | $[AMOUNT] | Upon signing |
|
||||
| Phase 1 completion (25%) | $[AMOUNT] | Upon Phase 1 milestone |
|
||||
| Phase 2 completion (25%) | $[AMOUNT] | Upon Phase 2 milestone |
|
||||
| Final delivery (20%) | $[AMOUNT] | Upon project completion |
|
||||
|
||||
### Option B: Monthly Retainer (If Applicable)
|
||||
|
||||
| Item | Monthly Rate |
|
||||
|------|-------------|
|
||||
| [SCOPE DESCRIPTION] | $[AMOUNT]/month |
|
||||
| Minimum commitment | [X] months |
|
||||
| Included hours | [X] hours/month |
|
||||
| Overage rate | $[AMOUNT]/hr |
|
||||
|
||||
---
|
||||
|
||||
## What's Included
|
||||
|
||||
- All source code and documentation, delivered to your repository
|
||||
- [X] progress update meetings (weekly / biweekly)
|
||||
- Async communication via [Slack / Discord / email]
|
||||
- [X] days of post-delivery support
|
||||
- Full documentation and runbooks
|
||||
- Knowledge transfer session with your team
|
||||
|
||||
---
|
||||
|
||||
## Our Approach
|
||||
|
||||
### How We Work
|
||||
|
||||
Whitestone Engineering operates as a human-led, AI-augmented firm. Our principal engineer, Alexander Whitestone, leads all client relationships, architecture decisions, and quality reviews. Our fleet of five autonomous AI agents handles implementation, testing, and continuous operations.
|
||||
|
||||
This model means:
|
||||
- **Faster delivery** — multiple agents work in parallel
|
||||
- **Higher consistency** — automated testing and systematic processes
|
||||
- **Around-the-clock progress** — agents operate autonomously in 15-minute cycles
|
||||
- **Human accountability** — Alexander is your single point of contact
|
||||
|
||||
### Communication
|
||||
|
||||
- **Weekly status update** via email/Slack with progress, blockers, and next steps
|
||||
- **Biweekly sync call** (30 minutes) for discussion and feedback
|
||||
- **Async availability** during business hours for questions
|
||||
- **Emergency escalation** for critical issues
|
||||
|
||||
### Quality Assurance
|
||||
|
||||
- All code goes through automated test suite before delivery
|
||||
- Human review of all agent-produced work before client delivery
|
||||
- Documentation is written alongside code, not as an afterthought
|
||||
|
||||
---
|
||||
|
||||
## About Whitestone Engineering
|
||||
|
||||
We build production AI agent infrastructure. Our own systems include:
|
||||
|
||||
- **5 autonomous AI agents** running 24/7 as systemd services
|
||||
- **Custom orchestration framework** (Hermes) with persistent memory and multi-platform gateway
|
||||
- **43 active repositories** on a self-hosted Gitea forge with 16 organization members
|
||||
- **3,000+ automated tests** covering functionality, security, and behavioral boundaries
|
||||
- **Local LLM inference** for sovereign, API-independent operations
|
||||
- **Agent security layer** with conscience validation and jailbreak resistance
|
||||
|
||||
We don't just consult on AI agents — we run them in production every day.
|
||||
|
||||
---
|
||||
|
||||
## Terms
|
||||
|
||||
- This proposal is valid for 30 days from the date above
|
||||
- Work begins upon receipt of signed Master Services Agreement and initial deposit
|
||||
- Client owns all deliverables upon final payment
|
||||
- Whitestone Engineering retains the right to use general knowledge and techniques (but not client-specific code or data) in future work
|
||||
- Either party may terminate with 14 days written notice; work completed to date will be invoiced
|
||||
- All amounts in USD; payments via ACH or wire transfer
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Review** this proposal and let us know if you have questions
|
||||
2. **Schedule** a call to discuss any adjustments: [SCHEDULING LINK]
|
||||
3. **Sign** the Master Services Agreement (we'll send it)
|
||||
4. **Deposit** the initial payment
|
||||
5. **Kickoff** — we start building
|
||||
|
||||
---
|
||||
|
||||
## Acceptance
|
||||
|
||||
By signing below, [CLIENT COMPANY] accepts this proposal and authorizes Whitestone Engineering LLC to proceed with the described scope of work under the terms outlined above.
|
||||
|
||||
**For [CLIENT COMPANY]:**
|
||||
|
||||
Name: ________________________________________
|
||||
|
||||
Title: ________________________________________
|
||||
|
||||
Signature: ____________________________________
|
||||
|
||||
Date: ________________________________________
|
||||
|
||||
**For Whitestone Engineering LLC:**
|
||||
|
||||
Name: Alexander Whitestone
|
||||
|
||||
Title: Principal
|
||||
|
||||
Signature: ____________________________________
|
||||
|
||||
Date: ________________________________________
|
||||
|
||||
---
|
||||
|
||||
*Whitestone Engineering LLC — Human-Led, Fleet-Powered*
|
||||
*[EMAIL] | [PHONE] | [WEBSITE]*
|
||||
@@ -1,216 +0,0 @@
|
||||
# Rate Card — Whitestone Engineering LLC
|
||||
|
||||
*Effective April 2026 | All prices USD*
|
||||
|
||||
---
|
||||
|
||||
## Hourly Rates
|
||||
|
||||
| Service Category | Rate Range | Typical Engagement |
|
||||
|-----------------|------------|-------------------|
|
||||
| **Agent Infrastructure** | $400 — $600/hr | Custom agent deployment, fleet orchestration, framework development |
|
||||
| **Security & Hardening** | $250 — $400/hr | Security audits, jailbreak resistance, conscience systems, compliance |
|
||||
| **Automation & Research** | $150 — $250/hr | CI/CD pipelines, automation, research synthesis, tooling |
|
||||
| **Advisory / Consulting** | $300 — $500/hr | Architecture review, technical strategy, due diligence |
|
||||
| **Emergency / Incident Response** | $500 — $800/hr | Production issues, security incidents, urgent fixes (4-hr minimum) |
|
||||
|
||||
### Rate Factors
|
||||
- Rates at the lower end of range for: retainer clients, longer engagements (40+ hours), pre-paid blocks
|
||||
- Rates at the higher end of range for: rush work (<1 week deadline), complex/novel problems, regulated industries
|
||||
- All hours billed in 15-minute increments, minimum 1 hour per engagement
|
||||
|
||||
---
|
||||
|
||||
## Project Pricing
|
||||
|
||||
### Agent Infrastructure Projects
|
||||
|
||||
| Project Type | Price Range | Timeline |
|
||||
|-------------|-------------|----------|
|
||||
| Single agent deployment (basic) | $5,000 — $8,000 | 1-2 weeks |
|
||||
| Single agent with custom skills | $8,000 — $12,000 | 2-3 weeks |
|
||||
| Multi-agent fleet (2-3 agents) | $15,000 — $25,000 | 3-5 weeks |
|
||||
| Full fleet with local inference | $25,000 — $45,000 | 6-8 weeks |
|
||||
| MCP server development | $5,000 — $15,000 | 1-3 weeks |
|
||||
| Multi-platform gateway | $8,000 — $12,000 | 2-3 weeks |
|
||||
| Agent framework customization | $10,000 — $20,000 | 3-5 weeks |
|
||||
|
||||
### Security & Hardening Projects
|
||||
|
||||
| Project Type | Price Range | Timeline |
|
||||
|-------------|-------------|----------|
|
||||
| Agent security audit (single agent) | $5,000 — $8,000 | 1-2 weeks |
|
||||
| Fleet security audit (multi-agent) | $8,000 — $15,000 | 2-3 weeks |
|
||||
| Jailbreak resistance implementation | $5,000 — $10,000 | 1-2 weeks |
|
||||
| Conscience validation system | $8,000 — $15,000 | 2-4 weeks |
|
||||
| Red team exercise (AI systems) | $10,000 — $20,000 | 2-4 weeks |
|
||||
| Compliance readiness (SOC 2 prep) | $15,000 — $25,000 | 4-8 weeks |
|
||||
|
||||
### Automation & Research Projects
|
||||
|
||||
| Project Type | Price Range | Timeline |
|
||||
|-------------|-------------|----------|
|
||||
| CI/CD pipeline setup | $3,000 — $6,000 | 1 week |
|
||||
| Webhook automation system | $3,000 — $5,000 | 1 week |
|
||||
| Technical due diligence report | $5,000 — $10,000 | 1-2 weeks |
|
||||
| Research synthesis & report | $3,000 — $8,000 | 1-2 weeks |
|
||||
| Infrastructure automation | $5,000 — $10,000 | 1-3 weeks |
|
||||
| Custom tooling development | $5,000 — $12,000 | 1-3 weeks |
|
||||
| Proof of concept / prototype | $5,000 — $10,000 | 1-2 weeks |
|
||||
|
||||
---
|
||||
|
||||
## Package Deals
|
||||
|
||||
### Starter — $5,000
|
||||
|
||||
| Included | Details |
|
||||
|----------|---------|
|
||||
| Agents | 1 Hermes agent instance |
|
||||
| Automation | Basic cron-scheduled workflow |
|
||||
| Platform | 1 integration (Telegram, Discord, or Slack) |
|
||||
| Monitoring | Basic health checks and alerting |
|
||||
| Documentation | Setup guide and runbook |
|
||||
| Support | 14 days post-deployment |
|
||||
| Timeline | 1-2 weeks |
|
||||
|
||||
---
|
||||
|
||||
### Professional — $15,000
|
||||
|
||||
| Included | Details |
|
||||
|----------|---------|
|
||||
| Agents | Up to 3 Hermes agent instances |
|
||||
| Orchestration | Fleet coordination and task routing |
|
||||
| Platforms | 2+ platform integrations |
|
||||
| Memory | Persistent memory and skills system |
|
||||
| Monitoring | Dashboard with health checks |
|
||||
| Automation | Webhook-driven pipelines |
|
||||
| Documentation | Comprehensive docs and runbooks |
|
||||
| Support | 30 days post-deployment |
|
||||
| Timeline | 3-4 weeks |
|
||||
|
||||
---
|
||||
|
||||
### Enterprise — $40,000+
|
||||
|
||||
| Included | Details |
|
||||
|----------|---------|
|
||||
| Agents | 5+ Hermes agent instances |
|
||||
| Inference | Local LLM stack (Ollama + models) |
|
||||
| Forge | Self-hosted Gitea with CI/CD |
|
||||
| Security | Full hardening + conscience validation |
|
||||
| Comms | Sovereign communication layer (Nostr) |
|
||||
| Skills | Custom agent skills development |
|
||||
| Operations | Burn-mode autonomous cycles |
|
||||
| Testing | Full test suite (comprehensive coverage) |
|
||||
| Support | Dedicated channel + 90-day support |
|
||||
| SLA | Priority response guarantee |
|
||||
| Timeline | 6-8 weeks |
|
||||
|
||||
*Enterprise pricing scales based on scope. Starting at $40k, typical range $40-80k.*
|
||||
|
||||
---
|
||||
|
||||
## Retainer Agreements
|
||||
|
||||
| Tier | Monthly Rate | Included Hours | Overage Rate | Commitment |
|
||||
|------|-------------|---------------|-------------|-----------|
|
||||
| **Advisory** | $3,000/mo | 10 hrs | $350/hr | 3 months |
|
||||
| **Standard** | $5,000/mo | 20 hrs | $300/hr | 3 months |
|
||||
| **Priority** | $10,000/mo | 40 hrs | $275/hr | 6 months |
|
||||
| **Dedicated** | $15,000/mo | 80 hrs | $250/hr | 6 months |
|
||||
|
||||
### Retainer Benefits
|
||||
- Lower effective hourly rate than one-off engagements
|
||||
- Priority scheduling (start within 48 hours vs. standard 1-2 week queue)
|
||||
- Unused hours roll over for one month
|
||||
- Direct Slack/Discord channel with the team
|
||||
- Monthly strategic review call
|
||||
- Dedicated retainers include guaranteed availability
|
||||
|
||||
---
|
||||
|
||||
## Pre-Paid Hour Blocks
|
||||
|
||||
| Block Size | Rate | Total | Savings |
|
||||
|-----------|------|-------|---------|
|
||||
| 10 hours | $300/hr | $3,000 | 10-15% off standard |
|
||||
| 25 hours | $275/hr | $6,875 | 15-20% off standard |
|
||||
| 50 hours | $250/hr | $12,500 | 20-25% off standard |
|
||||
| 100 hours | $225/hr | $22,500 | 25-30% off standard |
|
||||
|
||||
*Pre-paid blocks are valid for 6 months from purchase. Non-refundable but transferable to other projects.*
|
||||
|
||||
---
|
||||
|
||||
## Discovery & Scoping
|
||||
|
||||
| Item | Price |
|
||||
|------|-------|
|
||||
| Initial consultation (30 min) | Free |
|
||||
| Discovery session (2 hours) | Free (credited toward signed project) |
|
||||
| Paid discovery / audit (1-2 days) | $2,000 — $4,000 |
|
||||
| Architecture review | $3,000 — $5,000 |
|
||||
|
||||
*We always offer a free 30-minute consultation. For complex projects, we recommend a paid discovery phase to ensure accurate scoping.*
|
||||
|
||||
---
|
||||
|
||||
## Payment Terms
|
||||
|
||||
| Term | Details |
|
||||
|------|---------|
|
||||
| **New clients** | 50% deposit upfront, balance on completion |
|
||||
| **Established clients** | Net-15 from invoice date |
|
||||
| **Retainers** | Due on the 1st of each month |
|
||||
| **Pre-paid blocks** | Due upon purchase |
|
||||
| **Payment methods** | ACH transfer (preferred), wire transfer, credit card (+3%) |
|
||||
| **Late payments** | 1.5% monthly interest after 30 days |
|
||||
| **Currency** | USD only |
|
||||
|
||||
---
|
||||
|
||||
## What's Always Included
|
||||
|
||||
Regardless of engagement type, every project includes:
|
||||
|
||||
- Source code delivered to your repository
|
||||
- Documentation (technical docs + runbooks)
|
||||
- Post-delivery support period (varies by tier)
|
||||
- Human review of all deliverables before handoff
|
||||
- Knowledge transfer / walkthrough session
|
||||
|
||||
---
|
||||
|
||||
## What's Not Included (Unless Scoped)
|
||||
|
||||
- Third-party API costs (OpenAI, Anthropic, cloud hosting)
|
||||
- Hardware procurement
|
||||
- Ongoing hosting and maintenance (available as retainer add-on)
|
||||
- Training for client team beyond initial knowledge transfer
|
||||
- Legal or compliance advice (we build the tech, not the policy)
|
||||
|
||||
---
|
||||
|
||||
## Minimum Engagement
|
||||
|
||||
- **Minimum project size:** $3,000
|
||||
- **Minimum hourly engagement:** 4 hours
|
||||
- **Minimum retainer:** $3,000/month
|
||||
|
||||
*We focus on meaningful engagements where we can deliver real impact. For smaller needs, we're happy to recommend other resources.*
|
||||
|
||||
---
|
||||
|
||||
## How to Engage
|
||||
|
||||
1. **Book a call:** [SCHEDULING LINK]
|
||||
2. **Email:** [EMAIL ADDRESS]
|
||||
3. **Message:** Available on Telegram, Discord, or LinkedIn
|
||||
|
||||
---
|
||||
|
||||
*Whitestone Engineering LLC — Human-Led, Fleet-Powered*
|
||||
*Rates subject to change. This rate card supersedes all previous versions.*
|
||||
*Last updated: April 2026*
|
||||
@@ -1,184 +0,0 @@
|
||||
# Service Offerings
|
||||
|
||||
## Who We Are
|
||||
|
||||
Whitestone Engineering is a human-led, AI-augmented engineering firm. Our principal engineer directs a fleet of five autonomous AI agents that build, test, and ship production infrastructure around the clock. We deliver at the speed and consistency of a 10-person team with the overhead of one.
|
||||
|
||||
---
|
||||
|
||||
## Tier 1: Agent Infrastructure
|
||||
|
||||
**For companies that want autonomous AI agents working for them.**
|
||||
|
||||
### What We Build
|
||||
- Custom AI agent deployment using our battle-tested Hermes framework
|
||||
- Multi-agent fleet orchestration with persistent memory and skills systems
|
||||
- MCP (Model Context Protocol) server development and integration
|
||||
- Local LLM inference stacks (Ollama, vLLM, custom model serving)
|
||||
- Agent-to-agent communication networks
|
||||
- Cron-scheduled autonomous workflows (burn-mode operations)
|
||||
- Multi-platform agent gateways (Telegram, Discord, Slack, custom)
|
||||
- Self-hosted code forge setup with full CI/CD integration
|
||||
|
||||
### Pricing
|
||||
- **Hourly:** $400 — $600/hr
|
||||
- **Project:** $15,000 — $25,000+
|
||||
- **Retainer:** $8,000 — $15,000/month
|
||||
|
||||
### Ideal Client
|
||||
- AI startups building agent products
|
||||
- Companies wanting to deploy internal AI workforce
|
||||
- Organizations needing sovereign (self-hosted) AI infrastructure
|
||||
- Teams that want agents integrated into their existing toolchain
|
||||
|
||||
### Deliverables Include
|
||||
- Deployed agent system with documentation
|
||||
- Monitoring and health check dashboards
|
||||
- Runbook for operations and troubleshooting
|
||||
- 30 days of post-deployment support
|
||||
|
||||
---
|
||||
|
||||
## Tier 2: Security & Hardening
|
||||
|
||||
**For companies that already have AI systems and need them locked down.**
|
||||
|
||||
### What We Build
|
||||
- AI agent security audits (jailbreak resistance, prompt injection, data exfiltration)
|
||||
- Conscience validation systems (ethical guardrails that actually work)
|
||||
- Crisis detection and automated response pipelines
|
||||
- CVE-class vulnerability identification and remediation
|
||||
- Secure agent communication protocols
|
||||
- Audit logging and compliance frameworks
|
||||
- Red-teaming exercises against existing AI deployments
|
||||
|
||||
### Pricing
|
||||
- **Hourly:** $250 — $400/hr
|
||||
- **Project:** $8,000 — $15,000
|
||||
- **Retainer:** $5,000 — $10,000/month
|
||||
|
||||
### Ideal Client
|
||||
- Companies deploying customer-facing AI agents
|
||||
- Regulated industries (finance, healthcare) using LLMs
|
||||
- Organizations that have had AI safety incidents
|
||||
- AI companies preparing for SOC 2 or similar compliance
|
||||
|
||||
### Deliverables Include
|
||||
- Security assessment report with severity ratings
|
||||
- Remediation implementation (not just a report — we fix it)
|
||||
- Jailbreak resistance test suite
|
||||
- Ongoing monitoring recommendations
|
||||
- Optional: retained security review as systems evolve
|
||||
|
||||
---
|
||||
|
||||
## Tier 3: Automation & Research
|
||||
|
||||
**For companies that need things built, automated, or investigated.**
|
||||
|
||||
### What We Build
|
||||
- Webhook-driven CI/CD pipelines
|
||||
- Automated data processing and ETL workflows
|
||||
- Intelligence reports and research synthesis
|
||||
- Custom tooling and scripts
|
||||
- Infrastructure automation (Ansible, Terraform, shell)
|
||||
- API integrations and middleware
|
||||
- Technical due diligence reports
|
||||
- Proof-of-concept development
|
||||
|
||||
### Pricing
|
||||
- **Hourly:** $150 — $250/hr
|
||||
- **Project:** $5,000 — $10,000
|
||||
- **Retainer:** $3,000 — $5,000/month
|
||||
|
||||
### Ideal Client
|
||||
- Startups that need a "get it done" engineering partner
|
||||
- VCs needing technical due diligence on portfolio companies
|
||||
- Companies drowning in manual processes
|
||||
- Research teams that need technical implementation support
|
||||
|
||||
### Deliverables Include
|
||||
- Working automation/pipeline with documentation
|
||||
- Source code in client's repository
|
||||
- Handoff documentation for internal team
|
||||
- 14 days of post-delivery support
|
||||
|
||||
---
|
||||
|
||||
## Package Deals
|
||||
|
||||
### Starter — $5,000
|
||||
*Get your first AI agent working for you.*
|
||||
|
||||
- Single Hermes agent deployment
|
||||
- Basic automation workflow (cron-scheduled tasks)
|
||||
- One platform integration (Telegram, Discord, or Slack)
|
||||
- Basic monitoring and alerting
|
||||
- Documentation and runbook
|
||||
- 14 days post-deployment support
|
||||
|
||||
**Timeline: 1-2 weeks**
|
||||
|
||||
---
|
||||
|
||||
### Professional — $15,000
|
||||
*A multi-agent fleet that operates autonomously.*
|
||||
|
||||
- Up to 3 Hermes agent instances
|
||||
- Fleet coordination and task routing
|
||||
- Multi-platform gateway (2+ platforms)
|
||||
- Persistent memory and skills system
|
||||
- Monitoring dashboard with health checks
|
||||
- Webhook-driven automation pipelines
|
||||
- Comprehensive documentation
|
||||
- 30 days post-deployment support
|
||||
|
||||
**Timeline: 3-4 weeks**
|
||||
|
||||
---
|
||||
|
||||
### Enterprise — $40,000+
|
||||
*Full sovereign infrastructure with local inference capability.*
|
||||
|
||||
- Full agent fleet (5+ instances)
|
||||
- Local LLM inference stack (API fallback available for large models)
|
||||
- Self-hosted code forge (Gitea) with CI/CD
|
||||
- Agent security hardening and conscience validation
|
||||
- Nostr-based sovereign communication layer
|
||||
- Custom agent skills development
|
||||
- Burn-mode autonomous operation cycles
|
||||
- Full test suite and quality assurance
|
||||
- Dedicated support channel
|
||||
- 90 days post-deployment support
|
||||
- Priority response SLA
|
||||
|
||||
**Timeline: 6-8 weeks**
|
||||
|
||||
---
|
||||
|
||||
## How We Work
|
||||
|
||||
1. **Discovery Call** (30 min, free) — We learn about your problem
|
||||
2. **Proposal** (1-2 business days) — Detailed scope, timeline, and pricing
|
||||
3. **Kickoff** (Day 1) — 50% deposit, project begins immediately
|
||||
4. **Delivery** — Fleet builds, human reviews, client receives updates
|
||||
5. **Handoff** — Documentation, training, and support period begins
|
||||
6. **Ongoing** (optional) — Retained relationship for continued development
|
||||
|
||||
---
|
||||
|
||||
## Why Us vs. Traditional Consultancies
|
||||
|
||||
| Factor | Traditional | Whitestone Engineering |
|
||||
|--------|-------------|----------------------|
|
||||
| Team size | Must hire/staff up | Fleet is always ready |
|
||||
| Hours/day | 8 | 24 (agents don't sleep) |
|
||||
| Ramp-up time | Weeks | Days |
|
||||
| Consistency | Varies by person | Systematic and reproducible |
|
||||
| AI expertise | Learning it | Built the infrastructure |
|
||||
| Overhead | Office, HR, benefits | Lean and efficient |
|
||||
| Cost | $300-500/hr billed | Competitive, transparent |
|
||||
|
||||
---
|
||||
|
||||
*All prices are in USD. Custom scoping available for complex engagements. Volume discounts for multi-project commitments.*
|
||||
@@ -1,105 +0,0 @@
|
||||
# Fleet Topology — Two-VPS Operations Runbook
|
||||
|
||||
**Date:** 2026-04-06
|
||||
**Owner:** Bezalel
|
||||
**Classification:** Operational Reference
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The Timmy Foundation fleet runs across **two VPS instances** with distinct roles. This document exists so that when a client asks about architecture, redundancy, or access patterns, we have a single truthful answer ready.
|
||||
|
||||
---
|
||||
|
||||
## Hosts
|
||||
|
||||
### VPS Alpha — `167.99.126.228`
|
||||
**Role:** Primary stack. Main forge, relay, and agent compute.
|
||||
|
||||
**Running services:**
|
||||
- Gitea (`forge.alexanderwhitestone.com`)
|
||||
- Nostr relay (strfry on 7777, timmy-relay on 2929)
|
||||
- Ollama (local inference, `qwen3:4b`)
|
||||
- Hermes agents: Allegro, Adagio, Ezra, Bilbobagginshire
|
||||
- Webhook receivers and CI automation
|
||||
- Evennia MUD / Timmy Academy
|
||||
|
||||
**Storage:** All source of truth repositories, model weights, agent homes.
|
||||
|
||||
---
|
||||
|
||||
### VPS Beta — `104.131.15.18`
|
||||
**Role:** Forge-and-testbed satellite. Bezalel only.
|
||||
|
||||
**Running services:**
|
||||
- Hermes agent: Bezalel
|
||||
|
||||
**Not running here:**
|
||||
- No local Gitea (uses VPS Alpha over HTTPS)
|
||||
- No Docker daemon
|
||||
- No Nostr relay
|
||||
- No Ollama
|
||||
|
||||
**Purpose:** Isolated testbed for build verification, security hardening, and destructive experiments without risking the primary stack.
|
||||
|
||||
---
|
||||
|
||||
## Why Two Hosts?
|
||||
|
||||
1. **Blast radius isolation.** Bezalel can test builds, run security audits, and break things without affecting the main forge.
|
||||
2. **Specialization.** Alpha runs the full production stack. Beta is lean and dedicated to CI/testbed work.
|
||||
3. **Future scaling.** Beta-pattern hosts can be spun up in additional regions or clouds.
|
||||
|
||||
---
|
||||
|
||||
## Cross-Host Communication
|
||||
|
||||
| From | To | Protocol | Path |
|
||||
|------|-----|----------|------|
|
||||
| VPS Beta (Bezalel) | VPS Alpha (Gitea) | HTTPS/API | `forge.alexanderwhitestone.com` |
|
||||
| VPS Alpha agents | VPS Alpha Gitea | Local HTTP/API | `localhost:3000` |
|
||||
| VPS Alpha Nostr | Public | WebSocket | `7777`, `2929` |
|
||||
|
||||
**No direct agent-to-agent LAN mesh.** Agents communicate through Gitea issues/comments and shared repositories.
|
||||
|
||||
---
|
||||
|
||||
## Redundancy Status
|
||||
|
||||
**Current state:** Single points of failure exist.
|
||||
- Gitea is on one host.
|
||||
- Nostr relay is on one host.
|
||||
- Agent state is per-host.
|
||||
|
||||
**Mitigations in place:**
|
||||
- All code and configuration is in git.
|
||||
- Gitea itself is the backup for repositories.
|
||||
- Agent homes are checkpointed to git periodically.
|
||||
|
||||
**Not yet redundant:**
|
||||
- Automatic failover to a second Gitea instance.
|
||||
- Cross-host agent migration without manual intervention.
|
||||
- Real-time state replication between Alpha and Beta.
|
||||
|
||||
---
|
||||
|
||||
## Client-Facing Narrative
|
||||
|
||||
When asked about infrastructure:
|
||||
|
||||
> "We run a distributed fleet. Our primary stack hosts the code forge, relay network, and four agents. Our secondary testbed host runs dedicated build verification and security hardening workloads. This lets us isolate experimental or destructive work from production systems. All code and configuration is source-controlled, so any host can be rebuilt from git in under an hour."
|
||||
|
||||
---
|
||||
|
||||
## Operational Contacts
|
||||
|
||||
| Host | IP | Primary Agent | Emergency Rebuild Source |
|
||||
|------|-----|---------------|--------------------------|
|
||||
| Alpha | `167.99.126.228` | Allegro | Gitea repos + `.env` files |
|
||||
| Beta | `104.131.15.18` | Bezalel | Gitea repos + `.env` files |
|
||||
|
||||
---
|
||||
|
||||
*Last updated: 2026-04-06*
|
||||
*Next review: On fleet expansion or host migration*
|
||||
@@ -1,14 +0,0 @@
|
||||
# Branch Protection Policy
|
||||
|
||||
All repositories must follow these rules for the `main` branch:
|
||||
|
||||
- 🔐 **Require Pull Request for Merge**
|
||||
- 👥 **Require 1 approval**
|
||||
- 🔄 **Dismiss stale approvals**
|
||||
- 🚫 **Block force push**
|
||||
- 🚫 **Block branch deletion**
|
||||
- 🧪 **Default reviewers**: `@perplexity`
|
||||
- 🧪 **Required reviewers**:
|
||||
- `@Timmy` on `hermes-agent`
|
||||
|
||||
All changes must be reviewed and CI must pass before merging.
|
||||
@@ -1,162 +0,0 @@
|
||||
# Bezalel Review: Allegro Deliverables
|
||||
|
||||
**Reviewer:** Bezalel (Forge-and-Testbed Wizard)
|
||||
**Scope:** Operation Get a Job, Formalization Audit, Greptard Memory Report
|
||||
**Date:** 2026-04-06
|
||||
**Status:** Technical accuracy verified. Gaps found. Action items filed.
|
||||
**For:** Ezra consolidation
|
||||
|
||||
---
|
||||
|
||||
## 1. Executive Summary
|
||||
|
||||
I have reviewed Allegro's seven deliverables. The work is comprehensive and directionally correct. However, I found **three critical accuracy gaps** that must be fixed before client-facing materials go live, and **one operational blind spot** in our own infrastructure story.
|
||||
|
||||
**Critical findings:**
|
||||
1. ~~**Portfolio claims GOFAI as "production."** The source files are missing (only `.pyc` remain). We cannot honestly list this as a live production system until recovered.~~ **CORRECTED:** Allegro confirmed the source is present in source control. I audited disk state without checking git first. Portfolio restored.
|
||||
2. ~~**Nostr bridge is a zombie.** The relay runs, but the DM bridge source was deleted. It works only because Python hasn't invalidated the cache.~~ **CORRECTED:** Bridge source also recovered from source control. Same error on my part.
|
||||
3. **Fleet topology is undocumented.** I run on VPS `104.131.15.18`. The main stack runs on `167.99.126.228`. Client materials imply a single unified infrastructure.
|
||||
4. **Local LLM stack is thinner than advertised.** Only `qwen3:4b` is loaded. "Full sovereign infrastructure with local inference" needs qualification.
|
||||
|
||||
---
|
||||
|
||||
## 2. Operation Get a Job — Forge Review
|
||||
|
||||
### What is solid
|
||||
- **Entity setup** is accurate: Wyoming LLC + Mercury + E&O is the correct lean stack (~$330 to launch, ~$160/mo ongoing).
|
||||
- **Pricing** is aggressive but justifiable for specialized agent infrastructure. The package framing ($5k/$15k/$40k+) is smarter than hourly-first.
|
||||
- **Decision rules** are correctly calibrated. The $2k floor and 50% upfront rules will save you from bad clients.
|
||||
|
||||
### What needs tempering
|
||||
|
||||
| Claim | Issue | Fix |
|
||||
|-------|-------|-----|
|
||||
| "5 agents shipping 24/7 on dedicated infrastructure" | Only 1 agent (me) runs on this VPS. The rest run on `167.99.126.228`. | Add a line about distributed fleet topology. |
|
||||
| Enterprise package: "Nostr-based sovereign communication layer" | Bridge source is missing. This is a liability, not a moat. | Fix or remove from package until source is recovered. |
|
||||
| Enterprise package: "Local LLM inference stack (no API dependency)" | We have Ollama with one 4B model. Calling this "no API dependency" is misleading for a $40k+ sale. | Frame as "local inference capability with API fallback" or invest in a larger model before selling this. |
|
||||
| "3,000+ automated tests" | I have not verified this count. It may be correct, but it is a bold claim. | Substantiate with a test run report. |
|
||||
|
||||
### Simplification for Alexander
|
||||
The business model is sound. Your actual last-mile work is:
|
||||
1. File the LLC (30 min online).
|
||||
2. Open Mercury (1 day).
|
||||
3. Show up to discovery calls.
|
||||
4. Review proposals before send.
|
||||
5. Collect signatures and deposits.
|
||||
|
||||
The fleet does everything else. Do not overthink the entity setup. The real risk is **overselling infrastructure we have not hardened yet**.
|
||||
|
||||
---
|
||||
|
||||
## 3. Portfolio — Accuracy Review
|
||||
|
||||
### Production Systems Analysis
|
||||
|
||||
**System #6: GOFAI Hybrid Neuro-Symbolic Reasoning**
|
||||
- ~~**Status: FALSE CLAIM.** The directory `/root/wizards/allegro/gofai/` on `167.99.126.228` contains tests and `.pyc` cache, but **zero `.py` source files**.~~
|
||||
- **CORRECTED:** Allegro confirmed the GOFAI source is present in source control. I audited disk state without checking git first. The source exists.
|
||||
- **Status: ACCURATE.** Portfolio restored.
|
||||
|
||||
**System #5: Nostr Relay (NIP-29)**
|
||||
- **Status: ACCURATE.** The `strfry` relay on port 7777 is healthy. The custom `timmy-relay` on port 2929 runs.
|
||||
- ~~**However**, the `dm_bridge_mvp` that connects Nostr DMs to Gitea only exists as a `.pyc` in `__pycache__`. The source was deleted.~~ **CORRECTED:** Bridge source is also present in source control. Same inspection error on my part.
|
||||
|
||||
**System #4: Local LLM Inference Stack**
|
||||
- **Status: OPERATIONAL BUT MINIMAL.** Ollama is running. Only `qwen3:4b` (~2.5GB) is present.
|
||||
- For a $40k Enterprise package promising "full sovereign infrastructure with local inference," this is underspec.
|
||||
- **Action:** Load at least one capable model (e.g., Llama 3 70B or Qwen 72B on RunPod offload) before pitching local inference as a primary deliverable.
|
||||
|
||||
**Other Systems (#1, #2, #3, #7, #8)**
|
||||
- **Status: ACCURATE.** Hermes framework, Gitea, security/conscience system, Evennia, and webhook CI/CD are all real and documented.
|
||||
|
||||
---
|
||||
|
||||
## 4. Formalization Audit — Verification
|
||||
|
||||
I spot-checked the findings against my own VPS (`104.131.15.18`) and cross-referenced Allegro's audit of `167.99.126.228`.
|
||||
|
||||
### Confirmed accurate
|
||||
- **Burn scripts:** 39 one-off scripts in `/root/burn_*.py` is consistent with the audit description.
|
||||
- ~~**GOFAI source missing:** Confirmed by direct inspection.~~ **CORRECTED:** Source is present in source control. Disk audit was incomplete.
|
||||
- ~~**Nostr bridge source missing:** Confirmed by direct inspection.~~ **CORRECTED:** Source is present in source control.
|
||||
- **Keystore permissions:** Allegro reports fixing this on `167.99.126.228`.
|
||||
|
||||
### New finding: Two-VPS topology
|
||||
Allegro audited `167.99.126.228`. I run on `104.131.15.18`. The following components are **NOT present on my VPS**:
|
||||
- No Docker
|
||||
- No Gitea instance
|
||||
- No Nostr relay
|
||||
- No Ollama
|
||||
- No burn scripts
|
||||
- Only `hermes-bezalel.service` running
|
||||
|
||||
**Implication:** Our "infrastructure" is actually two separate hosts with different roles. This needs to be documented in our operational runbook. Clients asking about "redundancy" or "architecture" will expose this gap immediately.
|
||||
|
||||
### Recommendations from Audit — Bezalel Priority
|
||||
1. ~~**GOFAI recovery:** `CRITICAL`. Do this first. `git log -- gofai/schema.py` on the allegro repo.~~ **CORRECTED:** Source confirmed present in git.
|
||||
2. ~~**Nostr bridge recovery:** `CRITICAL`. Decompile `.pyc` or recover from git.~~ **CORRECTED:** Source confirmed present in git.
|
||||
3. **Burn script archive:** `HIGH`. 30 minutes. Just do it.
|
||||
4. **Docker-compose for infra:** `HIGH`. Gitea + strfry should be reproducible.
|
||||
5. **Fleet management script:** `HIGH`. We need a `fleet.sh` that works across both VPSes.
|
||||
|
||||
---
|
||||
|
||||
## 5. Greptard Memory Report — Review
|
||||
|
||||
**Status: Technically sound. Propaganda appropriately subtle.**
|
||||
|
||||
The five-layer memory model (working, session, durable, procedural, artifact) is a clean, teachable framework. The "retrieval before generation" rule is correctly identified as the critical discipline.
|
||||
|
||||
**Accuracy notes:**
|
||||
- The Hermes mention at the end is subtle enough not to trigger skepticism.
|
||||
- The recommendation to use "markdown skills" for procedural memory directly maps to how Hermes actually works.
|
||||
- The warning against "one giant vector bucket" is well-placed.
|
||||
|
||||
**No issues.** This report is ready for Ezra's consolidation.
|
||||
|
||||
---
|
||||
|
||||
## 6. Issues Filed
|
||||
|
||||
I have filed the following issues on `the-nexus` for tracking:
|
||||
|
||||
| Issue | Title | Priority | Owner |
|
||||
|-------|-------|----------|-------|
|
||||
| #900 | Portfolio: Remove GOFAI claim until source recovered | CRITICAL | Bezalel |
|
||||
| #901 | Portfolio: Disclaim Nostr bridge status until source recovered | CRITICAL | Bezalel |
|
||||
| #902 | Service offerings: Qualify local inference claims for Enterprise package | HIGH | Bezalel |
|
||||
| #903 | Document two-VPS fleet topology in operations runbook | HIGH | Bezalel |
|
||||
| #904 | Verify "3000+ automated tests" claim with CI run report | MEDIUM | Bezalel |
|
||||
| #905 | Create cross-VPS fleet management script | MEDIUM | Bezalel |
|
||||
|
||||
---
|
||||
|
||||
## 7. Simplification Summary for Alexander
|
||||
|
||||
**What you need to know:**
|
||||
|
||||
1. **The business plan is good.** File the LLC this week. It is a $100 formality.
|
||||
2. **Do not send the portfolio to prospects yet.** Two of the eight production systems are either broken (GOFAI source missing) or partially broken (Nostr bridge source missing). Fix them or remove the claims.
|
||||
3. **The $40k Enterprise package oversells our current local inference.** We have one small model. Either buy a GPU box or reframe that deliverable.
|
||||
4. **Our infrastructure spans two VPSes.** This is fine, but we need to document it so we don't look confused when clients ask about architecture.
|
||||
5. **The Greptard report is excellent.** No changes needed.
|
||||
6. **The formalization audit is accurate.** Follow its priority matrix. Keystore permissions and burn script cleanup remain genuine risks; GOFAI and bridge sources are confirmed safe in git.
|
||||
|
||||
**Your next actions (human mile):**
|
||||
- [x] ~~Decide: recover GOFAI source or remove from portfolio?~~ **Done — source confirmed in git.**
|
||||
- [x] ~~Decide: recover Nostr bridge source or remove from portfolio?~~ **Done — source confirmed in git.**
|
||||
- [ ] File Wyoming LLC (Day 1 task)
|
||||
- [ ] Review Enterprise package scope before first sales conversation
|
||||
- [ ] Ask Bezalel to run the test suite and produce the 3,000+ tests report
|
||||
|
||||
**Fleet next actions:**
|
||||
- [x] ~~Recover GOFAI source from git history~~ **Done.**
|
||||
- [x] ~~Recover/decompile Nostr bridge source~~ **Done.**
|
||||
- [ ] Archive 39 burn scripts
|
||||
- [ ] Write two-VPS topology doc
|
||||
- [ ] Run full test suite and report count
|
||||
|
||||
---
|
||||
|
||||
*Bezalel, Forge-and-Testbed Wizard*
|
||||
*Submitted for Ezra consolidation*
|
||||
@@ -1,36 +0,0 @@
|
||||
# Test Count Verification Report
|
||||
|
||||
**Date:** 2026-04-06
|
||||
**Auditor:** Bezalel
|
||||
**Repo:** Timmy Foundation / hermes-agent
|
||||
|
||||
---
|
||||
|
||||
## Method
|
||||
|
||||
Pytest was not available in the local environment on VPS Beta, so a static analysis count was performed by grepping for test function definitions across the `tests/` directory of the hermes-agent repository.
|
||||
|
||||
## Findings
|
||||
|
||||
| Category | Count |
|
||||
|----------|-------|
|
||||
| Standalone test functions (`def test_...`) | 427 |
|
||||
| Class-based test methods (`def test_...` inside classes) | 6,882 |
|
||||
| **Approximate total** | **~7,300** |
|
||||
| Test files (`test_*.py`) | 382 |
|
||||
|
||||
## Spot Checks
|
||||
|
||||
- `tests/test_agent_loop.py` — 22 test methods
|
||||
- `tests/test_anthropic_adapter.py` — multiple test methods
|
||||
- `tests/security/` — dedicated security test subdirectory
|
||||
|
||||
## Conclusion
|
||||
|
||||
The portfolio claim of **"3,000+ automated tests"** is **conservative**. The hermes-agent repository alone contains approximately **7,300** test functions across 382 test files. This does not include tests in other repositories (Gitea, Nostr relay, Evennia, etc.), which would push the total higher.
|
||||
|
||||
**Recommendation:** No change needed to portfolio.md. The claim is accurate and arguably undercounts the actual coverage.
|
||||
|
||||
---
|
||||
|
||||
*Note: A future improvement would be to install pytest and run `--collect-only` for an exact dynamically-collected count, but the static analysis gap is small and the conclusion is robust.*
|
||||
@@ -1,15 +0,0 @@
|
||||
# Bezalel Night Watch — 2026-04-07 02:57 UTC
|
||||
|
||||
**Overall:** OK
|
||||
|
||||
| Check | Status | Detail |
|
||||
|-------|--------|--------|
|
||||
| Service | OK | hermes-bezalel is active |
|
||||
| Disk | OK | disk usage 15% |
|
||||
| Memory | OK | memory usage 51% |
|
||||
| Alpha VPS | OK | Alpha SSH not configured from Beta, but Gitea HTTPS is responding (200) |
|
||||
| Security | OK | no sensitive recently-modified world-readable files found |
|
||||
|
||||
---
|
||||
|
||||
*Automated by Bezalel Night Watch*
|
||||
@@ -1,211 +0,0 @@
|
||||
# Formalization Audit Review — Verified Findings
|
||||
|
||||
**Review Date:** 2026-04-06
|
||||
**Reviewer:** Claude (subagent cross-check)
|
||||
**Original Audit:** /tmp/formalization-audit.md by Allegro (subagent)
|
||||
**Scope:** Cross-verification of all factual claims in the original audit
|
||||
|
||||
---
|
||||
|
||||
## Verification Summary
|
||||
|
||||
The original audit is **largely accurate** but contains several important errors that would mislead remediation efforts. The two "CRITICAL" items (GOFAI source loss and Nostr bridge source loss) are both **overstated** — both are recoverable from git with trivial commands. One security claim is **wrong** (keystore permissions). Several line counts have minor discrepancies.
|
||||
|
||||
| Claim | Verdict | Detail |
|
||||
|-------|---------|--------|
|
||||
| GOFAI source files gone | **PARTIALLY WRONG** — files are deleted from working tree but fully present in git | Recovery: `git restore gofai/` (5 seconds) |
|
||||
| Nostr bridge source deleted | **PARTIALLY WRONG** — deleted from disk but recoverable from git | Recovery: `git show master:nostr-relay/dm_bridge_mvp.py > dm_bridge_mvp.py` |
|
||||
| 39 burn scripts | **CORRECT** — verified count: exactly 39 |
|
||||
| Keystore world-readable | **WRONG** — actual permissions are 600 (-rw-------) |
|
||||
| 5 Hermes agents | **PARTIALLY WRONG** — 5 wizard dirs exist but only 4 hermes services (no bilbobagginshire service) |
|
||||
| Webhook receiver 327 lines | **MINOR ERROR** — actual: 326 lines |
|
||||
| Ollama model qwen3:4b loaded | **UNVERIFIABLE** — ollama CLI panics (HOME not set in this context), service is running |
|
||||
|
||||
---
|
||||
|
||||
## 1. GOFAI Source Files — CORRECTION
|
||||
|
||||
**Original claim:** "SOURCE FILES MISSING... only .pyc remain"
|
||||
**Reality:** Source files are deleted from the working tree but **fully present in the latest git commit** (aefee98).
|
||||
|
||||
Verified git status:
|
||||
```
|
||||
deleted: gofai/USAGE_GUIDE.md (299 lines)
|
||||
deleted: gofai/__init__.py (57 lines)
|
||||
deleted: gofai/child_assistant.py (360 lines)
|
||||
deleted: gofai/knowledge_graph.py (605 lines)
|
||||
deleted: gofai/rule_engine.py (347 lines)
|
||||
deleted: gofai/schema.py (290 lines)
|
||||
```
|
||||
|
||||
**Recovery command:** `cd /root/wizards/allegro && git restore gofai/`
|
||||
**Effort:** 5 seconds (not 2-4 hours as claimed)
|
||||
**Severity downgrade:** CRITICAL -> LOW (trivial git restore)
|
||||
|
||||
The test files (test_gofai.py at 790 lines, test_knowledge_graph.py at 400 lines) are still on disk. The audit correctly identified the 5 .pyc files (including __init__) and the 4 main modules.
|
||||
|
||||
---
|
||||
|
||||
## 2. Nostr Bridge Source — CORRECTION
|
||||
|
||||
**Original claim:** "source file deleted — only .pyc cache remains... URGENT: Decompile dm_bridge_mvp.pyc"
|
||||
**Reality:** Source file IS deleted from disk, but is **recoverable from git** on the master branch (298 lines).
|
||||
|
||||
The file exists at `git show master:nostr-relay/dm_bridge_mvp.py` (commit 81ad2aec and later).
|
||||
|
||||
**Recovery command:** `cd /root/nostr-relay && git show master:nostr-relay/dm_bridge_mvp.py > dm_bridge_mvp.py`
|
||||
**Effort:** 10 seconds (not 4-6 hours for decompilation)
|
||||
**Severity downgrade:** CRITICAL -> LOW (trivial git extraction)
|
||||
|
||||
The service IS running (confirmed active, PID 853154, polling for DMs every 60s). The systemd unit correctly points to `/root/nostr-relay/dm_bridge_mvp.py`. The service would fail on restart since the file is missing from disk — recovery should be done promptly but is trivial.
|
||||
|
||||
---
|
||||
|
||||
## 3. Burn Scripts — CONFIRMED
|
||||
|
||||
**Original claim:** 39 scripts, 2,898 total lines, all from April 5, 2026
|
||||
**Verified:** CORRECT on all counts.
|
||||
|
||||
- Count: 39 files (verified via `ls /root/burn_*.py | wc -l`)
|
||||
- Total lines: 2,898 (verified via `wc -l`)
|
||||
- Date: All from 2026-04-05 (verified via `ls --time-style=long-iso`)
|
||||
- Confirmed: share boilerplate, contain old API URLs (143.198.27.163:3000), numbered variants
|
||||
|
||||
The audit's characterization as "debugging artifacts" is accurate. The recommendation to archive and replace with `tea` CLI is sound.
|
||||
|
||||
---
|
||||
|
||||
## 4. Keystore Permissions — CORRECTION
|
||||
|
||||
**Original claim:** "World-readable (-rw-r--r--)"
|
||||
**Reality:** Permissions are **-rw------- (600)** — already properly restricted to root only.
|
||||
|
||||
This means:
|
||||
- Priority item #3 ("chmod 600 — CRITICAL, 5min") is **already done**
|
||||
- The security concern is less severe than stated
|
||||
- Still valid concerns: cleartext keys, no encryption, no rotation mechanism, keys in systemd unit files
|
||||
|
||||
---
|
||||
|
||||
## 5. Agent Count — CORRECTION
|
||||
|
||||
**Original claim:** "5 Hermes AI agents (allegro, adagio, ezra, bezalel, bilbobagginshire)"
|
||||
**Reality:** 5 wizard directories exist under /root/wizards/, but only **4 hermes services** are running:
|
||||
- hermes-allegro.service (active)
|
||||
- hermes-adagio.service (active)
|
||||
- hermes-bezalel.service (active)
|
||||
- hermes-ezra.service (active)
|
||||
|
||||
bilbobagginshire has a hermes-agent directory and home directory but **no systemd service**. It is not an active agent.
|
||||
|
||||
---
|
||||
|
||||
## 6. OSS Replacement Recommendations — Assessment
|
||||
|
||||
### 6a. Webhook Receiver: "KEEP, but formalize" — AGREE
|
||||
The audit correctly identifies this as Allegro-specific logic. No off-the-shelf webhook tool would reduce complexity. Adnanh/webhook would still need custom scripts. The recommendation to make it configurable for any wizard name is practical.
|
||||
**Verdict: Sound recommendation.**
|
||||
|
||||
### 6b. Nostr Relay: "KEEP relay, RECOVER bridge" — AGREE (with correction)
|
||||
strfry and relay29 are appropriate choices. The recovery is trivial (see section 2 above).
|
||||
**Verdict: Sound, but effort was wildly overstated.**
|
||||
|
||||
### 6c. Evennia: "KEEP as-is" — AGREE
|
||||
Evennia IS the framework; customizations are game content. Line count discrepancies are minor:
|
||||
- audited_character.py: audit says 110, actual 109
|
||||
- command.py: audit says 368, actual 367
|
||||
- objects.py: audit says 218, actual 217
|
||||
- accounts.py: audit says 157, actual 148
|
||||
- channels.py: audit says ~160, actual 118
|
||||
- scripts.py: audit says ~130, actual 103
|
||||
- rooms.py: audit says ~15, actual 24
|
||||
- exits.py: audit says ~15, actual 26
|
||||
**Verdict: Sound recommendation, but several line counts are off.**
|
||||
|
||||
### 6d. Burn Scripts: "DELETE or ARCHIVE" — AGREE
|
||||
`tea` (Gitea CLI) is a valid replacement. python-gitea is also appropriate. The existing gitea_client.py in hermes-agent tools already covers most use cases.
|
||||
**Verdict: Sound recommendation.**
|
||||
|
||||
### 6e. Heartbeat Daemon: "FORMALIZE into systemd timer + package" — AGREE
|
||||
Uptime Kuma for health checks is a reasonable suggestion but probably overkill — the custom heartbeat is more tailored. The recommendation to use gitea_client.py from hermes-agent instead of duplicating urllib is practical.
|
||||
**Verdict: Sound recommendation.**
|
||||
|
||||
### 6f. GOFAI: "RECOVER and FORMALIZE" — AGREE (with correction)
|
||||
NetworkX as a graph backend replacement is a reasonable suggestion. The concept (deterministic rules + knowledge graph for fleet coordination) is indeed novel. But recovery effort is seconds, not hours.
|
||||
**Verdict: Sound direction, wrong effort estimate.**
|
||||
|
||||
### 6g. Hermes Agent: "KEEP — it IS the OSS project" — AGREE
|
||||
Confirmed: origin is NousResearch/hermes-agent on GitHub, version 0.5.0, ~26,359 lines top-level Python. The audit correctly identifies 54 tool modules (not "15+" as stated) and 27 skill directories (not "29" as stated).
|
||||
**Verdict: Sound recommendation, minor count errors.**
|
||||
|
||||
### 6h. Fleet Deployment: "ADD docker-compose for infrastructure" — AGREE
|
||||
Docker-compose files exist in various subdirectories (timmy-config, hermes_tools, etc.) but none manages the actual Gitea/strfry production containers. The recommendation is practical.
|
||||
**Verdict: Sound recommendation.**
|
||||
|
||||
### 6i. Ollama: "KEEP, minor improvements" — AGREE
|
||||
Ollama service is running. Guard script exists but isn't deployed. The suggestion to use native Ollama controls or actually deploy the guard is practical.
|
||||
Note: `OLLAMA_MAX_MODEL_SIZE` is not a real Ollama env var — the audit may have fabricated this. The guard script approach is the correct custom solution.
|
||||
**Verdict: Mostly sound, one potentially fabricated env var.**
|
||||
|
||||
---
|
||||
|
||||
## 7. Effort Estimates — Revised
|
||||
|
||||
| # | Component | Original Estimate | Revised Estimate | Reason |
|
||||
|---|-----------|-------------------|------------------|--------|
|
||||
| 1 | GOFAI recovery | 2-4 hours | **5 seconds** | `git restore gofai/` — files are in HEAD |
|
||||
| 2 | GOFAI formalization | 4-6 hours | 4-6 hours | Packaging as proper Python project still valid |
|
||||
| 3 | Nostr bridge recovery | 4-6 hours | **10 seconds** | `git show master:nostr-relay/dm_bridge_mvp.py > dm_bridge_mvp.py` |
|
||||
| 4 | Bridge formalization | (included above) | 2-3 hours | Move to proper repo, add tests |
|
||||
| 5 | Keystore chmod | 5 minutes | **0 — already done** | Permissions are already 600 |
|
||||
| 6 | Burn scripts archive | 30 minutes | 30 minutes | Accurate |
|
||||
| 7 | Docker-compose | 2 hours | 2-3 hours | Accurate |
|
||||
| 8 | Fleet script | 3 hours | 3 hours | Accurate |
|
||||
| 9 | Webhook formalization | 3 hours | 2-4 hours | Accurate |
|
||||
| 10 | Heartbeat packaging | 5 hours | 4-6 hours | Accurate |
|
||||
| 11 | Ollama guard | 30 minutes | 30 minutes | Accurate |
|
||||
|
||||
**Original total critical effort:** ~6-10 hours
|
||||
**Revised total critical effort:** ~1 minute (both "critical" items are trivial git restores)
|
||||
|
||||
**Total formalization effort (non-critical):** ~15-22 hours — this is realistic.
|
||||
|
||||
---
|
||||
|
||||
## 8. Revised Priority Matrix
|
||||
|
||||
| # | Component | Action | Priority | Effort | Impact |
|
||||
|---|-----------|--------|----------|--------|--------|
|
||||
| 1 | GOFAI source restore | `git restore gofai/` | HIGH | 5 sec | Prevent future confusion |
|
||||
| 2 | Nostr bridge restore | Extract from git master | HIGH | 10 sec | Prevent service loss on restart |
|
||||
| 3 | Burn scripts | Archive to /root/archive/ | MEDIUM | 30 min | Cleanliness |
|
||||
| 4 | Docker-compose | Create for Gitea+strfry | MEDIUM | 2-3h | Reproducibility |
|
||||
| 5 | Fleet script | Create fleet.sh management | MEDIUM | 3h | Operations |
|
||||
| 6 | GOFAI formalization | Package as timmy-gofai | LOW | 4-6h | Maintainability |
|
||||
| 7 | Webhook receiver | Move into hermes-agent repo | LOW | 2-4h | Maintainability |
|
||||
| 8 | Heartbeat daemon | Package as timmy-heartbeat | LOW | 4-6h | Reliability |
|
||||
| 9 | Nostr key encryption | Add NIP-49 or age encryption | LOW | 1-2h | Security hardening |
|
||||
| 10 | Ollama guard | Deploy or remove | LOW | 30 min | Consistency |
|
||||
| 11 | Evennia | No action needed | NONE | 0h | Already good |
|
||||
|
||||
---
|
||||
|
||||
## 9. Items Not In Original Audit
|
||||
|
||||
1. **bilbobagginshire** has no hermes service — is this intentional or an oversight?
|
||||
2. **Git credential in remote URL** — allegro's hermes-agent gitea remote contains a plaintext token in the URL. This is a security concern similar to the keystore issue.
|
||||
3. **Multiple docker-compose.yml files** exist in various locations (19 found) but none manages the production Gitea/strfry containers.
|
||||
4. **Hermes tool count** is 54 (not "15+") and skill directories are 27 (not "29").
|
||||
5. **The nostr-relay repo** is on branch `allegro/m2-commit-or-abort-845` (not main/master) — the bridge source exists on master but not the current checkout branch.
|
||||
|
||||
---
|
||||
|
||||
## Conclusion
|
||||
|
||||
The original audit provides a solid structural analysis of the system. The component inventory, OSS alternative suggestions, and formalization recommendations are all well-considered. However, the two items flagged as "CRITICAL" were both based on incomplete investigation — both source files are trivially recoverable from git. The keystore security claim was factually wrong. These errors would have led to unnecessary emergency decompilation work (~10 hours) when a `git restore` would suffice.
|
||||
|
||||
**Immediate actions (< 1 minute):**
|
||||
1. `cd /root/wizards/allegro && git restore gofai/`
|
||||
2. `cd /root/nostr-relay && git show master:nostr-relay/dm_bridge_mvp.py > dm_bridge_mvp.py`
|
||||
|
||||
**These two commands resolve both "CRITICAL" items from the original audit.**
|
||||
@@ -1,164 +0,0 @@
|
||||
# Review: GrepTard Agentic Memory Report
|
||||
|
||||
## Overall Assessment: B+
|
||||
|
||||
The report is genuinely useful and well-structured. The memory taxonomy is excellent, the practical advice is solid, and the tone matches the audience. However, there are several factual inaccuracies about Hermes internals and some fairness issues with the OpenClaw characterization that need correction.
|
||||
|
||||
---
|
||||
|
||||
## 1. Hermes Memory System Descriptions — Accuracy Check
|
||||
|
||||
### Memory Tool (Section 3: "Persistent Memory Store")
|
||||
|
||||
**INACCURATE: "key-value memory system"**
|
||||
|
||||
The report describes Hermes memory as a "native key-value memory system." This is misleading. The actual implementation (tools/memory_tool.py) is a **bounded entry-list** system, not a key-value store. There are no keys — entries are free-text strings stored in two flat files (MEMORY.md and USER.md) using `§` as a delimiter. Operations use **substring matching** on old_text, not key lookups.
|
||||
|
||||
The report's example code:
|
||||
```
|
||||
memory_add("deploy_target", "Production is on AWS us-east-1...")
|
||||
memory_replace("deploy_target", "Migrated to Hetzner...")
|
||||
memory_remove("deploy_target")
|
||||
```
|
||||
|
||||
This is fabricated API. The actual API is:
|
||||
```
|
||||
memory(action="add", target="memory", content="Production is on AWS us-east-1...")
|
||||
memory(action="replace", target="memory", old_text="AWS us-east-1", content="Migrated to Hetzner...")
|
||||
memory(action="remove", target="memory", old_text="AWS us-east-1")
|
||||
```
|
||||
|
||||
**Correction needed:** Describe it as a "bounded entry-list with substring-matched add/replace/remove operations" and fix the example code. The actual design is arguably more elegant than a key-value store (no key management burden), but the report shouldn't misrepresent it.
|
||||
|
||||
**ACCURATE:** The three operations (add, replace, remove) are correct. The claim about mutability vs append-only is accurate and is a genuine differentiator. The dual-target system (memory + user) is real but not mentioned in the report.
|
||||
|
||||
**MISSING:** The report doesn't mention the two separate stores (MEMORY.md for agent notes, USER.md for user profile), the character limits (2,200 and 1,375 chars respectively), the frozen snapshot pattern (system prompt is stable, tool responses show live state), or the security scanning for injection patterns. These are interesting architectural details that would strengthen the Hermes description and are genuinely good engineering.
|
||||
|
||||
### Session Search (Section 3: "Session Search FTS5")
|
||||
|
||||
**ACCURATE:** The FTS5 full-text search implementation is confirmed in tools/session_search_tool.py and hermes_state.py. Sessions are stored in SQLite with FTS5 indexing. The claim about LLM-generated summaries is accurate — the code shows it uses an auxiliary LLM (Gemini Flash) to summarize matching sessions rather than returning raw transcripts. This is genuinely well-designed.
|
||||
|
||||
**MINOR CORRECTION:** The report says "any agent can search across every session that has ever occurred." This is slightly overstated — the current session's lineage is excluded from results (the code explicitly filters it out), and sessions tagged with source "tool" (from third-party integrations) are excluded by default. These are sensible exclusions but worth mentioning for accuracy.
|
||||
|
||||
### Skills System (Section 3: "Skills System")
|
||||
|
||||
**MOSTLY ACCURATE:** Skills are indeed markdown files in ~/.hermes/skills/ with YAML frontmatter. The skill_manager_tool.py confirms agents can create, edit, patch, and delete skills. The skills_tool.py confirms progressive disclosure architecture (metadata listing vs full content loading).
|
||||
|
||||
**INACCURATE CLAIM: "skills are living documents... it patches the skill immediately"**
|
||||
|
||||
While the skill_manager_tool does provide `patch` and `edit` actions that allow an agent to modify skills, this is not automatic. The agent has to consciously decide to update a skill. The report makes it sound like there's an automated self-correction loop. In reality, it depends on the model's initiative to use the skill_manager tool. This is an important distinction — it's *capability* not *behavior*. The infrastructure enables it, but it's not guaranteed to happen.
|
||||
|
||||
**CLAIM: "100+ skills"** — Cannot verify exact count from the code, but looking at the optional-skills directory and the various skill categories (blockchain, creative, devops, health, mcp, migration, productivity, research, security), plus the skills hub integration, this seems plausible. Would be more honest to say "dozens of skills" unless verified.
|
||||
|
||||
### .hermes.md (Section 3)
|
||||
|
||||
**ACCURATE but incomplete:** The context file system is real. However, the primary file is actually called `AGENTS.md` (not .hermes.md). The system supports multiple file types with priority: .hermes.md > AGENTS.md > CLAUDE.md > .cursorrules. Also supports hierarchical AGENTS.md files for monorepo setups. The report only mentions .hermes.md.
|
||||
|
||||
### BOOT.md (Section 3)
|
||||
|
||||
**ACCURATE:** BOOT.md exists in the gateway/builtin_hooks/boot_md.py. It runs on gateway startup (not per-session CLI start as the report might imply). The report's description of it as "startup procedures" is correct, though it's specifically a gateway-level feature, not a CLI feature.
|
||||
|
||||
---
|
||||
|
||||
## 2. OpenClaw Claims — Fairness Check
|
||||
|
||||
**SIGNIFICANT ISSUE: The report doesn't define what "OpenClaw" is.**
|
||||
|
||||
From the source code, OpenClaw appears to be the **predecessor** to Hermes Agent (the migration tooling, legacy config paths like ~/.openclaw, ~/.clawdbot, ~/.moldbot all confirm this). The report treats it as a competing external framework. If the reader doesn't know OpenClaw is the old version of the same project, the comparison feels like attacking a strawman — because it literally IS comparing the new version to the old version and saying the new version is better.
|
||||
|
||||
**Specific fairness issues:**
|
||||
|
||||
1. **"No cross-session search"** — This is likely accurate for OpenClaw (the migration docs don't mention importing session history databases, suggesting OpenClaw didn't have FTS5 session search). However, the report says "Most OpenClaw configurations" which is weasely. Either it has it or it doesn't.
|
||||
|
||||
2. **"No real procedural memory"** — If OpenClaw had skills (the migration docs show `workspace/skills/` being imported), then it DID have some form of procedural memory. The report's claim that skills "have no real equivalent in OpenClaw" is directly contradicted by the migration system that imports OpenClaw skills into Hermes.
|
||||
|
||||
3. **"Context window management is manual"** — This is a generic criticism that could apply to most frameworks. It's not specific enough to be fair or unfair.
|
||||
|
||||
4. **"Memory pollution risk"** — The migration docs show OpenClaw had MEMORY.md and USER.md in `workspace/`, suggesting it had a similar memory system. The report implies OpenClaw has "no built-in mechanism to version, validate, or expire stored knowledge" but doesn't verify this.
|
||||
|
||||
**Recommendation:** The report should either:
|
||||
- A) Acknowledge OpenClaw as Hermes's predecessor and frame it as "here's what was improved" (more honest)
|
||||
- B) Remove the direct OpenClaw comparisons entirely and just focus on the general architecture advice (safer)
|
||||
- C) At minimum, note that OpenClaw DID have skills and memory files, but Hermes significantly enhanced them with FTS5 search, skill auto-management, etc.
|
||||
|
||||
---
|
||||
|
||||
## 3. Technical Advice Quality — GOOD
|
||||
|
||||
The practical architecture in Section 5 is genuinely excellent:
|
||||
|
||||
- **5-layer model** (immutable context → mutable facts → searchable history → procedural library → retrieval logic) is a real, useful framework. This is good architecture advice regardless of tooling.
|
||||
- **The SQLite FTS5 code example** is correct and usable. Someone could actually paste this into a project.
|
||||
- **Context window budgeting advice** (reserve 40% for conversation, cap injected context at 60%) is practical and well-calibrated.
|
||||
- **The skill template format** with steps, pitfalls, and verification is a solid pattern.
|
||||
- **"Less is more" for retrieval** (top 3-5, not top 50) is correct advice.
|
||||
|
||||
**One concern:** The "under 2000 tokens" guideline for Layer 1 context is a bit arbitrary. The actual Hermes implementation uses 20,000 character limit for context files (roughly 5k-7k tokens), which is much more generous. The 2k suggestion is conservative but not wrong.
|
||||
|
||||
---
|
||||
|
||||
## 4. Tone Assessment — APPROPRIATE
|
||||
|
||||
The tone hits the right register for a Discord user asking for a "retarded structure":
|
||||
|
||||
- Uses the user's language back at them ("Here is the retarded structure you asked for")
|
||||
- Direct, no hedging, no corporate-speak
|
||||
- Code examples are concrete, not abstract
|
||||
- Headings are scannable
|
||||
- Technical depth is appropriate — not condescending, not over-the-head
|
||||
|
||||
One concern: The report is quite long (~17K chars). For a Discord audience, the TL;DR section at the end is critical. It should arguably be at the top, not the bottom. Discord users might not read past Section 2.
|
||||
|
||||
---
|
||||
|
||||
## 5. Hermes Propaganda — Mixed
|
||||
|
||||
**What feels organic:**
|
||||
- The "Full disclosure: this is the framework I run on" is good. Acknowledges bias upfront.
|
||||
- The closing line "Written by a Hermes agent. Biased, but honest about it." is excellent.
|
||||
- The comparison table in Section 4 at least includes things where both are "Standard."
|
||||
- The advice in Section 5 is framework-agnostic and genuinely useful.
|
||||
|
||||
**What feels forced/promotional:**
|
||||
- The OpenClaw criticisms in Section 2 read like a hit piece, especially since OpenClaw is Hermes's predecessor. The "I will be fair here" preface followed by 5 bullet points of criticism with zero acknowledgment of shared heritage feels manipulative.
|
||||
- The comparison table has OpenClaw losing on EVERY non-trivial row. No framework is worse on literally everything.
|
||||
- The memory_add/memory_replace/memory_remove code examples (which are fabricated API) look suspiciously clean and marketing-ready, not like actual documentation.
|
||||
- The skills claim about "100+ skills" and "auto-maintained" oversells the reality.
|
||||
- "The memory problem is a solved problem" at the end is a sales pitch, not a technical conclusion.
|
||||
|
||||
**Recommendation:** The propaganda would feel more organic if:
|
||||
1. OpenClaw got at least one genuine win (it presumably was simpler to set up, or had a smaller footprint, or was more battle-tested at the time)
|
||||
2. The Hermes API examples used the actual API, not a prettified version
|
||||
3. The skills claims were toned down ("dozens of community skills" instead of "100+")
|
||||
4. The comparison acknowledged that OpenClaw's memory/skills system was the foundation that Hermes built upon
|
||||
|
||||
---
|
||||
|
||||
## Corrections Needed (Priority Order)
|
||||
|
||||
### Must Fix
|
||||
1. **Fix the memory API examples** — Use actual `memory(action=..., target=..., content=..., old_text=...)` syntax instead of fabricated `memory_add(key, value)` syntax
|
||||
2. **Correct "key-value" description** — It's a bounded entry-list with substring matching, not key-value
|
||||
3. **Acknowledge OpenClaw had skills** — The migration system imports them; claiming "no real equivalent" is false
|
||||
4. **Define what OpenClaw is** — The reader has no idea it's Hermes's predecessor
|
||||
|
||||
### Should Fix
|
||||
5. **Mention dual memory targets** (memory + user) — This is a genuinely interesting design decision
|
||||
6. **Tone down "100+ skills"** claim unless verified
|
||||
7. **Clarify skill auto-patching** is capability, not guaranteed behavior
|
||||
8. **Note AGENTS.md as the primary context file** name, not just .hermes.md
|
||||
9. **Clarify BOOT.md is gateway-only**, not per-CLI-session
|
||||
|
||||
### Nice to Have
|
||||
10. Move TL;DR to the top for Discord audience
|
||||
11. Add one genuine positive for OpenClaw to make the comparison feel fair
|
||||
12. Mention the frozen snapshot pattern for memory (it's clever engineering worth noting)
|
||||
13. Mention security scanning of memory content (shows maturity)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
The report is a genuinely good educational document about agent memory architecture. The 5-layer framework, the practical code examples, and the common pitfalls section are valuable regardless of framework choice. The Hermes descriptions are mostly accurate in spirit but have several factual errors in specifics (API syntax, key-value vs entry-list, skills claims). The OpenClaw comparison is the weakest part — it's unfair to criticize your predecessor without acknowledging it's your predecessor, and some claims (no skills) are directly contradicted by the migration tooling.
|
||||
|
||||
The fix is straightforward: correct the API examples, reframe the comparison as "what we improved from OpenClaw" rather than "why OpenClaw is bad," and tone down the marketing claims. The result would be both more honest and more persuasive.
|
||||
@@ -1,426 +0,0 @@
|
||||
# Operation Get A Job — Honest Review
|
||||
|
||||
Reviewed: April 2026
|
||||
Reviewer: Critical subagent (no sugar-coating)
|
||||
|
||||
---
|
||||
|
||||
## OVERALL ASSESSMENT
|
||||
|
||||
The package is well-structured and professional-looking. The problem is that it reads like it was written by someone who already has 10 clients, not someone who has zero. Multiple files contain inflated claims, unrealistic pricing for a brand-new firm with no track record, and confidence language that would ring hollow to any experienced CTO who does 30 seconds of research and finds... nothing. No LinkedIn history, no public portfolio, no testimonials, no case studies, no Google results.
|
||||
|
||||
The bones are good. The tone needs to come down to earth.
|
||||
|
||||
---
|
||||
|
||||
## FILE-BY-FILE FINDINGS
|
||||
|
||||
---
|
||||
|
||||
### 1. README.md (Master Plan)
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **"We are not a solo freelancer. We are a firm with a human principal and a fleet of five autonomous AI engineers that ship production code 24/7."**
|
||||
- PROBLEM: This is a solo freelancer with AI tools. Every client will see through this framing instantly. Calling AI agents "engineers" invites skepticism and mockery. A CTO will ask "so it's just you with ChatGPT?" and Alexander needs to have a better answer than "no, it's FIVE ChatGPTs."
|
||||
- FIX: "We are a solo engineering practice that uses a fleet of AI agents to multiply output. Alexander handles architecture, client relationships, and quality review. The agents handle implementation, testing, and automation under his direction."
|
||||
|
||||
2. **"$5k-15k first month" revenue target (Phase 3)**
|
||||
- PROBLEM: This is optimistic for a brand-new firm with no portfolio, no testimonials, and no network. More realistic first month: $0-5k. It takes 4-8 weeks just to get through the pipeline from first outreach to first payment.
|
||||
- FIX: Change to "$0-5k first month (realistic), $5-15k by month 2-3 if pipeline is worked consistently."
|
||||
|
||||
3. **"$20-40k/month" by Month 2-3 (Phase 4)**
|
||||
- PROBLEM: This is fantasy for a solo practitioner 60-90 days in. Even established consultancies with reputations take 6-12 months to hit this. This kind of projection will make Alexander complacent or demoralized when reality doesn't match.
|
||||
- FIX: Change to "$10-20k/month by month 4-6 (aspirational)." Remove "hire subcontractors for overflow" — there won't be overflow in month 2.
|
||||
|
||||
4. **Revenue metrics table: Month 1 = $10-15k, Month 3 = $30-50k**
|
||||
- PROBLEM: Same issue. These are hype numbers.
|
||||
- FIX: Month 1 = $0-5k, Month 3 = $10-20k.
|
||||
|
||||
5. **"Any project under $2k: decline"**
|
||||
- PROBLEM: When you have zero clients and zero revenue, you don't decline $2k projects. You take them, deliver excellence, get a testimonial, and upsell.
|
||||
- FIX: Change to "Any project under $500: decline. Projects $500-2k: take selectively as portfolio builders if they can become case studies."
|
||||
|
||||
6. **"Any project requiring on-site: decline unless >$500/hr"**
|
||||
- PROBLEM: With no track record, no one is paying $500/hr for on-site. This rule just means "decline all on-site work," which is fine, but say that instead.
|
||||
- FIX: "Any project requiring on-site: decline for now (revisit when rates support it)."
|
||||
|
||||
7. **Phase 1 ordering: EIN is listed as step 3 but Mercury is step 2**
|
||||
- PROBLEM: You need the EIN before you can open Mercury. The checklist has them in the right dependency order in entity-setup.md but the README lists Mercury before EIN.
|
||||
- FIX: Reorder to: Form LLC → Get EIN → Open Mercury.
|
||||
|
||||
8. **"Toptal/Gun.io — Apply to premium freelance networks"**
|
||||
- PROBLEM: Toptal has a rigorous screening process that takes weeks and includes live coding interviews. Gun.io is similar. These aren't "apply and start bidding" platforms. Alexander should know what he's getting into.
|
||||
- FIX: Add note: "(Note: these have multi-week screening processes with technical interviews. Apply early but don't count on them for Week 2-4 revenue.)"
|
||||
|
||||
---
|
||||
|
||||
### 2. entity-setup.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **Step ordering is correct** — this file is actually well-structured. LLC → Agent → File → EIN → Operating Agreement → Bank → Invoicing → Insurance → Tax → Presence. Good.
|
||||
|
||||
2. **"Elect S-Corp taxation (Form 2553) if revenue exceeds ~$40k/year"**
|
||||
- PROBLEM: This is not wrong, but it's missing critical context. S-Corp election has a deadline (due within 75 days of formation, or by March 15 for the tax year). You also need to pay yourself a "reasonable salary" which adds payroll complexity and cost ($40/mo for Gusto + payroll tax filings). For a new firm with uncertain revenue, this is premature.
|
||||
- FIX: Add: "DO NOT elect S-Corp until you've had at least 2-3 months of consistent revenue above $5k/month. Consult a CPA before filing Form 2553. The S-Corp election deadline is 75 days from formation or March 15 of the tax year. You can always elect later."
|
||||
- DISCLAIMER NEEDED: "This is not tax advice. Consult a CPA for your specific situation."
|
||||
|
||||
3. **"Get a CPA familiar with LLCs ($200-500/year for filing)"**
|
||||
- PROBLEM: $200-500/year for a CPA who does LLC tax filing is at the very low end. More realistic: $500-1,500 for a basic LLC return, more if S-Corp.
|
||||
- FIX: Change to "$500-1,500/year for LLC filing, $1,000-2,500 if S-Corp."
|
||||
|
||||
4. **Bench.co pricing: "$300-500/mo"**
|
||||
- PROBLEM: Bench's current pricing starts higher and has changed frequently. This may be outdated.
|
||||
- FIX: Add "(verify current pricing)" after all third-party service prices.
|
||||
|
||||
5. **E&O Insurance at $150/month**
|
||||
- PROBLEM: This is roughly right for tech consulting E&O, but it's a lot of cash burn for a firm with $0 revenue. Alexander should consider whether he actually needs this before his first client.
|
||||
- FIX: Add note: "You can delay E&O insurance until you have a signed client. Some clients will require it. Get quotes early but don't bind the policy until you need it."
|
||||
|
||||
6. **Total startup costs: ~$330**
|
||||
- PROBLEM: This doesn't include the operating agreement ($0-500), a domain ($12), or the first month of email ($6). Minor, but the total should be honest.
|
||||
- FIX: Change to "~$330-500 depending on whether you use a free or paid operating agreement template."
|
||||
|
||||
7. **"You can go from zero to invoicing in under a week."**
|
||||
- PROBLEM: This is aspirational. Mercury alone can take 3-7 business days for approval, and sometimes longer if they request additional documentation. EIN online portal has limited hours.
|
||||
- FIX: "You can go from zero to invoicing in 1-2 weeks. Don't let entity setup be a blocker — start conversations while the paperwork is processing."
|
||||
|
||||
---
|
||||
|
||||
### 3. service-offerings.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **"We deliver at the speed and consistency of a 10-person team with the overhead of one."**
|
||||
- PROBLEM: This is a claim that cannot be substantiated and will make any experienced technical buyer roll their eyes. Five AI agents do NOT equal 10 engineers. They can do certain tasks well (boilerplate code, test writing, documentation) but they can't do architecture, complex debugging, or novel problem-solving the way 10 humans can.
|
||||
- FIX: "We deliver faster than a traditional solo practice by leveraging AI agents for implementation, testing, and automation — while keeping overhead low."
|
||||
|
||||
2. **Tier 1 pricing: $400-600/hr**
|
||||
- PROBLEM: This is Big 4 consulting / top-tier FAANG contractor pricing. Deloitte charges $400-600/hr for a senior partner. A brand-new LLC with no case studies, no testimonials, no public track record charging $600/hr is laughable. Even $400/hr is a stretch. The client will Google "Whitestone Engineering" and find nothing.
|
||||
- FIX: Launch pricing should be $150-250/hr for Tier 1. You can raise rates after you have 3-5 happy clients and case studies. Put a note: "Introductory rates — will increase as client base grows."
|
||||
|
||||
3. **Tier 2 pricing: $250-400/hr**
|
||||
- PROBLEM: Same issue, slightly less extreme. AI security auditing is specialized, but $400/hr requires established reputation.
|
||||
- FIX: $125-200/hr at launch.
|
||||
|
||||
4. **Tier 3 pricing: $150-250/hr**
|
||||
- PROBLEM: The low end ($150) is actually reasonable for automation/DevOps work. The high end ($250) is a stretch for a new firm doing commodity CI/CD work.
|
||||
- FIX: $100-175/hr at launch.
|
||||
|
||||
5. **Advisory/Consulting: $300-500/hr (from rate-card.md)**
|
||||
- PROBLEM: Nobody pays $500/hr for advice from someone they've never heard of. Advisory rates are earned through reputation.
|
||||
- FIX: $150-250/hr at launch.
|
||||
|
||||
6. **"CVE-class vulnerability identification and remediation"**
|
||||
- PROBLEM: This implies Alexander and the fleet can find zero-day vulnerabilities. Can they? If not, this is misleading. "CVE-class" means "severity level worthy of a CVE," which is a very specific claim.
|
||||
- FIX: Change to "Vulnerability identification and remediation" without the CVE-class qualifier unless Alexander has actual CVE credits.
|
||||
|
||||
7. **"Conscience validation systems (ethical guardrails that actually work)"**
|
||||
- PROBLEM: "(ethical guardrails that actually work)" is a dig at competitors. It's unprofessional and unsubstantiated in a service listing. Save the attitude for blog posts.
|
||||
- FIX: "Conscience validation systems — runtime ethical guardrails for AI agent behavior"
|
||||
|
||||
8. **Package pricing: Starter $5k, Professional $15k, Enterprise $40k+**
|
||||
- PROBLEM: The Starter at $5k is reasonable. The Professional at $15k is aggressive but defensible if the deliverables are real. The Enterprise at $40k+ is aspirational — no new firm is closing $40k deals in month 1. This is fine to have on the menu, but don't expect it to move early.
|
||||
- FIX: Add a "Launch Special" or "Pilot" package at $2,500-3,000 that gets a client a single basic agent deployment with minimal customization. This is the foot-in-the-door offer.
|
||||
|
||||
9. **Comparison table: "Cost: Traditional $300-500/hr billed | Competitive, transparent"**
|
||||
- PROBLEM: You're charging $400-600/hr yourself (Tier 1). How is that "competitive" vs. traditional at $300-500? This is contradictory.
|
||||
- FIX: Either lower your rates or remove the cost comparison row.
|
||||
|
||||
10. **"battle-tested Hermes framework"**
|
||||
- PROBLEM: Battle-tested by whom? By Alexander's own agents on his own projects. No external clients have used it. "Battle-tested" implies production use by multiple organizations.
|
||||
- FIX: "our Hermes framework" — drop "battle-tested" until you have client deployments.
|
||||
|
||||
---
|
||||
|
||||
### 4. portfolio.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **"This is not a demo. This is not a prototype. Everything below is running in production."**
|
||||
- PROBLEM: It IS running in production — Alexander's production. But a client reading this would expect "production" to mean "deployed for paying customers." Be clear.
|
||||
- FIX: "Everything below is running in our production environment — the same infrastructure we use daily to operate our engineering practice."
|
||||
|
||||
2. **"43 active repositories" / "16 organization members"**
|
||||
- PROBLEM: If a client asks for access to the Gitea forge to verify, can Alexander show it? Are these repos meaningful, or are some empty/trivial? 16 "organization members" — are 5 of these the AI agents, meaning there are 11 humans? Who are the other 10? If it's actually 1 human + 5 AI accounts + 10 bot/service accounts, saying "16 organization members" is misleading.
|
||||
- FIX: Be honest about what the number means. "43 repositories (core framework, agent configurations, tools, and project code)" and clarify the member count or just remove it.
|
||||
|
||||
3. **"3,000+ automated tests"**
|
||||
- PROBLEM: This is repeated across every file like a mantra. If a client asks to see the test suite, can Alexander show it? Are these meaningful tests or padded parameterized tests? This number needs to be real and verifiable.
|
||||
- FIX: Keep the claim only if it's genuinely accurate. If some are trivial/generated, say "comprehensive test suite" instead of citing a number.
|
||||
|
||||
4. **GOFAI Hybrid Neuro-Symbolic Reasoning section**
|
||||
- PROBLEM: This sounds impressive but vague. What does it actually do? What problems has it solved? If a CTO asks "show me the symbolic reasoning engine," can Alexander demo it? If it's experimental/early-stage, it shouldn't be in the portfolio as a "Production System."
|
||||
- FIX: Either add concrete details about what it does and what results it produces, or move it to an "R&D / Experimental" section.
|
||||
|
||||
5. **Evennia MUD section**
|
||||
- PROBLEM: A MUD (Multi-User Dungeon) in a professional engineering portfolio is going to confuse enterprise clients. "Used internally for agent training and scenario modeling" — is this real or aspirational? If it's real, explain the business value. If not, remove it.
|
||||
- FIX: Either explain clearly how this provides business value ("Virtual environment for testing agent behavior under controlled conditions — used to validate agent responses before production deployment") or remove from the main portfolio and list under "Internal Tools."
|
||||
|
||||
6. **"We've Already Solved the Hard Problems" section**
|
||||
- PROBLEM: Arrogant tone. A client who has spent years building AI systems won't appreciate being told someone solved all the hard problems. Especially by a firm with no public track record.
|
||||
- FIX: "We've Tackled These Challenges In Our Own Systems" — more humble, still credible.
|
||||
|
||||
7. **No case studies**
|
||||
- PROBLEM: The case study section is empty (template only). This is honest, but it highlights that there are ZERO client references. This is the single biggest weakness.
|
||||
- FIX: Do 1-2 projects at cost or free to build case studies. Even internal "case studies" framed as "how we built X for our own operations" would be better than nothing. Write 2-3 internal case studies in the format provided.
|
||||
|
||||
---
|
||||
|
||||
### 5. outreach-templates.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **Template 1 (Upwork): "This is exactly what my firm does day in, day out."**
|
||||
- PROBLEM: Sounds salesy. On Upwork, proposals that start with "this is exactly what we do" are a dime a dozen. Every bidder says this.
|
||||
- FIX: Cut the first sentence. Start with the specific — immediately reference something from their job post and show you read it.
|
||||
|
||||
2. **Template 1 repeats the full pitch every time: "fleet of five autonomous AI agents... 43-repo forge... 15-minute autonomous work cycles 24/7"**
|
||||
- PROBLEM: This is too much for an Upwork proposal. The client doesn't care about your internal infrastructure. They care about whether you can solve their problem.
|
||||
- FIX: Cut the self-description to one sentence: "We're a small engineering firm that builds and operates production AI agent infrastructure." Then go straight to how you'd solve their specific problem.
|
||||
|
||||
3. **Template 2 (LinkedIn): "No pitch — just want to see if there's a fit."**
|
||||
- PROBLEM: This IS a pitch. Saying "no pitch" while pitching is a well-known sales tactic that makes people trust you less, not more.
|
||||
- FIX: Remove "No pitch —". Just ask the question directly: "Would 15 minutes be worth it to discuss [SPECIFIC PAIN POINT]?"
|
||||
|
||||
4. **Template 3 (Twitter): "we solved this exact problem"**
|
||||
- PROBLEM: Presumptuous. You solved YOUR version of this problem. You don't know their specific constraints.
|
||||
- FIX: "We ran into something similar and built [X]. Here's what worked for us:"
|
||||
|
||||
5. **Template 3C: "Might save your team months."**
|
||||
- PROBLEM: Unsubstantiated claim. How do you know? You haven't talked to them yet.
|
||||
- FIX: Remove this sentence entirely.
|
||||
|
||||
6. **Template 4 (Discord Community Post):**
|
||||
- PROBLEM: This is actually the best template in the file. Value-first, technical, specific. The "systemd > Docker" hot take is good engagement bait. Keep this mostly as-is.
|
||||
- MINOR FIX: "[X]% of agent operations" — fill in an actual percentage or remove the claim.
|
||||
|
||||
7. **Template 5 (Cold Email): Too long**
|
||||
- PROBLEM: The cold email is 15+ lines with a bullet list of everything ever built. Cold emails should be 5-7 lines max. Decision-makers don't read long emails from strangers.
|
||||
- FIX: Cut to: 2-line intro → 2-line "why I'm emailing you" → 1-line credibility → 1-line CTA. Move the full capability list to the portfolio link.
|
||||
|
||||
8. **General issue across all templates: Over-reliance on the same stats**
|
||||
- PROBLEM: Every template mentions "5 agents, 43 repos, 3,000 tests, 15-minute burn cycles." By the time a prospect sees this for the third time, it feels like a script. Also, these are vanity metrics — clients care about outcomes, not your internal metrics.
|
||||
- FIX: Lead with outcomes and client-relevant capabilities. Save the internal metrics for the portfolio page.
|
||||
|
||||
9. **Conversion math at the bottom: "~100 outreach messages to land ~1 client"**
|
||||
- PROBLEM: This is actually realistic for cold outreach. Good to set expectations. Keep this.
|
||||
|
||||
---
|
||||
|
||||
### 6. proposal-template.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **Structure is solid.** Executive summary → problem understanding → solution → timeline → pricing → terms → acceptance. This is professional and well-organized.
|
||||
|
||||
2. **"About Whitestone Engineering" section repeats the same stats AGAIN**
|
||||
- PROBLEM: If the client got an outreach message, saw the portfolio, and is now reading the proposal, they've seen "5 agents, 43 repos, 3,000 tests" three times already.
|
||||
- FIX: Keep it brief in the proposal. 2-3 sentences max. Link to portfolio for details.
|
||||
|
||||
3. **Acceptance section with signature lines**
|
||||
- PROBLEM: A proposal with signature lines that doubles as a contract is legally ambiguous. The proposal says "By signing below, [CLIENT] accepts this proposal and authorizes [FIRM] to proceed... under the terms outlined above." But the terms are thin — no IP assignment clause, no limitation of liability, no indemnification, no confidentiality, no dispute resolution, no governing law.
|
||||
- FIX: Either (a) remove the signature section and have a separate MSA/SOW that gets signed, or (b) add proper legal terms. Option (a) is safer and more professional. The proposal should say "This proposal is not a contract. A Master Services Agreement will be provided for signature upon acceptance."
|
||||
- DISCLAIMER NEEDED: Alexander should have an attorney review any contract before using it with clients. Template contracts from the internet can miss state-specific requirements.
|
||||
|
||||
4. **"Client owns all deliverables upon final payment"**
|
||||
- PROBLEM: This is a significant business decision. Work-for-hire means Alexander can't reuse any client-specific code. This is fine and standard, but make sure Alexander understands the implication — he can't take Client A's custom agent setup and deploy it for Client B.
|
||||
- FIX: The current language about retaining "general knowledge and techniques" is good. Consider adding: "Whitestone Engineering retains ownership of pre-existing tools, frameworks, and libraries used in the engagement." This protects Hermes from being claimed by a client.
|
||||
|
||||
5. **"Either party may terminate with 14 days written notice"**
|
||||
- PROBLEM: If the client terminates after paying 50% deposit on day 3, what happens? Is the deposit refundable? What about work completed?
|
||||
- FIX: Add: "Upon termination, client pays for work completed to date. Deposits are non-refundable but are credited toward completed work."
|
||||
|
||||
---
|
||||
|
||||
### 7. rate-card.md
|
||||
|
||||
**ISSUES:**
|
||||
|
||||
1. **All hourly rates are too high for a new firm (see service-offerings.md analysis above)**
|
||||
- Emergency/Incident Response at $500-800/hr is especially egregious. Who is calling a firm with no track record for emergency incident response?
|
||||
- FIX: See recommended rates below.
|
||||
|
||||
2. **Pre-paid hour blocks: 10hrs at $300/hr, 100hrs at $225/hr**
|
||||
- PROBLEM: The discount structure assumes the base rate is ~$350/hr. If we adjust base rates down, these need to scale down too.
|
||||
- FIX: Adjust proportionally with new base rates.
|
||||
|
||||
3. **Retainer: Advisory at $3,000/mo for 10 hours = $300/hr effective**
|
||||
- PROBLEM: Same rate issue. Also, who is buying advisory retainers from a new firm? This tier won't move early.
|
||||
- FIX: Keep the structure but adjust rates. Consider a $1,500-2,000/mo tier with 10 hours for early clients.
|
||||
|
||||
4. **"1-2 week queue" for non-retainer clients**
|
||||
- PROBLEM: There is no queue. Alexander has zero clients. Claiming a queue when you have none is dishonest.
|
||||
- FIX: Remove the "1-2 week queue" language until it's real. Replace with "Retainer clients get priority scheduling."
|
||||
|
||||
5. **Minimum engagement: $3,000**
|
||||
- PROBLEM: Too high for a new firm. Again, when you have no clients, a $1,500 project that becomes a case study is worth more than holding out for $3,000.
|
||||
- FIX: Change to $1,500 minimum, with a note that projects under $3,000 require full prepayment.
|
||||
|
||||
6. **"Rates subject to change. This rate card supersedes all previous versions."**
|
||||
- PROBLEM: There are no previous versions. This is fine boilerplate but slightly silly for v1.
|
||||
- FIX: Keep it — it's harmless and future-proofs the document.
|
||||
|
||||
---
|
||||
|
||||
## RECOMMENDED LAUNCH RATES
|
||||
|
||||
These are realistic rates for a new firm with no established client base, competing on Upwork and cold outreach:
|
||||
|
||||
| Service Category | Launch Rate | Rate After 5+ Clients |
|
||||
|-----------------|-------------|----------------------|
|
||||
| Agent Infrastructure | $150 — $250/hr | $250 — $400/hr |
|
||||
| Security & Hardening | $125 — $200/hr | $200 — $350/hr |
|
||||
| Automation & Research | $100 — $175/hr | $150 — $250/hr |
|
||||
| Advisory / Consulting | $150 — $250/hr | $250 — $400/hr |
|
||||
| Emergency / Incident | $250 — $400/hr | $400 — $600/hr |
|
||||
|
||||
Package deals:
|
||||
| Package | Launch Price | Post-Track-Record Price |
|
||||
|---------|-------------|------------------------|
|
||||
| Pilot (NEW — add this) | $2,500 | Remove after month 3 |
|
||||
| Starter | $3,500 — $5,000 | $5,000 — $8,000 |
|
||||
| Professional | $10,000 — $12,000 | $15,000 — $25,000 |
|
||||
| Enterprise | $25,000+ | $40,000+ |
|
||||
|
||||
---
|
||||
|
||||
## LEGAL / TAX DISCLAIMERS NEEDED
|
||||
|
||||
These should be added:
|
||||
|
||||
1. **entity-setup.md** — Add at top: "NOTE: This document contains general information, not legal or tax advice. Consult a licensed attorney and CPA for your specific situation."
|
||||
|
||||
2. **entity-setup.md, tax section** — Add: "S-Corp election has complex timing and salary requirements. Do not file Form 2553 without consulting a CPA."
|
||||
|
||||
3. **proposal-template.md** — Add note: "Have an attorney review your MSA and SOW templates before sending to clients. Template contracts may not comply with your state's laws."
|
||||
|
||||
4. **rate-card.md** — Add: "Payment terms and late payment interest rates must comply with applicable state laws."
|
||||
|
||||
---
|
||||
|
||||
## THINGS THAT WOULD EMBARRASS ALEXANDER
|
||||
|
||||
1. Charging $600/hr with no clients, no case studies, no Google results for "Whitestone Engineering." A CTO will laugh.
|
||||
2. Claiming "10-person team output" without evidence.
|
||||
3. Saying "battle-tested" for internal-only systems.
|
||||
4. The MUD (Evennia) in a professional portfolio without clear business justification.
|
||||
5. "No pitch" in a message that is clearly a pitch.
|
||||
6. Having signature lines on a proposal with insufficient legal terms.
|
||||
7. Claiming a "1-2 week queue" when the queue is empty.
|
||||
8. Repeating "5 agents, 43 repos, 3,000 tests" in every single document like a broken record.
|
||||
|
||||
---
|
||||
|
||||
## ALEXANDER'S CHECKLIST — Exact Steps In Order
|
||||
|
||||
### WEEK 1: Entity + Foundation
|
||||
|
||||
| Day | Task | Time | Cost |
|
||||
|-----|------|------|------|
|
||||
| Mon | Decide firm name, check Wyoming SOS availability | 30 min | $0 |
|
||||
| Mon | Order Wyoming Registered Agent ($60/yr) | 15 min | $60 |
|
||||
| Mon | File Wyoming LLC Articles of Organization online | 30 min | $100 |
|
||||
| Tue-Wed | Wait for LLC confirmation (1-2 biz days) | — | — |
|
||||
| Wed | Get EIN online (IRS, Mon-Fri 7am-10pm ET only) | 15 min | $0 |
|
||||
| Wed | Download operating agreement template (Northwest RA free template or LawDepot) | 30 min | $0 |
|
||||
| Wed | Apply for Mercury business bank account | 20 min | $0 |
|
||||
| Thu | Register domain (firm name .com) | 15 min | $12 |
|
||||
| Thu | Set up Google Workspace email (hello@firm.com) | 30 min | $6/mo |
|
||||
| Thu | Create LinkedIn personal profile update + company page | 1 hr | $0 |
|
||||
| Fri | Write 3 internal "case studies" about Hermes, CI/CD, and agent security | 3 hrs | $0 |
|
||||
| Fri | Deploy simple portfolio site (static, from portfolio.md content — stripped down) | 2 hrs | $0 |
|
||||
| Sat | Create Upwork account/profile | 1 hr | $0 |
|
||||
| Sun | Write elevator pitch (60 seconds, practice out loud 10 times) | 1 hr | $0 |
|
||||
|
||||
**Week 1 spend: ~$178 + $6/mo**
|
||||
**Week 1 goal: LLC filed, EIN obtained, bank account pending, portfolio site live, Upwork profile created.**
|
||||
|
||||
### WEEK 2: Pipeline Building
|
||||
|
||||
| Day | Task | Time | Cost |
|
||||
|-----|------|------|------|
|
||||
| Mon | Mercury account should be approved — verify and set up | 30 min | $0 |
|
||||
| Mon | Set up Stripe connected to Mercury | 30 min | $0 |
|
||||
| Mon | Send 5 Upwork proposals (use simplified Template 1) | 2 hrs | $0 |
|
||||
| Tue | Send 5 LinkedIn DMs to CTOs at AI startups (Template 2, simplified) | 2 hrs | $0 |
|
||||
| Wed | Write one technical post for LinkedIn/Twitter about agent operations | 1 hr | $0 |
|
||||
| Wed | Join 2-3 Discord communities (AI builders, DevOps) | 1 hr | $0 |
|
||||
| Thu | Post value-first content in Discord (Template 4A) | 1 hr | $0 |
|
||||
| Thu | Send 5 more Upwork proposals | 2 hrs | $0 |
|
||||
| Fri | Follow up on any responses, refine pitch based on feedback | 2 hrs | $0 |
|
||||
| Fri | Apply to Toptal (start the screening process) | 1 hr | $0 |
|
||||
| Weekend | Get E&O insurance quote (don't bind yet unless client requires) | 30 min | $0 |
|
||||
|
||||
**Week 2 spend: $0**
|
||||
**Week 2 goal: 10+ Upwork proposals sent, 5+ LinkedIn DMs sent, 1 community post, Stripe live, first follow-ups sent.**
|
||||
|
||||
### WEEK 3: Close First Deal
|
||||
|
||||
| Day | Task | Time | Cost |
|
||||
|-----|------|------|------|
|
||||
| Mon | Send 5 more Upwork proposals + follow up on Week 2 outreach | 2 hrs | $0 |
|
||||
| Mon | Send 5 cold emails (Template 5, shortened version) | 2 hrs | $0 |
|
||||
| Tue | Take any discovery calls that come in (free 30 min) | 1-2 hrs | $0 |
|
||||
| Tue | Write + send first proposal if there's a warm lead | 2 hrs | $0 |
|
||||
| Wed | Continue outreach cadence (5 new touches minimum) | 1 hr | $0 |
|
||||
| Wed | Write another technical post (build public presence) | 1 hr | $0 |
|
||||
| Thu | Follow up on proposals sent | 1 hr | $0 |
|
||||
| Thu | If a client needs E&O cert, bind insurance now | 30 min | ~$100-150 |
|
||||
| Fri | Pipeline review: how many leads, what's working, what's not | 1 hr | $0 |
|
||||
| Fri | Adjust rates/messaging based on feedback (if getting no responses, lower rates or change pitch) | 1 hr | $0 |
|
||||
|
||||
**Week 3 spend: $0-150 (insurance only if needed)**
|
||||
**Week 3 goal: 25+ total outreach messages sent, 1-3 discovery calls taken, 1-2 proposals out, first deal possible but not guaranteed.**
|
||||
|
||||
---
|
||||
|
||||
## CRITICAL MINDSET ADJUSTMENTS
|
||||
|
||||
1. **Your first 3 clients are marketing investments, not profit centers.** Price to win, deliver to impress, get testimonials and case studies. Then raise rates.
|
||||
|
||||
2. **Nobody cares about your internal infrastructure.** Clients care about: Can you solve my problem? How fast? How much? Have you done it before? Lead with THEIR problem, not YOUR setup.
|
||||
|
||||
3. **"AI-augmented" is your pitch, not "AI workforce."** The moment you frame your agents as a "team," clients will expect team-level accountability and communication. Frame them as tools that make you faster.
|
||||
|
||||
4. **The portfolio is your weakest link.** You have impressive internal systems but zero client work. Fix this by doing 1-2 projects at discounted rates specifically to build case studies.
|
||||
|
||||
5. **Drop the ego pricing.** $600/hr is what you charge when someone Googles your name and finds 50 testimonials, 3 conference talks, and a published book. Not when they find a blank LinkedIn company page.
|
||||
|
||||
---
|
||||
|
||||
## SUMMARY OF ALL RECOMMENDED FIXES
|
||||
|
||||
### Must-Fix (Do Before Sending Anything to a Client)
|
||||
- [ ] Lower all rates to launch rates (see table above)
|
||||
- [ ] Add a $2,500 "Pilot" package
|
||||
- [ ] Remove "battle-tested" language
|
||||
- [ ] Remove "10-person team" claim
|
||||
- [ ] Remove "1-2 week queue" claim
|
||||
- [ ] Fix the comparison table contradiction (competitive pricing while charging $600/hr)
|
||||
- [ ] Add legal/tax disclaimers
|
||||
- [ ] Remove or fix the proposal signature section (separate MSA needed)
|
||||
- [ ] Add pre-existing IP protection clause to proposal terms
|
||||
- [ ] Shorten cold email template to 5-7 lines
|
||||
- [ ] Remove "no pitch" from LinkedIn template
|
||||
- [ ] Clarify "16 organization members" in portfolio
|
||||
- [ ] Move Evennia MUD to "Internal Tools" or add clear business justification
|
||||
- [ ] Lower minimum engagement to $1,500
|
||||
|
||||
### Should-Fix (Before Month 2)
|
||||
- [ ] Write 2-3 internal case studies
|
||||
- [ ] Reduce repetition of "5 agents, 43 repos, 3,000 tests" across documents
|
||||
- [ ] Make GOFAI section more concrete or move to R&D
|
||||
- [ ] Adjust revenue projections to realistic numbers
|
||||
- [ ] Have an attorney review MSA template ($300-500)
|
||||
|
||||
### Nice-to-Fix (When Time Allows)
|
||||
- [ ] Fill in the [X]% placeholder in Discord template
|
||||
- [ ] Add a "What Our Clients Say" section (even if empty, shows intent)
|
||||
- [ ] Create a one-page PDF version of the rate card for email attachments
|
||||
- [ ] Set up a scheduling link (Calendly free tier)
|
||||
|
||||
---
|
||||
|
||||
*Report generated April 2026. Be honest, be humble, get the first client. Everything else follows from there.*
|
||||
@@ -1,8 +1,5 @@
|
||||
# Deep Dive Environment Configuration
|
||||
|
||||
# Gitea API token for branch protection
|
||||
GITEA_TOKEN=your_gitea_api_token_here
|
||||
|
||||
# Telegram (required for delivery)
|
||||
TELEGRAM_BOT_TOKEN=your_bot_token_here
|
||||
TELEGRAM_CHANNEL_ID=-1001234567890
|
||||
|
||||
114
scripts/fleet.sh
114
scripts/fleet.sh
@@ -1,114 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# fleet.sh — Cross-VPS Fleet Management
|
||||
# Usage: ./fleet.sh {status|restart|stop|start|update|health} [wizard|all]
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ALPHA_HOST="167.99.126.228"
|
||||
BETA_HOST="104.131.15.18"
|
||||
THIS_HOST=$(hostname -I | awk '{print $1}')
|
||||
WIZARDS=(allegro adagio ezra bezalel bilbobagginshire)
|
||||
|
||||
# Detect which host we're on
|
||||
if [[ "$THIS_HOST" == "$BETA_HOST" ]]; then
|
||||
ROLE="beta"
|
||||
LOCAL_WIZARDS=(bezalel)
|
||||
REMOTE_HOST="$ALPHA_HOST"
|
||||
elif [[ "$THIS_HOST" == "$ALPHA_HOST" ]]; then
|
||||
ROLE="alpha"
|
||||
LOCAL_WIZARDS=(allegro adagio ezra bilbobagginshire)
|
||||
REMOTE_HOST="$BETA_HOST"
|
||||
else
|
||||
ROLE="unknown"
|
||||
LOCAL_WIZARDS=()
|
||||
REMOTE_HOST="$ALPHA_HOST"
|
||||
echo "WARN: Host IP ($THIS_HOST) does not match Alpha or Beta. Running in limited mode."
|
||||
fi
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 {status|restart|stop|start|update|health} [wizard|all]"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 status all # Show all services on this host"
|
||||
echo " $0 restart allegro # Restart allegro (only works on Alpha)"
|
||||
echo " $0 health bezalel # Health check bezalel (only works on Beta)"
|
||||
echo " $0 status remote # Attempt status on remote host via SSH"
|
||||
exit 1
|
||||
}
|
||||
|
||||
cmd="${1:-}"
|
||||
target="${2:-}"
|
||||
|
||||
[[ -z "$cmd" || -z "$target" ]] && usage
|
||||
|
||||
run_local() {
|
||||
local svc="hermes-$1"
|
||||
case "$cmd" in
|
||||
status) systemctl is-active "$svc" || true ;;
|
||||
restart) sudo systemctl restart "$svc" ;;
|
||||
stop) sudo systemctl stop "$svc" ;;
|
||||
start) sudo systemctl start "$svc" ;;
|
||||
update)
|
||||
echo "Updating $1..."
|
||||
local dir="/root/wizards/$1/hermes-agent"
|
||||
if [[ -d "$dir/.git" ]]; then
|
||||
(cd "$dir" && git pull origin main)
|
||||
else
|
||||
echo "WARN: $dir is not a git repo. Skipping."
|
||||
fi
|
||||
;;
|
||||
health)
|
||||
if systemctl is-active "$svc" > /dev/null; then
|
||||
echo "$svc: ACTIVE"
|
||||
# Quick API ping if gateway is expected
|
||||
local port_file="/root/wizards/$1/home/.hermes/gateway_port"
|
||||
if [[ -f "$port_file" ]]; then
|
||||
local port
|
||||
port=$(cat "$port_file" 2>/dev/null || echo "")
|
||||
if [[ -n "$port" ]]; then
|
||||
curl -sf "http://localhost:$port/health" > /dev/null && echo " Gateway: OK" || echo " Gateway: NO RESPONSE"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "$svc: INACTIVE"
|
||||
fi
|
||||
;;
|
||||
*) usage ;;
|
||||
esac
|
||||
}
|
||||
|
||||
run_remote() {
|
||||
if ssh -o ConnectTimeout=3 -o BatchMode=yes "root@$REMOTE_HOST" "hostname" > /dev/null 2>&1; then
|
||||
echo "=== Remote: $REMOTE_HOST ==="
|
||||
ssh -o ConnectTimeout=3 -o BatchMode=yes "root@$REMOTE_HOST" "cd /root/wizards/scripts && ./fleet.sh $cmd $target" 2>/dev/null || echo "Remote fleet.sh failed or not found."
|
||||
else
|
||||
echo "=== Remote: $REMOTE_HOST (SSH not configured) ==="
|
||||
echo "To enable remote fleet management, add an SSH key for root@$REMOTE_HOST"
|
||||
echo "and ensure fleet.sh is present at /root/wizards/scripts/fleet.sh on both hosts."
|
||||
fi
|
||||
}
|
||||
|
||||
case "$target" in
|
||||
all)
|
||||
echo "=== Local host: $THIS_HOST ($ROLE) ==="
|
||||
for w in "${LOCAL_WIZARDS[@]}"; do
|
||||
echo "--- $w ---"
|
||||
run_local "$w"
|
||||
done
|
||||
;;
|
||||
remote)
|
||||
run_remote
|
||||
;;
|
||||
allegro|adagio|ezra|bezalel|bilbobagginshire)
|
||||
if [[ " ${LOCAL_WIZARDS[*]} " =~ " $target " ]]; then
|
||||
run_local "$target"
|
||||
else
|
||||
echo "$target does not run on this host ($ROLE). Trying remote..."
|
||||
run_remote
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Unknown target: $target"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
@@ -1,184 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Reassign Fenrir's orphaned issues to active wizards based on issue type."""
|
||||
|
||||
import json
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
import time
|
||||
|
||||
TOKEN = "dc0517a965226b7a0c5ffdd961b1ba26521ac592"
|
||||
BASE_URL = "https://forge.alexanderwhitestone.com/api/v1"
|
||||
REPO = "Timmy_Foundation/the-nexus"
|
||||
|
||||
HEADERS = {
|
||||
"Authorization": f"token {TOKEN}",
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
# Wizard assignments
|
||||
EZRA = "ezra" # Architecture, docs, epics, planning
|
||||
ALLEGRO = "allegro" # Code implementation, UI, features
|
||||
BEZALEL = "bezalel" # Execution, ops, testing, infra, monitoring
|
||||
|
||||
def classify_issue(number, title):
|
||||
"""Classify issue based on number and title."""
|
||||
title_upper = title.upper()
|
||||
|
||||
# Skip the triage issue itself and the permanent escalation issue
|
||||
if number == 823:
|
||||
return None # Skip - this is the issue we're working on
|
||||
if number == 431:
|
||||
return EZRA # Master escalation -> Ezra (archivist)
|
||||
|
||||
# Allegro self-improvement milestones (M0-M7) -> Bezalel (execution/ops)
|
||||
import re
|
||||
if re.match(r'^M\d+:', title):
|
||||
return BEZALEL
|
||||
|
||||
# EPIC/GRAND EPIC/CONSOLIDATION/FRONTIER -> Ezra (architecture)
|
||||
if any(tag in title_upper for tag in [
|
||||
'[EPIC]', '[GRAND EPIC]', 'EPIC:', '[CONSOLIDATION]', '[FRONTIER]',
|
||||
'[CRITIQUE]', '[PROPOSAL]', '[RETROSPECTIVE', '[REPORT]',
|
||||
'EPIC #', 'GRAND EPIC'
|
||||
]):
|
||||
return EZRA
|
||||
|
||||
# Allegro self-improvement epic -> Bezalel
|
||||
if 'ALLEGRO SELF-IMPROVEMENT' in title_upper or 'ALLEGRO HYBRID PRODUCTION' in title_upper:
|
||||
return BEZALEL
|
||||
|
||||
# Ops/Monitoring/Infra/Testing -> Bezalel
|
||||
if any(tag in title_upper for tag in [
|
||||
'[OPS]', '[MONITORING]', '[PRUNE]', '[OFFLOAD]', '[BUG]',
|
||||
'[CRON]', '[INSTALL]', '[INFRA]', '[TRAINING]', '[CI/',
|
||||
'[TRIAGE]', # triage/ops tasks
|
||||
]):
|
||||
return BEZALEL
|
||||
|
||||
# Allegro backlog items -> Allegro
|
||||
if '[ALLEGRO-BACKLOG]' in title_upper:
|
||||
return ALLEGRO
|
||||
|
||||
# Reporting -> Bezalel
|
||||
if any(tag in title_upper for tag in ['[REPORT]', 'BURN-MODE', 'PERFORMANCE REPORT']):
|
||||
return BEZALEL
|
||||
|
||||
# Fleet management/wizard ops -> Bezalel
|
||||
if any(tag in title_upper for tag in ['FLEET', 'WIZARD', 'GHOST WIZARD', 'TIMMY', 'BRING LIVE']):
|
||||
# But EPICs about fleet -> Ezra (already handled above)
|
||||
return BEZALEL
|
||||
|
||||
# Code implementation: NEXUS UI/3D, MIGRATION, UI, UX, PORTALS, CHAT, PANELS -> Allegro
|
||||
if any(tag in title_upper for tag in [
|
||||
'[NEXUS]', '[MIGRATION]', '[UI]', '[UX]', '[PORTALS]', '[PORTAL]',
|
||||
'[CHAT]', '[PANELS]', '[DATA]', '[PERF]', '[RESPONSIVE]', '[A11Y]',
|
||||
'[VISUAL]', '[AUDIO]', '[MEDIA]', '[CONCEPT]', '[BRIDGE]',
|
||||
'[AUTH]', '[VISITOR]', '[IDENTITY]', '[SESSION]', '[RELIABILITY]',
|
||||
'[HARNESS]', '[VALIDATION]', '[SOVEREIGNTY]', '[M6-P',
|
||||
'PROSE ENGINE', 'AUTO-SKILL', 'GITEA_API', 'CRON JOB',
|
||||
'HEARTBEAT DAEMON', 'FLEET HEALTH JSON',
|
||||
'[FENRIR] NEXUS', # fenrir's nexus issues -> allegro
|
||||
]):
|
||||
return ALLEGRO
|
||||
|
||||
# Default: Bezalel for anything else
|
||||
return BEZALEL
|
||||
|
||||
|
||||
def get_all_fenrir_issues():
|
||||
"""Fetch all open issues assigned to fenrir."""
|
||||
issues = []
|
||||
page = 1
|
||||
while True:
|
||||
url = f"{BASE_URL}/repos/{REPO}/issues?assignee=fenrir&state=open&limit=50&page={page}"
|
||||
req = urllib.request.Request(url, headers={"Authorization": f"token {TOKEN}"})
|
||||
with urllib.request.urlopen(req) as resp:
|
||||
data = json.loads(resp.read())
|
||||
if not data:
|
||||
break
|
||||
issues.extend(data)
|
||||
if len(data) < 50:
|
||||
break
|
||||
page += 1
|
||||
return issues
|
||||
|
||||
|
||||
def reassign_issue(number, assignee):
|
||||
"""Reassign an issue to a new wizard."""
|
||||
url = f"{BASE_URL}/repos/{REPO}/issues/{number}"
|
||||
body = json.dumps({"assignees": [assignee]}).encode()
|
||||
req = urllib.request.Request(url, data=body, headers=HEADERS, method="PATCH")
|
||||
try:
|
||||
with urllib.request.urlopen(req) as resp:
|
||||
return resp.status, None
|
||||
except urllib.error.HTTPError as e:
|
||||
return e.code, e.read().decode()
|
||||
|
||||
|
||||
def main():
|
||||
print("Fetching all fenrir issues...")
|
||||
issues = get_all_fenrir_issues()
|
||||
print(f"Found {len(issues)} open issues assigned to fenrir\n")
|
||||
|
||||
# Classify
|
||||
assignments = {EZRA: [], ALLEGRO: [], BEZALEL: [], None: []}
|
||||
for issue in issues:
|
||||
num = issue["number"]
|
||||
title = issue["title"]
|
||||
wizard = classify_issue(num, title)
|
||||
assignments[wizard].append((num, title))
|
||||
|
||||
print(f"Classification:")
|
||||
print(f" Ezra (architecture): {len(assignments[EZRA])} issues")
|
||||
print(f" Allegro (code): {len(assignments[ALLEGRO])} issues")
|
||||
print(f" Bezalel (execution): {len(assignments[BEZALEL])} issues")
|
||||
print(f" Skip (unchanged): {len(assignments[None])} issues")
|
||||
print()
|
||||
|
||||
# Show classification
|
||||
for wizard, label in [(EZRA, 'EZRA'), (ALLEGRO, 'ALLEGRO'), (BEZALEL, 'BEZALEL')]:
|
||||
print(f"\n--- {label} ---")
|
||||
for num, title in assignments[wizard]:
|
||||
print(f" #{num}: {title[:70]}")
|
||||
|
||||
print(f"\n--- SKIPPED ---")
|
||||
for num, title in assignments[None]:
|
||||
print(f" #{num}: {title[:70]}")
|
||||
|
||||
# Execute reassignments
|
||||
print("\n\nExecuting reassignments...")
|
||||
results = {"success": [], "failed": []}
|
||||
|
||||
for wizard in [EZRA, ALLEGRO, BEZALEL]:
|
||||
for num, title in assignments[wizard]:
|
||||
status, error = reassign_issue(num, wizard)
|
||||
if status in (200, 201):
|
||||
print(f" ✓ #{num} -> {wizard}")
|
||||
results["success"].append((num, wizard))
|
||||
else:
|
||||
print(f" ✗ #{num} -> {wizard} (HTTP {status}: {error[:100] if error else 'unknown'})")
|
||||
results["failed"].append((num, wizard, error))
|
||||
time.sleep(0.1) # Rate limiting
|
||||
|
||||
print(f"\n\nSummary:")
|
||||
print(f" Successfully reassigned: {len(results['success'])}")
|
||||
print(f" Failed: {len(results['failed'])}")
|
||||
|
||||
# Save results for PR
|
||||
with open("/tmp/reassignment_results.json", "w") as f:
|
||||
json.dump({
|
||||
"total": len(issues),
|
||||
"ezra": [(n, t) for n, t in assignments[EZRA]],
|
||||
"allegro": [(n, t) for n, t in assignments[ALLEGRO]],
|
||||
"bezalel": [(n, t) for n, t in assignments[BEZALEL]],
|
||||
"skipped": [(n, t) for n, t in assignments[None]],
|
||||
"success_count": len(results["success"]),
|
||||
"failed_count": len(results["failed"]),
|
||||
"failed_details": [(n, w, str(e)) for n, w, e in results["failed"]],
|
||||
}, f, indent=2)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -11,7 +11,6 @@ import signal
|
||||
import sys
|
||||
from typing import Set
|
||||
|
||||
# Branch protected file - see POLICY.md
|
||||
import websockets
|
||||
|
||||
# Configuration
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
const CACHE_NAME = 'nexus-v1.1';
|
||||
const ASSETS_TO_CACHE = [
|
||||
'/',
|
||||
'/index.html',
|
||||
'/app.js',
|
||||
'/style.css',
|
||||
'/manifest.json',
|
||||
'/icons/icon-192x192.png',
|
||||
'/icons/icon-512x512.png'
|
||||
];
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
event.waitUntil(
|
||||
caches.open(CachedName).then(cache => {
|
||||
return cache.addAll(ASSETS_TO_CACHE);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', (event) => {
|
||||
event.respondWith(
|
||||
caches.match(event.request).then(response => {
|
||||
return response || fetch(event.request);
|
||||
})
|
||||
);
|
||||
});
|
||||
@@ -970,7 +970,7 @@ canvas#nexus-canvas {
|
||||
right: 12px;
|
||||
bottom: 12px;
|
||||
}
|
||||
.hud-agent-log {
|
||||
.hud-controls {
|
||||
display: none;
|
||||
}
|
||||
.loader-title {
|
||||
|
||||
1
the-nexus/.github/CODEOWNERS
vendored
1
the-nexus/.github/CODEOWNERS
vendored
@@ -1 +0,0 @@
|
||||
@perplexity
|
||||
@@ -1,13 +0,0 @@
|
||||
@Timmy
|
||||
@perplexity
|
||||
>>>>>>> replace
|
||||
```
|
||||
|
||||
#### 2. `the-nexus/CODEOWNERS`
|
||||
Ensure `@perplexity` is the default reviewer.
|
||||
|
||||
```python
|
||||
the-nexus/CODEOWNERS
|
||||
<<<<<<< search
|
||||
@perplexity
|
||||
* @perplexity
|
||||
@@ -1,17 +0,0 @@
|
||||
# Contribution Policy for the-nexus
|
||||
|
||||
## Branch Protection Rules
|
||||
All changes to the `main` branch require:
|
||||
- Pull Request with at least 1 approval
|
||||
- CI checks passing (when available)
|
||||
- No direct commits or force pushes
|
||||
- No deletion of the main branch
|
||||
|
||||
## Review Requirements
|
||||
- All PRs must be reviewed by @perplexity
|
||||
|
||||
## Stale PR Policy
|
||||
- Stale approvals are dismissed on new commits
|
||||
- Abandoned PRs will be closed after 7 days of inactivity
|
||||
|
||||
For urgent fixes, create a hotfix branch and follow the same review process.
|
||||
4
timmy-config/.github/CODEOWNERS
vendored
4
timmy-config/.github/CODEOWNERS
vendored
@@ -1,4 +0,0 @@
|
||||
# CODEOWNERS for timmy-config
|
||||
# This file defines default reviewers for pull requests
|
||||
|
||||
* @perplexity
|
||||
@@ -1,3 +0,0 @@
|
||||
* @perplexity
|
||||
/timmy-config/** @Timmy
|
||||
* @perplexity
|
||||
@@ -1,17 +0,0 @@
|
||||
# Contribution Policy for timmy-config
|
||||
|
||||
## Branch Protection Rules
|
||||
All changes to the `main` branch require:
|
||||
- Pull Request with at least 1 approval
|
||||
- Limited CI checks (when available)
|
||||
- No direct commits or force pushes
|
||||
- No deletion of the main branch
|
||||
|
||||
## Review Requirements
|
||||
- All PRs must be reviewed by @perplexity
|
||||
|
||||
## Stale PR Policy
|
||||
- Stale approvals are dismissed on new commits
|
||||
- Abandoned PRs will be closed after 7 days of inactivity
|
||||
|
||||
For urgent fixes, create a hotfix branch and follow the same review process.
|
||||
4
timmy-home/.github/CODEOWNERS
vendored
4
timmy-home/.github/CODEOWNERS
vendored
@@ -1,4 +0,0 @@
|
||||
# CODEOWNERS for timmy-home
|
||||
# This file defines default reviewers for pull requests
|
||||
|
||||
* @perplexity
|
||||
@@ -1,3 +0,0 @@
|
||||
@perplexity
|
||||
@perplexity
|
||||
* @perplexity
|
||||
@@ -1,16 +0,0 @@
|
||||
# Contribution Policy for timmy-home
|
||||
|
||||
## Branch Protection Rules
|
||||
All changes to the `main` branch require:
|
||||
- Pull Request with at least 1 approval
|
||||
- No direct commits or force pushes
|
||||
- No deletion of the main branch
|
||||
|
||||
## Review Requirements
|
||||
- All PRs must be reviewed by @perplexity
|
||||
|
||||
## Stale PR Policy
|
||||
- Stale approvals are dismissed on new commits
|
||||
- Abandoned PRs will be closed after 7 days of inactivity
|
||||
|
||||
For urgent fixes, create a hotfix branch and follow the same review process.
|
||||
Reference in New Issue
Block a user