Skip to content

XER-review #109: MCP-resourcenamen na toestemming, geen 1970-start, regeleinde in een cel, Arabische/Cyrillische codering - #296

Merged
Nozzit merged 8 commits into
mainfrom
claude/review-109-kleine-fixes
Oct 12, 2026
Merged

Nozzit merged 8 commits into
mainfrom
claude/review-109-kleine-fixes

Conversation

@Nozzit

@Nozzit Nozzit commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

Kleine fixes uit de review van PR #109 (XER/P6-lezer) door de eigenaar op 2026-10-07: één eigenaarsbesluit dat nooit gebouwd was, en drie bevestigde fouten uit de code-review (Opus 5.5, hyperkritische-review). De eigenaar zag de coderingsfout zelf in de app ("kloppen al die namen wel?").

1. MCP: resourcenamen alleen na toestemming

Eigenaarsbesluit 22-09, bevestigd 2026-10-07 ("bouwen"): "codes altijd; resourcenamen alleen achter een opt-in, en de AI-client moet die opt-in aan zijn gebruiker vragen." Tot nu toe stond in de code "GEACCEPTEERD RISICO: name en code blijven zichtbaar".

  • planner_inspect_xer_provenance krijgt includeResourceNames (standaard false), los van includeRawRows.
  • Zonder de optie: resources[].name verdwijnt (nameHidden: true); de RSRC-bronrij blijft dicht, ook met includeRawRows (er staan ook e-mail, personeelsnummer en telefoon in); rawSource wordt geweigerd omdat de bytes de RSRC-tabel bevatten. Codes (rsrc_short_name) blijven altijd zichtbaar.
  • De tool- en optiebeschrijving zeggen de AI-client: vraag de gebruiker eerst om toestemming, want de namen gaan naar de AI-aanbieder.
  • Bewust zichtbaar: rolnamen, curvenamen, namen van codetypes en vrije velden. Afweging per sleutel in het docblok.
  • Aantal MCP-tools blijft 42. De extensie-API (data.getImportSource*) is ongewijzigd: daar is de permissie importSource (standaard uit, door de gebruiker verleend) de toestemming.

2. N1: geen startdatum 1970 meer

Een XER-taak zonder geplande start kreeg 1970-01-01, en het project nam die als projectstart, zonder melding. Alle andere lezers gebruikten al de gedeelde regel voor ontbrekende datums; de XER-lezer niet.

  • Anker, in volgorde: de statusdatum (last_recalc_date, anders data_date), dan PROJECT.plan_start_date, dan de gedeelde regel resolveMissingScheduleDates. De statusdatum gaat vóór plan_start_date omdat P6 onbegonnen werk vanaf de data date plant en bestaande bestanden zo uur-precies gelijk blijven.
  • Nieuwe melding xerImportMissingPlannedStarts in 14 talen.
  • Orkestratorbesluit (omkeerbaar): PROJECT.plan_start_date stond op de verbodslijst van de veldpoorten. Het is een projectinstelling (geplande projectstart), geen P6-rekenuitvoer, net als PROJECT.plan_end_date, dat al een gepinde uitzondering had. Dezelfde gepinde uitzondering is toegevoegd in check-xer-field-whitelist (grep én AST) en check-xer-chunk-boundary. Het alternatief (niet lezen) laat sample.xer op "vandaag" starten.
  • Corpus: MER-1 (beide), P6-Viewer sample.xer en kedular-field-mismatch hebben 0 taken op 1970.

3. N2: regeleinde in een cel

P6 schrijft een regeleinde in een cel als DEL-DEL; een rauw regeleinde komt uit een met een spreadsheet of script bewerkt bestand en kapte de rij af. joinLineBrokenRow voegt een te korte rij samen met de volgende regels zonder %-marker, hooguit 8 regels en alleen als het veldental dan exact klopt; anders blijft de bestaande melding. Geen enkel corpusbestand verandert.

4. N3: tekencodering voor Arabisch, Cyrillisch en Grieks

Niet-UTF-8-bestanden werden altijd als Windows-1252 gelezen. Binnen besluit B17 (UTF-8, anders 1252, de melding noemt de keuze) kiest detectSingleByteEncoding nu ook 1251, 1253 of 1256, maar alleen bij sterk bewijs; bij twijfel blijft het 1252.

  • rehab-2 wordt windows-1256: alle 6.977 taaknamen zijn Arabisch en de projectnaam is "مشروع الرحاب - 2". De tien andere niet-UTF-8-bestanden blijven 1252.
  • Een Arabisch archief overleeft de IFC-ronde.

rehab-2 met leesbare Arabische namen

Hoe getest

  • Per punt nieuwe checks, eerst rood, met een mutant die rood wordt: tests/mcp/cases-xer-provenance.ts (resource "Jan de Vries"), check-import-missing-schedule-dates 6a–6f, check-xer-tables 33–33d en 34–34f, check-ifc-xer-archive-container 22–24, check-xer-corpus R1.
  • npm run verify zonder corpus: exit 0 (planning 560/560, browser 405). Met corpus: check-xer-byte-paths, check-xer-corpus, check-xer-field-whitelist (342) exit 0; measure:profiles: X12 = 76, nieuw=0 verslechterd=0 groter=0.
  • Schermafbeelding door de orkestrator gemaakt en bekeken (rehab-2 headless geopend op deze branch).

Wat overblijft

  • Windows-1250/1254 en Hebreeuws worden niet herkend en blijven 1252 met melding.
  • Een activiteitscode als "Verantwoordelijke" kan namen bevatten; die zit achter includeRawRows, niet achter includeResourceNames.
  • Een oudere app-versie leest een nieuw IFC nog met de oude detectie.

🤖 Generated with Claude Code

Nozzit and others added 8 commits October 7, 2026 20:38
…ceNames

Eigenaarsbesluit 22-09 (bevestigd 2026-10-07): codes altijd, resourcenamen
alleen achter een opt-in die de AI-client eerst aan de gebruiker vraagt.

- planner_inspect_xer_provenance krijgt includeResourceNames (standaard
  false). Zonder optie: resources[].name weg (nameHidden: true), RSRC-
  bronrijcellen dicht ook met includeRawRows, rawSource geweigerd.
- De resourcecode (rsrc_short_name) staat altijd als `code` op resources
  en resourceSources.
- Toolbeschrijving en optiebeschrijving: eerst de gebruiker om toestemming
  vragen; namen gaan naar de AI-aanbieder.
- Docblok "GEACCEPTEERD RISICO" vervangen door de nieuwe regel met de
  afweging per name-sleutel.
- Tests (echte lezer, resource "Jan de Vries"/JDV); mutant "standaard
  true" geeft rood. Gids ref-ai-tools (nl/en) en rules/xer.md bijgewerkt.

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

Review PR #109, N1. Een TASK zonder target_start_date kreeg 1970-01-01 en
het project nam die als projectstart, zonder melding. De XER-lezer volgt nu
resolveMissingScheduleDates zoals de andere lezers: anker = statusdatum
(last_recalc_date, of data_date als die kolom ontbreekt), dan
PROJECT.plan_start_date, dan de vroegste aanwezige taakstart. Ontbrekende
finish = start + duur waar dat eenduidig is.

De openingsmelding telt de vervangen starts (nieuwe regel
xerImportMissingPlannedStarts, 14 locales). Tests in
check-import-missing-schedule-dates (6a–6f); mutant "oude 1970-terugval"
geeft rood. Corpus: MER-1 (beide), sample.xer, kedular: 0 taken op 1970.
measure:profiles: X12 76, nieuw=0 verslechterd=0 groter=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review PR #109, N2 (Fable 8). P6 schrijft een regeleinde in een cel als
DEL-DEL; ook MPXJ breekt een record op elke CR/LF. Een bewerkte XER kan
toch een echte LF/CRLF in bv. task_name dragen: dan verloor de taak duur en
datums. De tabelparser voegt een te korte %R nu samen met de direct
volgende regels zonder %-marker, max. 8, alleen als het veldental exact
klopt; anders blijft XER_ROW_FIELD_COUNT_MISMATCH zoals voorheen.

Tests 33–33d in check-xer-tables (LF en CRLF, twee regeleinden, niet
samen te voegen, overschrijding, grens); mutant "nooit samenvoegen" geeft
rood. Corpusscan: geen enkel bestaand bestand verandert.

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

Review PR #109, N3 (Fable 15); de eigenaar zag het bij rehab-2. Binnen
besluit B17 (BOM, anders UTF-8, anders enkelbyte; de melding noemt de
keuze) kiest de lezer nu tussen Windows-1252/-1251/-1253/-1256:
detectSingleByteEncoding telt woorden die alleen uit bytes >= 0x80 bestaan
en scoort per codetabel hoeveel daarvan een geldig woord van één schrift
met gewoon hoofdletterpatroon geven. Afwijken van 1252 alleen bij >= 8
zulke woorden, >= 50 % aandeel, score >= 0,9 en >= 0,3 voorsprong. Latijnse
1250/1254 zijn niet eenduidig te scheiden en blijven 1252 (twijfel).

Typen en de archiefvalidator kennen de drie nieuwe coderingen; de compacte
IFC-container reconstrueert uit de bytes, dus een Arabisch archief
overleeft de ronde (check-ifc-xer-archive-container 22-24).

