V2 lives entirely under v2/ and is built around three asks the team raised about V1: per-video assets sometimes drifted onto the wrong trend, hashtag scrapes returned junk that wasn't filterable per-client, and there was no multi-user model behind Microsoft SSO. Highlights: - Stable TikTok numeric-id key for every per-video asset; URL form drift is logged loudly to drift_log.jsonl and never silently nulls assets. Stage 5 manifest hard-gates Stage 6 if any selected video is missing any required asset; --drop-failing auto-backfills from the next-best recipe candidates. - Per-brief engagement floor (min_likes / min_plays / min_stl_pct), applied at Apify scrape time and re-validated locally; spend_log.json records raw_returned vs kept_after_floor per scrape. - Users + teams + memberships with owner/admin/editor/viewer roles; SSO upserts a user keyed on Azure oid, auto-creates a personal team, and a super-admin is bootstrapped via BOOTSTRAP_SUPER_ADMIN_EMAIL on first sign-in. Phase A integration test: 16/16 pass. - 10-stage TS pipeline (brief → seed → scrape1 → select → scrape2 → validate → analyse → insights → trends → qa → build) wired through one CLI; each stage idempotent + resumable from disk via .state sentinels. §4.5 rubrics shipped under prompts/ and loaded into Claude calls. - React 18 + Vite + TS + Tailwind operator SPA: brief intake form, team management, super-admin user list, help/FAQ ported from V1. - Separate Docker Compose project (name: social-reporting-v2, port 3457, Postgres 5437) with deploy/setup-v2.sh, deploy-v2.sh, rollback-to-v1.sh scripts that take over V1's /social-reports URL and let us roll back. Verification: 62 unit tests pass (auth/session, ids extractor with full URL fixture, engagement floor, recipes, manifest, linking-fix, MoM compare). Live smoke run on a Dove brief: 1400 raw → 253 kept (82% culled) → 21 fully-bundled videos → 25 editorial trends across 8 brief-driven categories, with drift=0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.2 KiB
Text
41 lines
1.2 KiB
Text
# V2 image: builds operator-app SPA, copies server + pipeline + templates, runs Node.
|
|
FROM node:20-slim AS ui-build
|
|
|
|
WORKDIR /build
|
|
COPY v2/package.json v2/package-lock.json* ./
|
|
COPY v2/operator-app/package.json operator-app/package.json
|
|
COPY v2/templates/dashboard_template/package.json templates/dashboard_template/package.json
|
|
RUN npm install --include=dev --no-audit --no-fund
|
|
|
|
COPY v2/operator-app ./operator-app
|
|
COPY v2/tsconfig.base.json ./tsconfig.base.json
|
|
RUN npm run build --workspace operator-app
|
|
|
|
FROM node:20-slim AS runtime
|
|
|
|
# ffmpeg for Stage 4 frame extraction
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends ffmpeg ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
|
|
COPY v2/package.json v2/package-lock.json* ./
|
|
RUN npm install --omit=dev --no-audit --no-fund
|
|
|
|
COPY v2/tsconfig.base.json v2/tsconfig.json ./
|
|
COPY v2/server ./server
|
|
COPY v2/pipeline ./pipeline
|
|
COPY v2/templates ./templates
|
|
COPY v2/db ./db
|
|
|
|
# UI build artifacts
|
|
COPY --from=ui-build /build/operator-app/dist ./operator-app/dist
|
|
|
|
RUN mkdir -p briefs && useradd -u 1000 -m -s /bin/bash node-v2 || true
|
|
RUN chown -R 1000:1000 /app
|
|
|
|
USER 1000
|
|
EXPOSE 3457
|
|
CMD ["npx", "tsx", "server/index.ts"]
|