fix(shared): enforce valid transcription timing intervals - #1254
seonghobae wants to merge 8 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Fresh exact-head verification on unchanged |
Consume the canonical Ruff formatting prerequisite by ordinary ancestry instead of copying the protected-base repair into the shared transcription lane. Signed-off-by: Seongho Bae <me@seonghobae.me>
Make the canonical shared TranscriptionNote timing admission actual ancestry of Project Persistence before repairing the Python final-result cache consumer. This preserves #1254 as the timing-policy owner and avoids a persistence-local duplicate contract. Signed-off-by: Seongho Bae <me@seonghobae.me>
Add persistence-boundary regressions for the canonical #1254 audio-relative timing invariant before changing the Python validator. Signed-off-by: Seongho Bae <me@seonghobae.me>
Consume the canonical #1254 audio-relative interval invariant at the final-result cache boundary so malformed cached timing cannot bypass shared rehearsal admission. Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Downstream consumer audit found one real persistence-boundary drift without changing this PR's shared-owner scope. #970 Project Persistence has now adopted this exact #1254 head The Python final-result cache consumer in #970 still admitted any finite This is downstream adaptation to #1254, not a second timing-policy owner. #1254 remains Draft and must still reach protected ancestry with final exact-head gates/review before #970 can reconcile and claim final evidence. |
|
Evidence-authority correction from #1258: the direct- The #1254 timing source/test/doctoring ownership and the #1176 formatter-owner split are unchanged. Build/Security/Semgrep/SBOM receipts remain whatever their own workflow checkout contracts prove; this correction is specifically for generic |
Remove the generated GrooveMap/test delta from the active diff. Canonical #1170 already contains the semantics-preserving max-offset scan and the useful >10s rendered-geometry regression, while #1254 owns shared timing admission. Keep this branch only as ancestry/provenance until verified protected succession satisfies PR-0. Signed-off-by: Seongho Bae <me@seonghobae.me>
Problem
Issues #1253 and #1255 identify one shared
TranscriptionNoteadmission boundary with two distinct failure classes:numberadmitsNaN,+Infinity, and-Infinityunless finiteness is checked;onset < 0oroffset <= onset).GrooveMap uses onset as timeline position and
offset - onsetas note width. The protected transcription producer derives start time from non-negative frame indices and drops events shorter thanMIN_NOTE_DURATION_SECONDS = 0.05, so negative starts and non-positive durations are not an intentional producer domain.Change
The existing #1254 branch remains the single writer for
validateTranscriptionNote(); #1255 was not implemented through a parallel consumer validator or a second branch.73c60d5d85684eedf274b6b2dde4272a95b534a1covers non-finite onset/offset.7dec5a64d5a265cbf75ac735e286d8529c09c31fadds finite-number admission; ordinary descendant53cc2c6057b34cf006232d47599532fd9f8f0d3fremoves an unrelated metadata-handoff delta from that repair.9a27a87f8c2c74614d84acb23458845949f948a0adds hostile finite intervals: negative onset, zero-duration interval, inverted interval, plus zero/negative-zero and ordinary positive controls. This is a source-level RED; no hosted failing run is claimed.95356c11a76716dde927bfe311dffb5eec4cf9e1requires finiteonset >= 0and finiteoffset > onsetat the shared validator.02e85d3150bfd32472a23793b36af577fd55e331records producer evidence, GrooveMap rendering consequence, persistence/recovery behavior, rejected clamps/normalization, and keeps velocity policy separate.c21c18ccd630614feee1fef3e0b7e5cf4fdce658makes canonical formatter prerequisite repair(ci): format consolidated supply-chain policy test #1176 (8fe6b6d99c009527ef0bcba419e6f6debdb23c23) actual ancestry without copying its one-file source delta into this PR.Desktop
saveProject()parses before persistence andloadProject()parses the native response before returning it. Malformed durable timing therefore fails closed with the exact field path rather than being silently clamped or rewritten.Dependency-stack repair / exact identity
Protected product truth is still
develop@314ddeae7b775a4957594b599358c8255617eb2e, but #1254 is intentionally stacked on formatter prerequisite #1176 while that prerequisite is not yet protected ancestry.bolt-performance-chart-export-13223013812255847379@8fe6b6d99c009527ef0bcba419e6f6debdb23c23(repair(ci): format consolidated supply-chain policy test #1176).c21c18ccd630614feee1fef3e0b7e5cf4fdce658.8fe6b6d....docs/doctoring/transcription-timing-admission.md,packages/shared-types/src/index.ts, andpackages/shared-types/test/transcription-timing-admission.test.ts.This is a real ancestry repair, not base-label bookkeeping. The #1176 formatter blob is consumed through ancestry and does not appear as a second writer in the #1254 diff.
Hosted evidence before stacking
The latest direct-
developgeneration on semantic head02e85d3150bfd32472a23793b36af577fd55e331reached terminal results:build-baseline35725434517: SUCCESS;Security Scan35725434480: SUCCESS;SAST Semgrep35725434526: SUCCESS;sbom35725434460: SUCCESS;ci35725434515: FAILURE;CodeQL PR35725434457: remained nonterminal at the last direct-developread.Inside repository CI,
npm-lock-validation106737836491and macOSrust-check106805057853succeeded. Ubuntuci / build-and-test106805057896failed only at Ruff 0.15.5format --check, which reported exactlyservices/analysis-engine/tests/test_supply_chain_policy.py. #1254 does not modify Python or that file; the defect is the protected-base formatter debt canonically owned by #1176. Documentation, Security Notes, security patterns, supply-chain checks, GitHub bootstrap, JS/TS lint, Python docstring checks and Ruff lint had already passed before the format gate.The current stacked head
c21c18...has no repository-owned workflow generation because these workflows admit the protected-target path rather than this feature-base stack. Zero runs is absence of evidence, not GREEN. After #1176 reaches protected ancestry, #1254 must ordinary/non-force reconcile to the resulting protecteddevelopand reacquire exact-head/base evidence.No source-neutral wake commit, blind rerun, force push, destructive rebase, self-approval or required-gate weakening is used.
Claim boundary
This PR establishes the shared audio-relative timing invariant only:
onsetandoffsetmust be finite;onset >= 0;offset > onset;-0is accepted equivalently to0;It does not claim migration of any historical malformed project. If such durable data is discovered, recovery must classify it explicitly instead of weakening the invariant or silently rewriting note timing.
Security Notes
No new network, filesystem, subprocess, IPC, telemetry, dependency, or PII surface. This tightens the existing local runtime-schema boundary and fails closed with stable field-path errors that do not include note contents or local paths.
Supply chain / i18n
No dependency or lockfile change. No user-visible string or locale change.
Merge gate
Keep Draft until #1176 reaches protected ancestry, this branch is ordinarily reconciled without losing its three-file semantic delta, and one unchanged final exact head has terminal applicable repository/security/SBOM/CodeQL evidence, zero valid unresolved findings, and a qualifying independent non-author current-head approval. Issues #1253 and #1255 stay open until this PR or a verified successor is protected ancestry with complete source/test/traceability/evidence succession.