Skip to content

The Duty procedure offers the fork it promised (1.4.0) - #8

Merged
kahwaipd merged 1 commit into
mainfrom
docs/duty-procedure-fork-route
Sep 8, 2026
Merged

kahwaipd merged 1 commit into
mainfrom
docs/duty-procedure-fork-route

Conversation

@kahwaipd

@kahwaipd kahwaipd commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

## Customize has said since 1.2.0 that a mechanical condition — a candle close, an indicator, a second asset's price — is a fork. The numbered steps Butler actually walks never said so.

Step 1 offered a strict binary — a knob, or judgment via DCA_ESCALATE — and step 5 ended at "never hand-write the duty's code, the shim loads this skill's duty.py". So on the canonical ask:

buy $5k of BTC only when the 15m candle closes above $85k

a Butler following the procedure lands on DCA_ESCALATE — an LLM wake on every run, forever — instead of the fork that computes the condition in code for free. The escape hatch existed; it was just in a section the duty path never reaches.

Changes

  • Step 1 splits the leftover condition three ways: a knob, a fork when the condition is mechanical, judgment only when it needs a brain.
  • Step 5 keeps "do not hand-write a duty" but names the fork as the other thing --from-skill accepts.
  • Limits drops the scope sentence ## When to use already states verbatim ("One asset, one direction, one cadence per duty") and shortens the fork back-reference that step 1 now carries.

On the body budget

SKILL.md's body is capped at 12,000 chars and was at 11,995 — 5 to spare. The additions had to pay for themselves, which is what the Limits trim is for. Net −38, leaving 43 chars of headroom. validate.py --standalone --maintainer passes. duty.py is untouched, so replay behaviour is unchanged.

Not fixed here

DCA_INTERVAL_SECONDS has a floor of 3600, so the 15m cadence in that example ask is below what this skill's own knobs allow — a forking Butler has to change the trigger too. Worth a follow-up: either lower the floor or say so in Limits.

Companion PRs, same theme — the hub is a recipe Butler adapts, not a program it installs: Virtual-Protocol/butler-skills#19, Virtual-Protocol/butler-skill-copytrade#5, Virtual-Protocol/butler-skill-template#2.

🤖 Generated with Claude Code

"Customize" has said since 1.2.0 that a mechanical condition — a candle close,
an indicator, a second asset's price — is a fork. The numbered steps Butler
actually walks never said so: step 1 offered a strict binary (a knob, or
`judgment` via DCA_ESCALATE) and step 5 ended at "never hand-write the duty's
code". So "buy $5k of BTC when the 15m candle closes above $85k" lands on
DCA_ESCALATE — an LLM wake every run — instead of the fork that computes it in
code for free.

- Step 1 splits the leftover condition three ways: a knob, a fork when the
  condition is mechanical, `judgment` only when it needs a brain.
- Step 5 keeps "do not hand-write a duty" but names the fork as the other
  thing `--from-skill` accepts.
- "Limits" drops the scope sentence "When to use" already states verbatim and
  shortens the fork back-reference step 1 now carries. The body is capped at
  12,000 chars and was at 11,995, so the additions had to pay for themselves;
  net -38, leaving 43.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: kw <kahwai@pathdao.io>
@kahwaipd
kahwaipd merged commit e606296 into main Sep 8, 2026
2 checks passed
@kahwaipd
kahwaipd deleted the docs/duty-procedure-fork-route branch September 9, 2026 05:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant