Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
Tidal
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PLN
Tidal
Commits
397670c1
Commit
397670c1
authored
Jun 25, 2026
by
PLN (Algolia)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
docs(tasks): archive the Douanier callable-API session (#37–#41, #32)
parent
11c8f9d6
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
60 additions
and
0 deletions
+60
-0
completed-archive.md
armada/tasks/completed-archive.md
+60
-0
No files found.
armada/tasks/completed-archive.md
View file @
397670c1
...
...
@@ -195,3 +195,63 @@ memory `project_douanier_api`. Named after Le Douanier Rousseau (the customs gat
the rest are
`ytsearch1:`
queries so we never ship a guessed/broken video id. Pedagogically
diverse on purpose — fuel for #19 autotune + #20 batch-explore.
-
**Deps:**
feeds #19 / #20.
## #37 — Refit for erable: CPU image + nech.pl platform contract
-
**Description:**
the SRE replied (SRE.md) that erable has NO GPU / ~2 GB RAM and CLAP/torch
won't fit; ship a CPU-deployable image. Same letter reframed api.nech.pl as a multi-API
PLATFORM (we're the
`audio`
sub-API).
-
**Done:**
Dockerfile (python:3.12-slim + ffmpeg/libsndfile + torch-free requirements-deploy.txt)
→
**~1 GB image**
, <2 GB RAM, default engine=light. Conformed the app: public path
`/audio/v1`
(gateway strips it; routes at root +
`root_path`
),
**central auth**
(trust gateway-injected
X-Tenant/X-Scopes, loopback-only; dropped our SQLite bearer/quota = #23/#24 superseded),
`/metrics`
Prometheus,
`/separate`
→ 503
`compute_unavailable`
seam. DEPLOY.md = erable
contract. Commit 722dade.
-
**Learnings:**
the SRE EDGE WENT LIVE first (503 warming_up at the public URL) — deploy is
now a one-command unblock. The container holds ONLY armada/api/ → every engine must be
self-contained (no tide-table/Foundry import at runtime). 32/32 tests; validated in-container.
-
**Deps:**
unblocks #42 deploy + #33 onboard; superseded #23/#24.
## #38 — Modular ears building blocks: /features + /analyze/samples
-
**Done:**
two CPU/torch-free cached endpoints.
`/features`
(~35-dim spectral/MFCC/chroma/key/
envelope + rhythm);
`/analyze/samples`
(per-sample EDA + role percs|bass|melodic|tops|atmos by
MEASURED spectrum, never the name).
`engines/feats.py`
self-contained (vendored from
sample_features/audio_lens). Shared
`_cached()`
helper (DRY across the 3 analyze routes). Commit 9eb2623.
-
**Learnings:**
vendoring fixed the librosa-0.11
`feature.rhythm.tempo`
bug the tide-table
original silently swallowed (→
`feature.tempo`
). Role-by-measurement upholds feedback_mastering_eda.
40/40 tests; validated in the torch-free container.
-
**Deps:**
established the vendoring pattern reused by #39/#41.
## #39 — /grade: the Foundry loop grader as a building block
-
**Done:**
`/grade`
exposes the Foundry mechanical quality grader (composite 0..1 + S/A/B/C/D
tier + seam/zc/bar/level/dc/bass sub-scores + flags).
`engines/grade.py`
is a BYTE-FOR-BYTE
vendored copy; tests/test_grade_endpoint.py is a DRIFT GUARD (imports the Foundry canonical
standalone, asserts identical grade/tier/sub + WEIGHTS/THRESH). Commit cd3caa7.
-
**Learnings:**
vendoring + a drift-guard test = DRY-safe deployment when the container can't
hold the source repo (parsers-over-copy applied to a vendored copy). 43/43 tests.
-
**Deps:**
the CPU slice of #31 (/loops + /correlate still need a corpus/finder).
## #40 — Low-hanging endpoints: /onsets, /waveform, /analyze
-
**Done:**
`/onsets`
(hit times + tempo + rate),
`/waveform`
(per-bin
[
min,max
]
+ 0..1 RMS
envelope — render-ready),
`/analyze`
(composite emotion+features+sample in one cached call).
`engines/signal.py`
self-contained librosa. Commit 8c2be60.
-
**Learnings:**
/onsets+/waveform are aimed at hexa's hydra VISUALS (rhythmic sync + reactive
envelope) — the API's value isn't just analysis, it's render-ready signal. 50/50 tests.
-
**Deps:**
—
## #41 — /loudness, /spectrum (FFT-as-a-service), /naming
-
**Done:**
`/loudness`
(BS.1770 integrated LUFS via pyloudnorm + 4×-oversample true-peak +
crest + gain-to-target -14/-9);
`/spectrum`
(downsampled mel/linear spectrogram bands×frames,
0.
.1, frames=1=avg spectrum — PLN's "FFT-as-a-service" idea);
`/naming`
(vendored Foundry
namer, drift-guarded, + feats.character_of). pyloudnorm added to requirements-deploy. Commit f11bef9.
-
**Learnings:**
/spectrum is the canonical cache-as-margin building block — compute the FFT
once, serve the bounded matrix forever.
**11 engines total.**
58/58 tests.
-
**Deps:**
—
## #32 — Make it callable: OpenAPI snapshot + zero-dep TS client
-
**Done:**
`clients/openapi.json`
(3.1 snapshot, servers pinned to api.nech.pl/audio/v1, +
drift-guard test vs the live app),
`clients/douanier.ts`
(typed, zero-dep, one method/engine,
`_cache`
surfaced, DouanierError; tsc --strict clean),
`clients/README.md`
(Vercel example +
scope table + codegen one-liner). Commit 11c8f9d.
-
**Learnings:**
a hand-written zero-dep client beats generated bloat for ~11 simple multipart
routes; the snapshot-drift test keeps hexa's spec honest as routes evolve. 60/60 tests.
-
**Deps:**
unblocks #33 (onboard hexa); needs #42 deploy to be live-callable.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment