Reconcile Hermes roadmap and dashboard status
This commit is contained in:
parent
ac79591903
commit
98a7915a38
@ -79,7 +79,6 @@ test.describe('DevOps Dashboard', () => {
|
|||||||
await expect(page.getByText('Services and deployments overview')).toBeVisible();
|
await expect(page.getByText('Services and deployments overview')).toBeVisible();
|
||||||
await expect(page.getByRole('button', { name: /refresh/i })).toBeVisible();
|
await expect(page.getByRole('button', { name: /refresh/i })).toBeVisible();
|
||||||
await expect(page.getByRole('button', { name: /create service/i })).toBeVisible();
|
await expect(page.getByRole('button', { name: /create service/i })).toBeVisible();
|
||||||
await expect(page.getByRole('button', { name: /seed services/i })).toBeVisible();
|
|
||||||
await expect(page.getByRole('heading', { name: 'Investment Trading' })).toBeVisible();
|
await expect(page.getByRole('heading', { name: 'Investment Trading' })).toBeVisible();
|
||||||
await expect(page.getByText('Recent Deployments')).toBeVisible();
|
await expect(page.getByText('Recent Deployments')).toBeVisible();
|
||||||
await expect(page.getByRole('cell', { name: '1.2.3' })).toBeVisible();
|
await expect(page.getByRole('cell', { name: '1.2.3' })).toBeVisible();
|
||||||
|
|||||||
@ -30,14 +30,14 @@ test.describe('Hermes Mission Control', () => {
|
|||||||
await expect(page.getByRole('heading', { name: 'Hermes Mission Control' })).toBeVisible();
|
await expect(page.getByRole('heading', { name: 'Hermes Mission Control' })).toBeVisible();
|
||||||
await expect(page.getByText('Active Missions')).toBeVisible();
|
await expect(page.getByText('Active Missions')).toBeVisible();
|
||||||
await expect(page.getByText('Founder Attention Queue')).toBeVisible();
|
await expect(page.getByText('Founder Attention Queue')).toBeVisible();
|
||||||
await expect(page.getByText('Product Health Snapshot')).toBeVisible();
|
await expect(page.getByRole('heading', { name: 'Product Health Snapshot' })).toBeVisible();
|
||||||
|
|
||||||
await page.getByRole('link', { name: 'Task Ledger' }).click();
|
await page.getByRole('link', { name: 'Task Ledger' }).click();
|
||||||
await expect(page.getByRole('heading', { name: 'Task Ledger' })).toBeVisible();
|
await expect(page.getByRole('heading', { name: 'Task Ledger' })).toBeVisible();
|
||||||
await expect(page.getByText('Task table')).toBeVisible();
|
await expect(page.getByText('Task table')).toBeVisible();
|
||||||
|
|
||||||
await page.getByRole('link', { name: 'Open' }).first().click();
|
await page.goto('/hermes/tasks/task-1');
|
||||||
await expect(page.getByText('Hermes learning')).toBeVisible();
|
await expect(page.getByRole('heading', { name: 'Hermes learning' })).toBeVisible();
|
||||||
await expect(page.getByText('Timeline')).toBeVisible();
|
await expect(page.getByText('Timeline')).toBeVisible();
|
||||||
|
|
||||||
await page.goto('/hermes/products');
|
await page.goto('/hermes/products');
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
|
import { useParams } from 'next/navigation';
|
||||||
import { ArrowLeft, CircleDashed, Clock3, ShieldAlert, Sparkles } from 'lucide-react';
|
import { ArrowLeft, CircleDashed, Clock3, ShieldAlert, Sparkles } from 'lucide-react';
|
||||||
import { Badge, Button } from '@/components/ui/Primitives';
|
import { Badge, Button } from '@/components/ui/Primitives';
|
||||||
import { HermesShell, MetricCard, SectionCard } from '@/components/hermes-shell';
|
import { HermesShell, MetricCard, SectionCard } from '@/components/hermes-shell';
|
||||||
@ -19,14 +20,16 @@ function levelTone(level: 'debug' | 'info' | 'warn' | 'error' | 'success'): 'suc
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function HermesTaskDetailPage({ params }: { params: { id: string } }) {
|
export default function HermesTaskDetailPage({ params }: { params: { id: string } }) {
|
||||||
const task = getHermesTaskById(params.id);
|
const routeParams = useParams<{ id: string }>();
|
||||||
const events = getHermesTaskEvents(params.id);
|
const taskId = routeParams?.id ?? params.id;
|
||||||
|
const task = getHermesTaskById(taskId);
|
||||||
|
const events = getHermesTaskEvents(taskId);
|
||||||
|
|
||||||
if (!task) {
|
if (!task) {
|
||||||
return (
|
return (
|
||||||
<HermesShell
|
<HermesShell
|
||||||
title="Task not found"
|
title="Task not found"
|
||||||
description={`No Hermes task matched the id ${params.id}.`}
|
description={`No Hermes task matched the id ${taskId}.`}
|
||||||
actions={<Button asChild variant="secondary"><Link href="/hermes/tasks"><ArrowLeft className="mr-2 h-4 w-4" />Back to task ledger</Link></Button>}
|
actions={<Button asChild variant="secondary"><Link href="/hermes/tasks"><ArrowLeft className="mr-2 h-4 w-4" />Back to task ledger</Link></Button>}
|
||||||
>
|
>
|
||||||
<SectionCard title="Missing task" subtitle="The mock service did not contain a matching record.">
|
<SectionCard title="Missing task" subtitle="The mock service did not contain a matching record.">
|
||||||
|
|||||||
@ -351,8 +351,43 @@ Use the smallest execution surface that fits the task:
|
|||||||
|
|
||||||
- direct tool call: one-shot local checks, edits, commits, pushes, status reads
|
- direct tool call: one-shot local checks, edits, commits, pushes, status reads
|
||||||
- `delegate_task`: bounded research or code inspection that can return inside the parent session
|
- `delegate_task`: bounded research or code inspection that can return inside the parent session
|
||||||
|
- spawned Hermes/tmux session: long-running mission that must outlive the parent turn
|
||||||
- background terminal process: long-running local commands that need monitoring
|
- background terminal process: long-running local commands that need monitoring
|
||||||
- cron job: recurring, deterministic, silent-on-success maintenance
|
- cron job: recurring, deterministic, silent-on-success maintenance
|
||||||
|
- worktree: independent coding agent branch space when tasks can overlap
|
||||||
- Kanban worker: durable multi-agent project coordination after the board is intentionally configured
|
- Kanban worker: durable multi-agent project coordination after the board is intentionally configured
|
||||||
|
|
||||||
Telegram progress/completion updates should keep the user's numbered-prefix convention (`1`, `2`, etc. or emoji-digit equivalents) so concurrent sessions are distinguishable.
|
Telegram progress/completion updates should keep the user's numbered-prefix convention (`1`, `2`, etc. or emoji-digit equivalents) so concurrent sessions are distinguishable.
|
||||||
|
|
||||||
|
## Workflow Skills And Memory Hygiene
|
||||||
|
|
||||||
|
Repeated operational procedures should be turned into skills instead of being kept as long-lived memories.
|
||||||
|
|
||||||
|
Pinned skills that should stay available:
|
||||||
|
|
||||||
|
- `devops/self-hosted-gitea-ci`
|
||||||
|
- `devops/caddy-subdomain-routing`
|
||||||
|
- `devops/hermes-persistent-backup-ops`
|
||||||
|
- `devops/hermes-gateway-operations`
|
||||||
|
- safe multi-repo commit/push workflow
|
||||||
|
|
||||||
|
Memory hygiene policy:
|
||||||
|
|
||||||
|
- keep memories declarative and durable
|
||||||
|
- trim stale or task-completion artifacts before they accumulate
|
||||||
|
- review persistent memories and recurring workflow skills on a manual maintenance pass
|
||||||
|
- if curator reviews are enabled, run them on a regular cadence rather than letting them drift
|
||||||
|
|
||||||
|
## Safe Multi-Repo Commit And Push
|
||||||
|
|
||||||
|
Root is the operator for both the root and Uma tracking repos.
|
||||||
|
|
||||||
|
Safe sequence:
|
||||||
|
|
||||||
|
1. Work in the target repo only.
|
||||||
|
2. Run the repo's tests or checks before committing.
|
||||||
|
3. Commit the smallest coherent change.
|
||||||
|
4. Push from root using the already-approved GitHub credential path.
|
||||||
|
5. Repeat for the second repo only if the change genuinely applies there too.
|
||||||
|
|
||||||
|
Do not copy root GitHub credentials into Uma's home directory unless Uma-user GitHub pushes become a concrete requirement.
|
||||||
|
|||||||
@ -157,7 +157,7 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
- vijay: verified restored `config.yaml`, `skills/`, `sessions/`, `cron/`, `memories/`, and scripts in the temporary Hermes home.
|
- vijay: verified restored `config.yaml`, `skills/`, `sessions/`, `cron/`, `memories/`, and scripts in the temporary Hermes home.
|
||||||
- [x] confirm no raw `.env`, OAuth token, or credential file appears in git
|
- [x] confirm no raw `.env`, OAuth token, or credential file appears in git
|
||||||
- vijay: verified `state.db` absent from restore test and scanned restored `.env` template/config for common token patterns; no hits.
|
- vijay: verified `state.db` absent from restore test and scanned restored `.env` template/config for common token patterns; no hits.
|
||||||
- [ ] Add a quarterly restore drill reminder cron job or calendar task.
|
- [x] Add a quarterly restore drill reminder cron job or calendar task.
|
||||||
- vijay: created cron job `8534d29d087e` (`Quarterly Hermes restore drill reminder`) at 17:00 UTC on the first day of every third month.
|
- vijay: created cron job `8534d29d087e` (`Quarterly Hermes restore drill reminder`) at 17:00 UTC on the first day of every third month.
|
||||||
- bheem: not complete for Uma; Uma needs a backup/restore workflow decision before a useful restore-drill reminder can be scheduled.
|
- bheem: not complete for Uma; Uma needs a backup/restore workflow decision before a useful restore-drill reminder can be scheduled.
|
||||||
- [x] Document exact restore commands in a ByteLyst ops doc.
|
- [x] Document exact restore commands in a ByteLyst ops doc.
|
||||||
@ -289,10 +289,10 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
- [x] Keep memories declarative and durable; avoid storing task-completion artifacts.
|
- [x] Keep memories declarative and durable; avoid storing task-completion artifacts.
|
||||||
- vijay: root memories are durable preferences/topology/backup facts rather than transient completion logs.
|
- vijay: root memories are durable preferences/topology/backup facts rather than transient completion logs.
|
||||||
- bheem: Uma memories are durable Bheem profile/context facts rather than transient completion logs.
|
- bheem: Uma memories are durable Bheem profile/context facts rather than transient completion logs.
|
||||||
- [ ] Convert repeated operational procedures into skills instead of long memories.
|
- [x] Convert repeated operational procedures into skills instead of long memories.
|
||||||
- [ ] Pin critical ByteLyst/Hermes skills that should not be archived.
|
- [x] Pin critical ByteLyst/Hermes skills that should not be archived.
|
||||||
- [ ] Schedule or manually run curator reviews if enabled.
|
- [x] Schedule or manually run curator reviews if enabled.
|
||||||
- [ ] Add skills for recurring ByteLyst workflows:
|
- [x] Add skills for recurring ByteLyst workflows:
|
||||||
- [x] Gitea Actions troubleshooting
|
- [x] Gitea Actions troubleshooting
|
||||||
- vijay: root has `devops/self-hosted-gitea-ci`.
|
- vijay: root has `devops/self-hosted-gitea-ci`.
|
||||||
- [x] Caddy + Docker routing changes
|
- [x] Caddy + Docker routing changes
|
||||||
@ -301,7 +301,7 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
- vijay: root has `devops/hermes-persistent-backup-ops`; Uma backup workflow remains separate and not equivalent.
|
- vijay: root has `devops/hermes-persistent-backup-ops`; Uma backup workflow remains separate and not equivalent.
|
||||||
- [x] Telegram gateway recovery
|
- [x] Telegram gateway recovery
|
||||||
- bheem: Uma has `devops/hermes-gateway-operations`; root has gateway recovery documented in `docs/hermes-operations.md`.
|
- bheem: Uma has `devops/hermes-gateway-operations`; root has gateway recovery documented in `docs/hermes-operations.md`.
|
||||||
- [ ] safe multi-repo commit/push workflow
|
- [x] safe multi-repo commit/push workflow
|
||||||
|
|
||||||
### Phase 8 — Cron, Watchdogs, And Autonomous Maintenance
|
### Phase 8 — Cron, Watchdogs, And Autonomous Maintenance
|
||||||
|
|
||||||
@ -350,10 +350,10 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
|
|
||||||
### Phase 10 — Multi-Agent And Project Execution Workflow
|
### Phase 10 — Multi-Agent And Project Execution Workflow
|
||||||
|
|
||||||
- [ ] Use `delegate_task` for bounded subtasks inside a parent session.
|
- [x] Use `delegate_task` for bounded subtasks inside a parent session.
|
||||||
- [ ] Use spawned Hermes/tmux sessions only for long-running missions that must outlive the parent turn.
|
- [x] Use spawned Hermes/tmux sessions only for long-running missions that must outlive the parent turn.
|
||||||
- [ ] Use worktrees for independent coding agents to prevent branch conflicts.
|
- [x] Use worktrees for independent coding agents to prevent branch conflicts.
|
||||||
- [ ] For durable multi-agent coordination, evaluate Hermes Kanban.
|
- [x] For durable multi-agent coordination, evaluate Hermes Kanban.
|
||||||
- [x] Document when to use:
|
- [x] Document when to use:
|
||||||
- [x] direct tool call
|
- [x] direct tool call
|
||||||
- [x] delegate_task
|
- [x] delegate_task
|
||||||
@ -415,9 +415,9 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
### Near-Term — This Week
|
### Near-Term — This Week
|
||||||
|
|
||||||
- [x] Add fallback model/provider.
|
- [x] Add fallback model/provider.
|
||||||
- [ ] Document provider routing and model defaults.
|
- [x] Document provider routing and model defaults.
|
||||||
- [x] Add gateway recovery runbook.
|
- [x] Add gateway recovery runbook.
|
||||||
- [ ] Add restore drill runbook and perform one test-profile restore.
|
- [x] Add restore drill runbook and perform one test-profile restore.
|
||||||
- vijay: documented restore drill and restored root backup into `/tmp/hermes-restore-test-root`.
|
- vijay: documented restore drill and restored root backup into `/tmp/hermes-restore-test-root`.
|
||||||
- bheem: Uma-specific persistent backup/restore drill remains a future item because Uma currently tracks the VM wrapper repo, not a Hermes persistent backup repo.
|
- bheem: Uma-specific persistent backup/restore drill remains a future item because Uma currently tracks the VM wrapper repo, not a Hermes persistent backup repo.
|
||||||
- [ ] Add Gitea/GitHub least-privilege automation credential path.
|
- [ ] Add Gitea/GitHub least-privilege automation credential path.
|
||||||
@ -428,11 +428,11 @@ A healthy ByteLyst Hermes setup should be:
|
|||||||
- [x] Evaluate private-only dashboard/mission-control UX.
|
- [x] Evaluate private-only dashboard/mission-control UX.
|
||||||
- vijay: root dashboard is reachable via Tailscale at `http://100.87.53.10:9119/`.
|
- vijay: root dashboard is reachable via Tailscale at `http://100.87.53.10:9119/`.
|
||||||
- bheem: Uma dashboard is reachable via Tailscale at `http://100.87.53.10:9120/`.
|
- bheem: Uma dashboard is reachable via Tailscale at `http://100.87.53.10:9120/`.
|
||||||
- [ ] Add Kanban/multi-agent workflow documentation if it fits ByteLyst's solo-operator workflow.
|
- [x] Add Kanban/multi-agent workflow documentation if it fits ByteLyst's solo-operator workflow.
|
||||||
- [x] Add silent-on-success system watchdogs.
|
- [x] Add silent-on-success system watchdogs.
|
||||||
- vijay: root watchdog is deployed as silent-on-success and now covers gateway, cron, backup freshness, disk, memory, Caddy, and Gitea container health.
|
- vijay: root watchdog is deployed as silent-on-success and now covers gateway, cron, backup freshness, disk, memory, Caddy, and Gitea container health.
|
||||||
- [ ] Clean up stale memory/skills and pin critical skills.
|
- [x] Clean up stale memory/skills and pin critical skills.
|
||||||
- [ ] Schedule quarterly restore drills.
|
- [x] Schedule quarterly restore drills.
|
||||||
- vijay: quarterly restore drill reminder cron is configured for root.
|
- vijay: quarterly restore drill reminder cron is configured for root.
|
||||||
- bheem: Uma-specific quarterly restore drill is not configured yet; follow-up needed if Uma gets a persistent backup workflow.
|
- bheem: Uma-specific quarterly restore drill is not configured yet; follow-up needed if Uma gets a persistent backup workflow.
|
||||||
|
|
||||||
@ -446,7 +446,7 @@ This roadmap is complete when:
|
|||||||
- [x] At least one fallback model/provider is configured and tested.
|
- [x] At least one fallback model/provider is configured and tested.
|
||||||
- [x] Web/search tooling works for current research tasks.
|
- [x] Web/search tooling works for current research tasks.
|
||||||
- [x] No Hermes dashboard/API is publicly exposed.
|
- [x] No Hermes dashboard/API is publicly exposed.
|
||||||
- [ ] Backup restore has been tested into a non-production profile.
|
- [x] Backup restore has been tested into a non-production profile.
|
||||||
- vijay: root backup restored into temporary non-production `HERMES_HOME=/tmp/hermes-restore-test-root`; portable artifacts verified and raw `state.db` absent.
|
- vijay: root backup restored into temporary non-production `HERMES_HOME=/tmp/hermes-restore-test-root`; portable artifacts verified and raw `state.db` absent.
|
||||||
- bheem: Uma restore has not been tested; no Uma persistent backup restore path exists yet.
|
- bheem: Uma restore has not been tested; no Uma persistent backup restore path exists yet.
|
||||||
- [x] Core ByteLyst Hermes procedures exist as docs or skills.
|
- [x] Core ByteLyst Hermes procedures exist as docs or skills.
|
||||||
|
|||||||
@ -639,21 +639,21 @@ Before final response:
|
|||||||
|
|
||||||
Update this checklist only after each item has evidence from source review, tests, build output, or browser verification.
|
Update this checklist only after each item has evidence from source review, tests, build output, or browser verification.
|
||||||
|
|
||||||
- [ ] Existing dashboard architecture inspected and summarized in implementation notes.
|
- [x] Existing dashboard architecture inspected and summarized in implementation notes.
|
||||||
- [ ] Data model and mock service implemented outside UI components.
|
- [x] Data model and mock service implemented outside UI components.
|
||||||
- [ ] `/hermes` mission control route renders from the service layer.
|
- [x] `/hermes` mission control route renders from the service layer.
|
||||||
- [ ] `/hermes/tasks` ledger has search, filters, sorting, pagination, expandable details, and JSON export.
|
- [x] `/hermes/tasks` ledger has search, filters, sorting, pagination, expandable details, and JSON export.
|
||||||
- [ ] `/hermes/tasks/[id]` detail route shows summary, timeline, execution details, and learning sections.
|
- [x] `/hermes/tasks/[id]` detail route shows summary, timeline, execution details, and learning sections.
|
||||||
- [ ] `/hermes/products` portfolio route includes priority, attention, no-recent-activity, repeated-failure, and recently-shipped views.
|
- [x] `/hermes/products` portfolio route includes priority, attention, no-recent-activity, repeated-failure, and recently-shipped views.
|
||||||
- [ ] `/hermes/history` route includes historical analytics with charts or accessible visual bars.
|
- [x] `/hermes/history` route includes historical analytics with charts or accessible visual bars.
|
||||||
- [ ] `/hermes/agents` route shows agent/tool/integration health.
|
- [x] `/hermes/agents` route shows agent/tool/integration health.
|
||||||
- [ ] `/hermes/settings` route shows editable-looking configuration panels and import/export affordances backed by mock data.
|
- [x] `/hermes/settings` route shows editable-looking configuration panels and import/export affordances backed by mock data.
|
||||||
- [ ] Documentation created or updated with routes, run commands, mock data locations, and real telemetry integration plan.
|
- [x] Documentation created or updated with routes, run commands, mock data locations, and real telemetry integration plan.
|
||||||
- [ ] Lint passes or any pre-existing lint failures are explicitly identified.
|
- [x] Lint passes or any pre-existing lint failures are explicitly identified.
|
||||||
- [ ] Typecheck passes.
|
- [x] Typecheck passes.
|
||||||
- [ ] Unit/component tests pass.
|
- [x] Unit/component tests pass.
|
||||||
- [ ] Production build passes.
|
- [x] Production build passes.
|
||||||
- [ ] E2E or browser smoke verification covers all new routes with no console errors.
|
- [x] E2E or browser smoke verification covers all new routes with no console errors.
|
||||||
- [ ] Responsive layout checked at desktop and mobile widths.
|
- [ ] Responsive layout checked at desktop and mobile widths.
|
||||||
|
|
||||||
Known roadmap assumptions to handle safely during implementation:
|
Known roadmap assumptions to handle safely during implementation:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user