Skip to content

Career v3: Gold tier — verified improv upgrades an earned badge - #960

Merged
byrongamatos merged 3 commits into
mainfrom
feat/career-gold
Jul 14, 2026
Merged

byrongamatos merged 3 commits into
mainfrom
feat/career-gold

Conversation

@byrongamatos

@byrongamatos byrongamatos commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

The Gold rung, integrated (pairs with feedBack-plugin-virtuoso#11). An earned (Bronze) passport badge turns gold when Virtuoso verifies an improvised jam in the passport's style.

Backend

  • The drill-state relay now carries virtuoso's goldImprov map (styleId → artifact). Intake: gained-only merge like drill nodes (a stale relay never un-mints; first artifact per style wins), non-dict payloads 400 loudly, evidence-free artifacts (no verifier) never mint, and the incoming map gets the same pre-merge size bound byNode has.
  • Tier: a passport whose badge bar is cleared upgrades to badge: "gold" when a gold artifact matches its genre in family space — virtuoso mints under raw STYLE_PALETTES ids ('punk', 'djent', 'disco'…), so both sides bucket through the existing _genre_family keyword match ('punk' reaches a 'punk rock' passport). Gold never substitutes for the badge bar: gold-without-bronze stays in_progress.

Frontend

  • Gold ceremony + notification with tier-suffixed seen ids (bronze keeps its legacy id; a gold slam marks both — never both ceremonies).
  • Gold stamp slam in the book, gold ink on the shelf-cover mini stamp, instrument rail, profile wall, dash card, and the drawn passport card; the real gold foil chip replaces the dashed "Gold rung coming" preview, which becomes a live invitation to jam the style.

Tests

  • 42 pytest (family-space matching incl. raw-style-id, gold-without-bronze, gained-only asserted against the persisted snapshot, junk/oversized/evidence-free intake), 14 career vm tests (gold ceremony once, seen-id migration, wall totals), full JS suite 1011 green.
  • max-lines warn on career screen.js is registered in docs/size-exemptions.md (planned split, awaiting Byron's signature).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a Gold passport tier for completed career paths.
    • Gold badges are awarded after Virtuoso verifies an improvised jam in the passport’s style.
    • Gold ceremonies include distinctive stamps, foil, ink visuals, invitation previews, and live jam launches.
    • Passport covers, walls, counters, notifications, and ceremony flows now display both Bronze and Gold achievements.
  • Bug Fixes

    • Gold achievements now persist reliably and prevent duplicate ceremony notifications.
    • Improved matching across related genre styles and safeguarded invalid achievement submissions.

byrongamatos and others added 3 commits July 14, 2026 10:14
… an earned badge

The drill-state relay's goldImprov map (virtuoso gold_improv mints,
gained-only merged like drill nodes) turns an earned badge gold when the
passport's genre — or its genre family — has a verified improv artifact.
Gold never substitutes for the badge bar: gold-without-bronze stays
in_progress.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…erywhere

The drill-state relay now carries virtuoso's goldImprov map; a badge that
comes back gold gets its own ceremony + notification (tier-suffixed seen
ids — the bronze moment stays seen under its legacy id, a gold slam marks
both), a gold stamp slam in the book, gold ink on the shelf-cover mini
stamp, and the real gold foil chip. The bronze page's dashed 'Gold rung
coming' preview becomes a live invitation to jam the style in Virtuoso.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…guards, rail counter

The review's showstopper: virtuoso mints goldImprov under raw
STYLE_PALETTES ids ('punk', 'djent', 'disco'), which are mostly NOT
family keys — the tier check now matches in family space (artifact style
and passport genre bucket through the same _genre_family keyword match),
so a 'punk' gold reaches a 'punk rock' passport. Also: non-dict
goldImprov 400s loudly instead of silently dropping; evidence-free
artifacts (no verifier) never mint; goldImprov gets the same pre-merge
size bound byNode has (junk under the cap could otherwise persist
forever and wedge every later relay at the post-merge check); the
instrument-rail badge counter counts gold (earning gold no longer made a
badge vanish from the rail); first-artifact-wins is now asserted against
the persisted snapshot instead of vacuously.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@byrongamatos

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 98f06111-17ae-4b00-9707-fbd854b765d9

📥 Commits

Reviewing files that changed from the base of the PR and between 0d35228 and d8807c1.

📒 Files selected for processing (7)
  • CHANGELOG.md
  • docs/size-exemptions.md
  • plugins/career/assets/career.css
  • plugins/career/routes.py
  • plugins/career/screen.js
  • plugins/career/tests/passports.test.js
  • tests/plugins/career/test_passports.py

📝 Walkthrough

Walkthrough

Career passports now persist verified Virtuoso gold improv artifacts, compute gold badges by style family, and render tier-aware ceremonies, stamps, foil, notifications, and wall counts. Tests cover minting prerequisites, persistence, validation, family matching, and client seen-state behavior.

Changes

Gold career passport tier

Layer / File(s) Summary
Gold artifact persistence and badge computation
plugins/career/routes.py, tests/plugins/career/test_passports.py
Drill-state intake validates and gained-only merges gold artifacts, while completed passports become gold when matching verified style evidence exists.
Tier-aware badge and ceremony flow
plugins/career/screen.js, plugins/career/tests/passports.test.js
Client relay, seen-state tracking, notifications, ceremony rendering, passport stamping, and wall totals distinguish gold from bronze badges.
Gold passport presentation and release notes
plugins/career/assets/career.css, CHANGELOG.md, docs/size-exemptions.md
Gold stamp and foil styling are updated, and the gold ceremony and screen-size estimate are documented.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is informative, but it does not follow the required template sections for What and Checklist, and omits the feedpak decision statement. Add the required template sections: What, feedpak surface (or explicitly remove it if not applicable), and Checklist with changelog, tests, and DCO signoff.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately highlights the main change: Gold-tier verified improv upgrading an earned badge.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/career-gold

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed: one or more packages not found in the registry.


Comment @coderabbitai help to get the list of available commands.

@byrongamatos
byrongamatos merged commit be473dc into main Jul 14, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant