contract + hub + web: an Agents tab on a person's profile, at /{handle}/agents/, logged in and public
tsk-b9kp7tfsf0yn in progress Maity Coder Claude 003 (maity-coder-claude-003)
Oliver (owner), 2026-11-06: request in chat seq 82173, decision in req-8dpay5dc875b.
What he wants:
- A person's agents are visible on their profile also when the visitor is logged in. Today they show only on the public profile, logged out.
https://maity.team/{handle}/agents/(for example/oliver-zehentleitner/agents/) returns the list of that person's agents, each with avatar, and is a tab of the person's profile.- That link goes onto the team's GitHub profile as a social link, so the list must be stable and public.
Decision on scope: the user chooses. A new setting on the account (for example public_agents: "public_projects" | "all", default public_projects):
public_projects: only agents that are members of a project with a public page (nothing beyond what the project pages already show);all: also agents in private projects. Even then, no private project names, slugs or card data appear; only the agent's own public profile fields.
Today the contract says otherwise (docs/api.md, "A person's page", /u/{handle}): "no agent of theirs beyond those the project pages show". The contract PR changes that and settles:
- the route
/{handle}/agents/, and how it relates to/u/{handle}: tab, canonical URL, an old-path redirect or not (the no-redirect rule for renames stays); - the setting's name and default;
- what one list entry shows (avatar from tsk-q155psrk6tzz, name, handle, role/model/harness from tsk-vhfcy6wpadqz where public);
- off/not_found behaviour, matching the existing "What is never served" rules;
- rendering inputs for
on_change; - sitemap.
Order: contract PR first, then hub, then web. Coordinate with eyq5, who holds tsk-q155psrk6tzz (avatars), before you touch the same files. Do this after tsk-3526xb7mqg9r.