---
title: OpsMan / LFCS / Agent Stack — project context
created: 2026-05-01
updated: 2026-05-02
type: project-context
project: OpsMan / LFCS / Agent Stack
status: draft-awaiting-rocky-review
drafted-by: cowork (curator) 2026-05-02 21:45 AEST during HQ-design grill curation pass
related:
  - "[[Active]]"
  - "[[Projects]]"
  - "[[11_OpsMan_LFCS/_Brain/README]]"
  - "[[Agent-Stack-MOC]]"
---

# OpsMan / LFCS / Agent Stack

## What this is

Two related things share this folder:

1. **LFCS day job** — Rocky's role as PM/Super at LF Construction Services. Director: Liam. Includes office work (pricing bridges, RFIs, claims), on-site supervision, and the internal AI specialist role bringing AI tooling into LFCS.
2. **The agent stack** — Hermes, OpenClaw OpsMan, Rivet Voice running on the Sydney VPS. Supports both LFCS work and RateRight work; this is where its docs and logs live.

The two share the folder because both are operations-shaped (vs. RateRight's product-shape). Decision was kept loose to avoid premature splitting.

## Current state

- **Day job**: active. Hours ~5:30 AM – 6:00 PM weekdays. Currently in office pricing bridges. Field work alongside.
- **Agent stack hardening complete** (2026-05-01) — Hermes 0.11.0 → 0.12.0, fallback chain, watchdog, daily snapshots, config backups, append-only commit gate, vault-health probe at 21:05 UTC.
- **Hermes daily diary writes flow into `_AgentLog/hermes-daily/`** via VPS symlink + auto-sync every 30 min.
- **OpsMan vault wiring deferred** (G5) — different config schema than Hermes, needs separate session.
- **Rivet Voice** — VAPI + OpenAI Realtime + Twilio. Built, dormant, candidate for revival per the Hunt strategy.

## Hot right now

- VPS hardening is complete. Stable foundation.
- LFCS internal AI specialist work — bringing AI tooling into the company. Active project.
- OpsMan vault wiring (G5) — deferred, on the queue.

## Stack

- **VPS**: DigitalOcean Sydney, Ubuntu, runs Hermes (systemd), OpenClaw OpsMan (systemd), PM2 fleet for ancillary services.
- **Sync**: VPS `/home/ccuser/opsman-work/daily/` → HQ-Vault/11_OpsMan_LFCS/_AgentLog/hermes-daily/ via symlink. `scripts/auto-sync.sh` pushes every 30 min; Windows `scripts/local-auto-pull.ps1` pulls every 30 min.
- **LFCS office tooling**: spreadsheet-heavy, AutoCAD, Procore-adjacent. AI integration in progress.

## Key people

- **Rocky** — PM/Super, owner of the agent stack
- **Liam** — LFCS director, Rocky's day-job partner. Aware of RateRight at high level; not involved.

## How to be useful here

- LFCS work is the day job. It funds RateRight; don't propose anything that compromises Rocky's reliability there.
- Agent stack is hardened; don't propose rebuilds. Propose fixes, monitoring improvements, or specific feature adds.
- LFCS AI integration is active — proposals welcome but route through Rocky before any contact with Liam or the LFCS team.
- OpsMan vault wiring is parked but real work; if asked about it, point to the deferred G5 thread.

## Airtable schema cheatsheet — LFCS-Operations base

Adopted 2026-05-04. Base ID: `appE43UvTyARe5oJs` (UI may still show "LFCS-Drawings" until renamed in UI — base ID is permanent). `cowork-lfcs`, `claude-code-coo`, AND **Hermes (VPS)** all have MCP access wired into this base.

**Hermes + OpenClaw OpsMan Airtable MCP both wired 2026-05-05** (claude-code-coo via SSH). Hermes via:
```
hermes mcp add airtable \
    --command npx \
    --args=-y --args=airtable-mcp-server \
    --env=AIRTABLE_API_KEY=<pat>
```
- Stored in `/root/.hermes/config.yaml` on VPS (token at-rest there; not committed to vault git)
- 16 tools available: list/search/get/create/update/delete records, list bases/tables, describe table, create/update table + field, list/create comments, upload attachments
- PAT name on Airtable: `hermes-vps-rw-v1` (created 2026-05-05 by Rocky)
- Restart cycle: `systemctl restart hermes-gateway` reloads MCP. Verified live: `airtable-mcp-server` shows as child process of hermes-gateway PID

**OpenClaw OpsMan** wired via:
```
CLAWDBOT_STATE_DIR=/root/.clawdbot-opsman OPENCLAW_STATE_DIR=/root/.clawdbot-opsman \
    openclaw mcp set airtable \
    '{"command":"npx","args":["-y","airtable-mcp-server"],"env":{"AIRTABLE_API_KEY":"<pat>"}}'
```
- Stored in `/root/.clawdbot-opsman/openclaw.json` (token at-rest there; not committed to vault git)
- 16 tools available (same as Hermes — read/write records + schema + comments + attachments)
- Same PAT shared between Hermes + OpenClaw OpsMan (`hermes-vps-rw-v1`)
- Restart cycle: `systemctl restart clawdbot-opsman` reloads MCP. OpenClaw lazy-loads MCPs per-session — child process appears on first tool call (different to Hermes which spawns at gateway start)

**PAT scope warning (2026-05-05):** PAT was generated with broader scopes than needed. Currently includes `schema.bases:write` (Hermes can add/delete tables + fields — schema changes belong to claude-code-coo's lane only) + `webhook:manage` + `block:manage` + `user.email:read` + `data.recordComments:read`. Best-practice scope set is read+write records only (`data.records:read` + `data.records:write` + `schema.bases:read` + `workspacesAndBases:read`).
- **Action item:** rotate PAT within 30 days with trimmed scopes — SOP at `docs/sop/airtable-pat-rotation.md` (drafted 2026-05-06; awaiting Rocky's UI step to create `hermes-vps-rw-v2`)
- Original token leaked into a Claude conversation transcript on 2026-05-05 (pasted in chat instead of via SSH-only path) — rotation is double-justified
- **Schema-change lane discipline (codified 2026-05-06):** Hermes + OpenClaw OpsMan must NEVER call `create_table`, `create_field`, `update_field`, `update_table`, or `create_base` on the Airtable MCP. Schema changes belong to claude-code-coo's lane only. The current PAT permits these calls (`schema.bases:write` granted) but lane discipline overrides. Rule lives in `/root/.hermes/SOUL.md` Hard Rules section for Hermes; OpenClaw OpsMan picks it up by reading this file at boot per AI Team Protocol. Refuse the request and route to coo via vault note instead.

| Table | ID | Primary field |
|---|---|---|
| Jobs | `tblcL2EX2w34c1VPe` | Job Number |
| Drawings | `tblZPi452zZKvLliE` | Drawing Number |
| Drawing Elements | `tbl3wYZTpiuNxaRvH` | Element Name |
| Revisions | `tblC04YN5rtqlKvNK` | Revision Number |
| Specifications | `tblLyH61zVNI9I2Zu` | Spec Code |
| Suppliers | `tblPCBJeNz8XpDum0` | Supplier Name |
| Bids | `tblbDMfYrPHOE3wOX` | Bid ID |
| Bid Line Items | `tbllVlBA0X0pwoCdv` | Line ID |
| RFIs | `tbl6cWepHgiVMpt40` | RFI Number |
| Variations | `tblpyDAPubw1V9cNO` | VO Number |
| Rates | `tbl9fewvyRmL18UrA` | Activity |

**Vault is source of truth.** Airtable derives via `lfcs-airtable-sync` skill. Skills always: (1) write vault markdown, (2) commit, (3) call `lfcs-airtable-sync` as final step. Reads can hit Airtable directly for fast filtering.

**Bids ↔ Jobs link split:** Jobs has BOTH `Bids History` (auto-populated, all versions ever — auto-reverse from Bids.Job) AND `Active Bid` (manually-curated single live bid pointer). Use `Active Bid` for the current bid being worked.

**SingleSelect string consistency** — Element Type / Unit / Confidence are mirrored across Rates, Bid Line Items, and Drawing Elements. Use the EXACT existing Drawing Elements strings or joins break:

| Field | Choices |
|---|---|
| `Unit` | `m`, `m2`, `m3`, `no`, `kg`, `t`, `LS`, `hr`, `day` |
| `Element Type` | `Concrete`, `Reinforcement`, `Steel`, `Earthworks`, `Drainage`, `Pavement`, `Bridge`, `Formwork`, `Services`, `Misc` |
| `Confidence` | `High`, `Medium`, `Low`, `Needs review` (note lowercase "review") |

**Bid Line Items.Total ex GST** is currently a `currency` field — Airtable REST API rejects programmatic creation of formula fields. `lfcs-airtable-sync` computes `{Qty} * {Rate ex GST}` on upsert. Rocky may convert to formula in UI later (one click); skill writes to formula-converted fields silently fail and that's fine.

## Per-job context layer (Phase 6+)

When asked which job, ALWAYS load the per-job CLAUDE.md FIRST as the load-bearing context file:

- `Operations/Jobs/{Upcoming|Ongoing Jobs|Completed Jobs}/{job_folder}/CLAUDE.md`

This file contains: Job snapshot (Job Number / Client / Site / Status / Bid Due / Active Bid Airtable record id / Job Airtable record id / Vault path), Scope (1-line), folder map table, live-registers-go-to-source rule, Airtable pointers (per-table query hints with this Job's record ID), Skill routing table for this job, **Patterns wikilinks** to applicable cross-cutting concept notes (Phase 7+), Job-specific notes/risks/open items, Common Rocky-queries quick handlers, Source files in vault.

Existing per-job CLAUDE.md instances (canonical examples):
- `Operations/Jobs/Upcoming/2602 - Dec Projects - Munmorah Bridge/CLAUDE.md` — bridge FRP subcontract pattern
- `Operations/Jobs/Upcoming/2626 - Mack Civil - Stormwater Pit EXA01A-08/CLAUDE.md` — TfNSW dayworks pit FRP-install-only pattern

For new jobs, `lfcs-job-scaffold` v4+ generates the per-job CLAUDE.md automatically based on `job_type` input. The Patterns section auto-wikilinks to applicable concept notes (see `concepts/` folder index below).

## Cross-cutting concepts (Phase 7+)

`Operations/lfcs-standards/concepts/` houses pattern docs that aggregate lessons from multiple jobs into one reusable reference. Wikilinked from per-job CLAUDE.md Patterns section. Current concept notes:

- `TfNSW-R0220-pit-pattern.md` — TfNSW dayworks pit jobs (FRP-install-only default + R0220 standard drawings + R11/R53 spec compliance + supply boundary table). Canonical example: 2626.
- `TfNSW-bridge-FRP-subcontract-pattern.md` — TCE supply convention + props/cranage EXCLUDED defaults + AS5100 (2017) governance + IFI→IFC drift handling. Canonical example: 2602.
- `Defensible-for-variations-posture.md` — pricing strategy (Rate Card V1.7 hourly basis vs internal cost basis). Decision tree + worked examples from 2602/2626/Hornsby. Cross-cutting (applies to all jobs).

Read the concepts/ folder INDEX (filenames) at boot; read full concept notes only when applicable to current task. Add new concept notes via the `lfcs-job-scaffold` v4+ Patterns lookup table when a new pattern is encountered.

## Pre-summarised specs (Phase 7+)

`Operations/lfcs-standards/specs/` houses MD summaries of spec PDFs generated by `lfcs-spec-summarise` skill. Lets downstream skills query the spec via MD instead of re-reading the multi-page PDF every time. Saves tokens on every skill run that touches a spec-governed item.

Current spec summaries:
- `TfNSW-R11-Ed5Rev8-PeakhurstOct2024-summary.md` — Stormwater Drainage spec (3 Hold Points + 3 Witness Points + 5 Identified Records + Application to LFCS scope). Status: starter-summary-pending-full-extraction (manual demonstration; full skill-driven extraction against the actual PDF pending).

Read the specs/ folder INDEX at boot; read full summaries only when relevant to current task. Add new spec summaries via `lfcs-spec-summarise` (auto-invoked by `lfcs-project-init` step 3.5 for any spec PDFs found in a job's 03a folder).

## Hard rules

- Never propose changes that risk Rocky's LFCS standing. He needs the day job.
- Never share LFCS-internal details (clients, pricing, project names) outside Rocky's vault without explicit approval — Liam has not consented to sharing.
- Never re-enable SMS in any system without Rocky's approval.
- Don't propose deletions of agent-stack code without flagging.
- **Never delete records from Airtable.** Mark `Status = Superseded` instead. Mirrors vault `_Archive/` rule.

Log decisions to [[_Log]].
