Ein Bericht trägt einen Status, seit es Berichte gibt, und bis gestern konnte nichts in der Oberfläche einen davon ändern. Filtern ließ sich danach von drei Bildschirmen aus, setzen nur über die API, was hieß, dass jeder Bericht für immer auf ausstehend stand und das Abzeichen auf der Karte Dekoration war.

Die Statussteuerung sitzt jetzt in der Liste der eingegangenen Berichte, in der Aktionszeile jeder Karte neben der Sichtbarkeitssteuerung. Triage ist etwas, das man an einer Warteschlange tut und nicht an einem einzelnen Bericht, also gehört sie dorthin, wo die Warteschlange ist: Karte lesen, Status setzen, weiter zur nächsten, nie etwas öffnen.

Wer sie benutzen darf, ergibt sich aus der Zuordnung, die der Bildschirm ohnehin schon hatte. Ein Bericht erreicht Ihren Posteingang, weil Sie in dem Team sind, dem die Domain gehört, für die er eingereicht wurde, also zeigt ein Bericht, der keiner Website zugeordnet ist, gar keine Steuerung statt einer, die sich verweigert.

Einen Bericht an die Person schicken, die ihn beheben muss

Ein privater Bericht öffnet sich für das Team, dem die Domain gehört, und für die Person, die ihn eingereicht hat. Wen er meistens erreichen muss, ist keine von beiden: die Person, der der Fehler übergeben wird, die dem Link folgt und erfährt, dass es den Bericht nicht gibt.

Der Weg darum herum bestand bisher darin, die Teameinstellungen in einem zweiten Tab offen zu lassen und sich die Adresse zu merken. Es gibt jetzt eine Einladung auf dem Bericht selbst. Sie holt die Person ins Team, denn genau das heißt hier, einen privaten Bericht zu lesen - es gibt keinen zweiten Zugangsweg und keinen Link, der Zugriff gewährt, wer immer ihn gerade in der Hand hält.

Der Recorder nutzt den ganzen Plan

Die Notiz der letzten Woche endete mit einem Eingeständnis: jeder Plan verkaufte eine Aufnahmelänge, die sein eigenes Upload-Limit verweigerte, wir hatten die Serverobergrenzen angehoben, damit sie dazu passen, und der Recorder selbst hörte weiterhin für alle bei glatten zehn Minuten auf.

Erweiterung 1.5.0 ging gestern in den Chrome Web Store und schließt das. Das Panel nimmt so lange auf, wie der Plan es verkauft - fünf Minuten bei Free, zehn bei Starter, dreißig bei Professional - und beide Enden der Leitung sind sich jetzt über dieselbe Zahl einig.

Dasselbe Release behebt etwas, das schlimmer war, als es aussah. Jeder Button im Panel tat nichts, sobald das Panel als eigenes Fenster lief statt angedockt: My Replays, der Store-Link, die Willkommensseite. Die Anmeldung war der schlimmste Fall, denn sie wartete auf einen Tab, der nie aufgehen würde, und ließ das Panel unbegrenzt auf “Waiting for sign-in…” stehen. Eine installierte Web-App ist der Ort, an dem man dem zuerst begegnet. Tabs öffnen sich jetzt in einem echten Browserfenster, egal wo das Panel gerade sitzt.

Session Replay

Kostenlose Chrome-Erweiterung. Ein Klick auf der Seite, die sich falsch verhält, erfasst den Screenshot, die Konsole und das Netzwerkprotokoll und gibt Ihnen einen Link, den Sie ins Ticket einfügen können.

Erweiterung holen

Die MCP-Seite sagt jetzt, was Sie eintippen müssen

Die Seite, die letzte Woche kam, reichte die Adresse weiter und sagte, die Autorisierung laufe über OAuth 2.1 mit PKCE. Beides stimmt, und keines davon ist eine Anleitung: die Adresse gehört in jedem Client woandershin, jeder meldet sich auf seine eigene Weise an, und wer die URL hatte, stand genau da, wo er angefangen hatte.

Der Verbindungsschritt trägt jetzt einen Tab pro Client, jeder mit der Adresse an der Stelle, an der dieser Client sie nimmt, und dem Befehl, der die Autorisierung erteilt.

Der letzte Schritt hat sich aus einem verwandten Grund geändert. Er zeigte früher drei rohe JSON-RPC-Umschläge und nannte sie Ihren ersten Aufruf, was das eine lehrte, das man nie braucht - Umschläge zu schreiben ist die ganze Aufgabe des Agenten, den Sie gerade verbunden haben - und Arbeit verlangte, die niemand machen würde. Er zeigt jetzt fünf Sätze zum Vorlesen an den Agenten, gebaut aus Ihrem eigenen neuesten Bericht und Ihrer eigenen verifizierten Domain. Ein Team ohne Berichte bekommt einen schlichteren ersten Satz, der stattdessen die Domain nennt.

