04 — Fonctionnalités par importance (F-001…), pour une bibliothèque multiplateforme, multilangage, compatible web
Critères de classement, dans l'ordre : (1) ce qui bloque la crédibilité (preuve,
robustesse, performance) ; (2) ce qui bloque l'adoption (accessibilité depuis chaque
langage et plateforme, adaptateurs prêts à l'emploi) ; (3) ce que personne d'autre ne
couvre (normes universelles, profils nationaux, conventions d'industrie) ; (4) ce qui
fait un produit (visualiseurs, serveurs, intégrations) ; (5) ce qui fait une institution
(écosystème, normalisation, licence). Chaque fonctionnalité nomme sa spécification, son
oracle et son critère de sortie. Le statut vient de 01-baseline.md ; les lanes le
mettent à jour.
T0 — Crédibilité (Phase 0 ; rien d'autre ne tient sans elle)
| F | Fonctionnalité | Spécification | Oracle | Critère de sortie | Statut |
|---|---|---|---|---|---|
| F-001 | Extraction de texte alignée sur la majorité de trois oracles (16 écarts nommés : Type 3 sans ToUnicode, ToUnicode des CID CFF, texte peint deux fois, lignes de sous-couche/surcouche, césure, colonnes) ; les références à mauvaise génération = null (§7.3.10) ; /Count borne les feuilles (§7.7.3.2) |
ISO 32000-2 §9.10, §7.3.10, §7.7.3 | pdftotext, mutool, pdf.js (oracle_pdfjs.rs, external_corpora.rs, oracle_text.rs) |
les rapports ≥0,9 montent sur les trois, 0 régression | ⏸ lane AC (commit a6b7d93 + 4 fichiers non commités) |
| F-002 | Modificateur de document (§6.3.3) : insertion/suppression/réordonnancement/rotation de pages, fusion/scission, édition de boîtes, ajout/suppression d'annotation, remplissage/aplatissement de formulaire, édition des métadonnées/signets/pièces jointes/étiquettes de page ; incrémental par défaut, réécriture complète sur demande ; contenu inconnu préservé ; signatures intactes sous mise à jour incrémentale | ISO 32000-2 §6.3.3, §7.5.6, §12.7 | qpdf --pages/--rotate/--split-pages/--flatten-annotations, pdfcpu, mutool merge, pdftk, pyHanko validate ; qpdf --json avant/après sur 200 fichiers |
conformance-processors, prepress-boxes implémentées |
⏸ lane AE (~/wt/ae : edit.rs ×2, edit_oracle.rs) |
| F-003 | PDF/A : 0 désaccord avec veraPDF sur ses corpus 1b/2b/3b/4/4e/4f + Isartor ; corpus réel 3b/4 passé ; chaque désaccord résiduel classé (apdf / veraPDF / fichier cassé) avec la ligne source de veraPDF citée | ISO 19005-1..4 (aperçus), profils + sources veraPDF | veraPDF 1.30.2, fontTools comme troisième témoin sur les règles de police | pdfa-2/3/4 implémentées ou résidus nommés |
⏸ lane AF (4 worktrees) |
| F-004 | Harnais de performance : bancs criterion par crate + tests/tools/bench_corpus.sh sur ~50 fichiers représentatifs (ouverture/texte/rendu) face à qpdf, pdftotext, mutool, pdftoppm, pdf.js, avec temps mur et RSS maximale ; profiler les 20 pires rapports ; optimiser chaque étage (codec, filtre, analyse/xref, police, contenu, rendu, écriture) ; cibles ≤2× l'ouverture de qpdf, ≤2× pdftotext, ≤3× le rendu de mutool, ou l'écart expliqué |
— | /usr/bin/time -v, perf, criterion |
docs/PERFORMANCE.md, ADR-benchmarks, avant/après par point chaud, tests d'oracle inchangés |
⏸ lane AG (scripts ~/wt-AG, ~/bench-AG) |
| F-005 | Fuzzing guidé par la couverture : 23 cibles (lexeur, objet, xref, chaque filtre y compris les ponts DCT/JBIG2/JPX/Brotli, sfnt/CFF/Type1/CMap, interpréteur de contenu, Document::load, gestionnaire de sécurité standard, XML XMP, XFA, check_a, rendu de page), ASan sur parse/filter/font, ≥30 min chacune, ≤8 workers au total ; plantages minimisés, dédoublonnés, corrigés avec des régressions déterministes ; tests de limites structurelles (imbrication, cycles, nombres énormes) |
limites de l'annexe C d'ISO 32000-1 | libFuzzer, cargo-fuzz, graines UNSAFE-DOCS | docs/FUZZING.md, docs/LIMITES.md (nos limites face à l'annexe C et à qpdf/mupdf/pdf.js), 0 plantage ouvert |
⏸ lane AH (graines ~/fuzz-AH) |
| F-006 | Export/import FDF/XFDF (champs + annotations), /AF complet (propriétaires : XObject, contenu marqué, DPart, page, annotation, StructElem ; exposition CLI ; /EP charge chiffrée), lecture/écriture de PDF Declarations, 11 écarts du Nutshell PDF/X dans check/x |
§12.7.8, XFDF 3.0 + XSD, AN002, PDF Declarations, aperçus 15930 | pdftk, xmllint, qpdf --json, pdf.js, veraPDF 3b 6.8, Ghent 55/55 | lignes fdf, xfdf, pdf-declarations, associated-files, pdfx-* mises à jour |
⏸ lane AI |
| F-007 | Hygiène de l'arbre : cargo fmt en un seul commit quand aucune lane n'est active ; prove all vert ensuite ; worktrees et cibles cargo mortes supprimées ; branches amont fusionnées |
— | prove all |
porte verte au nouveau HEAD | 📋 P0-a/P0-b |
| F-008 | DCT tronqué peint jusqu'au préfixe décodé (comme poppler/mupdf), index des charstrings CFF construit une seule fois (perf), inflate en flux pour les images/flux d'objets | T.81, RFC 1951 | pdftoppm, mutool, zlib de CPython | PSNR sur bug_603518 ; mémoire sur de grandes images flate |
📋 (périmètre AG/AC) |
T1 — Accessibilité depuis n'importe où (Phase 1)
| F | Fonctionnalité | Spécification / outillage | Oracle / preuve | Critère de sortie |
|---|---|---|---|---|
| F-010 | ABI C stable apdf-capi : poignées opaques, codes d'erreur + messages en français, tampons possédés par la bibliothèque avec libération explicite, contrat de sûreté sur les fils d'exécution, apdf.h versionné en semver via cbindgen, fichier pkg-config |
cbindgen (ADR-bindings) | projet C neuf (tests cmocka) qui ouvre/rend/valide ; abi-checker entre versions |
une seule ABI pour toutes les liaisons |
| F-011 | Paquet Node & Bun @asklera/pdf via napi-rs : binaires précompilés par plateforme en optionalDependencies, types TypeScript, ESM+CJS, flux pour les grosses sorties, asynchrone par défaut (fils de travail) |
napi-rs (ADR) | projets Node 22 et Bun neufs ; test de fumée équivalent à pdf.js (pages/texte/rendu/formulaires) | publication npm à blanc + registre local |
| F-012 | WASM @asklera/pdf-wasm : wasm32 via wasm-bindgen pour les navigateurs (Web Workers, diffusion HTTP par plages des fichiers linéarisés, rendu par bandes sous la limite de 4 Go), composant WASI 0.2 pour Deno/Cloudflare/Fastly/wasmtime ; budget de taille ≤4 Mo compressé sans les polices/profils (chargés à la demande) |
wasm-bindgen, wit-bindgen (ADR) | page de fumée dans le navigateur rendant l'échantillon du corpus ; wasmtime run du composant WASI |
tables de taille et de parité |
| F-013 | Python asklera-pdf (PyO3/maturin) : wheels manylinux2014 x86_64/aarch64, macOS universel, Windows ; API familière aux utilisateurs de pypdf/pikepdf ; export NumPy des bitmaps |
maturin (ADR) | extraits de test pypdf/pikepdf portés ; contrôle de rendu façon pypdfium2 | wheels prêtes pour PyPI consommées par un venv neuf |
| F-014 | JVM (JNI ou Kotlin UniFFI ; Maven Central), .NET (UniFFI/csbindgen ; NuGet), Swift (UniFFI ; SwiftPM ; iOS/macOS), Kotlin/Android (AAR), Go (cgo), Ruby (magnus), PHP (ext-php-rs), Dart/Flutter (flutter_rust_bridge), Elixir (rustler), en-tête C++ au-dessus de l'ABI C | UniFFI et consorts (ADR-bindings) | un projet neuf par langage | matrice en CI |
| F-015 | Adaptateurs prêts à l'emploi : sous-ensemble FPDF_* de pdfium (document/page/rendu/texte/annot/formulaire) en bibliothèque partagée aux mêmes noms de symboles ; API façon poppler-glib pour les visualiseurs GNOME/KDE ; alias CLI aux drapeaux compatibles pour pdftotext, pdftoppm, pdfinfo, pdfimages, pdffonts, pdfsig, qpdf (verbes courants), verbes pdftk, table de parité cpdf ; docs/MIGRATION.md |
en-têtes publics de pdfium, doc poppler-glib | suite de test pypdfium2 pointée sur notre .so ; sorties de référence de poppler-utils sur le corpus |
l'adaptateur passe les tests de fumée amont |
| F-016 | Site de documentation (« MDN du PDF » clause par clause, utilisant nos tests comme exemples), CHANGELOG par crate, politique semver, matrice CI (Linux glibc/musl, macOS x86/arm, Windows, iOS, Android, wasm32, WASI), builds reproductibles | mdBook/Docusaurus (ADR si c'est une crate) | vérificateur de liens, doctests | site construit depuis HEAD |
| F-017 | Paquets système : tap Homebrew, AUR, Debian/Ubuntu (apdf-cli), winget, Chocolatey, image Docker Hub, flake nix |
— | test de fumée d'installation sur chacun | paquets publiés sur nos propres canaux (crates.io seulement après D-1) |
T2 — Différenciation : inspecteur, linter, forensique (Phase 2)
| F | Fonctionnalité | Spécification | Oracle | Critère de sortie |
|---|---|---|---|---|
| F-020 | Inspecteur : graphe d'objets (références partagées et cycliques), vues — physique (offsets, générations, xref, trailer), logique (catalogue → pages → ressources → contenu), structure balisée, opérateurs de contenu alignés sur les pixels rendus, polices, couleur, sécurité, signatures, DPart, XFA, 3D, /AF ; historique des révisions (chaque mise à jour incrémentale comme un commit : objets ajoutés/remplacés/libérés, ce que couvre chaque signature) |
§7.5, §7.5.6, §12.8 | qpdf --json, pdfresurrect, mutool show, pdfsig | apdf tree, apdf revisions avec contrôles négatifs |
| F-021 | Linter multi-normes : chaque ligne du registre + PDF/A/UA/X/VT/E/raster/Declarations/EA-PDF + profils d'industrie (spécification PDF eCTD, dépôt judiciaire, Factur-X, ZATCA, préréglages gouvernementaux), sévérité, clause citée, preuve d'oracle liée, correction suggérée ; sorties JSON, SARIF 2.1, HTML, PDF ; mode différentiel (depuis la révision n) | SARIF 2.1.0 (OASIS) | sarif-multitool validate, envoi à GitHub code scanning, veraPDF/callas en contrôle croisé |
apdf lint --profile <p> --sarif |
| F-022 | Langage de requête sur le graphe (apdf query) : sélection, projection, agrégation, export CSV/JSON ; utilisable pour des règles de linter personnalisées |
grammaire façon jq (la nôtre) | tests d'équivalence avec qpdf --json | 50 requêtes documentées |
| F-023 | Mode QDF (fichier normalisé éditable au format texte, offsets recalculés à la réécriture) et apdf json compatible avec qpdf --json=2 |
docs QDF/JSON de qpdf | qpdf --qdf, fix-qdf |
aller-retour identique octet à octet là où qpdf l'est |
| F-024 | Diff : structurel (objets), textuel (mots), visuel (pixels par page, boîtes de changement), diff de révision ; côte à côte en HTML | — | Draftable/pdftk/pdftoppm comme témoins | apdf diff sur 100 paires |
| F-025 | Forensique et assainissement : JS/actions extraits (jamais exécutés), objets orphelins/cachés, calques cachés, texte blanc/hors page, pièces jointes, incohérences xref/révision, indicateurs compatibles YARA ; apdf scrub (données cachées, métadonnées, connaissance des étiquettes MIP) et apdf scrub --rebuild = CDR par construction (régénérer le fichier depuis le modèle validé) ; rapport de durcissement rejouant PDFex, les Shadow Attacks, l'habillage de signature, les attaques de décodeur JBIG2/JPX |
guide d'assainissement de la NSA, NCSC, PoC de pdf-insecurity.org | témoins peepdf/pdfid ; les PoC publiés doivent échouer face à nous | docs/HARDENING.md avec chaque classe et son test |
| F-026 | GUI (egui, puis WASM) : arbre + rendu + linter côte à côte, mise en évidence objet ↔ pixel, oracles en direct si installés | — | manuel + captures d'écran + test de fumée WASM | builds bureau et web |
| F-027 | Extension VS Code (inspecteur + linter), action GitHub apdf-lint (envoi SARIF), hook pre-commit, extension de navigateur (MV3) |
— | action exécutée sur ce dépôt | publiés sur les places de marché que nous contrôlons |
T3 — Création et confiance (Phase 3)
| F | Fonctionnalité | Spécification | Oracle | Critère de sortie |
|---|---|---|---|---|
| F-030 | Constructeur de document : texte façonné (façonnage OpenType — ADR : choix du moteur), césure (ADR), UAX #14/#29, CJK vertical, ruby, tableaux, listes, images, canevas vectoriel, SVG → vecteur PDF, Markdown → PDF, balisage automatique (PDF/UA-2 et PDF/A-4 par défaut), instanciation de police variable, aplatissement des polices couleur | 14496-22, UAX #9/#14/#29, MathML | hb-shape de HarfBuzz, sortie LuaTeX/pdfTeX, veraPDF UA-2/A-4, epubcheck pour l'aller-retour reflow |
la sortie du constructeur passe UA-2 et A-4 avec 0 constatation |
| F-031 | Hybrides de facturation électronique : Factur-X/ZUGFeRD 2.3 (tous niveaux de conformité), hybride XRechnung, PDF/A-3 + QR TLV de la phase 2 ZATCA, PDF/A-3 e-Tax thaïlandais, représentations PDF avec QR/codes-barres obligatoires (CFDI, DANFE, DIAN, SII PDF417, IRN JWT, ATCUD, KSeF, VERI*FACTU, TicketBAI, myDATA), génération UBL/CII EN 16931 | EN 16931, Factur-X 1.0.07, SDK ZATCA, spécifications nationales | Mustang, KoSIT, SDK ZATCA, validateurs SAT/SEFAZ/DIAN, Schematron Peppol | chaque profil : générer → valider à 100 % avec le validateur national ; contrôles négatifs |
| F-032 | Manifestes C2PA 2.4 dans le PDF : lecture, vérification (liste de confiance), écriture avec des exclusions data.hash compatibles avec PAdES |
C2PA 2.4 §PDF | c2patool |
aller-retour vérifié par c2patool |
| F-033 | PAdES post-quantique : ML-DSA (RFC 9882), SLH-DSA, ML-DSA+ECDSA/RSA composite (brouillons LAMPS), sélection de politique (--policy cnsa2|sogis|nist), via RUSSL (mesurer d'abord la disponibilité de russl-ml-dsa/russl-slh-dsa) |
RFC 9882, FIPS 204/205, ETSI TR 119 619 (brouillon) | OpenSSL 3.5, Bouncy Castle, liboqs ; pyHanko quand il le supportera | premier PDF signé PQ/hybride validé par deux piles indépendantes |
| F-034 | Confiance et signature à distance : trait de signataire externe (hachage → signature) avec adaptateurs PKCS#11, CNG, CryptoTokenKit, SKF (GM/T 0016), KMS cloud (AWS/Azure/GCP/Vault), API CSC 2.2, Aadhaar eSign, SingPass ; magasins de confiance LOTL/TSL UE (TS 119 612), AATL, ICP-Brasil, CCA India, JPKI, listes nationales ; DSS comme oracle de validation ; politiques de signature (PAdES-BR, manifestation Part 11, e-Apostille, dépôt judiciaire) ; concepteur de signature visible avec QR de vérification | ETSI EN 319 142/122/102, TS 119 612, CSC 2.2, DOC-ICP-15, 21 CFR 11 | DSS, pyHanko, SoftHSM2, OpenSC/pkcs11-tool, vérificateur ITI (BR), bacs à sable CSC |
chaque adaptateur prouvé face à un signataire réel ou de bac à sable ; DSS dit VALID |
| F-035 | Formulaires : concepteur (AcroForm, XFA statique), rendu XFA (SAP ADS/AEM/IRS/cerfa), sous-ensemble JavaScript de champ dans un bac à sable optionnel (calculer/formater/valider, AFDate/AFNumber…), catalogues de pré-remplissage cerfa/IRS/HMRC/Elster | §12.7, XFA 3.3, API JS Acrobat (sous-ensemble) | build XFA de pdfium, Acrobat (manuel), getFieldObjects de pdf.js |
100 formulaires publics réels remplis et rendus |
| F-036 | Couche carte à puce/jeton (générique d'abord) : transport PC/SC, découverte PKCS#15/IAS-ECC/EN 14890, modules de profil PIV/CAC, IAS-ECC (CPS = configuration), EstEID, BELPIC, DNIe, CNS/CIE, JPKI, carte OpenPGP, famille des cartes santé (HBA/SMC-B, UZI, TS-CNS, NHS) ; voie universelle PKCS#11 en premier ; adaptateurs CNG/CTK/SKF | ISO 7816-4/-15, SP 800-73-5, IAS-ECC 1.0.1, PKCS#11 3.1, GM/T 0016 | OpenSC (pkcs15-tool, pkcs11-tool), SoftHSM2, YubiKey PIV, cartes de test PIV du NIST, cartes de test éditeur |
signer un PAdES avec ≥5 familles de cartes par le même trait |
| F-037 | Écriture de TS 32004 (/AttachedToSig) et des déclarations /ISO_ 32001/32002 (russl-pades en amont), export/import EA-PDF, lecture/écriture PDF/raster, écriture PDF Declarations, conteneurs ASiC-E/S enveloppant des PDF (EN 319 162), XAdES pour les charges utiles XML |
TS 32004, EA-PDF 1.0, PDF/raster 1.0, EN 319 162 | pyHanko, validateur EA-PDF, libdigidocpp, DSS | lignes ts-32004, ea-pdf, pdfraster implémentées |
T4 — Verticales et conventions d'industrie (Phase 4)
| F | Fonctionnalité | Spécification | Oracle | Critère de sortie |
|---|---|---|---|---|
| F-040 | Santé : PDF/A-3 + /AF CDA/FHIR, empaquetage IHE XDS-SD, empaquetage/désempaquetage DICOM Encapsulated PDF/CDA, configurations de profil e-santé nationales (FR/DE/AT/CH/BE/NL/IT/ES/UK/US/AU/IN), profil PDF eCTD, manifestation 21 CFR Part 11 |
DICOM PS3.3/3.10, CDA R2, FHIR R5, ICH M2/M8, spécification PDF de la FDA | dcm4che, validateurs HL7, IHE Gazelle, critères de validation FDA | les profils passent leurs validateurs officiels |
| F-041 | Prépresse : préflight PDF/X à tous les niveaux (textes en attente de D-2), imposition, séparations de qualité RIP bit-exactes face à tiffsep, recouvrement, TAC/couverture d'encre, ton direct/CxF, trames, lecture JDF/XJDF, générateur VDP (données → DPart), importeurs AFP/XPS → PDF, PDF → PCL/PS 📋 |
ISO 15930/12647/16612, CIP4, GWG, ECMA-388, MO:DCA | gs, Ghent, Altona (🧭), essai callas, exemples Compart, xpstopdf de mupdf | Ghent 55/55, Cal Poly 12/12, imposition face aux exemples Preps |
| F-042 | Archivage : oracles JHOVE/DROID/Tika/VITAM, assistant de conversion PDF/A (polices, couleur, transparence, JS, chiffrement, pièces jointes), enregistrements de preuve (RFC 4998/6283, TR-ESOR), empaquetage SIP (SEDA 2.x, E-ARK CSIP, BagIt, METS/PREMIS), profils nationaux (NF Z42-013/020, TR-03138, GoBD, BS 10008, SInCRO, ENI, 電子帳簿保存法, NOM-151) | ceux listés | JHOVE, VITAM, commons-ip d'E-ARK, suite TR-ESOR |
rapport d'une conversion par lot de 1 M de fichiers |
| F-043 | Accessibilité : balisage automatique depuis la mise en page détectée, remédiation guidée dans l'arbre, simulateur d'ordre de lecture, correspondance WCAG/EN 301 549/Section 508 + générateur VPAT/ACR, reflow PDF → EPUB/HTML, export BRF/braille, DAISY, points d'ancrage de synthèse vocale MathML | 14289-2, WCAG 2.2, EN 301 549, ADA Title II, ACR 2.5 | veraPDF, PAC 2024, epubcheck, DAISY Pipeline |
la Reference Suite reste 16/16 ; la sortie du balisage automatique passe UA-2 |
| F-044 | Extraction structurée : tableaux, figures + légendes, blocs, Markdown/JSON avec provenance (page, bbox, chemin de structure), mesuré sur OmniDocBench/DocLayNet/PubTabNet | — | bancs d'essai, Docling/Marker comme lignes de base | scores publiés face aux lignes de base |
| F-045 | Juridique/défense : Bates, application du caviardage avec rapport de destruction, fichiers de chargement e-discovery, moteur de marquage et de liaison classification/CUI/STANAG 4774-4778, profils de dépôt judiciaire, e-Apostille, profils notariaux, PDF de preuve de piste d'audit | ceux listés | import Relativity, exemples STANAG 4778, exemples HCCH | profils validés sur des exemples réels |
| F-046 | Compression MRC (segmentation → masque JBIG2 + couches JPX), encodeur JBIG2 générique/symbole, taille/qualité face à Ghostscript/qpdf/LuraTech | T.88, T.800 | jbig2dec/OpenJPEG décodent notre sortie ; tables de taille | rapports de qualité LuraTech sur les corpus de scans, décodables par tous les visualiseurs |
| F-047 | Codes-barres et cachets numériques visibles : encoder (vecteur) et décoder (raster) QR/PDF417/DataMatrix/Aztec/Code128/GS1/EAN ; vérifier 2D-Doc/CEV, ICAO VDS/VDS-NC, DCC UE, SMART Health Cards, QR Aadhaar, TLV ZATCA, IRN JWT, QR-facture suisse, QR EPC, IATA BCBP, PDF417 AAMVA ; lecture/écriture GeoPDF (oracle GDAL) | ISO/IEC 18004/15438/16022/24778/15417, ICAO 9303-13, ISO/IEC 22376, 2D-Doc ANTS | ZXing/zbar, kit de test ANTS, vecteurs ICAO, GDAL | chaque profil : 100 % sur les jeux de test officiels |
T5 — Produits (Phase 5)
| F | Fonctionnalité | Oracle / preuve |
|---|---|---|
| F-050 | Visualiseurs : WASM (navigateur : rendu, recherche, signets, annotations, formulaires, signature côté client via WebCrypto/CSC, chargement progressif) et natif (egui : lecture, reflow, mode sombre, mesure/calques pour l'AEC, signature par carte à puce, synthèse vocale OS via l'ordre de lecture) | tables de parité pdf.js/mupdf.js ; accessibilité du visualiseur lui-même (WCAG) |
| F-051 | apdf-server : REST (OpenAPI 3.1), Docker/Kubernetes, file d'attente + webhooks, connecteurs CMIS/SharePoint/Box ; opérations : valider, convertir en PDF/A, signer, horodater, fusionner, extraire, rendre, linter (SARIF) | tests de contrat ; parité avec Gotenberg/Stirling |
| F-052 | SaaS pdf.asklera.fr (funnel grand public : fusionner/scinder/compresser/convertir/signer/valider) |
disponibilité + mesures de conversion |
| F-053 | Points d'ancrage OS/bureau : filtres CUPS (apdftoraster → PWG raster, apdftopdf), pilote impression-vers-PDF/A, IFilter Windows, QuickLook/Spotlight, vignettes, moteurs Evince/Okular, modules Office/LibreOffice, plugin Moodle |
tests cups-filters, contrôle de l'index de recherche Windows |
| F-054 | OCR (🧭 lier Tesseract sous ADR, ou construire) avec couche de texte invisible et pipeline MRC | parité avec OCRmyPDF |
| F-055 | Sous-ensemble CSS paginé HTML+CSS → PDF sur apdf-layout (🧭 D-9) |
rendus de référence WeasyPrint/Prince |
T6 — Écosystème et normalisation (Phase 6 ; à démarrer une fois T0 vert)
| F | Fonctionnalité | Preuve |
|---|---|---|
| F-060 | Observatoire PDF : tableau de bord public et reproductible des écarts mesurés chez poppler, mupdf, pdfium, pdf.js, qpdf, veraPDF, Ghostscript (fichier, clause, méthode) — jamais accusateur, toujours rejouable | méthodologie et scripts publiés |
| F-061 | Suite de conformité ouverte (« PDF Platform Tests ») : nos fixtures synthétiques et contrôles négatifs (jamais des corpus tiers), exécutable par n'importe quel moteur ; badge « apdf-verified » | la suite tourne sur ≥3 moteurs externes |
| F-062 | Préfixe d'extension développeur enregistré (ASKL) auprès de l'autorité d'enregistrement d'ISO 32000 ; extensions publiées dans le registre de la PDF Association (ex. métadonnées de signature PQ, proposition de filtre Zstandard, registre MIME typé pour /AF) |
entrées de registre |
| F-063 | Adhésions et normalisation : PDF Association, commission miroir AFNOR d'ISO/TC 171/SC 2, liaison ETSI ESI, CIP4, HL7 (au besoin) ; contributions d'errata (Arlington, PRC WD, TS 32005 face à veraPDF, vecteurs JBIG2) ; ateliers d'interopérabilité ; proposition d'un TS sur les signatures PQ dans le PDF | tickets soumis, rapports d'atelier |
| F-064 | Campagne SafeDocs : 8 M de fichiers lus sans panique, statistiques d'usage des fonctionnalités publiées ; UNSAFE-DOCS pour la robustesse | rapport avec les comptes |
| F-065 | Infrastructure de fuzzing continu (façon OSS-Fuzz, interne), programme « casser apdf » quand la diffusion le permet | tableau de bord |
| F-066 | 🧭 Modèle de diffusion (D-1) | — |
| F-067 | Présence sur les registres : crates.io (après D-1), npm, PyPI, Maven Central, NuGet, SwiftPM, Go, Packagist, pub.dev, Hex, Homebrew, AUR, Debian, winget, Docker Hub | paquets résolvables |