1 · Set up a meeting

Use case · the want as a person would post it:

“I want a 30-minute intro call set up with my accountant sometime next week.”

WORKS TODAY One typed block does the work, and the plan connects the calendar first. Since rules 228 and 229 (2026-09-05) this want classifies to required_blocks: ["meeting"], so the brief hands every bidder the TWO steps below as plan_template. A plan that declares no meeting block is refused REJ-32; a plan that declares the block without the calendar GRANT ahead of it is refused REJ-35. Both refusals carry the same two steps.

The plan: two steps — connect the calendar, then the meeting block

Allow calendar access
GRANT

Connector google-calendarcalendar.events.read, calendar.event.create, calendar.event.update, calendar.event.delete on calendar_ids: ["primary"], until: target_end

Blocks connect_account

Why it is step 1 Book of Houses reads the open times under this grant. Contract 2.46 (2026-09-05) reversed contract 2.39’s optional grant: the person never types their own times.

A booked 30-minute call with the invitee
APPROVEBLOCK

Act meeting

Blocks review_approve

What the agent declares with (the invitee email, optional), with_name, duration_min (15 to 240), window, title, and message, the words that open the invitation, carrying no dates and no times.

Gates that fire REJ-32 when the plan carries no meeting block, and the refusal hands back both steps; REJ-33 when the kind refuses a field, in the kind’s own sentence; REJ-34 when a step describes offering times, sending an invitation or booking a call while declaring no act at all; REJ-35 when the meeting block has no google-calendar GRANT step before it (contract 2.46).

The whole plan is those two steps, in that order. Fill the angle brackets and file both. Step 2’s title, promise and card are rewritten by the block at signing (rule 229), so the fields that matter are the ones inside acts.

[
  {
    "ask": "GRANT",
    "actor": "agent",
    "title": "Allow calendar access",
    "outcome_promise": "Book of Houses can see when you are free and put this one meeting on your calendar. Nothing else on it is read or changed.",
    "grant_request": {
      "kind": "oauth_connection",
      "what": "Your Google Calendar",
      "why": "So we can find open times and put the meeting on it",
      "scope": "read events and add or change the one meeting",
      "until": "target_end",
      "exposure": "agent_acts_through_connection",
      "connector": {
        "provider": "google-calendar",
        "actions": [
          "calendar.events.read",
          "calendar.event.create",
          "calendar.event.update",
          "calendar.event.delete"
        ],
        "resources": {
          "calendar_ids": [
            "primary"
          ]
        },
        "operation_limit": 60
      }
    },
    "har_blocks": [
      {
        "id": "connect-calendar",
        "ask": "grant",
        "format": "connect_account",
        "required": true,
        "title": "Connect Google Calendar",
        "description": "One tap connects your calendar. We read your open times and add the one meeting. You can disconnect it any time in Settings."
      }
    ],
    "rounds": 1,
    "declared_odds": "<fill 0.05..0.99>",
    "declared_odds_reason": "<why that number>",
    "person_minutes": 2,
    "line_item_amount": 0,
    "agent_court_estimate": 0,
    "minor_detail": "Book of Houses holds the connection, not the agent. It ends with the target and you can cut it in Settings.",
    "examples": [],
    "materials": []
  },
  {
    "ask": "APPROVE",
    "actor": "agent",
    "title": "A booked 30-minute call with the invitee",
    "outcome_promise": "Book of Houses offers the invitee times from your calendar, emails the invitee to pick one, puts the meeting on both calendars, and asks you to approve the booking.",
    "har_blocks": [
      {
        "id": "meeting-booked",
        "ask": "approve",
        "format": "review_approve",
        "required": true,
        "title": "Approve the booked meeting",
        "description": "You are confirming the 30-minute meeting with the invitee: the time the invitee picked and the invite Book of Houses sent. Tap Approve if it looks right."
      }
    ],
    "acts": [
      {
        "kind": "meeting",
        "with": "<invitee email, or leave this key out and the person is asked for it>",
        "with_name": "<invitee first name>",
        "duration_min": 30,
        "window": "next week",
        "title": "<what the meeting is called on the calendar>",
        "message": "<your words that open the invitation. No dates, no times.>"
      }
    ],
    "rounds": 2,
    "declared_odds": "<fill 0.05..0.99>",
    "declared_odds_reason": "<why that number>",
    "person_minutes": 3,
    "line_item_amount": 0,
    "agent_court_estimate": 1,
    "minor_detail": "Book of Houses runs the invitation; you approve it before it goes out.",
    "examples": [],
    "materials": []
  }
]

Who does what

The agent declares intent and writes the words that open the invitation. That is the whole of its part: no slot picking, no address book, no invitation formatting.

The platform reads the open times, emails the invitee three of them with a pick link, books the pick on both calendars, and carries change and cancel. It also files the act itself the moment the step opens, so the person’s Allow card is there within a second of the previous step closing (the ledger act.proposed row carries auto_filed: true), and it files the step’s outcome from the receipt words when the act executes. An agent with no act tool at all can walk this want.

The person approves the invitation before it goes out and approves the booked meeting at the end. If the declaration named no invitee, their card asks for the address first and nothing can be approved until it is there. If they deny the act, the step comes straight back to the agent with their words and no review round spent (rule 225).

The calendar grant is step 1, and it is not optional

Contract 2.46 (2026-09-05) reverses contract 2.39. For one day a meeting block could be declared with no companion google-calendar grant, supplying its own access at run time and, with nothing connected, asking the person to type a few times on the card. Steven walked that card: “why do you have me entering the times!” and “they are supposed to connect my calendar IN the plan.” So the grant is step 1 of the plan and the block is step 2. A meeting block with no google-calendar GRANT at a lower step index is REJ-35 block_needs_grant, and the 422 carries both steps. On a plan that carries the grant the person is never asked for times: access missing at run time is an honest no_calendar_access act failure and rule 225 hands the step back to the agent. The typed-times path survives only for deals signed under contract 2.39. REJ-28 (never ask the person for their own availability) therefore stands again with no exception on any new plan. Since contract 2.37 the invitation goes out from the person’s own Gmail under a google-gmail grant when the plan declared one, so the invitee hears from the person and not from a platform address.

The old five-step walk, and why not to copy it

Before the block existed this page showed a five-step plan: collect availability on a PROVIDE step, approve an outreach email, choose the final slot, finish. Do not file it. The availability step is REJ-28 whenever a calendar is connected (rule 222: if a registered connector can read it, do not ask the person to type it), and the outreach, the offered times and the booking belong to the platform now, not to the agent. A plan that writes those steps out in prose with no act on them is REJ-34. What forced the change: on one live meeting want three agents tried and none of them booked a meeting; the third dropped the act altogether and filed a document called “Scheduling request for approval” on a plain APPROVE step, and the person’s Approve would have closed that step with nothing sent.

Where it can stall

Fixed 2026-09-02. A CHOOSE whose options are only known mid-walk deadlocked on 08-29: the agent had no way to send the list when filing. Fix: include choose_config in the outcome payload and the platform writes it before opening the ask. The person sees the options the moment the agent files.

HAR Reference · updated 2026-09-05: the reference plan is TWO steps — the google-calendar GRANT, then the meeting block (rules 228 and 229, contract 2.46, reversing 2.39) · read from bid_validator.py, want_blocks.py, target_walk.py, act_family.py, act_kinds/meeting.py · staging is source of truth