Es gibt jetzt außerdem eine öffentliche Datei unter /agents/install.md: die Domain, das Verifizierungs-Tag, beide Ladewege, das Button-Markup, identify() und was vom Plan abhängt, ausgeliefert als reiner Text ohne Anmeldung. Wenn der schnellste Weg zu einem Button auf Ihrer Website darin besteht, die Aufgabe dem Coding-Agenten zu geben, den Sie ohnehin offen haben, ist das die URL, die Sie ihm reichen. Da sie öffentlich ist, enthält sie nichts, was zu einer einzelnen Website gehört - das Token ist ein Platzhalter in Klammern, und die Datei sagt, dass man Sie nach dem echten fragen soll.

Drei MCP-Werkzeuge, die jetzt in eine Antwort passen

Wert, klar aufgeschrieben zu werden, denn die erste Fassung jedes einzelnen war auf eine Weise falsch, die sich erst an einem echten Bericht zeigte.

get_report gab das ganze Dokument zurück. Eine zweiunddreißig Sekunden lange Aufnahme kam auf 114.442 Zeichen, davon 42.302 für das Netzwerkprotokoll und 22.947 für dessen Header, was mehr ist, als ein Client in einem Werkzeugergebnis annimmt: das wichtigste Lesewerkzeug der Oberfläche konnte einen Bericht überhaupt nicht lesen. Es nimmt jetzt ein optionales Argument sections, das beliebige von network, console und interactions benennt. Was Sie anfordern, kommt vollständig zurück, abzüglich der Header, Cookies und Query-Strings, die kein Signal tragen, das die Request-URL nicht ohnehin trägt. Was Sie nicht angefordert haben, wird zusammengefasst.

set_status serialisierte den gesamten Bericht zurück, nachdem es eine Spalte geändert hatte, so dass ein Schreibvorgang, der längst gelandet war, dem Aufrufer als Fehlschlag gemeldet wurde. Es antwortet jetzt mit einer Quittung: dem Share-Token, dem Stand des Berichts und dem Zeitpunkt seiner Erledigung.

get_frame nimmt eine Position in der Aufnahme, und nichts im Berichtsdokument konnte eine benennen. Jeder Eintrag trug eine absolute Uhrzeit und keinen Versatz, und wer den Bericht von außerhalb der Anwendung las, konnte daraus den Beginn der Aufnahme nicht ableiten, also wurde der Versatz in der Praxis gegen die Dauer geraten - was eine kurze Aufnahme übersteht und nichts Längeres. Der Bericht trägt jetzt die Versätze, nach denen das Werkzeug gefragt wird.

Alle fünf Werkzeuge nennen außerdem ihre Action-Hints ausdrücklich: die vier Lesevorgänge sind schreibgeschützt, set_status ist es nicht, und keines von ihnen ist destruktiv. Ein weggelassener Hint wird von einem Client nicht als falsch gelesen - er fällt auf die vorsichtige Antwort zurück und fragt vor jedem Lesevorgang einen Menschen.

Das Konsolen-Panel wiederholt sich weniger

Wiederholte Konsolenzeilen wurden nur dann zusammengefasst, wenn es Fehler waren. Alles andere bekam eine Zeile pro Vorkommen, was ausgerechnet die Level, die sich am häufigsten wiederholen, als die vollständig ausgeklappten zurückließ.

Ein Bericht kam mit sechsundzwanzig Konsolenzeilen an, von denen zweiundzwanzig dieselbe Warnung eines Drittanbieters auf Debug-Level innerhalb einer einzigen Millisekunde waren. In einem anderen war die eine Zeile, die den Fehler benannte, die sechsundzwanzigste. Zeilen werden jetzt nach Level, Meldung und URL zusammen gruppiert, auf jedem Level. Zwei Frames, die auf dieselbe Weise scheitern, bleiben zwei Einträge, und dieselben Worte auf zwei Leveln protokolliert bleiben zwei Einträge.

Kleinere Dinge

  • Eine Teamadministration kann ihr Team umbenennen. Der Name wurde einmal bei der Anmeldung geschrieben und nie wieder, so dass alle, die sich vor dem Ausfüllen ihres Namens angemeldet hatten, dauerhaft ein Team namens “someone@example.com’s team” hatten, und das ist der Name, den ihre Kolleginnen und Kollegen im Umschalter lesen.
  • Das Dashboard liegt im Benutzermenü der angemeldeten Person, dort, wo alle danach gesucht haben.
  • Die Planangaben auf der Teamseite sind eine Karte statt vier.
  • Die flachen Fehlerseiten erfüllen AA-Kontrast, und der Outline-Dark-Button ist im Dunkelmodus lesbar.
  • Die Web-Anmeldung ist ratenbegrenzt. Sie war auf der API geschützt und auf dem Anmeldeformular nicht, gegen dieselben Konten.