Commit graph

39 commits

Author SHA1 Message Date
senke
3fbda58b95 docs: amend v1.0.6.2 CHANGELOG + item G recovery endpoint
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
CHANGELOG v1.0.6.2 block now documents the distribution-handler
propagate fix as part of the release (applied in commit 3cee007d8
before re-tagging). v1.0.7 item G acceptance gains a recovery
endpoint requirement so the "complete payment" error message has a
real target rather than leaving users stuck.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 12:53:43 +02:00
senke
d31f5733d6 chore(release): v1.0.6.2 — subscription payment-gate bypass hotfix
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
Closes a bypass surfaced by the 2026-04 audit probe (axis-1 Q2): any
authenticated user could POST /api/v1/subscriptions/subscribe on a paid
plan and receive 201 active without the payment provider ever being
invoked. The resulting row satisfied `checkEligibility()` in the
distribution service via `can_sell_on_marketplace=true` on the Creator
plan — effectively free access to /api/v1/distribution/submit, which
dispatches to external partners.

Fix is centralised in `GetUserSubscription` so there is no code path
that can grant subscription-gated access without routing through the
payment check. Effective-payment = free plan OR unexpired trial OR
invoice with non-empty hyperswitch_payment_id. Migration 980 sweeps
pre-existing fantôme rows into `expired`, preserving the tuple in a
dated audit table for support outreach.

Subscribe and subscribeToFreePlan treat the new ErrSubscriptionNoPayment
as equivalent to ErrNoActiveSubscription so re-subscription works
cleanly post-cleanup. GET /me/subscription surfaces needs_payment=true
with a support-contact message rather than a misleading "you're on
free" or an opaque 500. TODO(v1.0.7-item-G) annotation marks where the
`if s.paymentProvider != nil` short-circuit needs to become a mandatory
pending_payment state.

Probe script `scripts/probes/subscription-unpaid-activation.sh` kept as
a versioned regression test — dry-run by default, --destructive logs in
and attempts the exploit against a live backend with automatic cleanup.
8-case unit test matrix covers the full hasEffectivePayment predicate.

Smoke validated end-to-end against local v1.0.6.2: POST /subscribe
returns 201 (by design — item G closes the creation path), but
GET /me/subscription returns subscription=null + needs_payment=true,
distribution eligibility returns false.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 12:21:53 +02:00
senke
a57bb6f784 chore(release): v1.0.6.1 — partial UNIQUE on refunds.hyperswitch_refund_id
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
Hotfix surfaced by the v1.0.6 refund smoke test. Migration 978's plain
UNIQUE constraint on hyperswitch_refund_id collided on empty strings
— two refunds in the same post-Phase-1 / pre-Phase-2 state (or a
previous Phase-2 failure leaving '') would violate the constraint at
INSERT time on the second attempt, even though the refunds were for
different orders.

  * Migration 979_refunds_unique_partial.sql replaces the plain
    UNIQUE with a partial index excluding empty and NULL values.
    Idempotency for successful refunds is preserved — duplicate
    Hyperswitch webhooks land on the same row because the PSP-
    assigned refund_id is non-empty.
  * No Go code change. The bug was purely in the DB constraint shape.

Smoke test that caught it — 5/5 scenarios re-verified end-to-end:
happy path, idempotent replay (succeeded_at + balance strictly
invariant), PSP error rollback, webhook refund.failed, double-submit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 02:42:24 +02:00
senke
48acbf5c28 chore(release): v1.0.6 — ergonomics + operational hardening
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
Follow-up to the v1.0.5 hardening sprint. That release validated the
`register → verify → play` critical path end-to-end; this one addresses
the next layer — the UX friction and operational blindspots that a
first-day public user (or a first-day on-call) would hit. Six targeted
commits, each with its own tests:

  * Fix 1 — Self-service creator role (c32278dc1)
  * Fix 2 — Upload size limits from a single source (5848c2e40)
  * Fix 3 — Unified SMTP env schema on canonical SMTP_* names (066144352)
  * Fix 4 — Refund reverse-charge with idempotent webhook (959031667)
  * Fix 5 — RTMP ingest health banner on Go Live (64fa0c9ac)
  * Fix 6 — RabbitMQ publish failures no longer silent (bf688af35)

Breaking changes:
  * marketplace.MarketplaceService.RefundOrder now returns
    (*Refund, error) — callers must accept the pending refund row.
  * Internal refundProvider interface changed from
    Refund(...) error to CreateRefund(...) (refundID, status, err).
  * Order status machine gains `refund_pending` as an intermediate
    state. Clients reading orders.status should not treat it as
    refunded yet.

