mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-11 06:30:03 +00:00
fix(skills): pipeline fixes from prompt-guide validation (BGM, caption accent, voice, PR version)
Behavior fixes surfaced by the prompt-guide validation campaign (Tier 1+2 of the upstream bug list; Tier 3 tracked in #2107). Split out from the doc-only updates, which follow in a separate PR. - BGM level: default bed volume under narration was 0.8 linear (~-2 dB, ~16 dB too hot vs voice). Now 0.12 (~-18 dB) via shared bgmDefaultVolume() in media-use bgm.mjs + assemble-index fallbacks in faceless-explainer / pr-to-video / product-launch-video. Explicit volume still wins; silent-film 0.9 and music-to-video unchanged. Adds bgm.test.mjs (3 cases); bgm.md reference updated to match. - Caption accent: semanticColors() ranked accents purely by chroma, so a preserved status red (#dc2626) outranked the brand accent and captions highlighted in error-red. Status-keyed colors now excluded via shared STATUS_ROLE_KEY regex consumed by both tokens.mjs and build-frame.mjs (all three skill copies kept in sync). - Voice threading: workflow SKILL.md Step 3.1 blocks now instruct choosing the narration voice from the user's ask and passing --voice <id>; previously "a male voice" was silently ignored and the default (Marcia/am_michael) always won. - fetch-pr shipping version: MERGED PRs get best-effort shipped_version + version_source in pr.json (first release published at/after merge, else default-branch package.json marked unreleased); ingest surfaces it as a 'Shipped in:' brief line; story-design.md forbids inventing versions when absent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
d4b3bcaba3
commit
c992a136bf
@@ -48,6 +48,14 @@ export const UA_DEFAULT_COLORS = new Set(
|
||||
["#0000EE", "#0000FF", "#0000CC", "#1A0DAB", "#551A8B", "#EE0000"].map((c) => c.toUpperCase()),
|
||||
);
|
||||
|
||||
// Semantic STATUS roles (green "positive", red "negative"/"error", amber "warning" …). Their HUE
|
||||
// carries the meaning, so they are never a brand ACCENT — a status red is frequently the most
|
||||
// chromatic color in a palette (e.g. #dc2626 chroma 182 beats a deep-blue accent #1E40AF chroma
|
||||
// 145) and would otherwise win a pure chroma ranking, painting captions/highlights the error red.
|
||||
// build-frame.mjs uses this same key set to protect status colors during the preset→brand remix.
|
||||
export const STATUS_ROLE_KEY =
|
||||
/(?:^|[-_])(?:positive|negative|success|error|warning|danger|good|bad|up|down)(?:[-_]|$)/i;
|
||||
|
||||
// Pick the brand ACCENT — never by raw chroma alone, never a UA-default link color.
|
||||
// Priority:
|
||||
// 1) with capture colorStats → the colorful color that RECURS across the UI. The brand
|
||||
@@ -134,7 +142,8 @@ export function brandRolesFromStats(stats, colorsInOrder) {
|
||||
// Map a list of [key, value] colors to semantic roles. ink = a dark/ink-named
|
||||
// color (else darkest); canvas = a paper/cream/white-named color (else lightest);
|
||||
// accents = whatever's left, ranked by chroma (the loudest color is almost always
|
||||
// the brand accent) — UA-default link colors excluded so a stray <a> color never wins.
|
||||
// the brand accent) — UA-default link colors AND semantic status colors (positive/
|
||||
// negative/error…) excluded so neither a stray <a> color nor a status red ever wins.
|
||||
// For an unkeyed brand list, pass synthetic keys — name matching simply no-ops and it
|
||||
// falls back to luminance/chroma, which is what we want. NOTE: when capture colorStats
|
||||
// exist, prefer brandRolesFromStats() — it picks by function, not these proxies.
|
||||
@@ -154,7 +163,13 @@ export function semanticColors(colors) {
|
||||
byLum[byLum.length - 1] ?? colors[colors.length - 1],
|
||||
);
|
||||
const accents = colors
|
||||
.filter(([, v]) => v !== ink && v !== canvas && !UA_DEFAULT_COLORS.has(String(v).toUpperCase()))
|
||||
.filter(
|
||||
([k, v]) =>
|
||||
v !== ink &&
|
||||
v !== canvas &&
|
||||
!UA_DEFAULT_COLORS.has(String(v).toUpperCase()) &&
|
||||
!STATUS_ROLE_KEY.test(k), // a status red/green carries meaning by hue — never an accent
|
||||
)
|
||||
.sort((a, b) => chroma(b[1]) - chroma(a[1]))
|
||||
.map(([, v]) => v);
|
||||
return { ink, canvas, accent: accents[0] ?? ink, accent2: accents[1] ?? accents[0] ?? ink };
|
||||
|
||||
Reference in New Issue
Block a user