Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,10 @@ src/threaddesk/ui/static/htmx.min.js -text
src/threaddesk/ui/static/alpine.min.js -text
src/threaddesk/ui/static/ui-vendor.json text eol=lf
src/threaddesk/ui/static/UI-VENDOR-LICENSES.txt text eol=lf
# Portable appbar copies pin exact source/asset bytes across host repositories.
src/threaddesk/ui/static/networkpunkt.css text eol=lf
src/threaddesk/ui/static/networkpunkt-appbar*.js text eol=lf
src/threaddesk/ui/static/networkpunkt-appbar*.css text eol=lf
src/threaddesk/ui/static/networkpunkt-appbar*.json text eol=lf
src/threaddesk/ui/static/networkpunkt-appbar-SHA256SUMS text eol=lf
src/threaddesk/ui/static/np-appbar-*.png -text
24 changes: 23 additions & 1 deletion docs/TEAMPLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ an gemeinsamen Dateien werden vorab eindeutig einem Bearbeiter zugeteilt.
| E02.3–4 | AP-01/AP-02/F4 | Quellumfänge abgeschlossen: AP01 PR #229 (`ab1aba3`) als `7a9416d`, AP02 PR #230 als `262917f` auf main; jeweils grüne PR-CI. Grok `ship` beider Umfänge, Ergebnis `9784c6e6-3258-42ad-8295-a30ea114ee27`, eigener Body-Lauf11/11. SQLite156+1 expliziter Skip; echter Postgres-CI-Lauf157 bestanden. Kein neues 4AllPass-Paket daraus abgeleitet. |
| E03 | P01–P05, R02–R07/R12, AP-04 | Offen: Kryptografie, Snapshot, Konto/Sitzung, Geräte, Recovery und belastbarer Identitätsvertrag. Vorhandene Tests ersetzen keine Bereichsabnahme. |
| E04 | P06–P08/P11–P12, R08–R11/R15–R17, AP-03 | Offen: Browser-/Desktop-/native Nutzerwege und Paketnachweise am tatsächlichen Kandidaten. |
| E05 | UI-01, zugehöriger TD-08-Umfang | Offen: gemeinsame kompakte App-Leiste, vorhandene Icons, bestätigte frische Verbindungen; nur 4AllPass bei bestätigtem Unlock sehr dezenter Puls. |
| E05 | UI-01, zugehöriger TD-08-Umfang | Reine portable DOM/CSS-/Kataloggrundlage1.0.0 in Arbeit, synthetische Browser-/Vertragsprüfung; keine Host-Einbindung oder echte Peerabnahme. KiraBridge zuerst, danach TD/AP; KB-Icon und authentisierte frische Status-/Openadapter weiter offen. Nutzerfeedback zur Icongröße noch ohne Oberflächenzuordnung. |
| E06 | TD-03–TD-06/TD-08, AP-04 | Offen: Projektrollen, atomarer Transfer, Team-Sync, projekt-/thread-/revisions-/laufgebundene Agentenaufträge. |
| E07 | AP-05–AP-07, P09/R13–R14 | Offen: begrenzte Freigaben, tatsächliche Hostgrenze und genau eine freigegebene reale Anbieteroperation; kein synthetischer Test als Produktionsbeweis. |
| E08 | TD-07 | E08.1 in Prüfung: optionaler lokaler Titel-/Beschreibung-/Notizschnitt mit FTS5, begrenztem JSON-/No-FTS-Ersatz und `td search` auf main `88a5b4d`; default aus, expliziter Aufbau, ehrlicher Teilstand und frische lokale Policy. [Vertrag und Grenzen](LOCAL-SEARCH.md), [Quell-/Test-/Messnachweis](evidence/e08-local-search-20261020/STATUS.md). Echte 10k-/100k-Textmessung und unabhängige Abnahme werden getrennt nachgeführt. Projekt-/Teamrechte bleiben E06; optionaler Bridge-Dateiindex und Produktfreigabe weiter offen. |
Expand Down Expand Up @@ -257,3 +257,25 @@ Nächste unabhängige Arbeit: E03-IndexedDB-Commit/Abort und H1-Kontoregistrieru
in getrennten bestehenden 4AllPass-Worktrees; Grok spezifiziert AP04 und holt
vorhandene native Reviewresultate ab. E08/TD07 wird als lokales optionales
Suchmodul vorbereitet. E03–E09 sind damit nicht insgesamt abgeschlossen.

