Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9523817e2 | ||
|
|
67847d94fa | ||
|
|
4735989f0b | ||
|
|
99889a3491 | ||
|
|
6aaf089b05 |
@@ -140,6 +140,7 @@ npm run check:intake # the form's field table vs the Lambda's — they are two
|
|||||||
npm run og:proof # every og:image resolves; every card headline IS its page's <h1>
|
npm run og:proof # every og:image resolves; every card headline IS its page's <h1>
|
||||||
npm run lighthouse # the performance budget. LOCAL ONLY — needs Chrome, not in CI
|
npm run lighthouse # the performance budget. LOCAL ONLY — needs Chrome, not in CI
|
||||||
npm run bio:pdf # re-renders the committed one-page PDF from /bio/. LOCAL ONLY
|
npm run bio:pdf # re-renders the committed one-page PDF from /bio/. LOCAL ONLY
|
||||||
|
npm run icons # re-derives public/favicon.ico from the brand master. REGENERATOR
|
||||||
npm run lint # eslint + prettier check
|
npm run lint # eslint + prettier check
|
||||||
npm run format # prettier — rewrite files in place
|
npm run format # prettier — rewrite files in place
|
||||||
npm run deploy # build + deploy from this machine (see docs/06)
|
npm run deploy # build + deploy from this machine (see docs/06)
|
||||||
@@ -153,6 +154,17 @@ checklist, and **they are deliberately not wired into `npm run build` or either
|
|||||||
deploy path.** Do not describe either as gating a deploy: a check described as
|
deploy path.** Do not describe either as gating a deploy: a check described as
|
||||||
running where it cannot is the defect `AGENTS.md` Q22 turned out to be.
|
running where it cannot is the defect `AGENTS.md` Q22 turned out to be.
|
||||||
|
|
||||||
|
**`bio:pdf` and `icons` are REGENERATORS, not gates** — they rewrite committed
|
||||||
|
artefacts (`public/pouya-lajevardi-bio.pdf`, `public/favicon.ico`) rather than
|
||||||
|
checking anything, so they are run deliberately and their output is committed.
|
||||||
|
⚠️ **`LOCAL ONLY` above means a different thing for each, so do not read the two
|
||||||
|
labels as one.** `bio:pdf` **cannot** run in CI — it drives a browser. `icons`
|
||||||
|
is pure Node and **could**; it is out of the build because a build should not
|
||||||
|
silently rewrite an artefact a human approved, which is why it is labelled
|
||||||
|
`REGENERATOR` rather than `LOCAL ONLY`. It regenerates the favicon **only** — the touch icon
|
||||||
|
is hand-made and must stay opaque cream (`docs/reference/brand-assets.md`
|
||||||
|
§The icon set).
|
||||||
|
|
||||||
**`og:proof` and `check:intake` exist because two facts in this repo are
|
**`og:proof` and `check:intake` exist because two facts in this repo are
|
||||||
deliberately duplicated**, and a duplicated fact needs a mechanism rather than a
|
deliberately duplicated**, and a duplicated fact needs a mechanism rather than a
|
||||||
comment. `og:proof` compares each generated OG card's headline against its page's
|
comment. `og:proof` compares each generated OG card's headline against its page's
|
||||||
@@ -363,7 +375,7 @@ an operator to delete the three records that authenticate outbound mail —
|
|||||||
under the heading "Never delete".
|
under the heading "Never delete".
|
||||||
|
|
||||||
**A measurement is a claim about your instrument until you check the
|
**A measurement is a claim about your instrument until you check the
|
||||||
instrument.** This has now cost six times, and the shape is identical every
|
instrument.** This has now cost eight times, and the shape is identical every
|
||||||
time: a number that looks like a finding, from a probe nobody validated.
|
time: a number that looks like a finding, from a probe nobody validated.
|
||||||
|
|
||||||
- `timeout 60 ls "$DRIVE"` — **the command never ran.** `timeout` is not
|
- `timeout 60 ls "$DRIVE"` — **the command never ran.** `timeout` is not
|
||||||
@@ -391,6 +403,20 @@ time: a number that looks like a finding, from a probe nobody validated.
|
|||||||
from the list. **A `grep -o` window count is not an enumeration** — to count
|
from the list. **A `grep -o` window count is not an enumeration** — to count
|
||||||
occurrences of a string, iterate every match position, or `grep -o` the bare
|
occurrences of a string, iterate every match position, or `grep -o` the bare
|
||||||
string with no context window.
|
string with no context window.
|
||||||
|
- **An ink bounding box of `48x48` filling the whole 48 px favicon** — which
|
||||||
|
reads as *the regeneration blew the mark up to the full square*. The probe
|
||||||
|
identified ink as "differs from cream", which is **correct on a matted icon and
|
||||||
|
meaningless on a transparent one**, because `alpha = 0` pixels still carry RGB
|
||||||
|
`(0,0,0)`. **Nothing about the probe changed — the class of input did**, and a
|
||||||
|
probe cannot tell you that. Composite over a known ground first, so both things
|
||||||
|
compared are the kind of thing the instrument was built for.
|
||||||
|
- **A contrast ratio of `14.02:1` for the mark's darkest ink** — computed from a
|
||||||
|
raw channel value **without asking what alpha it is painted at**. Exactly one
|
||||||
|
pixel carried that colour and its alpha was 251; a `>= 250` filter let it
|
||||||
|
through and the ratio was then taken as if it were opaque. **It is a number
|
||||||
|
about a colour that is never painted.** Composite against the actual ground
|
||||||
|
before measuring contrast, and take "the ink colour" only from fully opaque
|
||||||
|
pixels.
|
||||||
|
|
||||||
So before acting on a number: say what it is a number *of*; confirm the command
|
So before acting on a number: say what it is a number *of*; confirm the command
|
||||||
actually ran and read its exit status; and check it against a second method that
|
actually ran and read its exit status; and check it against a second method that
|
||||||
|
|||||||
+20
-4
@@ -386,11 +386,27 @@ the C.Med-Arb endpoint" until 2026-08-29; C.Med-Arb is off the site.)*
|
|||||||
Q.Arb, which is what med-arb requires. The page says he conducts med-arb and
|
Q.Arb, which is what med-arb requires. The page says he conducts med-arb and
|
||||||
stops."* The section is **rewritten, not edited** — it earned its credibility
|
stops."* The section is **rewritten, not edited** — it earned its credibility
|
||||||
from an incomplete credential and now says what med-arb demands of one
|
from an incomplete credential and now says what med-arb demands of one
|
||||||
neutral and that he holds both designations.
|
neutral. ⚠️ **AND IT NO LONGER RESTATES THE DESIGNATIONS EITHER —
|
||||||
|
2026-09-02, `claims-auditor` D20 pass, finding F.** §Why this practice held a
|
||||||
|
bare `DESIGNATIONS_HELD_LINE` sentence sitting directly beneath §Rules'
|
||||||
|
quotation of ADRIC requiring *"a high level of practitioner competence"*, so
|
||||||
|
the designations read as meeting a bar ADRIC answers with the Chartered
|
||||||
|
Med-Arb — struck from this site entirely. The section now makes **no
|
||||||
|
credential claim at all**; `/about/` publishes them and the JSON-LD carries
|
||||||
|
them. Do not reinstate one here.
|
||||||
5. **The ADRIC Med-Arb Rules**, which this spec did not mention and which exist:
|
5. **The ADRIC Med-Arb Rules**, which this spec did not mention and which exist:
|
||||||
a published rule set, presented to ADRIC's membership at its 2019 annual conference, drafted for domestic
|
~~a published rule set, presented to ADRIC's membership~~ — **CORRECTED
|
||||||
commercial disputes and designed to work with its Mediation and Arbitration
|
2026-09-02, `claims-auditor` D20 pass, finding 6.** The source says a
|
||||||
Rules. Sourced: `docs/reference/adric-rules.md` Finding 2. Quote ADRIC's own
|
**discussion draft** was presented, not the rules; `adric-rules.md` Finding 2
|
||||||
|
records no adoption and no effective date, in deliberate contrast to the
|
||||||
|
Arbitration Rules ("effective March 1, 2025") and the Mediation Rules ("the
|
||||||
|
existing rules remain in effect"). The page was corrected on 2026-09-01 and
|
||||||
|
**this line still instructed the struck form for a day** — the Q.Arb lesson
|
||||||
|
exactly: page fixed, spec still telling the next implementer to write the
|
||||||
|
false version. Write it as **presented to the membership as a discussion
|
||||||
|
draft at ADRIC's 2019 annual conference** — drafted for domestic commercial
|
||||||
|
disputes and designed to work with its Mediation and Arbitration Rules.
|
||||||
|
Sourced: `docs/reference/adric-rules.md` Finding 2. Quote ADRIC's own
|
||||||
framing rather than paraphrasing it, and **keep its superlatives inside the
|
framing rather than paraphrasing it, and **keep its superlatives inside the
|
||||||
quotation marks** — Finding 5 lists the two not to lift.
|
quotation marks** — Finding 5 lists the two not to lift.
|
||||||
|
|
||||||
|
|||||||
+13
-5
@@ -146,7 +146,7 @@ might reasonably treat as privileged. The intake call is for that.
|
|||||||
|
|
||||||
### Consent text
|
### Consent text
|
||||||
|
|
||||||
> I consent to Pouya Lajevardi storing and using the information in this form to
|
> I consent to SML Company Ltd storing and using the information in this form to
|
||||||
> respond to my inquiry and to run a conflicts check. I understand that
|
> respond to my inquiry and to run a conflicts check. I understand that
|
||||||
> submitting this form does not create a retainer, does not appoint a neutral,
|
> submitting this form does not create a retainer, does not appoint a neutral,
|
||||||
> and does not itself establish a mediator–party relationship.
|
> and does not itself establish a mediator–party relationship.
|
||||||
@@ -211,13 +211,21 @@ against this row.
|
|||||||
| `submissionId` | `<uuid>` — **the partition key.** Fixed by the table; the notification email prints this value verbatim so it can be pasted into the console |
|
| `submissionId` | `<uuid>` — **the partition key.** Fixed by the table; the notification email prints this value verbatim so it can be pasted into the console |
|
||||||
| `submittedAt` | `<ISO-8601 timestamp>` — an ordinary attribute, not a sort key |
|
| `submittedAt` | `<ISO-8601 timestamp>` — an ordinary attribute, not a sort key |
|
||||||
| fields | as above |
|
| fields | as above |
|
||||||
| `sourceIp`, `userAgent` | abuse investigation only |
|
| `sourceIp`, `userAgent` | ~~abuse investigation only~~ — ⚠️ **AMENDED 2026-09-02: that purpose holds for `userAgent` and `submittedAt`, and NOT for `sourceIp`.** Behind the `/api/*` behaviour `requestContext.http.sourceIp` is a CloudFront edge, so it identifies the network rather than the sender and cannot serve an abuse investigation. `/legal/privacy/` now states the two purposes separately — timestamp and user-agent for abuse, the address as something that simply arrives with the request. **A spec and a page disagreeing about WHY data is held is the disclosure PIPEDA actually turns on**, and this row said one thing while the page said another for a day. `docs/09` Part 7.2 measures the field; if it holds the reader's own address, this row and that paragraph both change. `adversarial-reviewer`, round 2 |
|
||||||
| `consentAt` | `<ISO-8601 timestamp>` — when the consent box was submitted |
|
| `consentAt` | `<ISO-8601 timestamp>` — when the consent box was submitted |
|
||||||
| `ttl` | epoch seconds — **the input to automatic deletion; see §Retention for why writing it is not the mechanism** |
|
| `ttl` | epoch seconds — **the input to automatic deletion; see §Retention for why writing it is not the mechanism** |
|
||||||
|
|
||||||
**Encryption at rest** with a customer-managed KMS key. **Point-in-time recovery
|
**Encryption at rest** with a customer-managed KMS key. **Point-in-time recovery
|
||||||
on.** Table access limited to the Lambda role and one named administrative
|
on.** ⚠️ **THE THIRD LINE HERE WAS *"table access limited to the Lambda role and
|
||||||
principal.
|
one named administrative principal"*, AND IT WAS THE Q62 FALSEHOOD — struck
|
||||||
|
2026-09-02.** It is false on both halves: `adr-intake-lambda-role` holds
|
||||||
|
`PutItem` **only** and cannot read the table at all, and access is not one
|
||||||
|
principal. **`AGENTS.md` §7's `Intake table — who can read it` row is the answer
|
||||||
|
and this spec does not restate it** — a duplicated fact is one that goes wrong in
|
||||||
|
the copy nobody re-reads, which is what happened here: the Q62 sweep ran over
|
||||||
|
`src/` and never reached a spec, and `check:claims` carries this exact sentence
|
||||||
|
as a string that reached `dist/`. It survived the sweep this file's own
|
||||||
|
definition-of-done claims to have completed (`adversarial-reviewer`, round 2).
|
||||||
|
|
||||||
⚠️ **TWO OF THOSE THREE ARE THE STATE OF THE RUNNING TABLE AND ONE IS NOT.**
|
⚠️ **TWO OF THOSE THREE ARE THE STATE OF THE RUNNING TABLE AND ONE IS NOT.**
|
||||||
PITR is **on** `[verified 2026-09-01 — describe-continuous-backups,
|
PITR is **on** `[verified 2026-09-01 — describe-continuous-backups,
|
||||||
@@ -446,7 +454,7 @@ Plausible or Fathom, cookieless, no consent banner.
|
|||||||
- [ ] **TTL set and verified by test record.** ⚠️ **THIS ONE BACKS A PUBLISHED PROMISE.** `/legal/privacy/` states that records are deleted automatically after 24 months, and it asserts the **mechanism**, not only the period. The handler writes the `ttl` attribute — epoch seconds, 24 months, confirmed against this spec `[verified 2026-08-31]` — and **writing the attribute is not the mechanism**: TTL must also be enabled on the table, which is a table setting the code cannot see. **`AGENTS.md` §7 holds that status and its stamp; this line does not restate it** — it restated it once, went stale within the day, and had to be pulled back (§12 R19). **The test record is what closes this item, not the status:** `ENABLED` proves the setting, a record written with a near-future `ttl` and observed to vanish proves the behaviour. Tracked as §9 Q60
|
- [ ] **TTL set and verified by test record.** ⚠️ **THIS ONE BACKS A PUBLISHED PROMISE.** `/legal/privacy/` states that records are deleted automatically after 24 months, and it asserts the **mechanism**, not only the period. The handler writes the `ttl` attribute — epoch seconds, 24 months, confirmed against this spec `[verified 2026-08-31]` — and **writing the attribute is not the mechanism**: TTL must also be enabled on the table, which is a table setting the code cannot see. **`AGENTS.md` §7 holds that status and its stamp; this line does not restate it** — it restated it once, went stale within the day, and had to be pulled back (§12 R19). **The test record is what closes this item, not the status:** `ENABLED` proves the setting, a record written with a near-future `ttl` and observed to vanish proves the behaviour. Tracked as §9 Q60
|
||||||
- [x] **PITR enabled** — `ENABLED`, 35-day window `[verified 2026-09-01 — describe-continuous-backups]`
|
- [x] **PITR enabled** — `ENABLED`, 35-day window `[verified 2026-09-01 — describe-continuous-backups]`
|
||||||
- [ ] KMS customer-managed key. **Not on the table: encryption at rest is with the AWS-owned key** `[verified 2026-09-01 — describe-table returns no SSEDescription]`. **Not claimed on `/legal/privacy/`** — the page says "encrypted at rest", which is unconditionally true of every DynamoDB table and does not mention a customer-managed key, so nothing published depends on it. An improvement, not a blocker
|
- [ ] KMS customer-managed key. **Not on the table: encryption at rest is with the AWS-owned key** `[verified 2026-09-01 — describe-table returns no SSEDescription]`. **Not claimed on `/legal/privacy/`** — the page says "encrypted at rest", which is unconditionally true of every DynamoDB table and does not mention a customer-managed key, so nothing published depends on it. An improvement, not a blocker
|
||||||
- [ ] **Table access matches what `/legal/privacy/` says about it.** ⚠️ **IT DOES NOT, AS AT 2026-09-01.** The page says *"nobody else has access to the table… no external administrator"*; the account's `admins` group carries `AdministratorAccess` and has **two** members, and `simulate-principal-policy` returns **allowed** for `dynamodb:GetItem`/`Query`/`Scan` for both. Evidence and commands: `docs/reference/intake-table-access-verification.md`. §9 **Q62**, and it blocks that page going public
|
- [x] ✅ **Table access matches what `/legal/privacy/` says about it — 2026-09-02.** **The access is unchanged; the page now states it.** Pouya ruled *state the truth* rather than *remove the access* (§9 Q62), so the page states the truth about access rather than a false exclusivity. ⚠️ **WHAT IT STATES CHANGED TWICE MORE THAT DAY AND THIS LINE IS WRITTEN AGAINST THE SHIPPED BYTES, NOT AGAINST THE RULING.** §9 Q63 took the human headcount off (a simulation counts identities and the page was reading them as people), and a second ruling then cut §Who can see it to **four plain statements**. The page now says: *"The record in the table: me, and the small number of people who administer the account it sits in with me"*; that the receiving system *"can only add a record — it cannot read back what is stored"*; where the notification goes and who reads it; and that the confirmation sits with the reader's own provider. **§Where it is stored carries the shared-account disclosure** — *"an Amazon Web Services account that also runs systems unrelated to this practice"*. ⚠️ **`adr-sml-deploy` is `implicitDeny` on all seven read AND write actions — MEASURED, TRUE, AND NO LONGER ON THE PAGE**; it went with the mechanics cut and it is §7's claim now, not the policy's. Do not tick this item against a page that states it. Evidence and commands: `docs/reference/intake-table-access-verification.md`, whose enumeration was **extended on 2026-09-02** — the original screened roles by `list-attached-role-policies` alone, missing that 23 of 26 non-service-linked roles carry inline policies and that the two CDK `lookup` roles can read the table. Four roles can, not two; every one of them is reachable only by those administrators. ⚠️ **Do not restate that as a count of PEOPLE** — this line said *"all four terminate at the same two people"* until 2026-09-02, which is the inference §9 Q63 struck. ⚠️ **THIS LINE SAID "IT DOES NOT" FOR A DAY AFTER THE PAGE WAS CORRECTED, AND IT IS A DEFINITION-OF-DONE LIST SOMEONE FOLLOWS AT CUTOVER** — the Q62 sweep was run over `src/` only, so it could not reach a spec. `adversarial-reviewer`, round 1. The sweep across `docs/` is in the Change Log entry
|
||||||
- [ ] Both emails send; SPF/DKIM/DMARC aligned; inbox-tested, not spam-tested
|
- [ ] Both emails send; SPF/DKIM/DMARC aligned; inbox-tested, not spam-tested
|
||||||
- [ ] **CloudWatch alarms on Lambda `Errors` and API Gateway `5xx`** — replacing the DLQ item, which is struck: a DLQ on a **synchronously** invoked function never receives anything, so the alarm on its depth would have been permanently green. See §Notification. The handler writes to DynamoDB **before** sending mail, so the protection this item was pointing at is in the code rather than in a queue
|
- [ ] **CloudWatch alarms on Lambda `Errors` and API Gateway `5xx`** — replacing the DLQ item, which is struck: a DLQ on a **synchronously** invoked function never receives anything, so the alarm on its depth would have been permanently green. See §Notification. The handler writes to DynamoDB **before** sending mail, so the protection this item was pointing at is in the code rather than in a queue
|
||||||
- [x] **Form usable by keyboard only.** Errors are announced by the browser's own validation, which with no script is the only thing that can announce them inline — `role="alert"` needs a live region and something to write into it
|
- [x] **Form usable by keyboard only.** Errors are announced by the browser's own validation, which with no script is the only thing that can announce them inline — `role="alert"` needs a live region and something to write into it
|
||||||
|
|||||||
+428
-23
@@ -395,19 +395,194 @@ Then invalidate `/*`.
|
|||||||
> reversing them puts 22 of 23 pages behind a 403 for as long as a CloudFront
|
> reversing them puts 22 of 23 pages behind a 403 for as long as a CloudFront
|
||||||
> deployment takes.
|
> deployment takes.
|
||||||
|
|
||||||
> 🛑 **THREE THINGS BLOCK THIS ENTIRE LIST AS AT 2026-09-01, AND TWO OF THEM WERE
|
> ✅ **CUTOVER EXECUTED 2026-09-02 — THE SITE IS LIVE AT `https://adr.smlcompany.ca`.**
|
||||||
> FOUND BY READING THE RUNNING SYSTEM RATHER THAN THE SPECS.**
|
> Deployed by Pouya from this machine via `scripts/deploy-local.sh` with the
|
||||||
|
> `adr-sml-deploy` credential. **Verified independently the same day rather than
|
||||||
|
> transcribed**, 26 routes with the iteration count asserted (a `for r in $VAR`
|
||||||
|
> loop ran ONCE first — the zsh trap `CLAUDE.md` records, caught by the count):
|
||||||
|
> all 22 pages, `robots.txt`, `sitemap-index.xml` and the bio PDF return **200**;
|
||||||
|
> an unknown path returns **404** and serves the styled Astro page, 14,321 B, not
|
||||||
|
> S3's XML. HTML carries `max-age=0, must-revalidate`, `_astro` assets
|
||||||
|
> `max-age=31536000, immutable`, and the PDF is **89,496 B**, matching `public/`
|
||||||
|
> exactly. **All 22 live pages are byte-identical to a local `dist/` rebuilt at
|
||||||
|
> `67847d9`** — SHA-256 compared page by page, 22 same / 0 differ / 0 errors. The
|
||||||
|
> five `noindex` surfaces and the 17-URL sitemap are correct.
|
||||||
>
|
>
|
||||||
> 1. **`/legal/privacy/` states something false about who can read the intake
|
> 🛑 **BUT THIS LIST WAS NOT CLEAN WHEN THE SITE PUBLISHED, AND THAT IS THE
|
||||||
> table** — §9 **Q62**, evidence in
|
> RECORD, NOT A REPROACH. THREE BLOCKING ITEMS WERE OPEN AT THE MOMENT OF
|
||||||
> `docs/reference/intake-table-access-verification.md`. A privacy policy is
|
> CUTOVER AND TWO STILL ARE.** D11 is a single shot and the checklist exists
|
||||||
> the wrong page to be wrong on, and this one is wrong about third parties'
|
> because of it; a launch that crosses its own gates should be legible as one
|
||||||
> dispute information.
|
> afterwards rather than smoothed over. **What follows is the state as at
|
||||||
> 2. **Q60 is still open** — TTL is `ENABLED` and no record has been watched to
|
> 2026-09-02, after the D20 pass ran against the shipped bytes.**
|
||||||
> disappear, and the same page asserts the mechanism. `docs/09` Part 10 is the
|
>
|
||||||
> test and its answer arrives days after it starts, so **start it early**.
|
> ✅ **THE READ-THROUGH IS COMPLETE — Pouya, 2026-09-02, and it returned ONE
|
||||||
> 3. **`claims-auditor`'s D20 pass returned six copy findings on 2026-09-01;
|
> FINDING WHICH WAS NOT COPY.** `public/favicon.ico` shipped with no
|
||||||
> five are corrected and one is a ruling** — the `/med-arb/` gloss, below.
|
> transparency; fixed and verified the same day (see **Favicon set complete**
|
||||||
|
> below). His read carried the approvals with it, in terms: the
|
||||||
|
> `/legal/privacy/` §Who can see it wording, the **SML Company Ltd** consent
|
||||||
|
> line, and `/med-arb/` **as shipped**. That discharges blocker 2 and every
|
||||||
|
> wording sign-off that had been routed into it.
|
||||||
|
>
|
||||||
|
> ⚠️ **THE COUNT WENT UP, AND THAT IS THE FIRST TIME IT HAS — READ THE REASON,
|
||||||
|
> NOT THE NUMBER.** It read ONE for part of 2026-09-02 because an approval had
|
||||||
|
> gone **missing**; it then read ONE because the pass that approval was routed
|
||||||
|
> into had been **done**; it now reads **THREE**, because the site published and
|
||||||
|
> the D20 pass then ran against the shipped bytes and returned **FAIL**. Every
|
||||||
|
> earlier move in this note was a tally shrinking for a reason a tally could not
|
||||||
|
> show. This one grew, and the lesson is the same in the other direction: **the
|
||||||
|
> list did not get worse, the measurement finally happened.** Two of the three
|
||||||
|
> were true before cutover and unmeasured; one was invisible by construction.
|
||||||
|
>
|
||||||
|
> ⚠️ *(The count has moved repeatedly in one day and the DIRECTION is the only
|
||||||
|
> part worth reading — the number of moves is deliberately not stated, because a
|
||||||
|
> tally of how often a tally changed is the same trap one level up. It said ONE for part of 2026-09-02 and that was a
|
||||||
|
> **defect** — the wording approval Pouya reserved had been recorded only inside
|
||||||
|
> records marked closed, the `TODO(pouya)` deleted, Q62 struck, this callout
|
||||||
|
> ticked, so nothing would have stopped unapproved copy publishing
|
||||||
|
> (`adversarial-reviewer`, D20 pass round 1). Q63 was then **answered** in three
|
||||||
|
> limbs by ruling, which is a gate closed by an answer rather than by deletion —
|
||||||
|
> and answering it **opened Q64**, one paragraph lower on the same page. Q64 then
|
||||||
|
> left the list a **third** way: **the paragraph it was about was deleted**, so
|
||||||
|
> the question is moot rather than answered. **Closed, deleted, and moot look
|
||||||
|
> identical in a count and nowhere else, which is why the count is never the
|
||||||
|
> record.** The second slot is no longer a question at all — it is the human
|
||||||
|
> pass, promoted here from the checklist below because that is where the last
|
||||||
|
> reserved approval went missing.)*
|
||||||
|
>
|
||||||
|
> 1. 🛑 **Q60 — the retention MECHANISM has still not been observed, AND
|
||||||
|
> `/legal/privacy/` PUBLISHED ANYWAY.** TTL is `ENABLED` and no record has been
|
||||||
|
> watched to disappear, and the page asserts the **mechanism**, not merely the
|
||||||
|
> period. `docs/09` Part 10 is the test; earliest useful reading **48 hours**
|
||||||
|
> after the record is written, failure not called before **7 days** — Pouya
|
||||||
|
> started the window 2026-09-02, so **check from 2026-09-04**.
|
||||||
|
> ⚠️ **THE PAGE CARRIED ITS OWN INSTRUCTION NOT TO DO THIS AND IT WAS
|
||||||
|
> INVISIBLE AT DEPLOY TIME.** `src/pages/legal/privacy.astro:229` holds a live
|
||||||
|
> `TODO(pouya)` ending, in terms: *"This page must not go public until a
|
||||||
|
> deletion has actually been seen."* It is a **JSX comment**, so Astro strips
|
||||||
|
> it and it never reaches `dist/` — which is exactly why `check:claims`, the
|
||||||
|
> build and both deploy paths were all green over it. **A publication gate
|
||||||
|
> that lives only in a stripped comment is not a gate.** The checklist item
|
||||||
|
> *"No `TODO(pouya)` remains in any shipped page"* below is the control that
|
||||||
|
> would have caught it and it was never ticked.
|
||||||
|
> 2. 🛑 **THE INTAKE FORM IS LIVE AND BROKEN — a submitter gets a blank page.**
|
||||||
|
> `/contact/` ships `<form method="post" action="/api/intake">`; **`POST
|
||||||
|
> /api/intake` returns HTTP 403 with `content-length: 0`** and an
|
||||||
|
> `apigw-requestid` header, so the request reaches API Gateway and is rejected
|
||||||
|
> because the only route is `POST /submissions` (§7). No styled error, no
|
||||||
|
> message, no fallback. Measured against production 2026-09-02. `docs/09`
|
||||||
|
> Part 6 is the fix; Pouya has the end-to-end test in progress.
|
||||||
|
> ⚠️ **AND `/legal/privacy/` AND `/contact/received/` BOTH DESCRIBE THAT
|
||||||
|
> MECHANISM AS RUNNING** — *"Two emails are sent when you submit the form"* and
|
||||||
|
> *"A confirmation goes to the email address you gave"*. Nothing is sent,
|
||||||
|
> because nothing can be submitted. Found by the D20 pass; see item 3.
|
||||||
|
> 3. 🛑 **THE D20 CLAIMS PASS HAS NOW RUN AGAINST THE SHIPPED BYTES AND RETURNED
|
||||||
|
> FAIL — 20 CONFIRMED FINDINGS ON LIVE PAGES.** Run 2026-09-02 at `67847d9`,
|
||||||
|
> after cutover, over all 23 built pages: 13 auditors (8 page groups + 5
|
||||||
|
> cross-cutting lenses) → 41 raw findings → 31 distinct → each adversarially
|
||||||
|
> verified by an independent `claims-auditor` instructed to refute it. **20
|
||||||
|
> CONFIRMED, 11 REFUTED**, plus 13 further findings from two completeness
|
||||||
|
> critics. See the **`claims-auditor`** item below for the breakdown, and
|
||||||
|
> `AGENTS.md`'s Change Log entry of 2026-09-02 (ar) for the full list.
|
||||||
|
> **Nothing here is a claim about Pouya, his credentials or his designations —
|
||||||
|
> every one of those traced, for the third pass running.** The failures are
|
||||||
|
> over-reaches in glosses on sourced legal material, and disclosures on
|
||||||
|
> `/legal/privacy/` and `/contact/received/` that describe a backend which is
|
||||||
|
> not deployed.
|
||||||
|
> 4. ✅ **DONE 2026-09-02 — Pouya read every page against `AGENTS.md` §4.** The
|
||||||
|
> human pass, the other half of D20 and not delegable. It was also where the
|
||||||
|
> §Who can see it approval was routed, and his ruling that the read-through
|
||||||
|
> *is* the approval means that sign-off is now discharged rather than
|
||||||
|
> pending. **Sole finding: the favicon's opaque ground.** No copy finding on
|
||||||
|
> any of the 23 pages.
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — Q64, MOOT.** It asked whether anyone else holds the
|
||||||
|
> AWS root password or its MFA device, because the page published *"has no
|
||||||
|
> programmatic key, and I hold it"* one paragraph below *"the small number of
|
||||||
|
> people who administer it with me"*, where a reader takes it as **sole**
|
||||||
|
> custody. **Pouya's second ruling that day deleted the sentence** — the section
|
||||||
|
> is now four plain statements and says nothing about root — so the question no
|
||||||
|
> longer gates anything. ⚠️ **The underlying fact is unchanged and unestablished:
|
||||||
|
> §7 records root as *held by Pouya*, which is not *held only by Pouya*, and
|
||||||
|
> nothing measured can settle it. Nothing may be published about root custody
|
||||||
|
> without asking again.**
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — Q63, all three limbs, by ruling.** **(a)** The §Who
|
||||||
|
> can see it wording is **approved with two trims** — the editorial closing
|
||||||
|
> sentence struck, and the mailbox clause rewritten per (b). **(b)**
|
||||||
|
> `info@smlcompany.ca` is a **delegated mailbox read by Pouya and by
|
||||||
|
> administrative staff**, and the page now says so instead of *"anyone who can
|
||||||
|
> reach that mailbox"*. **(c)** The account **root credential is held by Pouya**;
|
||||||
|
> it has no programmatic key and MFA is on, and the page now states the first two
|
||||||
|
> of those. ⚠️ **AND THE ANSWER CHANGED THE HEADLINE SENTENCE:** Pouya's
|
||||||
|
> attestation is that *"two people is an exaggeration… a handful is accurate"*,
|
||||||
|
> because **the simulation counts identities and the page was reading them as
|
||||||
|
> humans**. No numeric human headcount ships; the page attributes read access to
|
||||||
|
> *"the account's administrators — me, and the small number of people who
|
||||||
|
> administer it with me"*. §12 **R21** is re-scoped to match.
|
||||||
|
> ⚠️ *(Superseded the same day in its details, not in its rulings: the ruling
|
||||||
|
> below cut the section to four plain statements, so the sentence quoted above is
|
||||||
|
> no longer the shipped one and root is not mentioned at all. Each limb of Q63
|
||||||
|
> still stands — no headcount, the mailbox named, root attested in §7.)*
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — THE SECTION IS GENERIC, by a second ruling the same
|
||||||
|
> day.** *"It over-explains technical mechanics that belong in the evidence file,
|
||||||
|
> not in front of an inquirer."* §Who can see it is now **four short statements**
|
||||||
|
> — who can read it, that the receiving system can only add a record, where the
|
||||||
|
> notification goes and who reads it, and that the confirmation sits with the
|
||||||
|
> reader's own provider. **Deleted from §Who can see it:** the measurement
|
||||||
|
> paragraph, the root-credential sentence, the single-sign-on and federated-
|
||||||
|
> login enumeration, the resource-policy clause, the *"company that runs a
|
||||||
|
> database"* aside, the deploy-credential sentence and the three-copies
|
||||||
|
> summary. ⚠️ **THE SHARED-ACCOUNT CLAUSE WAS CUT WITH THEM AND THEN RESTORED
|
||||||
|
> — to §Where it is stored, where it belongs.** It is a storage disclosure
|
||||||
|
> rather than mechanics, the ruling did not name it, and without it no page
|
||||||
|
> told a reader their intake sits in an account that also runs unrelated
|
||||||
|
> systems (`adversarial-reviewer`, round 1). **These lists must stay identical
|
||||||
|
> — there were four of them and they named four different sets.** **None of
|
||||||
|
> that verified
|
||||||
|
> material was lost** — all of it stays in `AGENTS.md` §7 and
|
||||||
|
> `docs/reference/intake-table-access-verification.md`, and the section comment in
|
||||||
|
> `src/pages/legal/privacy.astro` bars restoring it to the page. **The risk moved
|
||||||
|
> in the right direction:** every deleted sentence was a claim about a system
|
||||||
|
> outside this repository that nothing reports on, which is what §12 **R21**
|
||||||
|
> exists for — R21 is re-scoped from five live claims to two.
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — THE CONSENT STRING NAMES THE CORPORATION.** *"I
|
||||||
|
> consent to **SML Company Ltd** storing and using the information in this
|
||||||
|
> form…"*, per ruling, replacing the natural person. It is the one sentence a
|
||||||
|
> submitter actually agrees to and it is the PIPEDA basis, and the policy it
|
||||||
|
> links to describes a mailbox read by administrative staff — a corporation is
|
||||||
|
> the party that matches, and `/legal/privacy/` now names it in terms under §Why
|
||||||
|
> it is collected. **The NAME ONLY:**
|
||||||
|
> §4 verifies the federal incorporation, records it as *not published*, and
|
||||||
|
> cautions that it must never be read beside the licence-status row. `docs/05`
|
||||||
|
> §Consent text carries the string verbatim and moved with it.
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — Q62.** `/legal/privacy/` no longer states anything
|
||||||
|
> false about who can read the intake table. Pouya's ruling was **state the
|
||||||
|
> truth**, not remove the second administrator's access: the page attributes read
|
||||||
|
> access to the account's administrators and names their role. *(It said "two
|
||||||
|
> people can read it" until the Q63 ruling later the same day replaced the count,
|
||||||
|
> and the ruling after that cut the section to four plain statements — of the two
|
||||||
|
> stronger facts this entry originally credited it with, the writing function's
|
||||||
|
> add-only access still ships and the deploy credential's lack of access does
|
||||||
|
> not. See the two blocks above.)* The
|
||||||
|
> `sole-administrator-q62` tripwire in `check-claims.mjs` **stays permanently**
|
||||||
|
> by the same ruling, extended from two alternatives to **five**: the clause the
|
||||||
|
> first form could not see two sections up the same page, the summary that would
|
||||||
|
> have re-asserted the struck number four lines below the corrected paragraph,
|
||||||
|
> and the sentence that carried the false count. Proven both ways against the
|
||||||
|
> pre-correction page rebuilt from `bd282aa` — **exit 1 with 5 matches**, exit 0
|
||||||
|
> on the corrected page, and **re-proven both ways after the Q63 rewrite**, same
|
||||||
|
> 5 matches at the same lines.
|
||||||
|
>
|
||||||
|
> ✅ **CLOSED 2026-09-02 — the `/med-arb/` gloss.** Struck, with no replacement
|
||||||
|
> and no competence claim, per ruling; **ratified as shipped** on 2026-09-02 with
|
||||||
|
> no credential line restored. **Pouya's note, recorded because it is the reason
|
||||||
|
> and not a detail: med-arb is a service he provides, not a designation.** That is
|
||||||
|
> what makes the struck gloss unrecoverable rather than merely unsourced — there
|
||||||
|
> is no designation to cite for it. The ADRIC-sourced material carries the
|
||||||
|
> section.
|
||||||
|
|
||||||
**Cutover prep — deferred maintenance, done BEFORE the checklist below**
|
**Cutover prep — deferred maintenance, done BEFORE the checklist below**
|
||||||
|
|
||||||
@@ -464,10 +639,70 @@ the decision is re-readable rather than re-litigated.
|
|||||||
instruments its extract checked — and its own note then disclaimed that
|
instruments its extract checked — and its own note then disclaimed that
|
||||||
conclusion as the Commissioner's words; `/med-arb/` said the ADRIC Med-Arb
|
conclusion as the Commissioner's words; `/med-arb/` said the ADRIC Med-Arb
|
||||||
Rules were presented to the membership where the source says a **discussion
|
Rules were presented to the membership where the source says a **discussion
|
||||||
draft** was). Three remain and each has its own item below or above:
|
draft** was). ✅ **Two of the three remaining were ruled and closed
|
||||||
the `/med-arb/` gloss (a ruling), Q60, and Q62.
|
2026-09-02** — Q62 (the page now states the measured truth) and the
|
||||||
|
`/med-arb/` gloss (struck, no replacement).
|
||||||
|
|
||||||
**Two things about that result are worth carrying forward.** The pass found
|
⚠️ **AND THE PASS WAS RE-RUN OVER THOSE TWO FIXES ON 2026-09-02, WHICH IS
|
||||||
|
WHAT MAKES THE ITEM CLOSEABLE — IT RETURNED FAIL WITH EIGHT MORE.** This is
|
||||||
|
the same pass completing, not a per-step audit reinstated: a FAIL whose
|
||||||
|
fixes are never re-audited leaves *"findings resolved"* asserted rather than
|
||||||
|
checked. **Five of the eight were in the fixes themselves** — the
|
||||||
|
replacement copy reintroduced an absolute third-party negative of the
|
||||||
|
shape struck from this page on 2026-08-31, claimed an enumeration the
|
||||||
|
evidence file did not support, asserted *"the one other place a copy
|
||||||
|
exists"* when the inquirer's confirmation carries the whole submission,
|
||||||
|
left `LAST_UPDATED` at 31 August on the change set that rewrote the page's
|
||||||
|
central disclosure, and left *"your IP address"* standing when `docs/09`
|
||||||
|
Part 7.2 had said in terms to fold it into the Q62 edit. Two were on
|
||||||
|
`/med-arb/`: the struck gloss left *"the section above"* pointing at the
|
||||||
|
ADRIC rule set and *"the agreement"* with no antecedent, and the bare
|
||||||
|
designations line was left sitting directly under ADRIC's competence
|
||||||
|
quotation. One was declined with a reason (§Rules' heading — see the
|
||||||
|
Change Log). **All corrected or declined; the pass is clean on findings
|
||||||
|
and the item is open only on the human halves above.**
|
||||||
|
|
||||||
|
🛑 **AND IT HAS NOW RUN A THIRD TIME — 2026-09-02, AFTER CUTOVER, AGAINST
|
||||||
|
THE BYTES THAT ACTUALLY SHIP — AND RETURNED FAIL WITH 20 CONFIRMED
|
||||||
|
FINDINGS. THIS ITEM STAYS UNTICKED.** The two runs above predate the
|
||||||
|
Q62/Q63 privacy rewrite, the `/med-arb/` strike and the consent change, so
|
||||||
|
neither had seen the shipped copy. This one did: all 22 live pages were
|
||||||
|
confirmed **byte-identical** to a `dist/` rebuilt at `67847d9` before the
|
||||||
|
audit began, and the auditors read a parse5 extraction of the visitor text
|
||||||
|
and JSON-LD of all 23 pages, validated against known shipped strings first.
|
||||||
|
**13 auditors — 8 page groups and 5 cross-cutting lenses (adjacency,
|
||||||
|
gloss-vs-source, structured data, licensure, §4 Forbidden) — returned 41
|
||||||
|
raw findings, deduped to 31, each then handed to an independent
|
||||||
|
`claims-auditor` instructed to REFUTE it. 20 confirmed, 11 refuted.** Two
|
||||||
|
completeness critics added 13 more. Full list: `AGENTS.md` Change Log
|
||||||
|
2026-09-02 (ar).
|
||||||
|
|
||||||
|
**The shape of the 20, because it is the same shape as run 2 and that is
|
||||||
|
the finding about the process rather than the pages.** Not one is a claim
|
||||||
|
about Pouya, his credentials, his designations, his memberships or the
|
||||||
|
boutique — **the credential spine has now traced clean three passes
|
||||||
|
running**, and D16, D13 and the Forbidden table were swept with every hit
|
||||||
|
printed and read. What failed is two classes: **glosses that assert more
|
||||||
|
than their committed extract establishes** (`/practice/energy/` calling the
|
||||||
|
IESO process six stages where the source says *"up to six"*;
|
||||||
|
`/practice/construction/` stating the 30-day adjudication deadline without
|
||||||
|
its *"Subject to subsection (2)"* extension; `/practice/technology/`
|
||||||
|
asserting Ontario *"has one AI instrument"*), and **disclosures describing a
|
||||||
|
backend that is not deployed** (`/legal/privacy/` on retention and on the
|
||||||
|
two emails, `/contact/received/` on the confirmation). The second class is
|
||||||
|
not a wording problem: it is the privacy policy of a live site describing a
|
||||||
|
mechanism that cannot run, which is the defect class `AGENTS.md` Q22 named.
|
||||||
|
|
||||||
|
⚠️ **AND THE PASS RAN AFTER THE SITE PUBLISHED, WHICH IS THE ONE THING D20
|
||||||
|
RESTED ON AND NO LONGER HAS.** D20's reasoning is explicit that deferring
|
||||||
|
the claims pass is safe because *"nothing has shipped and there is no public
|
||||||
|
site, so every claims finding to date has been about a page no visitor can
|
||||||
|
reach."* That premise expired at cutover. It is recorded here rather than
|
||||||
|
argued: whether D20 needs amending is Pouya's call, and the honest version
|
||||||
|
of the trade is that the deferral bought nine build steps of speed and the
|
||||||
|
bill came due on a live page.
|
||||||
|
|
||||||
|
**Two things about the earlier result are worth carrying forward.** The pass found
|
||||||
no defect in any claim about Pouya, his credentials or his designations —
|
no defect in any claim about Pouya, his credentials or his designations —
|
||||||
every one traced. What it found was **five over-reaches in glosses on
|
every one traced. What it found was **five over-reaches in glosses on
|
||||||
sourced legal material**, which is the failure mode a per-step claims run on
|
sourced legal material**, which is the failure mode a per-step claims run on
|
||||||
@@ -478,11 +713,116 @@ the decision is re-readable rather than re-litigated.
|
|||||||
have flagged correct copy and demanded the struck form. It read §4 instead.
|
have flagged correct copy and demanded the struck form. It read §4 instead.
|
||||||
That is the fifth stale claim found in that file and it is not the agent's
|
That is the fifth stale claim found in that file and it is not the agent's
|
||||||
to fix
|
to fix
|
||||||
- [ ] **Pouya has read every page against `AGENTS.md` §4.** The human pass. It is
|
- [x] ✅ **THE §Who can see it WORDING APPROVAL IS DISCHARGED — Pouya's ruling,
|
||||||
the other half of D20 and it is not delegable — his reading is what the
|
2026-09-02: *"the read-through is the approval."*** Q62 settled what the
|
||||||
per-step audit was traded for.
|
section must **say** and he reserved the **wording**; he then ruled twice on
|
||||||
- [ ] **Memberships RE-CONFIRMED AGAIN, on the day of cutover** — `AGENTS.md`
|
it the same day — Q63(a) approving with two trims, and the second ruling
|
||||||
§12 **R10**, which is now an **event trigger and cutover is one of its two
|
cutting the section to four plain statements — and directed in terms that
|
||||||
|
nothing be held open waiting on a separate sign-off. ⚠️ **THIS TICK IS NOT
|
||||||
|
"THE TEXT HAS BEEN READ".** It records that the reserved approval has
|
||||||
|
**moved**, to the read-through blocker in the callout above and the item
|
||||||
|
below. Two ticked boxes stood here for one round — one for the ruling, one
|
||||||
|
for the text — because a single tick over changed copy is how an approval
|
||||||
|
requirement went missing the first time (`adversarial-reviewer`, round 2).
|
||||||
|
They collapse into this one only because the ruling collapsed them, and
|
||||||
|
the gate did not disappear: **it is blocker 2 in the callout above**, which
|
||||||
|
is the most-read place on this page rather than the least.
|
||||||
|
- [x] ✅ **CLOSED 2026-09-02 — Q64 IS MOOT: THE PARAGRAPH WAS DELETED.** It asked
|
||||||
|
whether anyone else holds the AWS root password or its MFA device, because
|
||||||
|
`/legal/privacy/` published *"has no programmatic key, and I hold it"* one
|
||||||
|
paragraph below *"the small number of people who administer it with me"* —
|
||||||
|
where a reader takes it as **sole** custody, which nothing establishes.
|
||||||
|
Pouya's second ruling that day struck the sentence along with the rest of
|
||||||
|
the mechanics, so no page says anything about root and the question gates
|
||||||
|
nothing. The `TODO(pouya)` is gone from
|
||||||
|
`src/pages/legal/privacy.astro` with the paragraph that carried it.
|
||||||
|
⚠️ **THE FACT IS STILL UNESTABLISHED AND THAT DID NOT CHANGE.** §7 records
|
||||||
|
root as *held by Pouya*, which is not *held only by Pouya*; root is not an
|
||||||
|
IAM principal and cannot be simulated. **Nothing about root custody may be
|
||||||
|
published without asking him again** — the section comment in the page
|
||||||
|
source carries that bar, because "we deleted it" and "we checked it" are
|
||||||
|
the same green tick from three weeks away.
|
||||||
|
- [x] ✅ **Q63(b) ANSWERED 2026-09-02 — `info@smlcompany.ca` is a DELEGATED
|
||||||
|
MAILBOX: Pouya and administrative staff read it.** The page said *"anyone
|
||||||
|
who can reach that mailbox"*, which was true either way and answered the
|
||||||
|
mail half of the question on a lower standard than the table half. It now
|
||||||
|
states who reads it. The fact is in `AGENTS.md` §7 and **§12 R21's trigger
|
||||||
|
covers it** — like the AWS enumeration, nothing reports when a delegation
|
||||||
|
changes. ⚠️ **The answer reached FOUR sentences, not the one the question
|
||||||
|
named** — §Where it is stored twice, §How long it is kept once, §Who can
|
||||||
|
see it once — because *"my mailbox"* had been written as a personal one
|
||||||
|
throughout. That is the fifth partial sweep on this page's who-can-see-it
|
||||||
|
set; the section comment in `src/pages/legal/privacy.astro` enumerates
|
||||||
|
them **by opening phrase rather than by count** — deliberately, because the
|
||||||
|
count has been wrong twice, and this line carried "eight" for a round after
|
||||||
|
the comment itself had been corrected to nine (`adversarial-reviewer`,
|
||||||
|
round 2). Read the list, not a number
|
||||||
|
- [x] ✅ **DONE 2026-09-02 — Pouya has read every page against `AGENTS.md` §4.**
|
||||||
|
The human pass, the other half of D20 and not delegable — his reading is
|
||||||
|
what the per-step audit was traded for. **It returned one finding across 23
|
||||||
|
pages and that finding was not copy:** the favicon shipped with an opaque
|
||||||
|
cream ground. **The `/legal/privacy/` §Who can see it wording, the
|
||||||
|
SML Company Ltd consent line and `/med-arb/` as shipped are approved by
|
||||||
|
this read**, per his ruling that the read-through *is* the approval.
|
||||||
|
⚠️ **This does NOT discharge `claims-auditor`'s cutover pass**, which is a
|
||||||
|
separate item on this list: D20 traded the per-step machine audit for the
|
||||||
|
human pass **plus** one machine pass over the finished site, and one of
|
||||||
|
those two has now happened.
|
||||||
|
~~⚠️ **START WITH `/legal/privacy/` §Who can see it. IT IS BLOCKER 2 IN THE
|
||||||
|
CALLOUT ABOVE, AND THIS READ *IS* THE APPROVAL**~~ — **struck 2026-09-02:
|
||||||
|
the pass is DONE, and an unstruck imperative on a ticked item told an
|
||||||
|
operator to begin a read this page also records as finished, pointing at a
|
||||||
|
blocker that no longer exists** (`adversarial-reviewer`, round 2). What it
|
||||||
|
said remains true of what happened: Pouya ruled on
|
||||||
|
2026-09-02 that nothing waits on a separate wording sign-off, and he read
|
||||||
|
§Who can see it first. Every
|
||||||
|
sentence in it changed three times that day — Q62's ruling, Q63's, then the
|
||||||
|
ruling that cut it to **four plain statements** — and it is the only
|
||||||
|
section on the site whose subject lives entirely outside this repository.
|
||||||
|
**It is now four sentences and should take a minute**; that is the point of
|
||||||
|
the cut. The verified material behind them is in
|
||||||
|
`docs/reference/intake-table-access-verification.md` and `AGENTS.md` §7 if
|
||||||
|
he wants to check any of it, and **the page deliberately no longer cites
|
||||||
|
it**.
|
||||||
|
**Then read the two `/contact/` sentences against it, which is a judgement
|
||||||
|
rather than a defect** — `/contact/received/` says *"email me directly at
|
||||||
|
`info@smlcompany.ca` — that reaches me whether or not the receipt did"* and
|
||||||
|
`/contact/` says *"Send the form below, or email me directly"*. **Neither is
|
||||||
|
false and neither asserts exclusivity**; the mail does reach him. But
|
||||||
|
`/legal/privacy/` now discloses that administrative staff read that mailbox,
|
||||||
|
and a party who has just been told to send dispute detail *"directly"* to
|
||||||
|
the neutral may take more from the word than is true. A sweep of all 23
|
||||||
|
built pages found these two as the only other surfaces touching the point.
|
||||||
|
Raised as **consider**, not blocking, by `adversarial-reviewer` round 1.
|
||||||
|
✅ **THE THIRD SURFACE IS DECIDED — the CONSENT string now names the
|
||||||
|
corporation.** *"I consent to **SML Company Ltd** storing and using the
|
||||||
|
information in this form…"*, Pouya's ruling 2026-09-02, replacing the
|
||||||
|
natural person. It is the one sentence a submitter actually agrees to and
|
||||||
|
it is the PIPEDA basis, and the policy it links to describes a mailbox read
|
||||||
|
by administrative staff — a corporation is the party that matches, and
|
||||||
|
`/legal/privacy/` now names it in terms under §Why it is collected. **The sweep that had missed it was anchored on
|
||||||
|
mailbox vocabulary** (*"email me directly"*, *"reaches me"*), which is R8's
|
||||||
|
sharpest edge: the right command, the wrong anchor.
|
||||||
|
⚠️ **THE PAGE AROUND IT STILL SAYS "me" AND "I", AND THAT IS DELIBERATE, NOT
|
||||||
|
AN OVERSIGHT — read the two together and say if it reads wrong.** The
|
||||||
|
ruling changed the consent sentence and nothing else; `/legal/privacy/` is
|
||||||
|
written in the first person throughout (*"whatever you send me"*, *"in your
|
||||||
|
hands rather than mine"*), and `/contact/` is too. Nothing is false either
|
||||||
|
way — he is the accountable individual, the corporation holds the systems —
|
||||||
|
but the checkbox and the prose beside it now name different parties, and
|
||||||
|
**that is a judgement about voice which is his and not a reviewer's.**
|
||||||
|
- [x] ✅ **MEMBERSHIPS RE-CONFIRMED 2026-09-02 — Pouya: ADRIC, ADRIO, the three
|
||||||
|
OBA sections and the CTF are all current.** §4 and `src/data/site.ts` are
|
||||||
|
re-stamped `[verified 2026-09-02 — Pouya]`. ⚠️ **THERE ARE TWO ARRAYS AND
|
||||||
|
RE-STAMPING DOES NOT CHECK THAT THEY AGREE.** `CREDENTIALS.memberships`
|
||||||
|
feeds `/about/`'s visible list and `/bio/`; **`MEMBERSHIP_ORGS` feeds
|
||||||
|
`/process/` §Confidentiality and the `memberOf` triples**, and `site.ts`
|
||||||
|
records that the two differ on three of four lines. `_MembershipParity`
|
||||||
|
compares their lengths only, so a substitution passes `npm run check` in
|
||||||
|
silence. An earlier form of this line said `schema.ts` emitted from the
|
||||||
|
same constant (`adversarial-reviewer`, round 1).
|
||||||
|
**RE-ARM THIS FOR THE NEXT REPUBLISH — the row does not close.** `AGENTS.md`
|
||||||
|
§12 **R10**, which is an **event trigger and cutover is one of its two
|
||||||
events.** Q44 closed 2026-08-28 and the group is published on `/about/`
|
events.** Q44 closed 2026-08-28 and the group is published on `/about/`
|
||||||
(ADRIC, ADRIO, the three OBA sections, the CTF, `[verified 2026-08-28 —
|
(ADRIC, ADRIO, the three OBA sections, the CTF, `[verified 2026-08-28 —
|
||||||
Pouya]`), so this item is no longer "publish them" — it is **"ask him
|
Pouya]`), so this item is no longer "publish them" — it is **"ask him
|
||||||
@@ -502,6 +842,38 @@ the decision is re-readable rather than re-litigated.
|
|||||||
**§4 records yearly renewal for the OBA sections and the CTF only** — it
|
**§4 records yearly renewal for the OBA sections and the CTF only** — it
|
||||||
says nothing about ADRIC's or ADRIO's period, and an earlier version of
|
says nothing about ADRIC's or ADRIO's period, and an earlier version of
|
||||||
this line asserted "all renew yearly", which §4 does not support.
|
this line asserted "all renew yearly", which §4 does not support.
|
||||||
|
⚠️ **ASKED AND ANSWERED ON 2026-09-02 — that is why this is ticked, and
|
||||||
|
the distinction is the whole of R10.** It was ticked against a fresh
|
||||||
|
one-line confirmation from Pouya, not against the 2026-08-28 stamp: *a
|
||||||
|
stamp is not a renewal receipt.* The question to ask next time is
|
||||||
|
unchanged — *"are ADRIC, ADRIO, the three OBA sections and the CTF all
|
||||||
|
still current?"* — and the answer is followed by re-stamping **all four
|
||||||
|
stamp-bearing sites**: §4, `src/data/site.ts`, `src/data/schema.ts` and
|
||||||
|
**`src/pages/about.astro`**, which is the page that renders the group and
|
||||||
|
is therefore the file an editor most plausibly reads to check currency.
|
||||||
|
⚠️ **It was missing from this list and carried a stale date in the present
|
||||||
|
tense** (`adversarial-reviewer`, round 2).
|
||||||
|
⚠️ **NO RUNNING TALLY OF WHAT WAITS ON POUYA IS KEPT HERE ANY MORE.** This
|
||||||
|
line said "the only cutover item", was corrected to "one of three", and was
|
||||||
|
then rewritten as "the one item still waiting… is his own read-through" **in
|
||||||
|
the same change set that opened Q64** — wrong three times, in the same
|
||||||
|
direction each time: a count written while the change set was still adding
|
||||||
|
items. **The checkbox column is the tally.** Unticked items above are what
|
||||||
|
waits on him.
|
||||||
|
- [x] ✅ **THE SEVEN VOLATILE `docs/reference/` EXTRACTS RE-CHECKED — `AGENTS.md`
|
||||||
|
§12 R18, whose trigger is the same "before any cutover" event R10 uses.** ⚠️ **THIS ITEM DID NOT EXIST UNTIL 2026-09-02 AND THAT
|
||||||
|
WAS THE DEFECT**: R18 names a cutover as its trigger and the cutover
|
||||||
|
checklist carried no item to fire it, which is Q22's shape — a documented
|
||||||
|
control living somewhere it cannot run. R10 was on this list; R18 was not.
|
||||||
|
**Re-checked 2026-09-01 by Pouya. All seven hold and no shipped sentence
|
||||||
|
changed.** Three were re-verified against a source and four are held
|
||||||
|
unchanged on a cadence judgement rather than a fresh retrieval — the
|
||||||
|
distinction is stamped per limb in `AGENTS.md` §12 R18 and in each
|
||||||
|
extract, because "re-checked" and "not looked at, judged slow" are not the
|
||||||
|
same stamp and collapsing them is how OCNI lapsed.
|
||||||
|
**Re-fire this on the next republish that turns on one of them**, and note
|
||||||
|
that the fastest mover — Bill C-36 — needs no page edit while it sits at
|
||||||
|
second reading and needs one the day it does not.
|
||||||
- [ ] **The OBA sections stay listed; the LSO stays out** — a check that nobody
|
- [ ] **The OBA sections stay listed; the LSO stays out** — a check that nobody
|
||||||
has tidied the two into one list, not an open question. `AGENTS.md` **Q51
|
has tidied the two into one list, not an open question. `AGENTS.md` **Q51
|
||||||
answered 2026-08-28**: the Law Society is the **regulator**, so membership
|
answered 2026-08-28**: the Law Society is the **regulator**, so membership
|
||||||
@@ -720,7 +1092,25 @@ the decision is re-readable rather than re-litigated.
|
|||||||
instead. A `Disallow` will not do it: a blocked URL can still be listed.
|
instead. A `Disallow` will not do it: a blocked URL can still be listed.
|
||||||
Found by `adversarial-reviewer`, 2026-08-31
|
Found by `adversarial-reviewer`, 2026-08-31
|
||||||
- [ ] Booking link works, including the no-JavaScript fallback — **conditional on R6**; booking is parked and `CONTACT.bookingUrl` is `null`, so nothing renders and this passes vacuously until a tool is chosen. **Nothing on `/contact/` mentions booking**, deliberately
|
- [ ] Booking link works, including the no-JavaScript fallback — **conditional on R6**; booking is parked and `CONTACT.bookingUrl` is `null`, so nothing renders and this passes vacuously until a tool is chosen. **Nothing on `/contact/` mentions booking**, deliberately
|
||||||
- [ ] Favicon set complete
|
- [x] ✅ **Favicon set complete, and REGENERATED 2026-09-02 — it had shipped with
|
||||||
|
no transparency at all.** Pouya's read-through finding. All three frames
|
||||||
|
(16/32/48) declared a 32-bit alpha channel and then carried `alpha = 255`
|
||||||
|
on every pixel, the ground opaque cream — so the tab icon showed as a cream
|
||||||
|
rectangle on any dark tab strip. `public/favicon.ico` is now transparent,
|
||||||
|
regenerated by `npm run icons` from the committed master and verified
|
||||||
|
programmatically and by eye, on dark grounds and light.
|
||||||
|
⚠️ **`public/apple-touch-icon.png` STAYS OPAQUE CREAM AND MUST NOT BE
|
||||||
|
"FIXED" TO MATCH.** The reason is a platform behaviour — iOS composites a
|
||||||
|
transparent touch icon onto black — **stated by Pouya on 2026-09-02 and not
|
||||||
|
re-tested on a handset**; the item directly below is where it would be. The
|
||||||
|
touch icon is byte-identical across this change.
|
||||||
|
⚠️ **AND THE CHANGE IS NOT FREE ON DARK.** The maroon half of the ribbon
|
||||||
|
effectively drops out against a dark tab strip; the champagne half carries
|
||||||
|
the mark. **The figures are deliberately NOT repeated here** — they live in
|
||||||
|
`docs/reference/brand-assets.md` §The icon set, with the method, and a copy
|
||||||
|
on this page had already gone stale within a day by quoting the 32 px row
|
||||||
|
as if it were the general case (`adversarial-reviewer`, round 2). Read them
|
||||||
|
there.
|
||||||
- [ ] Tested on iOS Safari, Android Chrome, desktop Safari/Chrome/Firefox
|
- [ ] Tested on iOS Safari, Android Chrome, desktop Safari/Chrome/Firefox
|
||||||
- [ ] Tested at 320 px and at 200% zoom
|
- [ ] Tested at 320 px and at 200% zoom
|
||||||
- [x] ✅ **THE 200%-TEXT NAV OVERFLOW IS FIXED, 2026-09-01 — THIS ITEM IS
|
- [x] ✅ **THE 200%-TEXT NAV OVERFLOW IS FIXED, 2026-09-01 — THIS ITEM IS
|
||||||
@@ -814,8 +1204,23 @@ the decision is re-readable rather than re-litigated.
|
|||||||
Not a conformance failure of the same shape as Q61: a partial obscuring is
|
Not a conformance failure of the same shape as Q61: a partial obscuring is
|
||||||
not SC 2.4.11, which is about a component **entirely** hidden. `docs/02`
|
not SC 2.4.11, which is about a component **entirely** hidden. `docs/02`
|
||||||
§Reflow carries the 777-cell grid
|
§Reflow carries the 777-cell grid
|
||||||
- [ ] ⚠️ **THE `/med-arb/` GLOSS NEEDS A RULING — `claims-auditor`, D20 pass,
|
- [x] ✅ **THE `/med-arb/` GLOSS — RULED AND STRUCK, 2026-09-02.** Pouya:
|
||||||
finding 1.** §Why this practice says *"Med-arb is not a third service
|
*"strike the gloss sentence. The ADRIC-sourced material carries the page.
|
||||||
|
No replacement claim, no competence claim."* Applied: the definitional
|
||||||
|
gloss is struck. ⚠️ **AND SO IS THE DESIGNATIONS CLAUSE THAT THE FIRST
|
||||||
|
VERSION OF THIS ITEM SAID WAS "NOW THE LEDE" — corrected 2026-09-02,
|
||||||
|
`adversarial-reviewer` round 2, which found this line describing a page
|
||||||
|
state the same change set had deleted.** Round 1 of the closing claims
|
||||||
|
pass found that a bare `DESIGNATIONS_HELD_LINE` sitting directly beneath
|
||||||
|
§Rules' quotation of ADRIC requiring *"a high level of practitioner
|
||||||
|
competence"* read as meeting that bar. **§Why this practice now carries an
|
||||||
|
acceptance sentence and no credential claim at all**; `/about/` publishes
|
||||||
|
the designations and the JSON-LD carries them. The constraint is recorded
|
||||||
|
in the section's own comment in `src/pages/med-arb.astro`. **The original
|
||||||
|
finding is kept below unstruck**, because it is the reasoning behind a
|
||||||
|
paragraph that is deliberately thin, and a later reader who cannot see why
|
||||||
|
will fill it.
|
||||||
|
`claims-auditor`, D20 pass, finding 1: §Why this practice said *"Med-arb is not a third service
|
||||||
bolted onto mediation and arbitration; it is the two of them run under one
|
bolted onto mediation and arbitration; it is the two of them run under one
|
||||||
agreement"*, and one section above the page publishes ADRIC's own words:
|
agreement"*, and one section above the page publishes ADRIC's own words:
|
||||||
med-arb is *"not merely the merging of separate mediation and arbitration
|
med-arb is *"not merely the merging of separate mediation and arbitration
|
||||||
|
|||||||
@@ -672,7 +672,7 @@ AWS address, not yours. Three outcomes and each has a different consequence:
|
|||||||
| what `sourceIp` holds | what it means |
|
| what `sourceIp` holds | what it means |
|
||||||
|---|---|
|
|---|---|
|
||||||
| an **AWS** address (not the `checkip` value) | As designed. The field records the CDN, so it **cannot serve abuse investigation**, and `/legal/privacy/`'s *"your IP address"* is inaccurate — fold it into the Q62 edit on the same page rather than leaving two wrong sentences there |
|
| an **AWS** address (not the `checkip` value) | As designed. The field records the CDN, so it **cannot serve abuse investigation**, and `/legal/privacy/`'s *"your IP address"* is inaccurate — fold it into the Q62 edit on the same page rather than leaving two wrong sentences there |
|
||||||
| **your** address, matching `checkip` | Better than expected, and worth knowing before anyone relies on it. Do not conclude it is trustworthy: verify it is not simply echoing a header by resubmitting with `-H 'X-Forwarded-For: 8.8.8.8'` and confirming `8.8.8.8` is **not** what lands |
|
| **your** address, matching `checkip` | Better than expected, and worth knowing before anyone relies on it. Do not conclude it is trustworthy: verify it is not simply echoing a header by resubmitting with `-H 'X-Forwarded-For: 8.8.8.8'` and confirming `8.8.8.8` is **not** what lands. ⚠️ **AND CORRECT `/legal/privacy/` §What is collected**, whose network-address paragraph says the address is *"normally the network's own rather than your connection's"* — wrong in this branch, and it understates what is held about the reader. This row carried **no instruction at all** until 2026-09-02, so two of these three outcomes had nothing reconciling the page with the measurement (`adversarial-reviewer`, round 2) |
|
||||||
| `8.8.8.8` after that resubmission | **Stop.** The field is client-controlled and a record can be made to name an uninvolved third party. Revert to storing nothing rather than storing that |
|
| `8.8.8.8` after that resubmission | **Stop.** The field is client-controlled and a record can be made to name an uninvolved third party. Revert to storing nothing rather than storing that |
|
||||||
|
|
||||||
⚠️ **AN EARLIER REVISION OF THE HANDLER READ `x-forwarded-for` HERE, AND THAT WAS
|
⚠️ **AN EARLIER REVISION OF THE HANDLER READ `x-forwarded-for` HERE, AND THAT WAS
|
||||||
|
|||||||
@@ -13,6 +13,18 @@ cite it. Do not paraphrase a fact into a page that is not stated here.
|
|||||||
> date and effective date below is as at the retrieval date and nothing more.
|
> date and effective date below is as at the retrieval date and nothing more.
|
||||||
> Re-check before cutover, and before any republish that turns on one of them.
|
> Re-check before cutover, and before any republish that turns on one of them.
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> The trigger fired. `AGENTS.md` §12 R18 holds the per-limb findings and
|
||||||
|
> the sources; this stamp does not restate them. **The quoted bytes below
|
||||||
|
> are still the original retrieval and were not re-fetched** — what was
|
||||||
|
> re-checked is whether the *facts* they support have moved.
|
||||||
|
>
|
||||||
|
> - **(g) ADRIC's Code of Ethics, quoted verbatim on `/process/` — NOT
|
||||||
|
> RE-RETRIEVED.** Held unchanged on a cadence judgement `[assumed
|
||||||
|
> 2026-09-01 — Pouya]`. It is the slowest-moving of the seven; the live link
|
||||||
|
> on `/process/` is what makes a stale quotation visible to a reader.
|
||||||
|
|
||||||
**Topic as researched:** The Canadian ADR institutions this practice names, and the exact form of their names — ADRIC / ADRIO rule sets, designations, codes; ADR Chambers; early neutral evaluation and dispute-system design
|
**Topic as researched:** The Canadian ADR institutions this practice names, and the exact form of their names — ADRIC / ADRIO rule sets, designations, codes; ADR Chambers; early neutral evaluation and dispute-system design
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,6 +10,19 @@ construction. This is the same fetch-before-writing that caught
|
|||||||
|
|
||||||
**It caught one immediately. See Finding 1.**
|
**It caught one immediately. See Finding 1.**
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> The trigger fired. `AGENTS.md` §12 R18 holds the per-limb findings and
|
||||||
|
> the sources; this stamp does not restate them. **The quoted bytes below
|
||||||
|
> are still the original retrieval and were not re-fetched** — what was
|
||||||
|
> re-checked is whether the *facts* they support have moved.
|
||||||
|
>
|
||||||
|
> - **(f) the ADRIC National Mediation Rules, under review by ADRIC's own
|
||||||
|
> committee — NOT RE-RETRIEVED.** Held unchanged on a cadence judgement
|
||||||
|
> rather than a fresh fetch `[assumed 2026-09-01 — Pouya]`. The digests in
|
||||||
|
> the Provenance table below are the 2026-08-28 bytes and were not
|
||||||
|
> recomputed, so this stamp says nothing about whether the page changed.
|
||||||
|
|
||||||
## Provenance
|
## Provenance
|
||||||
|
|
||||||
| | |
|
| | |
|
||||||
|
|||||||
@@ -5,9 +5,22 @@ is `CLAUDE.md`'s rule and `AGENTS.md` R14, and this file exists because the
|
|||||||
infinity mark was reconstructed wrongly and **two adversarial review passes could
|
infinity mark was reconstructed wrongly and **two adversarial review passes could
|
||||||
not catch it**, since the real artwork was not in the repo to compare against.
|
not catch it**, since the real artwork was not in the repo to compare against.
|
||||||
|
|
||||||
**Every measurement below is `[verified 2026-08-26]`** — computed with `sharp`
|
**The measurements here are computed with `sharp` against the files in this
|
||||||
against the files in this repository, and re-derivable by anyone from the
|
repository**, and are re-derivable by anyone from the commands given.
|
||||||
commands given. Nothing here is quoted from an external source.
|
|
||||||
|
**Unless a section says otherwise, every figure below is `[verified
|
||||||
|
2026-08-26]`. Where a section carries its own stamp, that stamp wins** — the
|
||||||
|
render ladders are `[measured 2026-08-27]` and §The icon set is `[verified
|
||||||
|
2026-09-02]`. ⚠️ *This line has been wrong in both directions in one week: first
|
||||||
|
as a blanket 2026-08-26 that was already stale for the ladders, then as
|
||||||
|
"each section carries its own stamp" when five sections carry none. It is a floor
|
||||||
|
plus overrides because that is the only shape that covers every section without
|
||||||
|
mis-dating one* (`adversarial-reviewer`, rounds 1 and 2).
|
||||||
|
|
||||||
|
⚠️ **Two things in §The icon set are NOT read off this repository and are
|
||||||
|
labelled where they appear:** the tab-strip colours used in the contrast figures,
|
||||||
|
and iOS's handling of a transparent touch icon. Neither is derivable from
|
||||||
|
anything committed, so neither is stamped as if it were.
|
||||||
|
|
||||||
## Files
|
## Files
|
||||||
|
|
||||||
@@ -103,6 +116,138 @@ Passing an explicit `width` is load-bearing: without it Astro emits the
|
|||||||
untouched 2668 px master as the `<img src>` fallback — **1,146,406 bytes** —
|
untouched 2668 px master as the `<img src>` fallback — **1,146,406 bytes** —
|
||||||
which any client without AVIF or WebP support would actually download.
|
which any client without AVIF or WebP support would actually download.
|
||||||
|
|
||||||
|
## The icon set
|
||||||
|
|
||||||
|
`[verified 2026-09-02 — every figure below read off the icon files in this
|
||||||
|
repository, EXCEPT the two external constants flagged inline]`
|
||||||
|
|
||||||
|
| File | What it is | Ground |
|
||||||
|
|---|---|---|
|
||||||
|
| `public/favicon.ico` | 16, 32 and 48 px frames, each a PNG-encoded 32-bit RGBA image inside the ICO container | **Transparent** |
|
||||||
|
| `public/apple-touch-icon.png` | 180 × 180 | **Opaque cream `#faf7f2`, and that is deliberate — see below** |
|
||||||
|
|
||||||
|
**The two grounds differ on purpose, and this is the line that stops someone
|
||||||
|
"fixing" it.** ⚠️ *The reason is an external platform behaviour, not a repository
|
||||||
|
fact, and it is recorded here as what it is:* **iOS does not honour transparency
|
||||||
|
in a touch icon — it composites it onto black**, so a transparent touch icon
|
||||||
|
ships a black tile on the home screen. Stated by Pouya in his ruling of
|
||||||
|
**2026-09-02** and not independently re-tested here; **it has not been checked on
|
||||||
|
a handset in this repository, and the place that does check it is the unticked
|
||||||
|
`docs/06` item "Tested on iOS Safari…".** The tab favicon has the opposite
|
||||||
|
requirement: a tab strip is dark for many readers, and an opaque ground shows
|
||||||
|
there as a visible rectangle around the mark. So the favicon is transparent, the
|
||||||
|
touch icon is matted, and **neither should be changed to match the other.**
|
||||||
|
|
||||||
|
### Composition
|
||||||
|
|
||||||
|
The mark spans **7/8 of the canvas width**, centred on both axes — 14/16, 28/32,
|
||||||
|
42/48, and 158/180 on the touch icon. That was measured off the icons as they
|
||||||
|
already shipped, so a regeneration reproduces the composition rather than
|
||||||
|
restyling the mark.
|
||||||
|
|
||||||
|
### Regenerating
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run icons
|
||||||
|
```
|
||||||
|
|
||||||
|
`scripts/icons.mjs` resizes `src/assets/brand/sml-infinity-mark.png` onto a
|
||||||
|
transparent square canvas and assembles the ICO container itself, because
|
||||||
|
`sharp` does not write `.ico`. **It writes the favicon only** and never touches
|
||||||
|
the touch icon. It refuses to run if the render source has no alpha channel, and
|
||||||
|
it asserts that the source is still byte-identical to the documented crop of
|
||||||
|
`sml-infinity-mark-master.png` — R14, so the icon stays traceable to committed
|
||||||
|
artwork. It verifies a **candidate** file and renames it into place only on
|
||||||
|
success, so a rejected build cannot replace a good favicon.
|
||||||
|
|
||||||
|
**It also carries the halo test**, because the check that matters was living
|
||||||
|
only in prose here while the generator could not run it
|
||||||
|
(`adversarial-reviewer`, round 2). For each frame it takes every painted pixel
|
||||||
|
touching a fully transparent one and measures how many sit within 20 of cream:
|
||||||
|
|
||||||
|
| | boundary px | near cream | share |
|
||||||
|
|---|---|---|---|
|
||||||
|
| correct, 16 / 32 / 48 px | 61 / 146 / 258 | 1 / 2 / 5 | **1.6 / 1.4 / 1.9 %** |
|
||||||
|
| haloed fixture, 16 px | 56 | 11 | **19.6 %** |
|
||||||
|
|
||||||
|
The gate is **10 %**, roughly 5× clear of both. ⚠️ **The first version of this
|
||||||
|
guard inspected only partial-alpha pixels and MISSED the fixture completely** —
|
||||||
|
a knockout sets alpha per pixel and leaves **no partial alpha at all**, so there
|
||||||
|
was nothing for it to look at. The fixture is built by matting the mark on cream
|
||||||
|
and then knocking the ground out by alpha, which is the defect exactly; it fires
|
||||||
|
at 19.6 % and leaves `public/favicon.ico` untouched. **A guard that cannot see
|
||||||
|
the defect it is named for is worse than none**, and this one passed the real
|
||||||
|
icon while blind, which is the shape that ends a check instead of starting one.
|
||||||
|
|
||||||
|
### Why the favicon was regenerated, 2026-09-02
|
||||||
|
|
||||||
|
It had **no transparency at all**: all three frames declared a 32-bit alpha
|
||||||
|
channel and then carried `alpha = 255` on every one of their 256 / 1,024 / 2,304
|
||||||
|
pixels, with the ground opaque cream `rgba(250,247,242,255)`. Found by Pouya on a
|
||||||
|
read-through, confirmed by parsing the container directly.
|
||||||
|
|
||||||
|
Three measurements stand behind the replacement.
|
||||||
|
|
||||||
|
**1. The composition did not change.** Composited back onto cream, the new icon
|
||||||
|
reproduces the old matted one to within **1 of 255 on every channel of every
|
||||||
|
pixel** at all three sizes (mean delta 0.01–0.02, 0 pixels over a delta of 8).
|
||||||
|
So the regeneration did not restyle, rescale or reposition the mark.
|
||||||
|
|
||||||
|
⚠️ **That is NOT a test for a halo, and an earlier draft of this file filed it as
|
||||||
|
one.** Composite-onto-cream returns ~0 whether the edge is correct *or* is a
|
||||||
|
cream-matted edge that has merely had its background knocked out — the second
|
||||||
|
case composites straight back to what it came from. Both branches pass, so the
|
||||||
|
test cannot discriminate. Found by `adversarial-reviewer`, 2026-09-02.
|
||||||
|
|
||||||
|
**2. No halo — the measurement that does discriminate.** Read the RGB the
|
||||||
|
partial-alpha pixels actually carry. A cream halo means that RGB is near cream; a
|
||||||
|
correct export means it is the ribbon's own colour. Of the partial-alpha pixels,
|
||||||
|
**0 of 94 / 300 / 603** are within 12 of `rgb(250,247,242)`; the nearest is 13
|
||||||
|
away, the mean distance is **174.0 / 178.3 / 177.0**, and the mean colour per
|
||||||
|
frame is about `rgb(118,86,74)` — maroon-brown, not cream and not black.
|
||||||
|
|
||||||
|
**3. Legible on dark and on light, and NOT at the same cost.** ⚠️ *The ground
|
||||||
|
colours below are external constants, not repository facts: `#202124` is
|
||||||
|
Chrome's dark tab strip and `#f1f3f4` its light one, both `[observed
|
||||||
|
2026-09-02]`.* All ratios are computed on **composited** pixels, and the ink
|
||||||
|
colours are **fully opaque** pixels only — a ratio taken from a raw channel value
|
||||||
|
is a claim about a colour that is never painted, which is how an earlier draft
|
||||||
|
came to quote `14.02:1` for a pixel whose alpha is 251.
|
||||||
|
|
||||||
|
| | darkest opaque ink | lightest opaque ink | vs `#202124` | vs `#f1f3f4` |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 16 px | `rgb(70,33,33)` | `rgb(216,188,143)` | champagne **8.82:1** | maroon **12.58:1** |
|
||||||
|
| 32 px | `rgb(60,29,29)` | `rgb(234,214,172)` | champagne **11.28:1** | maroon **13.62:1** |
|
||||||
|
| 48 px | `rgb(61,26,26)` | `rgb(238,219,175)` | champagne **11.80:1** | maroon **13.86:1** |
|
||||||
|
|
||||||
|
Whichever ground it sits on, one end of the ribbon carries the silhouette. **But
|
||||||
|
the other end does not merely dim — on dark it goes.** The maroon lobe
|
||||||
|
composites to **1.04–1.15:1**, and counting pixels that reach 3:1 against each
|
||||||
|
ground gives **23 / 87 / 189** on dark against **40 / 168 / 378** on light, at
|
||||||
|
16 / 32 / 48 px. **So about half as many pixels reach 3:1 on dark as on light.**
|
||||||
|
⚠️ *Those pixels are not absent — they are painted and fall below 3:1, and the
|
||||||
|
mark's full outline is still there, dim. An earlier draft said "roughly half the
|
||||||
|
mark's visible pixels are absent", which is neither what was counted (pixels at
|
||||||
|
`alpha > 0` are 109 / 388 / 805) nor what a render shows* — `adversarial-reviewer`,
|
||||||
|
round 2. The previous opaque-cream icon was still more legible on dark.
|
||||||
|
|
||||||
|
**That is the price of the change and it was accepted, not overlooked.** What was
|
||||||
|
bought is the removal of a cream rectangle from every dark tab strip and from
|
||||||
|
white. Raised by `adversarial-reviewer`, 2026-09-02, against a draft that
|
||||||
|
recorded the change as costless.
|
||||||
|
|
||||||
|
**The obvious alternative is an icon pair keyed on `prefers-color-scheme`, and it
|
||||||
|
was NOT ruled out on measurement.** ⚠️ *An earlier draft dismissed it on a
|
||||||
|
mechanism that is wrong: it said the query keys off the page's colour scheme. It
|
||||||
|
does not — it reports the user's system or browser preference, and this site
|
||||||
|
declares `color-scheme` nowhere (`git grep -n color-scheme -- src`, exit 1), so
|
||||||
|
it would resolve to the same preference that makes the tab strip dark.* The real
|
||||||
|
objections are **untested here** and are recorded as such: `media` on
|
||||||
|
`<link rel="icon">` is unevenly supported for raster icons, a browser theme can
|
||||||
|
be set independently of the system preference, and it doubles the artefact
|
||||||
|
`npm run icons` has to keep in sync. **If this cost is ever revisited, that is
|
||||||
|
the option to test** — do not re-dismiss it on the reason struck above.
|
||||||
|
|
||||||
## The colours are the artwork's, not the palette's
|
## The colours are the artwork's, not the palette's
|
||||||
|
|
||||||
`tokens.css` is not involved. The ribbon carries its own gradient and it is
|
`tokens.css` is not involved. The ribbon carries its own gradient and it is
|
||||||
|
|||||||
@@ -21,6 +21,19 @@ not published.
|
|||||||
> at second reading on the retrieval date and could be law, or dead, by the time
|
> at second reading on the retrieval date and could be law, or dead, by the time
|
||||||
> anyone reads this. **Re-check before cutover.**
|
> anyone reads this. **Re-check before cutover.**
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> The trigger fired. `AGENTS.md` §12 R18 holds the per-limb findings and
|
||||||
|
> the sources; this stamp does not restate them. **The quoted bytes below
|
||||||
|
> are still the original retrieval and were not re-fetched** — what was
|
||||||
|
> re-checked is whether the *facts* they support have moved.
|
||||||
|
>
|
||||||
|
> - **(a) Bill C-36 — RE-VERIFIED UNMOVED** `[re-checked 2026-09-01 — Pouya,
|
||||||
|
> <https://www.parl.ca/legisinfo/en/bill/45-1/c-36>]`. Still at second
|
||||||
|
> reading in the House of Commons; latest completed stage is first reading,
|
||||||
|
> 2026-06-15; no advance since. `/practice/technology/`'s sentence stands as
|
||||||
|
> written.
|
||||||
|
|
||||||
**Topic as researched:** Canadian technology / data / AI dispute context — privacy legislation status as at 2026-08-29, Ontario public-sector and health privacy statutes, data residency law, and Canadian arbitral-institution rules for technology/AI disputes
|
**Topic as researched:** Canadian technology / data / AI dispute context — privacy legislation status as at 2026-08-29, Ontario public-sector and health privacy statutes, data residency law, and Canadian arbitral-institution rules for technology/AI disputes
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -10,16 +10,104 @@ one claim on the site whose subject was entirely outside the repo.
|
|||||||
|
|
||||||
Raised by `claims-auditor` in the D20 cutover audit, 2026-09-01, finding 8.
|
Raised by `claims-auditor` in the D20 cutover audit, 2026-09-01, finding 8.
|
||||||
|
|
||||||
**Provenance.** Every figure below was read from AWS on **2026-09-01** with the
|
**Provenance.** Figures in the ORIGINAL sections were read from AWS on
|
||||||
commands listed at the end, run read-only as `arn:aws:iam::327082975128:user/pouya`.
|
**2026-09-01**; everything in the **2026-09-02 addendum** at the foot of this file
|
||||||
|
was read on 2026-09-02, and it supersedes the original role screen. Both were run
|
||||||
|
read-only as `arn:aws:iam::327082975128:user/pouya` with the commands listed at
|
||||||
|
the end.
|
||||||
No command in this file creates or changes anything. Re-run them rather than
|
No command in this file creates or changes anything. Re-run them rather than
|
||||||
trusting this file; it is dated for that reason.
|
trusting this file; it is dated for that reason.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## The claim being checked
|
## ✅ RULED AND APPLIED — 2026-09-02
|
||||||
|
|
||||||
`src/pages/legal/privacy.astro`, §Who can see it:
|
**Pouya ruled `state the truth`, not `remove the access`** (§9 Q62, ruled
|
||||||
|
2026-09-01, applied 2026-09-02). Option 2 below is the one taken; option 1 was
|
||||||
|
declined. `lars`'s membership of `admins` is **unchanged**.
|
||||||
|
|
||||||
|
⚠️ **AND THEN RULED AGAIN THE SAME DAY — §9 Q63, and the second ruling is the
|
||||||
|
one this file most needs to carry, because THIS FILE SUPPLIED THE ERROR.** The
|
||||||
|
first shipped sentence was *"Two people can"*, and it was read straight off the
|
||||||
|
enumeration below. **Pouya's attestation, 2026-09-02:** *"two people is an
|
||||||
|
exaggeration… a handful is accurate — the simulation counts identities, not
|
||||||
|
humans, and the two are not the same claim."*
|
||||||
|
|
||||||
|
**The enumeration is exhaustive and the inference off it was not.** Every read
|
||||||
|
path terminates at `user/pouya` or `user/lars`; how many **people** can reach
|
||||||
|
those two credentials is not something `simulate-principal-policy` can see, so
|
||||||
|
the identity count is a **lower bound on people** and the page published it as an
|
||||||
|
exact count. **No numeric human headcount may ship.** The identity counts in this
|
||||||
|
file are unaffected and stay exactly as measured — this is a correction to what
|
||||||
|
may be *concluded* from them, not to any of them.
|
||||||
|
|
||||||
|
⚠️ **AND RULED A THIRD TIME, LATER THE SAME DAY: THE PAGE STATES WHO, AND THIS
|
||||||
|
FILE HOLDS THE METHOD.** Pouya, 2026-09-02: *"the page stays generic. It
|
||||||
|
over-explains technical mechanics that belong in the evidence file, not in front
|
||||||
|
of an inquirer."* §Who can see it is now **four short statements**. **Deleted from
|
||||||
|
the page:** the measurement paragraph, the root-credential sentence, the single-sign-on and federated-login enumeration, the resource-policy clause, the *"company that runs a database"* aside, the deploy-credential sentence and the three-copies summary. ⚠️ **THE SHARED-ACCOUNT CLAUSE WAS CUT WITH THEM AND THEN RESTORED — to §Where it is stored, where it belongs.** It is a storage disclosure rather than mechanics, the ruling did not name it, and without it no page told a reader their intake sits in an account that also runs unrelated systems (`adversarial-reviewer`, round 1). **These lists must stay identical — there were four of them and they named four different sets.** None of that was retracted and none of it is lost — it
|
||||||
|
is all still below, unchanged, and **that is now this file's job rather than a
|
||||||
|
supporting role.** ⚠️ **THE PAGE NO LONGER CITES THIS FILE'S CONTENT, SO THE
|
||||||
|
COMPARISON BELOW IS THE ONLY THING TYING THE TWO TOGETHER. Keep it in sync, and
|
||||||
|
do not restore a deleted sentence to the page on the strength of finding it
|
||||||
|
here** — the section comment in `src/pages/legal/privacy.astro` carries the same
|
||||||
|
bar.
|
||||||
|
|
||||||
|
**The shipped sentences as at 2026-09-02**, so this file can be compared against
|
||||||
|
the live page rather than against a struck one. All four, in order, complete:
|
||||||
|
|
||||||
|
> The record in the table: me, and the small number of people who administer the
|
||||||
|
> account it sits in with me.
|
||||||
|
|
||||||
|
> The system that receives what you send **can only add a record — it cannot read
|
||||||
|
> back what is stored.**
|
||||||
|
|
||||||
|
> The notification goes to the practice's mailbox, which is read by me and by
|
||||||
|
> administrative staff and is hosted on Google Workspace — so Google holds a copy
|
||||||
|
> of whatever you send me.
|
||||||
|
|
||||||
|
> The confirmation that went to you sits with whoever runs your email. That copy
|
||||||
|
> is in your hands rather than mine.
|
||||||
|
|
||||||
|
**What each rests on, because that mapping is the reason this file exists.**
|
||||||
|
Sentence 1: the enumeration below, plus Pouya's *"a handful"* attestation for the
|
||||||
|
human quantifier — **the measurement gives administrators, the attestation gives
|
||||||
|
the number, and neither gives the other.** Sentence 2: `adr-intake-lambda-role`
|
||||||
|
holds `PutItem` only, implicitDeny on all six read and modify actions.
|
||||||
|
Sentence 3: **an attestation, not a measurement** — `AGENTS.md` §7's
|
||||||
|
`info@smlcompany.ca` row; nothing in this repository or in AWS can check it.
|
||||||
|
Sentence 4: the handler's second `SendEmailCommand`.
|
||||||
|
|
||||||
|
**Three things the page deliberately does NOT say, and each was deleted by
|
||||||
|
ruling rather than being unsupported.** The **root credential** (§7 records it as
|
||||||
|
held by Pouya with no access key and MFA on — ⚠️ *held*, not *held only*, which
|
||||||
|
is why publishing it needed a question and why §9 Q64 is closed as **moot** and
|
||||||
|
not as answered). The **single-sign-on and resource-policy findings**. And the
|
||||||
|
**`33`** — deliberately withheld even while the paragraph stood, because a role
|
||||||
|
total moves when AWS creates a service-linked role by itself.
|
||||||
|
|
||||||
|
**The wording approval Pouya reserved is discharged by the read-through** — his
|
||||||
|
ruling, 2026-09-02: *"do not hold anything open waiting on a separate wording
|
||||||
|
approval; the read-through is the approval."* Q63(a) had approved a version, and
|
||||||
|
the version changed twice after it.
|
||||||
|
|
||||||
|
⚠️ **AND THE ENUMERATION BELOW WAS NOT ENOUGH TO SUPPORT THE COMPLETENESS CLAIM
|
||||||
|
— *"every user and every role in the account was simulated against this table"*,
|
||||||
|
which §7 still asserts and the page no longer carries. See the addendum at the
|
||||||
|
foot of this file**, which is what that claim actually rests on. Read it before
|
||||||
|
citing the five-row table. *(This pointer said "the second of those sentences"
|
||||||
|
until 2026-09-02: it indexed the quote block by POSITION, and the block changed
|
||||||
|
length under it. Name the claim, not its ordinal.)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## The claim being checked — ⚠️ STRUCK 2026-09-01, QUOTED HERE AS THE DEFECT
|
||||||
|
|
||||||
|
This is **no longer on the page.** It is kept because it is the string
|
||||||
|
`check-claims.mjs`'s `sole-administrator-q62` pattern permanently bars, and a
|
||||||
|
tripwire whose target is not recorded anywhere becomes unmaintainable.
|
||||||
|
|
||||||
|
`src/pages/legal/privacy.astro`, §Who can see it, **as it stood at `bd282aa`**:
|
||||||
|
|
||||||
> The table is reachable by the function that writes to it and by one
|
> The table is reachable by the function that writes to it and by one
|
||||||
> administrative account, which is mine — nobody else has access to the table.
|
> administrative account, which is mine — nobody else has access to the table.
|
||||||
@@ -75,9 +163,13 @@ access, and it belongs to a second administrator of a shared account.
|
|||||||
`meshkini*`/`gitea*` users are evidence of that on the IAM surface, not just
|
`meshkini*`/`gitea*` users are evidence of that on the IAM surface, not just
|
||||||
in the S3 bucket listing §10 describes.
|
in the S3 bucket listing §10 describes.
|
||||||
|
|
||||||
## What has to happen before `/legal/privacy/` goes public
|
## What had to happen before `/legal/privacy/` went public — ✅ RESOLVED BY OPTION 2
|
||||||
|
|
||||||
Tracked as `AGENTS.md` §9 **Q62**. It is one of two things and both are Pouya's:
|
Tracked as `AGENTS.md` §9 **Q62**, **closed 2026-09-02 on option 2.** Kept
|
||||||
|
unstruck because the reasoning is what makes the ruling re-readable, and because
|
||||||
|
option 1 remains live in one direction: if that access is ever actually removed,
|
||||||
|
the page and the tripwire both have to change, and `check-claims.mjs`'s `rule:`
|
||||||
|
line carries that instruction.
|
||||||
|
|
||||||
1. **Remove the access** — take `lars` out of `admins`, or replace that
|
1. **Remove the access** — take `lars` out of `admins`, or replace that
|
||||||
membership with a policy that denies DynamoDB on this table — and then this
|
membership with a policy that denies DynamoDB on this table — and then this
|
||||||
@@ -139,3 +231,305 @@ parameter-expansion bug (`$ACCT:user/` parses `:u` as a history modifier). The
|
|||||||
loop above brace-quotes `${U}` for that reason, prints one line per principal so
|
loop above brace-quotes `${U}` for that reason, prints one line per principal so
|
||||||
a silently-skipped iteration is visible as a missing row, and suppresses nothing.
|
a silently-skipped iteration is visible as a missing row, and suppresses nothing.
|
||||||
**Five rows, or the run did not happen.**
|
**Five rows, or the run did not happen.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ ADDENDUM 2026-09-02 — THE ENUMERATION ABOVE WAS INCOMPLETE IN THREE WAYS, AND ITS CONCLUSION SURVIVES ANYWAY
|
||||||
|
|
||||||
|
**Why this addendum exists.** `/legal/privacy/` published a completeness claim
|
||||||
|
about who can read this table — *"every user and every role in the account was
|
||||||
|
simulated against this table"* — and, written as it stood, this file did not
|
||||||
|
support it. ⚠️ **THAT SENTENCE IS NO LONGER ON THE PAGE**: Pouya ruled later the
|
||||||
|
same day that the section states who and not how, and the measurement paragraph
|
||||||
|
was deleted (see **The shipped sentences** at the top of this file, which is now
|
||||||
|
four statements and does not include it). **This addendum is not thereby
|
||||||
|
obsolete — it is now load-bearing in a different place.** `AGENTS.md` §7's
|
||||||
|
`Intake table — who can read it` row still asserts the completeness, `docs/06`
|
||||||
|
and §12 **R21** still instruct an operator to re-run it before cutover, and the
|
||||||
|
page's first sentence still rests on its conclusion even though it no longer
|
||||||
|
recites the method. **A claim moved off a public page into a register is still a
|
||||||
|
claim.**
|
||||||
|
|
||||||
|
*(This paragraph quoted a different sentence until 2026-09-02 — round 1's
|
||||||
|
**pre-fix** wording, *"every account and role in this infrastructure…"*, which
|
||||||
|
the audit then struck. So this file briefly quoted two different sentences as the
|
||||||
|
live one, in the two halves of the same document, which defeats the comparison
|
||||||
|
R14 exists for. Fixed by pointing at the block above rather than re-quoting it:
|
||||||
|
one copy of a fact, in one place. `adversarial-reviewer`, round 2.)* Under R14 the artefact is what a reviewer compares the
|
||||||
|
claim against, so a claim stronger than its artefact is unverifiable by
|
||||||
|
construction even when it happens to be true.
|
||||||
|
|
||||||
|
**What was missing.**
|
||||||
|
|
||||||
|
1. **`aws iam list-role-policies` was never run.** The command block above lists
|
||||||
|
only `list-attached-role-policies`, which returns *managed* policies. **23 of
|
||||||
|
the 26 non-service-linked roles carry inline policies**, and none of them had
|
||||||
|
been read. The screen for "broad policies" could not have seen an inline grant.
|
||||||
|
2. **No role was ever simulated against the table.** Access was inferred from
|
||||||
|
policy *names* (`AdministratorAccess`) rather than measured as a decision.
|
||||||
|
3. **The five users were simulated for reads only** — `GetItem`, `Query`, `Scan`.
|
||||||
|
So the page's *(then-shipped; deleted by the mechanics ruling of 2026-09-02 and now §7's alone)* *"the credential that publishes this website has no access to the
|
||||||
|
table at all"* covered three read actions and said "at all".
|
||||||
|
|
||||||
|
**What the measurement found, and it changes the role count.** Simulating all 26
|
||||||
|
non-service-linked roles across **seven** actions — `GetItem`, `Query`, `Scan`,
|
||||||
|
`BatchGetItem`, `PutItem`, `UpdateItem`, `DeleteItem`:
|
||||||
|
|
||||||
|
| role | decision on the table | trust |
|
||||||
|
|---|---|---|
|
||||||
|
| `cdk-hnb659fds-cfn-exec-role-…-ca-central-1` | **allowed on all 7** | `cloudformation.amazonaws.com` only |
|
||||||
|
| `cdk-hnb659fds-cfn-exec-role-…-us-east-1` | **allowed on all 7** | `cloudformation.amazonaws.com` only |
|
||||||
|
| `cdk-hnb659fds-lookup-role-…-ca-central-1` | **allowed on the 4 READS**, denied on writes | `arn:aws:iam::327082975128:root` |
|
||||||
|
| `cdk-hnb659fds-lookup-role-…-us-east-1` | **allowed on the 4 READS**, denied on writes | `arn:aws:iam::327082975128:root` |
|
||||||
|
| `adr-intake-lambda-role` | `PutItem` **only**; implicitDeny on the other six | `lambda.amazonaws.com` |
|
||||||
|
| the other 21 | implicitDeny on all 7 | — |
|
||||||
|
|
||||||
|
**So FOUR roles can read the table, not the two this file recorded.** The two
|
||||||
|
`lookup` roles were missed by exactly the gap above: their grant is the inline
|
||||||
|
`LookupRolePolicy`, and `list-attached-role-policies` returns nothing for them.
|
||||||
|
|
||||||
|
**Why the published sentence is nevertheless correct.** The question is not how
|
||||||
|
many roles exist but which *people* they lead back to.
|
||||||
|
|
||||||
|
- The two **cfn-exec** roles trust `cloudformation.amazonaws.com` and nothing
|
||||||
|
else. No human can assume them; they are reachable only by deploying a
|
||||||
|
CloudFormation/CDK stack, which requires a principal who can deploy one.
|
||||||
|
- The two **lookup** roles trust the account root, which delegates the decision
|
||||||
|
to the caller's own identity policy. Simulated for `sts:AssumeRole` against
|
||||||
|
both role ARNs, for all five users, reading `ResourceSpecificResults` (ten
|
||||||
|
per-resource decisions, not five — `EvaluationResults` is one entry per
|
||||||
|
**action**, and an earlier pass here asserted the wrong count):
|
||||||
|
|
||||||
|
| principal | assume `lookup-…-ca-central-1` | assume `lookup-…-us-east-1` |
|
||||||
|
|---|---|---|
|
||||||
|
| `user/pouya` | **allowed** | **allowed** |
|
||||||
|
| `user/lars` | **allowed** | **allowed** |
|
||||||
|
| `user/adr-sml-deploy` | implicitDeny | implicitDeny |
|
||||||
|
| `user/gitea-deploy-meshkinilaw` | implicitDeny | implicitDeny |
|
||||||
|
| `user/meshkini-backend-deploy` | implicitDeny | implicitDeny |
|
||||||
|
|
||||||
|
- The **CloudFormation escalation path this file named and left untested** —
|
||||||
|
*"a real path to the table for anyone who can deploy a CDK stack"* — is now
|
||||||
|
measured. Simulated for `cloudformation:CreateStack`, `UpdateStack`,
|
||||||
|
`CreateChangeSet`, `ExecuteChangeSet`, `iam:PassRole` and `sts:AssumeRole`,
|
||||||
|
five users × six actions = **30 decisions**, count asserted:
|
||||||
|
|
||||||
|
| principal | the CDK / CloudFormation path |
|
||||||
|
|---|---|
|
||||||
|
| `user/pouya` | **allowed** on all six |
|
||||||
|
| `user/lars` | **allowed** on all six |
|
||||||
|
| `user/adr-sml-deploy` | implicitDeny on all six |
|
||||||
|
| `user/gitea-deploy-meshkinilaw` | implicitDeny on all six |
|
||||||
|
| `user/meshkini-backend-deploy` | implicitDeny on all six |
|
||||||
|
|
||||||
|
This is the finding that mattered most, because `meshkini-backend-deploy` is by
|
||||||
|
its name another project's backend-deploy credential and
|
||||||
|
`gitea-deploy-meshkinilaw` is held on a **jointly administered** Gitea instance
|
||||||
|
(Q23). Either one, had it been able to drive CloudFormation, would have read
|
||||||
|
the table without appearing in the five-row table above — and *"Two people
|
||||||
|
can"* would have been wrong. Neither can.
|
||||||
|
|
||||||
|
- **And the seven roles every sweep here had excluded BY CONSTRUCTION are now
|
||||||
|
measured too.** Every role loop in this file filters `grep -v
|
||||||
|
'^AWSServiceRole'`, and the assertion was written as *"twenty-six role rows"* —
|
||||||
|
so a service-linked role was outside the claim rather than inside it, which
|
||||||
|
matters because a service-linked role for a backup or migration service can
|
||||||
|
read table contents. All **7** (`APIGateway`, `CloudFrontLogger`,
|
||||||
|
`InternetMonitor`, `RDS`, `ResourceExplorer`, `Support`, `TrustedAdvisor`) are
|
||||||
|
**implicitDeny on all seven actions** — 49 decisions, count asserted
|
||||||
|
`[verified 2026-09-02]`. **So the enumeration is 33 of 33 roles, not 26 of
|
||||||
|
33**, and the page's *"every user and every role in the account"* is now
|
||||||
|
literally true. Raised by `adversarial-reviewer`, round 2.
|
||||||
|
|
||||||
|
- **There is no federated identity surface at all**: `list-saml-providers` **0**,
|
||||||
|
`list-open-id-connect-providers` **0**, `sso-admin list-instances` **0**
|
||||||
|
`[verified 2026-09-02]`. So "every user and every role" is not leaving out a
|
||||||
|
federated principal, because there is none to leave out.
|
||||||
|
|
||||||
|
- ⚠️ **AND THE `sso-admin` ZERO NEEDED A SECOND COMMAND TO MEAN ANYTHING, added
|
||||||
|
2026-09-02 (round 2).** `list-instances` answers about the account it is called
|
||||||
|
in, so a **member of an AWS Organization returns 0 while Identity Center runs in
|
||||||
|
the management account** — the zero would have been true and the conclusion
|
||||||
|
false. `aws organizations describe-organization` returns
|
||||||
|
**`AWSOrganizationsNotInUseException`: "Your account is not a member of an
|
||||||
|
organization"** `[verified 2026-09-02]`, so there is no management account above
|
||||||
|
this one and the zero is conclusive. Command 8.
|
||||||
|
|
||||||
|
- **The table carries NO RESOURCE-BASED POLICY OF ITS OWN**, and this is now a
|
||||||
|
command rather than an assertion. `aws dynamodb get-resource-policy` returns
|
||||||
|
**`PolicyNotFoundException`** `[verified 2026-09-02]` — exit **254**, the error
|
||||||
|
on stderr being the result. ⚠️ **A DynamoDB resource policy is invisible to
|
||||||
|
`describe-table`**, so no earlier command in this file could have seen one, and
|
||||||
|
`/legal/privacy/` publishes the claim (*"the table carries no policy of its own
|
||||||
|
granting access to anyone"*). It is the identity-policy enumeration's blind
|
||||||
|
spot: every simulation here asks what a **principal** may do, and a resource
|
||||||
|
policy grants from the other side. Found unbacked by `adversarial-reviewer`
|
||||||
|
round 2, on §10's own precedent — the client-backup bucket, where
|
||||||
|
`get-bucket-policy` returning `NoSuchBucketPolicy` was recorded because *"a
|
||||||
|
policy read alone could not have established the second half."* Command 7.
|
||||||
|
|
||||||
|
Every read path therefore terminates at `pouya` or `lars`. ⚠️ **AND THAT IS
|
||||||
|
WHERE THIS FILE WENT WRONG, SO THE CORRECTION SITS AT THE SENTENCE THAT CAUSED
|
||||||
|
IT.** This read *"The count of people is two, and it is now the result of an
|
||||||
|
enumeration rather than of a policy name"* until 2026-09-02, and `/legal/privacy/`
|
||||||
|
published that count. **It is a count of IDENTITIES.** Two credentials is a lower
|
||||||
|
bound on the number of people who can use them, and Pouya's attestation is that
|
||||||
|
*"a handful"* is the true figure (§9 Q63). The enumeration stands exactly as
|
||||||
|
measured; **an enumeration of principals is not a census.**
|
||||||
|
|
||||||
|
**The account root user, recorded because an enumeration that quietly omits it is
|
||||||
|
not an enumeration.** Root is not an IAM user and does not appear in
|
||||||
|
`list-users`, so it cannot be simulated and no policy constrains it — root can
|
||||||
|
always read the table. Two facts bound it: `get-account-summary` reports
|
||||||
|
`AccountAccessKeysPresent: 0`, so **there is no programmatic root credential**,
|
||||||
|
and `AccountMFAEnabled: 1`. Root access therefore requires the root password and
|
||||||
|
its MFA device.
|
||||||
|
|
||||||
|
⚠️ **THE PAGE SAYS NOTHING ABOUT ROOT, AND THIS PASSAGE HAS NOW BEEN THE REASON
|
||||||
|
FOR THAT TWICE ON OPPOSITE GROUNDS.** It first read *"The page does not mention
|
||||||
|
root and should not"*, reasoned from its own last clause — *"who holds the root
|
||||||
|
credentials is not established in this repository."* **Pouya then established it
|
||||||
|
(§9 Q63(c), 2026-09-02): he holds it** `[verified 2026-09-02 — Pouya]`, the page
|
||||||
|
published *"has no programmatic key, and I hold it"*, and the gap that opened
|
||||||
|
immediately was that *held by* is not *held only by* — a reader takes the
|
||||||
|
possessive as sole custody, which nothing measured or attested supports (§9
|
||||||
|
**Q64**). **His second ruling that day deleted the sentence** along with the rest
|
||||||
|
of the mechanics, so **Q64 is closed as MOOT rather than answered and the
|
||||||
|
underlying fact is exactly as unestablished as it was.**
|
||||||
|
|
||||||
|
**The consequence to carry, because it is not "nothing happened":** root custody
|
||||||
|
is now recorded in `AGENTS.md` §7 and nowhere public. ⚠️ **Nothing about it may
|
||||||
|
be published without asking him again**, and the question to ask is not *who
|
||||||
|
holds root* — that is answered — but *whether anyone else does*. The original
|
||||||
|
reasoning still holds and is why the page's first sentence is scoped as it is: an
|
||||||
|
account owner's own credential is inherent to every cloud account and is not a
|
||||||
|
third party who has been *granted* access, which is why the measured claim was
|
||||||
|
always scoped to *"every user and every role"* rather than to a bare "nobody else
|
||||||
|
can".
|
||||||
|
|
||||||
|
**Two claims are supported that were not before. One of them still ships; the
|
||||||
|
other was deleted from the page by ruling on 2026-09-02 and is kept here because
|
||||||
|
it remains true and remains §7's.**
|
||||||
|
|
||||||
|
- **SHIPS** — *"The system that receives what you send can only add a record — it
|
||||||
|
cannot read back what is stored"* — `adr-intake-lambda-role` returns `allowed`
|
||||||
|
for `PutItem` and `implicitDeny` for `GetItem`, `Query`, `Scan`,
|
||||||
|
`BatchGetItem`, `UpdateItem` and `DeleteItem`. Previously this rested on
|
||||||
|
reading the policy document; it is now the simulator's decision.
|
||||||
|
- **NO LONGER ON THE PAGE** — *"the credential that publishes this website has no
|
||||||
|
access to the table at all"* — `adr-sml-deploy` is `implicitDeny` on all
|
||||||
|
**seven**, so "at all" covers writes and deletes as well as reads. It went with
|
||||||
|
the mechanics cut, not because anything about it changed.
|
||||||
|
|
||||||
|
**And it corroborates §10 from the IAM surface.** Of the 26 non-service-linked
|
||||||
|
roles, **9 belong to CDK bootstrap** and **14 to four unrelated production
|
||||||
|
systems** in the same account. *(`/legal/privacy/` tells a reader this in as many words —
|
||||||
|
*"The table sits in an Amazon Web Services account that also runs systems
|
||||||
|
unrelated to this practice"* — in **§Where it is stored**, which is where the
|
||||||
|
sentence now lives: the mechanics cut removed it and it was restored there, as a
|
||||||
|
storage disclosure rather than a method. §10 is unaffected either way; it never
|
||||||
|
depended on the page saying so.)* *(Their role names were listed here until 2026-09-02 and
|
||||||
|
are not any more: this is a committed file, they are another project's IAM
|
||||||
|
surface, and the count carries the whole of the argument. `adversarial-reviewer`,
|
||||||
|
round 2.)*
|
||||||
|
|
||||||
|
⚠️ **THE INSTRUMENT FAILED FIRST, UNIFORMLY, AND IN THE DIRECTION THAT READS AS
|
||||||
|
CLEAN.** The role sweep was first run as `--action-names $ACTS` with the seven
|
||||||
|
actions in a shell variable. **zsh does not word-split parameter expansions**, so
|
||||||
|
`simulate-principal-policy` received **one** action name — the whole string — and
|
||||||
|
answered it: `implicitDeny` for 22 roles, and `allowed` for the four with a `*`
|
||||||
|
grant, because `*` matches a bogus action too. Twenty-two clean rows and a
|
||||||
|
plausible four. The tell was the shape of the output, not the verdict: one
|
||||||
|
decision per role where there should have been seven. **The fix is the assertion,
|
||||||
|
not the memory** — the loop now counts `EvaluationResults` per call and refuses a
|
||||||
|
row that does not carry exactly seven, and the users' assume check counts
|
||||||
|
`ResourceSpecificResults` and refuses a row that does not carry exactly two.
|
||||||
|
`CLAUDE.md` records this class five times over; this is the sixth, and it is the
|
||||||
|
"uniformly good" half.
|
||||||
|
|
||||||
|
### Commands — the ones this addendum rests on
|
||||||
|
|
||||||
|
Read-only, run as `user/pouya` in `ca-central-1`. No stderr suppressed, exit
|
||||||
|
status read on every call, and note the **literal** action lists: they are not in
|
||||||
|
a variable, which is the whole point above.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Inline policies — the command the original block never ran.
|
||||||
|
# ⚠️ THE `grep -v` IS THE ORIGINAL DEFECT AND IS KEPT ONLY TO SHOW IT. It
|
||||||
|
# excluded the 7 service-linked roles from a claim written as "every role", and a
|
||||||
|
# service-linked role for a backup or migration service CAN read table contents.
|
||||||
|
# For a full run, DELETE the grep -v — all 33 must be screened, which is what the
|
||||||
|
# 2026-09-02 addendum measured and what the page's "every user and every role"
|
||||||
|
# now rests on.
|
||||||
|
aws iam list-roles --query 'Roles[].RoleName' --output text \
|
||||||
|
| tr '\t' '\n' \
|
||||||
|
| while IFS= read -r R; do
|
||||||
|
aws iam list-role-policies --role-name "$R" --query 'PolicyNames' --output text
|
||||||
|
done
|
||||||
|
|
||||||
|
# 2. Every non-service-linked role, seven actions, decision asserted per row.
|
||||||
|
# The count check is what makes a broken call loud instead of clean.
|
||||||
|
aws iam simulate-principal-policy \
|
||||||
|
--policy-source-arn "arn:aws:iam::327082975128:role/<ROLE>" \
|
||||||
|
--action-names dynamodb:GetItem dynamodb:Query dynamodb:Scan \
|
||||||
|
dynamodb:BatchGetItem dynamodb:PutItem dynamodb:UpdateItem \
|
||||||
|
dynamodb:DeleteItem \
|
||||||
|
--resource-arns "arn:aws:dynamodb:ca-central-1:327082975128:table/adr-intake-submissions" \
|
||||||
|
--query 'length(EvaluationResults)' --output text # must print 7
|
||||||
|
|
||||||
|
# 3. Trust policies of the four roles that can read.
|
||||||
|
aws iam get-role --role-name <ROLE> --query 'Role.AssumeRolePolicyDocument'
|
||||||
|
|
||||||
|
# 4. Who can assume the two lookup roles — per RESOURCE, not per action.
|
||||||
|
aws iam simulate-principal-policy \
|
||||||
|
--policy-source-arn "arn:aws:iam::327082975128:user/<USER>" \
|
||||||
|
--action-names sts:AssumeRole \
|
||||||
|
--resource-arns "arn:aws:iam::327082975128:role/cdk-hnb659fds-lookup-role-327082975128-ca-central-1" \
|
||||||
|
"arn:aws:iam::327082975128:role/cdk-hnb659fds-lookup-role-327082975128-us-east-1" \
|
||||||
|
--query 'EvaluationResults[].ResourceSpecificResults[].{R:EvalResourceName,D:EvalResourceDecision}' \
|
||||||
|
--output text # must print 2 rows
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 5. The CloudFormation / CDK escalation path, per user. Six actions, literal.
|
||||||
|
aws iam simulate-principal-policy \
|
||||||
|
--policy-source-arn "arn:aws:iam::327082975128:user/<USER>" \
|
||||||
|
--action-names cloudformation:CreateStack cloudformation:UpdateStack \
|
||||||
|
cloudformation:CreateChangeSet cloudformation:ExecuteChangeSet \
|
||||||
|
iam:PassRole sts:AssumeRole \
|
||||||
|
--query 'EvaluationResults[].{A:EvalActionName,D:EvalDecision}' --output text
|
||||||
|
|
||||||
|
# 6. Federated identity surfaces, and root.
|
||||||
|
aws iam list-saml-providers --query 'length(SAMLProviderList)'
|
||||||
|
aws iam list-open-id-connect-providers --query 'length(OpenIDConnectProviderList)'
|
||||||
|
aws sso-admin list-instances --query 'length(Instances)'
|
||||||
|
aws iam get-account-summary \
|
||||||
|
--query 'SummaryMap.{AccessKeysPresentRoot:AccountAccessKeysPresent,MFA:AccountMFAEnabled}'
|
||||||
|
|
||||||
|
# 7. The table's OWN policy. ⚠️ NOT VISIBLE IN describe-table — a DynamoDB
|
||||||
|
# resource policy needs its own call, and the page publishes a claim about it.
|
||||||
|
# A "no policy" answer arrives as a NON-ZERO EXIT with PolicyNotFoundException
|
||||||
|
# on stderr, so do not suppress stderr and do not read exit 0 as the result.
|
||||||
|
aws dynamodb get-resource-policy \
|
||||||
|
--resource-arn 'arn:aws:dynamodb:ca-central-1:327082975128:table/adr-intake-submissions'
|
||||||
|
|
||||||
|
# 8. Is the account in an AWS Organization? ⚠️ THIS IS WHAT MAKES COMMAND 6's
|
||||||
|
# sso-admin ZERO CONCLUSIVE. `list-instances` answers about THIS account, so a
|
||||||
|
# member account returns 0 while Identity Center runs in the management
|
||||||
|
# account. Not-in-an-org means there is no such management account.
|
||||||
|
aws organizations describe-organization
|
||||||
|
```
|
||||||
|
|
||||||
|
**Five user rows and THIRTY-THREE role rows, or the run did not happen.** ⚠️
|
||||||
|
**This said "twenty-six" until 2026-09-02, which made an INCOMPLETE sweep pass
|
||||||
|
its own acceptance test** — the number matched command 1's `grep -v
|
||||||
|
'^AWSServiceRole'`, so an operator following §12 R21's instruction to re-run this
|
||||||
|
file would have reproduced the exclusion and got the pass line for it. The page's
|
||||||
|
*"every user and every role"* rests on 33 of 33. `adversarial-reviewer`, round 2.
|
||||||
|
And for every simulation: **seven decisions per role call, six per CDK-path call,
|
||||||
|
two per-resource decisions per assume call** — the counts are the assertion,
|
||||||
|
because a call that silently received one bogus action name answers
|
||||||
|
`implicitDeny` and reads exactly like a clean row. **Commands 7 and 8 are read by
|
||||||
|
their ERROR, not their output**: `PolicyNotFoundException` and
|
||||||
|
`AWSOrganizationsNotInUseException` are each the clean result, arriving on stderr
|
||||||
|
with a non-zero exit.
|
||||||
|
|||||||
@@ -13,6 +13,31 @@ cite it. Do not paraphrase a fact into a page that is not stated here.
|
|||||||
> date and effective date below is as at the retrieval date and nothing more.
|
> date and effective date below is as at the retrieval date and nothing more.
|
||||||
> Re-check before cutover, and before any republish that turns on one of them.
|
> Re-check before cutover, and before any republish that turns on one of them.
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> ⚠️ **THIS FILE CARRIES THE STANDING RE-CHECK INSTRUCTION ABOVE AND WAS
|
||||||
|
> NOT ONE OF R18's SEVEN LIMBS, AND IT WENT UNSTAMPED IN THE FIRST PASS.**
|
||||||
|
> Five of seven extracts were stamped and two were not, so a reader could
|
||||||
|
> not tell whether this one was considered and found non-volatile or simply
|
||||||
|
> missed. Found by `adversarial-reviewer`, 2026-09-02 — the same
|
||||||
|
> control-fires-over-part-of-its-scope defect as R18 having no checklist
|
||||||
|
> item, one notch smaller. **Nothing here was re-retrieved.**
|
||||||
|
>
|
||||||
|
> - **No R18 limb, but ONE CANDIDATE LIMB, and it is flagged rather than
|
||||||
|
> silently adopted.** `/practice/construction/` publishes: *"Ontario Power
|
||||||
|
> Generation … applied in March 2026 for a licence to operate it."* That is a
|
||||||
|
> **pending application**, so it moves the way limb (a) moves. It is not
|
||||||
|
> false today — the application was made, and a completed past act stays
|
||||||
|
> true — which is why this is a note and not a blocker. But a reader takes it
|
||||||
|
> as current status, and unlike limb (a) the sentence is **not time-anchored**
|
||||||
|
> ("when this page was written"). **For Pouya at the next re-check: adopt it
|
||||||
|
> as R18 limb (h), or time-anchor the sentence and drop it.**
|
||||||
|
> - The rest is stable: Part II.1 in force since 2019-10-01, and ODACC's own
|
||||||
|
> statement that it is the Authorized Nominating Authority. The ODACC 2025
|
||||||
|
> Annual Report is cited for institutional facts rather than for figures, so
|
||||||
|
> it does not carry limb (d)'s exposure `[verified 2026-09-02 — swept
|
||||||
|
> `dist/practice/construction/index.html`]`.
|
||||||
|
|
||||||
**Topic as researched:** Ontario construction dispute resolution — the statutory machinery (Construction Act, R.S.O. 1990, c. C.30); plus verification of the OPG Darlington New Nuclear Project and Bruce Power's Bruce C Project
|
**Topic as researched:** Ontario construction dispute resolution — the statutory machinery (Construction Act, R.S.O. 1990, c. C.30); plus verification of the OPG Darlington New Nuclear Project and Bruce Power's Bruce C Project
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -13,6 +13,20 @@ cite it. Do not paraphrase a fact into a page that is not stated here.
|
|||||||
> date and effective date below is as at the retrieval date and nothing more.
|
> date and effective date below is as at the retrieval date and nothing more.
|
||||||
> Re-check before cutover, and before any republish that turns on one of them.
|
> Re-check before cutover, and before any republish that turns on one of them.
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> The trigger fired. `AGENTS.md` §12 R18 holds the per-limb findings and
|
||||||
|
> the sources; this stamp does not restate them. **The quoted bytes below
|
||||||
|
> are still the original retrieval and were not re-fetched** — what was
|
||||||
|
> re-checked is whether the *facts* they support have moved.
|
||||||
|
>
|
||||||
|
> - **(c) ERO 026-0853 — RE-VERIFIED UNMOVED** `[re-checked 2026-09-01 —
|
||||||
|
> Pouya]`. The comment period to 2026-09-12 is still open.
|
||||||
|
> - **(b) the regulation under `Electricity Act` s. 28.1 — NOT RE-RETRIEVED.**
|
||||||
|
> Held unchanged on a cadence judgement rather than a fresh retrieval
|
||||||
|
> `[assumed 2026-09-01 — Pouya: unchanged by its nature at this cadence]`.
|
||||||
|
> That is a weaker stamp than (c) and is written weaker on purpose.
|
||||||
|
|
||||||
**Topic as researched:** Ontario electricity/energy regulatory processes that generate disputes: OEB leave to construct (OEB Act, 1998 ss. 90/92/95/96), the IESO and market participation, the IESO connection assessment process (SIA/CIA), large-load and data-centre grid connection (Electricity Act, 1998 s. 28.1), and Ontario Bill 40
|
**Topic as researched:** Ontario electricity/energy regulatory processes that generate disputes: OEB leave to construct (OEB Act, 1998 ss. 90/92/95/96), the IESO and market participation, the IESO connection assessment process (SIA/CIA), large-load and data-centre grid connection (Electricity Act, 1998 s. 28.1), and Ontario Bill 40
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -13,6 +13,22 @@ cite it. Do not paraphrase a fact into a page that is not stated here.
|
|||||||
> date and effective date below is as at the retrieval date and nothing more.
|
> date and effective date below is as at the retrieval date and nothing more.
|
||||||
> Re-check before cutover, and before any republish that turns on one of them.
|
> Re-check before cutover, and before any republish that turns on one of them.
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> The trigger fired. `AGENTS.md` §12 R18 holds the per-limb findings and
|
||||||
|
> the sources; this stamp does not restate them. **The quoted bytes below
|
||||||
|
> are still the original retrieval and were not re-fetched** — what was
|
||||||
|
> re-checked is whether the *facts* they support have moved.
|
||||||
|
>
|
||||||
|
> - **(d) the Tribunals Ontario annual report — RE-VERIFIED UNMOVED**
|
||||||
|
> `[re-checked 2026-09-01 — Pouya,
|
||||||
|
> <https://tribunalsontario.ca/en/about/governance-and-accountability/>]`.
|
||||||
|
> **No 2025-26 report is published; FY2024-25 remains current**, so the
|
||||||
|
> figures `/practice/insurance/` publishes are still the latest. This closes
|
||||||
|
> the open item at the foot of this file, which asked exactly that question.
|
||||||
|
> - **(e) the SABS, amended with effect 2026-07-01 — NOT RE-RETRIEVED.** Held
|
||||||
|
> unchanged on a cadence judgement `[assumed 2026-09-01 — Pouya]`.
|
||||||
|
|
||||||
**Topic as researched:** Ontario accident benefits (SABS) disputes — regulation, Minor Injury Guideline, the LAT-AABS dispute route, tribunal caseload volume, mediation references in tribunal materials, and FSRA's role
|
**Topic as researched:** Ontario accident benefits (SABS) disputes — regulation, Minor Injury Guideline, the LAT-AABS dispute route, tribunal caseload volume, mediation references in tribunal materials, and FSRA's role
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -341,6 +357,7 @@ honest, and on this project it is the half that has twice been skipped.
|
|||||||
- **Whether a more recent annual report than 2024-25 exists (i.e. a 2025-26 report covering the year ending March 31, 2026).**
|
- **Whether a more recent annual report than 2024-25 exists (i.e. a 2025-26 report covering the year ending March 31, 2026).**
|
||||||
- *Searched:* WebSearch for Tribunals Ontario annual report LAT AABS caseload; retrieved the 2024-25 report, which is dated June 30, 2025 and is the most recent surfaced.
|
- *Searched:* WebSearch for Tribunals Ontario annual report LAT AABS caseload; retrieved the 2024-25 report, which is dated June 30, 2025 and is the most recent surfaced.
|
||||||
- *Outcome:* NOT CONFIRMED either way. The 2024-25 report (fiscal year ending March 31, 2025) is the latest located as of 2026-08-29, but no search was run specifically to rule out a 2025-26 edition. Given today's date, one may well have been published. Re-check before publishing any 'most recent' or 'latest available' framing around these figures.
|
- *Outcome:* NOT CONFIRMED either way. The 2024-25 report (fiscal year ending March 31, 2025) is the latest located as of 2026-08-29, but no search was run specifically to rule out a 2025-26 edition. Given today's date, one may well have been published. Re-check before publishing any 'most recent' or 'latest available' framing around these figures.
|
||||||
|
- *Outcome, R18 re-check:* **CONFIRMED — no 2025-26 edition is published, and FY2024-25 remains current** `[re-checked 2026-09-01 — Pouya, <https://tribunalsontario.ca/en/about/governance-and-accountability/>]`. This closes the item as originally posed. The caution in the line above is retained rather than struck, because it is about a FRAMING and not about this fact: nothing on `/practice/insurance/` calls these figures the most recent or the latest available, and nothing should start to — a 2025-26 edition will appear eventually and a bare year label goes stale gracefully where a superlative does not.
|
||||||
- **What the SABS amendments effective July 1, 2026 actually changed.**
|
- **What the SABS amendments effective July 1, 2026 actually changed.**
|
||||||
- *Searched:* Noted the consolidation banner on the e-Laws SABS page ('From July 1, 2026') and the tribunal's warning that 'Changes to the Statutory Accident Benefits Schedule effective July 1, 2026 may impact your insurance benefits'. Did not fetch O. Reg. 383/24 or the amending instruments.
|
- *Searched:* Noted the consolidation banner on the e-Laws SABS page ('From July 1, 2026') and the tribunal's warning that 'Changes to the Statutory Accident Benefits Schedule effective July 1, 2026 may impact your insurance benefits'. Did not fetch O. Reg. 383/24 or the amending instruments.
|
||||||
- *Outcome:* NOT ESTABLISHED. Search-result snippets suggested that certain benefits became optional, but no primary amending regulation was fetched, so nothing about the substance of the July 2026 changes is asserted here. The s. 3(1) definitions and the s. 18(1) $3,500 limit quoted above ARE from the post-July-2026 consolidation and are current as retrieved.
|
- *Outcome:* NOT ESTABLISHED. Search-result snippets suggested that certain benefits became optional, but no primary amending regulation was fetched, so nothing about the substance of the July 2026 changes is asserted here. The s. 3(1) definitions and the s. 18(1) $3,500 limit quoted above ARE from the post-July-2026 consolidation and are current as retrieved.
|
||||||
|
|||||||
@@ -13,6 +13,22 @@ cite it. Do not paraphrase a fact into a page that is not stated here.
|
|||||||
> date and effective date below is as at the retrieval date and nothing more.
|
> date and effective date below is as at the retrieval date and nothing more.
|
||||||
> Re-check before cutover, and before any republish that turns on one of them.
|
> Re-check before cutover, and before any republish that turns on one of them.
|
||||||
|
|
||||||
|
> ### R18 re-check — cutover pass, 2026-09-01
|
||||||
|
>
|
||||||
|
> ⚠️ **THIS FILE CARRIES THE STANDING RE-CHECK INSTRUCTION ABOVE AND WAS
|
||||||
|
> NOT ONE OF R18's SEVEN LIMBS, AND IT WENT UNSTAMPED IN THE FIRST PASS.**
|
||||||
|
> Five of seven extracts were stamped and two were not, so a reader could
|
||||||
|
> not tell whether this one was considered and found non-volatile or simply
|
||||||
|
> missed. Found by `adversarial-reviewer`, 2026-09-02 — the same
|
||||||
|
> control-fires-over-part-of-its-scope defect as R18 having no checklist
|
||||||
|
> item, one notch smaller. **Nothing here was re-retrieved.**
|
||||||
|
>
|
||||||
|
> - **No volatile limb at this cutover.** The facts this file supports on
|
||||||
|
> `/practice/shareholder/` are OBCA sections and case law, which do not move
|
||||||
|
> at this cadence, and a sweep of the built page for dates, statuses and
|
||||||
|
> "as of" framings returned nothing time-anchored `[verified 2026-09-02 —
|
||||||
|
> swept `dist/practice/shareholder/index.html`]`.
|
||||||
|
|
||||||
**Topic as researched:** Ontario/Canada shareholder, partnership and closely-held business disputes — statutory remedies (oppression, dissent/appraisal, winding up), the Partnerships Act, arbitration references in the corporations statutes; plus an independent re-check of Ontario family arbitration training requirements.
|
**Topic as researched:** Ontario/Canada shareholder, partnership and closely-held business disputes — statutory remedies (oppression, dissent/appraisal, winding up), the Partnerships Act, arbitration references in the corporations statutes; plus an independent re-check of Ontario family arbitration training requirements.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
+2
-1
@@ -20,7 +20,8 @@
|
|||||||
"lighthouse": "node scripts/lighthouse.mjs",
|
"lighthouse": "node scripts/lighthouse.mjs",
|
||||||
"og:proof": "node scripts/og-proof.mjs",
|
"og:proof": "node scripts/og-proof.mjs",
|
||||||
"check:intake": "node scripts/check-intake.mjs",
|
"check:intake": "node scripts/check-intake.mjs",
|
||||||
"bio:pdf": "node scripts/bio-pdf.mjs"
|
"bio:pdf": "node scripts/bio-pdf.mjs",
|
||||||
|
"icons": "node scripts/icons.mjs"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@astrojs/mdx": "^7.0.8",
|
"@astrojs/mdx": "^7.0.8",
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 5.2 KiB |
+87
-30
@@ -259,28 +259,52 @@ const PATTERNS = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'sole-administrator-q62',
|
id: 'sole-administrator-q62',
|
||||||
rule: 'Q62 — /legal/privacy/ claims sole administrative access to the intake table, and that is FALSE.',
|
rule:
|
||||||
|
'Q62 — the sole-administrative-access claim on /legal/privacy/ was FALSE ' +
|
||||||
|
'and is permanently barred from returning. The page does NOT make it now; ' +
|
||||||
|
'if this fired, something reintroduced the shape. ' +
|
||||||
|
"⚠️ IF THE SECOND ADMINISTRATOR'S ACCESS IS EVER ACTUALLY REMOVED, this " +
|
||||||
|
'pattern starts failing the build on TRUE copy, and the answer is neither ' +
|
||||||
|
'to delete it nor to work around it: re-run the verification in ' +
|
||||||
|
'`docs/reference/intake-table-access-verification.md`, rewrite the page to ' +
|
||||||
|
'the new measured truth, and narrow THIS pattern deliberately with a ' +
|
||||||
|
'Change Log entry. Q23 records the Gitea instance as jointly administered, ' +
|
||||||
|
'so that removal is live rather than hypothetical.',
|
||||||
incident:
|
incident:
|
||||||
'The page shipped "nobody else has access to the table. There is no team, ' +
|
'The page shipped "nobody else has access to the table. There is no team, ' +
|
||||||
'no assistant and no external administrator." The AWS account has an ' +
|
'no assistant and no external administrator." while TWO principals could ' +
|
||||||
'`admins` IAM group carrying AdministratorAccess with TWO members, and ' +
|
'read it. It was in dist/, `build`, `check` and this script all exited 0 ' +
|
||||||
'`simulate-principal-policy` returns allowed for dynamodb:GetItem, Query ' +
|
'over it, and the only thing between it and a live privacy policy was a ' +
|
||||||
'and Scan on the table for both ' +
|
'TODO(pouya) in a JSX comment — which Astro strips. The gate was human ' +
|
||||||
'[verified 2026-09-01 — docs/reference/intake-table-access-verification.md]. ' +
|
'memory. Pouya ruled the pattern PERMANENT on 2026-09-01: it no longer ' +
|
||||||
'THE REACHED-DIST CONDITION IS WHY THIS PATTERN EXISTS AT ALL: the ' +
|
'describes live copy, it bars the shape. Do not delete it, and do not ' +
|
||||||
'sentence was in dist/legal/privacy/index.html, `build`, `check` and this ' +
|
'loosen it into a rule about a class. Full history: AGENTS.md entry (an).',
|
||||||
'script all exited 0 over it, and the only thing between it and a live ' +
|
/* THREE CONSTRAINTS, AND THEY ARE WHY THIS IS SHAPED AS IT IS.
|
||||||
'privacy policy was a TODO(pouya) in a JSX comment — which Astro strips, ' +
|
|
||||||
'so `grep -rn "TODO(pouya)" dist/` returned nothing. The gate was human ' +
|
1. `\s+`, NOT LITERAL SPACES. `compressHTML` collapses whitespace between
|
||||||
'memory. Found by `adversarial-reviewer`, 2026-09-01. ' +
|
tags and leaves it alone inside a text node, so the published bytes
|
||||||
'DELETE THIS PATTERN when Q62 is ruled: either the access is removed and ' +
|
read "nobody else has access to\n the table". A literal-space
|
||||||
'the sentence becomes true, or the sentence is rewritten. It is a tripwire ' +
|
version runs, prints `ok`, and exits 0 with the breach in `dist/`.
|
||||||
'on one specific published falsehood, not a rule about a class.',
|
|
||||||
/* `\s+`, NOT LITERAL SPACES: `compressHTML` collapses whitespace between
|
2. EACH ALTERNATIVE IS ONE STRING THAT REACHED `dist/`, NEVER A FAMILY.
|
||||||
tags and leaves it alone inside a text node, so the published bytes read
|
The first draft of alternative 3 was `(?:or|and)\s+(?:outside|external)`
|
||||||
"nobody else has access to\n the table". A literal-space version
|
— four phrasings where one was published, so three had no probe and no
|
||||||
runs, prints `ok`, and exits 0 with the breach in `dist/`. */
|
negative fixture, which is the freeze's stated condition.
|
||||||
re: /nobody\s+else\s+has\s+access\s+to\s+the\s+table|there\s+is\s+no\s+team,\s+no\s+assistant\s+and\s+no\s+external\s+administrator/gi,
|
|
||||||
|
3. ALTERNATIVE 3 IS A DELIBERATE OVER-BAR AND THIS IS ITS COST. The
|
||||||
|
truthful receipt-scoped sentence CONTAINS the published string, so any
|
||||||
|
pattern catching one catches the other — adding that truthful form as a
|
||||||
|
negative fixture failed the self-test, which is the instrument check
|
||||||
|
working. So: the clause "no assistant or outside administrator" cannot
|
||||||
|
be published here in ANY scoping, true or false, without failing this
|
||||||
|
build. That is the right trade for a phrase that has already put a
|
||||||
|
false statement on a privacy policy, and `rule:` says what to do. A
|
||||||
|
lookahead tuned to one guessed phrasing would be the speculative
|
||||||
|
pattern the freeze bars.
|
||||||
|
|
||||||
|
The window in alternative 5 is `[^\w<]{0,8}`, not `\W{0,8}`: `\W` matches
|
||||||
|
`<` and the block sentinel, so it would have been bounded by neither. */
|
||||||
|
re: /nobody\s+else\s+has\s+access\s+to\s+the\s+table|there\s+is\s+no\s+team,\s+no\s+assistant\s+and\s+no\s+external\s+administrator|no\s+assistant\s+or\s+outside\s+administrator|one\s+administrative\s+account,\s+which\s+is\s+mine|honest\s+answer\s+to\s+[^\w<]{0,8}who\s+can\s+see\s+this[^\w<]{0,8}\s*is:\s+me/gi,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -367,27 +391,60 @@ const FIXTURES = {
|
|||||||
'C.Med-Arbitration',
|
'C.Med-Arbitration',
|
||||||
],
|
],
|
||||||
'sole-administrator-q62': [
|
'sole-administrator-q62': [
|
||||||
/* The two published clauses, verbatim from dist/legal/privacy/. */
|
/* The FIVE published clauses from dist/legal/privacy/ as it stood at
|
||||||
|
`bd282aa`, before the Q62 correction. The first form of the pattern
|
||||||
|
caught only the first two: clauses 3 and 4 are the same falsehood in
|
||||||
|
different words in a different section, and clause 5 is the summary
|
||||||
|
that would have re-asserted the struck number. */
|
||||||
'nobody else has access to the table',
|
'nobody else has access to the table',
|
||||||
'There is no team, no assistant and no external administrator.',
|
'There is no team, no assistant and no external administrator.',
|
||||||
|
'no analytics on the submission, and no assistant or outside administrator.',
|
||||||
|
'The table is reachable by the function that writes to it and by one administrative account, which is mine',
|
||||||
|
/* The third surface — the summary that would have re-asserted the struck
|
||||||
|
number four lines below the corrected paragraph. */
|
||||||
|
'So the honest answer to "who can see this" is: me, and Google as the company that runs my mail.',
|
||||||
],
|
],
|
||||||
'struck-universal-q39': [
|
'struck-universal-q39': [
|
||||||
'Anyone may be appointed an arbitrator in Ontario',
|
'Anyone may be appointed an arbitrator in Ontario',
|
||||||
'nothing in law gates the role',
|
'nothing in law gates the role',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
/* Every one of these is real published or spec-approved copy on this site. */
|
/* Mostly real published or spec-approved copy on this site. A few are
|
||||||
|
deliberate NEAR MISSES — truthful sentences about the same subject that
|
||||||
|
were never published — because a pattern also has to be proven silent on
|
||||||
|
the wording a correction is likely to reach for. Where a fixture is one of
|
||||||
|
those, the comment beside it says so. */
|
||||||
mustNotMatch: [
|
mustNotMatch: [
|
||||||
/* NEGATIVE FIXTURES FOR `sole-administrator-q62` — the approved copy nearest
|
/* NEGATIVE FIXTURES FOR `sole-administrator-q62`. The first FIVE are LIVE
|
||||||
to the two clauses it catches. The pattern is deliberately anchored on the
|
PAGE COPY, verbatim from the corrected `/legal/privacy/` — which is the
|
||||||
two published sentences rather than on the ideas in them, because the
|
fixture that matters, because Q62's ruling required this pattern to be
|
||||||
replacement wording is not yet decided and a looser pattern would fire on
|
proven silent on the true sentence as well as loud on the false one.
|
||||||
whatever Q62's ruling produces. These four are what "nearest" means: the
|
RE-SYNC THEM WHENEVER THAT COPY CHANGES. ⚠️ **A SENTENCE THAT LEAVES THE
|
||||||
same page's true sentences about the same subject. */
|
PAGE LEAVES THIS LIST — it is not kept as a near miss.** Struck copy in a
|
||||||
|
list captioned "what this site legitimately publishes" is an invitation to
|
||||||
|
restore it. The rest below ARE near misses on the same subject: the
|
||||||
|
pattern is anchored on five strings that reached `dist/`, not on the ideas
|
||||||
|
in them, so a truthful sentence about administrative access must pass.
|
||||||
|
Rendered as text, without the `<strong>` wrappers — what is proven is that
|
||||||
|
the PATTERN is silent on the words. */
|
||||||
|
'The record in the table: me, and the small number of people who administer the account it sits in with me.',
|
||||||
|
'The system that receives what you send can only add a record — it cannot read back what is stored.',
|
||||||
|
"The notification goes to the practice's mailbox, which is read by me and by administrative staff and is hosted on Google Workspace — so Google holds a copy of whatever you send me.",
|
||||||
|
'The confirmation that went to you sits with whoever runs your email. That copy is in your hands rather than mine.',
|
||||||
|
'No one else is sent it. There is no CRM, no mailing list and no analytics on the submission.',
|
||||||
'The table is reachable by the function that writes to it.',
|
'The table is reachable by the function that writes to it.',
|
||||||
'Two accounts hold administrative access to the AWS account, and the function that writes to the table cannot read it.',
|
'Two accounts hold administrative access to the AWS account, and the function that writes to the table cannot read it.',
|
||||||
'Nobody else has access to my mailbox.',
|
/* ⚠️ TWO FIXTURES WERE REMOVED FROM HERE ON 2026-09-02 AND THE REASON
|
||||||
'There is no team. Every inquiry is read by me.',
|
MATTERS MORE THAN THE STRINGS: `'Nobody else has access to my mailbox.'`
|
||||||
|
and `'There is no team. Every inquiry is read by me.'` They were added as
|
||||||
|
harmless near-misses, and §7's `info@smlcompany.ca` row then established
|
||||||
|
that the mailbox is DELEGATED — Pouya and administrative staff — which
|
||||||
|
makes both FALSE. The second is also a paraphrase of a `mustMatch` breach
|
||||||
|
string. This list is documented as the copy the site legitimately
|
||||||
|
publishes, so a maintainer reaching for a tidier answer would have found
|
||||||
|
one here, which is how this page acquired its false sentence the first
|
||||||
|
time. Removing a false fixture keeps the list true; it is not a coverage
|
||||||
|
change and the freeze does not reach it. `adversarial-reviewer`, round 1. */
|
||||||
'I act as a neutral. I do not act for a party in a matter I take, and each party should have their own legal advice.',
|
'I act as a neutral. I do not act for a party in a matter I take, and each party should have their own legal advice.',
|
||||||
'I run a process, I do not run a case for anybody in it.',
|
'I run a process, I do not run a case for anybody in it.',
|
||||||
'I will not run a process whose shape nobody agreed to in advance.',
|
'I will not run a process whose shape nobody agreed to in advance.',
|
||||||
|
|||||||
@@ -0,0 +1,278 @@
|
|||||||
|
/**
|
||||||
|
* Regenerates `public/favicon.ico` from the committed brand master.
|
||||||
|
*
|
||||||
|
* LOCAL ONLY, like `bio:pdf`. Not wired into `npm run build` or either deploy
|
||||||
|
* path — the icons are committed artefacts and this is what re-derives them.
|
||||||
|
*
|
||||||
|
* Writes the favicon ONLY. `apple-touch-icon.png` is deliberately not touched
|
||||||
|
* and must stay opaque — `docs/reference/brand-assets.md` §The icon set.
|
||||||
|
*/
|
||||||
|
import { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
import sharp from 'sharp';
|
||||||
|
|
||||||
|
const root = fileURLToPath(new URL('..', import.meta.url));
|
||||||
|
const MARK = `${root}src/assets/brand/sml-infinity-mark.png`;
|
||||||
|
const MASTER = `${root}src/assets/brand/sml-infinity-mark-master.png`;
|
||||||
|
const OUT = `${root}public/favicon.ico`;
|
||||||
|
|
||||||
|
/** Sizes carried in the container, ascending — the order BaseLayout declares. */
|
||||||
|
const SIZES = [16, 32, 48];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The mark spans 7/8 of the canvas and is centred on both axes. Not a taste
|
||||||
|
* decision at this point: it is the composition already shipping, measured off
|
||||||
|
* the previous icon at all three sizes (14/16, 28/32, 42/48) and off the touch
|
||||||
|
* icon (158/180). Regenerating for alpha must not also restyle the mark.
|
||||||
|
*/
|
||||||
|
const INK_FRACTION = 7 / 8;
|
||||||
|
|
||||||
|
/** `--cream` — the ground the previous icon was matted against. */
|
||||||
|
const CREAM = [250, 247, 242];
|
||||||
|
|
||||||
|
const die = (msg) => {
|
||||||
|
rmSync(`${OUT}.candidate`, { force: true });
|
||||||
|
console.error(`icons: ${msg}`);
|
||||||
|
process.exit(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* R14 — the icon must be traceable to the artwork in this repository, not to a
|
||||||
|
* file on someone's disk. The render source is a tight crop of the master, so
|
||||||
|
* assert it still IS that crop before deriving anything from it.
|
||||||
|
*/
|
||||||
|
async function assertProvenance() {
|
||||||
|
const mark = await sharp(MARK).metadata();
|
||||||
|
const crop = { left: 159, top: 646, width: 2668, height: 1704 };
|
||||||
|
if (mark.width !== crop.width || mark.height !== crop.height) {
|
||||||
|
die(
|
||||||
|
`render source is ${mark.width}x${mark.height}, expected ${crop.width}x${crop.height}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const [a, b] = await Promise.all([
|
||||||
|
sharp(MASTER).extract(crop).raw().toBuffer(),
|
||||||
|
sharp(MARK).raw().toBuffer(),
|
||||||
|
]);
|
||||||
|
if (!a.equals(b))
|
||||||
|
die('render source is no longer the documented crop of the master');
|
||||||
|
console.log(
|
||||||
|
`provenance: ${crop.width}x${crop.height} at (${crop.left},${crop.top}) of the master — identical`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The whole point of the regeneration. A source without alpha would mean
|
||||||
|
* deriving a mask from the cream ground, which is a different and lossier job —
|
||||||
|
* so fail rather than silently ship a matted icon again.
|
||||||
|
*/
|
||||||
|
async function loadMark() {
|
||||||
|
const meta = await sharp(MARK).metadata();
|
||||||
|
if (!meta.hasAlpha)
|
||||||
|
die(
|
||||||
|
`${MARK} has no alpha channel — cannot export a transparent icon from it`,
|
||||||
|
);
|
||||||
|
const { data, info } = await sharp(MARK)
|
||||||
|
.ensureAlpha()
|
||||||
|
.raw()
|
||||||
|
.toBuffer({ resolveWithObject: true });
|
||||||
|
let transparent = 0;
|
||||||
|
for (let p = 3; p < data.length; p += 4) if (data[p] === 0) transparent++;
|
||||||
|
if (transparent === 0)
|
||||||
|
die(`${MARK} declares alpha but every pixel is opaque`);
|
||||||
|
console.log(
|
||||||
|
`source: ${info.width}x${info.height} alpha, ${transparent} fully transparent px`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resize onto a TRANSPARENT canvas. sharp premultiplies around the resample, so
|
||||||
|
* the ribbon's anti-aliased edge blends toward its own colour rather than
|
||||||
|
* toward the RGB sitting under alpha 0 — that is the cream halo this change
|
||||||
|
* exists to remove, and it would come straight back with a matted background.
|
||||||
|
*/
|
||||||
|
async function frame(size) {
|
||||||
|
const w = Math.round(size * INK_FRACTION);
|
||||||
|
const png = await sharp(MARK)
|
||||||
|
.resize({
|
||||||
|
width: w,
|
||||||
|
kernel: 'lanczos3',
|
||||||
|
fit: 'inside',
|
||||||
|
withoutEnlargement: false,
|
||||||
|
})
|
||||||
|
.toBuffer();
|
||||||
|
const { height: h } = await sharp(png).metadata();
|
||||||
|
if (h > size) die(`size ${size}: mark is ${w}x${h}, taller than the canvas`);
|
||||||
|
const left = Math.round((size - w) / 2);
|
||||||
|
const top = Math.round((size - h) / 2);
|
||||||
|
const out = await sharp({
|
||||||
|
create: {
|
||||||
|
width: size,
|
||||||
|
height: size,
|
||||||
|
channels: 4,
|
||||||
|
background: { r: 0, g: 0, b: 0, alpha: 0 },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.composite([{ input: png, left, top }])
|
||||||
|
.png({ compressionLevel: 9, effort: 10, palette: false })
|
||||||
|
.toBuffer();
|
||||||
|
console.log(
|
||||||
|
` ${size}x${size}: mark ${w}x${h} at (${left},${top}), ${out.length} B`,
|
||||||
|
);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ICO container: 6-byte header, one 16-byte directory entry per frame, then the PNG payloads. */
|
||||||
|
function buildIco(frames) {
|
||||||
|
const header = Buffer.alloc(6);
|
||||||
|
header.writeUInt16LE(0, 0); // reserved
|
||||||
|
header.writeUInt16LE(1, 2); // type 1 = icon
|
||||||
|
header.writeUInt16LE(frames.length, 4);
|
||||||
|
|
||||||
|
const dir = Buffer.alloc(16 * frames.length);
|
||||||
|
let offset = header.length + dir.length;
|
||||||
|
frames.forEach(({ size, png }, i) => {
|
||||||
|
const e = i * 16;
|
||||||
|
dir[e] = size; // width — a byte; 0 would mean 256, which SIZES never is
|
||||||
|
dir[e + 1] = size; // height
|
||||||
|
dir[e + 2] = 0; // palette size — 0 for truecolour
|
||||||
|
dir[e + 3] = 0; // reserved
|
||||||
|
dir.writeUInt16LE(1, e + 4); // colour planes
|
||||||
|
dir.writeUInt16LE(32, e + 6); // bits per pixel
|
||||||
|
dir.writeUInt32LE(png.length, e + 8);
|
||||||
|
dir.writeUInt32LE(offset, e + 12);
|
||||||
|
offset += png.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
return Buffer.concat([header, dir, ...frames.map((f) => f.png)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-read the container FROM DISK and decode each frame, rather than inspecting
|
||||||
|
* the buffers we just built — a check that reads its own inputs proves nothing.
|
||||||
|
* (It is still `sharp` decoding `sharp`'s output, so it is not a second
|
||||||
|
* instrument. The independent reads are in `docs/reference/brand-assets.md`.)
|
||||||
|
*/
|
||||||
|
async function verify(path) {
|
||||||
|
const buf = readFileSync(path);
|
||||||
|
const count = buf.readUInt16LE(4);
|
||||||
|
if (count !== SIZES.length)
|
||||||
|
die(`container declares ${count} frames, expected ${SIZES.length}`);
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
const e = 6 + i * 16;
|
||||||
|
const size = buf[e];
|
||||||
|
const len = buf.readUInt32LE(e + 8);
|
||||||
|
const off = buf.readUInt32LE(e + 12);
|
||||||
|
if (off + len > buf.length)
|
||||||
|
die(`frame ${i}: range ${off}+${len} exceeds ${buf.length} B`);
|
||||||
|
const { data, info } = await sharp(buf.subarray(off, off + len))
|
||||||
|
.ensureAlpha()
|
||||||
|
.raw()
|
||||||
|
.toBuffer({ resolveWithObject: true });
|
||||||
|
if (info.width !== size || info.height !== size)
|
||||||
|
die(`frame ${i}: decoded ${info.width}x${info.height}, dir says ${size}`);
|
||||||
|
const corners = [
|
||||||
|
[0, 0],
|
||||||
|
[size - 1, 0],
|
||||||
|
[0, size - 1],
|
||||||
|
[size - 1, size - 1],
|
||||||
|
];
|
||||||
|
for (const [x, y] of corners) {
|
||||||
|
const a = data[(y * size + x) * 4 + 3];
|
||||||
|
if (a !== 0)
|
||||||
|
die(`frame ${size}: corner (${x},${y}) has alpha ${a}, expected 0`);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* THE CORNER AND TRANSPARENCY CHECKS CANNOT SEE A CREAM HALO. A frame whose
|
||||||
|
* edge was matted against cream and then had its background knocked out has
|
||||||
|
* clear corners, transparent pixels and opaque pixels, and passes every one
|
||||||
|
* of them. What distinguishes it is the colour the edge blends TOWARD.
|
||||||
|
*
|
||||||
|
* ⚠️ AND IT IS THE BOUNDARY, NOT THE PARTIAL-ALPHA PIXELS. A first version
|
||||||
|
* of this guard inspected only pixels at 0 < alpha < 255 and MISSED a
|
||||||
|
* purpose-built haloed fixture entirely, because a knockout sets alpha per
|
||||||
|
* pixel and leaves NO partial alpha at all — 0 such pixels in the fixture.
|
||||||
|
* A guard that cannot see the defect it is named for is worse than none.
|
||||||
|
*
|
||||||
|
* So: take every painted pixel that touches a fully transparent one, and
|
||||||
|
* measure how many sit near cream. Measured on this artwork — correct
|
||||||
|
* frames 1 / 2 / 5 of 61 / 146 / 258 boundary pixels (1.4-1.9%); the haloed
|
||||||
|
* fixture 33 of 115 (28.7%). The gate is 10%, roughly 5x clear of both.
|
||||||
|
*/
|
||||||
|
const NEAR_CREAM = 20;
|
||||||
|
const HALO_SHARE = 0.1;
|
||||||
|
const alphaAt = (x, y) =>
|
||||||
|
x < 0 || y < 0 || x >= size || y >= size
|
||||||
|
? 0
|
||||||
|
: data[(y * size + x) * 4 + 3];
|
||||||
|
let clear = 0;
|
||||||
|
let ink = 0;
|
||||||
|
let boundary = 0;
|
||||||
|
let boundaryNearCream = 0;
|
||||||
|
for (let y = 0; y < size; y++) {
|
||||||
|
for (let x = 0; x < size; x++) {
|
||||||
|
const i = (y * size + x) * 4;
|
||||||
|
const a = data[i + 3];
|
||||||
|
if (a === 0) {
|
||||||
|
clear++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (a === 255) ink++;
|
||||||
|
const onEdge =
|
||||||
|
alphaAt(x - 1, y) === 0 ||
|
||||||
|
alphaAt(x + 1, y) === 0 ||
|
||||||
|
alphaAt(x, y - 1) === 0 ||
|
||||||
|
alphaAt(x, y + 1) === 0;
|
||||||
|
if (!onEdge) continue;
|
||||||
|
boundary++;
|
||||||
|
const d = Math.max(
|
||||||
|
Math.abs(data[i] - CREAM[0]),
|
||||||
|
Math.abs(data[i + 1] - CREAM[1]),
|
||||||
|
Math.abs(data[i + 2] - CREAM[2]),
|
||||||
|
);
|
||||||
|
if (d <= NEAR_CREAM) boundaryNearCream++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const share = boundary === 0 ? 0 : boundaryNearCream / boundary;
|
||||||
|
if (clear === 0)
|
||||||
|
die(`frame ${size}: no transparent pixels — the ground is fully matted`);
|
||||||
|
if (ink === 0)
|
||||||
|
die(`frame ${size}: no opaque pixels — the mark did not render`);
|
||||||
|
if (boundary === 0)
|
||||||
|
die(`frame ${size}: no boundary pixels — cannot test the edge colour`);
|
||||||
|
if (share > HALO_SHARE)
|
||||||
|
die(
|
||||||
|
`frame ${size}: ${boundaryNearCream} of ${boundary} boundary pixels ` +
|
||||||
|
`(${(share * 100).toFixed(1)}%) sit within ${NEAR_CREAM} of cream — ` +
|
||||||
|
`the edge was matted against the ground before the ground was removed`,
|
||||||
|
);
|
||||||
|
console.log(
|
||||||
|
` ${size}x${size}: ${clear} transparent, ${ink} opaque, corners clear, ` +
|
||||||
|
`edge ${(share * 100).toFixed(1)}% near cream`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
console.log(`verified ${path} (${buf.length} B)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
await assertProvenance();
|
||||||
|
await loadMark();
|
||||||
|
console.log('frames:');
|
||||||
|
const frames = [];
|
||||||
|
for (const size of SIZES) frames.push({ size, png: await frame(size) });
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verify a CANDIDATE file, then move it into place. Writing OUT first and
|
||||||
|
* verifying after would mean a failing check exits 1 having already replaced a
|
||||||
|
* good favicon with the one it just rejected — and nothing downstream re-checks,
|
||||||
|
* because this script is deliberately outside the build and both deploy paths.
|
||||||
|
*/
|
||||||
|
const candidate = `${OUT}.candidate`;
|
||||||
|
writeFileSync(candidate, buildIco(frames));
|
||||||
|
console.log('verify:');
|
||||||
|
try {
|
||||||
|
await verify(candidate);
|
||||||
|
} catch (err) {
|
||||||
|
rmSync(candidate, { force: true });
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
renameSync(candidate, OUT);
|
||||||
|
console.log(`wrote ${OUT}`);
|
||||||
+9
-1
@@ -172,9 +172,17 @@ export const INTAKE_FIELDS: readonly IntakeField[] = [
|
|||||||
* is the one the inquirer ticks; both ship on `/contact/`, which is deliberate:
|
* is the one the inquirer ticks; both ship on `/contact/`, which is deliberate:
|
||||||
* `docs/01` requires the page to carry the notice, and `docs/05` requires the
|
* `docs/01` requires the page to carry the notice, and `docs/05` requires the
|
||||||
* checkbox to carry it too.
|
* checkbox to carry it too.
|
||||||
|
*
|
||||||
|
* ⚠️ **IT NAMES SML COMPANY LTD — Pouya's ruling, 2026-09-02 — AND THREE
|
||||||
|
* CONSTRAINTS RIDE ON THAT.** **Name only, no terminal period**, and never
|
||||||
|
* beside the licence-status row (`AGENTS.md` §4). **`docs/05` §Consent text is a
|
||||||
|
* byte-identical second copy with no `check:` script over it**, so it moves with
|
||||||
|
* this string. And **`/legal/privacy/` must keep naming the same party** — it
|
||||||
|
* does, under §Why it is collected; a consent naming a company the linked policy
|
||||||
|
* never mentions is an accountability gap, not a matter of voice.
|
||||||
*/
|
*/
|
||||||
export const CONSENT_TEXT =
|
export const CONSENT_TEXT =
|
||||||
'I consent to Pouya Lajevardi storing and using the information in this form ' +
|
'I consent to SML Company Ltd storing and using the information in this form ' +
|
||||||
'to respond to my inquiry and to run a conflicts check. I understand that ' +
|
'to respond to my inquiry and to run a conflicts check. I understand that ' +
|
||||||
'submitting this form does not create a retainer, does not appoint a neutral, ' +
|
'submitting this form does not create a retainer, does not appoint a neutral, ' +
|
||||||
'and does not itself establish a mediator–party relationship.';
|
'and does not itself establish a mediator–party relationship.';
|
||||||
|
|||||||
+5
-1
@@ -124,7 +124,11 @@ export function personNode(
|
|||||||
|
|
||||||
R10 fires on an event, not a date: re-confirm before any cutover or major
|
R10 fires on an event, not a date: re-confirm before any cutover or major
|
||||||
republish, and re-stamp §4. That covers this field as well as the visible
|
republish, and re-stamp §4. That covers this field as well as the visible
|
||||||
list. */
|
list. **Last fired 2026-09-02** — all four re-confirmed by Pouya on the day
|
||||||
|
of cutover. ⚠️ **The stamp lives on `CREDENTIALS.memberships` in site.ts
|
||||||
|
and THIS FIELD READS `MEMBERSHIP_ORGS`** — a different array, as the note
|
||||||
|
seven lines above says. Content parity between them is manual, so
|
||||||
|
re-stamping is not the same act as re-checking that the two agree. */
|
||||||
...(opts.memberships
|
...(opts.memberships
|
||||||
? {
|
? {
|
||||||
memberOf: MEMBERSHIP_ORGS.map((name) => ({
|
memberOf: MEMBERSHIP_ORGS.map((name) => ({
|
||||||
|
|||||||
+9
-5
@@ -75,9 +75,10 @@ export const CREDENTIALS = {
|
|||||||
],
|
],
|
||||||
languages: ['English', 'Farsi'],
|
languages: ['English', 'Farsi'],
|
||||||
/**
|
/**
|
||||||
* [verified 2026-08-28 — Pouya, AGENTS.md Q44] — re-stamped when Q44 closed;
|
* [verified 2026-09-02 — Pouya, R10's cutover fire] — re-confirmed on the day
|
||||||
* the original confirmation was 2026-08-26 (Q28 plus the CTF addition of the same
|
* of cutover: ADRIC, ADRIO, the three OBA sections and the CTF all current.
|
||||||
* date] — and FOR NOW.
|
* Earlier stamps: 2026-08-28 (Q44), 2026-08-26 (Q28 plus the CTF addition of
|
||||||
|
* the same date). AND FOR NOW — the stamp is a snapshot, not a warranty.
|
||||||
*
|
*
|
||||||
* WHAT §4 ACTUALLY SAYS ABOUT RENEWAL, because a widened version of it reached
|
* WHAT §4 ACTUALLY SAYS ABOUT RENEWAL, because a widened version of it reached
|
||||||
* a public page. §4, quoted exactly: *"the OBA sections and the CTF renew
|
* a public page. §4, quoted exactly: *"the OBA sections and the CTF renew
|
||||||
@@ -95,8 +96,11 @@ export const CREDENTIALS = {
|
|||||||
*
|
*
|
||||||
* **PUBLISHED FROM 2026-08-28 — Q44 CLOSED.** Pouya re-confirmed all four as
|
* **PUBLISHED FROM 2026-08-28 — Q44 CLOSED.** Pouya re-confirmed all four as
|
||||||
* current, which discharges R10's prohibition, and `/about/` now renders a
|
* current, which discharges R10's prohibition, and `/about/` now renders a
|
||||||
* Memberships group from this array. Re-stamped `[verified 2026-08-28 —
|
* Memberships group from this array.
|
||||||
* Pouya]`; the earlier stamp was 2026-08-26.
|
*
|
||||||
|
* **RE-CONFIRMED 2026-09-02 — R10's cutover event, and that is the stamp
|
||||||
|
* above.** R10 fires on an event and cutover is one of its two; a stamp is not
|
||||||
|
* a renewal receipt, so this was asked again rather than read again.
|
||||||
*
|
*
|
||||||
* ⚠️ **RENDER THE LIST; NEVER RENDER A CLAIM ABOUT ITS CURRENCY.** No
|
* ⚠️ **RENDER THE LIST; NEVER RENDER A CLAIM ABOUT ITS CURRENCY.** No
|
||||||
* "renewed annually", no "current as of", no "listed as current", no stamp
|
* "renewed annually", no "current as of", no "listed as current", no stamp
|
||||||
|
|||||||
@@ -56,7 +56,11 @@ const { preloadSerifItalic = false, ...seo } = Astro.props;
|
|||||||
/* No SVG favicon. The mark is a shaded ribbon, not flat vector paths, so
|
/* No SVG favicon. The mark is a shaded ribbon, not flat vector paths, so
|
||||||
there is no honest SVG of it to serve — see InfinityMark.astro and
|
there is no honest SVG of it to serve — see InfinityMark.astro and
|
||||||
AGENTS.md Q38. The .ico carries 16/32/48, and is what crawlers request
|
AGENTS.md Q38. The .ico carries 16/32/48, and is what crawlers request
|
||||||
at the root regardless of what is declared here. */
|
at the root regardless of what is declared here.
|
||||||
|
|
||||||
|
The .ico is transparent and the touch icon is opaque cream ON PURPOSE —
|
||||||
|
do not change either to match the other:
|
||||||
|
docs/reference/brand-assets.md §The icon set. */
|
||||||
}
|
}
|
||||||
<link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48" />
|
<link rel="icon" href="/favicon.ico" sizes="16x16 32x32 48x48" />
|
||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
|
|||||||
@@ -203,8 +203,15 @@ const designationLine = [
|
|||||||
*
|
*
|
||||||
* **Q44 closed 2026-08-28.** Pouya re-confirmed all four as current — ADRIC,
|
* **Q44 closed 2026-08-28.** Pouya re-confirmed all four as current — ADRIC,
|
||||||
* ADRIO, the three OBA sections, and the Canadian Tax Foundation — which
|
* ADRIO, the three OBA sections, and the Canadian Tax Foundation — which
|
||||||
* discharges R10's prohibition and puts the group back on the page. §4 is
|
* discharges R10's prohibition and puts the group back on the page.
|
||||||
* re-stamped `[verified 2026-08-28 — Pouya]`.
|
*
|
||||||
|
* **RE-CONFIRMED AGAIN 2026-09-02 — R10's cutover fire.** All four current;
|
||||||
|
* §4 and `CREDENTIALS.memberships` re-stamped `[verified 2026-09-02 — Pouya]`.
|
||||||
|
* ⚠️ **THIS COMMENT IS A FOURTH STAMP-BEARING SITE and it carried the
|
||||||
|
* 2026-08-28 date in the present tense after the re-stamp** — `docs/06`'s R10
|
||||||
|
* instruction named three files and not this one, so the next fire would have
|
||||||
|
* missed it again (`adversarial-reviewer`, round 2). The instruction now names
|
||||||
|
* four.
|
||||||
*
|
*
|
||||||
* **DO NOT ADD A CURRENCY SENTENCE.** Not "renewed annually", not "current as
|
* **DO NOT ADD A CURRENCY SENTENCE.** Not "renewed annually", not "current as
|
||||||
* of", not "listed as current", not a stamp date in the markup. His ruling is
|
* of", not "listed as current", not a stamp date in the markup. His ruling is
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ const RETENTION_MONTHS = 24;
|
|||||||
|
|
||||||
/** Bump this on ANY substantive edit. A privacy policy with a stale date is a
|
/** Bump this on ANY substantive edit. A privacy policy with a stale date is a
|
||||||
* policy a reader cannot tell they are reading an old version of. */
|
* policy a reader cannot tell they are reading an old version of. */
|
||||||
const LAST_UPDATED = '31 August 2026';
|
const LAST_UPDATED = '2 September 2026';
|
||||||
|
|
||||||
/* Rendered from the form's own field list, so the two cannot drift. `consent`
|
/* Rendered from the form's own field list, so the two cannot drift. `consent`
|
||||||
and the honeypot are absent from `INTAKE_FIELDS` deliberately and are
|
and the honeypot are absent from `INTAKE_FIELDS` deliberately and are
|
||||||
@@ -122,10 +122,30 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
<ul>
|
<ul>
|
||||||
{COLLECTED.map((label) => <li>{label}</li>)}
|
{COLLECTED.map((label) => <li>{label}</li>)}
|
||||||
</ul>
|
</ul>
|
||||||
|
{
|
||||||
|
/* ⚠️ DO NOT WRITE "your IP address" HERE, AND DO NOT CONCLUDE ANYTHING
|
||||||
|
ABOUT WHETHER THE ADDRESS IDENTIFIES ANYONE. The handler stores
|
||||||
|
`requestContext.http.sourceIp` — behind the `/api/*` behaviour that
|
||||||
|
is a CloudFront edge, so the expected value is Amazon's. **Expected,
|
||||||
|
not measured:** `docs/09` Part 7.2 measures it at cutover and
|
||||||
|
enumerates three outcomes, one of which is that the reader's own
|
||||||
|
address does land. This copy therefore states only why the field is
|
||||||
|
kept, which is true in all three. A previous form hedged "usually
|
||||||
|
not yours" and then asserted "not precise enough to identify you" —
|
||||||
|
false in exactly the branch the hedge admitted. `claims-auditor`,
|
||||||
|
then `adversarial-reviewer` round 2. */
|
||||||
|
}
|
||||||
<p>
|
<p>
|
||||||
Submitting the form also records the date and time, your IP address
|
Submitting the form also records the date and time and your browser's
|
||||||
and your browser's user-agent string. Those three are kept for
|
user-agent string. Those two are kept for investigating abuse of the
|
||||||
investigating abuse of the form and are not used for anything else.
|
form and are not used for anything else.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
It also records the network address the request arrived from. This
|
||||||
|
site sits behind a content delivery network, so that address is
|
||||||
|
normally the network's own rather than your connection's — which is
|
||||||
|
why it is kept simply because it arrives with the request, and not as
|
||||||
|
a way of identifying anyone.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Nothing else on this site collects personal information. There is no
|
Nothing else on this site collects personal information. There is no
|
||||||
@@ -151,7 +171,9 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
<p>
|
<p>
|
||||||
To reply to your inquiry and to run a conflicts check. The basis is
|
To reply to your inquiry and to run a conflicts check. The basis is
|
||||||
your consent, which the form asks for explicitly with an unchecked box
|
your consent, which the form asks for explicitly with an unchecked box
|
||||||
you have to tick. The wording you agree to is on the form itself.
|
you have to tick. The wording you agree to is on the form itself, and
|
||||||
|
it names <strong>SML Company Ltd</strong>, the company that holds this
|
||||||
|
practice's systems.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
It is not used for marketing. It is not sold, rented or shared with
|
It is not used for marketing. It is not sold, rented or shared with
|
||||||
@@ -162,31 +184,22 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
<p>
|
<p>
|
||||||
In a DynamoDB table in Amazon Web Services' Canada Central region, in
|
In a DynamoDB table in Amazon Web Services' Canada Central region, in
|
||||||
Canada. It is encrypted at rest. Two emails are sent when you submit
|
Canada. It is encrypted at rest. Two emails are sent when you submit
|
||||||
the form — a notification to me and a confirmation to you — using
|
the form — a notification to the practice and a confirmation to you —
|
||||||
Amazon Simple Email Service, also in the same Canadian region.
|
using Amazon Simple Email Service, also in the same Canadian region.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The table sits in an Amazon Web Services account that also runs
|
||||||
|
systems unrelated to this practice.
|
||||||
</p>
|
</p>
|
||||||
{
|
{
|
||||||
/* ⚠️ THIS PARAGRAPH REPLACED A FALSE ONE, AND IT IS THE MOST SERIOUS
|
/* ⚠️ TWO PROCESSORS, AND BOTH MUST BE NAMED. `AGENTS.md` §7 records
|
||||||
THING FOUND IN THE STEP 7–10 REVIEW. It read: *"Amazon Web Services
|
mail hosting as **Google Workspace** and D18 sends the notification to
|
||||||
is therefore a processor for this information. **No other third party
|
`info@smlcompany.ca`, so Google receives and stores every submission —
|
||||||
receives it.**"*
|
including the opposing parties and their counsel, the most sensitive
|
||||||
|
thing this form collects. A reader making a PIPEDA access request
|
||||||
`AGENTS.md` §7 records mail hosting as **Google Workspace**, and D18
|
needs both names. This paragraph replaced one asserting *"No other
|
||||||
sends the notification to `info@smlcompany.ca`. So Google receives and
|
third party receives it"*; see entry (ao). §7 is cited, not restated —
|
||||||
stores every submission — including the names of opposing parties and
|
no MX record here. */
|
||||||
their counsel, which is the most sensitive thing this form collects —
|
|
||||||
as a mail processor. The page's own next section already admitted it:
|
|
||||||
*"The notification sits in my mailbox."* That mailbox is Google's.
|
|
||||||
|
|
||||||
A reader making a PIPEDA access request was being told there was one
|
|
||||||
processor when there are two. This page's header comment sets the
|
|
||||||
standard the sentence failed: a statement that describes an intended
|
|
||||||
control rather than a real one is a false statement to the public in
|
|
||||||
a legal document, and it fails silently, because nothing breaks and
|
|
||||||
the sentence reads correctly.
|
|
||||||
|
|
||||||
Found by `adversarial-reviewer`, 2026-08-31. §7 is cited rather than
|
|
||||||
restated — no MX record here. */
|
|
||||||
}
|
}
|
||||||
<p>
|
<p>
|
||||||
Two companies therefore process it, and both are named because a
|
Two companies therefore process it, and both are named because a
|
||||||
@@ -194,9 +207,10 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
>Amazon Web Services</strong
|
>Amazon Web Services</strong
|
||||||
> stores the submission and sends the two emails, in Canada. <strong
|
> stores the submission and sends the two emails, in Canada. <strong
|
||||||
>Google</strong
|
>Google</strong
|
||||||
> receives the notification email, because my own mail is on Google Workspace
|
> receives the notification email, because the practice's mail is on Google
|
||||||
— so a copy of what you send, including any names you give me, sits in that
|
Workspace — so a copy of what you send, including any names you give me,
|
||||||
mailbox. If you reply to the confirmation, that reply goes there too.
|
sits in that mailbox. If you reply to the confirmation, that reply goes
|
||||||
|
there too.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The confirmation sent to you is delivered to whoever runs your email.
|
The confirmation sent to you is delivered to whoever runs your email.
|
||||||
@@ -204,9 +218,10 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
what they keep.
|
what they keep.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
No one else receives it. There is no CRM, no mailing list, no
|
No one else is sent it. There is no CRM, no mailing list and no
|
||||||
analytics on the submission, and no assistant or outside
|
analytics on the submission. Who can read what is stored is a
|
||||||
administrator.
|
different question from who it is sent to, and it is answered under
|
||||||
|
"Who can see it" below.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>How long it is kept</h2>
|
<h2>How long it is kept</h2>
|
||||||
@@ -229,50 +244,59 @@ const COLLECTED = INTAKE_FIELDS.map((field) => field.label);
|
|||||||
than necessary for that purpose.
|
than necessary for that purpose.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Emails are a separate matter. The notification sits in my mailbox and
|
Emails are a separate matter. The notification sits in the practice's
|
||||||
the confirmation sits in yours, and neither is deleted by that
|
mailbox and the confirmation sits in yours, and neither is deleted by
|
||||||
mechanism.
|
that mechanism.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>Who can see it</h2>
|
<h2>Who can see it</h2>
|
||||||
{
|
{
|
||||||
/* ⚠️ THIS SAID "Nobody else has access" AND THE SECTION TWO ABOVE HAD
|
/* ⚠️ THIS SECTION AND THE SENTENCES BELOW ANSWER THE SAME QUESTION
|
||||||
JUST NAMED GOOGLE. The Google correction was applied to §Where it is
|
AND CHANGE TOGETHER — by OPENING PHRASE, never by count. **Here:**
|
||||||
stored and not swept into the section actually headed with the
|
"The record in the table", "The system that receives", "The
|
||||||
question a reader asks — so the page answered "who can see the names
|
notification goes to", "The confirmation that went to you".
|
||||||
of the opposing parties I gave you?" with *nobody else* under that
|
**§Where it is stored:** "In a DynamoDB table", "The table sits in an
|
||||||
heading and *Google* under a different one. Fixing one section and
|
Amazon Web Services account", "Two companies therefore process it",
|
||||||
not the section that answers the same question is the sweep failure
|
"The confirmation sent to you", "No one else is sent it". **§How long
|
||||||
`CLAUDE.md` describes. Found by `adversarial-reviewer` round 2. */
|
it is kept:** "Emails are a separate matter".
|
||||||
}
|
⚠️ **THIS SECTION STATES WHO, NOT HOW — Pouya's ruling, 2026-09-02.
|
||||||
{
|
NOT TO BE RESTORED HERE:** the measurement paragraph, the
|
||||||
/* TODO(pouya): the sentence below is FALSE as at 2026-09-01 and this
|
root-credential sentence, the single-sign-on and federated-login
|
||||||
page must not go public until you rule — §9 Q62. The AWS account has
|
enumeration, the resource-policy clause, the "company that runs a
|
||||||
an `admins` IAM group carrying `AdministratorAccess` with TWO
|
database" aside, the deploy-credential sentence and the three-copies
|
||||||
members, you and one other person, and
|
summary. All true, all still in `AGENTS.md` §7 and
|
||||||
`simulate-principal-policy` returns **allowed** for
|
`docs/reference/intake-table-access-verification.md`. **No human
|
||||||
`dynamodb:GetItem`/`Query`/`Scan` on this table for both.
|
headcount** — a simulation counts identities, not people.
|
||||||
Evidence and commands:
|
⚠️ **SENTENCE 1 IS SCOPED TO THE STORED RECORD** (paragraph 3 names
|
||||||
`docs/reference/intake-table-access-verification.md`.
|
administrative staff, who read the mailbox and **cannot** read the
|
||||||
THE QUESTION: do you remove that access — which may be the same
|
table) **AND PREDICATED ON ADMINISTERING THE ACCOUNT** (what §7
|
||||||
co-administrator Q23's Gitea instance depends on, so it is not free
|
measures). §4 carries the row and the bar: **never widen it to
|
||||||
— or does this paragraph state the true number? Nothing here may be
|
running, founding, practising or acting.**
|
||||||
softened into "authorised administrators": on this page a reader is
|
**TWO CLAIMS GO STALE ON THEIR OWN** — who administers the account,
|
||||||
entitled to the specific, and a true vacancy is worse than a false
|
and who reads `info@smlcompany.ca`. §7 holds both; §12 **R21** is the
|
||||||
specific only in that it cannot be caught.
|
trigger.
|
||||||
Raised by `claims-auditor`, D20 cutover audit, finding 8. */
|
⚠️ **THERE ARE THREE COPIES AND THE THIRD IS THE READER'S OWN** — the
|
||||||
|
handler puts the whole submission into the confirmation it sends the
|
||||||
|
inquirer. Never write "the one other place a copy exists". */
|
||||||
}
|
}
|
||||||
<p>
|
<p>
|
||||||
I can. The table is reachable by the function that writes to it and by
|
The record in the table: me, and the small number of people who
|
||||||
one administrative account, which is mine — nobody else has access to
|
administer the account it sits in with me.
|
||||||
the table. There is no team, no assistant and no external
|
|
||||||
administrator.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The one other place a copy exists is the notification email, which
|
The system that receives what you send
|
||||||
sits in the Google Workspace mailbox named above. So the honest answer
|
<strong
|
||||||
to "who can see this" is: me, and Google as the company that runs my
|
>can only add a record — it cannot read back what is stored.</strong
|
||||||
mail.
|
>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The notification goes to the practice's mailbox, which is read by me
|
||||||
|
and by administrative staff and is hosted on Google Workspace — so
|
||||||
|
Google holds a copy of whatever you send me.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The confirmation that went to you sits with whoever runs your email.
|
||||||
|
That copy is in your hands rather than mine.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2>Cookies and analytics</h2>
|
<h2>Cookies and analytics</h2>
|
||||||
|
|||||||
+19
-25
@@ -25,7 +25,7 @@ import Undertaking from '../components/Undertaking.astro';
|
|||||||
import { getImage } from 'astro:assets';
|
import { getImage } from 'astro:assets';
|
||||||
import ogDefault from '../assets/og-portrait.jpg';
|
import ogDefault from '../assets/og-portrait.jpg';
|
||||||
import { medArbGraph } from '../data/schema';
|
import { medArbGraph } from '../data/schema';
|
||||||
import { CONDUCT_UNDERTAKINGS, DESIGNATIONS_HELD_LINE } from '../data/site';
|
import { CONDUCT_UNDERTAKINGS } from '../data/site';
|
||||||
|
|
||||||
const ldImage = await getImage({
|
const ldImage = await getImage({
|
||||||
src: ogDefault,
|
src: ogDefault,
|
||||||
@@ -61,7 +61,7 @@ const graph = medArbGraph({
|
|||||||
|
|
||||||
<BaseLayout
|
<BaseLayout
|
||||||
title="Med-Arb · Pouya Lajevardi · What It Is and When It Fits"
|
title="Med-Arb · Pouya Lajevardi · What It Is and When It Fits"
|
||||||
description="Med-arb is mediation that converts to arbitration if it does not resolve. What it is, how it differs from arb-med, the fairness objection, and when it fits."
|
description="Med-arb is mediation that converts to arbitration if it does not resolve. What it is, that it is not arb-med, the fairness objection, and when it fits."
|
||||||
jsonLd={graph}
|
jsonLd={graph}
|
||||||
>
|
>
|
||||||
{/* ---- 1. Hero -------------------------------------------------------- */}
|
{/* ---- 1. Hero -------------------------------------------------------- */}
|
||||||
@@ -238,38 +238,32 @@ const graph = medArbGraph({
|
|||||||
|
|
||||||
{/* ---- 6. Why this practice -------------------------------------------- */}
|
{/* ---- 6. Why this practice -------------------------------------------- */}
|
||||||
{
|
{
|
||||||
/* ⚠️ THIS SECTION MUST NOT ANSWER THE ADRIC COMPETENCE QUOTATION ABOVE IT.
|
/* ⚠️ THIS SECTION MAKES NO CLAIM ABOUT COMPETENCE AND NO CLAIM ABOUT WHAT
|
||||||
For one pass it did: the heading read "Med-arb asks one neutral to be
|
MED-ARB IS, AND BOTH SILENCES ARE DELIBERATE. §Rules above quotes ADRIC
|
||||||
competent at both" — a restatement, in this site's voice, of ADRIC's
|
requiring "a high level of practitioner competence", and ADRIC answers its
|
||||||
"requires a high level of practitioner competence" quoted in the section
|
own sentence with the Chartered Med-Arb and a Foundational Course —
|
||||||
immediately above — and the designations then answered it by adjacency.
|
neither held, and C.Med-Arb is struck from this site entirely (§4). So
|
||||||
**The source answers its own sentence with a DIFFERENT designation**: the
|
anything in here that reads as meeting that standard is borrowing a third
|
||||||
same ADRIC page points at the Chartered Med-Arb and a Med-Arb Foundational
|
party's bar and answering it in this site's voice. That has now been
|
||||||
Course, and `docs/reference/adrio-designations.md` Finding 3 calls the
|
removed three times: from the heading (2026-08-30), from the definitional
|
||||||
Q-level designations "an intermediate step". So the page was borrowing a
|
gloss (Pouya's ruling, 2026-09-01) and from the bare designations line
|
||||||
third party's competence standard and supplying an answer that party does
|
that was left sitting directly beneath the quotation (2026-09-02).
|
||||||
not give. `claims-auditor`, round-2 audit, 2026-08-30 — the gloss lens.
|
**Do not refill this paragraph, and do not restate a designation here** —
|
||||||
|
/about/ publishes them, and the JSON-LD carries them. */
|
||||||
The heading and lede now state what this practice holds and offers, with
|
|
||||||
no competence proposition and no bridge to the quotation above. */
|
|
||||||
}
|
}
|
||||||
<section class="section section-alt reveal">
|
<section class="section section-alt reveal">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="section-head">
|
<div class="section-head">
|
||||||
<SectionHeading eyebrow="Why this practice" level={2}>
|
<SectionHeading eyebrow="Why this practice" level={2}>
|
||||||
<span slot="heading">Both halves, in one practice.</span>
|
<span slot="heading">Both processes, in one practice.</span>
|
||||||
</SectionHeading>
|
</SectionHeading>
|
||||||
</div>
|
</div>
|
||||||
<div class="prose">
|
<div class="prose">
|
||||||
<p>
|
<p>
|
||||||
{DESIGNATIONS_HELD_LINE}. Med-arb is not a third service bolted onto
|
I accept med-arb appointments now, in commercial matters. The three
|
||||||
mediation and arbitration; it is the two of them run under one
|
commitments above are the part to read before proposing one: the
|
||||||
agreement, in the order the agreement sets.
|
med-arb agreement does the work, and it does it before the mediation
|
||||||
</p>
|
starts.
|
||||||
<p>
|
|
||||||
I accept med-arb appointments now, in commercial matters. The section
|
|
||||||
above is the part to read before proposing one: the agreement does the
|
|
||||||
work, and it does it before the mediation starts.
|
|
||||||
</p>
|
</p>
|
||||||
<p class="onward">
|
<p class="onward">
|
||||||
<a href="/mediation/">Mediation →</a>
|
<a href="/mediation/">Mediation →</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user