Tests: check-xer-tables 34-34f (Arabisch, Cyrillisch, Grieks, West-Europees,
twee Arabische eenheden tussen Latijn, Pools cp1250, te weinig bewijs);
mutant "altijd 1252" geeft rood. Corpus: rehab-2 = windows-1256, 6977/6977
taaknamen Arabisch, projectnaam "مشروع الرحاب - 2"; de tien overige
niet-UTF-8-bestanden blijven windows-1252 (C1-pin bijgewerkt, R1 nieuw).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
De N1-fix leest PROJECT.plan_start_date als anker voor een activiteit
zonder target_start_date. De veld-firewalls (xer-field-whitelist: grep én
AST; xer-chunk-boundary) kenden die naam alleen als verboden TASK-uitvoer.
Zelfde gepinde uitzondering als PROJECT.plan_end_date: precies
`projectRow.cells.plan_start_date` in xerReader.ts, één keer. Een
TASK-lezing blijft rood.

check-xer-project-data-date pinde de oude 1970-terugval; nu de statusdatum
uit data_date.

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

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nozzit added a commit that referenced this pull request Oct 12, 2026
Eigenaarsbesluit 2026-10-12 (optie 1): een melding bij het openen van
een bestand blijft staan tot het kruisje als de app bij het openen data
invulde, verving, repareerde of wegliet. Anders verdwijnt hij na 5 s.

- Nieuwe vlag `sticky` in het meldingenkanaal (geen error: kleur blijft
  info). NotificationHost start voor een sticky info geen timer; bij een
  volle stapel gaat eerst een gewone info weg.
- De regel staat op één plek: src/state/openNoticeSticky.ts
  (STICKY_OPEN_NOTICE_KEYS): XER-parser-/kalenderbevindingen,
  getalnotatie, enum-terugval, P6-instellingen met terugval, beschermende
  baseline-terugval, genegeerde baselineverwijzingen, onbruikbaar
  XER-bronarchief, dubbele id's hernummerd, relaties die niet meerekenen.
  De sleutel xerImportMissingPlannedStarts (PR #296) staat er al in.
- fileSlice: de bestandsmelding en de archiefmelding van een voorbeeld
  gaan door withOpenNoticeSticky; duplicateIdsRenamed en
  summaryRelationsDropped zijn sticky.
- Gids ref-meldingen (nl, en en 26 vertalingen) noemt de regel;
  docs-sources bijgewerkt.
- Tests: check-notifications S1-S8; browsertest toast-open-sticky (enum-
  terugval blijft staan, schone XER weg na 5 s; ontbrekende geplande start
  als fixme tot #296 op main staat). Fixtures in tests/browser/fixtures/xer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nozzit added a commit that referenced this pull request Oct 12, 2026
Twee teksten kwamen zonder `npm run i18n:add` binnen: de familie
`common:notifications.xerImportMissingPlannedStarts` (#296, van vóór de
vertaalstraat) en de nieuwe tekst van `task:duration.conversionNotExact`
(#319). Daardoor stond `en` in `translate status` als "zonder hash" en
"verouderd". Beide sleutels opnieuw gezet met `i18n:add --update` (nl + en,
tekst ongewijzigd): `en` is actueel. In de andere talen viel de oude hash
van `conversionNotExact` weg; de bestaande vertalingen blijven staan tot de
vertaalstraat ze bijwerkt (besluit B5).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Nozzit
Nozzit merged commit fec099a into main Oct 12, 2026
13 of 15 checks passed
Nozzit added a commit that referenced this pull request Oct 12, 2026
Nozzit added a commit that referenced this pull request Oct 12, 2026
…elaties of activiteiten

Afstemming #320 × #330: een relatie tussen projecten die niet als relatie is overgenomen
(p6xmlImportCrossProjectRelations) en een activiteit zonder project die niet is ingelezen
(p6xmlImportUnassignedActivities) laten data weg; volgens de regel van #320 blijft de
openingsmelding dan staan tot het kruisje. Losse baselineverwijzingen hergebruiken de al
blijvende xerImportDanglingBaselineReferences. Aantal projecten, lege projecten en gekoppelde
baselines veranderen niets en blijven dus na 5 s weg, zoals bij XER.

Commentaar over #296 bijgewerkt (staat nu op main). Gids ref-meldingen (nl, en) gelijkgetrokken
met de lijst. check-p6xml-open-notice: 6f/7b/8b2/8b3 (mutatie: de twee sleutels weg ⇒ 6f en 8b3 rood).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nozzit added a commit that referenced this pull request Oct 12, 2026
…XML-uitleg één keer

- toast-open-sticky.spec: test.fixme → test. #296 staat op main, dus de XER-lezer meldt een
  ontbrekende geplande start (xerImportMissingPlannedStarts) en de openingsmelding blijft staan.
- format-notice.spec: P6 XML met meerdere projecten (fixture p6xml-genest-meerdere-projecten)
  opent twee documenten en zet precies één keer een uitleg klaar (p6xml, met de baselinezin);
  een P6 XML zonder activiteiten geeft de foutmelding, geen document en geen uitleg.

Mutatiebewijs: uitleg vóór het lezen klaarzetten ⇒ de P6 XML-test rood; de sleutel
xerImportMissingPlannedStarts uit STICKY_OPEN_NOTICE_KEYS ⇒ de sticky-test rood.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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