feat(hub-settings): instellingenpagina voor de S4M Hub-hooks per host #143
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/Ops-dashboard!143
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/hub-hook-settings"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Eén pagina
/settings/hubdie per host (mac,max2,srv) toont wat er van de twee S4M Hub-hooks geregistreerd en actief is, en waarmee de twee wachttijden op de eigen host gezet kunnen worden.Architectuur
Elke dashboard-instance leest zijn eigen host via de lokale ops-agent en hangt een JSON-snapshot aan de bestaande hartslag; de pagina rendert de fleet uit de gedeelde
ops_dashboard-database. Er gaat niets cross-host — dat is het expliciete niet-doel uit2026-05-28-multi-host-fleet-design.md.De veiligheidsgrens ligt in de agent-whitelist, niet in het formulier: de toegestane wachttijden (
0/120/300) staan inargs.allowed, de agent voert geen shell uit en interpoleert niets. Zelfs een gecompromitteerd dashboard kan geen willekeurige waarde zetten. Het ingest-secret verlaat de host nooit — de snapshot draagt alleensecret_present, de hostnaam uitHUB_URL(niet de volledige URL) en de soort van elk hookcommando (niet het commando).Herkomst
Spec (SPEC-GO, revisie 12, 11 reviewronden) en plan (PLAN-GO, 9 planronden) zijn met twee cross-model reviewers doorgelopen; in geen van beide loops is een finding verworpen. Beide documenten dragen hun volledige
## Review record.Stand van de uitrol
20260819210000_instance_hub_snapshotis toegepast op de liveops_dashboard-database (drie nullable kolommen +instance_hub_snapshot_seq), centraal en vóór enige code-uitrol.schema 2met alle acht readiness-vlaggentrueen geen whitelist-drift. Op beide is de agent-herstart apart bewezen door de key via/agent/v1/execuit te oefenen./settings/hubbestaat nog op geen enkele host. Dat is de volgende stap na deze merge.Gate
npm run typecheckgroen ·npm test1178 groen (baseline 1106) ·npm run buildslaagt. De 4 falende tests intest/scrum4us-deploy-trigger.test.tszijn pre-existing opmainen niet door deze branch geraakt.Drie defecten die pas bij het draaien bleken
echo "$@", en bash-echoeet een eerste argument-nop als vlag — de vormassertie kon nooit matchen.tsc --noEmitweigert die.install-hub-module.shschreef naar/etc/sudoers.d/en valideerde pas daarna — de vorm dieinstall-network-module.shook heeft. Een syntaxfout breekt dan sudo host-breed terwijl de back-up onbereikbaar is. Nu wordt een kandidaat gevalideerd en pas bij exit 0 het echte bestand aangeraakt; de test bewijst dat sudoers byte-identiek blijft als de validatie faalt.🤖 Generated with Claude Code
De twee BLOCKERs raakten de dragende aannames: - ops-agent draait als gebruiker ops-agent en kan /home/janpeter (750) niet eens binnenlopen, laat staan het 0600-envbestand lezen. Zelf nagemeten met sudo -u ops-agent test -x/-r: beide nee. Beide commando's krijgen nu de sudo -n-vorm die 17 bestaande whitelist-entries al gebruiken, met een sudoers-regel als installatiestap. Op de Mac speelt dit niet — het defect is asymmetrisch en zou bij een Mac-only test onzichtbaar blijven. - De claim over SCRUM4ME_DATABASE_URL klopt op srv (rol, grants en container-env geverifieerd), maar de Mac heeft diezelfde variabele wijzend naar ops_dashboard. Aanwezigheid bewijst dus niets: het iOS-paneel gaat nu achter een positieve probe op to_regclass('public.hub_devices'). Verder: bundler-vrije verzamelmodule (server-only resolvet niet in het ts-node-hartslagpad), harde deadline van 5 s op de agent-call met een onvoorwaardelijke upsert, uitrolvolgorde voor de migratie op de gedeelde DB, sub-paneel hub-serverconfig geschrapt (die waarden staan niet in de DB en twee van de drie zijn code-defaults), agent_url gecorrigeerd van "ongebruikt" naar load-bearing voor Control Room v2, verouderingsdrempel terug naar het bestaande ONLINE_WINDOW_MS van 120 s, reader met statusuitkomst, capability-guard op de route, en de mutatieroute die geen slug uit de client accepteert. De secretclaim is vervangen door de eis die het risico echt afdekt: atomaire rewrite in dezelfde map met mode/eigenaar behouden en een controle achteraf dat HUB_INGEST_SECRET en HUB_URL nog bestaan. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>Plan Task 8. scrum4me-hub-reader.ts volgt lib/worker-insights/scrum4me-reader.ts (lazy pool, max 3, statement_timeout, eigen application_name) met één verschil dat er toe doet: hij degradeert NIET naar leeg maar geeft {status, rows} terug. Een lege tabel leest als "er zijn geen toestellen", en dat is iets heel anders dan "ik kan er niet bij". De echte queries zijn de probe; er is geen aparte voorcontrole. 42P01, 42501 en 3D000 zijn `unavailable` en geen `error` -- dat is precies het Mac-geval, waar SCRUM4ME_DATABASE_URL naar ops_dashboard wijst en de hub_*-tabellen dus niet bestaan. Die configuratie zelf hoort in Task 10 bij JP te liggen, niet hier stilzwijgend gerepareerd te worden. Het paneel zegt bij unconfigured/unavailable waaróm er niets staat en wijst naar een instance die de gegevens wél heeft. De limit gaat als queryparameter mee in plaats van geïnterpoleerd, en is begrensd; dat is geen reactie op een gevonden lek maar de gewoonte die voorkomt dat er ooit één ontstaat.Verdict: REQUEST_CHANGES
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
app/settings/hub/page.tsx:64— Nieuwe UI-code gebruiktbg-amber-500/10. De actieve productdocpatterns/md3-theme-stylingmarkeert rauwe Tailwind-paletkleuren in nieuwe code als hardstop; gebruik semantische MD3/shadcn tokens in plaats vanamber-*.app/settings/hub/page.tsx:81— Nieuwe UI-code gebruikttext-amber-700 dark:text-amber-400voor drift-waarschuwingen. Dit valt onder dezelfde hardstop tegen rauwe paletkleuren; vervang dit door bestaande semantische status-/destructive/warning-tokenisatie of voeg een passende semantische token toe volgens het thema.app/settings/hub/page.tsx:112— Nieuwe UI-code gebruikt opnieuwtext-amber-700 dark:text-amber-400voor verouderde metingen. Ook dit moet via semantische MD3-tokens lopen.Opmerkingen
De functionele kern rond lokale host-mutatie, CSRF/capability-guards, monotone snapshot-writes, schema-2 parsing en tests ziet er zorgvuldig opgezet uit. Ik heb geen aanvullende blokkerende functionele bevinding gevonden in de diff. De styling-hardstop is echter expliciet normerend voor nieuwe UI-code, daarom geen approval.
Alle drie de findings verwerkt in
742bd87.Ik heb ze eerst tegen de tree gehouden voordat ik ze toepaste, en mijn eerste tegenwerping bleek fout. Rauwe paletkleuren zijn in deze repo wijdverbreid — 15+ bestanden,
amber-40022x,amber-50019x — dus mijn aanname was dat het de conventie is. De productdocpatterns/md3-theme-styling(statusactive, gekoppeld aan dit product) zegt echter het tegendeel: die ~353 voorkomens staan er expliciet als "bewust buiten scope gelaten bij de eerste restyle", met daarnaast een hardstop op rauwe paletkleuren in nieuwe code. Legacy is dus geen precedent. De findings kloppen.Omgezet naar de bestaande MD3-tokens:
bg-amber-500/10(regel 64)bg-warning-container/40text-amber-700 dark:text-amber-400(regel 81)text-warningtext-amber-700 dark:text-amber-400(regel 112)text-warningDat is niet alleen conform maar strikt beter:
--warningis#735b00in light en#efc047in dark, dus de handmatigedark:-varianten vervallen — het token flipt zelf. Ik heb geverifieerd dat de build beide utilities daadwerkelijk in de CSS zet, want een@theme inline-token met opacity-modifier is niet vanzelfsprekend.Toegevoegd:
test/hub-settings-styling.test.ts, fail-closed op de hele mapapp/settings/hub/, zodat een nieuw bestand daar standaard onder de regel valt. De melding noemt bestand en kleur. Apart gecontroleerd dat de test rood wordt zodra er een rauwe kleur in staat.Gate na de wijziging:
tsc --noEmitgroen, 73 hub-tests groen,npm run buildcompileert.🤖 Generated with Claude Code
Verdict: APPROVED
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
Geen blokkerende of error-severity findings gevonden.
De diff volgt de relevante productstandaarden voor lokale agent-boundaries, capability/CSRF-guards, MD3/Tailwind-styling en operationele documentatie. De risicovolle stukken rond shell-side effects, whitelist-drift, monotone snapshot writes en heartbeat-best-effort gedrag zijn met gerichte tests afgedekt.