Skip to content

0.4.1: Chrome pages through the accessibility layer, honest consent text, and the browser hand-off - #12

Merged
GLouv merged 96 commits into
mainfrom
release/0.4.1
Nov 6, 2026
Merged

GLouv merged 96 commits into
mainfrom
release/0.4.1

Conversation

@GLouv

@GLouv GLouv commented Nov 6, 2026 •

Copy link
Copy Markdown
Member

What this is

One release that combines three tracks that touch the same files, merged in this order:

  1. 0.4.1: honest background consent text, LICENSE in the package, patched dependencies #11 (proeve/0.4.1): honest background consent text, LICENSE in the npm package, patched dependencies.
  2. 0.4.1: the web goes through the Chrome you already use #10 (feat/browser-overlevering): instructions for handing web work to the Chrome the person already uses.
  3. The Chrome track: the server reads Chrome pages through the accessibility layer, blacks out password and payment fields
    before anything leaves the machine, refuses to type into a password manager's own page, and asks before any click that sends.

0.4.0 was never published to npm (npm has 0.1.0), so 0.4.1 is the first npm release since 0.1.0. See CHANGELOG.

Merge fixes made here

  • 0.4.1: the web goes through the Chrome you already use #10 said "This server does not see inside pages" in the same instructions where the Chrome track says it does. Rewritten.
  • One 0.4.1 section in CHANGELOG (no duplicate heading), with 0.4.0 marked as never published.
  • Send verdict: an ancestor's name can only add danger, never remove it; button names in the question are shown on one line.
  • scripts/release.sh puts only the helper and status icon that the receipt proved into the npm package (sha1 / tree sum
    required). The working tree is a snapshot after step 0 and must be unchanged before the tag and before npm, and the
    script packs the release itself, measures the helper and icon inside the tarball, and publishes exactly that tarball.
    An unknown argument stops (—tjek with a long dash was a full release). The GitHub release asset and the .mcpb
    are built by CI from the tag, not the proven binary.
  • A name only counts as a name when it has a letter or a digit, so a space or an invisible mark cannot switch off the
    «we don't know what this is» rule in the danger gate; in the send gate, recipient and message must be visible, and an
    invisible mark between or after words in a browser window's title is read as a space, so it cannot remove the gate there.
    (A mark inside a name, such as «Wh»+U+00AD+«atsApp», is not caught - the same as in 0.4.0.)
  • Test 15b/15c: no longer racing the shutdown signal under load; a missing SIGTERM-before-SIGKILL now fails the test.
  • Test ikon-lyd check 13 (red in this PR's first CI run): it now allows the standing screen loan's early return, on its own
    line and with exactly that condition, before the sound. It checks the condition, not the rest of that line (tightening it
    is listed for 0.4.2).

Evidence

  • On 27d9fc0 (which only changes test/ikon-lyd.mjs over e9ca16a): the 56 tests of run-all.sh that do not take the screen or
    use Chrome: 55 green, and optagelse-udelukker failed once under heavy load and passed when run alone. ikon-lyd was red on
    e9ca16a (this PR's first CI run) and is green on 27d9fc0. The tests
    that take the screen or Chrome run in the dialog receipt. Page check green; sync-tal.py idempotent. New guards mutation-proven (each mutant turns exactly its scenario red).
  • Receipt for helper 5a3784bd: six live Chrome tests passed twice, nine mutants all red, Chrome's screen-reader switch
    measured off afterwards (on cbfc2a9 6 Nov 16:51 CET; on 4ac2797 6 Nov 17:53 CET; on e9ca16a 6 Nov 22:51 CET; on 27d9fc0 6 Nov 23:35 CET)
  • Review: two-seat panel R1-R18; R19-R24 on the final commits.

Known and accepted

O4, O5 (need a new helper), O7, O8, and a policy.js comment, as listed in review R18.

🤖 Generated with Claude Code

Gustav Louv and others added 30 commits October 29, 2026 15:58
…; work inside pages is Browser MCP's, or name it once

Gustav 29/10: computer-mcp should always use the person's normal, signed-in Chrome for the web, and hand in-page work to
browser-mcp when it is in the session. This server does not see inside pages (its own instructions say so), so the
in-page part is browser-mcp's; without it, the agent names Browser MCP once with its install line and never installs.
test/laering.mjs 1c-1f pin the text; each check mutation-proven.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in its extension's profile (P183)

Opus P183: GODKENDT MED RETTELSER - C1 applied verbatim, checks 1g/1h added (each proven red when its phrase is removed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r (C19), stille-vej giver scroll et punkt, LICENSE med i pakken

- policy.js:623: i baggrund afvises adgangskode-programmer (maaIkke) - boksen sagde «still always ask». :632 (forgrund) er sand.
  ikon-godkend D2 fanger loeftet; mutationsbevist (gammel tekst -> 1 DUMPET, ny -> 60 OK).
- stille-vej.mjs:293: hjaelperen kraever et punkt sammen med --app siden ed09c85 (main.swift:1020) - midten af forreste vindue,
  som index.js:1325-1328. Gjorde Fremmed Mac roed paa 0.4.
- mcp-server/LICENSE + "LICENSE" i files: MIT-teksten fulgte hverken npm- eller MCPB-pakken.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t 5 -> 0)

SDK'en selv uaendret (1.32.1). zod 4.6.7, body-parser 2.4.0, @hono/node-server 2.1.5, fast-uri 3.1.9, qs 6.17.1 -
samme versioner som en frisk npx-installation faar i dag, saa proeverne maaler det brugerne koerer (som f808150).
Gulvet holder 1.30.x (1 hoej advarsel) ude af en cachet installation. "LICENSE" i files, saa MCPB-bundtet faar den.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0.4.1-LISTE #4: baggrund-mus og stop-alle var roede umuteret paa Fremmed Mac (39986282787), men groenne alene lokalt -
porten smed outputtet vaek, saa aarsagen kunne ikke ses. Proevet med en roed og en groen attrap-proeve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t laeste den som serverstartende

Fremmed Mac 41045721377: tilstand-isoleret DUMP «stille-vej.mjs» - maaleren kalder en fil serverstartende ved spawn( + index.js,
og 9828cf2's kommentar «index.js:1325-1328» udloeste den. Foer: 1 DUMP, efter: alle tjek bestaaet (lokalt).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Versionen 0.4.1 i package.json, server.json (x2), bundle/manifest.json, gemini-extension.json og HELPER_VERSION.
README-loggen genereret med scripts/log-uddrag.mjs (test/readme-log.mjs groen). CHANGELOG: samtykketeksten (D2), LICENSE,
underpakkerne (audit 5 -> 0), flere agenter paa macOS 15.8 (Finder kom kort frem i 2 af 5 koersler, som forsidens optagelse
viser; skrivningen foran holdt i alle) og proeverettelserne. claims-offline + tjek-forside groenne lokalt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sh ser 100 CI-koersler, laasefilen = en frisk npx-installation

Panel R1 1/11 (Astra + Opus, efterproevet):
- parallel.mjs: menneskeArbejder var EGEN, saa paa GitHubs Mac fik et rent laesende scenarie skylden for Finder-momentet
  (41128683401: «101 laese Finder 1», kun computer_windows + computer_find, Finder foer -> TextEdit efter).
- release.sh:163 saa kun de seneste 20 CI-koersler; 627b710 er nr. 7 - 13 koersler paa en anden gren afviste udgivelsen.
- package-lock.json = en frisk opløsning af package.json i dag (SDK 1.32.2, express 5.3.0 ...): npx har ingen laasefil,
  saa proeverne skal koere det brugerne faar. npm audit --omit=dev: 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ync-tal.py)

- Underpakker: beskriver vores laasefil, ikke brugerens (npx opløser selv; de 5 fund var kun i vores trae).
- Flere agenter: Finder kommer frem to gange paa hvert niveau i alle seks koersler, 15.7 og 15.8, op til 2,8 s - ikke «2 af 5».
- LICENSE: npm maalt, MCPB via samme filliste. Mutationsporten «viser de sidste linjer», ikke «hvorfor».
- Rettet: 0.2.1-saetningen «Password managers ask every single time, in every mode».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rter med Script Editor forrest som suiten

Panel R2 1/11: et svar der aldrig kom braendte 5,5 t (41077418047 forsoeg 1). baggrund-mus bestaar i suiten (Script Editor
forrest) men ikke i portens baseline (Finder forrest efter «Mange agenter»): samme udgangspunkt afgoer om det er tilstanden.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ilen dateret, kendte graenser

- README/npm-README/forside/kapabilitetsmatrix: «handed straight back» faar maalingen med: 1 af 65 momenter (41266330474)
  kunne ikke gives tilbage, svaret sagde gave_back:false.
- CHANGELOG: hovedet lovede datoer der ikke staar der; laasefilen beskrevet som fornyet 1/11 (ikke varig lighed med npx);
  mange agenter med alle fire udfald; kendte graenser: baggrund-mus/38 mutanter, F2b 3 af 11 (F2 bestod i alle).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…giv-tilbage-mutanterne), trinfrist 30 min

Panel R3 1/11 (Opus): giv-tilbage-mutanterne koerer foer baggrund-mus' baseline og efterlader Finder forrest; i suiten
koerer giv-tilbage efter baggrund-mus (run-all.sh:134/140). Kommentaren om haenget rettet (Astra R3): mutationsbeviset
blev sprunget over, og slutporten afviste koerslen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- «longest such moment» -> «longest one that was handed back» (det ikke-tilbagegivne varede mindst 40 s); elleve koersler
  hele vejen (32 af 33 niveauer, 4.939/4.939); haenget: aarsag ikke fundet; proeverne navngivet.
- Kendte graenser i datid (porten er aendret) og «these menu checks», ikke hele proeven.
- README/npm-README: give-back lader forgrunden staa efter klik, rul eller en tast som Shift inden for 1,5 s
  (Skaerm.swift menneskeRoerteNetop); launch-saetningen og matrixens launch-saetning melder gave_back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…runs) - begge GODKENDT b og c

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pt Editor-linjen fjernet; rettelse af 0.4.0's menu-loefte

Fremmed Mac 41270352704 (1003f89): portens baseline havde Script Editor forrest (5c «Script Editor -> Script Editor»)
og 5a/5b/5g fejlede alligevel. «Finder forrest» var ikke aarsagen (panel R2 B). Linjen gjorde ingen forskel og er fjernet.
CHANGELOG: kendt graense uden aarsag, F2b 4 af 12 (517-546 ms, F2 uden DUMP), Corrected-note til «A click behind never
leaves a menu over your work».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… foer porten (2. falsifikation), F2b 4 af 13, nutid

Fremmed Mac 41271247500 (605c70e): suiten groen, mange agenter groen; portens baseline for baggrund-mus stadig roed med
Script Editor forrest (2c/5c). Placeringen betyder intet; linjens fjernelse i 0178a66 staar. Tal genoptalt fra 13 logs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t give laanet straks

Gustav 2/11: computer-mcp skal tage skaermen uden at spoerge, naar den skal.
Med CMCP_SCREEN_ASK=0 sender serveren ask:false, og et «standing»-svar fra
ikonet giver laanet. Uden kontakten er «standing» et nej. Laanet er ellers
det samme: hvert skridt venter mens mennesket bruger tastatur eller mus.
Proeve 14 i skaerm-laan.mjs (4 varianter, 14 tjek).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t (ask:false)