Parked for v1.0.7:
  * Partial refunds (UX decision + call-site wiring)
  * Stripe Connect Transfers:reversal (internal accounting is
    already corrected; this is the external money-movement call)
  * CloudUploadModal.tsx unifying on /upload/limits
  * Manual smoke test of refund flow against Hyperswitch sandbox

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 02:13:45 +02:00
senke
f601441aa3 chore(release): v1.0.5.1 — dev SMTP ergonomics hotfix
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
A fresh clone + `cp veza-backend-api/.env.template .env` + `make dev-full`
booted the backend with `SMTP_HOST=""` — `EmailService.sendEmail` short-
circuits to log-only when the host is empty, so `register` + `password
reset` produced users stuck with no way to verify (or recover) in dev,
and the smoke test caught MailHog empty despite the service being up.

- `.env.template` now ships MailHog-ready defaults (`localhost:1025`,
  UI on `:8025`, `FROM_EMAIL=no-reply@veza.local`) so a bare clone +
  copy gives a working register flow. Comment rewritten to point at
  both the dev path and the prod override.
- Also exports duplicate variable names (`SMTP_USERNAME`, `SMTP_FROM`,
  `SMTP_FROM_NAME`) read by `internal/email/sender.go`. The two email
  services in-tree disagree on env schema (`SMTP_USER` vs
  `SMTP_USERNAME`, `FROM_EMAIL` vs `SMTP_FROM`, `FROM_NAME` vs
  `SMTP_FROM_NAME`); until v1.0.6 reconciles them, both sets are
  populated so whichever path fires finds its names.

Pure config hotfix. No code change, no migration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 18:16:54 +02:00
senke
7385f1e4ed chore(release): v1.0.5 — hardening sprint
Some checks failed
Veza CI / Backend (Go) (push) Failing after 2s
Veza CI / Frontend (Web) (push) Failing after 3s
Veza CI / Rust (Stream Server) (push) Failing after 2s
Frontend CI / test (push) Failing after 2s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 3s
Veza CI / Notify on failure (push) Failing after 0s
Seven targeted fixes to the register → verify → play critical path before
public opening. Each landed in its own commit with dedicated tests; this
commit just rolls VERSION forward and captures the rationale in the
changelog.

Summary of what's in this release:
  * Fix 1 — Player muet: /stream endpoint + HLS default alignment
  * Fix 2 — Email verify bidon: real SMTP + MailHog + fail-loud in prod
  * Fix 3 — Marketplace gratuit: HYPERSWITCH_ENABLED=true required in prod
  * Fix 4 — Redis obligatoire: REDIS_URL required in prod + ERROR log
    on in-memory PubSub fallback
  * Fix 5 — Maintenance mode DB-backed via platform_settings
  * Fix 6 — Hourly cleanup of orphan tracks stuck in processing
  * Fix 7 — Response cache bypass for range-aware media endpoints
    (surfaced by the browser smoke test; prevents Range/Accept-Ranges
    strip and JSON-round-trip byte corruption on /stream, /download,
    /hls/ and any request with a Range header)

Parked for v1.0.6 (🟠/🟡 audit items + smoke-test ergonomics):
Hyperswitch refund→PSP propagation, livestream UI feedback when
nginx-rtmp is down, upload size mismatch (front 500MB vs back 100MB),
RabbitMQ silent drop on enqueue failure, SMTP_HOST ergonomics for
`make dev` host mode, creator-role self-service onboarding for upload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 16:14:54 +02:00
senke
2268b06fc9 chore(release): v1.0.4 — cleanup sprint complete, CI green
All checks were successful
Security Scan / Secret Scanning (gitleaks) (push) Successful in 4m13s
Veza CI / Rust (Stream Server) (push) Successful in 6m19s
Veza CI / Backend (Go) (push) Successful in 6m45s
Veza CI / Frontend (Web) (push) Successful in 21m1s
Veza CI / Notify on failure (push) Has been skipped
7-day cleanup sprint (J1–J7) done. The codebase is unchanged
functionally but the working tree, docs, k8s runbooks, CI, and
Go dependency graph are all realigned with reality for the first
time since the v1.0.0 release.

VERSION          1.0.2 → 1.0.4 (skips v1.0.3 — that tag already
                 exists upstream, unused on this branch)
CHANGELOG.md     full v1.0.4 entry with per-day (J1–J7) breakdown
                 and the govulncheck + CI fix trail
docs/PROJECT_STATE.md   header month + version table refreshed,
                        pointer to AUDIT_REPORT.md added
docs/FEATURE_STATUS.md  header updated — no feature matrix
                        changes (no feature work in this sprint)

