---
name: morning-round
description: "Produce the daily one-page snapshot of diary, awaiting replies, overnight enquiries, stalled deals, and the top three actions for today. Triggers when the operator says 'morning round', 'morning brief', 'what's on', 'where are we', 'start my day', 'kick me off', 'what's new since yesterday', or a bare 'morning' or 'good morning' with no other content. Also fires on schedule at the profile's delivery time."
---

# Morning round

The master workflow run daily by the negotiator at the agent's chosen time, Monday through Saturday. It is read-only by design. Every claim in the output cites a connector read or a profile entry, every section appears even when empty, and the workflow never writes to the CRM or sends a message.

This skill earns the right to act. Until the operator trusts the morning round to look without permission, the chase-progression workflow has no licence to send anything.

## Inputs

- The operator's customisation profile, read first. The profile names the delivery channel, the stalled threshold per stakeholder type, the agent's preferred section order, and any section they have hidden.
- The agent's calendar for today, read via the calendar connector.
- The CRM state of every sale-agreed deal and every active negotiation, read via the CRM connector.
- The portal enquiry feed since the last morning round, read via the portal connectors and email connector.
- The WhatsApp Business inbox since the last morning round.

If any connector is unavailable the workflow still produces the round and names the gap in plain language, for example "portal feeds unavailable, overnight enquiries not included in this round".

## Architecture principles encoded here

The six principles in spec 00 §8 apply once at this master-skill layer and are not repeated in the building-block skills it composes.

- Read before write. This workflow never writes anything.
- Stage, don't send. Not applicable, there is nothing to send.
- One screen of output. The five sections must fit one Claude UI exchange. If they do not, the workflow has summarised badly.
- Cite the source. Every number, name, and claim traces back to a connector read or a profile entry.
- Teach the profile. Every operator interaction after the round feeds the profile through `profile-writer`. See learning hooks below.
- Reversible. Read-only, nothing to reverse.

## Output shape

One markdown page, five sections, always in this order unless the profile has reordered them. Sections with no content collapse to one line so the operator always knows the section was checked.

1. **Today's diary.** Viewings, valuations, market appraisals, vendor meetings, completion calls. Times, addresses, contact name, postcode. Built by `diary-builder`.
2. **Awaiting reply.** Anything chased in the last 7 days (default, profile-learned) that has had no reply. Grouped by recipient type. Built by reading the CRM contact log and the email or WhatsApp sent folder.
3. **New overnight.** Portal and email enquiries since the last login, triaged. Hot enquiries show verbatim. Lukewarm, cold, duplicate, and spam show a one-line summary only. Built by `enquiry-triage`.
4. **Stalled.** Sale-agreed deals where nothing has moved past the stalled threshold. Each line names the property, the days stalled, and the most likely cause from chain state. Built by `chain-progression-tracker`.
5. **Top three.** Three things to action first, each with the reason it made the list. Reason is one short sentence, for example "Mrs Patel, her buyer's mortgage offer expires in 9 days and the survey was booked but not done". Built by composing `priority-ranker` and `variance-narrator`.

## Continuous learning hooks

The morning round is the highest-volume source of learning signals in the product because it runs daily and the operator's behaviour after reading it is observable. Every signal below is written through `profile-writer`, never inline.

- Skip pattern per source. If the operator never acts on lukewarm enquiries from a specific portal, that source's weight in `enquiry-triage` drops over time.
- Stalled threshold drift. "I don't consider this stalled until day 10" updates the threshold immediately. Consistently acting at day 5 tightens it automatically.
- Top-three accuracy. When the operator actions an item from the top three the same day, the ranking is correct. When they action a lower item instead, `priority-ranker` reweights toward whatever feature distinguished the actioned item.
- Delivery time. If the operator asks for the round before the scheduled time, schedule earlier. If they ignore it for hours, schedule later or move to on-demand only.
- Section preferences. "Lead with stalled deals, not the diary" reorders permanently. "Drop the awaiting-reply section, it's noise" hides it and surfaces those items in `chase-progression` instead.

## Approval gates

None. The workflow is read-only.

## Cross-references

The chase-progression workflow uses the same `chain-progression-tracker` skill to build its single-deal deep dives. The morning round produces the across-pipeline view; `chase-progression` expands any stalled item the operator names.

## Profile keys this skill reads

- `realagent.morning_round.delivery_channel`
- `realagent.morning_round.delivery_time`
- `realagent.morning_round.section_order`
- `realagent.morning_round.hidden_sections`
- `realagent.stalled_threshold_days.vendor`
- `realagent.stalled_threshold_days.buyer`
- `realagent.stalled_threshold_days.solicitor`
- `realagent.stalled_threshold_days.broker`
- `realagent.stalled_threshold_days.surveyor`
- `realagent.awaiting_reply_lookback_days`

## Visitor-graph briefing (Task 357)

Before the morning round, call `visitor-recent-by-person` for every `:Person` in the active follow-up queue with `sinceDays: 1` to surface overnight activity. Persons with non-empty results land at the top of the briefing — they've been on the site since you last spoke. The briefing line takes the shape:

> _Sarah Chen — viewed Oak Street twice last night, opened the floorplan, scrolled the listing to 75%. Last seen 06:12._

Also call `visitor-recent-by-page` for any listing that picks up activity from previously-unidentified visitors — these are anonymous prospects worth surfacing to the operator even when no `:Person` is attached.

Outbound URLs in the briefing (links the operator might click to send to the contact) are minted via the `mint-visitor-token` tool — call it with the recipient's `:Person` elementId (`mint-visitor-token({ personId })`) and append the returned `token` as `&v=<token>` to the existing `/listings/<slug>/click?session=<sk>` URL. The token binds the recipient's browser to the `:Person` on click; never inline the secret yourself, always call the tool. Mint a fresh token per outbound URL — TTL defaults to 30 days and tokens are cheap to re-issue.

