mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-07-26 23:01:22 +00:00
The badge-journey layer on top of career stars (Christian's career-mode
v2 design, composed with the shipped venue system). Badges are computed
on read from song_stats × the library's effective genre — never stored:
Bronze = N genre songs at min_stars (data-driven in passports.json,
default 5 songs at 2★) plus any configured virtuoso drill nodes.
New endpoints under /api/plugins/career/:
- GET /passports passport walls per instrument: badges, ticket
stubs (qualifying songs), library genres, drills
- POST /passports/commit instrument commitment (idempotent wax seal)
- POST /passports/open open a genre passport (implies commitment)
- POST /drill-state intake for the relayed virtuoso.progress
snapshot (career's frontend listens on the bus)
Instrument attribution reuses progression.instrument_for_arrangement via
the song_stats arrangement index; the genre column goes through the
host's override-aware effective-genre SQL. Non-graded instruments (bass,
drums) render shown-not-judged — repertoire, never a false badge denial.
Persisted state (commitments, opened passports, drill snapshot) lives
under CONFIG_DIR/career/ and rides the settings export bundle via
settings.server_files; a minimal settings.html documents it.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
11 lines
639 B
HTML
11 lines
639 B
HTML
<!-- Career plugin — data panel. Exists so the passport/drill state declared in
|
|
settings.server_files has a visible home in Settings; nothing to configure. -->
|
|
<div class="text-sm text-gray-300 space-y-2">
|
|
<p><strong>Career</strong> computes stars and genre badges from your play
|
|
stats — they are never stored, so there is nothing to back up or reset.</p>
|
|
<p class="text-gray-400">What <em>is</em> saved server-side: your instrument
|
|
commitments, opened genre passports, and the practice-drill snapshot the
|
|
Virtuoso plugin reports. These ride along in
|
|
<em>Settings → Export</em> automatically.</p>
|
|
</div>
|