feat: execution protocol, review agents, DNS and SES findings
Build and deploy / build-and-deploy (push) Failing after 6s
Build and deploy / build-and-deploy (push) Failing after 6s
This commit is contained in:
+47
-2
@@ -106,8 +106,53 @@ SES on submission:
|
||||
of the no-retainer language, and a link to the privacy policy. This email is
|
||||
the reason the form beats a `mailto:` link.
|
||||
|
||||
SES must have SPF, DKIM, and DMARC aligned on `smlcompany.ca` or these land in
|
||||
spam. The guide covers domain verification; **DMARC needs confirming (Q3)**.
|
||||
**Email authentication — verified 2026-08-26, and it is not in place.**
|
||||
|
||||
A DNS query of `smlcompany.ca` found **no SPF record and no DMARC record**. Mail
|
||||
is on Google Workspace (MX `1 smtp.google.com`) with Google DKIM configured, and
|
||||
the SES domain identity reports verified for sending — but neither SPF nor DMARC
|
||||
exists.
|
||||
|
||||
**What is already in place** (Namecheap DNS and the SES console, both inspected
|
||||
2026-08-26):
|
||||
|
||||
| Record | Status |
|
||||
|---|---|
|
||||
| SES DKIM — `3zsnvsjg…`, `jejgp7na3…`, `xpiwyftpo…` `._domainkey` | **Live.** Matches SES exactly. Never delete |
|
||||
| SES DKIM — `f5puwearz…`, `jdue2r22c…`, `kznn3cklv…` `._domainkey` | Orphans from an earlier verification. Inert. **Leave them** — deleting the wrong three breaks DKIM |
|
||||
| `google._domainkey` TXT | Google Workspace DKIM. Never delete |
|
||||
| Two CNAMEs → `jkddzztszm.acm-validations.aws` | ACM certificate validation. **Never delete** — breaks HTTPS at the next renewal |
|
||||
| `adr` CNAME → `d26v23dhgsp2ta.cloudfront.net` | The site |
|
||||
| Custom MAIL FROM | **Not configured.** Optional; would add SPF alignment |
|
||||
|
||||
Add both of these; neither conflicts with anything above:
|
||||
|
||||
| Host | Type | Value |
|
||||
|---|---|---|
|
||||
| `@` | TXT | `v=spf1 include:_spf.google.com include:amazonses.com ~all` |
|
||||
| `_dmarc` | TXT | `v=DMARC1; p=none; rua=mailto:info@smlcompany.ca; fo=1` |
|
||||
|
||||
A domain may publish **only one** `v=spf1` record, so both senders go in one
|
||||
string. Namecheap TXT values take **no surrounding quotes** — quoting them stores
|
||||
the quotes literally and breaks the record.
|
||||
|
||||
**Correction to an earlier version of this spec.** SPF is not what authenticates
|
||||
SES here. Without a custom MAIL FROM domain, SES uses an envelope sender at
|
||||
`amazonses.com`, so its SPF pass is not *aligned* with `smlcompany.ca` and does
|
||||
not satisfy DMARC. **SES satisfies DMARC through DKIM alignment** — that is what
|
||||
the six CNAMEs above are doing, and it already works. The SPF record's real job
|
||||
is authenticating **Google Workspace** mail, which currently has no SPF at all.
|
||||
`include:amazonses.com` is harmless and becomes useful if a custom MAIL FROM
|
||||
domain is configured later.
|
||||
|
||||
Start DMARC at `p=none` — it collects reports without affecting delivery. Move to
|
||||
`quarantine` only after reports come back clean. Reports arrive as XML
|
||||
attachments, so filter them in Gmail, or drop `rua=` entirely and accept having
|
||||
no visibility.
|
||||
|
||||
**Do not delete the ACM validation CNAMEs.** They are how the certificate for
|
||||
`adr.smlcompany.ca` auto-renews. Removing them breaks HTTPS at the next renewal
|
||||
— silently, months later (Q20).
|
||||
|
||||
Failure handling: SES failure must never lose the submission. Write to DynamoDB
|
||||
first, then send. A dead-letter queue on the Lambda, and a CloudWatch alarm on
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
# 08 — How we work
|
||||
|
||||
`AGENTS.md` D17. Pouya architects. Claude Code implements, then adversarially
|
||||
reviews its own work. This is a standing agreement encoded in the repository, so
|
||||
it does not need restating in every prompt.
|
||||
|
||||
---
|
||||
|
||||
## The short version
|
||||
|
||||
```
|
||||
/build the /med-arb/ page
|
||||
```
|
||||
|
||||
That single command runs: plan → implement → adversarial review → resolve →
|
||||
verify → record. It requests deep reasoning, reads `AGENTS.md` and the specs,
|
||||
stops if the task conflicts with a locked decision, invokes two independent
|
||||
reviewers on the finished diff, resolves what they find, runs the checks, and
|
||||
appends the Change Log entry.
|
||||
|
||||
You do not need to ask for thinking, for review, or for the record to be updated.
|
||||
Those are the agreement, not the request.
|
||||
|
||||
## The three commands
|
||||
|
||||
| Command | Does |
|
||||
|---|---|
|
||||
| `/build <task>` | The full loop. Use for every substantive change |
|
||||
| `/review [scope]` | The review pass alone, on the working tree or a named scope. Reports; fixes nothing without your say-so |
|
||||
| `/wrap` | End of session — updates `AGENTS.md` under its constitution and leaves the tree clean |
|
||||
|
||||
## The two reviewers
|
||||
|
||||
Both are defined in `.claude/agents/` and run in parallel on the diff.
|
||||
|
||||
**`adversarial-reviewer`** reads the code: correctness and edge cases,
|
||||
accessibility, crawlability, performance budgets, security, and whether a
|
||||
materially simpler correct version exists.
|
||||
|
||||
**`claims-auditor`** reads the copy against `AGENTS.md` §4 and nothing else. It
|
||||
extracts every factual assertion — credentials, roles, numbers, languages,
|
||||
locations, capabilities, and the JSON-LD — and traces each to the Verified table.
|
||||
Anything untraceable is reported and does not ship.
|
||||
|
||||
It is a separate agent on purpose. A general-purpose reviewer will happily
|
||||
approve elegant code containing a claim that should never have been published,
|
||||
because professional-conduct compliance is not what it is looking at. On this
|
||||
project that is the highest-stakes failure mode, so it gets its own pass.
|
||||
|
||||
**Both are instructed to treat uncertainty as a defect.** They will sometimes be
|
||||
wrong. That is the intended trade: explaining why a finding is mistaken costs
|
||||
minutes, and a missed defect on a licensed professional's public marketing page
|
||||
costs a great deal more.
|
||||
|
||||
## The rule that makes it work
|
||||
|
||||
**The reviewers are given the diff and the specs — never the implementer's
|
||||
explanation of why the work is correct.**
|
||||
|
||||
A rationale anchors the reviewer. Told why something is right, a reviewer looks
|
||||
for confirmation and finds it; given only the artefact, it forms an independent
|
||||
view. That independence is the entire mechanism. Every other detail of this
|
||||
protocol is adjustable. This one is not.
|
||||
|
||||
---
|
||||
|
||||
## Writing a task
|
||||
|
||||
The commands carry the process, so your prompt only needs to carry the decision.
|
||||
Short and specific beats long and hedged.
|
||||
|
||||
**Good:**
|
||||
|
||||
```
|
||||
/build the /med-arb/ page per docs/01-architecture.md
|
||||
```
|
||||
|
||||
```
|
||||
/build step 5 of the build order — the practice index and all six area pages
|
||||
```
|
||||
|
||||
```
|
||||
/build the intake form on /contact/, per docs/05-backend-spec.md.
|
||||
Booking stays parked — reserve the slot, render nothing.
|
||||
```
|
||||
|
||||
**When you are making a decision rather than assigning work**, say so plainly and
|
||||
let it record the decision:
|
||||
|
||||
```
|
||||
Decision: drop the /for-parties/ page. The plain-language audience can be
|
||||
served by a section on /mediation/ instead. Update AGENTS.md and the
|
||||
architecture spec, then tell me what else this affects.
|
||||
```
|
||||
|
||||
**When you want an opinion before committing**, ask for one — do not ask for
|
||||
code:
|
||||
|
||||
```
|
||||
Before building /fees/: read docs/07-fees.md and tell me what a referring
|
||||
lawyer would find missing from that page. Do not write anything yet.
|
||||
```
|
||||
|
||||
## What it will do without being asked
|
||||
|
||||
- Stop and ask when a task conflicts with a locked decision, or needs a fact it
|
||||
does not have. A blocked build is a correct build.
|
||||
- Leave `TODO(pouya)` in the source and a numbered question in `AGENTS.md` §9
|
||||
rather than inventing a fact or softening a claim into something defensible.
|
||||
- Surface `AGENTS.md` §12 Standing Reminders at the start of a substantial
|
||||
session — including R1, your standing instruction about the licensure wording.
|
||||
- Refuse to publish a claim that is not in the §4 Verified register.
|
||||
- Append a Change Log entry covering decisions and plans, not only code.
|
||||
|
||||
## What to watch for
|
||||
|
||||
**A review that finds nothing.** Possible, but it should be rare, and it must
|
||||
list which lenses were applied and what was checked. "Looks good" is not a
|
||||
review — send it back.
|
||||
|
||||
**Findings declined without a reason.** Declining is legitimate. Declining
|
||||
silently is not; the reasoning belongs in the Change Log so a later reader can
|
||||
see that judgement was exercised rather than the finding missed.
|
||||
|
||||
**A check reported as passing that was not run.** "Should pass" is not a result.
|
||||
If a build, a Lighthouse run, or a JavaScript-disabled render was not actually
|
||||
executed, it must say so.
|
||||
Reference in New Issue
Block a user