Skip to content

Add progressive controls and a focused effect workspace - #7

Merged
Artsen merged 2 commits into
mainfrom
feat/progressive-effect-controls
Jul 28, 2026
Merged

Add progressive controls and a focused effect workspace#7
Artsen merged 2 commits into
mainfrom
feat/progressive-effect-controls

Conversation

@Artsen

@Artsen Artsen commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Summary

  • add two-level video-effect customization with approachable Basic controls and exact Advanced controls
  • add a nonlinear Basic Intensity macro that resolves into canonical Recipe v2 strength, activity, envelope, and variation fields
  • add keyboard-accessible burst-length bounds with source-frame-rate seconds context
  • preserve every PR6 timing, cooldown, envelope, range, strength, and variation control in semantic Advanced disclosures
  • track Basic-derived versus Custom advanced ownership in frontend state, with explicit Reset to Basic behavior
  • add deliberate root-seed regeneration for all stochastic effect patterns without re-uploading or rendering
  • add registry-owned, effect-specific Basic profiles plus strict resolver and bounded inference APIs
  • add schedule affected-time summaries and Jump to next scheduled glitch preview navigation

Compatibility

  • application version is 0.3.1
  • Recipe schema versions remain 1 and 2
  • managed manifest schema remains v2
  • storage schema remains v2
  • video-job contract remains v2
  • Recipe v1 rendering and golden-frame regressions are unchanged
  • existing canonical Recipe v2 behavior and deterministic schedules are unchanged when exact fields and seed are unchanged
  • existing persisted Recipe v2 jobs and outputs remain valid without migration
  • image mode remains Recipe v1 and does not expose video timing macros
  • telemetry, cancellation, restart recovery, audio handling, streaming, storage, and loopback-only behavior remain unchanged

Basic control contract

  • BasicEffectControlContract version 1 strictly accepts effect type, Basic Intensity 0?100, integer duration bounds, an optional source range, and an optional regeneration request
  • Basic Intensity is an overall amount macro; Recipe v2 intensity remains Advanced Visual Strength from 0 through 1
  • Basic profiles use a smoothstep response and effect-specific strength, frequency, cooldown, envelope, and variation mappings
  • horizontal glitch, frame shift, color bleed, pixelation, and flicker resolve to distinct sporadic behaviors
  • noise, static, and scan lines primarily scale strength and preserve their natural continuous behavior
  • user burst bounds remain exact canonical Recipe v2 frame values; the existing scheduler chooses event durations deterministically
  • Basic effect profile version 1 is registry-owned and exposed by GET /api/effects and /metadata
  • POST /api/effects/resolve-basic is pure, deterministic, media-independent, non-persisting, and produces strict Recipe v2-compatible fields
  • POST /api/effects/infer-basic performs a cached, bounded 101-value search and reports exact, approximate, or custom state without mutating input
  • persisted recipes store exact resolved fields and root seed, never the macro, inferred value, UI state, schedule, or profile metadata

UI behavior

  • enabled video effects show Basic Intensity, synchronized range/number input, burst bounds, a natural-language exact summary, and frame-rate context by default
  • Advanced controls use semantic <details> and expose Visual Strength, timing mode, source range, frequency, durations, cooldowns, attack/release, curve, variation, smooth period, and seed
  • Advanced edits mark the effect Custom; closing the disclosure preserves values
  • Reset to Basic explicitly replaces custom fields; moving Basic Intensity is also an explicit replacement
  • invalid duration order is reported inline and associated with both number inputs
  • Regenerate all effect patterns changes only the root seed, refreshes schedule and still preview, and does not re-upload, persist, or submit a render
  • schedule and preview work remains debounced, abortable, and revision guarded; previous valid results remain visible while updates arrive
  • Jump to next scheduled glitch uses inspected sporadic events and wraps with explicit messaging
  • responsive controls stack at mobile widths and remain keyboard accessible