### E05 / UI-01: reine Renderer-Grundlage (20.10.2026)

Versioniertes NP-Modul, feste Katalog-/Adaptermetadaten, TTL/Generation/Peer-
zuordnung und getrennt erlaubter AP4-Nutzer-/Tresorstatus. Kein Ring aus bloßem
Start/Transport/PID und kein Bridge-Aktivitätspuls. Vertrag/Übernahme:
`docs/contracts/appbar-v1.md`. Bestehende freigegebene TD/AP4-Pixel bytegleich,
kein KB-Ersatzlogo. Noch keine TD/AP/KB-Template-/Appintegration; KB-Mount
bleibt gemäß Gesamtplan zuerst. Unabhängiger Source-/Browserreview und echte
Öffnungs-/Status-/Hostabnahmen folgen getrennt.

E05-Renderer-Nachbesserung nach unabhängigem b36-Review: beobachtete partielle
Uhr-Rücksprünge neutralisieren die Statuslease; Öffnungsdeadline bewertet beide
Uhren und hält unklare Starts bis Hostprüfung gesperrt. Tooltips bleiben auch
im schmalen Ausschnitt sichtbar.35 Nodefälle/31 gezielte Repo-Prüfungen grün,
unveränderte Reviewerproben vom Autor5 Node/6 Browser grün; unabhängige
Nachabnahme folgt, echte Verbindungen/Hostintegration weiterhin offen.

E05-F3-Nachbesserung: Ein ungültiges Uhralter erfüllt die600ms-Mindestwartezeit
nicht; nach Hostprüfung beginnt sie vollständig neu.32 gezielte Repofälle
grün, unveränderte Reviewerproben vom Autor5 Node/7 Browser grün; unabhängige
Nachprüfung und alle echten Host-/Verbindungsabnahmen bleiben getrennt offen.
179 changes: 179 additions & 0 deletions docs/contracts/appbar-v1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# UI-01 · portabler Renderer 1.0.0

Dies ist die reine gemeinsame Grundlage des bestehenden E05-Auftrags, keine
fertige Verbindung oder App-Einbindung. Quelle ist vorläufig ThreadDesk wie beim
NP-Kern (§19 GOLDENRULES). **Zuerst folgt KiraBridge; ThreadDesk/4AllPass sind
noch nicht eingebunden.** Kein bestehender Header, Markenname oder Markenfarbwert
wird durch diese Dateien verändert. Es gibt keinen verpflichtenden ThreadDesk-Hub.

## Versionierte lokale Übernahme

`src/threaddesk/ui/static/networkpunkt-appbar-bundle.json` nennt den kleinen
Dateisatz; `networkpunkt-appbar-SHA256SUMS` enthält vollständige Fingerprints.
Die benötigten Dateien einer konkreten Git-Version bewusst bytegleich lokal
kopieren, Hashes prüfen und den Quellpin im jeweiligen Host festhalten. Keine
CDN, automatische Repo-Aktualisierung, neue Dependency, Framework- oder
Pluginplattform. Der bestehende NP-CSS-Kern0.1 ist die Gestaltungsabhängigkeit;
seine vorhandenen Marken-/Schriftregeln werden nicht umgeschrieben.

Der Katalog1.0.0 enthält feste App-IDs, DE/EN-Namen, vorhandene Bilddateien,
eigene Toolfarbe und den Weg `host-adapter`. Die Installation liefert den
zugehörigen erlaubten Status-/Öffnungsadapter. Statuswerte können weder Icon,
Farbe, Reihenfolge noch ein Startziel bestimmen. Nur bekannte Suite-IDs sind
zugelassen; weitere Fachmodule sind keine zusätzlichen App-Icons.