Key deliverables of the sprint:
  J1  7c9eece09  purge 220 MB of debris (binaries, reports,
                 session docs, stale MVP scripts)
  J2  172ff497b  rewrite CLAUDE.md, fix README, purge chat-server
                 refs from k8s runbooks and env examples
  J3  784961b7e  remove 3 deprecated unused handlers
  J3+ dbda03f45  2FA handler duplicate removal (bundled by parallel
                 ci-cache commit)
  J4  ebb28c77a  GDPR-compliant hard delete with Redis SCAN cursor
                 and ES DeleteByQuery — closes TODO(HIGH-007)
  J5  edc851af6  defer GeoIP, rename v2-v3-types.ts to domain.ts,
                 document Storybook kill
  J5+ a9394a4a0  fix lint-staged eslint rule (was linting the
                 whole project — root cause of earlier --no-verify)
  J6  091583b3d  mark 3 dormant docker-compose files deprecated
  fix 9e817aa6b  bump x/image, quic-go, testcontainers-go — drops
                 containerd + docker/docker from dep graph,
                 resolving 5 govulncheck findings without allowlist
  fix 51ed89cda  bump go.work to 1.25 to match veza-backend-api
  fix 51416ce37  bump x/net v0.51.0 for GO-2026-4559
  fix 8f15bb136  retire legacy backend-ci.yml, centralize Docker
                 probe in SkipIfNoIntegration

CI status on the consolidated ci.yml workflow for 8f15bb136:
  Veza CI / Backend (Go)        OK 6m36s
  Veza CI / Frontend (Web)      OK 20m57s
  Veza CI / Rust (Stream)       OK 6m25s
  Security Scan / gitleaks      OK 4m13s
  Veza CI / Notify              skipped (fires only on failure)

First fully green CI run of the sprint and the first in a long
time overall. The tag v1.0.4 is cut on this state.

