Design: obot.agent as a thin overlay on the gsm.agent harness

Requirement jwildfire/obot.roadmap#17 · 2026-07-11 · Decisions resolved 2026-07-11 — D2–D4 approved; D1 deferred
Based on a full read-through audit of every obot.agent artifact against the gsm.agent harness (2026-07-11).

1. Context and goals

#17 exists because the program maintained two full agent harnesses: gsm.agent (upstream, owns the ecosystem conventions) and safety.agent (predates the July 2026 consolidation, restating much of the same ground). Direction from @jwildfire (2026-07-04): leverage gsm.agent as much as possible; the project repo serves only as additional instructions.

This design extends the original scope with the obot.agent conversion (approved 2026-07-11): the repo renamed from safety.agent to obot.agent and widens from a safety-graphics overlay to the obot program's agent layer — absorbing the session skills that currently live in the hub and the agent-identity infrastructure it already carries. Success criteria (unchanged from #17, plus the conversion):

2. Executed groundwork (2026-07-11) done

3. Audit findings — the classification inventory

The audit read every artifact (all AGENTS.md sections, all 9 skills, all docs including the 9 requirement matrices, all templates, config, scripts, interview logs) against gsm.agent. Headline: bucket (a) — pure duplication — is nearly empty. obot.agent's 71-line AGENTS.md is already overlay-shaped; it does not restate the draft/attribution/approval/ worktree conventions. The real work is upstreaming two generic patterns (§6), fixing stale references (PR #11), and settling four decisions (§7). gsm.agent is an R/RBQM harness (testthat, devtools::check()); obot.agent is a JS renderer overlay (Vitest/Playwright/Chart.js) — most content is domain-specific by construction.

Bucket (b) — generic, propose upstream

ArtifactRationale
skills/stakeholder-interview + docs/interview-framework.md + templates/interview-log.md + templates/interview-question.md Generic stakeholder Q→decision→durable-artifact workflow; only the Telegram flavor is obot-specific
Split-phase test-driver pattern (underlying p004-test-driver / p004-test-setup / p004-write-tests) Setup→write split, bounded sub-agent, test-driver: evidence commits — stack-neutral; obot keeps the P004/Vitest instantiation

Upstreaming answers gsm.agent's open "shared scaffolding location" roadmap question in practice: obot becomes the first external consumer of gsm.agent as base-harness-plus-overlay.

Bucket (c) — obot-specific, keep (the overlay proper)

CategoryArtifacts
Contract & policyAGENTS.md (mission, GxP non-negotiables, per-renderer artifacts, JS testing expectations, safety.viz branching model, migration sequence) — rewritten around an explicit overlay contract (§4)
Skillschartjs-migration, renderer-modernization, requirements-harvesting, gxp-test-framework, obot-identity, P004 test-driver trio (as thin instances over the upstreamed pattern)
Docsgsm-viz-reference, gxp-framework, test-framework, requirements-harvesting, the 9 requirement matrices + review doc (the highest-value asset), p004-test-driver-trial, skills-library-spike
Templates & infrarequirements-matrix, p004-test-driver-prompt, scripts/ (obot-app-token, harvest), interviews/ logs