- ThreadDesk: freigegebener48px-Dark-Export aus assets/design, bytegleich.
Ringfarbe #b99cff aus bestehendem brand/README.
- 4AllPass: aktueller freigegebener AP4-Dark-Export aus brand/ap4, bytegleich;
keine historische Elster. Kein belegter aktueller Ring-Brandtoken in
brand/README.md, brand/ap4/containers.json oder frontend/src/tokens.css;
Pixelheuristiken werden nicht als Markenentscheidung übernommen. Der
Standardkatalog hält die Farbe deshalb null und die Statusanzeige neutral.
- KiraBridge: weiterhin kein zugeordnetes freigegebenes Bild. Kein Buchstabe,
Fremdicon oder neu gezeichnetes Ersatzlogo. Deshalb noch kein Katalogeintrag.
- TollGate: Asset noch nicht diesem Modul zugeordnet; kein behauptetes Fehlen
im Gesamtbestand. Später fester Eintrag plus erlaubter Adapter.

## Hostslot und Darstellung

Der Host reserviert später denselben Headerplatz nach seiner Produktmarke und
vor den eigenen Aktionen. Die Grundlage montiert **keinen** Host selbst.
Vorbereitete Fixturemaße:24px-Bild aus48px-Datei,32px-Ring,40px-NP-Bedienfläche,
4px-Abstand. Das ist ein technischer Prüfstand, keine sichtbare Nutzerabnahme;
Daniels aktuelles Feedback zur Icongröße ist noch einer Oberfläche zuzuordnen.
Eine daraus folgende Maßänderung wird zentral vorgenommen, nicht pro Host
anders erfunden. Keine automatische Touch-/Mobilgestaltung entgegen der
aktuellen NP-Präzisierung. Auch im schmalen Fixtureausschnitt bleibt der Zugang
erreichbar; dies ist keine Abnahme tatsächlicher Hostheader.

Die Katalogreihenfolge KiraBridge/ThreadDesk/4AllPass/TollGate ist unabhängig vom
Status; nur verfügbare konfigurierte Einträge erscheinen. Nativer Button mit
Textname/Status/Öffnungsaktion als aria-label, Tab/ShiftTab/Enter/Space, sichtbarem
Fokus und Tooltip bei Fokus/Hover, mit Escape schließbar. Der Tooltip wird
bei Anzeige, Text- und Viewportänderung innerhalb der sichtbaren Breite gehalten.
Kein Zusatzschloss.
Die Live-Region meldet semantische Änderungen, nicht jeden lokalen250ms-Tick.
Nur der AP4-Ring darf bei erlaubtem aktuellem Unlock langsam pulsieren:
12s, Deckkraft1.00…0.90, Glow10% Toolfarbe. Bild/Hitarea werden nicht animiert.
Reduced motion schaltet die Ringanimation aus; der Text bleibt eindeutig.

## Öffentliche API

ES-Module, ohne React/DOM-Bibliothek:

```js
import { mountAppBar } from "./networkpunkt-appbar.js";
const bar = mountAppBar(reservedElement, {
catalog, locale: "de", peers: trustedExpectedBindings,
colors: trustedNamedToolColors, // {appId:{value:"#RRGGBB",sourceRef:"belegter-Token"}}
onOpen: allowedHostOpenAdapter
});
const ticket = bar.begin("4allpass");
// Erst nach Prüfung durch den vorhandenen authentisierten Hostadapter:
bar.receive("4allpass", ticket, verifiedMetadata);
// Alternativ bar.fail(appId, ticket, "error" oder "unknown").
// bar.reset(appId, newTrustedExpectedBinding) invalidiert alte Instanz/Generation.
// bar.setLocale("en"); bar.destroy();
```

Kein Netzwerk, Storage, PID-/Portscan, allgemeiner Shellaufruf, Fensteröffnen
oder fachlicher Auftrag im Renderer. `clock`/`wallClock` sind injizierbare lokale
Fixtureuhren; normale Hosts verwenden performance.now und Date.now.

## Statusadaptervertrag

Erwartete Bindung aus vertrauenswürdiger lokaler Installation:

```
{appId, connectionRef, peerRef, peerEpoch,
unlockScope?: {userRef, vaultRef}}
```

`peerRef` muss das erwartete Gegenüber des vorhandenen authentisierten Kanals
bezeichnen, `peerEpoch` dessen bestätigte Instanz. Öffentliche IDs/Fingerprints
allein authentisieren nichts. Insbesondere darf der Adapter weder PID,
Transport-live, erfolgreichen Start noch health200 in `confirmed` übersetzen.
Wo der Kanal fehlt, bleibt der Status unknown. Ein frei gepostetes
`authenticated:true` ist kein Beweis und kein Feld dieses Vertrags.

