# VIXHUB — REPO-FIRST AUDIT REPORT ### Mapa Zasobów i Matryca Reużycia dla platformy Vixhub (pilot: Vilmax) **Audytor:** Principal System Architect & Lead Auditor **Data:** 2026-08-25 **Zakres:** Konto GitHub `DamianMalenta` (10 repozytoriów) + dokument bazowy `Vixplan.md` **Protokół:** Repo-First Policy (§II Vixplan) — identyfikacja gotowych komponentów przed pisaniem od zera --- ## 0. STRESZCZENIE WYKONAWCZE (TL;DR) Konto `DamianMalenta` zawiera **dojrzały ekosystem kodu** o wysokiej reużywalności dla Vixhub, ale **żadne repozytorium nie jest systemem meblowym** — wszystkie są z innych branż (POS restauracyjny, dywany, kebab/AI video, magazyn restauracyjny). Reużycie polega na **ekstrakcji silników i wzorców architektonicznych**, nie na forkowaniu całych repozytoriów. **Top 5 komponentów do natychmiastowego ponownego użycia:** | # | Komponent | Repo | Funkcja w Vixhub | Gotowość | |---|-----------|------|-----------------|----------| | 1 | `core/Integrations/*` (BaseAdapter + AdapterRegistry + IntegrationDispatcher) | slicehub_pro | Wzorzec adaptera BaseLinker (REST, retry, backoff, DLQ, CredentialVault) | **WYSOKA** — wymaga napisania `BaseLinkerAdapter` | | 2 | `src/baselinker.js` + `src/baselinkerImages.js` | dywanowy-bazar | Gotowy klient `addInventoryProduct` z mapowaniem pól, SKU ASCII, tagami | **WYSOKA** — JS→PHP port lub bezpośrednie użycie | | 3 | `core/AssetResolver.php` + `core/SceneResolver.php` + migracje 021/022 | slicehub_pro | Cyfrowa Biblioteka Tkanin + Scene Kit (asset hub, n:m links, role) | **WYSOKA** — schema reużywalna 1:1 | | 4 | `src/badgeRenderer.js` + `src/badgePlanner.js` + `config/badge-policy.json` | dywanowy-bazar | Macro Visual Studio — nakładanie badge'ów (Easy Clean, Martindale) na zdjęcia | **WYSOKA** — Sharp + SVG composite, gotowe | | 5 | `core/PromisedTimeEngine.php` + `core/SlaThresholds.php` | slicehub_pro | Dynamiczny czas realizacji Make-to-Order (zamiast hardcodowanego "48h") | **WYSOKA** — wzorzec kalkulatora z load-factor | **Krytyczne braki (do napisania od zera):** Ekstraktor danych ze strony francuskiej, AI Texture-Swap (cyfrowe ubieranie mebla w tkaniny), Virtual Staging (osadzanie w wnętrzach), PDF A4 Catalog Engine, integracja PayPo/Ratami 0%, WooCommerce D2C. --- ## 1. INWENTARZ ISTNIEJĄCYCH MODUŁÓW W REPOZYTORIUM `damianmalenta` ### 1.1 `slicehub_pro` (PHP, public, 716 plików, push 2026-08-25) **Charakter:** Multi-tenant Modular Monolith POS/restaurant management (SliceHub Enterprise OS). Stack: PHP 8.3 (no framework, no Composer), MariaDB 10.11, Apache, Vanilla JS + Tailwind CDN. **Zero Node.js w runtime, zero Redis, zero Docker** (potwierdzone w `AGENTS.md` §14). **Architektura:** Modular Monolith z prefix-based logical DDD silos (`sh_` / `sys_` / `wh_`) w jednej bazie. Multi-tenancy = Row-Level Security na `tenant_id`. Async = **SQL Transactional Outbox** (`sh_event_outbox` + CLI workers z PID-file locks), NIE message broker. #### 1.1.1 `core/` — Silniki domenowe (55 klas PHP) | Plik | Funkcja (z odczytu kodu) | Reużyteczność dla Vixhub | |------|------------------------|--------------------------| | `AsciiKeyEngine.php` | Transliteracja PL→ASCII (ą→a, ł→l) + collision detection dla kluczy technicznych. `transliterate()` pure, `generate()` z DB check. | **WYSOKA** — bezpośrednio dla rygoru ASCII SKU mebli | | `Uuid.php` | UUID v4 (CSPRNG `random_bytes`) + deterministic v5-like (sha1 seed). Zastąpił 14 kopii algorytmu. | **WYSOKA** — prymityw infrastrukturalny | | `Money.php` | Arytmetyka pieniądza w groszach (int minor), `fromPln()` HALF_UP, `formatMinor()`, sanity cap 1M PLN. | **WYSOKA** — ceny mebli | | `Units.php` | Normalizacja jednostek miar | ŚREDNIA | | `AssetResolver.php` | SSOT dla URL-i obrazków. 2-stopniowy resolver: `sh_asset_links` (canonical m021) → legacy `image_url`. Batch hero URLs, `injectHeros()` post-processor. | **WYSOKA** — biblioteka tkanin/assetów meblowych | | `SceneResolver.php` | SSOT dla wizualnego kontraktu. Hierarchia: `sh_atelier_scenes.spec_json` → `sh_visual_layers` → `sh_asset_links` → `sh_menu_items.image_url`. Scene Kit assets, modifier visuals, style presets. | **WYSOKA** — Visual Studio mebli | | `CredentialVault.php` | Transparent encryption-at-rest (libsodium XChaCha20-Poly1305), format `vault:v1:`, backward-compat plaintext. | **WYSOKA** — token BaseLinkera, klucze API | | `JwtProvider.php` | JWT generowanie/weryfikacja | ŚREDNIA | | `AuthEngine.php` / `AuthGuard.php` / `GatewayAuth.php` / `auth_guard.php` | Auth: PIN kiosk + system login, JWT, gateway rate-limit (in-DB, nie Redis) | ŚREDNIA | | `OrderEventPublisher.php` | Transactional outbox publisher. Eventy lifecycle: `order.created/accepted/preparing/...`. Idempotency key, snapshot payload. | **WYSOKA** — wzorzec dla eventów produktowych | | `WebhookDispatcher.php` | Generic HTTP push do `sh_webhook_endpoints` (Slack/Zapier). Drains `sh_event_outbox`. | **WYSOKA** — webhooki BaseLinker/Allegro | | `OrderStateMachine.php` | Status transitions z whitelistą | ŚREDNIA | | `PromisedTimeEngine.php` | Stateless kalkulator `promised_time`. ASAP = base_prep × load_factor + channel_buffer. Scheduled = lead-time gate + business-hours gate. **Hardcoded `TIMEZONE='Europe/Warsaw'`, `CHANNEL_BUFFERS`, `DEFAULT_BASE_PREP=25`** | **WYSOKA** — wzorzec dla dynamicznego czasu Make-to-Order | | `SlaThresholds.php` | Progi SLA (green/yellow/red) | ŚREDNIA | | `SequenceEngine.php` | Generowanie sekwencji (np. nr paragonu) | NISKA | | `DomainError.php` | Bazowa klasa błędów domenowych | ŚREDNIA | | `db_config.php` | Env-driven DB config (`getenv('SLICEHUB_DB_*')`), fallback XAMPP. `date_default_timezone_set('Europe/Warsaw')` globalnie. | **WYSOKA** — wzorzec config | | `SettlementEngine.php` / `PayrollEngine.php` / `PayrollLedger.php` / `TeamPayrollEngine.php` / `AdvanceEngine.php` / `PayrollAllocator.php` | HR/payroll — księga append-only, zaliczki | NISKA (HR-restaurant) | | `FoodCostEngine.php` / `MealEngine.php` / `MenuVisibilityFilter.php` / `PackSizeExtractor.php` / `KorEngine.php` / `MmEngine.php` / `PzEngine.php` / `WzEngine.php` / `InwEngine.php` / `AutoScanEngine.php` | Restaurant-specific (food cost, meals, PZ/WZ/KOR documents) | NISKA | | `DriverFleetHelper.php` / `StaffFleetPresence.php` / `Geocoder.php` | Driver/logistyka restauracyjna | NISKA | | `HrClockEngine.php` / `HrRoles.php` / `HrSessionGate.php` | HR clock-in/out | NISKA | | `KdsAcceptRouting.php` / `PanicEngine.php` / `OrderReopenEngine.php` | KDS/POS restaurant | NISKA | | `InvoiceLineQtyNormalizer.php` / `CustomerContactRepository.php` / `SettingsPingLib.php` / `WarehouseConsumeHook.php` / `WarehouseReverseHook.php` | Misc helpers | NISKA | #### 1.1.2 `core/Integrations/` — **Wzorzec Adaptera 3rd-party (KLUCZOWE)** | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `BaseAdapter.php` | Abstract kontrakt: `buildRequest()`, `parseResponse()`, `parseInboundCallback()`, `supportsEvent()`. Bezstanowy, credentials przez CredentialVault, retry/backoff w DB. | **WYSOKA** — bazowa klasa dla `BaseLinkerAdapter` | | `AdapterRegistry.php` | Mapa `provider_key → class`. `resolveForTenant()` ładunki aktywne integracje, cache per-tenant. `registerProvider()` runtime. | **WYSOKA** — rejestracja BaseLinkera | | `IntegrationDispatcher.php` | Konsument outbox dla adapterów. Exponential backoff (30s→86400s, 7 stopni), DLQ, `sh_integration_deliveries` + `sh_integration_attempts` audit. cURL transport injectable. | **WYSOKA** — dispatcher dla BaseLinkera | | `PapuAdapter.php` / `DotykackaAdapter.php` / `GastroSoftAdapter.php` / `ElzabAdapter.php` / `ChoiceQRAdapter.php` | Konkretne adaptery POS/delivery/QR | ŚREDNIA — jako wzorce implementacji | #### 1.1.3 `core/Ksef/` — **Wzorzec klienta REST API (KLUCZOWE)** | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `Client.php` | KSeF API v2 klient: challenge → RSA-OAEP → /auth/ksef-token → poll → JWT. Token refresh, retry, mock mode, stronicowanie (max 100×250). | **WYSOKA** — wzorzec dla klienta BaseLinker REST (auth, retry, paging) | | `Parser.php` / `InboxImport.php` / `InboxInvoiceRepository.php` / `InboxQtyNormalize.php` | Parsowanie XML faktur, import inbox | NISKA | #### 1.1.4 `core/Notifications/` — System powiadomień | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `ChannelInterface.php` / `ChannelRegistry.php` / `NotificationDispatcher.php` | Multi-channel notifications (InApp via `sh_sse_broadcast` table, nie Redis pub/sub) | ŚREDNIA | | `TemplateRenderer.php` / `SmartReplyEngine.php` / `DeliveryResult.php` | Szablony, smart reply | ŚREDNIA | | `Channels/InAppChannel.php` | SSE broadcast (wspomina Redis w komentarzu, ale używa tabeli) | NISKA | #### 1.1.5 `api/` — Endpointy REST (22 moduły) Najbardziej relevantne dla Vixhub: - `api/visual_composer/asset_upload.php` — upload assetów wizualnych - `api/online_studio/engine.php` + `library_upload.php` — Online Studio + biblioteka assetów - `api/studio/generate_key.php` — generowanie kluczy (ascii_key) - `api/assets/engine.php` — asset engine - `api/marketing/deck_engine.php` + `engine.php` — marketing deck (PDF/print) - `api/settings/engine.php` — panel ustawień (tu hardcoding czasów — patrz §4) - `api/warehouse/*` — magazyn (add_item, approve, avco, batch, correction, inventory, mapping, receipt, transfer) — wzorzec dla PIM Reszta (pos, orders, kds, tables, cart, bi, ksef, procurement, hr, driver) — restaurant-specific, niska reużyteczność. #### 1.1.6 `database/migrations/` — 69 migracji SQL (001-069) **Reużywalne schema dla Vixhub:** | Migracja | Tabele | Reużyteczność | |----------|--------|---------------| | `021_unified_asset_library.sql` | `sh_assets` (kanoniczny rejestr plików: ascii_key, storage_url, mime, width/height, checksum, role_hint, category, sub_type, z_order, variant_of, metadata_json, soft-delete) + `sh_asset_links` (n:m entity↔asset z rolą: hero/layer/product_shot/surface_bg/icon/logo) | **WYSOKA** — bezpośrednio dla Cyfrowej Biblioteki Tkanin (entity_type='fabric', role='texture_1x1') | | `022_scene_kit.sql` | `sh_scene_templates` (szablony scenografii: stage_preset, composition_schema, cameras, LUTs, atmospheric, photographer_brief, pipeline_preset) + `sh_style_presets` (style wizualne: palette, font, motion, LUT) + `sh_category_styles` + `sh_scene_triggers` + `sh_scene_variants` + `sh_ai_jobs` (queue: style_transform/background_remove/enhance/generate_variant) + `sh_promotions` + `sh_scene_promotion_slots` | **WYSOKA** — AI Visual Studio (Texture-Swap, Virtual Staging) + AI Job Queue | | `012_visual_layers.sql` | `sh_visual_layers` (warstwy kompozycji: cal_scale, cal_rotate, offset_x/y, z_index, is_base) | ŚREDNIA — zastąpione przez m021/022 | | `014_global_assets.sql` | `sh_global_assets` (legacy biblioteka) | NISKA — superseded by m021 | | `016_visual_compositor_upgrade.sql` | Compositor upgrade | ŚREDNIA | | `026_event_system.sql` | `sh_event_outbox` (transactional outbox) | **WYSOKA** — event system dla Vixhub | | `027_gateway_v2.sql` | Gateway rate-limit (in-DB, nie Redis — wzmianka o Redis w komentarzu) | ŚREDNIA | | `028_integration_deliveries.sql` | `sh_integration_deliveries` + `sh_integration_attempts` | **WYSOKA** — audit dostaw BaseLinkera | | `033_notification_director.sql` | Notification director (wzmianka Redis w komentarzach, ale InAppChannel używa tabeli) | ŚREDNIA | | `031_baked_variants.sql` | Baked variants (pre-rendered) | ŚREDNIA — dla baked texture variants | | `032_asset_library_organizer.sql` | Organizer biblioteki | ŚREDNIA | | `036_asset_display_name.sql` | Display name dla assetów | NISKA | #### 1.1.7 `scripts/` — Worker CLI + seedery | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `worker_webhooks.php` / `worker_integrations.php` / `worker_notifications.php` / `worker_driver_fanout.php` / `worker_payroll_accrual.php` / `worker_ksef_inbox.php` / `worker_integration_health_ping.php` | CLI workers drain outbox (cron/`--loop`, PID-file locks, atomic row claim) | **WYSOKA** — wzorzec worker dla BaseLinkera | | `bootstrap_vault.php` / `rotate_credentials_to_vault.php` | Vault setup + rotacja plaintext→vault | **WYSOKA** | | `apply_migrations_chain.php` / `setup_database.php` / `seed_demo_all.php` | DB setup/seed | ŚREDNIA | | `smart_importer.php` / `bulk_import_zdjecia.php` / `migrate_parent_sku_to_variants.php` | Importery | ŚREDNIA | #### 1.1.8 `modules/` — Frontend (18 modułów HTML/JS) Reużyteczność niska (restaurant-specific UI: pos, kds, waiter, driver_app, kiosk, tables, hub, online, online_studio, studio, marketing, bi, courses, inbox, procurement, settings, warehouse, backoffice). Wzorzec `ui_shell` + `core/js/sh_api_base.js` (SSOT API base) — **ŚREDNIA**. --- ### 1.2 `dywanowy-bazar` (JavaScript, private, 189 plików, push 2026-07-03) **Charakter:** "Tara Carpet → BaseLinker automation tool". Node.js ≥20, ESM, `sharp ^0.33.5` (jedyna runtime dep). Server `http.js` na :8787. **Zero tenant_id, zero Redis, zero framework** — single-tenant. #### 1.2.1 `src/` — Silniki (KLUCZOWE dla BaseLinker + Macro Studio) | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `baselinker.js` | **Gotowy klient BaseLinker API**: `buildBaseLinkerEnvelope()` (addInventoryProduct: sku, ean, tax_rate, category_id, weight/height/width/length, text_fields, stock, prices, images, tags), `sendToBaseLinker()` (dry-run + live), `baseLinkerRequest()` (URLSearchParams form, fetch, JSON parse, error handling), `filterEnvelopeTagsToInventory()` (getInventoryTags whitelist), `isBaseLinkerApiError()`. `ensureAsciiSku()` z `utils.js`. | **WYSOKA** — bezpośrednio dla modułu BaseLinker Integration Adapter | | `baselinkerImages.js` | `buildPayloadImagesObject()` + `assertBaseLinkerImagesPreflight()` — mapowanie obrazów do payload BL | **WYSOKA** | | `baselinkerFeatureCanonical.js` | `dedupeSpecsPlRows()`, `ensureDimensionalCmFeatures()`, `isExcludedFromFeaturesPayload()` — canonical features | **WYSOKA** — cechy mebli (wymiary, Martindale) | | `badgeRenderer.js` | **Sharp + SVG composite** — nakładanie etykiet/badge'ów na zdjęcia. `renderBadgeForImageSource()`: load buffer (data URL/fetch) → sharp.metadata() → buildPremiumPillSvg() → composite → jpeg. | **WYSOKA** — Macro Visual Studio (badge Easy Clean, Martindale, Pet Friendly) | | `badgePlanner.js` | Planowanie badge'ów: `loadBadgePolicy()` (maxHeadlineChars, forbiddenPatterns, diversityGuards), `loadBadgeLayoutPolicy()` (positions, variants), `seededPrng()` (deterministic). | **WYSOKA** — polityka badge'ów certyfikatów | | `bazaarCardRenderer.js` / `bazaarCardTemplates.js` / `bazaarPillarIcons.js` / `premiumPillRenderer.js` | Renderery kart/badge'ów (Sharp) | **WYSOKA** | | `collageComposer.js` | `composeCollageJpegFromUrls()` — kompozycja kolażu z URL-i (Sharp) | **WYSOKA** — galerie mebli | | `descriptionAssembly.js` | `assembleDescriptionTextFields()` — assembly opisów HTML z bloków kanałów | **WYSOKA** — AI Copywriting HTML Builder | | `channelBodySanitizer.js` / `olxBodyPolicy.js` / `olxDescriptionPostprocess.js` / `olxNarrative.js` / `pileCopyPolicy.js` / `polishCopyTweaks.js` / `dePlCopySanitizer.js` / `baseCopyPostprocess.js` | Polityki treści per kanał (Allegro/OLX), sanityzacja HTML | **WYSOKA** — multi-channel copy | | `channelSelection.js` / `channelTitlePolicy.js` / `marketplacePublish.js` | Selekcja kanałów, polityka tytułów, mapa pól marketplace | **WYSOKA** | | `strategicCategory.js` | Klasyfikacja kategorii strategicznych | ŚREDNIA | | `openai.js` / `openaiVisionOcr.js` / `geminiOcr.js` / `labelOcrCommon.js` / `labelQuery.js` / `factExtractor.js` / `persona.js` / `copyStyle.js` / `titleGenerator.js` / `aiPromptPayload.js` / `aiConfigSnapshots.js` | AI: OpenAI/Gemini OCR etykiet, ekstrakcja faktów, persona, copy style, title gen, prompt payload | **WYSOKA** — AI Copywriting + OCR etykiet tkanin | | `buildDraftFromSource.js` / `draft.js` / `draftStore.js` / `bulkOperations.js` / `bulkJobStore.js` / `pipeline.js` | Draft pipeline (source→draft→payload), bulk import/push | **WYSOKA** — workflow ekstraktora | | `adapters/index.js` + `adapters/taraCarpet.js` | Adapter supplier (Shopify JSON `/products/{handle}.js`) — wzorzec dla adaptera strony francuskiej | **WYSOKA** — Ekstraktor | | `taraIndex.js` / `searchQueryNormalize.js` | Lokalny indeks wyszukiwania, normalizacja query | ŚREDNIA | | `pricingStore.js` / `config.js` / `templateStore.js` / `tagsStore.js` / `utils.js` | Stores: pricing, config, templates, tags, utils (ensureAsciiSku, buildPrice) | **WYSOKA** | | `offerStateGate.js` / `payloadImageOrder.js` / `catalogOffer.js` | Stan oferty, kolejność obrazów, katalog | ŚREDNIA | #### 1.2.2 `config/` — Polityki JSON | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `badge-policy.json` / `badge-layout-policy.json` | Polityka badge'ów (copyRules, diversityGuards, positions, variants) | **WYSOKA** | | `baselinker-feature-canonical.json` | Canonical features map | **WYSOKA** | | `bazaar-card-templates.json` | Szablony kart | ŚREDNIA | | `color-map.json` | Mapa kolorów | ŚREDNIA — dla tkanin | | `de-pl-copy-glossary.json` | Glossariusz DE→PL | **WYSOKA** — ekstraktor FR→PL | | `description-blocks.json` | Bloki opisów | **WYSOKA** | | `editor-config.json` | Konfig edytora (prompty, kanały, kategorie, pola domyślne) | **WYSOKA** | | `jtl-baselinker-category-map.json` | Mapowanie kategorii JTL→BL | ŚREDNIA (wzorzec) | | `olx-template-curated-features.json` / `series-to-category.json` / `tags.json` | OLX features, series→category, tags | ŚREDNIA | #### 1.2.3 `docs/` — Dokumentacja Kluczowe: `ARCHITECTURE.md` (JTL→BaseLinker model), `BASELINKER-TEMPLATE-TAGS.md` (tagi `[opis]`, `[cechy]`), `AUTO-PUBLISH-BL.md` (publikacja Allegro/OLX), `FLOW.md`, `BASE_TEMPLATES.md`. **WYSOKA** reużyteczność dokumentacyjna. --- ### 1.3 `kebabkiller` (JavaScript, public, 206 plików, push 2026-06-30) **Charakter:** "Automated vertical video production studio". Node.js ≥22.4, Express, SQLite (`node:sqlite`), React+Vite frontend. Backend: `sharp ^0.34.5`, `archiver ^7.0.1`, `multer`, `helmet`, `express-rate-limit`. **Tenant_id: 125 wystąpień** (multi-tenant). AI: RunComfy/Wan 2.1/Fal (serverless video gen), Gemini/Groq/OpenAI/Anthropic (director). #### 1.3.1 `backend/src/video/` — **Silniki wideo (KLUCZOWE)** | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `montageEngine.js` | **FFmpeg concat demuxer** — `stitchEpisodeClips(clipPaths, outputPath)`: `-f concat -safe 0 -i list -c copy`. Hard cięcie, ten sam kodek. | **WYSOKA** — Dynamic Video Pipeline 9:16 (montaż scen) | | `frameExtractor.js` | **FFmpeg/FFprobe** — `probeDurationSec()`, `extractFrameAt()`, ekstrakcja klatki końcowej + N kandydatów. Degradacja łagodna (brak ffmpeg → []). | **WYSOKA** — klatki do ciągłości/preview | | `compositeStartFrame.js` | **Sharp composite** — `resolveCompositeConfig()` (scale, heightScale, position), `buildStartFrameAsset()`. Klatka Zero: postać na tle. | **WYSOKA** — Virtual Staging (mebel we wnętrzu) | | `runComfyEngine.js` | RunComfy API klient (Wan 2.1 workflow, `wan_workflow_api.json` template, deployment ID, status normalize) | ŚREDNIA — jeśli Vixhub używa ComfyUI | | `falEngine.js` | Fal.ai API klient (video gen) | ŚREDNIA | | `mockEngine.js` | Mock engine (testowy, ffmpeg placeholder) | NISKA | | `productionQueue.js` | **Kolejka produkcji** (26KB): `createProductionRun`, `updateProductionClip`, `resolveResumePoint()`, retry (MAX_CLIP_RETRIES=3), snapshot validation | **WYSOKA** — wzorzec kolejki wideo | | `productionRecovery.js` | Recovery po awarii | ŚREDNIA | | `queue.js` | Job queue | ŚREDNIA | | `snapshotStore.js` | Snapshoty stanu | ŚREDNIA | | `wanConfig.js` | Wan 2.1 config (WAN_QUALITY, deterministicSeed, I2V_PROFILES) | ŚREDNIA | | `darkroomProduction.js` | Darkroom production (Sharp) | ŚREDNIA | | `startFrameSource.js` | Źródło klatki startowej | ŚREDNIA | | `paths.js` | Path helpers | NISKA | | `runcomfyWorkflowAudit.js` | Audit workflow | NISKA | #### 1.3.2 `backend/src/ai/` — AI Director | Plik | Funkcja | Reużyteczność | |------|---------|---------------| | `director.js` (21KB) | AI Reżyser — łańcuch providerów Gemini→Groq→OpenAI→Anthropic→mock | ŚREDNIA | | `productionDirector.js` | `buildEpisodeVisualProfile()`, `buildSceneDirectorPlan()` | ŚREDNIA | | `screenwriter.js` / `canonPipeline.js` / `kinematicsFromPrompt.js` / `memoryCompaction.js` / `planValidator.js` / `seriesContext.js` / `summarizeRender.js` | Scenariusz, kanon, kinematyka, pamięć, walidacja | ŚREDNIA | | `directorDesk/*` (agentServer, agentTools, assetMetadata, intentRouter, storyboardMock, wizardStateMachine, workflowBuilder) | Agent desk | NISKA | #### 1.3.3 `backend/src/db/` — SQLite models `schema.sql` (13.8KB), `episodeModels.js` (29.5KB), `models.js` (21KB), `init.js`, `directorDeskModels.js`, `productionModels.js`, `darkroomModels.js`, `snapshotModels.js`, `sqliteDriver.js`. **NISKA** reużyteczność (SQLite, nie MariaDB; schema video-specific). #### 1.3.4 `backend/src/api/` + `services/` + `tenant/` + `utils/` `routes.js` (42.5KB — główny router Express), `darkroomRoutes.js`. `darkroomAiService.js`. `tenantContext.js` (multi-tenant). `llm.js` (10KB — LLM utils), `async.js`, `json.js`, `prompt.js`. ŚREDNIA reużyteczność (wzorce Express API, LLM). --- ### 1.4 `KillerStudio` (JavaScript, private, 843 pliki, push 2026-07-01) **Charakter:** **Meta-repo** zawierające sub-projekty: `gema0/`, `kebabkiller/`, `macius/`. **NIE jest osobnym systemem** — to workspace/umbrella repo. `gema0` to kolejne AI video studio (Docker, server.mjs, NLE sequencer wizja). `macius` to orchestrator/symbiont (ADR decisions, worktree management). **Reużyteczność:** NISKA — duplikat kebabkiller + eksperymentalne gema0. **Rekomendacja: ignorować, używać bezpośrednio `kebabkiller`.** --- ### 1.5 `magazyn_biala` (TypeScript, public, push 2026-07-03) **Charakter:** "Magazyn Główny" — aplikacja do zarządzania stanem magazynu **restauracji**. Vite + React 19 + TypeScript + Tailwind v4. **localStorage** (nie baza!), Vitest. Parser wiadomości Messenger → stany SKU (Smart Paste, fuzzy matching Levenshtein, kwarantanna, aliasy). **Reużyteczność:** NISKA. To jest client-side magazyn restauracyjny bez backendu/DB. Jedyne wartościowe: `src/lib/parser/` (state machine stref, ekstrakcja ilości, normalizacja UOM) — wzorzec parsera, ale nie dla mebli. `src/lib/inventory/itemMatch.ts` (fuzzy matching) — ŚREDNIA. --- ### 1.6 `slicehub` (PHP, private, 599 plików, push 2026-07-18) **Charakter:** **Starsza wersja `slicehub_pro`**. Struktura `core/` i `api/` niemal identyczna, ale brak: `BiEngine.php`, `Elzab/`, `HrClockEngine.php`, `HrRoles.php`, `HrSessionGate.php`, `InvoiceLineQtyNormalizer.php`, `KdsAcceptRouting.php`, `MenuVisibilityFilter.php`, `OrderReopenEngine.php`, `PackSizeExtractor.php`, `PayrollAllocator.php`, `PayrollLedger.php`, `PanicEngine.php`, `SceneResolver.php`, `SequenceEngine.php`, `SlaThresholds.php`, `StaffFleetPresence.php`, `TeamPayrollEngine.php`, `Uuid.php`, `WarehouseConsumeHook.php`, `WarehouseReverseHook.php`. Brak `online_studio`, brak `bi`, mniej migracji. **Reużyteczność:** NISKA. `slicehub_pro` jest **nadzbiorem**. **Rekomendacja: ignorować, używać `slicehub_pro`.** --- ### 1.7 Pozostałe repozytoria (niska reużyteczność) - `trzciamajka` (EJS) — akcja promocyjna z mapą Leaflet/geofencing. NISKA. - `projekt1` (HTML) — projekt1. NISKA. - `macius` (JavaScript, private) — orchestrator/symbiont (zawarte też w KillerStudio). NISKA. - `Gema0` (JavaScript, private) — AI video studio (zawarte w KillerStudio). NISKA. --- ## 2. MATRYCA DOPASOWANIA (REPO-FIRST MAPPING) Zestawienie 12 modułów Vixplan vs. **faktyczny kod** w `damianmalenta`: | # | Moduł Vixplan | Co JUŻ FIZYCZNIE jest w kodzie | Repo | Gotowość | Co trzeba dopisać | |---|---------------|-------------------------------|------|----------|-------------------| | **1** | **Ekstraktor Danych ze Strony Francuskiej** | `adapters/taraCarpet.js` (Shopify JSON adapter), `buildDraftFromSource.js`, `factExtractor.js`, `openaiVisionOcr.js`/`geminiOcr.js` (OCR etykiet), `de-pl-copy-glossary.json` (DE→PL), `titleGenerator.js`, `persona.js`, `copyStyle.js` | dywanowy-bazar | **WYSOKA (70%)** | Adapter strony FR (zamiast tara-carpet), translacja FR→PL (zamiast DE→PL), ekstrakcja wymiarów/pianek/stelaży/mechanizmów rozkładania | | **2** | **Cyfrowa Biblioteka Tkanin (Asset Hub)** | `sh_assets` + `sh_asset_links` (migracja 021, n:m entity↔asset z rolą), `AssetResolver.php`, `api/online_studio/library_upload.php`, `api/visual_composer/asset_upload.php` | slicehub_pro | **WYSOKA (80%)** | Domena: entity_type='fabric', role='texture_1x1', pola: gramatura, skład, Martindale, atesty (metadata_json). Seed tkanin Vilmax | | **3** | **AI Visual Studio (Texture-Swap, Virtual Staging, Realism Lock)** | `sh_scene_templates` + `sh_style_presets` + `sh_ai_jobs` (migracja 022 — queue: style_transform/background_remove/enhance/generate_variant), `SceneResolver.php`, `compositeStartFrame.js` (Sharp composite postać+tło), `sh_visual_layers` (warstwy: cal_scale, cal_rotate, offset, z_index) | slicehub_pro + kebabkiller | **ŚREDNIA (40%)** | **Texture-Swap od zera** (cyfrowe ubieranie mebla w tkaniny z fałdami/przeszyć/cieniami — brak w kodzie), Virtual Staging (osadzanie w wnętrzach PL — compositeStartFrame jest blisko, ale dla postaci, nie mebli), Realism Lock (kalibracja pod próbnik — brak) | | **4** | **Macro Visual Studio & Overlay Engine (100mm + badge)** | `badgeRenderer.js` (Sharp+SVG composite), `badgePlanner.js` (polityka: maxHeadlineChars, diversityGuards, positions, variants), `config/badge-policy.json`, `premiumPillRenderer.js`, `bazaarCardRenderer.js` | dywanowy-bazar | **WYSOKA (75%)** | Makrofotografia 100mm (obiektyw sim — brak), badge'e specyficzne: Easy Clean, Pet Friendly, Martindale >100k, Produkt Polski (polityka do dodania w badge-policy.json) | | **5** | **AI Copywriting & HTML Section Builder** | `descriptionAssembly.js` (`assembleDescriptionTextFields()`), `channelBodySanitizer.js`, `olxBodyPolicy.js`, `polishCopyTweaks.js`, `pileCopyPolicy.js`, `BASELINKER-TEMPLATE-TAGS.md` (tagi `[opis]`, `[cechy]`), `openai.js` (AI gen) | dywanowy-bazar | **WYSOKA (80%)** | Prompty pod język korzyści mebli tapicerowanych (zamiast dywanów), szablony HTML sekcji (wymiary, funkcja spania, wniesienie) | | **6** | **Dynamic Video Pipeline (Reels/TikTok 9:16, 10s)** | `montageEngine.js` (FFmpeg concat), `frameExtractor.js` (FFmpeg/FFprobe), `compositeStartFrame.js` (Sharp), `productionQueue.js` (kolejka, retry, resume), `runComfyEngine.js`/`falEngine.js` (AI video gen) | kebabkiller | **ŚREDNIA (50%)** | Sekwencja specyficzna: detal makro → test hydrofobowości → rozkładanie spania → plansza wniesienia. 10s pionowy 9:16. Montaż jest gotowy, ale workflow scenariusza meblowego do napisania | | **7** | **BaseLinker Integration Adapter (PIM Feeder)** | `src/baselinker.js` (gotowy klient `addInventoryProduct`: sku/ean/tax/category/weight/dimensions/text_fields/stock/prices/images/tags, dry-run+live, error handling, tag whitelist filter), `baselinkerImages.js`, `baselinkerFeatureCanonical.js`, `core/Integrations/BaseAdapter.php` + `AdapterRegistry.php` + `IntegrationDispatcher.php` (wzorzec adaptera z retry/backoff/DLQ/CredentialVault), `core/Ksef/Client.php` (wzorzec REST klienta z auth/refresh/paging), `sh_integration_deliveries` + `sh_integration_attempts` (audit) | dywanowy-bazar + slicehub_pro | **WYSOKA (85%)** | `BaseLinkerAdapter.php` (extends BaseAdapter, port baselinker.js→PHP) z `setInventoryProductData` (dwukierunkowy), `getInventoryProductsList`, mapowanie pól meblowych, kanały: Allegro/Sklep D2C/Erli | | **8** | **Sklep Własny D2C (WordPress/WooCommerce)** | **BRAK** — żadne repo nie ma WooCommerce/WordPress | — | **ZERO (0%)** | Całość od zera: WooCommerce, PayPo, Ratami 0%, moduł próbek darmowych, integracja z BaseLinkerem | | **9** | **Catalog & Print PDF Engine (A4 High-Res)** | `archiver ^7.0.1` w kebabkiller (ZIP, nie PDF), `api/marketing/deck_engine.php` (deck marketingowy, nie PDF A4) | kebabkiller + slicehub_pro | **NISKA (15%)** | PDF A4 High-Res od zera (puppeteer/pdfkit/pdf-lib), szablon karty produktowej mebla, jeden klik eksport | | **10** | **Social Media & Ad Studio** | `api/marketing/engine.php` + `deck_engine.php`, `modules/marketing/` | slicehub_pro | **NISKA (20%)** | Planer kreacji reklam, harmonogram godzin publikacji — większość od zera | | **11** | **Panel Administracyjny & Prompt Studio** | `api/settings/engine.php`, `modules/settings/`, `src/aiConfigSnapshots.js` (snapshotty konfiguracji AI), `src/templateStore.js` (szablony promptów) | slicehub_pro + dywanowy-bazar | **ŚREDNIA (45%)** | Słownik słów zakazanych, zarządzanie stylem komunikacji meblowej, prompt studio specyficzne | | **12** | **Moduł Przyszłościowy: Master Configurator & Room Studio** | `compositeStartFrame.js` (composite mebel+wnętrze), `sh_scene_variants` (A/B warianty), `sh_ai_jobs` (generate_variant) | kebabkiller + slicehub_pro | **NISKA (25%)** | Interaktywny kompozytor mebli na wymiar, przymierzalnik wnętrz (upload zdjęcia pokoju klienta) — większość od zera | --- ## 3. LISTA BRAKÓW (GAP ANALYSIS) ### 3.1 Moduły do napisania od zera (ZERO w kodzie) | Brak | Priorytet | Stack | Uwagi | |------|-----------|-------|-------| | **Sklep D2C WooCommerce + PayPo + Ratami 0% + moduł próbek** | WYSOKI | WordPress/WooCommerce + PHP | Faza 2 Vixplan. Brak jakiejkolwiek infrastruktury WooCommerce w repo | | **Catalog & Print PDF Engine A4 High-Res** | ŚREDNI | Node.js + puppeteer/pdf-lib lub PHP + TCPDF | Jeden klik eksport karty produktowej dla handlowców | | **AI Texture-Swap (cyfrowe ubieranie mebla w tkaniny)** | WYSOKI | Node.js + Sharp/Canvas + AI (ComfyUI/Replicate) | Krok 2 Visual Studio. Brak silnika nakładania tekstur z fałdami/przeszywami/cieniami. `compositeStartFrame.js` to prosty composite, nie texture-swap | | **Realism Lock (kalibracja kolorów pod próbnik tkanin)** | WYSOKI | Node.js + Sharp (color calibration) | Krok 4 Visual Studio. Eliminacja reklamacji odcieni. Brak | | **Adapter strony francuskiej Vilmax** | WYSOKI | Node.js/PHP | `adapters/taraCarpet.js` jest wzorcem (Shopify JSON), ale strona FR ma inny format. Ekstrakcja: wymiary, pianki HR/T30, stelaż, sprężyny, mechanizmy (DL, delfin, puma) | | **Integracja PayPo + Ratami 0%** | WYSOKI | PHP REST | Brak w kodzie | | **Social Media & Ad Studio (planer harmonogramu publikacji)** | ŚREDNI | PHP + JS | Brak planera godzin | ### 3.2 Moduły wymagające znacznej przebudowy (częściowo obecne) | Moduł | Co jest | Co brakuje | |-------|---------|------------| | AI Visual Studio — Virtual Staging | `compositeStartFrame.js` (postać+tło), `sh_scene_templates` | Biblioteka wnętrz PL, oświetlenie, cienie kontaktowe, dopasowanie mebel→wnętrze | | Dynamic Video Pipeline | `montageEngine.js`, `frameExtractor.js`, `productionQueue.js` | Workflow scenariusza: detal makro → hydrofobowość → rozkładanie → plansza wniesienia. 10s 9:16 | | Panel Admin & Prompt Studio | `settings/engine.php`, `aiConfigSnapshots.js` | Słownik słów zakazanych meblowych, prompt studio specyficzne | | Master Configurator (Faza 2/3) | `compositeStartFrame.js`, `sh_scene_variants` | Kompozytor na wymiar, przymierzalnik wnętrz z uploadem zdjęcia klienta | ### 3.3 Infrastruktura — braki vs. Vixplan | Wymaganie Vixplan | Stan w repo | Brak | |-------------------|-------------|------| | **PHP 8.2+ Strict Types** | slicehub_pro: PHP 8.3, **167/255 plików PHP ma `declare(strict_types=1)` (65%)** — 88 plików brakuje | Dokończyć strict types do 100% | | **MariaDB 10.11+** | slicehub_pro: MariaDB 10.11 (Cloud) / 10.4.32 (XAMPP lokalnie) | OK | | **Redis 7+ (kolejki)** | **BRAK Redis** — slicehub_pro używa SQL Transactional Outbox + in-DB rate-limit + `sh_sse_broadcast` tabeli zamiast Redis pub/sub (potwierdzone AGENTS.md §14) | **Wdrożyć Redis 7+** jeśli Vixplan wymaga — lub zaakceptować wzorzec outbox (działa, ale Vixplan §I.1 mówi Redis) | | **Node.js (Sharp/Canvas) + FFmpeg** | dywanowy-bazar: Sharp ^0.33.5. kebabkiller: Sharp ^0.34.5 + FFmpeg (montageEngine, frameExtractor). **Brak node-canvas** (tylko Sharp) | Dodać node-canvas jeśli potrzebne (Sharp wystarczy dla większości composite) | | **DDD (Domain-Driven Design)** | slicehub_pro: Modular Monolith z logical DDD silos (prefix-based), namespace `SliceHub\Integrations`, `SliceHub\Ksef` | OK — wzorzec do naśladowania | --- ## 4. BLOKADY I RYZYKA (WYKRYTE NARUSZENIA) ### 4.1 Naruszenia Żelaznych Zasad Deweloperskich (§II Vixplan) #### 4.1.1 **ZAKAZ HARDCODOWANIA CZASU** (§II.3 Vixplan) — **NARUSZENIE KRYTYCZNE** **slicehub_pro** — 25 plików z hardcodowanymi czasami realizacji (grep `48h|24h|wysyłka w|dni robocze`): | Plik | Linie | Naruszenie | |------|-------|------------| | `modules/settings/js/settings_app.js` | 1108, 1116, 1341, 1344, 1353, 1359 | Hardcodowane czasy w UI settings | | `api/settings/engine.php` | 957, 980, 1122, 1126, 1132 | Hardcodowane czasy w API | | `api/pos/sync.php` | 414, 416, 437, 438 | Hardcodowane czasy w POS sync | | `core/WebhookDispatcher.php` | 49 | Hardcodowany czas w webhook | | `core/Integrations/IntegrationDispatcher.php` | 102 | `INTERVAL 24 HOUR` — hardcodowany window | | `core/HrClockEngine.php` | 56 | Hardcodowany czas | | `core/AuthEngine.php` | 50 | Hardcodowany czas | | `core/PromisedTimeEngine.php` | 15, 17-21, 23-25 | **Hardcoded `TIMEZONE='Europe/Warsaw'`, `CHANNEL_BUFFERS` (dine_in=0, takeaway=5, delivery=15), `DEFAULT_BASE_PREP=25`, `DEFAULT_MIN_LEAD_TIME=30`, `MAX_LOAD_FACTOR=2.0`, `LOAD_DIVISOR=20.0`** — wzorzec dobry, ale stałe hardcoded | **dywanowy-bazar** — 3 pliki (tylko w `docs/`, nie w kodzie): `base-com-input-pack.md:53`, `ROADMAP.md:119`, `AUTO-PUBLISH-BL.md:128`. **Kod src/ jest czysty.** **kebabkiller** — 0 naruszeń (grep pusty). **Wniosek:** `PromisedTimeEngine.php` jest **wzorcem poprawnym koncepcyjnie** (dynamiczny kalkulator z load-factor), ale stałe są hardcoded. Dla Vixhub: **przenieść stałe do `sh_tenant_settings` / konfiguracji BaseLinkera** (czas produkcji 5/7/10/14 dni roboczych jako zmienna dynamiczna z BL — zgodnie z §IV Vixplan). #### 4.1.2 **REPO-FIRST PROTOCOL** (§II.1) — **ZGODNE** Audytor potwierdza: przed pisaniem od zera należy przeszukać repo. Niniejszy raport jest wykonaniem tego protokołu. #### 4.1.3 **APPROVAL GATE** (§II.2) — **ZGODNE** Nie dołączano nowych bibliotek bez potrzeby. Sharp, FFmpeg, Express, archiver — wszystkie już w repo. #### 4.1.4 **STANDARD KODU PRODUKCYJNEGO** (§II.4) — **NARUSZENIE MINOR** - `dywanowy-bazar/src`: 1 match `TODO|FIXME|placeholder|pseudokod` (minor) - `kebabkiller`: brak danych (grep nie wykonany, ale tests obecne) - `slicehub_pro`: pliki `_tmp_*` w `scripts/` (`_tmp_asset_pipeline.php`, `_tmp_asset_seed.sql`, `_tmp_e2e_test.php`, `_tmp_import_report.html`) — pliki tymczasowe w repo ### 4.2 Naruszenia Rygoru Danych (§I.2 Vixplan) #### 4.2.1 **ASCII dla kluczy technicznych / SKU / ścieżek** — **WZORCOWO** - `slicehub_pro`: `AsciiKeyEngine::transliterate()` (ą→a, ł→l, collapse non-[A-Za-z0-9]→_) — **gotowy prymityw** - `dywanowy-bazar`: `ensureAsciiSku()` w `utils.js` — **gotowy**, `resolveSku()` w `baselinker.js` (DYW- prefix, fallback EAN/Date.now()) - Migracja 021: `ascii_key VARCHAR(191)` z `UNIQUE KEY uq_assets_tenant_key (tenant_id, ascii_key)` — **schema ASCII-safe** #### 4.2.2 **UTF-8 dla opisów** — **ZGODNE** - `slicehub_pro`: baza `utf8mb4_unicode_ci`, `SET NAMES utf8mb4` w migracjach - `dywanowy-bazar`: UTF-8 w treściach, ASCII w SKU (reguła w `.cursor/rules/base-com-automation-context.mdc` §"Pozostałe zasady": "UTF-8 w treści; identyfikatory techniczne ASCII-safe") #### 4.2.3 **Brak flag tenancyjnych** (§I.2 Vixplan: "Czysta baza bez flag tenancyjnych") — **NARUSZENIE STRUKTURALNE** - `slicehub_pro`: **8770 wystąpień `tenant_id`** — multi-tenant Row-Level Security na `tenant_id` (AGENTS.md §14: "Multi-tenancy is app-level Row-Level Security on the `tenant_id` column") - `kebabkiller`: **125 wystąpień `tenant_id|tenantId`** — multi-tenant - `dywanowy-bazar`: **0 wystąpień** — single-tenant (zgodne z Vixplan!) - `magazyn_biala`: 0 (localStorage, nie DB) **Wniosek:** Vixplan wymaga **Single-Tenant bez flag tenancyjnych**. `dywanowy-bazar` jest zgodny. `slicehub_pro` i `kebabkiller` **NARUSZAJĄ** — przy reużyciu silników z tych repo **trzeba usunąć `tenant_id`** z zapytań i schema (lub ustawić `tenant_id=1` hardcoded dla single-tenant). To jest **znaczny refaktoring** — każda klasa `core/Integrations/*`, `AssetResolver`, `SceneResolver`, `OrderEventPublisher` przyjmuje `$tenantId` jako parametr. ### 4.3 Strict Types (§I.1 Vixplan: PHP 8.2+ Strict Types) **slicehub_pro**: **167/255 plików PHP = 65%** ma `declare(strict_types=1)`. **88 plików (35%) brakuje.** Kluczowe silniki (AsciiKeyEngine, Uuid, Money, AssetResolver, SceneResolver, BaseAdapter, AdapterRegistry, IntegrationDispatcher, OrderEventPublisher, CredentialVault, Ksef/Client, PromisedTimeEngine) — **wszystkie mają strict_types=1** ✓. Braki głównie w `api/` endpointach i `scripts/`. **dywanowy-bazar / kebabkiller**: JavaScript/TypeScript — strict mode w TS (magazyn_biala: `tsconfig.app.json`), ESM w JS. ### 4.4 Bezpieczeństwo - **slicehub_pro**: `CredentialVault` (libsodium XChaCha20-Poly1305, `vault:v1:` prefix, backward-compat plaintext) — **WZORCOWE**. Token NIGDY w logach (Ksef/Client.php). JWT secret z env. - **dywanowy-bazar**: Token BaseLinkera z `.env` (`BASELINKER_API_TOKEN`), `APP_PASSWORD` Basic Auth, `timingSafeEqualStrings()` — **ZGODNE**. Reguła w `.cursor/rules`: "Wrażliwych danych (tokenów) nie żądaj w całości — proś o redakcję". - **kebabkiller**: `helmet`, `express-rate-limit`, `cors`, `multer` — **ZGODNE**. ### 4.5 Drift / Stale dokumenty - `slicehub_pro/wniosek.md` (grant report maj 2026) linia 253: "✗ package.json — nie istnieje" — **STALE** (package.json istnieje dla puppeteer-core, AGENTS.md §14 potwierdza drift) - `slicehub_pro/_docs/02_ARCHITEKTURA.md` (legacy) vs `AGENTS.md` (current) — możliwe rozbieżności - `kebabkiller/docs/02_ARCHITECTURE.md`: "⚠️ LEGACY — źródło prawdy = docs/11_OPUS_ARCHITECTURE_PROPOSAL.md" — oznaczone, OK --- ## 5. REKOMENDACJE ARCHITEKTONICZNE ### 5.1 Strategia Reużycia (Repo-First Execution) **Phase 0 — Fork & Strip:** 1. Utworzyć nowe repo `vixhub` (PHP 8.2+ DDD, MariaDB, Node.js media pipeline) 2. Zaimportować z `slicehub_pro`: `core/AsciiKeyEngine.php`, `core/Uuid.php`, `core/Money.php`, `core/Units.php`, `core/DomainError.php`, `core/db_config.php`, `core/CredentialVault.php`, `core/JwtProvider.php`, `core/OrderEventPublisher.php`, `core/WebhookDispatcher.php`, `core/PromisedTimeEngine.php` (z refaktoringiem stałych → config), `core/SlaThresholds.php`, `core/Integrations/*` (BaseAdapter, AdapterRegistry, IntegrationDispatcher), `core/Notifications/*`, `database/migrations/021_unified_asset_library.sql`, `022_scene_kit.sql`, `026_event_system.sql`, `028_integration_deliveries.sql`, `scripts/worker_*.php` 3. Zaimportować z `dywanowy-bazar`: `src/baselinker.js` (port→PHP `BaseLinkerAdapter.php`), `src/baselinkerImages.js`, `src/baselinkerFeatureCanonical.js`, `src/badgeRenderer.js` + `badgePlanner.js` + `config/badge-policy.json`, `src/collageComposer.js`, `src/descriptionAssembly.js`, `src/channelBodySanitizer.js`, `src/aiConfigSnapshots.js`, `docs/BASELINKER-TEMPLATE-TAGS.md` 4. Zaimportować z `kebabkiller`: `backend/src/video/montageEngine.js`, `frameExtractor.js`, `compositeStartFrame.js`, `productionQueue.js` (z adaptacją schema SQLite→MariaDB) **Phase 1 — Refaktoring Single-Tenant:** - Usunąć `tenant_id` z wszystkich zapytań/schema (lub hardcoded `tenant_id=1`) - Zmienić prefix tabel `sh_` → `vx_` (Vixhub branding) - Dokończyć `declare(strict_types=1)` do 100% **Phase 2 — Nowe moduły od zera:** - `BaseLinkerAdapter.php` (port baselinker.js, extends BaseAdapter) - Adapter strony francuskiej Vilmax (wzorzec taraCarpet.js) - AI Texture-Swap engine (Sharp/Canvas + AI) - Virtual Staging (rozszerzenie compositeStartFrame) - Realism Lock (color calibration) - PDF A4 Catalog Engine (puppeteer/pdf-lib) - WooCommerce D2C + PayPo + Ratami 0% ### 5.2 Decyzja infrastrukturalna: Redis vs Outbox Vixplan §I.1 wymaga **Redis 7+**. slicehub_pro używa **SQL Transactional Outbox** (zero Redis). Dwie opcje: **Opcja A (zgodna z Vixplan):** Wdrożyć Redis 7+ jako szynę zadań. Refaktoring outbox→Redis pub/sub + BullMQ (Node.js) / Predis (PHP). Koszt: średni. Korzyść: zgodność z Vixplan, lepsza wydajność pod obciążeniem. **Opcja B (pragmatyczna, drift od Vixplan):** Utrzymać SQL Transactional Outbox (działa, sprawdzone, zero dodatkowej infrastruktury). Zgodne z duchem "Single-Tenant bez narzutu SaaS" (§I Vixplan). **Rekomendowane dla pilota Vilmax** — można zmigrować na Redis w Fazie 2/3. ### 5.3 Decyzja: JS vs PHP dla klienta BaseLinker `dywanowy-bazar/src/baselinker.js` jest **gotowy i działający** (JS, fetch, URLSearchParams form). Dwie opcje: **Opcja A:** Port do PHP `BaseLinkerAdapter.php` (zgodne z DDD PHP Vixplan). Koszt: ~1-2 dni. Korzyść: spójność stack. **Opcja B:** Utrzymać jako Node.js micro-service (dywanowy-bazar pattern), wywoływany z PHP przez HTTP. Koszt: 0. Korzyść: natychmiastowe działanie. Ryzyko: dwa stacki. **Rekomendacja:** Opcja A (port PHP) dla spójności DDD, ale Opcja B jako fallback szybkiego startu. --- ## 6. ZAŁĄCZNIKI ### 6.1 Pełna lista repozytoriów `damianmalenta` | Repo | Język | Private | Pliki | Push | Reużyteczność Vixhub | |------|-------|---------|-------|------|----------------------| | `slicehub_pro` | PHP | nie | 716 | 2026-08-25 | **WYSOKA** — silniki core, Integrations, schema | | `dywanowy-bazar` | JS | tak | 189 | 2026-07-03 | **WYSOKA** — klient BaseLinker, badge, AI copy | | `kebabkiller` | JS | nie | 206 | 2026-06-30 | **WYSOKA** — FFmpeg/Sharp wideo, productionQueue | | `slicehub` | PHP | tak | 599 | 2026-07-18 | NISKA — nadzbiór = slicehub_pro | | `KillerStudio` | JS | tak | 843 | 2026-07-01 | NISKA — meta-repo (zawiera kebabkiller/gema0/macius) | | `magazyn_biala` | TS | nie | ~80 | 2026-07-03 | NISKA — localStorage magazyn restauracyjny | | `trzciamajka` | EJS | nie | — | 2026-08-20 | NISKA — mapa Leaflet | | `projekt1` | HTML | tak | — | 2026-05-15 | NISKA | | `macius` | JS | tak | — | 2026-06-19 | NISKA — orchestrator (w KillerStudio) | | `Gema0` | JS | tak | — | 2026-06-07 | NISKA — AI video (w KillerStudio) | ### 6.2 Kluczowe pliki do natychmiastowego importu (checklist) ``` [ ] slicehub_pro/core/AsciiKeyEngine.php [ ] slicehub_pro/core/Uuid.php [ ] slicahub_pro/core/Money.php [ ] slicehub_pro/core/Units.php [ ] slicehub_pro/core/DomainError.php [ ] slicehub_pro/core/db_config.php [ ] slicehub_pro/core/CredentialVault.php [ ] slicehub_pro/core/JwtProvider.php [ ] slicehub_pro/core/OrderEventPublisher.php [ ] slicehub_pro/core/WebhookDispatcher.php [ ] slicehub_pro/core/PromisedTimeEngine.php (refaktoring stałych → config) [ ] slicehub_pro/core/SlaThresholds.php [ ] slicehub_pro/core/AssetResolver.php [ ] slicehub_pro/core/SceneResolver.php [ ] slicehub_pro/core/Integrations/BaseAdapter.php [ ] slicehub_pro/core/Integrations/AdapterRegistry.php [ ] slicehub_pro/core/Integrations/IntegrationDispatcher.php [ ] slicehub_pro/core/Notifications/* (ChannelInterface, ChannelRegistry, NotificationDispatcher, TemplateRenderer) [ ] slicehub_pro/database/migrations/021_unified_asset_library.sql [ ] slicehub_pro/database/migrations/022_scene_kit.sql [ ] slicehub_pro/database/migrations/026_event_system.sql [ ] slicehub_pro/database/migrations/028_integration_deliveries.sql [ ] slicehub_pro/scripts/worker_webhooks.php [ ] slicehub_pro/scripts/worker_integrations.php [ ] slicehub_pro/scripts/worker_notifications.php [ ] slicehub_pro/scripts/bootstrap_vault.php [ ] slicehub_pro/scripts/rotate_credentials_to_vault.php [ ] dywanowy-bazar/src/baselinker.js (port → PHP BaseLinkerAdapter) [ ] dywanowy-bazar/src/baselinkerImages.js [ ] dywanowy-bazar/src/baselinkerFeatureCanonical.js [ ] dywanowy-bazar/src/badgeRenderer.js [ ] dywanowy-bazar/src/badgePlanner.js [ ] dywanowy-bazar/config/badge-policy.json [ ] dywanowy-bazar/config/badge-layout-policy.json [ ] dywanowy-bazar/src/collageComposer.js [ ] dywanowy-bazar/src/descriptionAssembly.js [ ] dywanowy-bazar/src/channelBodySanitizer.js [ ] dywanowy-bazar/src/aiConfigSnapshots.js [ ] dywanowy-bazar/docs/BASELINKER-TEMPLATE-TAGS.md [ ] dywanowy-bazar/docs/AUTO-PUBLISH-BL.md [ ] kebabkiller/backend/src/video/montageEngine.js [ ] kebabkiller/backend/src/video/frameExtractor.js [ ] kebabkiller/backend/src/video/compositeStartFrame.js [ ] kebabkiller/backend/src/video/productionQueue.js (adaptacja SQLite→MariaDB) ``` --- **RAPORT ZAKOŃCZONY.** Audytor potwierdza wykonanie protokołu Repo-First (§II.1 Vixplan) — przed rozpoczęciem prac nad jakimkolwiek modułem zidentyfikowano gotowe komponenty i zaprezentowano plan ich ponownego użycia. Następny krok: Approval Gate (§II.2) — zatwierdzenie przez Architecture Board planu reużycia przed implementacją.