Stale / superseded (beyond PR #11's scope)

ArtifactFinding
docs/test-agent-github-app.md + config/github-app/* Proposes creating an obot-test-agent app — superseded by the live obotclaw app (#3 design). Candidate for deletion, not link-fixing → D4
interviews/p004-open-questions.md dead obot-claw links Historical record — leave as-is (see §8)
docs/test-framework.md "OpenClaw" browser-QA reference obot-claw-era tooling name; replace with current browser-QA tooling during the overlay rewrite

4. Target overlay layout

obot.agent converges to: mission + GxP stance + gsm.viz/JS reference + renderer requirement matrices + renderer/test skills + obot identity/token infra + session skills. Everything cross-cutting (drafts, attribution, approval gates, worktrees, generic TDD, interview workflow, generic test-driver) is sourced from gsm.agent.

The new AGENTS.md opens with the overlay contract — "gsm.agent conventions apply; this repo adds the obot layer" — mirroring how the workspace CLAUDE.md already imports the gsm.agent clone's AGENTS.md. The safety.viz branching model stays but is explicitly scoped to safety.viz (not stated as an ecosystem default, which would contradict gsm.agent's "don't assume dev/main"). A new short terminology doc defines session / spawned agent / subagent — groundwork consumed by #18 (autonomous operations). The shared keynote stylesheet lands here once extracted — it is being produced by the safety.viz v1.0-push website-cleanup workstream, not rebuilt in this requirement.

5. Skills topology across the workspace

Where each skill family lives after the move (@jwildfire's calls, 2026-07-11):

Skill familyTodayTarget
Session lifecycle (session-init/-note/-todo/-update/-wrapup) obot.roadmap/.github/skills/ obot.agent — agent capabilities live in the harness overlay
Requirement lifecycle (requirement-drafting/-design/-tasks) obot-claw.github.io clone (archived repo — symlinks into a dead home) obot.roadmap — they operate on hub files, so they live beside the lifecycle they manage
Ecosystem conventions (tdd, issue-review, sub-issue-linking) gsm.agent clone (.github/) unchanged — upstream
Renderer/identity (chartjs-migration, obot-identity, P004 trio, …) obot.agent unchanged — overlay

The workspace .claude/skills/ symlinks are repointed in the same change; net effect is that no symlink resolves into an archived clone. Hub = content and its lifecycle; obot.agent = how the agent works; gsm.agent = ecosystem conventions.

6. Upstream contributions to gsm.agent

Two PRs to Gilead-BioStats/gsm.agent: (1) the stakeholder-interview workflow (skill + framework doc + two templates, de-Telegrammed); (2) a generic test-driver skill capturing the split-phase pattern. Mechanics: the Gilead gh API is SAML-blocked, so branches go up over SSH and @jwildfire opens the PRs from compare URLs. Fallback if upstream declines: obot.agent carries the generic pieces unchanged until accepted — no blocking dependency.

7. Decisions (pending)

D1 — TDD gate for JS work. gsm.agent's tdd skill hard-codes the Green gate as devtools::check() clean with R test naming; obot's P004 skills define a parallel JS discipline (Vitest/Playwright, requirement-ID test names). Both currently claim to be the test-first workflow. Recommendation: the overlay declares the JS instantiation as the project-level specialization of the upstream tdd skill (pointer + divergence table), and we propose upstream that tdd grow a stack-neutral core. No fork of the convention.

Resolved 2026-07-11: Deferred — leave both disciplines as-is until gsm.agent's Q3 skills-library work lands; revisit then.

D2 — Commit attribution mechanics. gsm.agent attributes via a Co-Authored-By trailer with @jwildfire as reviewer/merger; obot-identity makes obotclaw[bot] the git author. Recommendation: obot-identity supersedes the trailer for authorship (bot is the author), and commits keep the agent Co-Authored-By trailer so both the identity and the drafting model remain visible. Document this as an explicit overlay divergence.

Resolved 2026-07-11: Approved as recommended — bot author + Co-Authored-By trailer.

D3 — Skill frontmatter conformance. gsm.agent skills carry YAML frontmatter (name/description) that harnesses key on to auto-load; six obot skills are plain markdown without it. Recommendation: normalize all obot.agent (and moved hub) skills to the upstream SKILL.md frontmatter contract during the restructure.

Resolved 2026-07-11: Approved — normalize all.

D4 — Delete the superseded test-agent app proposal. docs/test-agent-github-app.md + config/github-app/* propose an app the live obotclaw app replaced. Recommendation: delete both (git history preserves them) rather than carry-and-fix. Deletion requires explicit @jwildfire approval per the operating contract — hence a decision, not a task.

Resolved 2026-07-11: Deletion approved by @jwildfire.

8. Out of scope

9. Task preview

To be decomposed via requirement-tasks into cross-repo sub-issues after design sign-off.

#TaskRepoDepends on
T1Move session skills into obot.agent; move requirement skills into obot.roadmap; repoint workspace symlinksobot.agent, obot.roadmap, workspacedesign sign-off
T2Rewrite AGENTS.md as the overlay contract; add terminology doc; fix "OpenClaw" referenceobot.agentD2 resolved; D1 deferred — document the JS discipline as-is
T3Normalize skill frontmatter across obot.agent + moved skillsobot.agent, obot.roadmapD3 approved; T1
T4Upstream PRs: interview workflow, generic test-drivergsm.agentdesign sign-off
T5Land the shared keynote stylesheetobot.agentsafety.viz v1.0-push website PR
T6Delete superseded test-agent app doc + configobot.agentD4 approved 2026-07-11