Verifizierte, geheimnisfreie Metadaten aus diesem Adapter:

```
{v:1, appId, connectionRef, peerRef, peerEpoch, seq,
state:"confirmed"|"connecting"|"disconnected"|"unknown"|"error",
ttlMs:1..15000,
vault?: {userRef,vaultRef,allowed:true,
state:"locked"|"unlocked"|"unknown",ttlMs:1..connectionTTL}}
```

Der Renderer prüft Form/Zuordnung/Frische, **nicht** Authentisierung oder
Gerätebesitz. Der Hostadapter muss die echte Antwort an die angefragte
Verbindung und aktuelle erlaubte Nutzer-/Tresorzuordnung binden. Ein Boolean
ersetzt diese Prüfung nicht. Keine neuen Schlüssel, Secrets, Konten oder
Berechtigungen für die Darstellung. Keine Tresorobjekte, Inhalte, Tokens,
Passwörter, Grants, Budgets oder Aktivitätsdaten in diesem DTO.

Eine fehlende Toolfarbe muss aus dokumentierter Gestaltung kommen, benannt
durch den vertrauenswürdigen lokalen Hostadapter (`colors` mit sourceRef).
Statusantworten dürfen sie nicht liefern. Ohne diese Konfiguration bleibt die
Anzeige neutral; die Browserfixture verwendet ausdrücklich eine synthetische
Testfarbe, keine freigegebene AP4-Marke.

Pro Peer höchstens ein laufender lokaler Check; `begin` liefert dafür ein
unveränderliches lokales Ticket, kein Auth-/Netzprotokoll. Deadline2s; TTL maximal
15s und konservativ ab lokalem Checkbeginn, nicht ab einer verspäteten Antwort.
Der Host begrenzt seine tatsächlichen Abfragen auf vorhandenen4s- oder5s-Takt;
der reine Renderer fragt nichts ab. Gleiche/alte Sequenzen, falsche App/Verbindung/
Peer/Instanz, fremde Tickets, Zeitüberschreitung und ungültige Metadaten werden
verworfen. Reset/Verstecken/pagehide invalidieren die Generation. Lokale monotone
und Wanduhr werden gemeinsam konservativ bewertet; Schlaf oder Uhr-Rücksprung
darf kein altes Grün verlängern. Das je Vorgang beobachtete Alter sinkt nie;
ein beobachteter Rücksprung einer der beiden Uhren macht dessen Lease dauerhaft
ungültig, auch wenn die Uhr noch nach dem ursprünglichen Checkbeginn liegt.
Erst ein neuer Check kann wieder bestätigen. Es wird kein Status aus Storage restauriert.

`confirmed` mit gültiger Verbindung erzeugt den ruhigen eigenen Ring. Nur AP4
mit explizitem allowed:true und exakt erwartetem userRef/vaultRef darf zusätzlich
unlocked anzeigen. Eigene kürzere Vault-TTL endet ohne falsches locked; der
Verbindungsring darf dabei ruhig weiterleuchten. Locked ist ausdrücklich
gesperrt, unknown ausdrücklich unbekannt. Andere Apps erhalten niemals einen
Aktivitäts-/Unlockpuls. Ein fehlgeschlagener Check neutralisiert sofort.

## Fester Öffnungsadapter

`onOpen({appId,actionId,signal})` erhält nur feste Katalog-ID, lokalen Vorgangsbezug
und Abbruchsignal. Kein freies Ziel/Argument aus Projekt-/Thread-/Teamdaten.
Der Host mappt diese ID auf bereits erlaubtes festes Ziel und schützt Fokus/
Start sowie begrenzte Idempotenz selbst. Antwort:
`{actionId,outcome:"focused"|"opened"|"failed"|"unknown"}`.

Parallel-/Doppelklicks werden zusammengeführt (mindestens600ms). Deadline2s
mit derselben konservativen monotonen/Wanduhrmessung wie beim Status: Schlaf,
Wanduhrfortschritt bei stehender monotoner Uhr oder beobachteter Rücksprung
können einen verspäteten Erfolg nicht nachträglich akzeptieren;
unklarer Ausgang bleibt gegen weiteren Start gesperrt und hat keinen
automatischen Retry. Erst nach eigener Zielprüfung darf der Host
`clearOpen(appId)` aufrufen. Ein ungültiger Uhrwert erfüllt niemals die
600ms-Mindestwartezeit. Ein Rücksprung während dieser Wartezeit sperrt auch
nach einem sofortigen opened-Ergebnis; nach Hostprüfung beginnt eine neue volle
600ms-Wartezeit. Erst ein endliches geprüftes Alter darf die Wartezeit beenden.
Späte Ergebnisse ersetzen keinen neueren Vorgang.
Destroy signalisiert Abbruch; ein unkooperativer Adapter kann nicht vom
Renderer zwangsweise beendet werden, verändert aber dessen DOM nicht mehr.
Fehlendes Ziel/Fehler führen zu festen DE/EN-Handlungen, nie rohen Responses.
Ein Öffnungserfolg bestätigt **niemals** eine Verbindung oder Tresorfreigabe.

## Geprüfter und weiterhin offener Umfang

`python -m pytest -q tests/test_appbar.py tests/test_ui_assets.py` führt die
35 reinen Node-Zustandsprüfungen sowie echtes Chromium-DOM/CSS aus. Die
Browserfixture liefert nur freigegebene lokale Assets über abgefangene
Fixture-Requests; keine echte App, Verbindung, Konten, Datenbank oder Startziele.
DE/EN/Keyboard, Scope/TTL/Fehler/Wiederverbindung, Ring-/Bildgeometrie, reduzierte
Bewegung, Timerabbau und keine doppelten synthetischen Starts werden gemessen.
Das ist Renderer-/Accessibility-Verhalten, keine vollständige Screenreader-,
Nutzer-, Native- oder Verbundabnahme. Keine Vorlage wird produktiv importiert.

Offen bleiben KiraBridge-Asset, belegter AP4-Ringfarbwert, erste KB-Einbindung, abgesicherte echte
Öffnungs-/Statusadapter, danach TD/AP-Mounts und jeweilige native/Host-Abnahme.
Ein neuer Adapter erweitert nicht Tresor-, Projekt- oder Auftragsrechte.
10 changes: 10 additions & 0 deletions docs/evidence/e05-portable-appbar-20261020/SHA256SUMS
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
98371bd9edc96fb940a0e0de34933740fed1062b510aa516498fcb53e112591e src/threaddesk/ui/static/networkpunkt.css
7a4ef4699cf5e07f84f57279f86f73b9dbd85e1e9272e4329a5e430b977ad60d src/threaddesk/ui/static/networkpunkt-appbar.js
c97ef3d092a2df9687629a2d877672b133df8aeda8175f3bfdf2a7698758d7f8 src/threaddesk/ui/static/networkpunkt-appbar-state.js
2a266588a5d1da0fb0d1c8d77f671d10847e038029670c14b38ae8609ec76639 src/threaddesk/ui/static/networkpunkt-appbar-catalog.js
b8626e2dc7d0f34a4065fc217e11cd0b52ce1d4dea0df802b4a642e7fec57b46 src/threaddesk/ui/static/networkpunkt-appbar.css
e36c6bd46dbe6744efec07ce2ab73e1996208d99fdf63ed21879da2a4d2cc6ad src/threaddesk/ui/static/networkpunkt-appbar-assets.json
6add7033bb8ec5f0efa0c09ddf136c892352f4536b14b774f1ae8dcd57ee9ba2 src/threaddesk/ui/static/np-appbar-threaddesk-dark-48.png
1074241a92275ae4b4a0d3ac00482ab9a253bcd5f60b569d96f84e95ae8ff336 src/threaddesk/ui/static/np-appbar-4allpass-dark-48.png
13862406a14a212fd6e0646616be04604e77b9bb3a6225e8d18b470dae44225b src/threaddesk/ui/static/networkpunkt-appbar-bundle.json
a2a174ff869340edd65024824b45fe8fe228909dbb84aee29fb82fd474fdc67e src/threaddesk/ui/static/networkpunkt-appbar-SHA256SUMS
Loading
Loading