V1b1 author
Walk an LLM through a 5-step decision flow to scaffold a new PyLabRobot device under Rick Wierenga's v1b1 patterns. Generates a structurally-conformant Python scaffold + a markdown decision record. Calls the v1b1-capability review skill at hand-off as pre-emit lint stage 3. Sibling skill to v1b1-capability — reuses its reference.md and vocabulary-lockdown.md by path; never duplicates.From its SKILL.md
npx -y skills add vcjdeboer/v1b1-skills --skill v1b1-authorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
16.4 KB, ~3.9k tokens by cl100k_base, as published. Nobody here has run it
User Input
$ARGUMENTS
Outline
The v1b1-author skill scaffolds a new PyLabRobot device under the v1b1 patterns set out by Rick Wierenga and demonstrated across the merged device backends contributed by the PLR community. It is authoring mode — the inverse of the v1b1-capability review skill. Where the review skill detects anti-patterns in finished code, the authoring skill makes pattern-conformant decisions BEFORE code exists, using the same pattern catalog as the source of truth.
Audience: any contributor using Claude Code in a PyLabRobot fork (upstream pylabrobot/main or pylabrobot/v1b1) who wants to add a new device. The skill is invoked via Claude — the LLM running the skill conducts the 5-step decision Q&A; the contributor answers in natural language.
Input: /v1b1-author <Vendor> <Device> [free-text intent] parsed from $ARGUMENTS.
Outputs: Two artifacts written into the contributor's working directory:
- A scaffold at
<repo>/pylabrobot/<vendor_lower>/<device_snake>.py(simple form) or<repo>/pylabrobot/<vendor_lower>/<device_snake>/(complex form). By construction the scaffold passes thev1b1-capabilityreview skill with 0 Findings. - A decision record at
<repo>/docs/v1b1-authoring/<vendor>-<device>-decisions.md. Five step sections each with a Decision, Principle, v1b1 precedent, Wrong-default-avoided callout, and Files-this-shapes list.
Warn, never block. Like the sibling review skill: the authoring skill never overwrites the contributor's working files without confirmation; on pre-emit lint failure it surfaces a self-error, never half-emits.
Activation
v1.0 ships explicit slash command only (auto-detect deferred to v1.1). Contributor types /v1b1-author <Vendor> <Device> [intent]. The skill runs the 5-step decision flow.
Execution Steps
1. Validate input + check sibling skill
- Parse
$ARGUMENTSinto<Vendor>,<Device>, and the remaining<intent_text>(free text). - Validate
<Vendor>and<Device>are valid Python identifiers, PascalCase preferred. If not, ERROR with: "Vendor and Device must be PascalCase Python identifiers (e.g.,LabcyteEcho)." - Verify the sibling skill is installed:
test -f ~/.claude/skills/v1b1-capability/reference.md \
&& test -f ~/.claude/skills/v1b1-capability/vocabulary-lockdown.md \
&& echo OK || echo MISSING
If MISSING, ERROR with: "v1b1-author requires the sibling skill v1b1-capability to be installed at ~/.claude/skills/v1b1-capability/. Install it first."
2. Detect existing scaffold + offer re-scaffold/augment/abort
- Compute the scaffold target path from
<Vendor>+<Device>(lowercased + snake_cased per FR-005). - Check if any of the following exist in the contributor's working directory:
pylabrobot/<vendor_lower>/<device_snake>.py(simple-form file)pylabrobot/<vendor_lower>/<device_snake>/(complex-form directory)docs/v1b1-authoring/<vendor>-<device>-decisions.md(decision record)
- If any exist, surface the existing decision record (if present), then prompt the contributor:
Existing scaffold detected at <path>. Choose:
(a) Re-scaffold (overwrite; existing protocol implementations LOST)
(b) Augment a specific Capability (preserve existing; add a new Backend)
(c) Abort
Default to (c) on no answer or anything other than a / b. Do NOT overwrite without explicit confirmation (FR-009).
3. Walk the 5-step decision flow (Q&A)
Read the shared pattern catalog and vocabulary lockdown:
# Read these at runtime — DO NOT cache; DO NOT copy:
cat ~/.claude/skills/v1b1-capability/reference.md # Principles P1–P6, Patterns P-01..P-27
cat ~/.claude/skills/v1b1-capability/vocabulary-lockdown.md # Excluded Terms list
The 5 steps run as Q&A in chat. Each step's branching tree is defined below. After each step, restate the chosen branch back to the contributor and confirm before proceeding.
Step 1 — Capability identification (Principle P3)
Ask the contributor to enumerate the operations the device performs. For each operation:
Is there an existing Capability ABC for this operation?
YES → kind = "existing_implementation"; capability_name = <existing ABC name>;
abstract_methods = <pulled from the ABC>
NO → Is there ALREADY a second device upstream that needs this same operation?
YES → kind = "extract_new_ABC"; capability_name = <new name>;
second_device_evidence = <required: file path + class name>
If contributor cannot name the second device, downgrade to:
kind = "device_specific_helper"
NO → kind = "device_specific_helper" (P-16; helper class; NO Backend ABC)
DEFAULT for novel operations: device_specific_helper. Bias is intentional — Principle P3: ABCs require two implementations. Over-extraction is the most common failure mode.
Existing Capability ABCs in the v1b1 catalog (read from reference.md Pattern Index for the current authoritative list): Shaker, TemperatureController, PIP, Absorbance, Fluorescence, Luminescence, LoadingTray, ArticulatedArm, BarcodeScanner, RackReader, PlateAccess, plus mixins HasJoints, CanFreedrive, HasContinuousShaking, CanGrip. Confirm against reference.md before answering — the catalog evolves.
Step 2 — File layout (Pattern P-12)
Estimate from step 1's outputs:
- 1 Driver + 1-2 Capability backends + 1 Device + 0 helpers + ≤500 estimated total lines
→ file_layout = "simple_single_file" (BioShake shape)
- Otherwise (multiple Capabilities, helpers present, command classes, or estimated >500 lines)
→ file_layout = "complex_multi_file" (Nimbus shape)
The 500-line threshold is the BioShake (440 lines) / Echo (2897 lines, too large) boundary. Encode as a hard branch; do not negotiate.
Step 3 — Driver shape (Patterns P-21, P-25, P-27)
Ask three sub-questions:
(a) Pick ONE transport form (P-21):
a1) send_command(cmd: str) — inline string commands (BioShake)
a2) send_command(command_object) — command-class organization (Nimbus)
a3) send_command(module=..., command=..., **fw_params) — module/command/kwargs (STAR)
a4) _call_sdk(func, *args, op="...") — SDK wrapper (xArm6)
a5) _rpc(method, params, ...) — RPC/SOAP (post-Echo extension)
Pick by what your vendor protocol looks like. NO 6th form is acceptable.
(b) Discovery in setup()? (Principle P5 / P-18)
YES → setup() runs introspection / firmware queries; backends conditionally constructed
in Driver.setup; chatterbox extends Driver (P-04 documented exception)
NO → setup() opens connection only; chatterbox extends the Capability Backend ABC
(P-04 standard form)
(c) Caller-supplied setup config? (P-22 / P-27)
YES → nested <Driver>.SetupParams(BackendParams) + isinstance-check + default substitution;
Driver.setup signature: async def setup(self, backend_params: Optional[BackendParams] = None)
NO → lighter form: async def setup(self) -> None
Constraint: chatterbox_form == "discovery_exception" REQUIRES discovery == true (P-04 exception only applies when discovery happens).
Step 4 — Backend shape (Principles P2, P6; Patterns P-20, P-25)
For each Capability identified in step 1 with kind == existing_implementation:
- Concrete Backend class: <Vendor><Device><Capability>Backend(<Capability>Backend)
- Stores driver: self.driver = driver (P-05 invariant)
- Per-operation method on Backend builds the wire payload (P-01 invariance — NEVER same-named on Driver)
- Workflow methods (multi-step trigger → poll → fetch) live on the Backend, NOT Capability frontend (P-20)
- _on_setup hook for capability-specific post-connection init (P-25)
CALL OUT EXPLICITLY (FR-013): "The wrong default for this step is workflow on the Capability frontend — putting trigger → poll → fetch orchestration in the Capability class instead of the Backend. Documented violation in PR #1009 (Micronic) Finding 2 and the Echo branch Finding 3 — both same contributor. We're avoiding that here."
Step 5 — Device wiring (Patterns P-07, P-13, P-23)
- Device.__init__: construct ONE driver
- For each Capability backend identified in step 1: construct Backend(driver) sharing the single driver (P-13)
- Assign as Device attribute (e.g., self.shaker = Shaker(backend=...))
- Append to self._capabilities
- Optional Resource integration (P-23):
Does the Device physically hold a resource (plate, tip rack)?
YES → resource_integration = true; multiple inheritance (Resource, Device); dual __init__ calls
NO → resource_integration = false; single-inheritance Device
- Convenience methods on Device (informational, not asked):
Device convenience methods that map to Capability operations MUST go through self.<capability>.<method>,
NEVER to self.driver.<method>. The wrong default — Capability bypass — is documented as Echo branch
Finding 5; the scaffold places a # CAUTION: comment in the Device template warning the
protocol-implementation phase against this.
4. Generate scaffold
Based on the Device Intent collected in step 3:
- Read
~/.claude/skills/v1b1-author/templates/for the 8 scaffold templates. - Select templates per intent:
file_layout == simple_single_file→ instantiatesimple_single_file.py.tmpl(1 file).file_layout == complex_multi_file→ instantiatepackage_init.py.tmpl,driver.py.tmpl, onecapability_backend.py.tmplper Capability withkind == existing_implementation, onehelper_subsystem.py.tmplper HelperChoice,device.py.tmpl, plus chatterbox (chatterbox.py.tmplfor standard form ORchatterbox_driver.py.tmplfor discovery exception).
- Substitute placeholders (full set per
contracts/scaffold-template-contract.mdPlaceholder Set). - Write each rendered file to its target path under the contributor's
pylabrobot/<vendor_lower>/<device_snake>/(or single-file path for simple form per FR-005). - Refuse to overwrite per step 2's earlier check (this catches the case where a re-scaffold was confirmed but a previously-unconfirmed file is in the way).
5. Generate decision record
- Read
~/.claude/skills/v1b1-author/decision-record-template.md. - Substitute the frontmatter fields from the Device Intent + each step section's Decision / Principle / v1b1 precedent / Wrong default avoided / Files-this-shapes content.
- Wrong-default callouts: ALWAYS present even when not visibly triggered. Use the template's documented Micronic + Echo references; tailor only the "Files this decision shapes" section.
- Write to
<contributor-repo>/docs/v1b1-authoring/<vendor>-<device>-decisions.mdper FR-008. Create thedocs/v1b1-authoring/directory if it doesn't exist.
6. Pre-emit lint chain
Three stages, fixed order, halt on any failure (per contracts/pre-emit-lint-contract.md):
Stage 1 — Structural lint
Verify the rendered decision record contains:
- Frontmatter with all required fields (vendor, device, intent_text, file_layout, capabilities, helpers, discovery, chatterbox_form, review_skill_outcome — placeholder until stage 3 fills in)
- All 5 step sections, in order, with required sub-fields
- Cross-reference summary section
- References block
- Hand-off section
Verify the scaffold file list matches the file_layout choice (exactly the expected files; no extra; no missing).
Verify each Principle citation in the decision record matches a principle_id (P1..P6) in shared reference.md. Verify each v1b1 precedent file path exists in the local PLR mirror at the verified_against commit (skip if mirror not present).
On failure: re-render once with the missing field(s) inserted; if still failing, emit self-error naming the missing field. Halt.
Stage 2 — Vocabulary self-check
Grep skill-authored output (decision record + scaffold docstrings/comments) for any term in shared vocabulary-lockdown.md Excluded Terms set:
Locality, Internality, Contract (capitalized noun in skill prose), EYES/I4S, three-layer, Resource Trust, Signal (capitalized noun referring to the proposed pub/sub layer), Device Card.
Verbatim contributor input (intent_text echoed in the decision record's Intent block) is preserved unchanged — out of scope for the lockdown.
On failure: do not emit. Surface the leaked term and the section it appeared in. Halt.
Stage 3 — Review-skill call
Invoke the sibling skill on the scaffold:
/v1b1-capability <scaffold-path>
For simple form, <scaffold-path> is the single file. For complex form, it's the directory.
Read the review skill's Compliance summary line.
Pass criterion: **Result**: 0 findings — compliant with v1b1 patterns.
Failure handling:
- Any
hardorsoftFinding → enter repair mode. Read the Findings; identify which template emitted the offending shape. Re-render the affected files with stricter substitution. Re-call review skill. - Maximum 1 repair attempt.
- If still failing after the repair attempt: emit self-error WITH the review report attached. Do NOT silently emit a non-conformant scaffold.
informationalFindings are allowed (Rick himself uses documented variants like model-as-prefix shorthandXArm6Driver); they do NOT fail stage 3.
On success: append the review_skill_outcome: 0 findings (...) line to the decision record's frontmatter.
7. Hand-off
Emit a clear next-step instruction (FR-019):
Scaffold: <path>
Decision record: <path>
Next:
1. Open the scaffold file(s) and fill in the # TODO: markers in <Backend>.
- Backend method bodies: build wire payloads / parse responses (the protocol-encoding spots).
- Driver: leave as generic transport — DO NOT add domain-named methods.
- Capability frontend: leave as @need_capability_ready forwards — DO NOT add multi-step orchestration.
2. After each Capability operation: /v1b1-capability <scaffold-path> to verify.
3. When all done: /v1b1-capability one final time on the full path; expect 0 Findings.
Stop. The skill has done its job. Protocol-body filling is the contributor's domain expertise (FR-018).
Key References
- Shared pattern catalog:
~/.claude/skills/v1b1-capability/reference.md— Principles P1–P6, Patterns P-01..P-27, Audit Trail. READ at runtime; never copied. - Shared vocabulary lockdown:
~/.claude/skills/v1b1-capability/vocabulary-lockdown.md— Emit / Excluded term lists. READ at runtime. - Shared vendored prose:
~/.claude/skills/v1b1-capability/creating-capabilities.md— Rick's authoritative prose. READ at runtime for prose phrasing in step descriptions. - Local templates:
~/.claude/skills/v1b1-author/templates/— 8 scaffold templates percontracts/scaffold-template-contract.md. - Local decision-record template:
~/.claude/skills/v1b1-author/decision-record-template.md— frontmatter + 5 step sections + cross-reference + references + hand-off. - Local audit procedure:
~/.claude/skills/v1b1-author/audit.md— runnable step list; SHARED Audit Trail entry with v1b1-capability. - Spec contracts:
contracts/(in this skill bundle) — decision-record-contract, scaffold-template-contract, pre-emit-lint-contract.
Notes
- The skill is downstream of the patterns Rick has documented and the device implementations the PLR community has contributed. It does not propose new patterns; new patterns enter via the
v1b1-capabilityaudit cadence (which this skill inherits via the SHARED Audit Trail). - The skill uses Rick's terminology only (vocabulary lockdown enforced via stage 2 of the pre-emit lint).
- Same intent → same scaffold + same decision record (deterministic per
research.mdDecision 1). This is what makes the audit's "re-run + diff against reference fixture" check possible. - v1.0 graduates separately from this v0.9-RC ship — SC-010 requires a real authoring session by the maintainer on a chosen target device with the scaffold passing the review skill on first invocation.
What ships with it: 21 files
59.1 KB alongside SKILL.md, 8 of them executable
templates/
- capability_backend.py.tmpl2.4 KB
- chatterbox_driver.py.tmpl2.4 KB
- chatterbox.py.tmpl2.1 KB
- device.py.tmpl4.4 KB
- driver.py.tmpl2.3 KB
- helper_subsystem.py.tmpl1.9 KB
- package_init.py.tmpl945 B
- simple_single_file.py.tmpl3.2 KB
tests/
- fixtures/S-01-expected/widget_shaker.pyruns3.7 KB
- fixtures/S-02-expected/chatterbox_driver.pyruns1.8 KB
- fixtures/S-02-expected/door_backend.pyruns1.6 KB
- fixtures/S-02-expected/driver.pyruns2.2 KB
- fixtures/S-02-expected/__init__.pyruns342 B
- fixtures/S-02-expected/multi_cap.pyruns2.7 KB
- fixtures/S-02-expected/shaker_backend.pyruns2.7 KB
- fixtures/S-02-expected/temperature_backend.pyruns2.0 KB
- smoke/S-01_acme_widgetshaker.spec.md2.7 KB
- smoke/S-02_acme_multicap.spec.md2.8 KB
- audit.md4.4 KB
- decision-record-template.md9.5 KB
- README.md3.1 KB