Skip to content

Release V3.0.0: Multi-User Product Foundation - #22

Merged
CanYouTeachMeHowToCode merged 24 commits into
mainfrom
dev
Oct 5, 2026
Merged

CanYouTeachMeHowToCode merged 24 commits into
mainfrom
dev

Conversation

@CanYouTeachMeHowToCode

Copy link
Copy Markdown
Owner

Merges V3 from dev into main for the v3.0.0 release.

What's in V3

  • Accounts: registration, login, logout; argon2 password hashing; server-side sessions in an httpOnly cookie
  • User-owned attempts and per-user analytics, with isolation tests at the API and service level; attempts recorded before accounts existed are kept and can be claimed
  • English / 中文 interface, saved on the account or in the browser for visitors
  • Existing boss content checked against Fextralife and Fandom: errors and phase structures fixed, Genichiro (Way of Tomoe) added to the Isshin fight, move-level sources
  • A cross-wiki move mapping for every boss in research/ground_truth/ as the starting point for V4
  • CI also checks that data survives a Docker restart

Upgrading a local install

docker compose up -d --build applies the new migrations. Existing Isshin attempts move up one phase, because the fight now starts with Genichiro. After registering, claim older attempts with docker compose exec backend python -m scripts.claim_attempts <username>.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- users and user_sessions tables (reviewed Alembic migration)
- argon2 password hashing; server-side sessions in an httpOnly,
  SameSite=Lax cookie, stored only as a SHA-256 hash
- register / login / logout / me endpoints; attempts and analytics
  now require login, boss data stays public
- frontend: nav bar, login and register pages with a show-password
  toggle, welcome page with the boss list for visitors, login prompt
  on boss pages
- tests for auth, access control, the auth UI, and the integration
  workflow; CI smoke test logs in through nginx

Attempts are still shared by all logged-in users until Milestones 2-3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add accounts and authentication (V3 Milestone 1)
- attempts.user_id (nullable FK) plus a (user_id, boss_id) index, in a
  reviewed migration that keeps existing attempts as ownerless
- every attempt read and write, boss analytics, progression and the
  Sekiro dashboard queries are scoped to the logged-in user
- ownerless pre-account attempts are hidden from everyone until
  `python -m scripts.claim_attempts <username>` assigns them
- isolation tests at API and service level, claim script tests, a
  migration test on a database with existing attempts, and a second
  user in the integration workflow
- README: how to claim V1/V2 attempts after upgrading; CLAUDE.md: make
  user_id NOT NULL in Milestone 4

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Give attempts an owner and scope analytics per user (V3 Milestones 2-3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Insert Milestone 4 (all main bosses, Chinese move names from a Chinese
wiki or marked as translations) before public deployment, which becomes
Milestone 5. Move video references are a deferred Milestone 8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Milestone 4 becomes the English/Chinese interface (language saved in the
account, or the browser for visitors; each language shows only its own
text). Milestone 5 is content completion plus a review of existing
movesets. Deployment, recommendations, release and video references move
to Milestones 6-9.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- moves.name_zh / name_zh_source ('wiki' | 'translation') /
  name_zh_source_url, with check constraints added by hand to the
  reviewed migration (autogenerate misses them)
- seed validation requires a Chinese name for every move; 102 existing
  moves named: 6 from BWIKI combat-art pages, 96 translations
- API returns the Chinese names; interim frontend display to be replaced
  by the language switch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- language switch in the nav bar; saved on the account
  (users.preferred_language, PATCH /api/auth/me) or in the browser for
  visitors, defaulting to the browser language
- every interface string in both languages via a small in-house
  dictionary and t(); each language shows only its own text
- Chinese boss content for the 8 existing bosses: locations, phase names,
  and all 234 move text fields, translated from the sourced English;
  the seed requires a Chinese version for every English field
- Chinese moveset shows one note about translations; wiki-sourced names
  link to their page
- reviewed migration with a hand-added check constraint

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each move option carries its description as a hover tooltip, and the
chosen move's description is shown under the select (phones have no
hover). Both follow the interface language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review file is committed temporarily so the review can continue on
another machine; it must be deleted before the pull request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
V3 becomes the multi-user product foundation (bilingual interface,
existing-content cleanup, release). V4 adds combat ground truth from
runtime and engine evidence, plus public deployment; V5 is gameplay
video analysis and practice recommendations; V6 is multi-game.

- READMEs: add the V3 status section, replace the roadmap overview with
  V1-V6, and update the public deployment note and tech stack
- CLAUDE.md / ROADMAP: make attempts.user_id NOT NULL before V4 public
  deployment; fill telegraph / common_mistakes only when the source
  states them

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Owl (Father)'s Shadowfall becomes the translation 巨型忍者落杀 rather
  than the combat art 秘传·巨型忍者落杀, since no authoritative source
  ties the two together; descriptions that mention it follow
- Corrupted Monk (Mibu Village) is 破戒僧; True Corrupted Monk stays
  宫内破戒僧
- regenerate the review file with these marked as decided

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Chinese content review is done, so the temporary review file is
removed and the bilingual interface is recorded as delivered in
CLAUDE.md, ROADMAP and both READMEs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add an English / Chinese interface (V3 Milestone 4)
ROADMAP.zh-CN.md mirrors ROADMAP.md section by section, using the same
Chinese terms as the app and README. The English and Chinese roadmaps
link to each other, and the Chinese README links to the Chinese roadmap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the two-wiki review (Fextralife and Fandom):
- True Corrupted Monk: phase 2 keeps every phase-1 move alongside the
  illusion summoning; the illusion text no longer gives a shadow count
  or the misleading Bite Down tip, and adds the tree aerial-Deathblow
- Guardian Ape: add the phase-2 Jumping Sweep from the Fextralife
  attack table; the rolling body slam can be blocked
- Owl (Father): Shadowfall is the Mushin combat art 秘传·巨型忍者落杀
  (both wikis say so); the firecracker dodge mistake moves to the
  5-slash firecracker combo where the source puts it
- Isshin: deflecting Ichimonji Double leads into a force-wave follow-up

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Isshin: the fight now starts with a Genichiro, Way of Tomoe phase
  holding only the moves both wikis agree on (his lightning is left out:
  the wikis conflict). A data migration moves existing Isshin attempts
  up one phase.
- Optional move-level source fields (source_name / source_url, set
  together or not at all), used for moves taken from another page; the
  moveset shows them under the move.
- Both Owls gain Mikiri Counter (Fandom).
- Remove actions that cannot end an attempt: Owl's zig-zag, Guardian
  Ape's roar, Lady Butterfly's rafter jump, Great Shinobi Owl's charm.
- Guardian Ape's diving lunge loses its inferred telegraph; Isshin's
  phase-3 distance slash is no longer called a lightning variant.
- Consistent move types: backflips are combos, lightning attacks are
  lightning, deflectable moves are not marked unblockable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
research/ground_truth/semantic/wiki_mapping/ lines up each product move
with the Fextralife and Fandom entries that describe it and records how
they relate. Across 106 product moves, 52 match one-to-one between the
two wikis. scripts/wiki_mapping_report.py rebuilds the readable report
and checks that every product move is mapped exactly once.

CLAUDE.md and both ROADMAPs now state that the project owner decides
what counts as ground truth, and document move-level sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The docker job now records an attempt, stops the stack without removing
volumes, starts it again, logs in with the same account and checks the
attempt is still there. This covers the last step of the V3 success
criteria, which nothing tested before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Milestones 5 and 6 are done: Lady Butterfly and Guardian Ape keep their
current move lists (the Fandom detail stays in the mapping for V4), and
CI now checks that data survives a Docker restart. CLAUDE.md's current
focus moves to V4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CanYouTeachMeHowToCode
CanYouTeachMeHowToCode merged commit 58ff30c into main Oct 5, 2026
8 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