Workspace revision

  • replace the all-controls-at-once video screen with a focused effects rail, media-first preview, selected-effect inspector, and full-width render dock
  • adopt the Web Video Optimizer family grammar through a precision-slate token system, system typography, iris selection, ember transformation actions, and green completion states while retaining GlitchCraft's own mark, vocabulary, Flask routes, and dependency-free implementation
  • separate effect enablement from selection; disabled effects remain selectable and preserve their settings
  • keep all effect panels mounted while non-selected panels are hidden and inert, preserving Basic, Appearance, Advanced, and Custom state without duplicate IDs
  • provide explicit empty, loading, ready, recoverable-error, processing, cancellation, and completed states without collapsing workspace geometry
  • isolate metadata and per-effect resolver failures, support local retry, abort stale resolutions, and block submission only when an unresolved effect is enabled
  • retain the last valid still preview while metadata or preview refreshes fail
  • use desktop three-region geometry, an intermediate rail-plus-stack layout, and accessible Preview/Effects/Inspector/Render navigation below 800px
  • add deterministic screenshot review for 14 desktop, medium, tablet, and mobile states
  • document the interface system, DOM/state boundaries, responsive behavior, resilience rules, and review workflow

Validation

  • Python: 330 tests passed
  • statement coverage: 3,755 / 3,865 (97.15%)
  • branch coverage: 749 / 818 (91.56%)
  • combined coverage: 96.18%
  • Ruff format and lint: passed
  • strict Mypy: passed for 38 source files
  • repository consistency, JavaScript syntax, and git diff --check: passed
  • Playwright Chromium: 13 workflows passed, including image compatibility, progressive controls, focused selection, metadata and resolver failures, stale responses, preview retention, telemetry, cancellation, six responsive viewport sizes, keyboard behavior, and geometry
  • Axe: zero serious or critical findings in covered image and focused-video workflows
  • deterministic UI review: 14 screenshots generated and manually inspected across 1440?900, 1024?768, 768?1024, and 390?844 states; automated containment also covers 1280?720 and 360?800
  • request invariants: one metadata request and eight initial resolver requests; effect selection adds no network requests
  • performance assertions: shell and first-inspector readiness remain below 1.5 seconds, and local effect selection remains below 100 milliseconds in the browser harness
  • real FFmpeg/FFprobe integration: the marked test passed with two real processing jobs; Recipe v2 H.264/yuv420p processing preserved AAC and Recipe v1 audio removal remained valid
  • resolver matrix: all eight effects passed at 0, 25, 50, 75, and 100 with monotonic bounded strength and coherent activity/cooldown behavior
  • burst ranges: equal, short, long, lower/upper bounds, envelope safety, fractional-frame-rate display, deterministic duration selection, restart determinism, seed changes, and effect isolation passed
  • inference: every supported effect round-trips exactly; approximate strength, custom timing, custom fields, and non-mutation passed
  • Recipe v1 and Recipe v2 compatibility regressions passed; backend temporal compilation and rendering code are unchanged by the workspace revision
  • resolver performs no media decoding, FFmpeg work, schedule compilation, or per-frame processing; resolved recipes add no render overhead
  • GitHub Actions: quality and browser passed for commit 866f716

Known limitations

  • Basic Intensity is a profile-driven macro and each effect intentionally maps it differently
  • custom Advanced changes may no longer correspond to one exact Basic value
  • continuous natural effects do not use burst duration until timing is customized
  • the interface has no full timeline, draggable blocks, keyframes, presets, or manual-event UI; manual events remain API-only
  • preview remains a still frame rather than continuous playback
  • stateful feedback, optical flow, motion trails, and codec datamoshing remain deferred
  • the focused interface remains Flask/Jinja and dependency-free JavaScript; React remains deferred
  • one video worker remains the default
  • manifest writes remain single-process
  • no authentication exists and the application remains loopback-only

@Artsen Artsen changed the title Add basic effect intensity controls and progressive customization Add progressive controls and a focused effect workspace Jul 28, 2026
@Artsen
Artsen marked this pull request as ready for review July 28, 2026 07:29
@Artsen
Artsen merged commit 6c9334d into main Jul 28, 2026
2 checks passed
@Artsen
Artsen deleted the feat/progressive-effect-controls branch July 28, 2026 07:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant