Daily standup
standup.py runs at 7am MT daily. The operator and merch-expert confer over live store data and produce a single change-gated brief. No brief fires if nothing changed since the last run.
Before this, read:
Most “autonomous AI business” demos stop at “it can generate designs.” The operator in agents/merch/operator.py goes further: it runs a closed feedback loop that connects what it learned yesterday to what it decides today — while keeping a hard wall between the agent’s autonomy and the decisions that cost real money or touch legal identity.
The operator runs a five-phase cycle:
sense → decide → act → review → learnSense: read current store state — design ledger, sales analytics, margin data, next-drop queue, goal progress, operator health metrics. Everything is read from files and Supabase; the operator does not poll external APIs (that’s the drain’s job).
Decide: produce a ranked decision set. Examples: “run a design drop today (evergreen niches: coffee, dev humor)”, “flag margin below floor on SKU X”, “request JD approval to adjust pricing”. Each decision is logged with its rationale.
Act: execute decisions that fall within the operator’s current autonomy level. Decisions outside that level become requests to JD (surfaced in the daily standup).
Review: verify the actions completed, check for errors, update the operator-metrics ledger.
Learn: close the loop — write next_drop_themes to the planning directory so design_agent.mine_concepts() reads those decided themes on the next cron tick instead of re-seeding a static evergreen list. This is the learn→decide edge that the original build was missing, added in the operator upgrade on 2026-06-09.
The operator’s goal file (~/clawd/domains/merch/state/goal.json) encodes the mission: grow AgentTree Merch to $10,000/month, fully autonomously, escalating to JD only when truly blocked.
“Truly blocked” has a definition: money decisions, identity questions, IP sign-off, and anything that requires human judgment the operator cannot provide with high confidence.
Everything else — design cadence, drop timing, concept selection, catalog maintenance, drain operations, standup reporting — is the operator’s responsibility.
The mission is dormant-gated: with zero sales history, the data-driven legs of the operator (kill on margin, scale winners, repricing) degrade to “dormant: awaiting first sales” and do not fabricate signals. A dormant operator still runs, still decides next-drop themes from the evergreen fallback, still reviews its own health. It just doesn’t optimize on data it doesn’t have.
These are defined in code, not documentation:
# From operator.py:HARD_WALL_CAPABILITIES = frozenset({ "money", # no real charge, ad spend, payout, or money-costing reorder "identity", # never touches bank / account / domain "ip_signoff", # the fail-closed IP gate never drops below human sign-off})The decide() function refuses to emit any of these as an auto-executed action. They may only appear in the decision set as requests — items that surface in the standup brief for JD to approve.
CI tests assert this at the capability level:
def test_hard_walls_never_auto_execute(): """No hard-wall capability can appear in auto-executed decisions.""" decisions = operator.decide(state=mock_state_with_full_data()) for d in decisions: if d.auto_execute: assert d.capability not in HARD_WALL_CAPABILITIESThe hard-wall assertion runs on every merge. A PR that accidentally makes a money decision auto-executable will fail CI before it reaches production.
The operator tracks a “clean streak” per capability in state/operator-metrics.json. After 50 consecutive clean decisions on a given capability class, that class graduates one rung toward autonomy (from “request JD” to “notify JD” to “log and execute”).
Any JD override, IP miss, or margin-floor breach resets the streak for that capability to zero.
Hard-wall capabilities are capped at the “request JD” rung, permanently. The streak counter still runs — it’s useful data about reliability — but the graduation ceiling prevents them from ever climbing to full autonomy, regardless of how many clean decisions accumulate.
This is the same “earned autonomy” model used by agents/evolution. The architecture decision to mirror it across both the self-healing system and the merch operator reflects a deliberate choice: trust is extended incrementally, and trust is never extended to money or identity decisions.
Daily standup
standup.py runs at 7am MT daily. The operator and merch-expert confer over live store data and produce a single change-gated brief. No brief fires if nothing changed since the last run.
Expansion module
expansion.py handles self-crons and worker expansion. It ships with hard caps and is OFF by default. JD enables it explicitly when the store is ready to scale.
The daily standup (standup.py) is worth examining separately from the decide loop. The operator and the merch-expert consultant both contribute to the brief — the operator brings the performance data and pending decisions; the expert brings the strategic context (when to push paid ads, what margin thresholds matter, which SKUs are worth scaling).
The brief is change-gated: if the operator’s state hasn’t changed since the last standup, no Telegram ping fires. This prevents the briefing from becoming noise.
The standup cron was installed at 13:00 UTC, which is 7am MT — early enough to land before JD checks messages, so the day’s decisions are visible when he sits down.
The honest framing from the CHANGELOG’s own launch note: “touch only bank/domain/IP-signoff, not zero-human.”
An operator that escalates on money, identity, and IP and handles everything else is not a weaker version of full autonomy. It is the correct design for a system running under a single operator. The alternative — full autonomy on all decisions — would mean the agent can spend money, change account details, and make IP calls without review. That is not a design goal; it’s a liability.
The three hard walls are not temporary guardrails to be removed when the operator “matures enough.” They are permanent properties of the system, enforced in code and tested on every build.
Next: The expert consultant that advises the operator on POD economics and strategy is the merch-expert agent.