giverUdenSpoergsmaal (Tekst.swift): kun et skaerm-laan, kun ask:false, kun naar
ingen anden agent har skaermen, og ikke i 120 s efter at mennesket tog den
tilbage eller stoppede alle. Svaret hedder «standing», ikke «owner». Intet
banner og ingen lyd for et laan uden spoergsmaal. Proeve 3f i ikon-menu.mjs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- tik() giver et ventende laan uden spoergsmaal (hvert sekund), saa husets
  kildekontrakter for laanOpdateret, tagTilbageNu og stopAlleNu staar uroert
- spaerringen efter tag-tilbage / stop-alle saettes foer tik() i begge
- computer_request_screen sender ikke agenten hen til Allow, naar
  CMCP_SCREEN_ASK=0 (proeve 14 maaler beskrivelsen)
- README + den udledte npm-README

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lig log

- spaerringen efter tag-tilbage/stop-alle maales i systemUptime (et vaegur der
  springer, loefter den ikke) og gemmes i skaerm-spaerret.json, saa et ikon der
  genstarter inden for pausen holder den; en vaerdi laengere fremme end pausen
  er ugyldig
- et laan uden spoergsmaal gives tidligst 3 s efter at det forrige sluttede
  (den forriges hjaelpere faar SIGKILL 2 s efter SIGTERM)
