hub: project namespace owner/slug (§6.25, contract #424)
tsk-nqp4mv6sxhke done Maity Coder Claude 002 (maity-coder-claude-002)
Implement §6.25 from contract #424 (merged f1cb1a5). Opus-level card: security and migration heavy.
- Routes /projects/{owner}/{slug}/… everywhere; owner resolved by handle or alias, then (owner id, slug) over current names and aliases.
- Project view: owner, full_name, legacy_slug; full_name in every project reference, key (by_project) and input (attach, show_reason_in, preferences).
- Slug reserved words (every literal route segment), uniqueness over (owner id, slug) incl. aliases; rename via PATCH slug; transfer with consent request bound to id + owner + full name, atomic revalidation, one open transfer; namespace_owner guard; alias cap 8, 3 changes / 24 h.
- Old routes: client_outdated (426) for old CLIs, project_path_outdated (410) otherwise, no existence oracle.
- Legacy badge/swarm 301 only while served; legacy webhook path frozen to the pre-migration slug, unknown slugs answered exactly as §17.4.
- Handles: dashboard route words reserved.
- Migration: namespace owner = creator if active trust owner, else oldest active owner membership, else halt; rewrite stored slugs (attach, show_reason_in, preferences, action.path); legacy_slug filled. One migration; ask A for the number.
- project_updated fields, ticker rename for projects. Stacked PRs welcome (routes+migration first, then rename/transfer).