chore: project scaffold, specs, and working record
Build and deploy / build-and-deploy (push) Failing after 5s
Build and deploy / build-and-deploy (push) Failing after 5s
This commit is contained in:
@@ -0,0 +1,566 @@
|
||||
# Agent Working File
|
||||
|
||||
This file is a **living document** and a **full history tree** for this project —
|
||||
not a snapshot. Any agent or person working here (Claude in chat, Claude Code,
|
||||
Claude Cowork, or a human) maintains it by the rules below. Everything else in
|
||||
this file varies by project; these rules do not.
|
||||
|
||||
## How to maintain this file
|
||||
|
||||
1. **Document everything.** On every change, record what was discussed, decided,
|
||||
changed, or planned — decisions and plans included, not just executed work.
|
||||
|
||||
2. **Never overwrite or delete history.** When something changes, update the
|
||||
relevant Current Truth section in place **and** append a dated Change Log
|
||||
entry capturing old → new and why.
|
||||
|
||||
3. **Two parts, kept separate:** *Current Truth* is updated in place and always
|
||||
reflects the present state; the *Change Log* is append-only, newest entry
|
||||
first, and is never edited retroactively.
|
||||
|
||||
4. **Stamp facts** as `[verified YYYY-MM-DD]` or `[assumed]`. When you re-check a
|
||||
fact, re-stamp it with today's date; a stale date means it needs re-verifying.
|
||||
|
||||
5. **Never prune the Change Log.** If the file gets unwieldy, ask before
|
||||
archiving old entries to `AGENTS-history.md`. History is not destroyed.
|
||||
|
||||
---
|
||||
|
||||
# Current Truth
|
||||
|
||||
## 1. What this project is
|
||||
|
||||
A ground-up rebuild of **adr.smlcompany.ca**, the personal-brand website of the
|
||||
alternative dispute resolution practice of **Pouya Lajevardi**. `[verified 2026-08-25]`
|
||||
|
||||
The brand's centre of gravity is the **practitioner**, not the firm and not
|
||||
SML Company Ltd. Legal background, firm affiliation, and the operating company
|
||||
are credibility signals referenced in support; they are not the subject.
|
||||
`[verified 2026-08-25 — source: PL_ADR_Personal_Branding_Strategy_Brief.docx]`
|
||||
|
||||
**Positioning in one sentence:** a credentialed neutral who is also a working
|
||||
litigator and a practising machine-learning / infrastructure engineer — a
|
||||
combination that is close to absent from Canadian ADR rosters, and which is the
|
||||
practice's economic moat. `[verified 2026-08-25 — source: strategy brief §I, §V]`
|
||||
|
||||
**Time horizon:** the strategy brief plans a 24-month compounding arc. The site
|
||||
is built to be added to continuously, not shipped once. `[verified 2026-08-25]`
|
||||
|
||||
## 2. State of the thing being replaced
|
||||
|
||||
The site live at `adr.smlcompany.ca` as of this entry: `[verified 2026-08-25]`
|
||||
|
||||
- It is a **single 2.2 MB HTML file** containing an entire React application,
|
||||
compiled **in the browser at runtime** by Babel Standalone loaded from unpkg.
|
||||
- React and ReactDOM are loaded as **development** builds from a public CDN.
|
||||
- **Crawlers see almost nothing.** A server-side fetch of the URL returns only
|
||||
`SML Company`, `DISPUTE RESOLUTION`, and the loading string `Unpacking...`.
|
||||
Every word of real content is assembled client-side after three CDN round
|
||||
trips. `[verified 2026-08-25 — direct fetch]`
|
||||
- The deployed `<head>` has **no `<meta name="viewport">`**, no meta
|
||||
description, no Open Graph or Twitter card tags, no canonical URL, and no
|
||||
favicon. `[verified 2026-08-25]`
|
||||
- `robots.txt` returns **403**. There is no sitemap. `[verified 2026-08-25]`
|
||||
- The two logo PNGs are ~1 MB combined and are **base64-inlined** into the HTML,
|
||||
so they cannot be cached separately from the page. `[verified 2026-08-25]`
|
||||
- `<title>` is still `SML Company · Dispute Resolution` — the pre-rebrand
|
||||
placeholder title. `[verified 2026-08-25]`
|
||||
- There is **no version control, no build step, and no test suite**. The
|
||||
publishing mechanism is a Python script (`rebuild-standalone.py`) that inlines
|
||||
the JSX components into the single file. `[verified 2026-08-25]`
|
||||
- The May 2026 content brief was **partially applied** — the JSX components
|
||||
under `components-standalone/` contain the corrected Pouya-branded copy, but
|
||||
the document `<head>` and some structural defaults still carry placeholder
|
||||
content. `[verified 2026-08-25]`
|
||||
|
||||
**Consequence, stated plainly:** for a site whose entire purpose is to be found
|
||||
by counsel, general counsel, and appointing bodies searching for a neutral, the
|
||||
current architecture is close to a worst case. This rebuild is justified on
|
||||
architecture alone, independent of any content or design opinion.
|
||||
`[verified 2026-08-25]`
|
||||
|
||||
## 3. Locked decisions
|
||||
|
||||
Decided with Pouya on 2026-08-25. Each of these is settled; do not re-open one
|
||||
without an explicit instruction and a Change Log entry. `[verified 2026-08-25]`
|
||||
|
||||
| # | Decision | Chosen | Rejected alternatives |
|
||||
|---|---|---|---|
|
||||
| D1 | Framework | **Astro**, static output | Next.js; patching the single-file build; hand-written HTML |
|
||||
| D2 | Content scope | **Full re-architecture** — new IA, new pages, all copy rewritten | Copy rewrite on existing structure; audit only; technical layer only |
|
||||
| D3 | Hosting & CI/CD | **Git repo + Gitea Actions → existing S3 + CloudFront.** *Amended 2026-08-26:* self-hosted **Gitea**, repo `adr-sml`. Gitea Actions uses GitHub Actions syntax, so the workflow ports nearly as is — but Gitea is not an AWS OIDC provider, so deploys authenticate with a **scoped IAM user**, rotated quarterly | GitHub Actions + OIDC; Terraform/CDK IaC; Amplify; manual deploys |
|
||||
| D4 | Languages | **English only** | Full EN/FA bilingual; EN + one Farsi page; EN with FA scaffolding |
|
||||
| D5 | Page structure | **Full multi-page**, ~20 URLs | Lean six-page; rich home + a few deep pages |
|
||||
| D6 | Primary audience | **All four tiers**, served by different surfaces (see §5) | Single-audience focus |
|
||||
| D7 | Visual design | **Keep palette and infinity mark; modernize the execution** | Faithful port; strip motion only; fresh design direction |
|
||||
| D8 | Fees | **Full rate card published on a `/fees/` page** | Ranges only; on request; gated PDF |
|
||||
| D9 | Insights | **Build it and launch with 3–5 drafted pieces**, every word reviewed by Pouya before publication | Launch empty; no Insights section |
|
||||
| D10 | Intake | **Rebuilt intake form + calendar booking** for the confidential intake call | Structured questionnaire; form only; email/phone only |
|
||||
| D11 | Rollout | **Build everything, one clean cutover.** The current site stays live untouched until replaced | Patch live site first; staging subdomain; take site down |
|
||||
| D12 | Agent working file | **This file**, maintained under the constitution above | Ad hoc notes |
|
||||
| D13 | Licensure claims | **The site asserts the JD only.** No claim of licensure, call to the bar, or entitlement to practise law. The approved phrasing for the boutique role is **"active litigation exposure"** or **"involvement in litigation and ADR matters"** — never "practice". Pouya's direction, 2026-08-26. **Explicitly interim — see Standing Reminders §12** | Stating LSO licence status; the word "practice" |
|
||||
| D14 | Fee structure | **Single published rate card, all mediation matters at one rate.** Confirmed by Pouya 2026-08-26; figures in `docs/07-fees.md`. No tribunal-secretary line | Two-tier card (recommended by Claude, declined); ranges; fees on request |
|
||||
| D15 | Analytics | **Privacy-first and cookieless** (Plausible or Fathom). No cookie banner, nothing to consent to, one line in the privacy policy | GA4; no analytics at all |
|
||||
| D16 | Naming the boutique | **Never named.** Referred to throughout as *a Toronto litigation and ADR boutique*. Pouya's decision, 2026-08-26 | Naming the firm |
|
||||
|
||||
## 4. Credential and claim register
|
||||
|
||||
**This is the most important section in this file.** Pouya is a licensed legal
|
||||
professional. Every public claim on this site is subject to Law Society of
|
||||
Ontario marketing rules, and the previous version of the site carried fabricated
|
||||
credentials, invented matter values, and a fictitious testimonial. That must
|
||||
never recur.
|
||||
|
||||
### Governing rule
|
||||
|
||||
> **No claim reaches a public page unless it appears in the Verified column
|
||||
> below.** If a page needs a fact that is not here, stop and ask Pouya. Do not
|
||||
> infer it, do not soften it into something defensible, and do not carry it over
|
||||
> from the old site.
|
||||
|
||||
### Verified — may be published
|
||||
|
||||
Sourced from Pouya's own strategy brief of 2026-05-26. Self-reported by the
|
||||
subject, which makes them reliable as to substance, but **currency is not
|
||||
confirmed** — several are on a moving credentialing track and may have advanced
|
||||
since May.
|
||||
|
||||
| Claim | Status |
|
||||
|---|---|
|
||||
| Pouya Lajevardi, JD, Bond University | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| ~~Lawyer; Law Society of Ontario member~~ | **DO NOT PUBLISH.** Pouya directed on 2026-08-26 that licensure is left out of the site entirely; the JD is asserted, nothing further. See D13 and the Forbidden table below `[verified 2026-08-26]` |
|
||||
| Director of Firm Operations, Toronto litigation and ADR boutique | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Active litigation practice: personal injury, construction, regulatory (POA), insurance (SABS) | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Q.Med designation through ADRIC / ADRIO | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Has completed multiple sole mediations | `[verified 2026-08-25 — strategy brief §I]` — count deliberately not published, see below |
|
||||
| Q.Arb credentialing pathway — **commenced August 2026** | `[verified 2026-08-26 — Pouya]`. Describe as newly commenced, never as held or nearing completion |
|
||||
| C.Med-Arb stated as long-term designation goal | `[verified 2026-08-25 — strategy brief §I, §IV]` |
|
||||
| Kompass Arbitration Certificate Program — completed | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Stitt Feld Handy negotiation and ADR workshop sequence — completed | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Practising machine-learning and DevOps / infrastructure engineer | `[verified 2026-08-25 — strategy brief §I, §V]` |
|
||||
| Bilingual English and Farsi | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Iranian-Canadian; cross-cultural fluency with diaspora business communities | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Operator of SML Company Ltd. alongside the practice | `[verified 2026-08-25 — strategy brief §I]` |
|
||||
| Memberships: **ADRIC**, **ADRIO**, **OBA sections** | `[verified 2026-08-26 — Pouya]`. Which OBA sections is still `[assumed]` — the brief names Construction & Infrastructure, ADR, and Civil Litigation |
|
||||
| ~~OCNI~~ | **Not current. Do not publish** `[verified 2026-08-26 — Pouya]` |
|
||||
| ~~LSO~~ | **Do not publish.** Listing the Law Society among memberships implies licensure, which D13 bars. Excluded deliberately, not by oversight `[verified 2026-08-26]` |
|
||||
| Toronto, Ontario; by appointment | `[verified 2026-08-26]` |
|
||||
| Contact: `info@smlcompany.ca`; no public phone number; consultations by scheduled call | `[verified 2026-08-26 — Pouya]` |
|
||||
| LinkedIn: `https://www.linkedin.com/in/pouyalajevardi/` | `[verified 2026-08-26 — Pouya]` |
|
||||
| The Toronto litigation and ADR boutique **may be named on the site** | `[verified 2026-08-26 — Pouya]`; the name itself is pending, see Q7 |
|
||||
|
||||
### Forbidden — must not appear anywhere
|
||||
|
||||
| Never publish | Why |
|
||||
|---|---|
|
||||
| Any count of matters closed, hours mediated, or years in ADR practice | Practice is new. Small true numbers do not persuade a sophisticated GC and invite scrutiny. Save for one-to-one appointment proposals where context travels with the figure. `[verified 2026-08-25 — content brief, "Rule of thumb on numbers"]` |
|
||||
| Settlement rates, resolution percentages, median time to award | No underlying data exists |
|
||||
| Aggregate value resolved; any dollar figure attached to past matters | No underlying data exists |
|
||||
| Named or describable past matters | Confidentiality, and none are publishable |
|
||||
| Testimonials, endorsements, quotes from counterparties | None exist. The prior site's testimonial was fabricated |
|
||||
| "Since 2009", "sixteen years", London / New York offices, Co. № 07452218 | Artefacts of the placeholder template. All false |
|
||||
| The name "S. M. Lawrence" | Fictitious founder from the template |
|
||||
| Guarantees of outcome, or superlatives ("best", "leading", "top-rated") | LSO marketing rules |
|
||||
| The word **"lawyer"** used of Pouya; "called to the bar"; "licensed"; "my law practice"; "my litigation practice"; any post-nominal implying a licence | D13. The site asserts the JD and nothing further |
|
||||
| Any phrasing that *implies* entitlement to practise law without saying so — "acts for clients", "represents parties", "my clients", "legal advice" | Same rule. Implication is the risk, not just the word. Describe the role factually instead: *Director of Firm Operations at a Toronto litigation and ADR boutique*, and the matter types worked on |
|
||||
| Q.Arb described as held, imminent, or "nearly complete" | It commenced August 2026 |
|
||||
|
||||
### The substitution principle
|
||||
|
||||
Wherever the design wants a "how much / how many" statistic, substitute a
|
||||
**longer-arc credential** — something already substantial and true at launch that
|
||||
does not grow by closing files. The approved stat set is `Q.Med` /
|
||||
`JD + ML` / `EN · FA`, with `Q.Arb` as a fourth slot where one exists.
|
||||
`[verified 2026-08-25 — content brief]`
|
||||
|
||||
## 5. Audience model
|
||||
|
||||
All four tiers matter, but they are served by different surfaces rather than by
|
||||
diluting every page into a compromise. `[verified 2026-08-25 — decision D6]`
|
||||
|
||||
| Tier | Reads | Wants | Primary surface |
|
||||
|---|---|---|---|
|
||||
| In-house / general counsel | Home, practice pages | Credentials, subject-matter fluency, procedure, predictable cost | Home + `/practice/*` |
|
||||
| Referring lawyers and litigation boutiques | Practice pages, fees, process | Availability, rules familiarity, rate card, confidence you won't embarrass them | `/fees/`, `/process/`, `/mediation/` |
|
||||
| Appointing bodies and ADR institutions | About, credentials | A verifiable credential record and evidence of depth | `/about/` |
|
||||
| Self-represented parties and SMEs | Plain-language layer | What mediation actually is, what it costs, what happens | `/for-parties/` |
|
||||
|
||||
Realistically, **referring counsel are the largest source of early
|
||||
appointments**. Where two audiences conflict on a page, resolve toward counsel.
|
||||
`[assumed]`
|
||||
|
||||
## 6. Architecture
|
||||
|
||||
Full sitemap, URL map, and per-page content outline: **`docs/01-architecture.md`**.
|
||||
|
||||
Summary: ~20 static pages. Home; About; three process pages (Mediation,
|
||||
Arbitration, Med-Arb); six practice-area pages; Process; Fees; For Parties;
|
||||
Insights index and articles; Contact; Privacy; Terms.
|
||||
|
||||
**Deliberate omission:** there is no Indigenous engagement / IBA practice page at
|
||||
launch, though the strategy brief rates that niche as strategically the most
|
||||
valuable. Publishing a practice page for it before the multi-year relationship
|
||||
work described in brief §III.4 has been done would read as overreach to exactly
|
||||
the audience it targets. Revisit at month 12–18. `[verified 2026-08-25 — decision recorded here, not yet discussed with Pouya]`
|
||||
|
||||
## 7. Environment and stack
|
||||
|
||||
| Thing | Value |
|
||||
|---|---|
|
||||
| Framework | Astro, `output: 'static'` `[verified 2026-08-25 — D1]` |
|
||||
| Node | 22 LTS, pinned in `.nvmrc` `[assumed]` |
|
||||
| Styling | Plain CSS with custom properties. No Tailwind, no CSS-in-JS `[verified 2026-08-25]` |
|
||||
| Client JS | Astro islands only, where genuinely needed. Target: most pages ship zero JS `[verified 2026-08-25]` |
|
||||
| Content | Astro content collections, MDX for Insights `[verified 2026-08-25]` |
|
||||
| Fonts | Instrument Serif + Geist + Geist Mono, **self-hosted**, `font-display: swap` `[verified 2026-08-25]` |
|
||||
| AWS account | `327082975128` `[verified 2026-08-26 — inventory]` |
|
||||
| Region | **`ca-central-1`** throughout — hosting, Lambda, DynamoDB `[verified 2026-08-26]` |
|
||||
| S3 bucket | **`adr-smlcompany-site`** — versioning **Enabled**, so rollback works `[verified 2026-08-26]` |
|
||||
| CloudFront | **`E1OK7G98KNKUTA`**, alias `adr.smlcompany.ca`, origin `adr-smlcompany-site.s3.ca-central-1.amazonaws.com`, Deployed `[verified 2026-08-26]` |
|
||||
| ACM certificate | `arn:aws:acm:us-east-1:327082975128:certificate/2b6d5bdf-6790-430c-9b82-c00ab66e6d87` — ISSUED `[verified 2026-08-26]` |
|
||||
| Intake API | `adr-intake-api`, HTTP API `4tl0m5igkj`, endpoint `https://4tl0m5igkj.execute-api.ca-central-1.amazonaws.com` `[verified 2026-08-26]` |
|
||||
| Intake Lambda | `adr-intake-handler`, `nodejs24.x` `[verified 2026-08-26]` |
|
||||
| Intake table | `adr-intake-submissions` (DynamoDB, ca-central-1) `[verified 2026-08-26]` |
|
||||
| SES identities | Domain `smlcompany.ca`; addresses `info@`, `intake@`, `adr@`. **Sending status unconfirmed — Q18/Q19** `[verified 2026-08-26]` |
|
||||
| TLS | ACM certificate `[verified 2026-08-25 — AWS-Hosting-Guide.md]` |
|
||||
| DNS | **Namecheap**, not Route 53 `[verified 2026-08-25 — AWS-Hosting-Guide.md]` |
|
||||
| Intake backend | API Gateway (HTTP API) → Lambda → DynamoDB, notifications via SES `[verified 2026-08-25 — AWS-Hosting-Guide.md]` |
|
||||
| Repository | **`adr-sml`**, self-hosted **Gitea**. Local clone at `/Users/pouya/Dev/Websites/adr-sml` `[verified 2026-08-26]` |
|
||||
| CI/CD | **Gitea Actions**, `.gitea/workflows/deploy.yml`. `.github/workflows/deploy.yml` kept as the OIDC reference in case the repo ever moves. Credentials: scoped IAM user in Gitea secrets — **no OIDC available** `[verified 2026-08-26 — D3 as amended]` |
|
||||
| Analytics | **Plausible or Fathom** — cookieless, no personal data, no consent banner, EU-hosted `[verified 2026-08-26 — D15]` |
|
||||
|
||||
## 8. Design system
|
||||
|
||||
Full token set, type scale, motion rules, and contrast results:
|
||||
**`docs/02-design-system.md`**.
|
||||
|
||||
Palette and infinity mark carry over unchanged. Execution is modernized:
|
||||
fluid type scale, self-hosted fonts, an 8 px spacing scale, motion gated behind
|
||||
`prefers-reduced-motion`, and one hard accessibility constraint discovered by
|
||||
measurement:
|
||||
|
||||
> **Gold `#c9a876` on cream `#faf7f2` measures 2.10:1 contrast.** That fails WCAG
|
||||
> AA for body text (4.5:1) and for large text (3:1). Gold is a decorative and
|
||||
> on-dark colour only. On maroon it measures 5.84:1 and on ink 8.00:1, both of
|
||||
> which pass. `[verified 2026-08-25 — computed]`
|
||||
|
||||
## 9. Open questions — blocking
|
||||
|
||||
Nothing below can be invented. Each needs an answer from Pouya.
|
||||
|
||||
| # | Question | Blocks |
|
||||
|---|---|---|
|
||||
| ~~Q1~~ | **ANSWERED 2026-08-26.** Licensure is left out entirely; the site asserts the JD only. See D13 | — |
|
||||
| ~~Q2~~ | **ANSWERED 2026-08-26.** Q.Arb commenced August 2026 | — |
|
||||
| ~~Q3~~ | **ANSWERED 2026-08-26.** Email `info@smlcompany.ca`. No public phone — "By scheduled call". Location: Toronto · Ontario · By appointment | — |
|
||||
| ~~Q4 / Q14~~ | **ANSWERED 2026-08-26.** Rate card confirmed by Pouya — see D14 and `docs/07-fees.md` | — |
|
||||
| ~~Q13~~ | **ANSWERED 2026-08-26.** Self-hosted Gitea with Gitea Actions | — |
|
||||
| ~~Q15 / Q16 / Q17~~ | **ANSWERED 2026-08-26.** Non-mediation hourly $500. Prep bundled: 2 h in the half day, 3 h in the full day, **stated on the page**. Overtime $500/h | — |
|
||||
| Q5 | Booking tool — **parked 2026-08-26 at Pouya's request.** Build `/contact/` with the form only and a clean slot for the embed. Now tracked as standing reminder R6 | `/contact/` — non-blocking |
|
||||
| ~~Q6~~ | **ANSWERED 2026-08-26.** Supplied and committed: `src/assets/pouya-lajevardi.jpg` (1600×1600 master) and `src/assets/og-portrait.jpg` (1200×630 link-preview crop) | — |
|
||||
| ~~Q7~~ | **ANSWERED 2026-08-26.** Pouya reverted to generic. The boutique is **never named**; refer to it as *a Toronto litigation and ADR boutique* throughout | — |
|
||||
| ~~Q8~~ | **ANSWERED 2026-08-26.** ADRIC, ADRIO, OBA sections. Not OCNI. Not LSO (see §4) | — |
|
||||
| ~~Q9~~ | **ANSWERED 2026-08-26.** Gitea, repo `adr-sml`, clone at `/Users/pouya/Dev/Websites/adr-sml` | — |
|
||||
| ~~Q10~~ | **ANSWERED 2026-08-26.** Full inventory captured; values in §7 | — |
|
||||
| Q18 | **Are the SES identities actually verified for sending?** `list-email-identities` returned `VerifiedForSendingStatus: None` for all six. If they are unverified, no intake email sends | Intake confirmation and notification email |
|
||||
| Q19 | **Is the SES account still in the sandbox?** In sandbox, mail only reaches pre-verified addresses — the confirmation email to an inquirer would silently fail | `/contact/` going live |
|
||||
| ~~Q11~~ | **ANSWERED 2026-08-26.** Privacy-first, cookieless — Plausible or Fathom. No GA4, no consent banner | — |
|
||||
| ~~Q12~~ | **ANSWERED 2026-08-26.** `https://www.linkedin.com/in/pouyalajevardi/` | — |
|
||||
|
||||
## 10. Risks
|
||||
|
||||
| Risk | Severity | Mitigation |
|
||||
|---|---|---|
|
||||
| A fabricated or unverifiable claim reaches a public page | **High** — professional-conduct exposure for a licensed practitioner | §4 register; every claim traced to a source before it ships |
|
||||
| Copy silently carried over from the placeholder template | High | Nothing is ported verbatim. All copy written fresh against `docs/03-content-spec.md` |
|
||||
| Insights section launches and then goes stale | Medium | D9 commits to 3–5 pieces at launch and a monthly cadence. A dead blog is worse than no blog |
|
||||
| Personal data in the intake pipeline without a retention policy | Medium — PIPEDA | `docs/05-backend-spec.md` sets retention, and `/legal/privacy/` states it |
|
||||
| Cutover breaks the live site (D11 is a single-shot deploy) | Medium | Full pre-cutover checklist in `docs/06-deployment.md`; CloudFront can be rolled back to the prior origin path |
|
||||
| Twenty pages of thin copy rank worse than six good ones | Medium | Each page must justify itself with substantive content. Ship fewer pages rather than padded ones |
|
||||
| **Deploy-credential blast radius.** AWS account `327082975128` is not a single-project account. It also holds `meshkinilaw.ca` and its preview site, `demesne.media`, `orynenergy.ca`, `lajirugs.ca`, and **`mlp-clientdb-prod-backups`** — which by its name is a law firm's production client-database backups | **High** | A static deploy key for a personal website must never be able to reach a client database. The scoped IAM policy in `docs/06-deployment.md` grants four actions on one bucket and one distribution and nothing else — that narrowness is now load-bearing, not hygiene. Never widen it. Never reuse the `user/pouya` credentials in CI `[verified 2026-08-26 — inventory]` |
|
||||
| SES not verified or still sandboxed | Medium | Q18/Q19. A silently undelivered confirmation email looks to the inquirer like being ignored |
|
||||
|
||||
## 11. Glossary
|
||||
|
||||
| Term | Meaning |
|
||||
|---|---|
|
||||
| ADR | Alternative dispute resolution |
|
||||
| ADRIC | ADR Institute of Canada — national credentialing body |
|
||||
| ADRIO | ADR Institute of Ontario — provincial affiliate |
|
||||
| Q.Med | Qualified Mediator — ADRIC/ADRIO designation |
|
||||
| Q.Arb | Qualified Arbitrator — ADRIC/ADRIO designation |
|
||||
| C.Med-Arb | Chartered Mediator-Arbitrator — senior hybrid designation; the long-term goal |
|
||||
| Med-Arb | Hybrid process: mediation that converts to binding arbitration if unresolved |
|
||||
| SABS | Statutory Accident Benefits Schedule — Ontario auto insurance benefits |
|
||||
| LAT | Licence Appeal Tribunal — hears Ontario SABS disputes |
|
||||
| POA | Provincial Offences Act |
|
||||
| ENE | Early neutral evaluation |
|
||||
| LSO | Law Society of Ontario |
|
||||
| OBA | Ontario Bar Association |
|
||||
| IESO | Independent Electricity System Operator |
|
||||
| OEB | Ontario Energy Board |
|
||||
| SMR | Small modular reactor |
|
||||
| PIPEDA | Personal Information Protection and Electronic Documents Act |
|
||||
|
||||
## 12. Standing reminders
|
||||
|
||||
**Surface these to Pouya at the start of any substantial session.** They are
|
||||
open questions he has deliberately parked, not settled matters. The point of
|
||||
this section is that a parked decision does not quietly become permanent by
|
||||
never being raised again.
|
||||
|
||||
| # | Reminder | Raised | Why it must keep coming back |
|
||||
|---|---|---|---|
|
||||
| R1 | **Licensure.** The site currently asserts the JD only and describes the boutique role as *active litigation exposure*, never *practice*. Pouya flagged this as an interim position and asked to be reminded to change it | 2026-08-26 | If he is licensed and in good standing, it is the first credential appointing bodies and opposing counsel look for, and its absence from a detailed credentials page is conspicuous. If licensure is in progress, the copy should be rewritten the moment it completes. Either way this is a **temporary** framing that will otherwise ossify |
|
||||
| R2 | **Matter counts stay off the site until they are independently credible.** Revisit once there is a number a sophisticated GC would find persuasive on its own | 2026-08-26 | §4 forbids them now. That rule has an expiry date nobody has set |
|
||||
| R3 | **Indigenous engagement practice page.** Deliberately omitted at launch (§6). Revisit at month 12–18 | 2026-08-26 | The strategy brief rates it the most valuable single niche. Omission is a timing call, not a permanent one |
|
||||
| R4 | **Insights cadence.** D9 commits to monthly. A blog that stops is worse than one that never started | 2026-08-26 | The section's whole value is compounding |
|
||||
| R5 | **Fee review at 12 months.** Published rates are sticky; the right moment to move them is deliberate, not reactive | 2026-08-26 | D14 is priced for where the practice is going, not where it is |
|
||||
| R6 | **Booking tool.** Parked by Pouya on 2026-08-26; `/contact/` ships with the intake form and a reserved slot for an embed | 2026-08-26 | He asked to be reminded. D10 committed to booking because it removes the back-and-forth that loses appointments — the form alone is a partial answer |
|
||||
|
||||
---
|
||||
|
||||
# Change Log
|
||||
|
||||
## 2026-08-26 (e) — AWS inventory captured; Q10 closed; blast-radius risk logged
|
||||
|
||||
**Who:** Pouya ran `scripts/aws-discover.sh`. Claude recording.
|
||||
|
||||
**Q10 closed.** All identifiers in §7. Bucket `adr-smlcompany-site`,
|
||||
distribution `E1OK7G98KNKUTA`, region `ca-central-1`, intake API
|
||||
`4tl0m5igkj`. Certificate ISSUED. **S3 versioning is already Enabled**, so the
|
||||
rollback path in `docs/06-deployment.md` works as written — no change needed.
|
||||
|
||||
**Data residency confirmed.** Hosting, Lambda, and DynamoDB are all in
|
||||
`ca-central-1`. `docs/05-backend-spec.md` treated Canadian residency as a
|
||||
selling point conditional on the table's region; it is now a verified fact and
|
||||
`/legal/privacy/` can state it plainly.
|
||||
|
||||
**New risk logged — deploy-credential blast radius.** The inventory shows this is
|
||||
a shared account across at least five unrelated properties, including
|
||||
`mlp-clientdb-prod-backups-327082975128`. A Gitea runner holding a static AWS key
|
||||
for this site sits in the same account as a law firm's client-database backups.
|
||||
Nothing about the plan changes — the scoped IAM policy was already correct — but
|
||||
its narrowness is now load-bearing rather than good practice, and that is
|
||||
recorded so nobody widens it later for convenience.
|
||||
|
||||
**Q18 and Q19 opened — SES.** `list-email-identities` returned
|
||||
`VerifiedForSendingStatus: None` for all six identities, and sandbox status was
|
||||
not checked. Either condition means the intake confirmation email silently fails.
|
||||
This is the failure mode where the site appears to work and inquirers think they
|
||||
have been ignored, so it is on the cutover checklist, not the nice-to-have list.
|
||||
|
||||
**Closed:** Q10. **Opened:** Q18, Q19.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-26 (d) — Memberships, analytics, prep time, firm naming; one blocker left
|
||||
|
||||
**Who:** Pouya. Claude recording.
|
||||
|
||||
**Q16 closed — preparation time is bundled and stated.** 2 h in the half day,
|
||||
3 h in the full day, printed on `/fees/`. The carried-forward assumption is now a
|
||||
decision. At $4,000 a day counsel will assume preparation happened; saying so
|
||||
converts the assumption into a selling point and forecloses an argument about
|
||||
what the fee covered.
|
||||
|
||||
**Q15 and Q17 closed.** Non-mediation hourly (ENE, settlement counsel,
|
||||
dispute-system design, technical advisory) and mediation overtime both **$500/h**,
|
||||
matching the arbitration rate.
|
||||
|
||||
**Q8 closed — memberships.** Old → new: five `[assumed]` bodies from the strategy
|
||||
brief → **ADRIC, ADRIO, and OBA sections, verified.** OCNI is **not current** and
|
||||
must not be published; the brief listed it as aspirational positioning for the
|
||||
nuclear niche, which is a different thing from a membership.
|
||||
|
||||
- **LSO was deliberately not offered as an option and is not published.** Listing
|
||||
the Law Society in a credentials block implies licensure, which D13 bars. Worth
|
||||
recording explicitly so a later reader does not "helpfully" add it back.
|
||||
- Which OBA sections remains `[assumed]` — the brief names Construction &
|
||||
Infrastructure, ADR, and Civil Litigation. Low stakes; confirm in passing.
|
||||
|
||||
**D15 — analytics (new decision).** Old → new: unchosen → **privacy-first and
|
||||
cookieless**, Plausible or Fathom. No GA4, no consent banner, no personal data
|
||||
leaving the site, one honest line in the privacy policy. Consistent with a
|
||||
practice whose privacy posture is part of its offer, on a site where visitors are
|
||||
often describing live disputes.
|
||||
|
||||
**D16 — the boutique is never named (new decision).** Old → new: "may be named,
|
||||
name pending" → **generic throughout**: *a Toronto litigation and ADR boutique*.
|
||||
Pouya reversed his earlier answer. Trade-off, recorded for the record: naming a
|
||||
recognisable firm is a meaningful credibility signal to appointing bodies, and
|
||||
the generic phrasing gives that up in exchange for zero coordination cost and no
|
||||
dependency on anyone else's sign-off. Do not infer the name from his email domain
|
||||
or from anything else.
|
||||
|
||||
**Closed:** Q7, Q8, Q11, Q15, Q16, Q17. **Opened:** none.
|
||||
|
||||
**Q10 is now the only blocker.** Everything else needed to build is answered.
|
||||
R6 (booking) stays parked by choice and does not block `/contact/`.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-26 (c) — Contact, headshot, LinkedIn; booking parked
|
||||
|
||||
**Who:** Pouya. Claude recording.
|
||||
|
||||
**Closed.** Q3 — contact is `info@smlcompany.ca`, no public phone, consultations
|
||||
by scheduled call. Q6 — headshot supplied; committed as
|
||||
`src/assets/pouya-lajevardi.jpg` (1600×1600 master, for Astro to derive AVIF and
|
||||
WebP from at build) and `src/assets/og-portrait.jpg` (1200×630, cropped high so
|
||||
the face is not centred under the fold of a link preview). Q12 — LinkedIn URL,
|
||||
which now feeds `sameAs` in the `Person` JSON-LD.
|
||||
|
||||
**Q5 parked, not closed.** Old → new: "choose a booking tool" → **deferred at
|
||||
Pouya's request**; `/contact/` ships with the intake form and a reserved slot for
|
||||
an embed, so adding one later is a drop-in rather than a rebuild. He asked to be
|
||||
reminded, so it is now **R6** in §12 rather than a question that quietly expires.
|
||||
Worth restating when it comes back up: D10 chose booking because it removes the
|
||||
scheduling back-and-forth that loses appointments, and the form alone only
|
||||
half-solves that.
|
||||
|
||||
**Q7 partially answered.** The boutique may be named. The name itself was not
|
||||
given. His email domain (`meshkinilaw.ca`) points to **Meshkini Law**, but an
|
||||
inferred firm name is exactly the kind of thing §4 exists to stop — asked for
|
||||
confirmation rather than published.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-26 (b) — Fees confirmed; Gitea; licensure wording; standing reminders
|
||||
|
||||
**Who:** Pouya, answering the second round. Claude recording.
|
||||
|
||||
**D14 closed — rate card confirmed, and it is not what was recommended.**
|
||||
- Old → new: two-tier card (Tier A insurance/SABS at $1,800/day, Tier B
|
||||
commercial at $3,200/day) → **one rate for all mediation matters: $2,000 half
|
||||
day, $4,000 full day, $500 per party beyond two.** Arbitration $500/h, hearing
|
||||
day $4,000, documents-only flat $6,500 simple / $9,500 complex. Tribunal-
|
||||
secretary line removed. Cancellation terms adopted as recommended.
|
||||
- Why: Pouya's decision.
|
||||
- **Recorded dissent, for the 12-month review (R5).** A single premium rate puts
|
||||
the insurance / SABS / LAT segment out of reach — the published market there
|
||||
runs roughly $800–$1,200 a day, and $4,000 is three to five times it. That is
|
||||
the segment the strategy brief (§IV.7) identifies as the highest realistic
|
||||
near-term volume, flowing directly from the firm's existing accident-benefits
|
||||
work. The trade is deliberate if it is deliberate: a premium specialist
|
||||
position that forgoes volume. It is a mistake if the volume was being counted
|
||||
on. Flagged once, implemented as directed.
|
||||
- Three parameters were not specified and are carried forward as assumptions,
|
||||
logged as Q15–Q17: non-mediation hourly ($500), bundled prep hours (2 h half
|
||||
day / 3 h full day), mediation overtime ($500/h).
|
||||
|
||||
**D13 refined — approved wording for the boutique role.**
|
||||
- Old → new: "describe the role factually" → the specific approved phrases are
|
||||
**"active litigation exposure"** and **"involvement in litigation and ADR
|
||||
matters"**. The word **"practice"** is barred in that context.
|
||||
- Pouya asked to be **continuously reminded** that this is interim. That request
|
||||
is now structural rather than a note — see the new §12.
|
||||
|
||||
**New §12, Standing Reminders.** Five items (R1–R5) that any agent must surface
|
||||
at the start of a substantial session. Added because a parked decision otherwise
|
||||
becomes permanent by never being raised again — and R1 is Pouya's explicit
|
||||
instruction to keep raising it.
|
||||
|
||||
**D3 amended again — Gitea.**
|
||||
- Old → new: "private git server, software unknown" → **self-hosted Gitea with
|
||||
Gitea Actions**, clone at `/Users/pouya/Dev/Websites/adr-sml`.
|
||||
- Consequence: Gitea Actions uses GitHub Actions syntax, so the workflow ports
|
||||
almost unchanged into `.gitea/workflows/deploy.yml`. But **Gitea is not an AWS
|
||||
OIDC provider**, so the OIDC role assumption is replaced by a scoped IAM user
|
||||
whose key lives only in Gitea's secret store. The IAM policy stays exactly as
|
||||
narrow. Quarterly rotation is now an operational obligation that OIDC would
|
||||
have made unnecessary — noted in `docs/06-deployment.md`.
|
||||
|
||||
**Closed:** Q4, Q9, Q13, Q14. **Opened:** Q15, Q16, Q17.
|
||||
**Still open:** Q3, Q5, Q6, Q7, Q8, Q10, Q11, Q12, Q15, Q16, Q17.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-26 (a) — Licensure decision; Q.Arb dated; git host changed; fees researched
|
||||
|
||||
**Who:** Pouya, answering the blocking questions from §9. Claude recording.
|
||||
|
||||
**Date correction.** The entry below is stamped 2026-08-25. The correct date of
|
||||
that work was **2026-08-26** — the session clock was a day behind. Per rule 3 the
|
||||
entry is left as written rather than edited; this note is the correction. Facts
|
||||
touched today are re-stamped `[verified 2026-08-26]`.
|
||||
|
||||
**D13 — licensure left out of the site (new decision).**
|
||||
- Old → new: "confirm LSO licence status before launch" → **the site asserts the
|
||||
JD and makes no licensure claim at all.**
|
||||
- Why: Pouya's direction.
|
||||
- **Consequence, and it is not small.** The strategy brief describes an *"active
|
||||
litigation practice in personal injury, construction, regulatory (POA), and
|
||||
insurance (SABS) matters."* Copy written that way would imply entitlement to
|
||||
practise law without stating it — which is the risk the decision is meant to
|
||||
avoid, restated in different words. So the Forbidden table now bars implication
|
||||
as well as assertion, and the About page describes the role factually:
|
||||
*Director of Firm Operations at a Toronto litigation and ADR boutique*, plus
|
||||
the matter types worked on. **Flagged back to Pouya**: if he is in fact
|
||||
licensed and in good standing, that is a material credential for exactly the
|
||||
audience this site targets, and omitting it costs more than it protects.
|
||||
|
||||
**Q.Arb dated.** Old → new: `[assumed]`, stage unknown → **commenced August
|
||||
2026** `[verified 2026-08-26]`. Describe as newly commenced. Not as held, not as
|
||||
nearing completion.
|
||||
|
||||
**D3 amended — the repository is not on GitHub.**
|
||||
- Old → new: "git repo + GitHub Actions" → **repo `adr-sml` on a private git
|
||||
server**; the GitHub Actions workflow in `.github/workflows/` is retained as a
|
||||
working reference implementation, to be translated once the server software is
|
||||
known (**Q13**).
|
||||
- Why: Pouya is running his own git server.
|
||||
- Knock-on: GitHub's OIDC provider is unavailable. GitLab CE can federate to AWS
|
||||
by OIDC; Gitea/Forgejo and bare git cannot, so those need a scoped IAM user
|
||||
with rotated keys, or deploys run from Pouya's machine. The choice is real and
|
||||
waits on Q13.
|
||||
|
||||
**D14 — fee structure recommended (new decision, pending sign-off).** Market
|
||||
research completed against the Ontario mandatory-mediation tariff, ADR Chambers
|
||||
published ranges, and four published Ontario practitioner rate cards. A two-tier
|
||||
structure is recommended so the price-sensitive SABS/LAT volume work does not
|
||||
anchor the commercial rate. Figures are in the response to Pouya and are **not
|
||||
written into any page until he signs off (Q14).**
|
||||
|
||||
**Still open:** Q3, Q5, Q6, Q7, Q8, Q10, Q11, Q12, Q13, Q14.
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-25 — Project initiated; architecture decided; repo bundle authored
|
||||
|
||||
**Who:** Pouya Lajevardi with Claude (Cowork session), acting as architects. Claude Code to implement.
|
||||
|
||||
**What was discussed.** Pouya asked for a modernization of `adr.smlcompany.ca`
|
||||
going beyond appearance — content and codebase included — with Claude Code doing
|
||||
the implementation and deploying to AWS.
|
||||
|
||||
**What was found.** An audit of the live site and the local sources established
|
||||
the facts in Current Truth §2. The headline finding: the site is a browser-
|
||||
compiled single-file React bundle that serves crawlers three words of content.
|
||||
For a personal-brand site whose function is discoverability, this is the
|
||||
dominant problem, ahead of any question of looks or copy.
|
||||
|
||||
**What was decided.** Twelve decisions, D1–D12, recorded in §3. In summary: an
|
||||
Astro static rebuild, full content re-architecture, ~20 pages, English only,
|
||||
git + GitHub Actions onto the existing S3/CloudFront, palette and infinity mark
|
||||
retained with a modernized execution, a published rate card, an Insights section
|
||||
launching with drafted content, a rebuilt intake form plus booking, and a single
|
||||
clean cutover.
|
||||
|
||||
- Old → new (framework): browser-compiled React single file → Astro static site
|
||||
- Old → new (publishing): manual `rebuild-standalone.py` + console upload → git + GitHub Actions with OIDC
|
||||
- Old → new (structure): one scrolling page → ~20 pre-rendered pages
|
||||
- Old → new (content): partially-corrected placeholder template → written fresh against a claim register
|
||||
- Old → new (record-keeping): none → this file, under the AGENTS constitution
|
||||
|
||||
**Why.** Discoverability is the practice's growth constraint and the current
|
||||
architecture forecloses it. Every other decision follows from fixing that, with
|
||||
the content decisions following from the strategy brief of 2026-05-26.
|
||||
|
||||
**Also decided, not yet discussed with Pouya:** no Indigenous engagement practice
|
||||
page at launch (§6), on the reasoning recorded there. Flag this to him.
|
||||
|
||||
**Planned, not yet done.** Astro implementation; all page copy; 3–5 Insights
|
||||
drafts; intake backend rework; CI/CD wiring; pre-cutover audit. Twelve blocking
|
||||
questions are open in §9 — several pages cannot be written until they are
|
||||
answered.
|
||||
Reference in New Issue
Block a user