-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeature_list.json
More file actions
120 lines (120 loc) · 7.96 KB
/
Copy pathfeature_list.json
File metadata and controls
120 lines (120 loc) · 7.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
{
"$comment": [
"Source de verite machine de l'etat du projet.",
"Etats autorises: not_started | active | blocked | passing.",
"Une feature ne passe a 'passing' QUE si sa commande 'verification' s'execute avec succes.",
"Cette transition est irreversible: une feature 'passing' ne redevient jamais 'active'.",
"Si une regression casse une feature 'passing', on ouvre une NOUVELLE feature de correction.",
"Invariant: au plus une feature 'active' a la fois (WIP = 1)."
],
"project": "PixaBoost",
"goal": "Reconstruire une piece photographiee en GLB fidele, usage visualisation/catalogue.",
"features": [
{
"id": "F00",
"sprint": 0,
"behavior": "Le depot s'installe depuis zero et le gate CPU complet est vert en moins de 60 s, avec au moins un test qui s'execute reellement.",
"verification": "uv run poe setup && uv run poe check",
"state": "passing",
"evidence": "commit 63d40d7 — ruff OK, mypy strict OK (4 fichiers), pytest 2 passed, 1,07 s"
},
{
"id": "F01",
"sprint": 0,
"behavior": "docs/pixal3d-internals.md repond par oui ou non, preuves fichier:ligne a l'appui, a la question: le chemin multi-vues de Pixal3D est-il expose a l'utilisateur, et sous quelle signature ?",
"verification": "uv run pytest tests/unit/test_pixal3d_contract.py",
"state": "passing",
"evidence": "7 tests de contrat verts. Verdict: NON, le multi-vues est bloque par un assert (image_conditioned_proj.py:211). Voir docs/pixal3d-internals.md et ADR-0005.",
"note": "Inconnue n°1 levee. F10 devient une implementation, pas un wrapper."
},
{
"id": "F02",
"sprint": 0,
"behavior": "core/geometry.py fournit Sim3 (composition, inverse, application), intrinseques camera, projection et back-projection, valides contre des identites analytiques.",
"verification": "uv run pytest tests/unit/test_geometry.py",
"state": "passing",
"evidence": "commit F02 — 20 tests analytiques verts. Sim3 (compose/inverse/matrice), camera Blender, projection/back-projection inversibles, grille canonique.",
"note": "Convention Blender de F01 implementee: camera selon -Z, capteur 32 mm, focale 16/tan(fov/2)."
},
{
"id": "F03",
"sprint": 0,
"behavior": "core/metrics.py et core/render.py fournissent IoU de silhouette, F-score@tau, Chamfer bidirectionnel et rendu offscreen de vues held-out, valides contre des verites terrain analytiques.",
"verification": "uv run pytest tests/unit/test_metrics.py tests/unit/test_render.py",
"state": "passing",
"evidence": "commit F03 — 34 tests analytiques verts. Rasteriseur numpy pur (z-buffer perspective-correct), silhouette IoU, Chamfer, F-score, echantillonnage de surface pondere par l'aire.",
"note": "LPIPS deliberement absent de core/ (torch + telechargement de poids), voir ADR-0003."
},
{
"id": "F04",
"sprint": 0,
"behavior": "Un test architectural echoue si un module de core/ importe torch, ouvre une socket, ou touche au GPU.",
"verification": "uv run pytest tests/unit/test_architecture.py",
"state": "passing",
"evidence": "commit F04 — 24 tests verts. Detection statique (ast), donc les imports paresseux en corps de fonction sont couverts. Garde-fou verifie par injection d'une violation reelle dans core/: les 3 detecteurs se declenchent.",
"note": "Couvre aussi le sens des dependances (core/ n'importe pas backends/) et l'absence d'alea global implicite."
},
{
"id": "F05",
"sprint": 0,
"behavior": "Le benchmark synthetique rend des meshes CAO en 6 azimuts x 3 elevations (+45, 0, -45 deg), soit 18 vues, et produit pour chaque objet: images, masques, poses GT, intrinseques GT et mesh GT.",
"verification": "uv run poe bench-build && uv run pytest tests/integration/test_benchmark.py",
"state": "passing",
"evidence": "commit F05 — bench-build ecrit 3 pieces x 18 vues en 512 en 5,1 s; 34 tests (shapes/rig/integration) verts. Le re-rendu du mesh stocke avec la pose stockee reproduit exactement le masque stocke.",
"note": "Geometrie de prise de vue identique aux photos reelles: 6 azimuts x 3 elevations (+45/0/-45). az000_el+00 reproduit la camera canonique de Pixal3D."
},
{
"id": "F06",
"sprint": 0,
"behavior": "L'image Docker GPU (TRELLIS.2 + NATTEN + utils3d + Pixal3D) est construite par GitHub Actions et poussee sur GHCR.",
"verification": "Le run gpu-image le plus recent a conclusion == success, et le manifeste de ghcr.io/pemcode/pixalboost:gpu-latest est recuperable depuis le registre",
"state": "passing",
"evidence": "Run 31192502560 conclusion=success. Manifeste OCI recuperable anonymement depuis ghcr.io/pemcode/pixalboost: 18 couches, 6,24 Go compresses. Tags publies: gpu-latest et gpu-5ff20035eaf792065672078c19fc96f88de0c2f5.",
"note": "docker n'est pas installe en local, donc la verification porte sur le manifeste publie plutot que sur un docker pull. Trois runs: echec 1 = GHCR refuse les majuscules du login, echec 2 = bug dans notre propre verification d'imports (importlib.util), succes au 3e."
},
{
"id": "F07",
"sprint": 0,
"behavior": "Une image envoyee a un pod RunPod revient sous forme de GLB valide, mis en cache dans artifacts/ et non regenere au second appel.",
"verification": "RUNPOD_ENDPOINT_ID=<id> uv run pytest tests/e2e/test_smoke_single_view.py -m gpu",
"state": "blocked",
"evidence": null,
"blocked_on": "Aucun endpoint RunPod deploye. Necessite: F06 passing, un network volume pour les ~26 Go de poids, et l'accord de l'utilisateur sur la depense GPU.",
"note": "Le code est ecrit et couvert par 40 tests CPU (cache, client, adaptateur). Seule la verification reelle manque, donc la feature n'est pas faite."
},
{
"id": "F10",
"sprint": 1,
"behavior": "N images plus leurs poses produisent un GLB unique. Implique de sous-classer ProjGrid pour lever l'assert sur transform_matrix, recuperer valid_mask, et faire une moyenne masquee par voxel sur N vues. Inclut la variante de repli (une vue conditionne, les autres recalent).",
"verification": "uv run pytest tests/e2e/test_multiview.py -m gpu",
"state": "not_started",
"evidence": null,
"note": "Portee revue apres F01: implementation, pas wrapper. Risque OOD sur le checkpoint, voir ADR-0005."
},
{
"id": "F11",
"sprint": 1,
"behavior": "Un score de confiance de recalage est calcule, et une pose sous le seuil provoque un refus explicite plutot qu'une reconstruction degradee.",
"verification": "uv run pytest tests/unit/test_registration.py",
"state": "passing",
"evidence": "commit F11 — 25 tests verts. Umeyama closed-form, ICP tronque avec pre-alignement grossier, score de confiance = inliers x qualite x distinctness, refus par exception sous le seuil. Bague a symetrie d'ordre 12: rmse 1,3e-16 et 100% d'inliers, pourtant refusee (distinctness 0,018).",
"note": "Deux mesures actees en ADR-0006 et ADR-0007. Le bassin de convergence de l'ICP (~20 deg) dimensionne le nombre de redemarrages et conditionne la strategie d'initialisation de F10."
{
"id": "F12",
"sprint": 1,
"behavior": "Un tableau chiffre compare B0 (meilleure vue seule) et B1 (multi-vues natif) sur le benchmark, avec metriques P1/P2 et planche de rendus comparatifs.",
"verification": "uv run poe bench-compare",
"state": "not_started",
"evidence": null
},
{
"id": "F13",
"sprint": 1,
"behavior": "GATE DE DECISION. Une ADR dans DECISIONS.md statue: B1 passe la barre catalogue (-> Sprint 3), ou B1 echoue avec un diagnostic d'erreur qui dit si le Sprint 2 est pertinent.",
"verification": "Presence d'une ADR 'F13' dans DECISIONS.md citant runs/<ts>/metrics.json",
"state": "not_started",
"evidence": null,
"note": "Aucune feature de Sprint 2 ne peut passer a 'active' avant que F13 soit 'passing'."
}
]
}