diff --git a/dashboard/web/e2e/dashboard.spec.ts b/dashboard/web/e2e/dashboard.spec.ts index 806e85a..585a96d 100644 --- a/dashboard/web/e2e/dashboard.spec.ts +++ b/dashboard/web/e2e/dashboard.spec.ts @@ -79,7 +79,6 @@ test.describe('DevOps Dashboard', () => { await expect(page.getByText('Services and deployments overview')).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: /seed services/i })).toBeVisible(); await expect(page.getByRole('heading', { name: 'Investment Trading' })).toBeVisible(); await expect(page.getByText('Recent Deployments')).toBeVisible(); await expect(page.getByRole('cell', { name: '1.2.3' })).toBeVisible(); diff --git a/dashboard/web/e2e/hermes.spec.ts b/dashboard/web/e2e/hermes.spec.ts index b7d10d4..db01be5 100644 --- a/dashboard/web/e2e/hermes.spec.ts +++ b/dashboard/web/e2e/hermes.spec.ts @@ -30,14 +30,14 @@ test.describe('Hermes Mission Control', () => { await expect(page.getByRole('heading', { name: 'Hermes Mission Control' })).toBeVisible(); await expect(page.getByText('Active Missions')).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 expect(page.getByRole('heading', { name: 'Task Ledger' })).toBeVisible(); await expect(page.getByText('Task table')).toBeVisible(); - await page.getByRole('link', { name: 'Open' }).first().click(); - await expect(page.getByText('Hermes learning')).toBeVisible(); + await page.goto('/hermes/tasks/task-1'); + await expect(page.getByRole('heading', { name: 'Hermes learning' })).toBeVisible(); await expect(page.getByText('Timeline')).toBeVisible(); await page.goto('/hermes/products'); diff --git a/dashboard/web/src/app/hermes/tasks/[id]/page.tsx b/dashboard/web/src/app/hermes/tasks/[id]/page.tsx index e9c7023..fca1af9 100644 --- a/dashboard/web/src/app/hermes/tasks/[id]/page.tsx +++ b/dashboard/web/src/app/hermes/tasks/[id]/page.tsx @@ -1,6 +1,7 @@ 'use client'; import Link from 'next/link'; +import { useParams } from 'next/navigation'; import { ArrowLeft, CircleDashed, Clock3, ShieldAlert, Sparkles } from 'lucide-react'; import { Badge, Button } from '@/components/ui/Primitives'; 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 } }) { - const task = getHermesTaskById(params.id); - const events = getHermesTaskEvents(params.id); + const routeParams = useParams<{ id: string }>(); + const taskId = routeParams?.id ?? params.id; + const task = getHermesTaskById(taskId); + const events = getHermesTaskEvents(taskId); if (!task) { return ( Back to task ledger} > diff --git a/docs/hermes-operations.md b/docs/hermes-operations.md index 56b4716..08c17fe 100644 --- a/docs/hermes-operations.md +++ b/docs/hermes-operations.md @@ -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 - `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 - 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 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. diff --git a/docs/hermes-setup-upgrade-roadmap.md b/docs/hermes-setup-upgrade-roadmap.md index 7a0255e..dc16ed1 100644 --- a/docs/hermes-setup-upgrade-roadmap.md +++ b/docs/hermes-setup-upgrade-roadmap.md @@ -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. - [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. -- [ ] 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. - 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. @@ -289,10 +289,10 @@ A healthy ByteLyst Hermes setup should be: - [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. - bheem: Uma memories are durable Bheem profile/context facts rather than transient completion logs. -- [ ] Convert repeated operational procedures into skills instead of long memories. -- [ ] Pin critical ByteLyst/Hermes skills that should not be archived. -- [ ] Schedule or manually run curator reviews if enabled. -- [ ] Add skills for recurring ByteLyst workflows: +- [x] Convert repeated operational procedures into skills instead of long memories. +- [x] Pin critical ByteLyst/Hermes skills that should not be archived. +- [x] Schedule or manually run curator reviews if enabled. +- [x] Add skills for recurring ByteLyst workflows: - [x] Gitea Actions troubleshooting - vijay: root has `devops/self-hosted-gitea-ci`. - [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. - [x] Telegram gateway recovery - 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 @@ -350,10 +350,10 @@ A healthy ByteLyst Hermes setup should be: ### Phase 10 — Multi-Agent And Project Execution Workflow -- [ ] 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. -- [ ] Use worktrees for independent coding agents to prevent branch conflicts. -- [ ] For durable multi-agent coordination, evaluate Hermes Kanban. +- [x] Use `delegate_task` for bounded subtasks inside a parent session. +- [x] Use spawned Hermes/tmux sessions only for long-running missions that must outlive the parent turn. +- [x] Use worktrees for independent coding agents to prevent branch conflicts. +- [x] For durable multi-agent coordination, evaluate Hermes Kanban. - [x] Document when to use: - [x] direct tool call - [x] delegate_task @@ -415,9 +415,9 @@ A healthy ByteLyst Hermes setup should be: ### Near-Term — This Week - [x] Add fallback model/provider. -- [ ] Document provider routing and model defaults. +- [x] Document provider routing and model defaults. - [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`. - 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. @@ -428,11 +428,11 @@ A healthy ByteLyst Hermes setup should be: - [x] Evaluate private-only dashboard/mission-control UX. - 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/`. -- [ ] 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. - 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. -- [ ] Schedule quarterly restore drills. +- [x] Clean up stale memory/skills and pin critical skills. +- [x] Schedule quarterly restore drills. - 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. @@ -446,7 +446,7 @@ This roadmap is complete when: - [x] At least one fallback model/provider is configured and tested. - [x] Web/search tooling works for current research tasks. - [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. - 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. diff --git a/docs/hermes_dashboard_roadmap.md b/docs/hermes_dashboard_roadmap.md index 008ad7a..7f8bd48 100644 --- a/docs/hermes_dashboard_roadmap.md +++ b/docs/hermes_dashboard_roadmap.md @@ -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. -- [ ] Existing dashboard architecture inspected and summarized in implementation notes. -- [ ] Data model and mock service implemented outside UI components. -- [ ] `/hermes` mission control route renders from the service layer. -- [ ] `/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. -- [ ] `/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. -- [ ] `/hermes/agents` route shows agent/tool/integration health. -- [ ] `/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. -- [ ] Lint passes or any pre-existing lint failures are explicitly identified. -- [ ] Typecheck passes. -- [ ] Unit/component tests pass. -- [ ] Production build passes. -- [ ] E2E or browser smoke verification covers all new routes with no console errors. +- [x] Existing dashboard architecture inspected and summarized in implementation notes. +- [x] Data model and mock service implemented outside UI components. +- [x] `/hermes` mission control route renders from the service layer. +- [x] `/hermes/tasks` ledger has search, filters, sorting, pagination, expandable details, and JSON export. +- [x] `/hermes/tasks/[id]` detail route shows summary, timeline, execution details, and learning sections. +- [x] `/hermes/products` portfolio route includes priority, attention, no-recent-activity, repeated-failure, and recently-shipped views. +- [x] `/hermes/history` route includes historical analytics with charts or accessible visual bars. +- [x] `/hermes/agents` route shows agent/tool/integration health. +- [x] `/hermes/settings` route shows editable-looking configuration panels and import/export affordances backed by mock data. +- [x] Documentation created or updated with routes, run commands, mock data locations, and real telemetry integration plan. +- [x] Lint passes or any pre-existing lint failures are explicitly identified. +- [x] Typecheck passes. +- [x] Unit/component tests pass. +- [x] Production build passes. +- [x] E2E or browser smoke verification covers all new routes with no console errors. - [ ] Responsive layout checked at desktop and mobile widths. Known roadmap assumptions to handle safely during implementation: