Part 5 of 7 · Sentiment monitor series ~5 min read

How the weekly pulse gets sent

The instant alert is for the bad moment. The weekly pulse is for the calm overview — the Monday-morning email that tells you how the week actually went, even if nothing ever crossed an alert threshold. It’s short on purpose: three blocks an owner can read in thirty seconds. This post walks through what goes in each block, how the pulse is built almost entirely from plain arithmetic over the stored scores, and the single Bedrock call that turns those numbers into one human sentence.

Key takeaways

  • Three blocks: the mood trend, the standout mentions, and what changed since last week.
  • Built almost entirely from plain arithmetic over the stored scores — no model on the numbers.
  • One Bedrock Haiku 4.5 call writes the human summary line at the top.
  • EventBridge Scheduler fires it every Monday morning; SES sends the email.
  • The pulse always goes out, even on a quiet week — absence of an alert is information too.

Three blocks in the pulse

Three blocks assembled into the weekly pulse A diagram showing one input on the left flowing into a builder, then branching into three content blocks, then converging into the sent email. Far left: a "Weekly run starts" box — EventBridge Scheduler fires the pulse Lambda every Monday morning; the Lambda reads the past week's rows from the sm-scores table and last week's stored summary. The middle column shows the three blocks. Block one, Mood trend: plain Python computes this week's average, the direction versus last week, and a small text sparkline of the daily averages; no model is involved. Block two, Standout mentions: Python sorts the week's scores and pulls the single best and single worst mention, each with its source, its score, and its one-line reason, quoted with a link to the original. Block three, What changed: Python compares this week's counts and average to last week's stored summary and writes the deltas — more or fewer mentions, average up or down, which source moved most. The right side shows the convergence: a single Bedrock Haiku 4.5 call reads the three blocks and writes one plain-English summary sentence for the top of the email; then the layout is assembled and sent via SES to the configured recipients, and this week's summary is stored for next week's comparison. A note at the bottom: only the one summary sentence uses a model — every number in the pulse is plain arithmetic over the stored scores. Weekly run starts Mon AM, reads week [Trend] [Standout] [Changed] Block 1 Mood trend • This week’s average vs last week • Daily text sparkline • Plain Python, no model Block 2 Standout mentions • Best and worst of the week • Source, score, reason, link to original Block 3 What changed • Counts vs last week per source • Which source moved most, up or down Summary + send one Haiku 4.5 line layout assembled SES → recipients store for next week Only the summary line uses a model — every number is plain arithmetic over the stored scores.
Fig 5. Three blocks assembled into one email. The trend, the standout mentions, and what changed are all built from the stored scores in plain Python. A single Bedrock call writes the human summary line, then SES sends it and this week’s figures are stored for next week.

Block 1: the mood trend

The first block is the one most owners read and stop. It’s the week’s average mood as a single number, the direction compared to last week (up, down, or flat), and a tiny text sparkline — seven small marks, one per day, showing the daily average so the shape of the week is visible at a glance. A week that started fine and dipped on Thursday looks different from a week that was steadily low, and the sparkline shows that without anyone reading a single mention.

None of this needs a model. It’s the same rolling-average math from Part 3, run once over the week’s rows in the sm-scores table. Plain Python reads the scores, groups them by day, averages each day, and compares the week’s overall figure to the one stored last Monday. The numbers are exact and reproducible, which is exactly what you want from the headline a business decision might lean on.

Block 2: the standout mentions

Numbers tell you the shape; the standout block tells you the why. Python sorts the week’s scores and pulls two mentions: the single most positive and the single most negative. Each is shown with its source, its score, its one-line reason from the reader, and a link to the original. The best one is there because good news is worth seeing — a glowing review is a quote you might want to use, and a sign of what’s working. The worst one is there so that even on a week that never tripped an instant alert, the lowest point still gets a set of eyes on it.

Two mentions, not twenty. The pulse isn’t a feed of everything — that’s what the stored data is for if someone wants to dig. The block deliberately surfaces just the extremes, because those are the two an owner can actually act on in the thirty seconds they’ll give the email.

Block 3: what changed

The third block is the comparison block, and it’s why last week’s figures are stored. Python compares this week to last: more or fewer mentions overall, the average up or down by how much, and which source moved the most. “Review mentions up 40% this week, mostly positive; comment mood down slightly, driven by one post.” This block turns a single snapshot into a direction. A flat average can hide a source quietly climbing while another slips; the per-source deltas surface that.

This is the block that makes the pulse worth reading every week rather than once. The trend number alone can sit in the same place for a month while the underlying mix shifts; “what changed” is where that shift shows up. And like the other two blocks, it’s pure arithmetic — subtract last week’s stored summary from this week’s computed one.

The one model call, and the send

At the top of the email sits one plain-English sentence: “A solid week — mood ticked up, your delivery fixes are showing in the reviews, and the one rough comment was an isolated billing question.” That sentence is the only place the pulse uses a model. The reporter hands the three assembled blocks to a single Bedrock Haiku 4.5 call and asks for one honest summary line — no spin, no padding, just what the numbers say in words. It’s the cheap path doing a small writing job, and it never invents a figure, because the figures are already fixed by the blocks above it.

Then the layout is assembled and SES sends it to the configured recipients. EventBridge Scheduler fires the whole run every Monday morning. Crucially, the pulse goes out even on a dead-quiet week with no alerts and no drama — because “nothing happened” is itself a thing an owner wants confirmed, not a silence they have to wonder about. This week’s figures are written to the summary store, and next Monday the cycle compares against them.

Next post: the cost breakdown. The whole monitor — collecting, reading, alerting, and this weekly pulse — runs in coffee-money territory at SMB volume; Part 6 shows exactly where the dollars go.

All posts