3 Commits

Author SHA1 Message Date
B.D. Murphy
507ed95424 Declare this machine an Umbra node + cross-machine system contract (spec 21)
A parallel effort is moving UmbraTrans into the main Umbra system on oldbox
(192.168.123.14). This commit makes this machine describable to that system and
records what the system still needs to decide. Everything is a proposal for the
controller to ratify; no architecture is decided here.

specs/21-umbra-system-nodes-tasks-and-changes.md
  Four workstreams, each with what exists, what is missing, and a proposal:
  - WS1 data model alignment / copy / verify / transition. Design is far along
    already (manifest.md + spec 20); the missing piece is ratification.
  - WS2 every machine is a node that gets assigned any task. Job types, leases
    and pools exist (spec 19 §12); the node half does not. Proposes node
    identity, capability advertisement, task/result envelopes, and refusal as a
    valid audited outcome.
  - WS3 cross-product change management. Nothing exists today. Proposes a
    requirement catalog owned by the controller, four change classes, and a
    distribute-then-confirm-with-evidence loop. Includes the worked example of a
    controller-owned entity (designation, pronunciation, voice attribute) that
    must apply across every product.
  - WS4 UI topology. Recommends hybrid: controller gets the system portal,
    the audio review UI stays on the worker because it is artifact-native and
    has no authentication at all. Adds a git-tag deploy + verify + confirm flow.

  Also: 25 questions grouped by who can answer, each naming what it blocks, and
  a task list for this machine (NOW / NEXT / LATER) where every task has a
  machine-checkable acceptance criterion.

infra/umbra-node.json
  This machine's declared profile: node_id umbraaudio-m4, role worker, services,
  capabilities, resource pools, constraints, project list with lifecycle, schema
  fingerprints, and an honest facts_for_the_controller block (empty tables, no
  stable utterance id, no auth, no shared-postgres client). No secrets - ids,
  names, labels and counts only.

scripts/umbra_node_report.py
  Read-only node report. Git state, listening ports, .env KEY NAMES only, per
  project row counts, and a schema fingerprint hashed over sorted
  table.column:type so ALTER TABLE reordering does not read as drift. --json for
  machine consumption; --check compares declared profile to measured reality and
  exits 2 on drift. Drift is deliberately limited to stable facts (contract
  version, project set, schema fingerprints) - git HEAD and live ports are
  reported but never drift.

manifest.md
  Now explicitly a dated measurement with an update log, because other machines
  read it as current. 2026-10-01 refresh: Last Dwarf speakers.json 70 -> 93
  after the designation merge, DealHunter ref WAVs 94 -> 97. Every other §1.1
  count re-verified unchanged.

Measured this machine: 4 projects, 2 distinct schema fingerprints (real
per-project drift), only 4 of 11 tables populated, 461 tests passing / 8 known
pre-existing failures. No UmbraAudio behaviour changed.
2026-10-01 07:14:54 -07:00
B.D. Murphy
a2073fad66 Manifest: vmatrix as voice data, locale-safe phonetics, project lifecycle
Answers four questions raised about the manifest.

1. The vmatrix IS project data. A voice is defined by description AND vmatrix;
   the vmatrix is "the set of numbers inside Qwen3-TTS that IS the voice"
   (full ICL ref_code + speaker embedding, x_vector_only=0). Recorded as
   AUTHORITATIVE but least-governed:
   - keyed by a name-derived slug, not an id, so renames/merges orphan it
   - no locale dimension at all, so it cannot be assumed valid for a
     translated audiobook; the shared model needs it per (voice, locale)
   - coverage is inverted: DealHunter has 38 .pt files, Last Dwarf (active)
     has none
   - voice_registry.vmatrix_path is empty for all 13 rows, so nothing links
     a speaker to its vmatrix
   - captured as the canonical record but rendered via embedding mode
     (>15 min/utt for ICL vs ~17 s/utt), so constancy is actually enforced
     by the marker voice_fp, not the vmatrix
   Proposed voice_assets representation added, with source_ref_sha256 as the
   link that lets a re-voiced speaker invalidate its vmatrix.

2. The Hallr->HALR respelling IS language-agnostic, verified: apply_phonetics
   survives CJK ('Boulanger said' -> 'パン屋 said'). One real gap: ipa_to_simple
   ends with a non-ASCII strip, so 'パocht' -> 'OCHT' and 'ɸɯ' -> '' silently.
   Explicit spellings work for any script; IPA derivation does not. Documented
   as a rule for the aligned definition set.

3. Project lifecycle now recorded, since it changes migration treatment:
   DealHunter published (frozen lineage), Last Dwarf active (1,796/520/496
   stale), Treasure Island a voice lab (flint_a/b/c variants + a parrot
   voice, voice_analysis never run). Requires a lifecycle dimension distinct
   from legacy project.status.

4. New section 14 on non-static transition: per-project adoption, additive-only
   evolution, definition versioning, vocabulary-as-data, an in-band migration
   ledger, idempotent re-import, immutable released lineage, and the audio
   path never depending on the shared DB. Section 14.2 lists the definitions
   still trapped in code that must be extracted before the schema is frozen.

Also captured analysis/voice_analysis.json as the real measured voice-attribute
dataset: 9 features per voice plus a requirements gate that already includes a
uniqueness check with a nearest_neighbour record.
2026-09-28 07:58:03 -07:00
B.D. Murphy
8532392b24 Add project data manifest for shared-database schema design
Inventory of every data object an UmbraAudio project holds, grounded in
read-only introspection of all four live projects on 2026-09-28. Intended as
the input to enterprise database schema design and the transition plan, with
UmbraAudio as the upstream data source for the translation system.

Headline finding: the SQLite databases are mostly empty. Seven of eleven
tables hold zero rows in every project - characters, generated_audio,
pronunciation_guide, quality_reports, review_decisions, voice_review_history
and exception_reviews. Only project, chapters, utterances and name_tokens are
populated. Speaker identity lives solely in speakers.json +
voice_profiles.json + the ref WAVs, and the audio record lives solely on the
filesystem plus the *.wav.txt markers. A migration that reads only SQL would
lose the speaker model, the voice model, the pronunciation model and the
entire audio record.

Also captured: three-way speaker-count disagreement in every project
(Last Dwarf 70/68/71, DealHunter 61/64/94 refs); per-project schema drift
(Treasure Island and Vocals lack name_tokens and nine utterances columns);
four divergent DDL authorities; exact DDL for all tables; JSON key shapes;
artifact naming and the marker-based idempotency contract; data classification
(copyrighted, biometric, personal); a legacy-to-shared-entity mapping table;
and the ten requirements the translation system has of this data, four of
which are blocking.
2026-09-28 07:30:31 -07:00