- loggens «asked» foelger svaret: et aeldre ikon der spoerger og svarer owner,
  logges asked:true
Proever 3g (5 tjek) og 14b (2 tjek).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… kontrakter paa kaldestederne

- beskrivelsen med CMCP_SCREEN_ASK=0: tager mennesket skaermen tilbage (knap,
  Esc, ⌃⌥⌘.), stopper agenten og spoerger i chatten - aldrig selv igen
- en udloebet ventetid i koeen uden spoergsmaal er ikke et nej: «ask again»
- afvisningen i baggrund siger, at serveren laaner uden spoergsmaal
- README: «no question» (boksen staar der stadig), nej/fra, Esc-forbehold,
  tillidsforbehold; undtagelsen ved «a yes without your fingerprint is a no»
- CHANGELOG 0.4.0 (in progress)
- ikon-boks 5z: kildekontrakter for givStaaendeLaan, tik, tagTilbageNu,
  stopAlleNu, spaerringsfilen og overdragelsespausen (Opus' MA/MB overlevede)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sten i en kommentar

MB1 (udkommenteret spaerStaaende) overlevede, fordi indexOf fandt teksten i
kommentaren. Nu draebt sammen med MB3 og MB4 (spaerring efter tik).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…en faar SIGTERM

En server der fik SIGTERM midt i et skridt, lod hjaelperen skrive videre - ogsaa
efter at skaermlaanet var givet videre. exit-handleren kalder nu
afbrydSkaermKald (SIGTERM til skrivende hjaelpere, SIGUSR1 til paste).
Proeve 15 i skaerm-laan.mjs: roed foer rettelsen (hjaelperen levede), groen efter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t, spaerringen holder paa tvaers af genstart

- tager mennesket skaermen (laanet slutter foer tid uden at agenten gav det
  tilbage): afvist i 2 min med «stop og sig det i chatten», et ventende skridt
  svarer det samme (ikke «call it again»), og agentens naeste laan SPOERGER
- et laan uden spoergsmaal der venter: kun Deny i menu og boks, og serverens
  tekst siger at tavshed giver skaermen (ikke «If you allow it»)
- spaerringsfilen: opstartens id + monoton frist, hoejst pausen, ulaeselig =
  fuld spaerring (falder lukket); anden opstart = ingen spaerring
- overdragelsespausen 8 s (2 s stop + 5 s noedslip) og ogsaa efter ikonets start
- kontrakter paa kaldestederne (Opus M1/M2), regex-escaping i proevens hjaelper
- README, CHANGELOG, server.json (CMCP_SCREEN_ASK) efter koden
Proever: skaerm-laan 16 + scope, ikon-menu 3g/3h, ikon-boks 5z.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lpere, spaerringen paa en stabil opstart

- ikonet sender {ended: taken-back|stopped-all|expired} foer det lukker et laan, og
  {queued:true} naar et laan uden spoergsmaal maa vente; serveren laeser linje for linje
- en udloebet ventetid uden «queued» er UKENDT (et aeldre ikon kan have spurgt):
  asked:null og «do not ask again» - ikke «ask again»
- et stop efter «tag tilbage» vinder over enhver anden afvisning i svaret; stoppet
  maales monotont og nulstilles, naar mennesket selv bekraefter et laan
- lukkesignal (og vagten, naar klienten er vaek): stop hjaelperne og VENT - SIGKILL efter
  2 s og noedslip af et traek - foer serveren gaar (stopOgVent); status.js' exit(0) erstattes
- spaerringsfilen: kern.bootsessionuuid (kern.boottime flyttes med uret); en fil der
  findes men ikke kan laeses, og en ulaeselig opstart, falder LUKKET
- husets kontrakter S4 og 5o kraever nu afslutLaan med grunden (samme kald, samme sted)
Proever: skaerm-laan 14d, 15b, 16b, 16c, 16e · ikon-menu 3g · ikon-boks 5z · vagt 5c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ble) - P10 overlevede uden

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aerlig usikkerhed i stop-teksten

- 16f: et laan der udloeber, og et agenten selv giver tilbage, giver det naeste uden
  spoergsmaal - Opus' M-Op1 (tagetTilbage = !laanAfgivet) overlevede foer
- sagde ikonet ikke hvorfor (aeldre ikon, eller det doede), siger stop-teksten
  «(or the menu bar icon closed)»
- spoerge-tilstandens tekst for et ventende skridt er som paa main igen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d i klientens vindue

- serveren lukker paent allerede naar stdin slutter (klienten: stdin -> 2 s -> SIGTERM
  -> 2 s -> SIGKILL); stopOgVent 600 ms med nyt oejebliksbillede hver runde, og ingen
  NY skrivende hjaelper starter under nedlukningen; release-mouse med killSignal
- 15c: en RIGTIG MCP-klient (SDK) lukker - traekket draebt, knappen sluppet, serveren
  gik selv (672 ms; foer 4003 ms med traekket i live). 15b uden kravet om >= 1,5 s
- «tag tilbage» foer laanet var registreret er stadig et stop (16g); stoppet vinder
  ogsaa ved en programlaas der udloeber (16i)
- kun kendte «ended»-grunde, den staerkeste vinder, forkert nonce taeller ikke (16h);
  loft paa 64 KB over ikonets svar
- opstarts-id skal vaere et UUID, ellers ukendt = spaerret (3g)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g stdin-lytteren

Q3 (flaget fjernet) overlevede, fordi nedlukningens nye oejebliksbillede draebte den nye
hjaelper alligevel; nu kraeves afvisningen. Q1 (stdin ignoreret) overlevede, fordi SIGTERM-
vejen ogsaa naaede det paa 600 ms; nu kraeves at serveren gaar foer klientens SIGTERM.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gustav Louv and others added 28 commits November 6, 2026 10:19
…ste opslag» er nu roed; vault-proevens tjek 4 skriver forsoegstallet ogsaa ved OK

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… under laasen, og spoergsmaalet naevner knappen

13w: ja til «Delete», «Erase all» under laasen - intet klik. 13x: uaendret «Delete» klikkes, dialogen naevner «Delete».
Mutanter: genmaalingen fjernet -> 13w roed; navnet fjernet fra dialogen -> 13w og 13x roede. 15 suiter groenne.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ntrol» i afvisningen (13y; mutant -> roed)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…trol), seks browsere i begge lister, search-incomplete naevner sprungne adgangskode-sider, secure-rects siger windows_scanned

Server: 13z1/13z2 (mutant «forfader ignoreres» -> begge roede). claims-offline: browserlisterne (mutant: Comet fjernet -> roed)
og hjaelperens tre nye felter. Hjaelperen er IKKE bygget - kildeaendringerne kraever en ny kandidat, kvittering og panel.
Bundle-id'erne er laest i Homebrew cask-data (bevis/browser-ids-2026-11-06), ikke maalt paa en installeret app.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mebrew, ikke maalt), teksten i en knap doemmes som knappen, farlig knap navngives og maa ikke skifte

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ds or pays» - reglen kender slet/ryd/fjern/nulstil/afslut/log ud/afinstaller, ingen betaling. Teksten siger nu det, koden goer

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…kke blot paa processen - kapløb, ikke produktfejl

Maalt 6/11: 15c roed 3 af 7 under belastning; de roede lukkede paa ~50 ms uden release-mouse, de groenne paa 650-730 ms med.
Attrappen satte sin SIGTERM-handler EFTER at have laest svarfilen - et SIGTERM i hullet draebte den, og serveren sendte (rigtigt)
ingen release-mouse, fordi en rigtig hjaelper slipper selv ved SIGTERM.
Kalibreret: FALSK_TERM_FORSINK=500 aabner hullet - den gamle proeve roed paa 15c+15b, den nye groen (ogsaa uden knappen).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne stod under 0.4.0, men er nye i forhold til main - intet indhold tabt (linje-sammenligning)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…me-sporet i samme instruktioner - nu: serveren laeser Chrome-sider gennem tilgaengelighedslaget, Browser MCP arbejder bedre inde i siden

