Building and cubbying a RAPPlication
Repo: your private egg hub (<owner>/<egg-hub-repo> — the author calls his the
"batcave"). Reference implementation to copy the shape from: a
rapplications/<slug>/ directory in that repo.
The two manifests
There are two different manifests and confusing them wastes a cycle.
| File | Schema | Where |
|---|---|---|
manifest.json in the rapplication dir |
rapp-application/1.0 |
repo |
<slug>.json sidecar |
rapp-egg-hub-entry/1.0 |
repo |
manifest.json inside the egg |
brainstem-egg/2.1 |
zip root |
Egg layout is repo/<file>… plus a root manifest.json. Nothing else.
Generate the manifests from the bytes, never by hand
build_egg.py should pack, then compute sha256 and size_bytes from the file
it just wrote and rewrite both manifests. Hand-maintained digests drift and the
hatch then fails its own verification for no reason.
Refuse to pack if a declared engine file is missing — a silently incomplete egg hatches and then fails at runtime, which is much harder to diagnose.
Local-first is a hard boundary
The egg carries the engine only. The user's use cases, information and
outputs live on device (~/.rapp/<slug>/…) and never enter the repo or the egg.
State that in soul.md and enforce it in the packer's file list.
The hatch is the proof, and it must be hostile to itself
hatch.sh must:
git clone --depth 1the batcave fresh from GitHub into a path that did not exist when the script started- Verify the egg's sha256 against the published
manifest.jsonand exit non-zero on mismatch - Unpack, start the server, and drive every endpoint in the contract
- Reuse nothing from the build tree
A pass that touches the build tree is not a pass. Prove the clean path by refusing to run into an existing directory.
Drive at least two probes with opposite expectations — one input that should succeed and one that should be refused. A hatch that only shows the happy path proves half of what you need.
Build it by fan-out with blind critics
Freeze a CONTRACT.md first — file ownership, the exact API surface, the data,
the laws. Then one agent per component, each with a separate harsh critic who
blind-compares against the real artifact. The orchestrator lays the foundation;
parallel agents that start before the contract is frozen produce pieces that
don't fit together.
Findings this actually caught, all of which the builders missed:
- A record citing a source that did not exist had its figure printed and was stamped "lodgeable" — the check tested that a source id was non-empty, never that it resolved
- An untraceable number escaped through a free-text field, printing the figure on the line that claimed to withhold it
- Two components each invented their own "validated dataset" and disagreed on every figure; one file's parts summed to $3.86B beside its own $4.82B total
- An engine that looked brilliant because its author had written the answers into his own test fixture as bullet points
That last one is the lesson: never accept a sample the builder authored as evidence the builder works. Supply the real input yourself.
One dataset module, proving itself at import
Put the canonical data in one module with a verify() that asserts the
arithmetic closes, and call it at import time. Two components can then never
disagree, because breaking a figure fails everything loudly and immediately.
Ship deliberately defective records if the product's whole claim is about handling them — one unsourced, one citing a source that is not held — so the law is visible on every run without needing a test.
Prefer refusal to a confident guess
If a deterministic path genuinely cannot do the job, make it refuse and say what it needs, naming what it saw. An honest floor beats a mad-lib. A good refusal names the actor, the source of truth, the nouns it found, and asks for one line per action.
Related
/cs-agent-live, /tab-film for the cloud half and the film.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as rapplication_egg_agent.py and embedded as the fenced Python below (sha256 805ce138cad3a5cf…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to rapplication_egg_agent.py first:
python3 rapplication_egg_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 rapplication_egg_agent.py # or on stdin
python3 rapplication_egg_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""RapplicationEgg -- Build a RAPPlication twin, pack it as a .egg, cubby it in a private egg hub (the batcave), and hatch it back on a clean path to prove it works. Use when asked to make something repeatable, "hatch it as a twin", cubby something, or ship a local-first app that takes a use case and produces a prototype.
Generated by the rapp skill from rapplication-egg. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = '# Building and cubbying a RAPPlication\n\nRepo: your private egg hub (`<owner>/<egg-hub-repo>` — the author calls his the\n"batcave"). Reference implementation to copy the shape from: a\n`rapplications/<slug>/` directory in that repo.\n\n## The two manifests\n\nThere are **two different manifests** and confusing them wastes a cycle.\n\n| File | Schema | Where |\n|---|---|---|\n| `manifest.json` in the rapplication dir | `rapp-application/1.0` | repo |\n| `<slug>.json` sidecar | `rapp-egg-hub-entry/1.0` | repo |\n| `manifest.json` **inside** the egg | `brainstem-egg/2.1` | zip root |\n\nEgg layout is `repo/<file>…` plus a root `manifest.json`. Nothing else.\n\n## Generate the manifests from the bytes, never by hand\n\n`build_egg.py` should pack, then compute `sha256` and `size_bytes` from the file\nit just wrote and rewrite both manifests. Hand-maintained digests drift and the\nhatch then fails its own verification for no reason.\n\nRefuse to pack if a declared engine file is missing — a silently incomplete egg\nhatches and then fails at runtime, which is much harder to diagnose.\n\n## Local-first is a hard boundary\n\nThe egg carries **the engine only**. The user's use cases, information and\noutputs live on device (`~/.rapp/<slug>/…`) and never enter the repo or the egg.\nState that in `soul.md` and enforce it in the packer's file list.\n\n## The hatch is the proof, and it must be hostile to itself\n\n`hatch.sh` must:\n\n1. `git clone --depth 1` the batcave **fresh from GitHub** into a path that did\n not exist when the script started\n2. Verify the egg's sha256 against the published `manifest.json` and **exit\n non-zero on mismatch**\n3. Unpack, start the server, and drive every endpoint in the contract\n4. Reuse **nothing** from the build tree\n\nA pass that touches the build tree is not a pass. Prove the clean path by\nrefusing to run into an existing directory.\n\nDrive at least two probes with opposite expectations — one input that should\nsucceed and one that should be refused. A hatch that only shows the happy path\nproves half of what you need.\n\n## Build it by fan-out with blind critics\n\nFreeze a `CONTRACT.md` first — file ownership, the exact API surface, the data,\nthe laws. Then one agent per component, each with a **separate harsh critic** who\nblind-compares against the real artifact. The orchestrator lays the foundation;\nparallel agents that start before the contract is frozen produce pieces that\ndon't fit together.\n\nFindings this actually caught, all of which the builders missed:\n\n- A record citing a source that **did not exist** had its figure printed and was\n stamped "lodgeable" — the check tested that a source id was non-empty, never\n that it resolved\n- An untraceable number escaped through a free-text field, printing the figure\n on the line that claimed to withhold it\n- Two components each invented their own "validated dataset" and disagreed on\n every figure; one file's parts summed to $3.86B beside its own $4.82B total\n- An engine that looked brilliant because its author had written the answers into\n his own test fixture as bullet points\n\nThat last one is the lesson: **never accept a sample the builder authored as\nevidence the builder works.** Supply the real input yourself.\n\n## One dataset module, proving itself at import\n\nPut the canonical data in one module with a `verify()` that asserts the\narithmetic closes, and **call it at import time**. Two components can then never\ndisagree, because breaking a figure fails everything loudly and immediately.\n\nShip deliberately defective records if the product's whole claim is about\nhandling them — one unsourced, one citing a source that is not held — so the law\nis visible on every run without needing a test.\n\n## Prefer refusal to a confident guess\n\nIf a deterministic path genuinely cannot do the job, make it **refuse and say\nwhat it needs**, naming what it saw. An honest floor beats a mad-lib. A good\nrefusal names the actor, the source of truth, the nouns it found, and asks for\none line per action.\n\n## Related\n\n`/cs-agent-live`, `/tab-film` for the cloud half and the film.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class RapplicationEggAgent(BasicAgent):
def __init__(self):
self.name = 'RapplicationEgg'
self.metadata = {
"name": "RapplicationEgg",
"description": "Build a RAPPlication twin, pack it as a .egg, cubby it in a private egg hub (the batcave), and hatch it back on a clean path to prove it works. Use when asked to make something repeatable, \"hatch it as a twin\", cubby something, or ship a local-first app that takes a use case and produces a prototype.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 rapplication_egg_agent.py
# python3 rapplication_egg_agent.py '{"arg": "value"}'
# python3 rapplication_egg_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(RapplicationEggAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(RapplicationEggAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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