Major restructure:
- Remove Paper feature entirely (IPaperSurface, PaperSurface, PaperSurfaceModule).
Paper is just RectTransforms in the ColorBook scene, exposed via a
ColorBookSceneRefs MonoBehaviour the scope registers as a singleton.
- Simplify IGalleryService to a single SaveToDeviceAsync(byte[], albumName)
shim over a native gallery plugin. Drop ListAsync / LoadFullAsync /
LoadThumbnailAsync / DeleteAsync / GetLatestThumbnailAsync /
SavedArtworkDTO / sidecar JSON / persistentDataPath gallery folder.
- Drop ArtBook feature (no in-app gallery — users view captures in phone
Photos). Removes ArtBookLifetimeScope, GalleryPresenter, IExternalShareService.
- Replace ArtworkCapturedSignal / ArtworkSavedSignal with PaperCapturedSignal /
PaperSavedSignal (templateId only).
- Capture and Gallery are now independent: ICaptureService produces PNG bytes,
IGalleryService writes them to native Photos. CaptureController orchestrates
the chain.
- Rewrite §11 Persistence — only ProtectedPlayerPrefs for settings/progression;
no app-side image store.
- Remove §28 SavedArtwork JSON Schema; replace with §28 Native Gallery
Integration (plugin recommendations, permission flows).
- Add §31b: Scripts Inventory by Domain — comprehensive path-by-path table
of every script (existing and planned) across Core / Libs / Services /
Features / App, with status markers.
- Update Readme.docx — better formatting (page break before each numbered
section, blue heading underlines, alternating row shading on tables,
monospace code blocks with left accent bar, expanded title page).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Drop ShapePieceDTO struct; introduce ShapeSO (created via Assets > Create
> Darkmatter > Drawing > Shape). Sprite, snap radii, default size all on
the SO. Slot pose lives on SlotMarker's RectTransform per drawing.
- IDrawingTemplate.Pieces is now IReadOnlyList<ShapeSO> — shapes reusable
across drawings; per-drawing layout authored in a Drawing.prefab of
SlotMarkers.
- ShapePieceUI is one prefab with [SerializeField] ShapeSO _shape;
Assign(shape) at spawn refreshes Image.sprite + RectTransform.sizeDelta
+ derives PieceId from _shape.Id. Matching is by ShapeSO reference
equality, not string id.
- Update content layout: Content/Gameplay/Shapes/, Drawings/<id>/Drawing.prefab,
Prefabs/ShapePiece.prefab.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>