laering (#10's proeve) og claims-offline groenne.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on one line

Opus R18 (O1, O3): the button's own name decided first; an ancestor without a dangerous name
could turn a nameless AXImage inside AXButton «Open» into «not a sender». Now the element and
its ancestor are each judged on their own, and either can make it dangerous (monotone).
The name in the question is collapsed to one line. Tests 13z3/13z4, each red under its mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0.2.1, 0.2.2 and 0.4.0 were never published to npm; the 0.4.0 section is marked as included.
Adds the monotone send verdict and its known cost (Opus R18, R1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FORVENTET_HJAELPER (sha1) and FORVENTET_IKON (tree sum of the .app) are required. A rebuild with
other bytes stops the release, unless the archived candidate (HJAELPER_FIL / IKON_APP) matches;
it is then copied in with ditto and measured again. No deletion in the script. Opus R18 (R3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…SIGKILL

Under load the server could read the new calls before it handled the signal (Opus R18: 8 of 30
red). 15b now waits until a writing call is refused with «shutting down» (at most 500 ms per
reply, only while the server lives). The fake helper records the SIGTERM it ignores, so
stopOgVent skipping the gentle step (mutant M13) turns 15b and 15c red. M11 (no flag): 5 red,
no hang. The precondition now also requires the fake's «klar».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge is made

Opus R19 B1: helper/.build/ is gitignored, so the copy into it failed in a fresh clone and
release-fejlmatrix was red 8/8, which would have stopped the dialog receipt and step 2.
B2: the fingerprints are measured again, measure only, right before the tag and right before
npm publish (a swap after step 1 was packed with the lock green). The archive fallback now
requires HEAD:helper to be the tree the candidate was built from (HJAELPER_TRAE) and refreshes
the timestamps, so run-all.sh does not call the proven binary older than its source.
The failure matrix sets the fingerprints per scenario and adds S7-S12; each new guard turns
exactly its scenario red when removed. Notes that the GitHub asset and .mcpb are CI-built.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus R19 B4: a space, a line break or an invisible mark (U+200E, aria-label=" ") counted as a
name, which switched off the «we don't know what this is» rule. One shared rule (harNavn) now
decides it for the danger gate, the send gate, the unnamed check and the name in the question.
Danger words are words, so this can only make a verdict stricter. Tests 13z5-13z8, red under the
old filter. CHANGELOG also names the new known cost: a named element inside a nameless button
is now asked about.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus R19 Q3: counted after the wait loop, a writing helper started inside the window would land
in the zero point. Now any such helper counts as a breach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…o files

Opus R20 (measured twice): npm packs the working tree, so another mcp-server/index.js was
published under the proven tag with both binary locks green. The tree's state (names and
content) after step 0 is now a snapshot that fastholdt requires unchanged before the tag and
before npm. The script now packs the release itself, measures the helper and icon inside the
tarball (bytes, x-bit, no symlink) and publishes exactly that tarball; package.json has no
prepack or prepublishOnly, so nothing is skipped. An unknown second argument stops: «—tjek»
with a long dash gave a full release. The matrix's npm stub now passes through to the real npm
(«env -u PATH npm» never found it) and measures inside the tarball; S13-S16 cover the tree,
the long dash, a symlinked helper and the archive's timestamp against a real stale-binary guard.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus R20 (measured): a recipient or a message that is only U+200E counted as read from the
screen, so the person approved something blank. Now each needs a visible character (not only
spaces, control or format marks); «👍» is still a message and is asked about. Tests u2 in
sende-port, red under each old line. CHANGELOG names the known limits for 0.4.2 (press asks
nothing about a nameless or icon-only button; its question shows the search, not the element)
and that the GitHub asset and .mcpb are built by CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…file must be HEAD's

Opus R21 (measured in the real release tree): vendor/ held two old helper backups, and npm packs
the folder, so they would have shipped under the proven tag with every lock green; git status
cannot see gitignored files. files now lists vendor/cmcp-helper and vendor/ComputerMCPStatus.app
(19 entries, a stray stays out). After npm pack, every file in the tarball must equal HEAD's -
the files step 0 itself changed (sync-tal) as they stand in the tree - which also stops an ignored
file in bin/ and an assume-unchanged edit. Calibrated both ways on a clean simulated release.
Matrix S17-S20: icon without x-bit, ignored key file, assume-unchanged index.js, stray in vendor/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus R21 (measured): Hangul fillers, the braille blank, variation selectors and lone accents
still counted as visible, and a browser window titled only U+200E skipped the send gate entirely.
synlig now treats them as blank (never milder than before; «👍», «🇩🇰» and «é» stay visible), harNavn
ignores default-ignorable «letters», and browser titles are cleaned of invisible marks before
they are judged. Tests u2, r6b and 13z9, each red under its old line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Six broke in the merge (the Chrome track moved the anchored lines), one in 785a174. All 401
anchors are found exactly once; the seven were run through the port: 0 survived, 0 errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nothing

Opus R22 (measured through the real server): deleting the marks removed the word boundary, so a
Send press in Chrome titled «Gmail»+U+FEFF+«Inbox» or «WhatsApp»+U+FEFF+«Web» went through without
asking (asked before 0c7ecdb). A space keeps the boundary: 0 milder of 54,491,136 measured titles.
Tests r6b (U+FEFF between words, braille blank title) and u2 (a lone accent), each red under its
old line (deletion, no \p{M}, !x instead of !synlig).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus R22: awk '{print $2}' split a name with a space and kept git's quoting of non-ASCII, so such
a file would be measured against HEAD and stop the release (fail-closed, latent: none of today's
15 files has either). Matrix 23/23 unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0c7ecdb rewrote the two browser-title lines that five mutants anchor on, and 1604a6c's message
claimed all anchors were found - measured before that edit. Each anchor now carries the same
mutation as on main. All 401 found exactly once (checked in the commit's own command); the five
run through the port: 0 survived, 0 errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…return

CI on the 0.4.1 PR (run 42304416072): the screen track (2/11) put an early return before tik() for
a standing screen loan (kind=screen, ask=false: a loan without a question is not a question, so no
sound). Check 13 required tik() as the first line. It now allows that return - with exactly that
condition - and nothing else: Astra's R10 mutant (nyAnmodning calls tik) and an unconditional
early return both turn check 13 red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@GLouv
GLouv merged commit 9f66e2e into main Nov 6, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant