OciServe-bewijs: 'Bewijs aanleveren' maakt een bestandsslot maar geen bewijsstuk — de beoordelaar ziet niets #2422

Closed
opened 2026-10-14 18:40:39 +00:00 by brenno · 2 comments
Owner

Wat wil je bereiken

Een cursist levert bewijs aan voor een badge, en een beoordelaar in Keiko ziet dat stuk in zijn wachtrij en kan het beoordelen. Dat is de beloofde keten (#2037, #2038), maar de laatste schakel ontbreekt.

Wat mist er nu (origin/main 5802e9360)

  • lib/widgets/dialogs/ociserve_evidence_submit.dart:108-148: _submit() doet requestEvidenceSlot (POST /evidence-uploads) en uploadEvidenceContent (PUT …/evidence-uploads/{id}/content) en sluit dan de dialoog. Stap 1 (soort), stap 3 (geldig tot) en stap 4 (toestemming) worden gevraagd en nergens verstuurd: EvidenceUploadRequest.toJson (lib/models/ociserve_evidence.dart:105-128) heeft alleen filename, declared_type, declared_size, declared_hash en participant_id.
  • Wat een beoordelaar ziet is een bewijsstuk (evidence item), niet een upload. Dat ontstaat op de server alleen via POST …/participants/{pid}/evidence-items en via portfolio-import. OciDeck roept geen van beide aan (nul treffers voor evidence-items). De beoordelingswachtrij (GET /evidence-queue, status ingediend) bevat dus nooit iets van OciDeck; de upload blijft een losse, schone blob.
  • De dialoog belooft "Soort — komt uit de eis waarop je klikte", maar er is geen eis om op te klikken. _openSubmit (lib/widgets/dialogs/ociserve_evidence.dart:267) geeft de titel van de eerste kwalificatie door, of een lege string. badge-readiness wordt niet aangeroepen, dus het "per badge wat er nog ontbreekt" uit de docstring bestaat niet.

Contract (OciServe 560f1ba)

  1. GET /organizations/{org}/participants/{pid}/skills/{skill_id}/badge-readiness → {skill_id, skill_title, kwalificatiesoort, validity_months, requirements:[{kind, title, evidence_type, course_id, min_assurance, met}], ready}. Een deelnemer mag zijn eigen leesmodel zien. evidence_type is de slug van de bewijssoort.
  2. GET /organizations/{org}/evidence-types (capability content:view, die de rol participant heeft) om de slug naar evidence_type_id (uuid) en de gepubliceerde versie te vertalen.
  3. Slot en upload zoals nu; wacht tot de upload clean is (GET …/evidence-uploads/{id}, kwarantaineprotocol).
  4. POST /organizations/{org}/participants/{pid}/evidence-items met Idempotency-Key en body {evidence_type_id, upload_id, declared_issuer?, declared_issued_at?, declared_valid_until?, declared_attributes?} → bewijsstuk met content_status: ingediend. De bewijssoort moet een gepubliceerde versie hebben. Een deelnemer mag in zijn eigen dossier indienen.
  5. GET …/participants/{pid}/evidence-items voor de eigen lijst (naast of in plaats van de uploadlijst).

Gevraagd

  • Per badge de eisen uit badge-readiness; een openstaande bewijseis opent het aanleverpad met de soort al ingevuld, zoals de docstring belooft.
  • "Geldig tot" gaat mee als declared_valid_until, voorgevuld waar de soort dat kent.
  • Toestemming blijft een lokale bevestiging in de dialoog; de server heeft er geen veld voor, verzin er geen.
  • Statuskaart op de bestaande helpers (_uploadStatusDisplay) maar op basis van het bewijsstuk, inclusief de reden bij afwijzing in gewone taal.
  • Geen kopie van identiteitsbewijzen: de catalogus biedt die soort niet aan; toon geen soort die de server niet geeft.

Toets op de kernwaarden

Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (test/fixtures/ociserve_openapi.yaml, OciServe 45d9a87), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in test/ociserve_api_drift_test.dart (de contractpoort, #2042).

Acceptatiecriteria

  • Een aangeleverd stuk verschijnt in Keiko's beoordelingswachtrij (proef tegen een echte, gepinde OciServe).
  • Soort en "geldig tot" komen in het bewijsstuk terecht.
  • Herhalen na een netwerkfout maakt geen tweede bewijsstuk (één Idempotency-Key per poging).
  • Een weigering van de server (bewijssoort zonder gepubliceerde versie, upload niet clean) krijgt een begrijpelijke zin, geen statuscode.

Acceptatiecriteria (algemeen)

  • Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest.
  • Nieuwe l10n.d('…')-teksten via make add-l10n (31 talen).
  • make check groen; docs/USER_GUIDE.md, docs/SOURCE_MAP.md en CHANGELOG.md bijgewerkt.

Gerelateerd

Beoordelingskant: Keiko heeft de wachtrij al. Portefeuille koppelen (zelfde keten): LibreKAT/Ocideck#2423. Overzicht: brenno/OciServe#659.


Keten-audit van 2026-10-14, getoetst aan OciServe 560f1ba, Keiko 093f679 en OciDeck 5802e9360. Overzicht: brenno/OciServe#659.

## Wat wil je bereiken Een cursist levert bewijs aan voor een badge, en een beoordelaar in Keiko ziet dat stuk in zijn wachtrij en kan het beoordelen. Dat is de beloofde keten (#2037, #2038), maar de laatste schakel ontbreekt. ## Wat mist er nu (origin/main `5802e9360`) - `lib/widgets/dialogs/ociserve_evidence_submit.dart:108-148`: `_submit()` doet `requestEvidenceSlot` (`POST /evidence-uploads`) en `uploadEvidenceContent` (`PUT …/evidence-uploads/{id}/content`) en sluit dan de dialoog. Stap 1 (soort), stap 3 (geldig tot) en stap 4 (toestemming) worden gevraagd en nergens verstuurd: `EvidenceUploadRequest.toJson` (`lib/models/ociserve_evidence.dart:105-128`) heeft alleen `filename`, `declared_type`, `declared_size`, `declared_hash` en `participant_id`. - Wat een beoordelaar ziet is een **bewijsstuk** (evidence item), niet een upload. Dat ontstaat op de server alleen via `POST …/participants/{pid}/evidence-items` en via portfolio-import. OciDeck roept geen van beide aan (nul treffers voor `evidence-items`). De beoordelingswachtrij (`GET /evidence-queue`, status `ingediend`) bevat dus nooit iets van OciDeck; de upload blijft een losse, schone blob. - De dialoog belooft "Soort — komt uit de eis waarop je klikte", maar er is geen eis om op te klikken. `_openSubmit` (`lib/widgets/dialogs/ociserve_evidence.dart:267`) geeft de titel van de eerste kwalificatie door, of een lege string. `badge-readiness` wordt niet aangeroepen, dus het "per badge wat er nog ontbreekt" uit de docstring bestaat niet. ## Contract (OciServe `560f1ba`) 1. `GET /organizations/{org}/participants/{pid}/skills/{skill_id}/badge-readiness` → `{skill_id, skill_title, kwalificatiesoort, validity_months, requirements:[{kind, title, evidence_type, course_id, min_assurance, met}], ready}`. Een deelnemer mag zijn eigen leesmodel zien. `evidence_type` is de **slug** van de bewijssoort. 2. `GET /organizations/{org}/evidence-types` (capability `content:view`, die de rol `participant` heeft) om de slug naar `evidence_type_id` (uuid) en de gepubliceerde versie te vertalen. 3. Slot en upload zoals nu; wacht tot de upload `clean` is (`GET …/evidence-uploads/{id}`, kwarantaineprotocol). 4. `POST /organizations/{org}/participants/{pid}/evidence-items` met `Idempotency-Key` en body `{evidence_type_id, upload_id, declared_issuer?, declared_issued_at?, declared_valid_until?, declared_attributes?}` → bewijsstuk met `content_status: ingediend`. De bewijssoort moet een gepubliceerde versie hebben. Een deelnemer mag in zijn eigen dossier indienen. 5. `GET …/participants/{pid}/evidence-items` voor de eigen lijst (naast of in plaats van de uploadlijst). ## Gevraagd - Per badge de eisen uit `badge-readiness`; een openstaande bewijseis opent het aanleverpad met de soort al ingevuld, zoals de docstring belooft. - "Geldig tot" gaat mee als `declared_valid_until`, voorgevuld waar de soort dat kent. - Toestemming blijft een lokale bevestiging in de dialoog; de server heeft er geen veld voor, verzin er geen. - Statuskaart op de bestaande helpers (`_uploadStatusDisplay`) maar op basis van het bewijsstuk, inclusief de reden bij afwijzing in gewone taal. - Geen kopie van identiteitsbewijzen: de catalogus biedt die soort niet aan; toon geen soort die de server niet geeft. ## Toets op de kernwaarden Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (`test/fixtures/ociserve_openapi.yaml`, OciServe `45d9a87`), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in `test/ociserve_api_drift_test.dart` (de contractpoort, #2042). ## Acceptatiecriteria - [ ] Een aangeleverd stuk verschijnt in Keiko's beoordelingswachtrij (proef tegen een echte, gepinde OciServe). - [ ] Soort en "geldig tot" komen in het bewijsstuk terecht. - [ ] Herhalen na een netwerkfout maakt geen tweede bewijsstuk (één `Idempotency-Key` per poging). - [ ] Een weigering van de server (bewijssoort zonder gepubliceerde versie, upload niet `clean`) krijgt een begrijpelijke zin, geen statuscode. ## Acceptatiecriteria (algemeen) - [ ] Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest. - [ ] Nieuwe `l10n.d('…')`-teksten via `make add-l10n` (31 talen). - [ ] `make check` groen; `docs/USER_GUIDE.md`, `docs/SOURCE_MAP.md` en `CHANGELOG.md` bijgewerkt. ## Gerelateerd Beoordelingskant: Keiko heeft de wachtrij al. Portefeuille koppelen (zelfde keten): LibreKAT/Ocideck#2423. Overzicht: brenno/OciServe#659. --- _Keten-audit van 2026-10-14, getoetst aan OciServe `560f1ba`, Keiko `093f679` en OciDeck `5802e9360`. Overzicht: brenno/OciServe#659._
Author
Owner

Grotendeels opgeleverd in LibreKAT/Ocideck#2432 (hangt aan brenno/OciServe#668, inmiddels gemerged; pin staat op 3c7c40f).

Erin:

  • Stap Soort is nu een keuze uit de gepubliceerde bewijssoorten van de organisatie; geen soort, geen vervolg.
  • Na de upload wacht OciDeck op de quarantainecontrole en maakt dan pas het bewijsstuk aan (POST …/participants/{id}/evidence-items, met Idempotency-Key). Een geweigerd bestand wordt niet ingediend.
  • Een herhaalde poging na een netwerkfout hergebruikt slot en sleutel, dus er ontstaat geen tweede bewijsstuk; een geweigerd slot niet.
  • Mijn bewijs toont per stuk de beoordelingsstatus en de opmerking van de beoordelaar.
  • "Geldig tot" gaat mee als declared_valid_until.

Nog niet:

  • Het acceptatiecriterium "verschijnt in Keiko's beoordelingswachtrij, geprobeerd tegen een echte OciServe" is niet getoetst; de tests lopen tegen de nagebootste server en de gepinde spec.
  • De begrijpelijke zin per weigering is er voor een geweigerd bestand, een controle die nog loopt en een mislukte indiening. Een bewijssoort zonder gepubliceerde versie komt normaal niet in de keuzelijst; weigert de server hem toch (bijvoorbeeld doordat hij net is gearchiveerd), dan zie je de algemene melding dat aanleveren is mislukt.
  • docs/USER_GUIDE.md is niet bijgewerkt (die beschrijft dit gedeelte nergens).

Het issue blijft open tot de PR gemerged is en iemand de keten end-to-end heeft geprobeerd. De privacy-label blijft staan: de bestandsnaam, het type en de hash gaan naar de server; docs/PRIVACY.md heeft daar nu een rij voor.

🤖 Generated with Claude Code

Grotendeels opgeleverd in LibreKAT/Ocideck#2432 (hangt aan brenno/OciServe#668, inmiddels gemerged; pin staat op `3c7c40f`). **Erin:** - Stap *Soort* is nu een keuze uit de gepubliceerde bewijssoorten van de organisatie; geen soort, geen vervolg. - Na de upload wacht OciDeck op de quarantainecontrole en maakt dan pas het bewijsstuk aan (`POST …/participants/{id}/evidence-items`, met `Idempotency-Key`). Een geweigerd bestand wordt niet ingediend. - Een herhaalde poging na een netwerkfout hergebruikt slot en sleutel, dus er ontstaat geen tweede bewijsstuk; een geweigerd slot niet. - *Mijn bewijs* toont per stuk de beoordelingsstatus en de opmerking van de beoordelaar. - "Geldig tot" gaat mee als `declared_valid_until`. **Nog niet:** - Het acceptatiecriterium "verschijnt in Keiko's beoordelingswachtrij, geprobeerd tegen een echte OciServe" is **niet** getoetst; de tests lopen tegen de nagebootste server en de gepinde spec. - De begrijpelijke zin per weigering is er voor een geweigerd bestand, een controle die nog loopt en een mislukte indiening. Een bewijssoort zonder gepubliceerde versie komt normaal niet in de keuzelijst; weigert de server hem toch (bijvoorbeeld doordat hij net is gearchiveerd), dan zie je de algemene melding dat aanleveren is mislukt. - `docs/USER_GUIDE.md` is niet bijgewerkt (die beschrijft dit gedeelte nergens). Het issue blijft open tot de PR gemerged is en iemand de keten end-to-end heeft geprobeerd. De privacy-label blijft staan: de bestandsnaam, het type en de hash gaan naar de server; `docs/PRIVACY.md` heeft daar nu een rij voor. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Owner

Gemerged in #2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.

Gemerged in https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2422
No description provided.