Refs: AUDIT_REPORT.md, all commits 7c9eece09..8f15bb136
2026-04-15 16:39:30 +02:00
senke
a007f4c7e4 fix(release): v1.0.2 — Conformité complète V1_SIGNOFF (21 critères)
Some checks failed
Backend API CI / test-unit (push) Failing after 0s
Backend API CI / test-integration (push) Failing after 0s
Frontend CI / test (push) Failing after 0s
Storybook Audit / Build & audit Storybook (push) Failing after 0s
- Couverture Go: script coverage_report.sh, 39% mesuré
- Vitest thresholds frontend 50%
- Load test WebSocket: CHAT_ORIGIN→backend, WS_URL=/api/v1/ws
- Tests: chat_service (WSUrl), password_service (hash/expired)
- V1_SIGNOFF: 14 PASS, 7 N/A documentés
- PERFORMANCE_BASELINE, RGPD, PWA tables v1.0.2
- Runbooks, Grafana, Secrets validés
2026-03-03 21:18:53 +01:00
senke
7ede202e95 fix(release): v1.0.1 — Conformité complète ROADMAP checklist
Some checks failed
Backend API CI / test-unit (push) Failing after 0s
Backend API CI / test-integration (push) Failing after 0s
Stream Server CI / test (push) Failing after 0s
- Sécurité: npm 0 CRITICAL, cargo audit 0 vulnérabilités
- OpenAPI: @Param id corrigé pour /tracks/quota/{id}
- Tests: Payment E2E passe, OAuth DATABASE_URL fallback
- Migrations: 000_mark_consolidated.sql
- veza-stream-server: prometheus 0.14, validator 0.19
- docs: SECURITY_SCAN_RC1, V1_SIGNOFF, PROJECT_STATE
2026-03-03 20:17:54 +01:00
senke
5cf305480c chore(release): bump VERSION to 1.0.0 — Commercial release 2026-03-03 19:54:04 +01:00
senke
330607aeb3 chore(release): v0.992 RC2 — Release notes, sign-off final 2026-03-03 19:53:41 +01:00
senke
5457d36515 chore: regenerate CHANGELOG, bump VERSION to 0.991 for RC1 2026-03-03 19:52:49 +01:00
senke
71525fdafb docs: update API_REFERENCE, CHANGELOG, FEATURE_STATUS, PROJECT_STATE for v0.803 2026-03-03 09:25:20 +01:00
senke
e118199637 chore(release): v0.981 — Beta (staging deploy, bug bash, smoke test) 2026-03-02 19:33:42 +01:00
senke
8138723eca chore(release): v0.971 — Phantom (gamification removal, WebRTC Beta, limits doc) 2026-03-02 19:25:37 +01:00
senke
c14b08a84e chore(release): v0.951 — Loadtest (500 req/s, 1000 WS, 50 uploads, perf indexes) 2026-03-02 19:22:38 +01:00
senke
2ef64037b5 docs: update documentation for v0.803 release 2026-02-25 20:04:37 +01:00
senke
a3624ce4b3 feat(v0.802): frontend Cloud/Gear, MSW, docs, scope v0.803, archive
- Cloud: CloudFileVersions, CloudShareModal, versions/share in CloudView
- Gear: GearDocumentsTab, GearRepairsTab, warranty badge, initialTab
- MSW: cloud versions/share, gear documents/repairs, tags suggest
- Stories: CloudFileVersions, CloudShareModal, GearDetailModal variants
- gearService: listDocuments, uploadDocument, deleteDocument, listRepairs, createRepair, deleteRepair
- cloudService: listVersions, restoreVersion, shareFile, getSharedFile
- gear_warranty_notifier: 24h ticker, notifications for expiring warranty
- tag_handler_test: unit tests
- docs: API_REFERENCE, CHANGELOG, PROJECT_STATE, FEATURE_STATUS v0.802
- SCOPE_CONTROL, .cursorrules: scope v0.803
- archive: V0_802_RELEASE_SCOPE, RETROSPECTIVE_V0802
2026-02-25 14:00:58 +01:00
senke
de7bd4bef8 docs: update CHANGELOG, PROJECT_STATE, FEATURE_STATUS for v0.801 2026-02-25 10:00:24 +01:00
senke
93666a3390 feat(v0.703): Go Live & Streaming Complet
- Backend: room creation for live streams, permissions CanJoin/CanSend/CanRead for stream rooms
- LiveViewChat: useLiveStreamChat hook, WebSocket connection, stream_id as room
- LiveViewPlayer: real-time viewer count via polling (5s)
- Media Session: seekbackward/seekforward handlers (10s step)
- GoLiveView.stories.tsx: Default, Loading, Error, StreamKeyVisible
- Docs: API_REFERENCE, CHANGELOG, PROJECT_STATE, FEATURE_STATUS, RETROSPECTIVE_V0703
- SCOPE_CONTROL, .cursorrules: update to v0.801
- Archive V0_703_RELEASE_SCOPE.md
2026-02-25 09:35:22 +01:00
senke
189e342c8d docs: update CHANGELOG, PROJECT_STATE, FEATURE_STATUS for v0.702 2026-02-24 00:21:20 +01:00
senke
022770ef9f feat(v0.701): AdminTransfers page/route, MSW, stories, Deep Health, API ref, docs, scope v0.702
- Step 13: AdminTransfersPage, LazyAdminTransfers, route /admin/transfers
- Step 14: MSW handlers admin transfers
- Step 15: AdminTransfersView stories (Default, Empty, WithFailedTransfers, Error, Loading)
- Step 16-17: DeepHealth handler (disk, config), GET /health/deep
- Step 19: health_deep_test.go (4 tests)
- Step 20: docs/API_REFERENCE.md
- Step 21: Archive V0_604, MIGRATIONS.md migration 116
- Step 22: CHANGELOG, PROJECT_STATE, FEATURE_STATUS v0.701
- Step 23: RETROSPECTIVE_V0701, V0_702 placeholder, SCOPE_CONTROL, .cursorrules
- Step 24: Archive V0_701_RELEASE_SCOPE
- Fix: AdminTransfersView Select component (use options API)
2026-02-23 23:42:02 +01:00
senke
6f20e113f6 docs: update PROJECT_STATE, FEATURE_STATUS, CHANGELOG for v0.603 2026-02-23 22:59:38 +01:00
senke
b319b60396 chore(release): v0.602 — Payout, Dette Technique & Tests E2E
- Stripe Connect: onboarding, balance, SellerDashboardView
- Interceptors: auth.ts, error.ts extracted, facade
- Grafana: dashboards enriched (p50, top endpoints, 4xx, WS, commerce)
- E2E commerce: product->order->review->invoice
- SMOKE_TEST_V0602, RETROSPECTIVE_V0602, PAYOUT_MANUAL
- Archive V0_602 scope, V0_603 placeholder, SCOPE_CONTROL v0.603
- Fix sanitizer regex (Go no backreferences)
- Marketplace test schema: product_licenses, product_images, orders, licenses
2026-02-23 22:32:01 +01:00
senke
d08f00d8da docs(v0.503): finalization, documentation, changelog, tag
- Update FEATURE_STATUS.md: HLS Streaming -> Opérationnel (v0.503)
- Update PROJECT_STATE.md: v0.503 delivered, next version v0.601
- Add CHANGELOG.md v0.503 entry with all changes
- Create SMOKE_TEST_V0503.md validation checklist
- Create RETROSPECTIVE_V0503.md
- Archive V0_503_RELEASE_SCOPE.md to docs/archive/
- Create V0_601_RELEASE_SCOPE.md placeholder
- Update SCOPE_CONTROL.md references to v0.601
- Update .cursorrules scope to v0.601
2026-02-22 21:28:46 +01:00
senke
b162589f4d docs(v0.502): Sprint 6 -- finalization, docs, and tag
- Update PROJECT_STATE.md: v0.502 delivered, next version v0.503
- Update CHANGELOG.md: comprehensive v0.502 entry (Added/Changed/Removed/Infrastructure)
- Create SMOKE_TEST_V0502.md: validation checklist for chat rewrite
- Create RETROSPECTIVE_V0502.md: retrospective with metrics and action items
- Archive V0_502_RELEASE_SCOPE.md to docs/archive/
- Create V0_503_RELEASE_SCOPE.md placeholder
- Update SCOPE_CONTROL.md and .cursorrules to reference v0.503
2026-02-22 20:51:55 +01:00
senke
4bec537766 docs(v0.501): Sprint 6 -- finalization and tag
- FIN-01: Add smoke test results (22/22 features pass)
- FIN-02: Update PROJECT_STATE.md for v0.501
- FIN-03: Update CHANGELOG.md with v0.501 entries
- FIN-04: Archive V0_501 scope, create V0_502 placeholder
- FIN-05: Add v0.501 retrospective
- FIN-06: Validate Go build passes
2026-02-22 18:45:07 +01:00
senke
bce563beb5 docs: add v0.404 CHANGELOG and retrospective
FIN-05 + FIN-06: Complete CHANGELOG for v0.404 with all security,
infrastructure, code quality, documentation, testing, and integration
changes. Retrospective includes pre/post scores (4.2 -> 6.6/10).
2026-02-22 17:57:49 +01:00
senke
c97ebe70e7 test(marketplace): add MSW handlers, update CHANGELOG and docs for v0.401 2026-02-22 14:23:28 +01:00
senke
b517258ef5 feat(chat): add call signaling types 2026-02-22 03:46:10 +01:00
senke
c918e0204d docs: update FEATURE_STATUS, PROJECT_STATE, CHANGELOG for v0.302 2026-02-22 03:24:01 +01:00
senke
fd606a6234 docs: préparation v0.302 - V0_302_RELEASE_SCOPE, PROJECT_STATE, SCOPE_CONTROL, FEATURE_STATUS, CHANGELOG 2026-02-21 05:42:16 +01:00
senke
f145ff740b docs: update FEATURE_STATUS, PROJECT_STATE, CHANGELOG for v0.301 2026-02-21 05:32:29 +01:00
senke
95aa9682d7 docs: update FEATURE_STATUS, PROJECT_STATE, CHANGELOG for v0.203 2026-02-20 18:47:23 +01:00
senke
b5fe6e8fd1 feat(release): v0.202 — Lots G, H, F, C, D
- Lot G: Recherche avancée (musical_key, tri pertinence, autocomplete, facettes, historique)
- Lot H: Analytics créateur (stats, charts, completion rate, export CSV/JSON)
- Lot F: Seller dashboard (GET /sell/stats, liste produits)
- Lot C: Player (crossfade, gapless preload, PiP)
- Lot D2: Autoplay (GET /tracks/recommendations, section À écouter ensuite)

Backend: GetRecommendations handler, route /tracks/recommendations
Frontend: PlayerQueue recommendations, fix TS errors (GlobalPlayer, AnalyticsViewKpiGrid, etc.)
Docs: FEATURE_STATUS, PROJECT_STATE, CHANGELOG, SCOPE_CONTROL
2026-02-20 18:16:17 +01:00
senke
992e93cd23 chore: finalize v0.201 docs (CHANGELOG, FEATURE_STATUS, PROJECT_STATE, SCOPE_CONTROL) 2026-02-20 15:44:30 +01:00
senke
a11f8e526a chore(v0.103): finalize release — CHANGELOG, FEATURE_STATUS, .cursorrules scope 2026-02-20 15:14:25 +01:00
senke
4af1008200 docs: add CHANGELOG v0.102 release notes; test(e2e): add queue flow tests 2026-02-20 12:57:26 +01:00
okinrev
5817132793 docs(remediation): add audit report, remediation plan and changelog skeleton 2025-12-06 13:25:54 +01:00