38 KiB
| name | description |
|---|---|
| video-editing-config-and-flags | Load when inspecting, setting, adding, renaming, reviewing, or debugging video-clipping.*, Spring profiles, scheduler/render guards, adapter selectors, filesystem paths, retention, local CV or local asset worker settings, their environment-variable mappings, or configuration-default drift. Use before any configuration or production-default change. |
Video Editing Configuration and Flags
Use this runbook to determine the effective configuration before starting the service or changing behavior. Treat every value below as repository state verified on 2026-07-21, not as a production endorsement.
Scope and routing
Use this skill for property ownership, precedence, defaults, environment mappings, validation, and flag-change review.
Do not use it to:
- start or operate a workflow; use
video-editing-run-and-operate; - rebuild local environments or provision models; use
video-editing-build-and-env; - diagnose a failed render or worker; use
video-editing-debugging-playbookandvideo-editing-diagnostics-and-tooling; - decide whether a behavior change may ship; use
video-editing-change-control; - judge output quality; use
video-editing-validation-and-qa.
Definitions used here:
| Term | Meaning |
|---|---|
| Java default | Field initializer in VideoClippingProperties; applies when no higher-precedence source supplies the key. |
| Packaged effective default | Value obtained from packaged application.properties plus application.yml with no profile and no environment override. This is what a plain service start sees. |
| Guard | Spring condition or runtime test that enables a component or destructive action. |
| Adapter selector | String property used by @ConditionalOnProperty to choose one implementation. |
| Pre-provisioned | Dependency, executable, model, and licensed asset already present in the runtime image/filesystem; startup must not fetch it. |
| Fail-closed | Missing or invalid required capability prevents processing or promotion; it must not silently substitute lower-quality output. |
Non-negotiable configuration policy
Enforce these user-supplied constraints for every environment:
- Prohibit automatic dependency or model downloads, external AI services, network access, unlicensed assets, placeholder silence or tones, and unapproved rendering.
- Do not change a production-facing default without
video-editing-change-control, an ADR-style decision record, tests, rollback instructions, and environment impact analysis. - Provision local models and dependencies before runtime. Pin their identity and checksum outside behavioral configuration, then verify them before accepting work.
- Production startup now fails under
strict-runtime=truewhen Piper, MusicGen, AudioGen, their local paths, or the Python stack are absent. Keep that behavior and add license/checksum manifest verification before calling the runtime certified. - Keep all automatic render controls disabled and require an approval artifact at the render boundary.
- Do not run
tools/run_local_cv_worker.shortools/run_local_asset_worker.shwith their current defaultBOOTSTRAP_MODE=autoin a network-prohibited runtime. Both scripts can create virtualenvs and invokepip; the CV script can also make Ultralytics resolve/downloadyolov8n.pt.
Resolve the effective value
Use Spring Boot precedence: command-line arguments and environment-derived properties override packaged config; profile files override non-profile packaged files. This repository also embeds explicit ${CUSTOM_ENV:default} placeholders in application.yml.
Follow this procedure:
- Record active profiles and all
VIDEO_EDITING_*,FOLDER_SCHEDULER_*,LOCAL_ASSET_*, andLOCAL_CV_*variables without exposing secrets. - Locate the key in
application-<profile>.*, thenapplication.yml, thenapplication.properties, then the Java initializer. - Check the component guard below. A bound value can exist while its component is absent.
- Check whether Java and packaged defaults differ. Packaged configuration wins in a normal application start.
- For a generic Spring environment override, convert dots and hyphens to underscores and uppercase, for example
video-clipping.cleanup.enabledtoVIDEO_CLIPPING_CLEANUP_ENABLED. Prefer an explicit placeholder already present inapplication.yml; it documents the supported operational name.
Read configuration without starting the service:
sed -n '1,220p' src/main/resources/application.properties
sed -n '1,220p' src/main/resources/application.yml
sed -n '1,220p' src/main/resources/application-jpa.properties
sed -n '1,160p' src/main/resources/application-cinematic-editing-local.yml
sed -n '1,160p' src/main/resources/application-folder-scheduler-local.yml
sed -n '1,220p' src/test/resources/application.properties
Critical drift: plain startup is unsafe
The packaged effective defaults activate multiple independent consumers and local bootstrap paths:
| Axis | Java default | Packaged effective default | Risk/status |
|---|---|---|---|
| folder scheduler enabled | false |
true |
Consumes files under ./input/source. Unsafe for an exploratory start. |
| editing enabled | true |
true |
Creates editing components and starts runtime checks. |
| local director enabled | true |
true |
Polls editing input. Auto-render remains off in base config. |
| highlight scheduler enabled | true |
true |
Polls and moves highlight sources. |
| highlight render enabled | false |
false |
Render scan is fail-closed by default. |
| highlight approval required | true |
true |
Requires the configured flag when rendering is explicitly enabled; the bare flag is not production authorization. |
| visual provider | heuristic |
local-cv |
Packaged YAML selects the local HTTP adapter. |
| visual heuristic fallback | true |
true |
Quality may degrade without failing. Not production-ready. |
| local CV auto-start | false |
true |
Launches bootstrap script, which may install/download. Prohibited at runtime. |
| local asset auto-start | false |
true |
Runs resident-runtime verification at application startup; it no longer invokes the bootstrap script. |
| local asset strict runtime | false |
true |
Throws at startup when required local binaries, Python imports, model paths, or adjacent model-license sidecars are missing. |
| local director auto-render | false |
false |
Safe in base config. |
| local director approval required | true |
true |
Approval applies only if auto-render is enabled. |
The cinematic-editing-local profile sets local-director auto-render to true while requiring approved.flag. Treat the profile as a local workflow convenience, not a production profile. The folder-scheduler-local profile enables folder segmentation. Never activate either without checking the input directories.
Complete application property catalog
Notation: J is the Java default; P is the packaged effective default when it differs. @Min is the only bean-validation constraint currently declared. Values without @Min generally lack startup validation.
API, adapters, S3, queue, and processing
| Property | J / P default | Meaning, values, guard |
|---|---|---|
video-clipping.max-file-size-bytes |
53687091200 |
Max declared source size; @Min(1). |
video-clipping.multipart-part-size-bytes |
104857600 |
Multipart chunk size; @Min(5242880). |
video-clipping.upload-url-ttl-minutes |
60 |
Upload URL lifetime; @Min(1). |
video-clipping.download-url-ttl-minutes |
15 |
Download URL lifetime; @Min(1). |
video-clipping.allowed-content-types |
video/mp4, video/quicktime, video/webm |
Boundary allow-list; no non-empty validation. |
video-clipping.repository |
no Java field / memory |
Conditional selector only: memory (also match-if-missing) or jpa. It is present in packaged properties but absent from VideoClippingProperties. |
video-clipping.storage |
memory |
memory (also match-if-missing) or s3; other values leave no storage adapter. |
video-clipping.queue |
memory |
memory (also match-if-missing) or db; db enables polling and queue metrics. |
video-clipping.processing |
stub |
stub (also match-if-missing) or ffmpeg; stub is not production output. |
video-clipping.s3.region |
us-east-1 |
S3 client region. |
video-clipping.s3.bucket |
video-clipping-dev |
Object bucket; development name is not a production default. |
video-clipping.s3.endpoint |
unset | Optional endpoint override. |
video-clipping.s3.path-style |
true |
Path-style addressing. |
video-clipping.database-queue.poll-interval-ms |
1000 |
Database queue scheduled delay; @Min(100). |
video-clipping.database-queue.batch-size |
5 |
Max messages claimed per poll; @Min(1). |
video-clipping.database-queue.visibility-timeout-ms |
900000 |
Expired-claim threshold; @Min(1000). |
video-clipping.database-queue.max-attempts |
3 |
Dead-letter threshold; @Min(1). |
video-clipping.database-queue.retry-backoff-ms |
5000 |
Retry delay; @Min(0). |
video-clipping.quotas.max-active-jobs-per-tenant |
5 |
Active-job admission cap; 0 is permitted and rejects all new active work; @Min(0). |
application-jpa.properties selects repository=jpa, queue=db, and processing=stub, then configures an H2 database in PostgreSQL compatibility mode with Flyway and Hibernate validation. It is not a PostgreSQL production profile.
Packaged Spring/platform settings are also configuration axes:
| Property | Packaged value | Status |
|---|---|---|
spring.application.name |
video-clipping-service |
Service identity. |
spring.mvc.problemdetails.enabled |
true |
Enables Spring Problem Details handling. |
management.endpoints.web.exposure.include |
health,info,metrics,prometheus |
Exposure is not the same as authorization; production must secure management endpoints. |
spring.jpa.open-in-view |
false |
Deliberate persistence boundary. |
logging.level.org.example.videoclips.folder |
INFO |
Base YAML; explicit env FOLDER_SCHEDULER_LOG_LEVEL. |
spring.datasource.url/driver-class-name/username/password |
H2 memory URL / H2 driver / sa / empty |
application-jpa.properties only; development/test convenience. |
spring.jpa.hibernate.ddl-auto / spring.jpa.show-sql |
validate / false |
JPA profile schema validation and SQL logging. |
spring.flyway.enabled |
true |
JPA profile migration control. |
Classify selectors and modes conservatively:
| Classification | Current values |
|---|---|
| Development/test only | repository=memory, storage=memory, queue=memory, processing=stub, H2 JPA profile, heuristic analysis, all local convenience profiles. |
| Experimental/unsafe for promoted output | heuristic fallback, network-capable local-CV auto-bootstrap, named/defaulted YOLO analysis, non-strict asset readiness, and any explicitly enabled render path whose approval is not authenticated and digest-bound. Historical Python/Java placeholder-audio fallbacks are removed in the 2026-07-21 working tree. |
| Production candidates requiring evidence | repository=jpa with real PostgreSQL, storage=s3, queue=db, processing=ffmpeg, pre-provisioned local CV/assets/director. Candidate means not certified by this repository. |
API FFmpeg workspace, cleanup, and retention
| Property | J / P default | Meaning and validation |
|---|---|---|
video-clipping.ffmpeg.ffmpeg-binary |
ffmpeg |
API clipper executable. |
video-clipping.ffmpeg.input-directory |
./tmp/ffmpeg-input |
Materialized source workspace. |
video-clipping.ffmpeg.output-directory |
./tmp/ffmpeg-output |
Generated clip workspace. |
video-clipping.ffmpeg.exact-preset |
veryfast |
FFmpeg encoding preset used by the API clipper; absent from packaged config, so the Java default applies. |
video-clipping.ffmpeg.cleanup-local-files |
true |
Per-job worker cleanup control. |
video-clipping.cleanup.enabled |
true |
Runtime check inside both scheduled cleanup jobs; jobs still wake when false. |
video-clipping.cleanup.local-artifact-poll-interval-ms |
300000 |
Local cleanup delay; @Min(30000). |
video-clipping.cleanup.local-artifact-retention-hours |
24 |
Age for FFmpeg and fixed temporary roots; @Min(1). |
video-clipping.cleanup.retention-poll-interval-ms |
3600000 |
storage/repository cleanup delay; @Min(30000). |
video-clipping.cleanup.source-retention-hours |
168 |
Expiry assigned to new source assets; @Min(1). |
video-clipping.cleanup.clip-retention-hours |
168 |
Expiry assigned to clips; @Min(1). |
Local artifact cleanup also targets fixed tmp/in-memory-storage and tmp/stub-output; those roots are not configurable. Relative paths resolve from the process working directory. Validate mount ownership, capacity, backups, retention, and path separation on macOS, Linux/VPS, and cloud runtimes.
Folder segmentation scheduler
| Property | J / P default | Meaning and validation |
|---|---|---|
video-clipping.folder-scheduler.enabled |
J false; P true |
Creates initializer, validator, clipper, and poller. |
.input-directory |
J /input/source; P ./input/source |
Inbox; scheduler moves candidates. Env: FOLDER_SCHEDULER_INPUT_DIRECTORY. |
.output-directory |
J /output/clips; P ./output/clips |
Segmented output. Env: FOLDER_SCHEDULER_OUTPUT_DIRECTORY. |
.processed-directory |
J /input/processed; P ./input/processed |
Successful source destination. Env: FOLDER_SCHEDULER_PROCESSED_DIRECTORY. |
.rejected-directory |
J /input/rejected; P ./input/rejected |
Failed source destination. Env: FOLDER_SCHEDULER_REJECTED_DIRECTORY. |
.working-directory |
J /input/working; P ./input/working |
Claimed source directory. Env: FOLDER_SCHEDULER_WORKING_DIRECTORY. |
.poll-interval-ms |
5000 |
Initial/fixed delay; @Min(1000). Env: FOLDER_SCHEDULER_POLL_INTERVAL_MS. |
.segment-duration-seconds |
8 |
Segment target; @Min(1); no explicit env placeholder. |
.ffmpeg-binary / .ffprobe-binary |
ffmpeg / ffprobe |
Executables; no explicit env placeholders. |
.output-container / .exact-preset |
mp4 / veryfast |
FFmpeg output choices; no enum/allow-list validation. |
.preserve-input-quality |
true |
Selects preservation behavior. Env: FOLDER_SCHEDULER_PRESERVE_INPUT_QUALITY. |
FOLDER_SCHEDULER_ENABLED controls the packaged guard; FOLDER_SCHEDULER_LOG_LEVEL controls only org.example.videoclips.folder logging.
Editing, render, analysis, and assets
All keys below start with video-clipping.editing.
| Suffix | J / P default | Meaning / explicit environment variable |
|---|---|---|
.enabled |
true |
Master component guard; VIDEO_EDITING_ENABLED. |
.project-directory |
./output/edit-projects |
Multi-clip projects; VIDEO_EDITING_PROJECT_DIRECTORY. |
.highlight-project-directory |
./output/highlight-projects |
Single-source projects; VIDEO_EDITING_HIGHLIGHT_PROJECT_DIRECTORY. |
.ffmpeg-binary / .ffprobe-binary |
ffmpeg / ffprobe |
Editing executables; VIDEO_EDITING_FFMPEG_BINARY, VIDEO_EDITING_FFPROBE_BINARY. |
.thumbnail-count-per-clip / .contact-sheet-columns |
5 / 5 |
Inspection density; each @Min(1); matching VIDEO_EDITING_* variable. |
.proxy-enabled / .proxy-width |
true / 640 |
Proxy generation and width; width @Min(1); matching VIDEO_EDITING_* variable. |
.scene-detection-threshold |
0.35 |
FFmpeg scene threshold; no range validation; VIDEO_EDITING_SCENE_DETECTION_THRESHOLD. |
.minimum-scene-duration-seconds |
1.0 |
Segment merge threshold; no validation; VIDEO_EDITING_MINIMUM_SCENE_DURATION_SECONDS. |
.silence-threshold-db / .silence-minimum-duration-seconds |
-35.0 / 0.5 |
Source audio analysis; no validation; matching VIDEO_EDITING_* variable. |
.target-duration-seconds |
600 |
Multi-clip target; @Min(1); VIDEO_EDITING_TARGET_DURATION_SECONDS. |
.output-width / .output-height / .output-frame-rate |
1920 / 1080 / 30 |
Render geometry/rate; each @Min(1); matching VIDEO_EDITING_* variable. |
.audio-sample-rate |
48000 |
Render audio rate; @Min(1); VIDEO_EDITING_AUDIO_SAMPLE_RATE. |
.video-bitrate / .audio-bitrate |
12000k / 192k |
FFmpeg bitrate strings; no format validation; matching VIDEO_EDITING_* variable. |
.voiceover-provider |
local |
Bound and tested but not consumed by main Java code; it is not a working remote-provider selector. Env: VIDEO_EDITING_VOICEOVER_PROVIDER. External AI is prohibited. |
.loudness-target-i / .loudness-true-peak / .loudness-range |
-16.0 / -1.5 / 11.0 |
loudnorm parameters; no range validation; matching VIDEO_EDITING_* variable. |
.music-ducking-threshold / .music-ducking-ratio |
0.045 / 8.0 |
sidechaincompress parameters; no range validation; matching VIDEO_EDITING_* variable. |
.music-ducking-attack-ms / .music-ducking-release-ms |
20 / 250 |
Ducking timing; each @Min(1); matching VIDEO_EDITING_* variable. |
.assets.music-folder |
./input/highlights/assets/music |
Intended location for approved, licensed local music; directory membership is not license proof. VIDEO_EDITING_ASSETS_MUSIC_FOLDER. |
.assets.sfx-folder |
./input/highlights/assets/sfx |
Intended location for approved, licensed local SFX; directory membership is not license proof. VIDEO_EDITING_ASSETS_SFX_FOLDER. |
.assets.fonts-folder |
./input/highlights/assets/fonts |
Intended location for approved, licensed local fonts; directory membership is not license proof. VIDEO_EDITING_ASSETS_FONTS_FOLDER. |
.assets.luts-folder |
./input/highlights/assets/luts |
Intended location for approved, licensed local LUTs; directory membership is not license proof. VIDEO_EDITING_ASSETS_LUTS_FOLDER. |
.assets.voiceover-folder |
./output/highlight-projects/_voiceover-cache |
Generated voiceover cache; VIDEO_EDITING_ASSETS_VOICEOVER_FOLDER. |
Treat render, loudness, ducking, scene, and duration changes as output behavior changes. Require objective measurements and representative media evidence; configuration binding tests alone are insufficient.
Exact environment names for grouped editing rows:
| Property suffixes | Environment variables, in the same order |
|---|---|
.thumbnail-count-per-clip, .contact-sheet-columns |
VIDEO_EDITING_THUMBNAIL_COUNT_PER_CLIP, VIDEO_EDITING_CONTACT_SHEET_COLUMNS |
.proxy-enabled, .proxy-width |
VIDEO_EDITING_PROXY_ENABLED, VIDEO_EDITING_PROXY_WIDTH |
.silence-threshold-db, .silence-minimum-duration-seconds |
VIDEO_EDITING_SILENCE_THRESHOLD_DB, VIDEO_EDITING_SILENCE_MINIMUM_DURATION_SECONDS |
.output-width, .output-height, .output-frame-rate |
VIDEO_EDITING_OUTPUT_WIDTH, VIDEO_EDITING_OUTPUT_HEIGHT, VIDEO_EDITING_OUTPUT_FRAME_RATE |
.video-bitrate, .audio-bitrate |
VIDEO_EDITING_VIDEO_BITRATE, VIDEO_EDITING_AUDIO_BITRATE |
.loudness-target-i, .loudness-true-peak, .loudness-range |
VIDEO_EDITING_LOUDNESS_TARGET_I, VIDEO_EDITING_LOUDNESS_TRUE_PEAK, VIDEO_EDITING_LOUDNESS_RANGE |
.music-ducking-threshold, .music-ducking-ratio |
VIDEO_EDITING_MUSIC_DUCKING_THRESHOLD, VIDEO_EDITING_MUSIC_DUCKING_RATIO |
.music-ducking-attack-ms, .music-ducking-release-ms |
VIDEO_EDITING_MUSIC_DUCKING_ATTACK_MS, VIDEO_EDITING_MUSIC_DUCKING_RELEASE_MS |
Visual analysis and local CV worker
All keys start with video-clipping.editing.visual-analysis.
| Suffix | J / P default | Meaning / explicit environment variable |
|---|---|---|
.provider |
J heuristic; P local-cv |
Recognized routing is local-cv; any other value uses heuristic. Env: VIDEO_EDITING_VISUAL_ANALYSIS_PROVIDER. |
.endpoint |
http://127.0.0.1:8091/v1/analyze-visuals |
Current local HTTP endpoint. Loopback is network, so this is a noncompliant implementation gap, not an approved certified path. Env: VIDEO_EDITING_VISUAL_ANALYSIS_ENDPOINT. |
.timeout-ms |
30000 |
Total HTTP call timeout; @Min(1). Env: VIDEO_EDITING_VISUAL_ANALYSIS_TIMEOUT_MS. |
.fallback-to-heuristic |
true |
On local-CV failure, return weaker heuristic analysis. Must be false in the fail-closed production target. Env: VIDEO_EDITING_VISUAL_ANALYSIS_FALLBACK_TO_HEURISTIC. |
.local-cv-worker.auto-start |
J false; P true |
Starts script only when provider is local-cv. Runtime auto-start/bootstrap is prohibited. Env: VIDEO_EDITING_LOCAL_CV_WORKER_AUTO_START. |
.local-cv-worker.script |
./tools/run_local_cv_worker.sh |
Launched executable. Env: VIDEO_EDITING_LOCAL_CV_WORKER_SCRIPT. |
.local-cv-worker.startup-wait-ms |
0 |
0 skips health waiting; otherwise timeout; @Min(0). Env: VIDEO_EDITING_LOCAL_CV_WORKER_STARTUP_WAIT_MS. |
.local-cv-worker.health-path |
/health |
Health URI path. Env: VIDEO_EDITING_LOCAL_CV_WORKER_HEALTH_PATH. |
.local-cv-worker.health-check-interval-ms |
1000 |
Readiness poll and per-call cap; @Min(1). Env: VIDEO_EDITING_LOCAL_CV_WORKER_HEALTH_CHECK_INTERVAL_MS. |
Worker-only environment variables are not Spring properties:
| Variable | Default/source | Effect and policy |
|---|---|---|
LOCAL_CV_HOST, LOCAL_CV_PORT |
127.0.0.1, 8091; manager derives both from endpoint |
Uvicorn bind address/port. Keep local to the service trust boundary. |
LOCAL_CV_BOOTSTRAP_MODE |
auto |
always or first-use auto invokes pip. Runtime must use a pre-provisioned path/mode that cannot install. |
LOCAL_CV_PRELOAD_ONLY |
false |
Exit after bootstrap/model preload. Preload can still download. |
LOCAL_CV_YOLO_MODEL |
yolov8n.pt |
Ultralytics model path/name. A name can trigger model retrieval; production must supply a verified local path. |
LOCAL_CV_DISABLE_YOLO |
false |
Skips YOLO and returns weaker/default labels. Experimental/debug only, never production-quality success. |
LOCAL_CV_LOG_LEVEL |
INFO |
Python worker logging level. |
The worker health response reports library availability but returns HTTP 200 even if OpenCV or YOLO is absent. Do not equate /health success with production analysis readiness.
Local asset runtime
All keys start with video-clipping.editing.local-asset-worker.
| Suffix | J / P default | Meaning / explicit environment variable |
|---|---|---|
.auto-start |
J false; P true |
Runs bootstrap verification, not a persistent asset server. Must be false at production runtime under the no-download rule. Env: VIDEO_EDITING_LOCAL_ASSET_WORKER_AUTO_START. |
.strict-runtime |
J false; P true |
Makes startup fail when the pre-provisioned local asset runtime is incomplete. It requires adjacent nonblank model-license sidecars but does not verify authenticity, origin, checksums, or allowed use. Env: VIDEO_EDITING_LOCAL_ASSET_WORKER_STRICT_RUNTIME. |
.bootstrap-script |
./tools/run_local_asset_worker.sh |
Startup verifier command; VIDEO_EDITING_LOCAL_ASSET_BOOTSTRAP_SCRIPT. |
.script |
./tools/local_asset_worker.py |
Per-asset CLI worker; VIDEO_EDITING_LOCAL_ASSET_WORKER_SCRIPT. |
.startup-wait-ms |
0 |
Bound and tested but not consumed by current asset verifier/synthesizer; @Min(0). Env: VIDEO_EDITING_LOCAL_ASSET_WORKER_STARTUP_WAIT_MS. |
.health-path |
/health |
Bound and tested but no local asset HTTP server consumes it. Env: VIDEO_EDITING_LOCAL_ASSET_WORKER_HEALTH_PATH. |
.health-check-interval-ms |
1000 |
Bound and tested but unused; @Min(1). Env: VIDEO_EDITING_LOCAL_ASSET_WORKER_HEALTH_CHECK_INTERVAL_MS. |
.python-binary |
./.venv-local-asset/bin/python |
Python used for import readiness and worker invocation; VIDEO_EDITING_LOCAL_ASSET_PYTHON_BINARY. |
.piper-binary |
piper |
Voice model executable; VIDEO_EDITING_LOCAL_ASSET_PIPER_BINARY. |
.piper-model-path |
empty | Required in practice for Piper; VIDEO_EDITING_LOCAL_ASSET_PIPER_MODEL_PATH. |
.music-model |
musicgen-small |
AudioCraft model name; VIDEO_EDITING_LOCAL_ASSET_MUSIC_MODEL. A short name is normalized to facebook/<name> and may download. |
.sfx-model |
audiogen-medium |
AudioCraft model name; VIDEO_EDITING_LOCAL_ASSET_SFX_MODEL. A short name may download. |
Worker-only environment variables:
| Variable | Current behavior |
|---|---|
LOCAL_ASSET_BOOTSTRAP_MODE |
Script default auto; auto/always invokes pip. The Java verifier forcibly sets auto, overriding an inherited safer value. This blocks compliant runtime auto-start today. |
LOCAL_ASSET_PRELOAD_ONLY |
Java verifier sets true; script exits after dependency bootstrap. |
LOCAL_ASSET_PIPER_BINARY |
Java verifier passes configured binary; Python CLI also reads it by default. |
LOCAL_ASSET_PIPER_MODEL_PATH |
Java verifier exports it when nonblank; generation passes the configured model explicitly. |
LOCAL_ASSET_HOST, LOCAL_ASSET_PORT |
Script reads defaults 127.0.0.1:8092 but never uses them; there is no HTTP asset server. |
The Python and Java fallback success paths were removed in the 2026-07-21 working tree. Continue rejecting any generated asset whose production provenance, local model identity, checksum, license, and semantic fit are not verified; an audible WAV alone is insufficient.
Local director and highlight scheduler
| Property suffix | Default | Meaning / explicit environment variable |
|---|---|---|
.local-director.enabled |
true |
With editing enabled, polls multi-clip inbox; VIDEO_EDITING_LOCAL_DIRECTOR_ENABLED. |
.local-director.source/working/processed/rejected-directory |
./input/editing/<state> |
Move-based lifecycle; matching VIDEO_EDITING_LOCAL_DIRECTOR_*_DIRECTORY. |
.local-director.poll-interval-ms |
5000 |
Initial/fixed delay; @Min(1000); VIDEO_EDITING_LOCAL_DIRECTOR_POLL_INTERVAL_MS. |
.local-director.director-prompt-file-name |
ai-director-prompt.md |
Prompt artifact; VIDEO_EDITING_LOCAL_DIRECTOR_PROMPT_FILE_NAME. |
.local-director.expected-plan-file-name |
edit-plan.json |
Plan inbox filename; VIDEO_EDITING_LOCAL_DIRECTOR_EXPECTED_PLAN_FILE_NAME. |
.local-director.auto-render-when-plan-appears |
false |
Enables render after plan scan; VIDEO_EDITING_LOCAL_DIRECTOR_AUTO_RENDER. Keep false unless explicitly approved. |
.local-director.require-approval-before-render |
true |
Requires approval file when auto-rendering; VIDEO_EDITING_LOCAL_DIRECTOR_REQUIRE_APPROVAL. |
.local-director.approval-file-name |
approved.flag |
Approval artifact name; VIDEO_EDITING_LOCAL_DIRECTOR_APPROVAL_FILE_NAME. |
.highlight-scheduler.enabled |
true |
With editing enabled, enables both source and plan/render scanners; VIDEO_EDITING_HIGHLIGHT_SCHEDULER_ENABLED. |
.highlight-scheduler.source/working/processed/rejected-directory |
./input/highlights/<state> |
Move-based source lifecycle; matching VIDEO_EDITING_HIGHLIGHT_SCHEDULER_*_DIRECTORY. |
.highlight-scheduler.poll-interval-ms |
5000 |
Shared by source and render scanners; @Min(1000); VIDEO_EDITING_HIGHLIGHT_SCHEDULER_POLL_INTERVAL_MS. |
.highlight-scheduler.render-enabled |
false |
Runtime render scan gate; VIDEO_EDITING_HIGHLIGHT_SCHEDULER_RENDER_ENABLED. Keep false until the approval workflow is proven. |
.highlight-scheduler.require-director-approval |
true |
Requires director approval file before flow; VIDEO_EDITING_HIGHLIGHT_SCHEDULER_REQUIRE_DIRECTOR_APPROVAL. The bare file is not digest-bound authorization. |
.highlight-scheduler.approval-file-name |
approved.flag |
Approval artifact under director directory; VIDEO_EDITING_HIGHLIGHT_SCHEDULER_APPROVAL_FILE_NAME. |
.highlight-scheduler.max-highlights-per-source |
3 |
Plan item cap; @Min(1); VIDEO_EDITING_HIGHLIGHT_SCHEDULER_MAX_HIGHLIGHTS_PER_SOURCE. |
.highlight-scheduler.highlight-min-duration-seconds |
8.0 |
Lower duration clamp; @Min(1); matching environment variable. |
.highlight-scheduler.highlight-max-duration-seconds |
35.0 |
Upper duration clamp; @Min(1); matching environment variable. No validation ensures max >= min. |
Exact environment names for grouped scheduler rows:
| Property suffixes | Environment variables, in the same order |
|---|---|
.local-director.source/working/processed/rejected-directory |
VIDEO_EDITING_LOCAL_DIRECTOR_SOURCE_DIRECTORY, VIDEO_EDITING_LOCAL_DIRECTOR_WORKING_DIRECTORY, VIDEO_EDITING_LOCAL_DIRECTOR_PROCESSED_DIRECTORY, VIDEO_EDITING_LOCAL_DIRECTOR_REJECTED_DIRECTORY |
.highlight-scheduler.source/working/processed/rejected-directory |
VIDEO_EDITING_HIGHLIGHT_SCHEDULER_SOURCE_DIRECTORY, VIDEO_EDITING_HIGHLIGHT_SCHEDULER_WORKING_DIRECTORY, VIDEO_EDITING_HIGHLIGHT_SCHEDULER_PROCESSED_DIRECTORY, VIDEO_EDITING_HIGHLIGHT_SCHEDULER_REJECTED_DIRECTORY |
.highlight-scheduler.highlight-min/max-duration-seconds |
VIDEO_EDITING_HIGHLIGHT_SCHEDULER_HIGHLIGHT_MIN_DURATION_SECONDS, VIDEO_EDITING_HIGHLIGHT_SCHEDULER_HIGHLIGHT_MAX_DURATION_SECONDS |
Guards and coupled settings
| Behavior | Required condition | Additional gate |
|---|---|---|
| Folder segmentation | folder-scheduler.enabled=true |
None beyond input eligibility; it moves files. |
| Editing API/core | editing.enabled=true or missing |
Many editing beans use matchIfMissing=true. |
| Multi-clip director polling | editing and local-director enabled | Directory candidate rules. |
| Multi-clip auto-render | above plus auto-render-when-plan-appears=true |
Approval file only when require-approval-before-render=true. |
| Highlight ingestion | editing and highlight scheduler enabled | Moves one eligible video at a time. |
| Highlight plan rendering | same | render-enabled=true; approval only when require-director-approval=true. |
| Local CV process | editing enabled | provider exactly local-cv and worker auto-start true. |
| Local CV fallback | provider local-cv fails |
Returns heuristic only when fallback is true; otherwise throws. |
| Local asset readiness check | editing enabled | Local asset auto-start true; strict mode fails startup when readiness is incomplete. The bootstrap script is not invoked by this verifier. |
| Cleanup | scheduled unconditionally | Work skipped when cleanup enabled is false. |
| DB queue poller | queue=db |
Requires JPA repository/infrastructure coherence. |
Before changing one setting, inspect all settings in its row. In particular, enabling an approval boolean without disabling render during rollout leaves a race window unless deployment/configuration is atomic.
Profiles and tests
| Source | Overrides | Classification |
|---|---|---|
application.properties |
API defaults, adapters, S3, DB queue, FFmpeg workspace, quotas, cleanup, actuator exposure | Packaged base; currently development-oriented. |
application.yml |
Folder scheduler and complete editing tree | Packaged base; current all-on behavior is unsafe. |
application-jpa.properties |
JPA/db queue/stub plus H2, Flyway, Hibernate validation | Local/integration convenience, not production PostgreSQL. |
application-folder-scheduler-local.yml |
Enables local folder scheduler paths | Local only. |
application-cinematic-editing-local.yml |
Disables folder scheduler; enables editing/director auto-render with approval | Local only; rendering side effects. |
src/test/resources/application.properties |
Disables folder scheduler, director, highlight scheduler, CV auto-start, asset auto-start; sets asset strict false | Test safety override. |
src/test/resources/application-test.properties |
Disables folder scheduler only | Narrow test-profile override; do not assume it disables other consumers. |
VideoClippingPropertiesTest verifies most editing Java defaults and representative binding overrides. It does not exhaustively assert every top-level, folder, cleanup, queue, or highlight setting. Profile tests parse YAML values but do not prove safe runtime composition.
Production target, not current implementation
For macOS development, Linux/VPS production, and cloud infrastructure, converge through change control on this behavior:
- Ship one immutable, platform-neutral application artifact, then create signed platform-specific runtime/model/image bundles. Promote the same bundle unchanged between environments for the same OS/CPU target; inject paths and secrets externally.
- Disable every scheduler, worker auto-start, and render path by default. Enable only the deployed capability.
- Run local model workers as pre-provisioned supervised processes or explicit adapters with no installation/download code in the request/startup path.
- Replace model-worker HTTP with in-process calls or explicitly designed non-network IPC. Deny model/media inference networking, including loopback. Treat API, database, storage, and telemetry as separately approved production integrations.
- Require verified local model paths, checksums, licenses, writable/output mounts, capacity limits, and health that validates model readiness.
- Make missing FFmpeg, FFprobe, Python stack, Piper model, AudioCraft model, CV model, or licensed asset fail startup/readiness for any enabled dependent capability.
- Disable heuristic, silence, tone, macOS
say, andespeaksubstitutions for production results. - Require approval for every render path and record the approver/artifact; a bare filesystem flag is a current mechanism, not sufficient Fortune 500 authorization evidence.
- Use distinct durable/shared project storage or enforce single-instance scheduling. Current filesystem queues/projects and move-based inboxes are not automatically horizontally scalable.
Do not silently implement this target by editing defaults. Record each gap as a controlled change with migration and rollback.
Add or change a property
Complete every checkbox:
- State the requirement, owner, consumers, supported values/units, safe default, production classification, expiry/revisit condition, and whether it changes output or side effects.
- Search for an existing property before adding one; avoid aliases and speculative flags.
- Add the typed field under
VideoClippingProperties; use an immutable value type where practical and add Jakarta validation for every meaningful range, nonblank path, enum, URI, or cross-field invariant. - Decide whether omission must fail. Never give production-critical model, license, secret, endpoint, or approval settings an insecure fallback.
- Add the packaged property exactly once. If operations need an explicit environment name, use a documented placeholder and preserve Spring relaxed-binding consistency.
- Classify the default change through
video-editing-change-control. Treat enabling a scheduler/worker/render, changing an adapter, endpoint, path, retention, quality threshold, model, codec, or fallback as production-facing. - Map environment impact for macOS, Linux/VPS, and cloud: paths/mounts, permissions, filesystem persistence, process supervision, network policy, resources, secrets, rollout ordering, backward compatibility, and rollback value.
- Check coupled guards and all profiles. Make production fail closed; keep runtime downloads, external AI, network fetching, unlicensed assets, placeholders, and unapproved renders impossible.
- Add default, valid-override, invalid-value, and application-context guard tests. Add a cross-field test for min/max or mutually dependent settings.
- Add behavior tests proving the consumer uses the property. For output changes, add objective QA evidence; binding alone is not proof.
- Update this catalog and the configuration reference/documents of record. Explain every deliberate Spring Boot default deviation.
- Run the focused tests, full clean build prescribed by
video-editing-validation-and-qa, configuration drift scans, andgit diff --check. - Provide rollout order, observable signals, rollback command/value, and removal date for temporary flags. Do not leave permanent dual paths without ownership.
Review a proposed environment
Reject the configuration if any answer is “no”:
- Are only the intended scheduler and adapter beans enabled?
- Are model/dependency downloads impossible after image/build promotion?
- Do all model identifiers resolve to verified local artifacts rather than remote names?
- Are external AI and arbitrary remote worker endpoints impossible?
- Are all input, working, processed, rejected, project, cache, and temporary paths distinct, mounted, permissioned, capacity-limited, and retained intentionally?
- Does any missing model or asset fail closed without heuristic, silence, tone,
say, orespeaksubstitution? - Is every render disabled until authenticated approval is present?
- Are queue/repository/storage selectors coherent and production adapters, not
memory/stub/H2 conveniences? - Are cleanup and retention consistent with recovery, audit, and legal requirements?
- Are local worker health checks capability-aware, and are timeout/resource limits proven?
- Is the same application artifact and same signed runtime bundle used without rebuild across environments for each platform target, with auditable external configuration?
Provenance and maintenance
Primary sources: VideoClippingProperties, packaged/profile/test configuration, all @ConditionalOnProperty/@ConditionalOnExpression guards, scheduler annotations, local worker managers, shell launchers, Python workers, and configuration/profile tests. Re-verify volatile facts after any configuration, worker, or dependency change.
# List declared Java defaults and validation annotations.
rg -n '^ public static class|^[[:space:]]+@(Min|Max|NotBlank|NotNull|Pattern)|^[[:space:]]+private ' src/main/java/org/example/videoclips/config/VideoClippingProperties.java
# Regenerate the packaged/profile/test key inventory.
rg -n '^[[:space:]]*[A-Za-z0-9_.-]+[=:]' src/main/resources src/test/resources
# Find configuration consumers and guards.
rg -n '@ConditionalOn(Property|Expression)|@Scheduled|video-clipping\.' src/main/java src/test/java
# Regenerate explicit environment mappings and worker-only variables.
rg -n '\$\{[A-Z][A-Z0-9_]*:|LOCAL_(ASSET|CV)_[A-Z0-9_]+' src/main/resources tools src/main/java
# Recheck fallback and download hazards without executing them.
rg -n 'pip install|get_pretrained|YOLO\(|fallback|write_silence|write_fallback_tone|strictRuntime|strict-runtime' tools src/main/java src/main/resources
# Run focused binding/profile tests only after confirming test resources disable side effects.
mvn -o -Dtest=VideoClippingPropertiesTest,CinematicEditingLocalProfileTest,FolderSchedulerLocalProfileTest,FolderSchedulerSpringContextTest test
# Check documentation formatting and the repository diff without mutation.
wc -l .claude/skills/video-editing-config-and-flags/SKILL.md
git diff --check -- .claude/skills/video-editing-config-and-flags