Lacuna/Labs
btn-set-desc
white
#138 / 601

NAME

btn-set-desc — White read-cart in the 'Buttons (write ops, mint-flavor) (15)' group. Operator-commanded data surface in the Analysis tab.

SYNOPSIS

id btn-set-desc tier white section §6. White — atomic tools (142 baseline, 149 post-matrix) trigger operator-commanded tools cortex_query, list_listings / list_orders source carry-forward

DESCRIPTION

A write action behind a consent gate. Operator-commanded only. Eight-star canon — Sakura proposes via a chip; this is the verb that fires after the operator clicks yes.

White read-cart in the 'Buttons (write ops, mint-flavor) (15)' group. Operator-commanded data surface in the Analysis tab.

MECHANISM

PREfetchGUARDtier: whiteACTperformRESULTrenderON-ERRretry / esc
;;~ title    "Set description"
;;~ author   "lacuna"
;;~ version  1
;;~ mode     automation
;;~ flavor   green
;;~ id       btn-set-desc
;;~ touches  (etsy-listings)
;;~ summary  "Replace the description."

;; Replace the description.
;;
;; Destructive write cart. Action-wrapper shape with the consent gate:
;;   precondition_fetch (ctx has id + payload + operator-confirmed)
;;     -> guard (consent required) -> perform -> result -> on_error.
;; operator_confirmed rides in args so the driver's destructive-verb
;; gate sees it. Rate-limit retries with backoff; auth-stale escalates.
;; State is `perform` (not `act`) so it never shadows the descriptor
;; constructor of the same name in cartPrelude.

(cart 'btn-set-desc
  '((author    . "lacuna")
    (version   . 1)
    (touches   . (etsy-listings))
    (read-only . #f)))

(define (start ctx)
  (let ((id      (ctx-get 'listing-id ctx))
        (desc (ctx-get 'desc ctx))
        (consent (ctx-get 'operator-confirmed ctx)))
    (cond
      ((null? id)        (escalate 'missing-listing-id null))
      ((null? desc)    (escalate 'missing-desc null))
      ((not consent)     (escalate 'consent-required null))
      (else              (next 'perform ctx)))))

(define (perform ctx)
  (let ((id (ctx-get 'listing-id ctx))
        (desc (ctx-get 'desc ctx)))
    (act 'etsy/update-listing
         (list id desc (list 'operator_confirmed #t))
         'check-result)))

(define (check-result ctx)
  (let ((r (ctx-result ctx)))
    (cond
      ((eq? r 'ok)            (done))
      ((eq? r 'rate-limited)  (after 30 'perform ctx))
      ((eq? r 'auth-stale)    (escalate 'auth-relogin null))
      (else                   (escalate 'write-failed r)))))

source: curator-web/src/scheme/carts/etsy/btn-set-desc.sks · 49 lines

EXAMPLES

Example forthcoming — docs/automations/examples.json entry editable in place.

TIER

white
atomic · free · operator-commanded

FITNESS

Ready

Fits any shop today — this one has no sample-size floor.

SEE ALSO

HISTORY

canonical source: curator/docs/AUTOMATIONS-CANONICAL.md · §6-white-atomic-tools-142-baseline-149-post-matrix
last regenerated: 2026-06-05 20:31 UTC (mechanical — edits land in the MD or sidecars, not here)

KNOWN BUGS

(none recorded — flag in AUTOMATIONS-CANONICAL.md or open an issue against the cart file)