Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add obto-inc/platform --skill obto-build-loopgit clone --depth 1 https://github.com/obto-inc/platformWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/obto-inc/platform/obto-build-loop)<a href="https://agentmods.dev/skills/obto-inc/platform/obto-build-loop"><img src="https://agentmods.dev/badge/skills/obto-inc/platform/obto-build-loop/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/obto-inc/platform/obto-build-loop"><img src="https://agentmods.dev/badge/skills/obto-inc/platform/obto-build-loop.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00091 | $0.03482 |
| Opus 5.5 | $0.00036 | $0.01393 |
| Sonnet 5.5 | $0.00018 | $0.00696 |
| Haiku 4.5 | $0.00009 | $0.00348 |
Grade A, and why
obto-build-loop scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
- `fetch(id)` — read a WHOLE artifact. Right for small/medium files; avoid on large modules — it can flood your context. How it starts
The opening of the file, as written. The whole thing — 87 lines — stays where its author put it; the contents beside it link to each section on GitHub.
OBTO App Build Loop
Before anything else
- Call
obto_whoamifirst in every new conversation and follow itsstartHere.rules. ReaddomainandavailableResources. - The server is stateless: pass
appNameANDdomainon every app-scoped call. Never assume a "current app" — if the user hasn't named one, ask, or find it withobto_list_all_apps/obto_find_app_by_name. - Read
obto://guide/quickstartfrom the server's resources before the first deployment. The server-served guides are the source of truth — prefer them over assumptions. Scan theavailableResourcesdirectory whoami returns and load the ones whosewhenToReadfits the task — e.g.obto://guide/blueprintsbefore writing code for a collection type, andobto://guide/public-app-baselinebefore claiming an app is done.
Organize first. One thread = one item; its train id is the work item id (e.g. WT-28) or the team's train number. Title the thread <train id> <emoji> <short name>: ⚪ queued, 🟡 in progress, 🟠 blocked (name the blocker), 🟢 done. Retitle when the state changes; with no rename tool, ask the person once. Finish or hand off the item, mark it 🟢, then take the next, one at a time. New work found mid-thread is its own item (sdlc_create_item), not a detour.
The build loop
Work in this order; do not skip steps:
- Contract first. Write the build contract: (1) what the app does, (2) the FIRST vertical slice, (3) what "done" means for it. Show it as a numbered plan and get the client's yes before any save, scaffold included; never invent scope.
obto_scaffold_apprequires it asbuildContract. - Scaffold. Use
obto_scaffold_appfor new apps (creates record + working skeleton in one call), passingbuildContractandkind:'public'for a browser web app (index page + App.tsx + App.css, ESM imports + relative./paths) or'native'for an OBTO shell component (ui_template + policy_client + script_client, window-global libs +return ComponentName;). The skeleton passesobto_validate_appimmediately and writes each artifact to its correct collection. The response includes structurednextSteps— follow them in order. - One vertical slice. Ship a single end-to-end path (one page, one route, one script) and verify it works before expanding. Anything beyond the contract's slice is a NEW slice only after a yes — not a silent addition.
- Verify after every write. After each
obto_upsert_record/ route change, read the artifact back (fetchby id<collection>::<app>::<domain>::<name>, orobto_grep_artifactfor a slice of a large one) and confirm the content landed. Never claim a write succeeded without reading it back. For a code-bearing script,obto_validate_scriptalso runs by reference — omitscriptand name the stored artifact — so you can validate exactly what the platform stored, not what you meant to send. - Review, test, gate — after every save. This is the same loop as
obto://guide/quickstartRule 5.- Review what you saved:
obto_review_changewithtargets= every record you changed in this step. Fix every error finding, save, and review those records again. Repeat until there are no errors. Fix warnings, or suppress one with a comment// obto-review-ignore <rule> -- <reason>on or above the line (warn/info only; an error can never be suppressed). - Test. If
obto_run_testsis in your tool list, run every plan and add a test for new behaviour (obto_save_test). Otherwise say "tests not run" (obto_test_resultsshows earlier runs). Never call untested verified. - Gate.
obto_review_changemodegatemust returngateOk: truebefore you say done or ask to go live.obto_validate_appshows the same verdict indoneGate. Going live (obto_build_app) needs the client's yes to that, and it refuses a failing gate (done_gate_failed). - Never rename or split a record to dodge a finding, suppress an error, or ask for a gate override.
gateOverrideis an operator tool with an audited reason, not part of the loop.
- Review what you saved:
- Smoke gate before "done" — verify semantically, on the surface a real visitor uses. A preview URL proves only that the preview infra responded, and HTTP 200 proves nothing at all: OBTO's own "Site Missing" / "domain was not found" shells are served with status 200, so a status-only check certifies broken apps as working. "Done" means all of:
- The done gate passes:
obto_review_changemodegatereturnsgateOk: true(step 5). obto_validate_appreturns no errors.- Every public API route called via
obto_invoke_routereturns the expected status, content type, and JSON shape. An HTML 200 on an/api/...route is a failure, never a response; so is a non-200, a 524/timeout, or a degraded-mode UI fallback. - The receipt says WHICH surface answered.
connectVia:'canonical'means the real canonical host served it; atenant_ingress_semantic_fallback(withcanonicalAttempt+layerVerdict) means the canonical host served a platform shell and the tool fell back — that is a finding to report, not a pass. Fallback success is not canonical success. - For a published app,
obto_get_build_statusshowspublish.status: 'published'with its per-surfaceverifyevidence, and you have READ anycaveats(a publish can be genuinely published and still carry a known platform degradation). pltf_log(viaobto_db_query) shows no runtime errors.obto_capture_previeweach page; readvisibleText(sign-in or loading = not seen) and checkconsole/pageErrors/failedRequests.- Best proof: one real user action end to end, read back through the app's API — with test data the client agreed to (preview data is real), then remove it.
- Report the evidence: the gate verdict, the review ids or "no errors" per record, test run ids (or "tests not run"), and the smoke results above.
- The done gate passes:
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today Changed 612145324eb1
- 17d ago Changed 4d164de6f33e
- 22d ago Changed · +7 lines · +8 tokens per session b5a665f9a9fb
- 2mo ago Changed · +9 lines 3cc76a98689b
- 2mo ago First seen · 71 lines · 83 tokens per session scan A 3b1a76f3889b
obto-build-loop is a skill published in the GitHub repository obto-inc/platform (1 stars, last pushed today), licensed Apache-2.0. It adds 91 tokens to every session and 3,482 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
obto-build-loop compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| obto-build-loopobto-inc/platform | Skill | 1 | today | Apache-2.0 | A | 91 | Claude Code, Codex |
| canvas-designAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 59 | Claude Code, Codex |
| playwriterAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 99 | Claude Code |
| develop-featureAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 50 | Claude Code |
| author-templatesAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 40 | Claude Code |
| initialize-workspaceAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 44 | Claude Code |
| review-changesAgiFlow/aicode-toolkit | Skill | 160 | 2d ago | AGPL-3.0 | A | 37 | Claude Code |