Onboarding Documentation
## Ownership Zone Owns the body of documentation a new contributor or non-engineering stakeholder needs to understand, run, and contribute to the product without tribal knowledge from existing developers. This covers the entry-point README, environment and setup instructions, architecture and routing overviews, contribution and code-style conventions, and the product-level explanation of what the system is and who it serves. The zone includes the prioritized backlog of documentation gaps and the lifecycle of each doc — when it was last verified against the running system, who is expected to read it, and whether it still matches reality. It does not own inline code comments, API reference generation from types, or design specs for unshipped features. ## Rubric - **First-hour path works end-to-end** — A new contributor can go from a fresh clone to a running local instance using only the written instructions, on a machine the docs claim to support. This is the floor the rest of the rubric stands on: until setup actually works, every other doc is being read by people who are already frustrated or who never made it this far. The bad version is a README that lists prerequisites but skips the env vars, or a setup guide that silently assumes a tool the author already has installed. - **Audience separation is explicit** — Docs are organized so a product manager looking for what the system does, a new engineer looking for how to contribute, and an ops person looking for how to deploy each land in the right place quickly, without wading through each other's content. The failure mode is a single sprawling README that mixes business context, setup commands, and architecture diagrams so that everyone reads everything and nobody trusts any of it. This is the stakeholder-facing dimension — excellence here is judged by whether non-engineers can self-serve, not by whether the prose is well-written. - **Conventions are stated, not implied** — Contribution norms, naming conventions, routing patterns, branch and PR expectations, and code-style choices are written down where someone proposing a change will see them. Only meaningful once the first-hour path works, because a contributor who can't run the code has no reason to read the conventions yet. The bad version is a reviewer repeatedly leaving the same comment on PRs because the rule lives only in their head. - **Truth decay is actively managed** — Docs carry signals of freshness — last-verified dates, ownership, or explicit deprecation — and there is a known cadence by which someone re-walks the setup and architecture docs against the running system. Sits on top of the first-hour path: the question isn't whether the docs were once correct, but whether anyone has confirmed they're correct this quarter. The failure mode is a confident-sounding architecture doc describing services that were renamed or removed months ago. - **Architectural orientation matches the system as built** — A new engineer can read one document and form an accurate mental model of the major components, how requests flow, and where the seams are, before opening the code. This becomes possible once truth decay is managed; otherwise the orientation doc actively misleads. The bad version is either no overview at all (everyone learns by archaeology) or a beautiful diagram that quietly disagrees with the repo. - **Gaps are tracked, prioritized, and visible** — Missing or stale documentation is itself catalogued, ranked by severity, and worked through deliberately rather than written reactively when someone complains. This is the dimension that makes the steward legible to outsiders: a stakeholder can ask what's missing and get an answer, rather than discovering gaps by hitting them. Excellence here isn't visible from the codebase alone — it requires that someone is keeping a list and making decisions about it. - **Onboarding feedback closes the loop** — When a new contributor or stakeholder hits friction, that friction becomes a documentation change, not a Slack answer that evaporates. The capstone dimension — only achievable once gaps are tracked and audiences are separated, because otherwise feedback has nowhere coherent to land. The bad version is the same three questions answered privately every time someone joins, with the docs never updated.
Industrial Design System
## Ownership Zone Adherence to the industrial/brutalist design system: color tokens, typography contracts, component variant usage, layout patterns, and zero-radius enforcement across the Next.js app. ## Rubric - **Token discipline** — Components use defined color tokens (primary, surface, surface_two, text-primary, text-muted, error, warning, success) and their documented scale steps. No ad-hoc hex values, no non-existent tokens like brand.400, no whiteAlpha borders. - **Typography contract** — Space Grotesk for headings/body/buttons, JetBrains Mono for labels/data/code. Text styles (monoLabel, monoBody, monoSmall) are used for their documented purposes. Uppercase + wide tracking signals system text, not human-readable content. - **Variant usage** — Buttons use industrialPrimary, industrialOutline, or industrialCta — never bare Chakra solid/outline. Inputs use the theme variant without inline bg/borderColor/_hover/_focus overrides. Tables use variant bordered. Components use AppModal, Card, DataTable wrappers rather than raw Chakra primitives. - **Surface and border hygiene** — Surfaces are delineated by surface_two.500 borders, never drop shadows. No border-radius anywhere — the theme overrides all radii to 0. No CircularProgress or rounded elements that contradict the zero-radius constraint. - **Layout pattern conformance** — Landing pages use the 1440px container with border rails and section dividers. Blog/content headers use the 7fr/5fr grid with yellow breadcrumb label pattern. Auth pages use centered VStack with hyperspace animation. App pages use Layout with sidebar at 240px.
Claude Code Onboarding
## Ownership Zone The end-to-end first-run journey of getting a developer productive with Steward from inside Claude Code: connecting and authenticating the MCP server, the prepare_steward_onboarding readiness handoffs (auth, GitHub App install, workspace selection), invoking the steward skills, and the configure_steward create → activation sequence that lands an activated account. Spans the server-side onboarding logic in contextgraph/actions, the plugin and skill install surface in contextgraph/claude-code-plugin, and the CLI in contextgraph/agent. ## Rubric - **Readiness-state correctness** — prepare_steward_onboarding returns the right status/next_action for each real account state — authentication_required, github_app_install_required, workspace_selection_required, repository_inaccessible, and ready/define_steward — and no blocking state is a dead end: each one carries a concrete, actionable handoff (install URL, retry instruction, workspace selector) rather than leaving the agent guessing. - **Agent-facing guidance clarity** — The guidance arrays, MCP server initialize instructions, tool descriptions, skill copy, and browser-return pages tell the coding agent exactly what to do next, in order, naming the correct next tool or skill — and never bounce a Claude Code user back into the web onboarding flow when the agent can finish setup in-session. - **Browser handoff round-trip integrity** — Auth, GitHub-App-install, and workspace handoffs build correct URLs (redirect/return params, owner_login, owner_type), land the user on a 'return to Claude Code' page, and resume cleanly when the readiness check is re-run. The loop always closes back into Claude Code; a handoff that strands the user in the browser is a defect. - **Activation completeness** — configure_steward's create → reconcile_inventory → preview_initialization → apply_initialization chain honors each activation.next_action and ends in a genuinely activated state (steward created, inventory reconciled, first backlog items workable). No path silently strands a half-created steward or skips an activation step the agent is supposed to run. - **Path health visibility** — Each readiness state and activation transition emits telemetry (the mcp_prepare_steward_onboarding event, onboarding funnel events) so drop-off across connect → authenticate → install → define → activate stays visible, and the headline conversion signal (share of readiness checks reaching ready) is watched. Happy-path-only instrumentation and silent stall points where a user can stall invisibly are regressions.
Engineering Pragmatism
## Ownership Zone Speculative complexity and over-engineering across the monorepo: abstractions, packages, exported surfaces, and dependencies must earn their place through real consumers and proportionate product value; dead, premature, and gold-plated code is surfaced for removal so the codebase stays as simple as the shipping product allows. ## Rubric - **Consumer-backed abstraction** — Every abstraction, package, or exported symbol has at least two real call sites or a committed near-term consumer; speculative generality built for imagined future use is flagged. - **Dead surface** — Exported symbols, packages, dependencies, config, and scripts with zero consumers are detected and surfaced for removal before they accrete into maintenance burden. - **Dependency justification** — Each third-party dependency earns its place through real, non-trivially-replaceable use; heavyweight deps pulled in for a one-line need are flagged. - **Premature infrastructure** — Infrastructure, tooling, layers, and config systems are not built ahead of a real product need (YAGNI); abstractions arrive with the second concrete use, not before it. - **Right-sized solutions** — Solution complexity is proportionate to the problem and to delivered product value; gold-plating, over-generalized configuration, and frameworks where a plain function suffices are flagged.
Tenant Data Isolation
## Ownership Zone The architecture, configuration, and enforcement of data boundaries between independent tenants across the platform. This includes tenant identification and routing at the request boundary, schema-level isolation mechanisms, query filtering and access control, credential and secret scoping per tenant, and the visibility of isolation health to non-engineers through audit trails and breach detection. The steward owns the floor that prevents one tenant from reading, writing, or inferring the state of another. ## Rubric - **Tenant identity at the edge** — Every request carries a verified tenant identifier before any business logic executes. This is the floor the rest of the rubric stands on: until tenant identity is established and immutable at the boundary, downstream isolation is fiction. Tenant context is extracted from a single source of truth (JWT claim, session, header) and cannot be overridden by request parameters or inferred from data shape. - **Query-level filtering enforcement** — All data queries automatically scope to the request tenant without relying on caller discipline. Queries fail closed rather than silently returning cross-tenant data when a filter is missing. This sits on top of verified tenant identity: only meaningful once you know which tenant made the request. - **Credential and secret isolation** — API keys, database credentials, third-party tokens, and encryption keys are scoped per tenant and cannot be accessed by other tenants. A compromised credential in one tenant does not grant access to another tenant's resources or secrets. - **Schema-level boundaries** — The data model itself enforces tenant ownership: foreign keys, row-level security policies, or partition keys make it structurally impossible to query across tenant boundaries. A schema change that removes a tenant column or constraint surfaces immediately as a breaking change, not as a latent vulnerability. - **Isolation testing and validation** — Automated tests verify that queries with one tenant's credentials cannot read, write, or infer the existence of another tenant's data. Tests cover both happy-path isolation and edge cases like concurrent requests, batch operations, and error states. Isolation is not assumed; it is measured. - **Audit and breach visibility** — Cross-tenant access attempts, credential misuse, and isolation violations are logged and surfaced to non-engineers without requiring code review. A support team member or operator can answer whether a tenant's data was accessed by another tenant without paging an engineer, and breach detection runs on a known cadence.
PostHog
## Ownership Zone The PostHog Steward owns the analytics instrumentation and event stream that tracks user engagement, value realization, and product stickiness across contextgraph. It maintains visibility into which events the team relies on to measure retention, user satisfaction, and the impact of shipped features. It notices when event payloads drift, when critical events stop firing, and when the metrics that should move in response to product changes don't — signaling measurement gaps or real product problems. It surfaces patterns in user behavior that reveal what users actually find valuable, not just what we assume they do. ## Rubric **Event Reliability**: Critical events (concerns raised, concerns remediated, backlog items merged) fire consistently with stable payloads; drift is caught and surfaced within one week. **Retention Signal Clarity**: Dashboards and cohorts clearly distinguish between one-time users, returning users, and power users; retention trends are directional and explainable. **Value Evidence**: Instrumentation captures user actions that correlate with stated value (e.g., what users do after raising a concern, how often they return to remediated items, which features drive repeat visits). **Measurement Gaps**: When expected metrics don't move or move counterintuitively, the steward flags whether the gap is real product behavior or an instrumentation blind spot. **User Intent Visibility**: Events and cohorts reveal what users actually do, not just what we built; the steward surfaces unexpected patterns that hint at real user needs.
Blog Post Publishing
## Ownership Zone Correctness and completeness of marketing blog post PRs in the Next.js app: the post page file under packages/app/src/pages/blog/ (named for the post slug), its BLOG_POSTS metadata registration, hero and card image wiring, SEO and structured data, sitemap inclusion, and conformance to the blog component system, so a correctly-built post can be approved, merged, and deployed without manual review. ## Rubric - **Post registration integrity** — Every new post has both a page file under packages/app/src/pages/blog/ named for its slug and a matching entry in BLOG_POSTS (consts/blogPosts.ts). The slug is unique, kebab-case, and consistent across the filename, the metadata.slug field, and the page's metadata lookup; the default export is the PascalCase form of the slug. No orphaned page without a registry entry, and no registry entry without a page. - **Metadata completeness & correctness** — The BlogMetadata entry has all required fields well-formed: title, description, ISO date (YYYY-MM-DD), tag, h1, readTime, a cardImage URL, and an author key that exists in BLOG_AUTHORS. The page reads every displayed value from the metadata constant rather than hardcoding titles, dates, or image URLs in JSX. - **Hero image & asset wiring** — cardImage points to the Supabase assets/blog bucket URL for the post slug, is webp, and the referenced asset was actually uploaded (not a placeholder or dead link). The image is wired through BlogHeroImage and SEOHead ogImage, and its aspect ratio is reasonable for OG cards (about 1.91 to 1). - **SEO, structured data & sitemap fidelity** — SEOHead is wired with the canonical URL via canonicalUrl(BLOG_ARTICLE(slug)), the standard 'Title | HyperServe Blog' title format, the cardImage as ogImage, and jsonLd from buildBlogPostingJsonLd(metadata). Open Graph, Twitter card, canonical, and BlogPosting JSON-LD are present and reference the real post; trackPageView fires for the article. The post is reachable from sitemap.xml.tsx, which derives blog URLs and lastmod from BLOG_POSTS via getAllBlogMetadata, so the registry entry and its ISO date must be valid for the post to be indexed. - **Component & markup conformance** — The post uses only the approved blog components in the canonical structure (BlogLayout wrapping BlogHeader, BlogTLDR, BlogHeroImage, BlogSection and BlogHeading content, BlogCTA, then RelatedPosts) rather than raw Chakra or ad-hoc markup. JSX quotes and apostrophes are escaped as HTML entities, and component props match their documented contracts. - **Build & link safety** — The PR typechecks (no TS errors), removes unused imports (e.g. Link when there are no internal links), and is scoped to the expected files without stray changes. Internal blog links resolve only to slugs that already exist in BLOG_POSTS, with no dead references.
Tenant Isolation & Access Boundary
## Ownership Zone How requests authenticate and how every data access is scoped to the correct company and role across the booking platform's API routes, server actions, and Prisma queries. ## Rubric - **Tenant query scoping** — Every Prisma read and write filters by companyId; no query path can return or mutate another company's rows, and joins/relations stay within the tenant. - **Session authentication** — Routes and server actions resolve a valid, unexpired session (tokenHash lookup) before touching data, and password/token handling (hashing, expiry, invalidation) is sound. - **Role authorization** — MANAGER versus REP capabilities are enforced at the server-side access boundary, not merely hidden in the UI. - **Identity provenance** — companyId and userId are derived from the authenticated session, never accepted from client-supplied params, request body, or headers. - **Audit coverage** — Privileged and mutating operations write an Audit row capturing actor, companyId, action, and entity, so tenant-scoped changes are traceable.
PR Thread Responsiveness
## Ownership Zone How fast and how legibly the steward shows up in a GitHub PR thread: first review after open/ready-for-review, response to human replies on concerns, re-review after new commits, and the visible presence signals (in-progress Stewards check, ack comments, reactions) that prove the steward is always watching. ## Rubric - **First-review latency** — Time from PR opened or marked ready-for-review to the first steward review posted on that PR is short and predictable. The Stewards check transitions to in_progress immediately so the user never wonders whether the steward saw the PR. - **Comment turnaround** — When a human replies on an unresolved concern, the steward acknowledges quickly (ack comment, reaction) and re-evaluates against the latest diff. Long gaps between a human reply and the steward's next action are a regression — even if the eventual verdict is correct. - **Re-review freshness** — After new commits land, concerns are reclassified against the latest SHA promptly. Same-SHA debounce, processing locks, and the review-slot mutex must not silently swallow a re-review the user expects to see. - **Presence legibility** — From the PR author's seat it is obvious the steward is alive: in_progress check posted, ack comments where appropriate, reactions on relevant human replies, a clear final state. Silent intervals where the user can't tell whether anything is happening are treated as bugs. - **Slot and lock health** — Per-PR processing locks and the review-slot mutex are responsiveness primitives — orphaned in_progress slots, stale tokens, lock timeouts, or failed releases turn into invisible queueing. The steward watches these as latency hazards, not just correctness ones. - **Bot-noise discipline** — Speed includes not burning time replying to bot pings, slash commands, the steward's own comments, or other automated PR feedback. commentLooksLikeBotPing / isAutomatedPrFeedbackAuthor and similar filters are part of how responsiveness stays high.
Setup & Onboarding Accuracy
## Ownership Zone Owns the surface that a newcomer hits in their first hour with the project: the README and any top-level docs that describe what the project is, the setup and run instructions, the prerequisites and toolchain expectations, the workspace and directory orientation, and the contributor guidance for making a first change. Responsible for keeping the stated identity of the project (name, purpose, domain, audience) aligned with what the code actually is, and for keeping installation, build, and run paths walkable from a clean machine. Covers the handoff from stakeholders and casual readers (what is this?) through to first-time contributors (how do I run it and where do I edit?). Does not own deep architectural docs, API references, or runtime operational guides — only the on-ramp. ## Rubric - **Truthful project identity** — The floor the rest of the rubric stands on: if the README describes a different project than the one in the repo, every other dimension is grading instructions to the wrong place. The stated name, purpose, domain, and tech stack match what a reader would conclude after ten minutes in the source tree, and template/scaffold residue from the project's origin has been replaced rather than left as quiet lies. - **Walkable setup path** — Only meaningful once identity is truthful, because setup steps for the wrong project waste the newcomer's trust before they hit a real error. A reader on a clean machine can go from clone to running app by following the documented steps in order, prerequisites are named with versions where versions matter, and the steps actually executed by the maintainer match the steps the doc tells a stranger to run. - **Orientation to the shape of the repo** — Sits on top of truthful identity: a newcomer who knows what the project is still needs to know where things live before they can contribute. The doc names the major directories, the workspace or monorepo layout if any, and where a first change is likely to go — so a contributor doesn't have to reverse-engineer the structure or guess which folder owns which concern. - **First contribution on-ramp** — Becomes possible once setup and orientation are in place. Conventions a contributor will trip over (formatting, commit style, branch flow, how to run tests or checks locally) are stated where a contributor will actually look, and the gap between running the app and submitting a change is short and explicit rather than tribal. - **Stakeholder legibility** — A non-engineer landing on the repo — a collaborator, a domain stakeholder, a curious visitor — can answer what is this, who is it for, and is it alive without reading code or asking the maintainer. The README opens with the answer to those questions rather than burying them under build badges and install commands, and the project's audience is named, not assumed. - **Drift resistance** — The capstone that keeps every dimension above honest over time: docs that were correct at one commit silently rot as the code moves. Onboarding content has a known owner and a known cadence for re-walking the path from scratch, changes that invalidate setup instructions are caught close to when they happen rather than discovered by the next newcomer, and the gap between code reality and documented reality is treated as a real defect rather than a cosmetic one.
SendGrid Email Delivery
## Ownership Zone Owns the boundary between the application and SendGrid: the code path that constructs and dispatches transactional email (notably trip confirmations), the template data contract that feeds those sends, the handling of SendGrid responses and delivery failures, and the audit log that records what was sent, to whom, and with what outcome. This includes guarding against silent drops where a domain event (a trip being created, a booking confirmed) completes without its corresponding email being attempted or recorded. It also covers the operational visibility non-engineers need — support, ops, and founders asking "did the customer actually get the email?" — and the escalation path when SendGrid itself misbehaves (auth failures, suppressions, bounces, account-level throttling). ## Rubric - **Send path integrity** — Every domain event that is supposed to trigger an email actually attempts a send, and every attempt is recorded with its outcome. This is the floor the rest of the rubric stands on: until sends are reliably attempted and logged, the other dimensions are grading a surface that may be silently empty. The bad version is a try/catch that swallows SendGrid errors so the domain transaction looks successful while the customer hears nothing. - **Template data contract** — The data passed to each template is a typed, validated shape rather than an ad-hoc object assembled at the call site. Only meaningful once the send path exists: a reliable pipeline that ships malformed templates is worse than one that fails loudly. A missing field fails the send (or is caught in tests) instead of producing an email with "Hi{{first_name}}" rendered literally to a paying customer. - **Failure handling and retry discipline** — Sits on top of send path integrity: you can only have a coherent retry policy once failures are observed at all. Transient SendGrid errors (5xx, network) are retried with backoff; permanent errors (invalid recipient, suppressed address, 4xx auth) are not retried blindly and surface to a human. The bad version is infinite retries on a hard bounce, or one shot at a 503 and then nothing. - **Deliverability hygiene** — Requires information beyond the codebase: domain authentication (SPF, DKIM, DMARC), sender reputation, suppression list management, and bounce/complaint handling are actively maintained, not assumed. An experienced practitioner spots the difference in fifteen minutes by checking who owns the SendGrid account, when DKIM was last rotated, and whether anyone looks at the suppression list. The bad version is emails landing in spam for months while engineering insists "the API returned 202." - **Operational visibility for non-engineers** — Support, ops, and founders can answer "did this specific customer receive their confirmation, and if not why" without reading code or paging an engineer. This is the stakeholder-facing capstone: it only becomes honest once the audit log and failure handling beneath it are real. The bad version is a support agent guessing from the absence of a complaint, or an engineer running a one-off query every time a customer asks. - **Reconciliation against domain state** — On a known cadence, domain records that should have triggered an email are reconciled against the audit log of what was actually sent, and drift surfaces in a scheduled review rather than a customer complaint. Builds on send path integrity and the audit log: reconciliation is only possible once both sides of the comparison exist. The bad version is discovering six months in that a whole class of trips never got confirmation emails because a feature flag silently disabled the send. - **Content and compliance review cadence** — Templates, sender identity, and unsubscribe/footer behavior are reviewed by the people responsible for brand and legal on a known cadence, not whenever an engineer happens to edit them. Invisible from the codebase alone: excellence here is a practice, not a file. The bad version is a transactional template that hasn't been read by a human in two years and still references a product name from a previous pivot.
Accessibility (WCAG 2.1 AA)
## Ownership Zone WCAG 2.1 AA accessibility of the SvelteKit dashboard: keeping the pnpm a11y:auth regression gate green and correctly extended as new surfaces ship, semantic/ARIA and keyboard correctness across authenticated and public surfaces, color-contrast token discipline, status/error messaging, and the compliance audit trail under compliance/accessibility/. ## Rubric - **Gate coverage integrity** — New authenticated routes, modals, dropdowns, and popovers are registered in PROFILES/subSurfaces (a11y-auth.mjs) with locale-stable selectors (data-testid/aria-*), so the delta-only a11y:auth ratchet actually scans them instead of silently missing coverage. - **Semantic structure & ARIA** — Headings, landmarks, lists, labels, roles, and ARIA attributes expose intent to assistive tech and respect the role allowlist — guarding the axe rule families that have fired here (label, dlitem, nested-interactive, select-name, aria-input-field-name, aria-prohibited-attr). - **Keyboard & focus management** — Every interactive control is reachable and operable without a pointer; route changes, dialogs, and async panels move or restore focus predictably; scrollable regions are focusable. Covers the non-automatable WCAG criteria axe cannot catch. - **Contrast & non-text affordances** — Text meets 4.5:1 and focus rings / essential non-text content meet 3:1 in BOTH light and dark mode, expressed through semantic color tokens rather than raw primitives (per contrast-audit.mjs gating policy). - **Status & error messaging** — Asynchronous changes, validation errors, and toasts announce via aria-live / role=status / role=alert appropriately (WCAG 4.1.3) — info/success/warning use the polite status convention, only true errors use alert. - **Compliance trail currency** — statement.md, roadmap.md, audit-log.md, and the contrast report stay in sync with shipped work and the WCAG 2.1 AA / SGQRI 008-2.0 target, and governance gaps (réaudit cadence, public statement, VPAT) stay visibly tracked.
CircleCI Integration Health
## Ownership Zone Owns the integration between this product and CircleCI as a third-party CI provider — the client module that talks to CircleCI's API, the server-side route handlers that mediate those calls, the token and credential handling that authorizes them, the runtime validation of every response crossing the boundary, and the UI surface (the checks section and the status fields it feeds) where CircleCI-derived information is rendered to developers reviewing a PR. Also owns how CircleCI status flows into the broader PR status calculation, so that "this PR is failing CI" means the same thing wherever it's displayed. The zone ends where generic PR status logic begins and where non-CircleCI check providers start; anything that would equally apply to GitHub Actions or another CI vendor is out of scope unless CircleCI specifics are involved. ## Rubric - **Boundary validation is total** — Every response from the CircleCI API is parsed through a runtime schema before any field is read by application code, with no raw-shape access slipping past the boundary. This is the floor the rest of the rubric stands on: until the boundary is honest about what it received, every downstream behavior — status mapping, error UI, status rollup — is reasoning about a shape it hasn't actually verified, and a silent CircleCI API change will surface as a mystery blank UI rather than a loud parse failure. - **Credential handling is explicit and least-privilege** — Tokens have a single, named place they are read from, a single place they are attached to outgoing requests, and never appear in client bundles, logs, or error messages. Missing, expired, or unauthorized tokens are a distinguishable error class, not the same code path as "no failures found"; without this the rest of the integration cannot tell "we couldn't ask" apart from "we asked and got nothing." - **Status semantics are single-sourced** — There is one canonical mapping from CircleCI's vocabulary (workflow/job statuses, conclusions) to the product's notion of CI state, and every consumer — the checks panel, the rolled-up PR status, any badge or summary — reads through it. The bad version is the same status string interpreted differently in two places, so a PR shows "passing" in one view and "failing" in another and nobody can say which is right. - **Failure modes are legible to the developer looking at the screen** — Sits on top of boundary validation and credential handling: only once those distinguish their error classes can the UI render them as distinct, actionable states. Loading, empty-but-healthy, auth failure, provider unavailable, and malformed-response are visually and textually distinct; a developer staring at the section can tell in one glance whether to wait, fix their token, retry later, or file a bug — never a blank box with no explanation. - **Provider drift is anticipated, not discovered in production** — The team has a deliberate practice for noticing when CircleCI's API contract shifts: schema changes fail loudly in tests or staging, deprecations are tracked against the provider's changelog, and the integration's assumptions about pagination, rate limits, and response shapes are written down somewhere a new maintainer can find. The bad version is learning about a field rename from a user complaint. - **Stakeholder-answerable health** — A non-engineer (PM, eng manager, support) can answer "is CircleCI data flowing into the dashboard right now, and if not, why?" without reading code or pinging the integration's author. This becomes possible only once the dimensions above are in place — error classes are distinguished, status semantics are consistent — because before then there is no honest signal to surface. The capstone: the integration's health is observable as a property of the product, not folklore held by one engineer.
Content Schema Integrity
## Ownership Zone Owns the canonical content schema for food item entries and the integrity of every entry written against it — the field set (storage duration, method, temperature, signs of spoilage, and any other required attributes), the types and value ranges those fields accept, the consistency of formatting and units across entries, and the absence of contradictions between related fields. Covers the lifecycle of the schema itself (how it is defined, versioned, and evolved as new food categories or attributes are introduced) as well as the conformance of the content set to it at any given moment. Includes the review surface where new and edited item content lands, so that gaps, type errors, and inconsistent guidance are caught before they reach readers. Stops at presentation and rendering concerns, and at editorial voice questions that aren't expressible as schema rules. ## Rubric - **Schema is explicit and singular** — There is one named, machine-checkable definition of what a food item entry must contain, and it lives somewhere a contributor can find without asking. This is the floor the rest of the rubric stands on: until the schema exists as an artifact rather than as tribal knowledge, every other dimension is grading against a moving target. The bad version is a schema that lives in reviewers' heads and drifts silently between entries. - **Conformance is mechanically verifiable** — Only meaningful once the schema is explicit: given the definition, any entry can be checked against it without human judgment, and the check distinguishes missing required fields, wrong types, and out-of-range values from each other. A failing entry produces a specific, localized error rather than a vague this doesn't look right, and the check runs the same way for a reviewer, a contributor, and CI. - **Cross-field coherence is enforced, not hoped for** — Sits on top of basic conformance: once individual fields are valid, the schema also catches contradictions between them — a refrigerator duration that exceeds a freezer duration, a temperature range that disagrees with the named storage method, spoilage signs that contradict the stated shelf life. The bad version passes per-field validation while shipping guidance that is internally inconsistent and confuses the reader. - **Schema evolution is deliberate and backward-aware** — When the schema changes — a new required field, a tightened range, a renamed attribute — the change is a named event with a migration story for existing entries, not a silent edit that retroactively invalidates half the content set. Excellent practice makes it obvious which entries pre-date a change and what is required to bring them forward; the bad version adds a required field and pretends the existing corpus was always compliant. - **Contributor experience makes the right thing the easy thing** — A non-engineer adding or editing a food item can see what is required, get fast feedback when something is missing or malformed, and understand the error without decoding a stack trace. This is the stakeholder-facing dimension: if the people who actually write the content can't tell whether their entry is complete before they submit it, schema integrity becomes a gatekeeping ritual rather than a shared standard, and contributions slow or route around it. - **Gap visibility for non-engineers** — The capstone — only becomes possible once conformance is mechanically verifiable: someone running the site, planning content, or auditing quality can answer how many items are incomplete, which fields are most often missing, and which categories are weakest, without reading code or opening individual files. The bad version is a green CI badge sitting on top of a content set whose actual completeness nobody can summarize in a sentence.
Workflow Replay Safety
## Ownership Zone Inngest step-function correctness across lib/inngest/workflows/: step boundaries, replay-safe state flow, idempotent side effects, and early-return ordering — ensuring every workflow produces correct results on both the initial run and any subsequent retry or replay. ## Rubric - **Step-return state flow** — State that must survive across steps is returned from step.run and captured in outer scope, never written by mutating a closure-captured variable. On replay, memoized step results are substituted without re-executing the callback, so mutations silently disappear; the steward flags any `let x = ...; step.run(..., () => x = ...)` pattern where x is read in a later step. - **Step boundary granularity** — Per-entity work (per-steward, per-concern, per-PR comment) is split into idempotent per-entity step.run blocks rather than bundled into one multi-side-effect step. Bundled steps cannot partial-retry, so one transient failure re-executes all side effects on replay or skips them all on memoized return. - **Idempotency of side effects** — GitHub API calls, check-run posts, PR comments, DB writes, and PostHog captures inside step.run are either safe to re-execute on retry or guarded by a deterministic key (SHA, comment marker, idempotency token). Replays and retries must not produce duplicate comments, double-counted events, or conflicting check runs. - **Early-return and failure-path ordering** — Detection and dispatch logic (PR-merge detection, scope filtering, installation health, debounce) runs before early-return branches, and failure telemetry covers early-error exits — not just the happy path. The steward flags happy-path-only instrumentation and skip-paths that swallow signals the user expects to see. - **Same-SHA persisted state reuse** — Persisted state read across steps (review verdicts, slot acquisitions, debounce gates, claim linkage) is correctly scoped to the head SHA and replay-safe. Stale persisted state from a prior head must not be reused on a new SHA, and a same-SHA acquire-miss must not silently carry forward a verdict that no longer reflects the diff.
SEO & GEO Technical
## Ownership Zone I own technical SEO and geolocation architecture across the product's web surface — hreflang and canonical tag strategy, locale routing and middleware behavior, sitemap and robots directives, and the rendered metadata of every page template that search engines and AI crawlers consume. This includes the geo-targeting redirect logic (IP-based first-visit routing, locale cookies, crawler UA handling, x-default fallback), the relationship between the router/locale config and the hreflang/sitemap output, and the canonical surface that prevents duplicate-content fragmentation across localized variants. I also own the legibility of this surface to non-engineering stakeholders: whether growth, content, and regional teams can answer questions about international visibility without reading code. The zone covers both classical SEO crawlability and emerging GEO (generative engine optimization) signals where they intersect with the same metadata and routing primitives. ## Rubric - **Single source of truth for locale × URL** — There is one authoritative mapping of which locales exist, which URLs each locale covers, and which is the default. This is the floor the rest of the rubric stands on: hreflang, canonicals, sitemaps, and middleware all derive from this map, so when it drifts, every downstream signal drifts with it. The bad version is a locale list duplicated across the router, the sitemap generator, and a middleware constants file, each subtly out of sync. - **Canonical and hreflang consistency** — Only meaningful once the locale × URL map above is real. Canonical tags emit from one shared path rather than competing per-page or CMS-injected overrides, hreflang tags reflect the full locale matrix including x-default, and the two never contradict each other (a canonical pointing to a URL that hreflang says is an alternate is the classic failure mode). Adding a new locale or page is a typed change that surfaces every consumer, not a grep-and-pray exercise. - **Geo-routing determinism** — Builds on the locale map: middleware decisions (IP redirect, cookie-based return-visit handling, crawler UA passthrough, x-default fallback) are explicit, exhaustive, and tested as named paths rather than emergent from stacked conditionals. Redirect chains do not exist — a request reaches its destination in one hop or the routing has a bug. Crawlers see the same canonical content a human in that region would see, not a redirect loop or a cookie-walled variant. - **Crawl surface hygiene** — Sits on top of routing and metadata being consistent: sitemaps enumerate the same URLs that canonicals point to, robots directives match what the sitemap advertises, and noindex/canonical/hreflang never disagree about a single URL's intent. The bad version is a sitemap entry that is canonical-tagged elsewhere, or a noindexed page with hreflang alternates pointing at it — mixed signals that crawlers resolve unpredictably. - **Change safety on the SEO surface** — Becomes possible once the surface is consistent enough to reason about: route renames, locale additions, and template refactors are reviewed against their effect on canonicals, hreflang, sitemaps, and redirects before merge, not discovered weeks later in Search Console. There is a known set of regression checks that runs against this surface, and engineers shipping unrelated work do not have to be SEO experts to avoid breaking it. - **Stakeholder legibility of international visibility** — The capstone — only meaningful once the underlying signals are coherent enough to measure honestly. A growth or regional lead can answer did we lose German visibility last week, are all our locales indexed, and which pages are missing hreflang without reading code or pinging an engineer. The bad version is technical SEO living entirely inside engineers' heads while the people who care about regional traffic operate on faith. - **GEO and structured-data readiness** — Sits on top of canonical and metadata consistency: structured data, OpenGraph, and the signals that generative engines and AI crawlers consume are emitted from the same authoritative metadata layer as classical SEO tags, so a page's identity is one story across Google, LLM crawlers, and social previews. The failure mode is a page whose canonical, schema.org JSON-LD, and OG tags each describe a slightly different entity, leaving every consumer to guess.
React a11y Guardian
## Ownership Zone I own accessibility quality for the React component layer in the client/ directory — every interactive surface a user can see, hear, focus, or be trapped inside. That spans modal dialogs and their focus management, the conversation UI and its live-updating message stream, the onboarding flow with its audio and form interactions, and the shared primitives (buttons, badges, inputs, toasts) that compose all of the above. I am responsible for semantic HTML and ARIA correctness, keyboard reachability and focus order, color contrast under the active theme, screen reader behavior including live regions and route-change announcements, and the automated regression coverage that keeps these properties from rotting between releases. I am also responsible for the legibility of accessibility status to non-engineering stakeholders — whether someone outside the team can answer what conformance level we ship at and what is currently blocking it. ## Rubric - **Semantic foundation** — Interactive elements use the native control that already encodes role, state, and keyboard behavior; ARIA is reached for only when no semantic element fits. This is the floor the rest of the rubric stands on — a div masquerading as a button invalidates every downstream claim about keyboard support, focus, or screen reader behavior, because the assistive tech never knew there was a control there to begin with. The bad version is a tree of clickable divs with onClick handlers and bolted-on role attributes; the good version is boring HTML that mostly just works. - **Keyboard and focus discipline** — Only meaningful once the semantic foundation is in place: every interactive element is reachable and operable by keyboard, focus order matches visual order, focus is visibly indicated, and focus is trapped and restored correctly across modals, drawers, and route changes. The failure mode to watch for is the keyboard user who tabs into a modal and cannot escape, or who dismisses one and is dropped at the top of the document with no idea where they were. - **Screen reader truthfulness** — Sits on top of semantics and focus: what a sighted user perceives and what a screen reader announces are the same story, told in the same order. Dynamic content (streaming messages, toasts, validation errors, route changes) is announced through appropriate live regions or title updates rather than appearing silently; decorative content is hidden from the accessibility tree rather than narrated as noise. The bad version is a chat UI where new messages render visually but the screen reader stays silent, or where every icon is read aloud as image image image. - **Perceptual robustness** — Color contrast meets WCAG AA across both text and non-text UI under every supported theme, information is never conveyed by color alone, and the UI remains usable at 200% zoom and at the platform's reduced-motion and high-contrast settings. This dimension is what catches the regressions a theme rollout or a designer's palette tweak quietly introduces, where the pixels look fine to the person shipping them and unreadable to someone with low vision. - **Regression coverage** — Becomes possible only once the dimensions above have a defined good state worth defending: automated checks (axe-style audits, focus and keyboard tests, contrast tests) run in CI on the surfaces that matter, fail loudly on regression, and are wired into the same PR gate as the rest of the test suite. The bad version is a one-time audit spreadsheet; the good version is that an accidental aria-label removal or a contrast-breaking color change cannot land without someone explicitly overriding a red check. - **Conformance legibility** — The capstone — only honest once the underlying surface is consistent enough to measure. A non-engineering stakeholder (PM, founder, support, legal) can answer what conformance level the product ships at, what the current blocking violations are, and when they will be resolved, without reading code or paging an engineer. The failure mode is an a11y posture that exists only in individual engineers' heads and surfaces only when a customer or auditor asks an uncomfortable question. - **Triage and severity discipline** — Accessibility findings are classified by impact and WCAG level, not by whoever shouted loudest; Level A blockers are treated as release-blocking, AA issues are scheduled, and moot findings are explicitly closed with reasoning rather than left to drift. This is what separates a team that has an accessibility practice from a team that has an accessibility backlog — the latter accumulates findings indefinitely because nothing distinguishes a screen-reader-broken flow from a nice-to-have aria-describedby.
Test Foundation
## Ownership Zone The automated test suite that protects this codebase's trust-critical boundaries: GraphQL response parsing, review and check status calculation, authentication cookie handling, and token validation. The steward owns which boundaries deserve tests, the shape and isolation of those tests, the harness and fixtures they share, and the signal those tests give to a reviewer deciding whether a change is safe to merge. It also owns the relationship between the test suite and the humans who depend on it — what a green run promises, what it does not, and how that promise is communicated to reviewers and contributors. It does not own end-to-end product behavior, performance testing, or non-test code quality concerns. ## Rubric - **Boundary selection** — The floor the rest of the rubric stands on: a test suite is only as valuable as the boundaries it chose to cover. Excellent practice means tests cluster at the seams where wrong behavior would cause real harm — auth, parsing of external responses, money/permission decisions, state transitions — rather than spreading uniformly across trivial getters. A bad version tests what is easy and leaves the dangerous edges naked; you can tell at a glance because coverage tracks line count instead of risk. - **Test isolation and determinism** — Only meaningful once the right boundaries are chosen: a flaky or order-dependent test at a critical boundary is worse than no test, because it trains reviewers to ignore red. Each test sets up and tears down its own world, network and clock and randomness are controlled at the seam, and a failure points at one cause rather than a tangle. The bad version has tests that pass locally and fail in CI, or pass on Tuesday and fail on Friday. - **Failure legibility** — Builds on isolation: when an isolated test fails, the message and diff should tell a reviewer what broke without making them open the test file. Assertions name the property under test, fixtures are small enough to read in the failure output, and the failure mode of the system under test is what gets surfaced — not an incidental mock mismatch three layers deep. Bad suites greet you with a stack trace and a useResolvedRef is undefined and leave you to reverse-engineer the intent. - **Reviewer trust contract** — Sits on top of the technical dimensions above and is not visible from the code alone: it is the shared understanding between the suite and the humans reading PRs about what a green run actually promises. Reviewers should know which classes of regression the suite will catch and which it explicitly will not, so a green CI shifts review attention to the right places rather than producing false confidence. The bad version is a team that either rubber-stamps green PRs or ignores CI entirely because no one agrees on what it means. - **Harness ergonomics** — How quickly a contributor can write a correct new test for a trust-critical boundary. Shared fixtures, factories, and helpers exist for the recurring shapes in this domain; running a single test is fast and obvious; adding a test for a new boundary does not require inventing infrastructure. When this dimension is weak, tests get skipped not out of malice but because the path of least resistance is to ship without one. - **Coverage of the trust-critical set** — The capstone, only honest once the dimensions above hold: a known, named list of the boundaries this codebase considers trust-critical, and visible progress toward every one of them having a test. Excellence here is not a coverage percentage but the ability to point at the list and say which boundaries are protected and which are still on the human reviewer's shoulders. The bad version reports 80% line coverage while the auth path has zero tests.
Conversation Pipeline Resilience
## Ownership Zone The full conversation pipeline that turns user audio into spoken response — audio upload, transcription, language detection, chat completion, SSML generation, and TTS synthesis — viewed through the lens of how it behaves when something goes wrong. This steward owns the failure surface end-to-end: timeouts and partial responses from upstream model APIs, malformed or unexpected inputs at each stage boundary, fallback routes (plain-text TTS, default language, simplified SSML), error envelopes returned to callers, and the integration tests that prove each degraded path actually works. It also owns the coverage map itself — the catalog of which failure modes at which stages have explicit assertions, and which are still trusted on faith. New activity types, new languages, and new TTS routes enter this zone the moment they are added, because each one multiplies the failure surface that must be exercised. ## Rubric - **Failure surface is named, not implicit** — The set of ways each pipeline stage can fail is written down explicitly: timeout, upstream API error, malformed payload, missing field, unsupported language, schema-invalid SSML, and so on. This is the floor the rest of the rubric stands on — until the failure modes have names, no one can say what is covered and what isn't, and tests end up exercising whatever was easy to think of rather than what actually breaks. The bad version is a pipeline whose failure modes only get discovered in production incidents. - **Degradation is designed, not accidental** — For every named failure mode there is an intended behavior — a specific fallback, a specific error envelope, a specific user-visible outcome — and that intent is captured somewhere a reviewer can read before writing a test. Only meaningful once the failure surface above is named. The bad version silently swallows errors, returns 200 with empty audio, or crashes the whole pipeline because one optional stage timed out. - **Failure-path test coverage** — Each named failure mode at each stage has at least one integration test that drives the pipeline into that state and asserts the designed degradation actually happens, end-to-end. Sits directly on top of the two dimensions above: you cannot meaningfully cover what you have not named and designed for. The bad version is a test suite full of happy-path assertions and a single catch-all it returns 500 test. - **Boundary contracts between stages** — Each stage validates what it receives and what it emits against a typed contract, so a malformed handoff fails at the boundary that produced it rather than three stages downstream as a confusing TTS error. The bad version is one stage quietly passing None or an empty string forward and the symptom surfacing in synthesis logs with no trace of where it originated. - **Coverage parity as the surface grows** — When a new activity type, language, or TTS route is added, its failure modes are enumerated and covered before it ships, not bolted on after the first incident. This is an organizational property, not a code property — it shows up in review practice and in what is treated as done. The bad version is a pipeline whose coverage was strong at version one and has eroded with every feature added since. - **Stakeholder-legible reliability** — A non-engineer — product, support, an on-call lead — can answer questions like which fallback fired most often last week, which language has the worst degraded-response rate, and did SSML validation failures spike after the last deploy without reading code or pinging an engineer. The capstone — only becomes possible once the surface is named, designed, and covered consistently enough to measure honestly. The bad version is reliability that lives entirely in engineers heads and gets re-litigated every incident review.
Usability Steward
## Ownership Zone Every moment where a person interacts with the application and forms a judgment about whether it feels professional, responsive, and trustworthy. This covers the full surface of user-triggerable actions and their feedback (toasts, confirmations, loading states, status changes, error surfaces), the visual and interaction language across screens (layout consistency, density, typography, affordances), the navigational and informational scaffolding that lets a user orient themselves, and the empty/error/edge states that decide whether the product feels finished or half-built. The steward owns the experiential contract end-to-end: from the instant a click happens to the moment the user is sure something happened, and from first impression of a screen to the user's confidence that they know what to do next. ## Rubric - **Action acknowledgement** — Every user-triggered action produces a visible, timely signal that the system received it and is acting on it: a loading indicator, a toast, a status change, or a confirmation. This is the floor the rest of the rubric stands on — without it, the user is guessing whether the product is broken, and judgments about polish, hierarchy, or stakeholder visibility are grading a surface the user has already lost trust in. The failure mode is the silent click: the action fired, the state changed somewhere, and the user has no idea. - **Feedback proportionality** — Sits directly on top of action acknowledgement: once feedback exists, the question is whether it matches the weight of the action. Trivial actions get lightweight signals, destructive or irreversible actions get explicit confirmation, long-running actions show progress rather than a frozen button, and errors surface what went wrong specifically enough to act on. The eye-roll version is a modal confirming a no-op, or a toast saying something went wrong with no hint of what or why. - **Visual and interaction consistency** — The same kind of thing looks and behaves the same way across the product: buttons of equal weight share a style, primary actions sit predictably, spacing and typography follow a small number of rules rather than per-screen invention. Becomes possible to assess seriously only once acknowledgement and proportionality are in place; before that, consistency of silence is not a virtue. The bad version is each screen looking like a different person built it on a different day. - **Information hierarchy and density** — On any given screen, what the user is supposed to look at first is obvious, secondary detail recedes, and the page neither drowns the user in fields nor hides what they came for behind extra clicks. Practitioners argue about this constantly: too sparse feels like a prototype, too dense feels like a control panel, and the line between them is the difference between professional and amateur. Depends on visual consistency — hierarchy expressed through ad-hoc styling reads as noise rather than signal. - **Edge state completeness** — Empty states, loading states, partial-data states, permission-denied states, and error states are designed, not accidents. A first-run user with no data sees something deliberate; a slow network produces a real loading affordance, not a flash of broken layout; an error tells the user what to do next. This is where finished products separate from demos, and it is invisible until you actually hit the state — which is why teams routinely ship without it. - **Stakeholder-legible UX health** — A non-engineer (founder, support, PM, designer) can answer questions like which actions in the product currently complete without feedback, where users are most likely to feel lost, and whether the experience improved or regressed this month — without reading code or shoulder-surfing a developer. This is the capstone: it only becomes honest once the underlying surface is consistent enough to inventory and measure, and without it the other dimensions drift because no one outside engineering can tell when they slip.
Trip Data Integrity
## Ownership Zone Guards the integrity of the trip domain model end-to-end: the canonical trip lifecycle (draft, ready, booked, active, complete and any terminal states), the captain/crew relationship and the privileges that flow from it, trip-scoped preferences, and scorecard entries tied to a trip. Owns the type-level shape of these entities, the server-side preconditions that gate stage transitions, and the trust boundary that distinguishes captain-only mutations from crew-readable state. Covers the contracts between client components, server actions, and persistence — wherever a trip, its members, or its scores can be observed or changed. Does not own UI styling, payment flows, or notification delivery, except where those touch trip state transitions. ## Rubric - **Canonical status and role vocabulary** — The set of legal trip statuses and member roles is defined once, as a strict union, and every consumer reads from that single source. This is the floor the rest of the rubric stands on: until the vocabulary is fixed and narrow, transition guards and authorization checks are reasoning about a moving target. The bad version widens to plain string somewhere in the stack and silently accepts statuses that the rest of the system has never heard of. - **Server-authoritative state transitions** — Every move between trip stages is gated by an explicit precondition check on the server, not inferred from what the client just rendered. Only meaningful once the status vocabulary is canonical; otherwise the guard is checking against values it cannot fully enumerate. Excellence looks like illegal transitions failing loudly with a named reason; the bad version lets the client POST a new status and trusts it. - **Trust boundary for privileged mutations** — Captain-gated actions re-derive the actor's role from the authenticated session on every request, never from a role flag passed in by the caller. Sits on top of the role vocabulary above. The failure mode this dimension is calling out is the endpoint that accepts isCaptain: true in its payload, or that checks a role loaded once on page render and trusted forever after. - **Referential and relational consistency** — Crew membership, scorecard entries, and preferences cannot exist pointing at a trip, user, or hole that does not exist, and cannot contradict the trip's current stage (e.g., scores on a trip that never started). Constraints live close to the data, not scattered across callers, and orphaning a row requires deliberate effort rather than being the default outcome of a partial failure. - **Concurrency and idempotency under retry** — Two captains tapping the same button, a network retry, or a double-submitted form does not create duplicate crew rows, double-advance a stage, or split a scorecard. Becomes possible once transitions are server-authoritative; the test is whether replaying the same intent converges on the same state rather than compounding it. - **Stakeholder-legible trip state** — A non-engineer (support, ops, a captain asking why their trip is stuck) can answer where is this trip in its lifecycle, who is on it, and who can change what without reading code or asking an engineer to query the database. The capstone — only honest once the dimensions above are real, because legibility built on an inconsistent model just exports the confusion. The bad version is a support thread that ends with let me check with engineering.
MCP Server Contract
## Ownership Zone Owns the contract surface between the standalone MCP server process and the main web application that shares its data and operations. This includes the tool definitions exposed by the MCP server, the prompt templates that shape how those tools are described to LLM clients, the HTTP endpoints the web app exposes for MCP-mediated traffic, and the shared understanding of PR data shapes and available operations that both sides depend on. The zone covers how schemas, tool catalogs, and prompts evolve over time without the two processes silently drifting, and how MCP clients (and the humans configuring them) learn what tools exist and what they do. ## Rubric - **Single source of truth for shared shapes** — PR data shapes, tool argument schemas, and operation contracts are defined once and consumed by both the MCP server and the web app, rather than re-declared on each side and kept in sync by hope. This is the floor the rest of the rubric stands on: until both processes are reading from the same definitions, every other dimension is grading two artifacts that may already disagree. The bad version is parallel TypeScript types or hand-written JSON schemas that look similar at a glance and diverge field-by-field over months. - **Tool catalog discipline** — Only meaningful once shared shapes are in place: each MCP tool has a clearly named purpose, non-overlapping responsibility with its neighbors, typed arguments, and a declared result shape. Tools fail loudly with structured errors rather than returning success with an empty payload, and deprecated tools are removed or explicitly marked rather than left to rot in the catalog confusing clients. - **Prompt and description fidelity** — Tool descriptions and prompt templates accurately reflect what the tools actually do, including their argument semantics, side effects, and limits. The bad version is a description written when the tool was first added that no longer matches its behavior, leaving LLM clients to call tools based on a fictional contract; the good version has descriptions that change when behavior changes, treated as part of the contract rather than docstring decoration. - **Versioning and evolution discipline** — Becomes possible once the catalog and shared shapes are stable enough to reason about: changes to tool signatures, prompt templates, or response shapes are made with awareness of who is on the other end of the wire. Breaking changes are visible as breaking, additive changes are genuinely additive, and the team has an answer to *what happens to a client pinned to last month's contract* that isn't a shrug. - **Cross-process integration testing** — The contract is exercised end-to-end, not just unit-tested on each side independently. A test that boots both surfaces and walks through representative tool calls catches the divergence that two passing test suites on either side will miss; without this, the first signal that the contract broke is an LLM producing nonsense in production. - **Client-facing legibility** — The capstone, only honest once the dimensions above hold: a non-engineer integrating an MCP client (an analyst configuring Claude Desktop, a PM wiring up an agent) can answer *what tools does this server expose, what do they do, and what do I pass them* from the server's own self-description, without reading source. If the answer requires pinging an engineer or reading the implementation, the contract is leaking out of the artifact that's supposed to carry it.
Anthropic SDK Stability
## Ownership Zone The integration surface between this product and the Anthropic SDK: the pinned SDK version and its upgrade path, the streaming AI review endpoint, the prompt templates that drive Claude calls, the request/response shapes the SDK exposes, error and retry behavior, and the observability that tells the team whether Claude-powered features are healthy. Covers how SDK breaking changes, model deprecations, and prompt edits propagate through the review pipeline, and how those changes are surfaced to product and ops stakeholders who depend on review quality and uptime. Does not own the broader review UX or non-Anthropic LLM providers, but does own the seam where the SDK meets application code. ## Rubric - **Version pinning discipline** — The SDK is pinned with an upgrade strategy that matches its actual stability guarantees, not a default caret range chosen by the package manager. This is the floor the rest of the rubric stands on: until the team knows exactly which SDK version is running in production and why, every other dimension is grading a moving target. The bad version is a silent minor bump in CI that changes streaming semantics and nobody notices until a user reports a blank review. - **Typed boundary around the SDK** — All SDK calls flow through a narrow, typed adapter rather than being sprinkled across handlers. Builds directly on version pinning: once the version is known, a single boundary makes a breaking change a single typed diff instead of a scavenger hunt. Done badly, every route imports the SDK directly and a parameter rename turns into weeks of whack-a-mole. - **Streaming and failure semantics** — Streaming responses, partial outputs, timeouts, rate limits, and tool-use errors each have a defined behavior — surfaced to the user, retried, or failed loudly — rather than collapsing into a generic try/catch that swallows the difference. The bad version returns an empty review and a 200, leaving callers unable to tell a refusal from a network blip from a quota exhaustion. - **Prompt change governance** — Prompt templates are treated as versioned product surface, not config tweaks. Changes are reviewed against representative inputs, diffed against prior outputs, and tied to an owner who can say what the prompt is meant to do. Excellence here is invisible from the code alone: it shows up in whether the team can answer who changed the system prompt last month and what regressed, not in how the templates are formatted. - **Model and deprecation awareness** — Someone owns watching Anthropic's model lifecycle, deprecation notices, and SDK changelog, and that awareness translates into scheduled upgrades rather than surprise outages on a deprecation date. This dimension cannot be assessed from the repo — it lives in calendars, runbooks, and who reads the changelog — but its absence is what causes a Tuesday morning fire when a model id stops resolving. - **Stakeholder-visible review health** — Product, ops, and support can answer how Claude-powered reviews are performing — success rate, latency, refusal rate, cost per review — without reading code or pinging an engineer. Sits on top of the dimensions above: honest health numbers are only possible once the boundary is typed, failure modes are distinct, and prompt versions are tracked. The bad version is a dashboard that shows 200s while half the reviews are empty strings. - **Regression coverage at the seam** — The integration has tests that exercise the SDK boundary with realistic fixtures — streaming chunks, error envelopes, tool-use payloads — so an SDK bump or prompt edit fails in CI rather than in production. Only meaningful once the typed boundary exists; without it there is no seam to test against, just scattered call sites that each need their own fixtures.
Dolt Test Infrastructure
## Ownership Zone The internal/testutil package and TestMain entry points that provision, isolate, and tear down Dolt containers for Beads' Go integration test suite. ## Rubric - **Container lifecycle correctness** — Shared and per-test Dolt containers start, expose mapped ports, and terminate cleanly; sync.Once gating and crash detection propagate failures without leaking containers or temp state. - **Per-test isolation** — Tests cannot observe each other's data: branch-per-test via DOLT_BRANCH, ResetTestBranch between subtests, MaxOpenConns(1) and USE-database invariants, and stale-branch cleanup all hold. - **Skip-vs-fail gating** — The doltReadiness state machine downgrades to a clean skip when Docker, the exact image, or BEADS_TEST_SKIP says so, instead of failing tests or making Docker Hub network calls. - **Production safety firewall** — Test infra refuses to touch production: port 3307 is rejected, BEADS_TEST_MODE is enforced, and shared test DB names never overlap real Beads data. - **Cross-platform parity** — Windows stubs match the Linux/macOS testutil API surface and skip cleanly; the CI matrix (Linux full, macOS full, Windows smoke) stays internally consistent with what testutil exposes. - **Dolt version pinning** — DoltDockerImage is the single source of truth for the Dolt version used in tests, kept in lockstep with the production Dolt runtime and validated by CI.
Monorepo Workspace Coherence
## Ownership Zone Owns the coherence of the workspace as a multi-package monorepo: the root workspace declaration, the shape and conventions of packages under packagesprompts: logical-model usage, registry name@version uniqueness, zod input contracts, deterministic render, and eval coverage. ## Rubric - **Versioning discipline** — Prompt changes bump version; each name@version is unique in the registry; shipped versions are not silently edited in place. - **Model agnosticism** — Prompts reference logical model names (reasoning-mid, reasoning-high, fast-cheap) and never hardcode vendor model IDs. - **Typed input contract** — Every prompt declares a zod input schema and is rendered through validated input (renderSafe), failing fast on bad input. - **Render purity** — render() produces ChatMessage[] deterministically from validated input with no side effects or hidden state. - **Eval coverage** — Prompts carry eval cases asserting output shape/quality; high-value prompts are not shipped eval-less.
Astro Build Resilience
## Ownership Zone Owns the Astro static site build pipeline end-to-end: the integrity of every `astro build` run, the warnings and errors it surfaces, the wall-clock time it takes, and the health of the inputs the build consumes (component imports, frontmatter contracts, image references, route collisions, layout integrity). Covers the relationship between source content and built output across the full file tree, the CI signal that gates deploys on a clean build, and the visibility of build health to non-engineering contributors who edit content but do not read build logs. Does not own runtime behavior in the browser or content authorship itself — only whether what authors and developers commit produces a trustworthy, fast, warning-free build artifact. ## Rubric - **Build determinism** — The same commit produces the same build output, the same warning set, and roughly the same duration on every run. This is the floor the rest of the rubric stands on: until the build is deterministic, every other dimension is grading noise. Flaky failures, order-dependent warnings, and "it built last time" are the failure modes this dimension calls out. - **Warning hygiene** — Warnings are treated as signal, not wallpaper. A clean build means zero warnings on main, every warning that does appear has a known owner and a known fate (fix, suppress with reason, or upstream issue), and new warnings fail loudly in CI rather than accumulating into background noise nobody reads. The bad version: a build log with 40 warnings everyone scrolls past. - **Input contract enforcement** — Only meaningful once the build runs cleanly: the things the build consumes — component props, frontmatter schemas, image paths, collection entries, route definitions — are validated at build time against a declared contract, so a typo in a content file or a renamed component fails the build with a precise message rather than producing a silently broken page. Contracts are explicit and versioned, not implicit in whatever the templates happened to read last. - **Build performance budget** — Builds complete within a stated time budget appropriate to the site's size, and sustained drift against that budget is treated as a regression with an owner. Sits on top of determinism: you can only defend a budget when run-to-run variance is small. The bad version is a build that quietly grew from 30 seconds to 4 minutes over a year because nobody was watching the trend. - **Content-author feedback loop** — Becomes possible once input contracts and warning hygiene are in place: a non-engineer who edits a markdown file or swaps an image gets a clear, local signal about whether their change will build, in language they understand, before it reaches main. Excellence here is judged by whether content contributors can self-serve — not by how elegant the build internals are. The failure mode is a content editor whose PR breaks the build and who cannot tell why without pinging an engineer. - **Deploy gate trust** — The capstone — only honest once the dimensions above hold: a green build on main is treated as sufficient evidence to deploy, and a red build actually blocks. No one routinely overrides the gate, no one ships from a local build to dodge CI, and stakeholders trust that "the site builds" means the site is in fact deployable. When the gate has been bypassed, there is a recorded reason and a follow-up.
Tenant Isolation
## Ownership Zone Multi-tenant org_id isolation: every tenant-scoped table carries org_id, every data access is scoped by org_id, and workflow/AI-call/audit records propagate tenant context. ## Rubric - **Schema tenancy** — Every tenant-scoped table declares a notNull org_id column referencing org.id. - **Query scoping** — Reads and writes on tenant tables filter by org_id; no unscoped queries that can span orgs. - **Context propagation** — Workflow runs, steps, ai_call, and audit_log carry org_id threaded from the event payload through execution. - **Cross-tenant leakage** — Joins, references, and outputs never mix rows across orgs; foreign keys stay within the same org. - **Audit traceability** — Tenant-scoped mutations are recorded in audit_log with org_id and actor for accountability.
Captain Permission Fence
## Ownership Zone Captain Permission Fence owns the authorization boundary between captains and crew members across the entire trip-management surface: score entry, trip editing, crew management, itinerary changes, and join-link administration. The zone covers server-side enforcement on every captain-only mutation endpoint, the row-level security policies on the underlying protected tables (trips, scores, crew_members, itinerary, trip_members), and the automated test coverage that proves rejection works for unauthenticated callers, crew callers, and captains of other trips. It also covers the consistency between what the UI shows as captain-gated and what the backend actually enforces, and the visibility of authorization posture to non-engineering stakeholders who need to answer questions like which actions a given role can perform. UI affordances and client-side gating are in scope only insofar as they must agree with the server's truth; the server and database are the source of that truth. ## Rubric - **Server-derived identity at the boundary** — Authorization decisions are made from a session the server itself derived, not from any value the client could shape — no trusting a userId in the body, a role in a header, or a captain flag in a cookie. This is the floor the rest of the rubric stands on: until identity at the boundary is real, every downstream check is grading work whose subject can be forged. The bad version is an endpoint that reads who the caller claims to be from the request and proceeds. - **Database-level backstop independent of app code** — Protected tables enforce ownership rules in the data layer itself, so a bug, a missing middleware, or a future endpoint cannot silently expose captain-gated rows. Only meaningful once server-derived identity exists, because the policies must key off a trustworthy principal. The failure mode this rules out is the all-too-common one where the only thing standing between a crew member and another trip's data is whether some developer remembered to add an if-check. - **Uniform enforcement across the protected surface** — Every captain-only action enforces the same captain-of-this-trip rule the same way, through a shared check rather than per-endpoint reinventions. Sits on top of the two foundational dimensions above: once identity and the database backstop exist, the question becomes whether the app layer applies them consistently. The eye-roll version is one endpoint checking ownership via a join, another via a cached role, and a third not at all — all nominally "protected". - **Negative-path test coverage by caller type** — Automated tests prove rejection, not just acceptance, and they exercise the three caller shapes that actually matter: unauthenticated, authenticated-but-not-a-member, and authenticated-captain-of-a-different-trip. Becomes possible once enforcement is uniform enough to assert against. A suite that only tests the happy path is grading whether captains can do their job, not whether anyone else is kept out — which is the entire point of the fence. - **UI/server agreement on what is gated** — What the interface presents as captain-only and what the server actually refuses to do for non-captains are the same set, with no actions hidden only by a missing button. This dimension is invisible from any single layer of the codebase alone — it requires comparing client affordances against server behavior. The failure mode is a crew member discovering, by curling the endpoint the UI hid, that the lock was cosmetic. - **Stakeholder-legible authorization model** — A non-engineer — a support agent, a product owner, a founder fielding a customer question — can answer "what can a crew member do versus a captain, and where is that written down?" without reading source code. The capstone of the rubric: only honest once enforcement is uniform and UI/server agree, because otherwise the documented model and the real one diverge. The bad version is a permissions story that lives only in the heads of two engineers and gets re-derived every time someone asks.
Dashboard Onboarding Clarity
## Ownership Zone Owns the path a new user or contributor walks from a fresh clone to a running local instance with all integrations live. The territory covers the README and quickstart, the .env.example and every variable a real run depends on, the runbook for setting up the GitHub OAuth app and obtaining tokens for GitHub, CircleCI, and Anthropic, the Settings page copy that guides token entry in-product, the MCP server setup guide, and the version pins (Node, package manager) that determine whether install steps even work. Also owns the contract that these surfaces stay in sync with each other and with the actual configuration the code reads at runtime, so that setup instructions do not drift as dependencies and integration points change. ## Rubric - **Runtime-config truth** — The set of environment variables, secrets, and version pins documented for setup matches what the code actually reads and requires at startup, with nothing extra and nothing missing. This is the floor the rest of the rubric stands on: if the documented config is fiction, every other dimension is grading a tour that leads somewhere the code does not live. Excellence looks like a single source of truth that documentation derives from, not two lists drifting apart; the failure mode is a new user copying a .env that boots the server but silently disables a feature. - **First-run path is linear** — A new contributor follows one ordered path from clone to working app, with no branching choose-your-own-adventure between platforms, package managers, or optional integrations until the core path works. Sits on top of runtime-config truth: ordering steps only helps if the steps themselves are real. The bad version is a README that lists prerequisites, configuration, and commands as parallel sections and leaves the reader to sequence them. - **Third-party setup is walked, not waved at** — For every external account, OAuth app, or token the product depends on, the docs name where to click, what scopes or permissions to grant, what to paste where, and how to tell it worked. Only meaningful once the first-run path is linear; otherwise the third-party detour stalls a user mid-sequence with no way back. Excellence reads like a runbook a non-expert can execute; the eye-roll version is a sentence saying create a GitHub OAuth app and configure the callback URL with no link, no field names, and no example values. - **In-product guidance matches the docs** — Settings pages, empty states, and inline help for tokens and integrations agree with the external docs on names, formats, and where to obtain values, and they degrade gracefully when something is missing or wrong. This is a stakeholder-facing dimension: a user who never opens the README should still succeed, and a support conversation should not have to reconcile two different vocabularies for the same token. Bad implementations have a Settings field labeled one way and a README that calls the same thing something else. - **Failure modes are legible to the person hitting them** — When setup goes wrong — wrong Node version, missing env var, expired token, misconfigured OAuth callback — the error the user sees points at the surface they need to fix, not at a stack trace ten layers down. Becomes possible once runtime-config truth is in place: you can only diagnose a missing variable clearly if you know which variables are required. The failure mode is a generic 500 or a TypeError on undefined that sends the user to ask in chat instead of self-serving. - **Doc freshness has an owner and a trigger** — Onboarding surfaces are revisited on a known trigger — dependency bumps, new integrations, version pin changes, settings additions — rather than whenever someone happens to notice rot. This dimension is invisible from the codebase alone: it is about team practice, not file contents. Excellence is a contributor knowing that adding a new env var or integration is not done until the corresponding doc surfaces are updated; the bad version is README drift discovered six months later by a frustrated new hire. - **Time-to-first-success is known** — Someone owns the answer to how long it takes a new contributor to go from clone to a running app with real integrations, and that number is measured from real attempts rather than guessed. The capstone — only honest once the dimensions above hold, because otherwise the number is measuring confusion rather than setup. Stakeholders (maintainers, hiring managers, OSS contributors) can answer is onboarding getting better or worse without reading code; the failure mode is a team that believes setup takes 15 minutes because that is how long it takes them, while every newcomer quietly spends three hours.
Supabase Query Boundary
## Ownership Zone Every Supabase client call site in the application — the `.from(...)` queries, their select/insert/update/delete/upsert shapes, the error returns they hand back, the TypeScript types that describe their rows, and the row-level-security assumptions baked into how they're issued. This steward owns the boundary between the Next.js application layer and the Supabase schema: how queries are shaped, how failures surface, how column lists are declared, and how schema drift is caught before it reaches a rendered page or an API response. It also owns the legibility of that boundary to non-engineering stakeholders who need to answer questions like "did a schema change break the trips page last night?" without reading TypeScript. It does not own the database schema itself, the auth provider, or unrelated network I/O — only the call sites where the app talks to Supabase. ## Rubric - **Error-return discipline** — Every query destructures and handles the `error` return; a failed query never silently produces an empty array that the UI renders as "no data." This is the floor the rest of the rubric stands on: until errors are observed at the call site, every other dimension is grading queries whose failures are invisible. The bad version is the one where a 500 from Postgres becomes a blank page and nobody finds out for a week. - **Explicit query shape** — Selects name their columns; inserts and updates name their fields; nothing relies on `select('*')` or implicit "give me whatever is there." Without this, the typed-schema and drift-detection dimensions below are reasoning about a shape the code never declared. The failure mode is a column rename or removal that compiles cleanly and ships, because the query never said what it actually wanted. - **Typed schema contracts at the boundary** — Only meaningful once query shapes are explicit: rows returned from Supabase are typed against a generated or hand-maintained schema definition, and a column that disappears from the database becomes a TypeScript error rather than a runtime `undefined`. The rough heuristic for the bad version is grepping for `as any` near a Supabase call, or finding handlers that destructure fields the schema no longer has. - **RLS and access-path coherence** — Sits on top of the dimensions above: queries are issued with the right client (anon vs service role) for the trust level of the caller, and the RLS policies the app depends on are documented somewhere a developer can find without spelunking the Supabase dashboard. The failure mode is a service-role client used in a user-facing route "because it was easier," quietly bypassing the policies the rest of the app assumes are in force. - **Schema-drift response cadence** — Becomes possible once the boundary is typed and explicit: when the database schema changes, there is a known path — generated types regenerated, affected call sites identified, owners notified — and that path runs on a cadence, not in reaction to a production incident. A team without this dimension finds out about drift from a customer; a team with it finds out from a CI failure or a scheduled review. - **Boundary observability for non-engineers** — The capstone — only honest once the surface is consistent enough to measure. A product manager, ops person, or founder can answer "are Supabase queries failing more than usual?" or "which tables does the app actually touch?" without paging an engineer or reading source. The bad version is a steward that knows the call sites perfectly but whose health is locked behind a developer's terminal.
Plugin Release Coherence
## Ownership Zone Version, identity, MCP server name, skill slug, and install-instruction consistency across the marketplace manifest, plugin manifest, SETUP.md, and README for the Steward Claude Code plugin. ## Rubric - **Version synchronization** — Marketplace version, plugin version, and any version references in SETUP/README move together on every release; no stale version strings linger after a bump. - **Identity and naming consistency** — Plugin name, MCP server name, marketplace name, and brand references match across manifest, SETUP, README, and skill files; old names (e.g. contextgraph) do not leak back in after a rename. - **Skill registration parity** — Every shipped skill under plugins/steward/skills/ is reflected with its real slug (e.g. steward:define-steward) in README and SETUP verification steps, and removed skills are removed from docs. - **Install and verify instructions** — Documented install, reload, update, /mcp check, and skill-availability check match what the current marketplace and plugin manifests actually expose; commands users are told to run still work. - **MCP server contract surface** — The mcpServers.steward declaration in plugin.json (name, type, url) matches what skills and docs tell users to expect, and changes to the server name or transport are propagated through every artifact.
Agentsonar Website Experience
## Ownership Zone The complete user-facing web experience for Agentsonar — visual design, interaction patterns, information architecture, performance characteristics, and accessibility. This includes the public website surfaces, landing pages, navigation flows, form interactions, and the overall impression a visitor forms in their first minutes. The steward owns the relationship between what the product does and what a visitor understands it does, the clarity of the value proposition, and whether the site invites engagement or creates friction. ## Rubric - **Value proposition clarity** — A visitor in their first 30 seconds understands what Agentsonar does and why they should care. The core promise is stated plainly, not buried in jargon or abstract language, and the landing experience immediately answers the question a prospect is asking: what problem does this solve for me? Confusion or misdirection at this layer is the floor the rest of the experience stands on. - **Information architecture and navigation** — The site structure reflects how a visitor thinks about the product, not how the engineering team organized the code. A user can find what they need without hunting; related concepts live near each other, and the path from entry point to key actions is obvious. Poor IA makes every other dimension harder — a beautiful page nobody can find is invisible. - **Interaction responsiveness and smoothness** — Forms, buttons, and interactive elements respond immediately and predictably. Lag, unresponsive clicks, or unclear feedback on state changes create doubt about whether the product itself is reliable. Interactions should feel snappy enough that the user never wonders if they were heard. - **Visual consistency and brand coherence** — The site speaks in a single visual voice — consistent typography, color use, spacing, and component design across pages. Inconsistency reads as unfinished or untrustworthy. The visual language should reinforce the positioning: if Agentsonar is modern and precise, the design should feel that way. - **Accessibility and inclusive design** — The site is usable by people with different abilities: keyboard navigation works, color contrast is sufficient, text is readable, and interactive elements are discoverable without a mouse. This is not a nice-to-have; it is the floor for a professional product. Inaccessible sites exclude users and signal carelessness. - **Stakeholder alignment on positioning** — The founding team, product, and marketing agree on what the site is saying about Agentsonar and who it is for. Without this alignment, the site becomes a patchwork of conflicting messages. This dimension is invisible in the code but shows up in whether the site reinforces or undermines the company's strategy.
Navigation & Route Coverage
## Ownership Zone Owns the complete map of routes the site generates and the navigation fabric that connects them — the header and primary nav, category and index pages, in-content cross-links within guides and food entries, footer links, and any programmatic linking between related items. Responsible for knowing every URL the generator emits, whether each one is reachable from at least one navigation path, and whether every internal href resolves to a real generated route. Covers the lifecycle of new pages joining the site (a new food item or guide must be wired into navigation, not just generated) and the lifecycle of removed or renamed pages (inbound links must follow). Also owns the visibility of navigation health to non-engineering contributors — writers and editors adding content should be able to see whether their page is reachable without reading code. ## Rubric - **Route enumeration is ground truth** — There exists a single, trustworthy answer to the question what URLs does this site emit, derived from the generator itself rather than guessed from the file tree or scraped after deploy. This is the floor the rest of the rubric stands on: until route enumeration is reliable, every other dimension is grading work against an unknown denominator, and orphan or broken-link claims are unfalsifiable. - **Link integrity is enforced, not hoped for** — Every internal href the site emits points at a route that actually exists in the enumerated set, and a dangling link fails the build or a checked gate rather than shipping silently to readers. Only meaningful once route enumeration is ground truth; with that in place, link integrity becomes a mechanical check rather than a judgment call. The bad version is a site where 404s are discovered by users. - **Reachability is a property of every page** — Every generated page has at least one inbound navigation path from a known entry point (home, header, category index, or a guide that itself is reachable), and orphans are treated as defects rather than as content that exists but no one can find. Sits on top of route enumeration: you cannot count orphans until you can list pages. The failure mode is a page that exists at a URL but is invisible to anyone who didn't author it. - **Navigation reflects the content model** — Categories, indexes, and cross-links mirror the actual shape of the content (taxonomy, relationships between items and guides, hierarchy depth) rather than drifting into a historical artifact of how the site looked two redesigns ago. Becomes possible once reachability is solid; the question shifts from can users get there to can users get there the way the content suggests they should. The eye-roll version is a category page that lists six items while the generator emits sixty. - **Content authors can self-serve** — Writers and editors adding a new food item or guide can tell, before merging, whether their page will be reachable and whether their internal links resolve, without asking an engineer or waiting for a deploy. This is the stakeholder-facing dimension: excellence here is judged by whether non-engineering contributors are unblocked, not by how clever the tooling is. The bad version is a tribal-knowledge process where only the original author knows which nav file to edit. - **Change hygiene on rename and removal** — When a page is renamed, moved, or retired, inbound links and redirects are updated as part of the same change, and the steward's map reconciles rather than carrying ghost entries. Only meaningful once enumeration and link integrity are in place; without them, rename hygiene degenerates into chasing 404s reported by readers. Excellence looks like no link rot accumulating across releases. - **Navigation health is legible without code** — Counts of orphaned pages, broken internal links, and unreachable routes are visible to a non-engineer in a place they can find on their own, with enough history to tell whether things are improving or regressing. The capstone — only honest once the underlying enumeration, integrity, and reachability dimensions are solid enough that the numbers mean what they say.
Input Sanitization
## Ownership Zone Every user-facing input surface in the codebase — form fields, URL parameters, API request bodies, file uploads, and any data sourced from external systems — and the validation, escaping, and encoding logic that prevents malicious payloads from reaching execution contexts. This includes input validation at the boundary, output encoding for the rendering context (HTML, SQL, shell, JSON), and the relationship between declared input schemas and the actual sanitization applied downstream. The steward owns the gap between what a user can send and what the system safely executes. ## Rubric - **Boundary validation is declarative** — Input validation lives at the entry point and is expressed in a single source of truth — a schema, type definition, or validation rule that every handler consults. Without this, validation logic scatters across handlers and diverges; a field validated in one endpoint is trusted unvalidated in another, and the gap is invisible until exploit time. Validation is impossible to skip by accident. - **Output encoding matches the context** — Data is encoded for the specific context it enters — HTML entities for HTML, SQL escaping for queries, shell quoting for commands, JSON escaping for JSON. A single encoding function applied everywhere is a sign that the team does not distinguish contexts; the same string safe in HTML is dangerous in SQL. Encoding is applied at the point of output, not assumed to have happened upstream. - **Injection vectors are named and tested** — The team knows which inputs can reach which execution contexts and has written tests that verify each vector is blocked. Without this, injection risks hide in the gap between what the team thinks is validated and what actually is. A new feature that adds a path from user input to a database query is a typed change that surfaces the injection test, not an implicit assumption. - **Dangerous operations are explicit** — Code that interprets user input as code — eval, dynamic SQL construction, template injection, unsafe deserialization — is visible and rare. If the codebase uses these patterns, they are justified in comments, isolated to a small surface, and guarded by strict input constraints. A reader should be able to find every place user input flows into code execution in under a minute. - **Validation failures are observable** — When input validation fails, the event is logged with enough context to detect patterns — repeated failures from the same source, systematic probing of a field, or a new attack vector. A validation failure that disappears silently or is only visible in a debug log is a missed signal; the team should be able to answer whether they are under attack without reading code. - **Security assumptions are documented** — The team has written down what they assume about input — which fields are trusted, which are user-controlled, which sanitization is applied where, and what the consequences are if an assumption breaks. Without this, the next engineer assumes the wrong thing and introduces a gap. Documentation is updated when assumptions change, not written once and forgotten.
Knowledge Store Integrity
## Ownership Zone The repository knowledge store — docs/, AGENTS.md, and ARCHITECTURE.md — keeping repository knowledge synchronized with repository state across quality, discoverability, traceability, structure, and coverage. ## Rubric - **Knowledge Freshness** — Generated and SYNC artifacts (db-schema, api-surface, dep-graph, repo-map) are regenerated to match current repository state; stale generated docs are caught. - **Knowledge Discoverability** — Docs live in the correct tier/location and are reachable from entry points (README, AGENTS.md, docs indexes); nothing is orphaned or misfiled. - **Cross-Reference Integrity** — Internal links and file-path references between docs, and from docs to code, resolve to real targets; no broken or dangling references. - **Traceability** — Each generated/analysis artifact names its source, and decision/history docs link to the commits, PRs, or canonical intent that justify them. - **Documentation Drift** — Narrative and canonical docs (ARCHITECTURE.md, docs/canonical/architecture.md) accurately describe current repository reality; divergences are flagged per the SYNC vs ASYNC tier rules. - **Repository Coverage** — Every significant repository asset (system, package, app, route, table, steward) is represented somewhere in the knowledge store; undocumented assets are detected.
Image Asset Health
## Ownership Zone Every image asset the site depends on — food item photos, guide illustrations, and the OG image generation pipeline — together with the references that bind them to content entries, components, and route templates. This covers the full lifecycle: which images exist on disk, which are referenced, which are generated on demand, whether each rendered page resolves to a real file, and whether the social-sharing surface produces valid output for every route. The zone includes the inverse direction too: assets that exist but are no longer referenced, and references that point at paths nothing produces. It does not extend to image content choices or visual design — only to whether the pipeline from authored reference to delivered pixels is intact, lean, and observable. ## Rubric - **Reference resolvability** — Every image path named in content, components, or templates resolves to a real, non-empty file at build time, and an unresolvable reference fails the build loudly rather than shipping a broken `<img>` tag to production. This is the floor the rest of the rubric stands on: until references resolve, sizing, generation, and orphan hygiene are all grading work that may render as a broken icon anyway. - **Generated-image pipeline integrity** — Routes that rely on generated imagery (OG cards, derived thumbnails, templated illustrations) produce valid, correctly-dimensioned output for every input the route can receive, not just the handful exercised during development. The bad version of this dimension is a generator that silently emits a 0-byte file or a fallback placeholder for half the catalogue and nobody notices until a link is shared. - **Asset library hygiene** — The set of files on disk stays close to the set of files actually referenced; orphans are pruned on a known cadence rather than accumulating as repo weight, and additions are deliberate rather than drive-by. Only meaningful once reference resolvability is in place — otherwise pruning is dangerous because you cannot trust the reference graph you are pruning against. - **Delivery weight discipline** — Images are sized, compressed, and formatted for the surface that actually consumes them, with the source-of-truth original kept separate from the web-delivery variant. A rubric-failing setup ships 4MB hero JPEGs to mobile, has no convention for which dimensions and formats are canonical, and treats every new image as a one-off decision. - **Authoring ergonomics** — Sits on top of the dimensions above: a content author can add a new food item or guide without learning the asset pipeline, knows exactly where to drop the image and how to reference it, and gets immediate feedback when they get it wrong. When this fails, you see the same handful of engineers re-explaining the conventions in PR review and authors avoiding image-heavy entries entirely. - **Stakeholder-facing visibility** — The capstone — only becomes possible once the surface is consistent enough to measure honestly. A non-engineer (content owner, founder, marketer checking a social share) can answer questions like how many pages have working previews, which entries are missing imagery, and whether last week's content drop rendered cleanly, without asking an engineer to grep the repo.
GitHub GraphQL Boundary
## Ownership Zone Every GitHub GraphQL query the application and MCP server issue, the TypeScript types those queries map onto, and the proxy layer that mediates between the GitHub API and the rest of the app. Covers query authoring and naming, schema validation against the live GitHub schema, response type fidelity, the handling of GraphQL-level and HTTP-level error paths (auth, rate limits, partial-data responses, network failures), and the visibility of API health to anyone debugging a broken UI state. The zone ends where domain logic begins — once a typed, validated response leaves the boundary, downstream concerns belong to other stewards. ## Rubric - **Schema-anchored queries** — Every query is checked against the real GitHub GraphQL schema as part of the normal development loop, not as a manual ritual. This is the floor the rest of the rubric stands on: until queries are anchored to the schema, type fidelity and error handling are grading work that may already be wrong. A renamed or removed field fails at build or CI time, not at runtime in front of a user, and the validation surface is impossible to bypass by accident. - **Type fidelity end-to-end** — Only meaningful once schema anchoring is in place: response types reflect what the schema actually returns, including nullability, union variants, and connection shapes. Raw API payloads do not enter the app via unchecked casts that paper over drift; when the schema changes, the type system surfaces every consumer rather than letting a silently-wrong shape propagate into rendering code. - **Explicit failure surface** — Each distinct failure mode at the GitHub boundary — network error, non-2xx HTTP, GraphQL errors array, partial data, 401 auth, 403/429 rate limit, timeout — has a named, structured handling path. Bad practice here is the catch-all that turns six different failures into one opaque message; good practice is that a caller can tell auth failure from rate limiting from a malformed query without reading the proxy source. - **Query hygiene and discoverability** — Queries are named, colocated with their types, and easy to enumerate. A practitioner asking what does this app ask GitHub for? can answer it from a single inventory rather than grepping. Anonymous one-off queries scattered across handlers are the failure mode this dimension calls out; a clean zone makes it obvious which queries exist, who calls them, and what schema surface they depend on. - **Boundary discipline** — Builds on type fidelity: the proxy is the only path between the app and GitHub, and it is the only place that knows about GitHub-specific concerns (auth headers, rate-limit semantics, GraphQL error shape). Domain code does not reach around the boundary, and the boundary does not leak GitHub-shaped error objects or untyped blobs into domain code. Violations show up as duplicated request logic or domain modules importing GitHub SDK types directly. - **Operator-visible API health** — The capstone, only possible once the failure surface is explicit and queries are enumerable: when the dashboard is empty or stale, a non-engineer can tell whether GitHub returned an error, rate-limited the app, returned partial data, or simply had nothing to show. Per-query failure rates, recent rate-limit hits, and auth status are visible without reading code, so debugging a broken UI state does not start with paging an engineer to add logging.
Env Config Safety
## Ownership Zone Owns the application's environment-variable configuration surface end to end: which variables are required, how they are validated, where they are read, how they are documented for new contributors, and how secrets are separated from public/feature-flag values. Covers the canonical validation module, the public env example file, and every consumer that reads configuration anywhere in the codebase. Responsible for the contract between the running application and its deployment environment — making sure missing or malformed configuration fails loudly at startup rather than silently degrading features in production. Also responsible for keeping the developer-onboarding and operator-handoff story honest, so that someone setting up a new environment knows exactly what to provide and what each value is for. ## Rubric - **Single point of access** — All configuration is read through one canonical, validated module; raw environment lookups scattered across the code are treated as bugs, not style preferences. This is the floor the rest of the rubric stands on: until every consumer goes through one path, validation, documentation, and secret hygiene are all grading a surface they don't actually control. The bad version is a codebase where each feature reaches into the environment on its own and "is this set?" has a different answer in every file. - **Fail-fast on startup** — Only meaningful once a single point of access exists: with one entry point, missing or malformed values can be caught before the app serves a single request, with an error message that names the variable and what it is for. The failure mode this rules out is the silent one — a feature that appears to work in development and quietly no-ops or 500s in production because a key was never set. Required vs. optional is an explicit decision per variable, not an accident of which code path runs first. - **Typed and narrowed values** — Sits on top of fail-fast validation: once a value is required, it is also coerced to its real shape (URL, boolean, enum, integer) and exposed to consumers as that type. Booleans aren't compared as strings, numeric limits aren't parsed at every call site, and an enum-shaped flag with an unexpected value is rejected at the boundary rather than silently falling through to a default branch downstream. - **Secret vs. public discipline** — Public values (anon keys, feature flags, client-side URLs) and true secrets (server-side API keys, signing keys) are separated by naming convention and by where they are allowed to be read. A practitioner can tell at a glance which bucket a variable is in, and the build cannot accidentally ship a server secret into a client bundle. The bad version is a flat list where everything looks the same and the only thing standing between a secret and the browser is somebody remembering. - **Onboarding and operator clarity** — Visible from outside the codebase, not from inside it: a new developer or a deploy operator can stand up a working environment from the documented example without reading source code, and every required variable has a placeholder, a one-line description, and a pointer to where to obtain it. Drift between the validation module and the example file is the canonical failure mode here — silently undocumented requirements that break new setups weeks after the variable was added. - **Change visibility for stakeholders** — The capstone — only becomes possible once the surface is unified, validated, and documented. When configuration requirements change (a new integration, a renamed key, a flag flipped on in production), the change is legible to the people who have to act on it: ops knows what to set, product knows which flag controls which behavior, and a non-engineer can answer "is this feature on in production?" without grepping the repo. The bad version is configuration changes that land as silent commits and surface as incidents.
CSP Policy Integrity
## Ownership Zone Every Content Security Policy directive served by the Next.js frontend — script-src, frame-src, connect-src, style-src, img-src, font-src, and the rest — along with each allowed origin, hash, or nonce, the feature or integration that justifies it, and the mechanism (middleware, headers config, meta tag) that delivers the policy to the browser. The zone covers how the policy is composed, how it is rolled out (report-only vs enforcing), how violations are observed, and how the policy stays aligned with the actual set of third parties the product depends on. It also covers the human-facing side: whether product, security, and integration owners can answer what is allowed, why, and what would break if it were removed. It does not own the third-party scripts themselves or the application code that uses them — only the trust boundary that decides what the browser is permitted to load and execute. ## Rubric - **Directive completeness and precision** — The floor the rest of the rubric stands on. Every fetch directive a modern app needs is explicitly set rather than inherited from default-src by accident, and each one lists the narrowest set of sources that actually make the feature work. The bad version is a single sprawling default-src with wildcards and a script-src that grew by accretion; the good version is a policy where you can point at any entry and name what would break without it. - **Provenance of every allowance** — Every origin, hash, and nonce in the policy traces back to a specific feature, vendor, or integration, recorded somewhere a human can read. Without this, the directive surface becomes a graveyard of entries no one dares delete; with it, removing a vendor is a normal cleanup task instead of a multi-hour archaeology dig. This is the dimension the directive inventory and justification-coverage metric exist to make reportable. - **Nonce and hash discipline over unsafe-inline** — Inline scripts and styles are admitted via per-request nonces or content hashes, not via blanket unsafe-inline or unsafe-eval escape hatches. The contrast: a policy that looks strict on paper but quietly carries unsafe-inline because one analytics snippet needed it three years ago is failing this dimension, even if every other directive is tight. - **Violation observability** — Only meaningful once the policy is precise enough to trust: a noisy policy produces noisy reports no one reads. CSP violation reports are collected, deduplicated, and routed somewhere a human actually looks, with enough context (directive, blocked URI, source file, user agent) to tell a real attack or regression apart from a browser extension. Silent enforcement with no report sink is the failure mode this calls out. - **Safe rollout and change discipline** — Becomes possible once observability is in place. New directives or tightened ones go through report-only before enforcement, changes are reviewed against the inventory rather than appended blindly, and there is a known path to ship a fix when a third party rotates a domain. The bad version is editing the policy directly in production and finding out from customer reports. - **Stakeholder legibility** — The capstone, and the dimension that fails most quietly. A non-engineer — a security reviewer, a vendor-onboarding PM, a compliance auditor — can answer what third parties the site trusts, why each is trusted, and what changed last quarter, without reading middleware source. If that question requires grepping the repo, the policy is technically correct but organizationally opaque.
STT Provider Boundary
## Ownership Zone Owns the contract surface between the transcription router and every speech-to-text provider implementation it dispatches to — currently Google Cloud Speech, OpenAI Whisper, GPT-4o Audio, Qwen3-ASR-Flash, and ElevenLabs Scribe, plus any future addition. Responsibilities span the request/response adapter for each provider, audio format and language code normalization, error and timeout semantics, model and version pinning, feature-flag and routing rules that select a provider, and the fallback behavior when a provider degrades or deprecates a model. Also owns the observability of provider behavior — latency, error rates, transcription quality signals — at a granularity that lets the team reason about which provider to trust for which traffic. Does not own the upstream audio capture pipeline, downstream consumers of transcripts, or the router's business-logic decisions beyond the provider-selection layer. ## Rubric - **Adapter contract uniformity** — Every provider sits behind the same input/output shape, the same error taxonomy, the same timeout and cancellation semantics, and the same handling of audio format, sample rate, and language code. This is the floor the rest of the rubric stands on: until the contract is uniform, routing decisions, quality comparisons, and fallback logic are all comparing apples to oracles. The bad version is each provider leaking its SDK's quirks — one returns segments, another returns a flat string, a third throws a vendor-specific error type — and callers branching on provider identity. - **Version and model pinning discipline** — Each provider call names an explicit model and API version rather than riding the vendor default, and the pinned version is tracked somewhere a human can read without grepping. Only meaningful once the adapter contract is uniform, because otherwise version drift hides inside per-provider quirks. The failure mode this calls out: a vendor silently rotates the default model, transcription characteristics change overnight, and nobody can say which deploy introduced the shift. - **Deprecation and change awareness** — Someone is responsible for knowing when each provider is deprecating a model, changing pricing, changing rate limits, or shipping a breaking API change, and that knowledge has a place to live other than one engineer's inbox. This dimension is not visible from the codebase alone — it lives in vendor changelogs, status pages, and account-rep emails. The bad version is finding out a model was sunset because production started 404ing. - **Routing and fallback intent is legible** — The rules that send a given request to a given provider — feature flags, traffic splits, language-based routing, cost tiers, A/B tests — are explicit, named, and explain *why* they exist, and fallback chains have defined trigger conditions rather than ad-hoc try/except. Sits on top of the uniform adapter contract: you can only route confidently across providers whose contracts you trust to behave the same. The failure mode is a tangle of conditionals where nobody can answer which provider a given customer's audio is hitting today, or what happens when it fails. - **Per-provider quality and reliability is measured** — Latency, error rate, timeout rate, and a transcription-quality signal (WER on a held-out set, human spot-checks, downstream rejection rate, or similar) are tracked per provider and per model version, at a granularity that lets the team notice regressions within days, not quarters. Becomes possible once pinning and uniform contracts are in place, because otherwise you cannot attribute a quality dip to a specific provider-and-version pair. The bad version is a vague sense that one provider is better without numbers to back it. - **Stakeholder-answerable provider posture** — A non-engineer — product, ops, support, finance — can get answers to questions like which provider is handling which traffic right now, what we pay per minute by provider, when we last switched a default, and what we'd lose if a given vendor went down tomorrow. This is the capstone: it only becomes honestly answerable once routing is legible and per-provider metrics exist. The failure mode is every such question becoming a half-day engineering investigation, and provider decisions getting made on vibes because the data is locked inside code.
OAuth Session Integrity
## Ownership Zone Owns the GitHub OAuth flow end-to-end — login initiation, callback handling, session establishment, and logout — and the full lifecycle of every httpOnly cookie token stored on behalf of the user (GitHub, CircleCI, Anthropic, and any future provider tokens that ride the same cookie surface). Responsible for how token expiry, revocation, corruption, and CSRF-class attacks are detected and surfaced, so that a stale or hostile credential fails cleanly at the auth boundary rather than cascading into downstream API routes. Guards the contract between edge-runtime auth routes and server-side proxying routes: which routes are allowed to assume a valid session, how that assumption is validated, and what happens when it does not hold. Also owns the operator-facing visibility into auth health — who is logged in, why logins fail, and which routes are protected — so that session-layer incidents are diagnosable without grepping the codebase. ## Rubric - **Cookie hygiene as the foundation** — Every token cookie is httpOnly, scoped, signed/encrypted as appropriate, and has a single owner that knows its set, read, and clear paths. This is the floor the rest of the rubric stands on: until cookie semantics are unambiguous, every other dimension is reasoning about state that other code paths can quietly mutate. The bad version is tokens written in one place and forgotten in another, where logout leaves residue and nobody can say which routes touch which cookie. - **CSRF and callback integrity** — The OAuth callback verifies that the response it is processing is the one this browser initiated: state parameter generated, stored, and checked; redirect targets constrained to a known set; replayed or cross-origin callbacks rejected loudly. Builds directly on cookie hygiene, since state itself rides the cookie surface. The failure mode this dimension exists to prevent is a callback that happily mints a session for whoever shows up with a valid-looking code. - **Failure-mode behavior under bad credentials** — Expired, revoked, malformed, and impersonated tokens produce a single well-defined outcome at the auth boundary: the session is invalidated, the user is sent through re-auth, and downstream handlers never see a half-valid credential. Only meaningful once cookie hygiene and callback integrity are in place; otherwise the system cannot tell a bad token from a missing one. The bad version is a 500 from a deep API call because a GitHub token silently expired three days ago. - **Route auth contract clarity** — Every server route falls into a known category — public, session-required, session-optional, internal — and the category is enforced in one obvious place rather than re-derived per handler. This sits on top of failure-mode behavior: a route only benefits from a clean failure path if it actually invokes the validator. The bad version is the auth check copy-pasted into some handlers, forgotten in others, and impossible to audit without reading every file. - **Stakeholder visibility into auth health** — Non-engineering stakeholders (support, ops, the person triaging a Monday-morning incident) can answer questions like did logins start failing last Thursday, is this user actually authenticated, and which provider token is stale — without paging an engineer to read logs. This dimension is not visible from the codebase alone; it is judged by whether the people downstream of the auth boundary can self-serve. Becomes possible only once the route contract and failure modes are consistent enough to measure honestly. - **Cross-provider token coherence** — When more than one provider's token rides the same session, their lifecycles are reasoned about together: a revoked GitHub token does not leave a live CircleCI cookie behind, and adding a new provider follows a known pattern rather than inventing a fourth cookie shape. This is partly an organizational property — it depends on whoever adds the next provider knowing the pattern exists — and partly a code property. The bad version is each provider integration looking like it was written by someone who had never seen the others. - **Auditability of session decisions** — Every session-affecting decision (issued, refreshed, rejected, cleared) leaves a trace that an operator can reconstruct after the fact, with enough context to distinguish user error from attack from bug. The capstone dimension: only meaningful once the decisions themselves are consistent across cookies, callbacks, failure modes, and routes. The bad version is a user reporting they were logged out and nobody, including the steward, being able to say why.
Layer Boundary Integrity
## Ownership Zone Monorepo layering and import-direction rules: the apps→systems→packages dependency flow, packages staying generic, systems staying infrastructure-free, and no cross-system imports. ## Rubric - **Import direction** — Dependencies flow apps→systems→packages only. packages never import systems or apps; systems never import apps. - **Cross-system isolation** — No system imports another system. Shared needs are extracted into a package, not reached across systems/. - **Package purity** — packages/ stay reusable and generic — no business logic or system-specific domain concepts leak in. - **System purity** — systems/ hold business logic only — no infrastructure wiring (db clients, provider SDK setup, deploy concerns) belongs there. - **Placement correctness** — New code lands in the layer the AGENTS.md 'Where Things Go' table dictates: integrations, prompts, workflows, and services in their designated paths.
WCAG 2.2 AA Compliance
## Ownership Zone Every user-facing surface in the workspace — pages, components, interactive widgets, forms, navigation, media, and dynamic content — held to WCAG 2.2 AA. The zone covers semantic structure and landmarks, keyboard operability and focus management, screen reader exposure (names, roles, states), color and non-color contrast, motion and timing, error identification and recovery, and the assistive-technology behavior of any custom or third-party UI. It also covers the supporting practice around compliance: how new work is gated before merge, how known gaps are tracked and prioritized, and how non-engineering stakeholders (product, legal, support) can answer questions about the workspace's accessibility posture without reading code. ## Rubric - **Semantic foundation** — Pages are built from real landmarks, headings in a sensible order, native form controls with associated labels, and lists that are actually lists. This is the floor the rest of the rubric stands on: contrast tweaks and ARIA polish on top of div soup buy nothing, because assistive tech has nothing to anchor to. The bad version is a tree of generic divs with role attributes sprinkled on top to simulate structure that should have been there from the start. - **Keyboard and focus discipline** — Every interactive element is reachable and operable by keyboard alone, focus order matches visual order, focus is visible at all times, and focus is managed deliberately when content moves (dialogs, route changes, disclosure). Only meaningful once the semantic foundation is real, since focus follows the document model. The failure mode this calls out is the invisible focus ring, the tab that escapes into a modal's backdrop, and the route change that strands a screen reader on stale content. - **Assistive-technology truthfulness** — What a screen reader announces matches what a sighted user perceives: accessible names exist and are accurate, state changes (expanded, selected, busy, invalid) are exposed, dynamic updates reach users via live regions or focus moves, and ARIA is used to fill gaps in native semantics rather than to paper over the wrong element. Sits on top of the semantic foundation; without it, ARIA becomes decoration. The bad version is a button labeled icon, a toggle whose pressed state never changes, and a toast no one hears. - **Perceivable presentation** — Text and meaningful non-text content meet contrast minimums, information is never conveyed by color alone, content reflows without loss at 400% zoom and 320 CSS pixels wide, and motion respects user preferences. This dimension is largely assessable from rendered output, and is where automated tooling earns its keep — but only catches the floor, not the ceiling. - **Pre-merge accessibility gate** — Not visible from a code snapshot alone; this is a property of how the team works. New and changed surfaces are checked against AA before they ship, automated checks block on regressions rather than warn, and authors know which manual checks (keyboard pass, screen reader smoke test) are expected for the kind of change they made. The contrast is a team where accessibility is a quarterly cleanup pass versus one where a regression cannot reach main. - **Known-gap hygiene** — Also a practice property, not a code property. Every known violation has an owner, a severity tied to user impact (not just rule id), and a remediation state that ages visibly; nothing rots silently in a backlog labeled accessibility. The failure mode is a five-year-old issue list where no one can tell which items are still real, which are duplicates, and which already shipped fixes. - **Stakeholder legibility** — The capstone — only possible once the gate and the gap list are honest. A product manager, support lead, or legal reviewer can answer questions like what is our current AA coverage, which surfaces are known-noncompliant, and what is the remediation timeline without paging an engineer or reading a PR. The bad version is an org that believes it is compliant because no one has asked recently.
PostHog Event Integrity
## Ownership Zone Every PostHog integration point across the platform — SDK initialisation and provider wiring on the web surface, every capture, identify, and group call site, autocapture and session replay configuration, feature-flag usage, and the relationship between events emitted in code and what growth, product, and founders consume downstream in PostHog dashboards, funnels, and retention reports. The zone extends to instrumentation gaps in adjacent surfaces (such as CLI or server-side tooling) where product-critical flows happen outside the browser and represent blind spots in the user journey. It also covers the event taxonomy itself — the naming conventions, property shapes, and type-safety guarantees that determine whether data arriving in PostHog is queryable signal or accumulating noise. The steward owns the contract between the code that emits events and the humans who try to answer questions from them. ## Rubric - **Event taxonomy discipline** — Every event name follows a single documented convention and the convention is enforced at the call site, not by downstream cleanup or rename rules in the warehouse. The failure this guards against is the same logical moment shipped under three slightly different string literals from three components, producing three lines in PostHog where there should be one. This is the floor the rest of the rubric stands on: no other dimension is meaningful if the taxonomy is incoherent, because every funnel and dashboard sits on top of names. - **Type-safe emit boundary** — Tracking calls reference a shared, typed catalogue of event names and property shapes rather than passing ad-hoc string literals and untyped property bags. Without this a typo or a renamed property silently breaks a funnel and nobody notices until a quarterly review. Builds directly on taxonomy discipline — the catalogue is the taxonomy made enforceable, and the compiler becomes the first reviewer of every analytics change. - **Identify and group hygiene** — Identify fires at session-start and auth-state-change with a stable user ID, and group associates users with their org or tenant where applicable, before any meaningful event is captured in that session. Without this events land as anonymous noise and org-level analytics are fiction; funnels built on unidentified events silently undercount conversion. Sits alongside taxonomy discipline as a foundational concern — a clean name on an anonymous event is still a half-measurement. - **Coverage of meaningful moments** — Signup, activation, the handful of key product actions, upgrade, error states, and churn-risk moments all fire an event, and coverage is judged by whether a product or growth stakeholder can answer what happened in the user journey from PostHog alone without asking an engineer to query the database. The bad version is a dashboard full of pageviews and autocapture clicks with no domain verbs, where every real question requires a SQL detour. Only meaningful once the taxonomy is stable enough that adding a new event doesn't create ambiguity with existing ones. - **SDK configuration consistency** — PostHog is initialised once per surface with explicit, reviewed settings for autocapture, session replay, cross-subdomain tracking, PII redaction, and feature-flag bootstrap, and those settings agree across client and server and across environments. Configuration disagreements produce data that looks correct in staging and breaks in production, or worse, leaks PII that a privacy review assumed was redacted. Becomes auditable once identify hygiene is in place, because misconfigured init is invisible when users aren't identified. - **Dashboard-to-code alignment** — Every event referenced in a dashboard, funnel, or insight corresponds to a live capture call, and every capture call is consumed by at least one downstream artefact a stakeholder actually looks at. Orphaned dashboard references produce silent zeros that erode trust in the analytics surface; orphaned capture calls waste payload and clutter the event stream so newcomers can't tell signal from legacy. This is a capstone dimension — only meaningful once the taxonomy, type safety, and coverage dimensions are healthy enough that the catalogue of events is stable and enumerable on both sides. - **Analytics health legibility** — A non-engineer can answer are events still flowing and did we lose tracking last week without paging someone, because ingestion volume, event-type cardinality, and identify-rate are monitored or at least reviewed on a known cadence. The bad version is discovering a three-week instrumentation outage when a board deck is being prepared. Sits on top of every other dimension: you can only monitor what you've named, typed, identified, and wired to something a stakeholder reads.
Accessibility Baseline
## Ownership Zone Every interactive surface on the site that a non-mouse, non-sighted, or assistive-technology user has to navigate — focus order and focus visibility, keyboard reachability of all controls, semantic roles and ARIA attributes, accessible names and descriptions, color contrast and motion preferences, and the live behavior of media controls (audio play/pause, captions, transcripts) and custom widgets like the phone mockup. Covers the full path from page structure (landmarks, headings, skip links) through component-level behavior (buttons, links, menus, dialogs) to dynamic states (loading, error, expanded/collapsed). Includes the relationship between the rendered DOM and what assistive tech actually announces, and the visibility of accessibility health to non-engineering stakeholders who need to know whether the site meets the standard the org has committed to. ## Rubric - **Semantic foundation** — The page is built from real HTML elements with correct roles and a sane heading and landmark structure; custom widgets only reach for ARIA when no native element fits, and never to paper over the wrong element underneath. This is the floor the rest of the rubric stands on: every downstream dimension assumes assistive tech is being handed a structure that means what it looks like, and a div-soup page with bolted-on roles makes keyboard and screen-reader excellence impossible to achieve no matter how much polish goes on top. - **Keyboard parity** — Anything a mouse user can do, a keyboard user can do in a predictable order, with a focus indicator that is always visible and never trapped where it shouldn't be. The bad version is the one where Tab skips a custom control entirely, or lands on it but Enter and Space do nothing, or opens a modal that the user cannot escape — keyboard parity is judged by walking the page with the mouse unplugged, not by reading the code. - **Accessible naming and state** — Every interactive control has a name a screen reader will actually speak, and its state (pressed, expanded, selected, busy, disabled) is exposed programmatically and stays in sync as the UI changes. Only meaningful once the semantic foundation is in place; until then, a correct aria-label is being attached to the wrong kind of element. The failure mode is the button announced as button, button, button across a whole toolbar, or the toggle whose visual state and aria-pressed have drifted apart. - **Media and motion respect** — Audio and video controls are operable without a mouse, captions and transcripts exist for spoken content, autoplay does not hijack focus or sound, and animations honor prefers-reduced-motion. Sits on top of keyboard parity and accessible naming: a media player that fails those is not made accessible by adding a transcript. The bad version is the one where the only way to pause the looping background audio is to find a control no screen reader announced. - **Lived testing with real assistive tech** — Excellence is judged by how the site behaves under an actual screen reader and keyboard, on the platforms users are on, not by automated scan scores alone. This dimension is largely invisible from the codebase: it lives in whether someone on the team has run VoiceOver, NVDA, or TalkBack on the real flows recently, and whether known assistive-tech quirks are tracked rather than rediscovered. Automated checks catch missing alt text; they do not catch a focus order that makes no narrative sense. - **Standard and stakeholder legibility** — The team has named the conformance target it is holding itself to (e.g. a specific WCAG level) and a non-engineering stakeholder — product, legal, a partner asking about compliance — can find out where the site stands against that target without reading code or filing a ticket. Becomes possible once the dimensions above are real enough to measure honestly; before then, any status report is fiction. The failure mode is the org that claims a conformance level in marketing copy while no one internally can point to what is and isn't covered.
Subscription & Usage Guardrails
## Ownership Zone Subscription lifecycle state machines, usage metering, free-tier enforcement, Stripe billing integration, and API access gating. ## Rubric - **State machine integrity** — Subscription status transitions (free_tier_active → grace_period → exceeded; active → past_due → unpaid → canceled) match the intended lifecycle, leave no orphan states, and trigger the correct side effects (content lock/unlock, emails, analytics). - **Usage metering accuracy** — CloudFront log parsing, bandwidth aggregation, storage tracking, and Stripe metered billing event submission faithfully reflect real consumption without double-counting or data loss. - **Free tier enforcement** — Limits (video count, file size, bandwidth), grace period timing, alert email thresholds, and content locking/unlocking apply consistently and at the correct thresholds defined in subscription constants. - **Access gating consistency** — SubscriptionGuard, plan checks, skipSubscriptionGuard decorators, and demo user exceptions enforce the correct access boundary for every API route without gaps or false blocks. - **Stripe webhook fidelity** — Incoming Stripe subscription and checkout events map to the correct internal state changes without gaps, silent failures, or status/plan mismatches between Stripe and the subscriptions table.
Code Hygiene
## Ownership Zone I own the ongoing campaign against accumulated cruft across the phin repositories — unused functions, unreferenced variables, dead imports, unreachable branches, commented-out code, orphaned files, and the lint and style violations that obscure what is actually live. My territory spans detection (knowing what is dead and proving it), removal (safely excising it without breaking implicit consumers), and prevention (keeping new accumulation from outpacing cleanup). I also own the legibility of the cleanup queue itself: what is pending, what was removed, and whether the trend is improving or degrading. I do not own architectural refactors, performance work, or test quality — only the discipline of keeping the surface area honest about what the code actually uses. ## Rubric - **Deadness is provable, not guessed** — The floor the rest of the rubric stands on. Before anything is removed, there is a defensible answer to how we know this is unused: static analysis, reference search, runtime telemetry, or explicit deprecation window. A bad practice removes things that look unused and learns from production breakage; a good one distinguishes genuinely dead code from code reached through reflection, dynamic dispatch, public API, or external callers, and treats the second category with appropriate caution. - **Lint and style speak with one voice** — Only meaningful once deadness is provable, because lint is the cheapest signal that something is unreferenced. The configured rules are consistent across the repo surface, violations either fail CI or are tracked with an expiry, and disables are justified inline rather than scattered as silent escape hatches. The failure mode this guards against: a lint config that warns about everything, blocks nothing, and trains everyone to ignore the output. - **Removal is reversible and reviewable** — Sits on top of the two dimensions above: once you can prove deadness and trust the lint signal, removals become small, isolated commits rather than sweeping purges. Each cleanup is scoped tightly enough that a reviewer can verify the claim of unused-ness, and the commit history makes it cheap to resurrect something if a hidden caller surfaces. Bad practice batches a thousand deletions into one untestable PR; good practice leaves a trail you can bisect. - **Accumulation is bounded, not just cleaned** — Becomes possible once removal is routine: the question shifts from how do we catch up to whether new cruft is entering faster than it leaves. There are guardrails — pre-commit checks, CI gates, or codeowner review — that catch dead imports and unused exports at the boundary, so cleanup work compounds instead of resetting every quarter. - **The backlog is legible to non-engineers** — A stakeholder-facing dimension. A product manager, tech lead, or founder can answer is hygiene improving or degrading without reading code or paging an engineer: the queue of pending cleanups has a visible depth, a trend, and an owner. The failure mode is hygiene as folklore — everyone agrees the codebase is messy, no one can point to a number, and the work is invisible until someone complains. - **Cleanup is decoupled from feature work** — An organizational property, not a code property: the team has an explicit cadence or budget for hygiene work, and it is not held hostage to whichever feature happens to touch the same file. Bad teams clean up only when they trip over something; good teams treat hygiene as scheduled maintenance with a known owner, so the rubric above can actually be enforced rather than aspired to.
Phlex Component Contracts
## Ownership Zone Every Phlex component class in the application — the Components::Base and Views::Base subclass hierarchy, their rendered HTML output, their behavior under nil and missing data, and their adherence to the shared RubyUI/Phlex conventions that hold the component library together. The zone covers the rendering contract each component exposes (what props it accepts, what HTML it produces, what it does when inputs are absent or malformed), the unit-level rendering tests that pin those contracts down, and the consistency of patterns across the hierarchy so that designers, product, and engineers can predict what a component will do without reading its source. It does not own page-level integration flows, controller logic, or styling decisions made outside the component layer — only the component-as-contract. ## Rubric - **Render-without-crashing floor** — Every component can be instantiated and rendered with its declared inputs without raising. This is the floor the rest of the rubric stands on: until rendering itself is reliable, nil-safety, output quality, and consistency are grading something that may not even reach the browser. A component that crashes on a missing optional prop, an empty collection, or a nil association is failing this dimension regardless of how clean its API looks. - **Nil and edge-input behavior is explicit** — Builds directly on the rendering floor: each component has a defined, tested answer for nil values, empty strings, empty collections, and missing optional associations — render nothing, render a placeholder, or fail loudly — and that answer is the same one a caller would guess from the component's name and props. The bad version silently swallows nils in some components and NoMethodErrors in others, so callers learn through production incidents which components tolerate which inputs. - **Output is valid, semantic HTML** — Components emit well-formed markup with correct nesting, appropriate semantic elements, and accessible attributes — not div soup that happens to look right in one browser. Only meaningful once rendering and nil-handling are stable; otherwise output validity is being judged on a sample that excludes the cases that actually break. - **Pattern consistency across the hierarchy** — Components that do similar jobs look similar: prop names, slot conventions, naming of variants, and the line between Components and Views are followed the same way across the library. The bad version is three different ways to pass children, two spellings of the same prop, and a Views class doing what a Component should do — every new contributor has to re-learn the library from scratch. - **Contracts are legible to non-engineers** — A designer, a PM, or a new engineer can answer what a component does, what inputs it takes, and what it looks like in its main states without reading its Ruby source. This dimension is invisible from the code alone: it lives in component catalogs, preview pages, naming, and the shared vocabulary the team actually uses in design reviews. Without it, the component library is a private dialect and every cross-functional conversation routes through an engineer. - **Change confidence** — Sits on top of every dimension above: a team can only refactor a base class, rename a prop, or upgrade the underlying Phlex/RubyUI version with confidence when rendering, edge inputs, output validity, and conventions are pinned down by tests. The bad version is a component layer everyone is afraid to touch, where improvements stall because no one can tell what a change will break.
Next.js Upgrade Resilience
## Ownership Zone Owns the resilience of the Next.js and React framework surface across upgrades — the pinned versions of next, react, react-dom, and eslint-config-next; the App Router conventions (segment filenames, route groups, layouts, server vs client component boundaries); the build and lint gates that catch framework-level regressions before deploy; and the backlog of known framework risks that need to be worked down. Also owns the relationship between the codebase and Vercel's deployment expectations, so that what builds locally builds on Vercel and what renders in dev renders in production. The zone covers everything that determines whether a framework or runtime bump is a routine chore or a silent outage. ## Rubric - **Version pinning discipline** — Framework-critical packages (next, react, react-dom, the matching eslint config) are pinned to exact versions, not caret or tilde ranges. This is the floor the rest of the rubric stands on: until the versions installed in CI, on a fresh clone, and on Vercel are provably identical, every other dimension is grading a moving target. The bad version of this dimension is a lockfile that drifts between environments and an upgrade that lands by accident on a Tuesday afternoon. - **Pre-deploy build gating** — A production build (and the framework's own type and lint passes) runs on every push and PR and blocks merge on failure. Only meaningful once versions are pinned — otherwise the gate is checking a different build than the one that ships. The failure mode this dimension calls out is discovering a broken build from the deploy log instead of from CI; excellence means the first place a framework regression surfaces is a red check, not a white screen. - **Routing and component-boundary correctness** — App Router conventions are followed strictly: canonical segment filenames, deliberate placement of server vs client components, no accidental client-bundling of server-only code. Sits on top of the build gate, because lint and type rules are the mechanism that makes these conventions enforceable rather than tribal. The bad version is a file named almost-but-not-quite right that silently fails to route, or a use client added to silence an error without understanding what crossed the boundary. - **Upgrade rehearsal and risk backlog** — The team treats framework upgrades as a rehearsed activity, not an emergency: known framework risks, deprecations, and migration steps live in a tracked backlog with priorities, and majors are taken on a deliberate cadence with a known rollback. Becomes possible once the prior dimensions exist, because rehearsal is only credible when versions are pinned and CI catches regressions. Excellence here is a reader being able to answer what's the next framework risk we owe time to without asking a person. - **Deployment-target fidelity** — The local and CI build environment matches what Vercel (or the equivalent target) actually runs: Node version, build command, environment variables, edge vs node runtime choices, and image/route configuration. The bad version is the works on my machine class of incident where the production runtime quietly disagrees with the dev runtime about a server component, a route handler, or a cached fetch. - **Stakeholder-legible upgrade posture** — A non-engineer stakeholder (PM, founder, ops) can answer are we current, are we exposed, and what would an upgrade cost without paging an engineer to read package.json. This is the capstone — only honest once pinning, gating, conventions, and the risk backlog are in place, because otherwise the answer is a guess dressed up as a status. Excellence is a posture that can be reported on, not folklore held in one engineer's head.
Dead Code
## Ownership Zone Unreferenced exports, orphan modules, unreachable branches, and rename/deletion residue across app/, lib/, components/, and scripts/. The steward keeps the surface area honest so reviewers and stewards aren't reasoning about code that no longer runs. ## Rubric - **Unreferenced exports** — Exported functions, types, constants, and React components with zero in-repo consumers and no legitimate external-consumer reason to remain exported. Stale re-exports from internal index files are included. - **Orphan modules** — Source files under app/, lib/, components/ that are not imported anywhere and are not framework entry points (route.ts, page.tsx, layout.tsx, middleware.ts, instrumentation.ts). Test fixtures and __mocks__ are out of scope. - **Unreachable branches** — Code after unconditional early returns/throws, always-true/always-false conditionals, env-gated paths whose env can no longer be set, and switch arms for enum members that were removed. - **Stale one-shot scripts** — scripts/backfill-*, scripts/bootstrap-*, scripts/replay-*, and similar single-purpose tools that have already completed their purpose. Keep ones with a documented reason to retain (e.g. periodically rerun); flag the rest for deletion. - **Removed-symbol residue** — Leftovers from renames or deletions: re-exports of vanished symbols, dead MCP tool registrations, schema fields with no writers/readers, dead public-route patterns, doc/CLAUDE.md references to APIs that no longer exist.
Backlog Delivery Flow
## Ownership Zone Friction and legibility of moving a backlog item from queued to merged in production, across the MCP server, the CLI, and the plugin: the lifecycle state machine and its truthful linkage to PRs and branches, the MCP and notification surface that tells agents and humans what to do next, and the trust signals that let a workspace widen backlog autonomy over time. Excludes PR-review verdict quality (owned by PR Thread Responsiveness and review-policy) and CI correctness. ## Rubric - **Lifecycle state truth** — A backlog item's state (queued / in_progress / proposed / done / dismissed) and its PR or branch linkage always reflect reality. Orphaned claims, expired-lease ghosts, items stuck after their PR merged or closed, and false orphaned-PR warnings are defects. - **Deliverable and contract legibility** — peek / claim / list responses expose what an agent needs to act correctly: the intended deliverable (pull_request vs note), the recommended next action, and lifecycle copy that does not push a PR onto note-shaped or already-done work. - **Progress visibility** — In-flight work is countable and surfaced. queued, in_progress, proposed, and awaiting-merge are distinguishable in counts and responses, and a claimed-but-PR-less item, a green-but-idle PR, or a done-but-unmerged item never sits invisibly. - **Delivery handoffs** — At each gate where a human must act — PR ready to review, ready to merge, conflicted, CI red, or a workspace stuck with un-executed backlog — the user is notified promptly and clearly with the correct next action. - **Selection continuity** — The path from signal to work stays coherent: consult's top-concern set and the queue's top item do not silently diverge, so the agent acts on what the stewards actually flagged rather than drifting to a different item. - **Autonomy trajectory** — The workspace's chosen autonomy level (merge-block threshold, auto-flow eligibility) is respected and legible, and the clean delivery history needed to justify widening autonomy over time is visible rather than hidden.
Dependency Pinning Discipline
## Ownership Zone The dependency surface declared in the project's package manifest and the lockfile that pins it down — every direct dependency's version constraint, the lockfile's presence and integrity, the install path that turns the manifest into a working node_modules tree, and the policies governing how new dependencies enter and how existing ones move. Covers the shape of version ranges (exact pins, caret/tilde ranges, floating tags like latest or *), the reproducibility of fresh installs across machines and CI, the cadence and review discipline around upgrades, and the visibility non-engineers have into what shipped with which versions. Does not own runtime behavior of the dependencies themselves, transitive vulnerability triage, or build tooling beyond what install reproducibility requires. ## Rubric - **Constraint discipline in the manifest** — The floor the rest of the rubric stands on: until every direct dependency declares a deliberate, defensible version constraint, nothing downstream is reasoning about a known surface. Floating tags like latest or unbounded ranges are absent by policy, not by accident, and a reader can tell at a glance which dependencies are pinned exact, which are range-bounded, and why — rather than seeing a soup of mixed conventions that nobody remembers choosing. - **Lockfile as source of truth** — A committed lockfile fully determines the resolved tree, and it is treated as a reviewed artifact rather than a generated nuisance. Lockfile drift between branches surfaces in review, regenerations are intentional events tied to dependency changes, and the lockfile is never silently regenerated to paper over a conflict. Only meaningful once constraint discipline is real; a lockfile over a soup of floating ranges locks in randomness. - **Install reproducibility** — A fresh clone on a clean machine and a CI run from scratch produce byte-identical or behaviorally equivalent dependency trees, today and a month from now. Installs use the lockfile-respecting path (frozen/CI mode) rather than the resolve-anew path, and a green build on Monday is not allowed to go red on Tuesday because an upstream patch shipped overnight. Sits directly on top of the two dimensions above. - **Upgrade cadence and intentionality** — Dependencies move on a known rhythm with named owners, not in panicked batches after something breaks or in silent drift from auto-updates. Upgrades are scoped (one library or one coherent group at a time), reviewed against changelogs, and traceable to a reason — security, feature need, ecosystem alignment — rather than churn for churn's sake. This dimension is largely invisible from the code alone; it is a property of how the team behaves over time. - **New-dependency gatekeeping** — Adding a dependency is a decision with friction proportional to its cost: someone asks whether it is needed, what it pulls in transitively, who maintains it, and how it will be kept current. Bad practice looks like dependencies sneaking in via drive-by commits with default ranges; good practice looks like a brief, consistent rationale and a deliberate constraint chosen at the moment of entry. Lives mostly in review practice and team norms rather than in the manifest itself. - **Stakeholder-legible version posture** — Anyone downstream of engineering — a founder asking what version of a critical library is in production, a security reviewer asking whether a CVE applies, an ops person asking what changed between two deploys — can get a precise answer without reading code or paging an engineer. The version posture is documented or queryable, not folklore; the failure mode this rules out is the team itself not knowing, with confidence, what is actually installed.
Onboarding Documentation
## Ownership Zone Owns the body of documentation a new contributor or non-engineering stakeholder needs to understand, run, and contribute to the product without tribal knowledge from existing developers. This covers the entry-point README, environment and setup instructions, architecture and routing overviews, contribution and code-style conventions, and the product-level explanation of what the system is and who it serves. The zone includes the prioritized backlog of documentation gaps and the lifecycle of each doc — when it was last verified against the running system, who is expected to read it, and whether it still matches reality. It does not own inline code comments, API reference generation from types, or design specs for unshipped features. ## Rubric - **First-hour path works end-to-end** — A new contributor can go from a fresh clone to a running local instance using only the written instructions, on a machine the docs claim to support. This is the floor the rest of the rubric stands on: until setup actually works, every other doc is being read by people who are already frustrated or who never made it this far. The bad version is a README that lists prerequisites but skips the env vars, or a setup guide that silently assumes a tool the author already has installed. - **Audience separation is explicit** — Docs are organized so a product manager looking for what the system does, a new engineer looking for how to contribute, and an ops person looking for how to deploy each land in the right place quickly, without wading through each other's content. The failure mode is a single sprawling README that mixes business context, setup commands, and architecture diagrams so that everyone reads everything and nobody trusts any of it. This is the stakeholder-facing dimension — excellence here is judged by whether non-engineers can self-serve, not by whether the prose is well-written. - **Conventions are stated, not implied** — Contribution norms, naming conventions, routing patterns, branch and PR expectations, and code-style choices are written down where someone proposing a change will see them. Only meaningful once the first-hour path works, because a contributor who can't run the code has no reason to read the conventions yet. The bad version is a reviewer repeatedly leaving the same comment on PRs because the rule lives only in their head. - **Truth decay is actively managed** — Docs carry signals of freshness — last-verified dates, ownership, or explicit deprecation — and there is a known cadence by which someone re-walks the setup and architecture docs against the running system. Sits on top of the first-hour path: the question isn't whether the docs were once correct, but whether anyone has confirmed they're correct this quarter. The failure mode is a confident-sounding architecture doc describing services that were renamed or removed months ago. - **Architectural orientation matches the system as built** — A new engineer can read one document and form an accurate mental model of the major components, how requests flow, and where the seams are, before opening the code. This becomes possible once truth decay is managed; otherwise the orientation doc actively misleads. The bad version is either no overview at all (everyone learns by archaeology) or a beautiful diagram that quietly disagrees with the repo. - **Gaps are tracked, prioritized, and visible** — Missing or stale documentation is itself catalogued, ranked by severity, and worked through deliberately rather than written reactively when someone complains. This is the dimension that makes the steward legible to outsiders: a stakeholder can ask what's missing and get an answer, rather than discovering gaps by hitting them. Excellence here isn't visible from the codebase alone — it requires that someone is keeping a list and making decisions about it. - **Onboarding feedback closes the loop** — When a new contributor or stakeholder hits friction, that friction becomes a documentation change, not a Slack answer that evaporates. The capstone dimension — only achievable once gaps are tracked and audiences are separated, because otherwise feedback has nowhere coherent to land. The bad version is the same three questions answered privately every time someone joins, with the docs never updated.
Industrial Design System
## Ownership Zone Adherence to the industrial/brutalist design system: color tokens, typography contracts, component variant usage, layout patterns, and zero-radius enforcement across the Next.js app. ## Rubric - **Token discipline** — Components use defined color tokens (primary, surface, surface_two, text-primary, text-muted, error, warning, success) and their documented scale steps. No ad-hoc hex values, no non-existent tokens like brand.400, no whiteAlpha borders. - **Typography contract** — Space Grotesk for headings/body/buttons, JetBrains Mono for labels/data/code. Text styles (monoLabel, monoBody, monoSmall) are used for their documented purposes. Uppercase + wide tracking signals system text, not human-readable content. - **Variant usage** — Buttons use industrialPrimary, industrialOutline, or industrialCta — never bare Chakra solid/outline. Inputs use the theme variant without inline bg/borderColor/_hover/_focus overrides. Tables use variant bordered. Components use AppModal, Card, DataTable wrappers rather than raw Chakra primitives. - **Surface and border hygiene** — Surfaces are delineated by surface_two.500 borders, never drop shadows. No border-radius anywhere — the theme overrides all radii to 0. No CircularProgress or rounded elements that contradict the zero-radius constraint. - **Layout pattern conformance** — Landing pages use the 1440px container with border rails and section dividers. Blog/content headers use the 7fr/5fr grid with yellow breadcrumb label pattern. Auth pages use centered VStack with hyperspace animation. App pages use Layout with sidebar at 240px.
Claude Code Onboarding
## Ownership Zone The end-to-end first-run journey of getting a developer productive with Steward from inside Claude Code: connecting and authenticating the MCP server, the prepare_steward_onboarding readiness handoffs (auth, GitHub App install, workspace selection), invoking the steward skills, and the configure_steward create → activation sequence that lands an activated account. Spans the server-side onboarding logic in contextgraph/actions, the plugin and skill install surface in contextgraph/claude-code-plugin, and the CLI in contextgraph/agent. ## Rubric - **Readiness-state correctness** — prepare_steward_onboarding returns the right status/next_action for each real account state — authentication_required, github_app_install_required, workspace_selection_required, repository_inaccessible, and ready/define_steward — and no blocking state is a dead end: each one carries a concrete, actionable handoff (install URL, retry instruction, workspace selector) rather than leaving the agent guessing. - **Agent-facing guidance clarity** — The guidance arrays, MCP server initialize instructions, tool descriptions, skill copy, and browser-return pages tell the coding agent exactly what to do next, in order, naming the correct next tool or skill — and never bounce a Claude Code user back into the web onboarding flow when the agent can finish setup in-session. - **Browser handoff round-trip integrity** — Auth, GitHub-App-install, and workspace handoffs build correct URLs (redirect/return params, owner_login, owner_type), land the user on a 'return to Claude Code' page, and resume cleanly when the readiness check is re-run. The loop always closes back into Claude Code; a handoff that strands the user in the browser is a defect. - **Activation completeness** — configure_steward's create → reconcile_inventory → preview_initialization → apply_initialization chain honors each activation.next_action and ends in a genuinely activated state (steward created, inventory reconciled, first backlog items workable). No path silently strands a half-created steward or skips an activation step the agent is supposed to run. - **Path health visibility** — Each readiness state and activation transition emits telemetry (the mcp_prepare_steward_onboarding event, onboarding funnel events) so drop-off across connect → authenticate → install → define → activate stays visible, and the headline conversion signal (share of readiness checks reaching ready) is watched. Happy-path-only instrumentation and silent stall points where a user can stall invisibly are regressions.
Engineering Pragmatism
## Ownership Zone Speculative complexity and over-engineering across the monorepo: abstractions, packages, exported surfaces, and dependencies must earn their place through real consumers and proportionate product value; dead, premature, and gold-plated code is surfaced for removal so the codebase stays as simple as the shipping product allows. ## Rubric - **Consumer-backed abstraction** — Every abstraction, package, or exported symbol has at least two real call sites or a committed near-term consumer; speculative generality built for imagined future use is flagged. - **Dead surface** — Exported symbols, packages, dependencies, config, and scripts with zero consumers are detected and surfaced for removal before they accrete into maintenance burden. - **Dependency justification** — Each third-party dependency earns its place through real, non-trivially-replaceable use; heavyweight deps pulled in for a one-line need are flagged. - **Premature infrastructure** — Infrastructure, tooling, layers, and config systems are not built ahead of a real product need (YAGNI); abstractions arrive with the second concrete use, not before it. - **Right-sized solutions** — Solution complexity is proportionate to the problem and to delivered product value; gold-plating, over-generalized configuration, and frameworks where a plain function suffices are flagged.
Tenant Data Isolation
## Ownership Zone The architecture, configuration, and enforcement of data boundaries between independent tenants across the platform. This includes tenant identification and routing at the request boundary, schema-level isolation mechanisms, query filtering and access control, credential and secret scoping per tenant, and the visibility of isolation health to non-engineers through audit trails and breach detection. The steward owns the floor that prevents one tenant from reading, writing, or inferring the state of another. ## Rubric - **Tenant identity at the edge** — Every request carries a verified tenant identifier before any business logic executes. This is the floor the rest of the rubric stands on: until tenant identity is established and immutable at the boundary, downstream isolation is fiction. Tenant context is extracted from a single source of truth (JWT claim, session, header) and cannot be overridden by request parameters or inferred from data shape. - **Query-level filtering enforcement** — All data queries automatically scope to the request tenant without relying on caller discipline. Queries fail closed rather than silently returning cross-tenant data when a filter is missing. This sits on top of verified tenant identity: only meaningful once you know which tenant made the request. - **Credential and secret isolation** — API keys, database credentials, third-party tokens, and encryption keys are scoped per tenant and cannot be accessed by other tenants. A compromised credential in one tenant does not grant access to another tenant's resources or secrets. - **Schema-level boundaries** — The data model itself enforces tenant ownership: foreign keys, row-level security policies, or partition keys make it structurally impossible to query across tenant boundaries. A schema change that removes a tenant column or constraint surfaces immediately as a breaking change, not as a latent vulnerability. - **Isolation testing and validation** — Automated tests verify that queries with one tenant's credentials cannot read, write, or infer the existence of another tenant's data. Tests cover both happy-path isolation and edge cases like concurrent requests, batch operations, and error states. Isolation is not assumed; it is measured. - **Audit and breach visibility** — Cross-tenant access attempts, credential misuse, and isolation violations are logged and surfaced to non-engineers without requiring code review. A support team member or operator can answer whether a tenant's data was accessed by another tenant without paging an engineer, and breach detection runs on a known cadence.
PostHog
## Ownership Zone The PostHog Steward owns the analytics instrumentation and event stream that tracks user engagement, value realization, and product stickiness across contextgraph. It maintains visibility into which events the team relies on to measure retention, user satisfaction, and the impact of shipped features. It notices when event payloads drift, when critical events stop firing, and when the metrics that should move in response to product changes don't — signaling measurement gaps or real product problems. It surfaces patterns in user behavior that reveal what users actually find valuable, not just what we assume they do. ## Rubric **Event Reliability**: Critical events (concerns raised, concerns remediated, backlog items merged) fire consistently with stable payloads; drift is caught and surfaced within one week. **Retention Signal Clarity**: Dashboards and cohorts clearly distinguish between one-time users, returning users, and power users; retention trends are directional and explainable. **Value Evidence**: Instrumentation captures user actions that correlate with stated value (e.g., what users do after raising a concern, how often they return to remediated items, which features drive repeat visits). **Measurement Gaps**: When expected metrics don't move or move counterintuitively, the steward flags whether the gap is real product behavior or an instrumentation blind spot. **User Intent Visibility**: Events and cohorts reveal what users actually do, not just what we built; the steward surfaces unexpected patterns that hint at real user needs.
Blog Post Publishing
## Ownership Zone Correctness and completeness of marketing blog post PRs in the Next.js app: the post page file under packages/app/src/pages/blog/ (named for the post slug), its BLOG_POSTS metadata registration, hero and card image wiring, SEO and structured data, sitemap inclusion, and conformance to the blog component system, so a correctly-built post can be approved, merged, and deployed without manual review. ## Rubric - **Post registration integrity** — Every new post has both a page file under packages/app/src/pages/blog/ named for its slug and a matching entry in BLOG_POSTS (consts/blogPosts.ts). The slug is unique, kebab-case, and consistent across the filename, the metadata.slug field, and the page's metadata lookup; the default export is the PascalCase form of the slug. No orphaned page without a registry entry, and no registry entry without a page. - **Metadata completeness & correctness** — The BlogMetadata entry has all required fields well-formed: title, description, ISO date (YYYY-MM-DD), tag, h1, readTime, a cardImage URL, and an author key that exists in BLOG_AUTHORS. The page reads every displayed value from the metadata constant rather than hardcoding titles, dates, or image URLs in JSX. - **Hero image & asset wiring** — cardImage points to the Supabase assets/blog bucket URL for the post slug, is webp, and the referenced asset was actually uploaded (not a placeholder or dead link). The image is wired through BlogHeroImage and SEOHead ogImage, and its aspect ratio is reasonable for OG cards (about 1.91 to 1). - **SEO, structured data & sitemap fidelity** — SEOHead is wired with the canonical URL via canonicalUrl(BLOG_ARTICLE(slug)), the standard 'Title | HyperServe Blog' title format, the cardImage as ogImage, and jsonLd from buildBlogPostingJsonLd(metadata). Open Graph, Twitter card, canonical, and BlogPosting JSON-LD are present and reference the real post; trackPageView fires for the article. The post is reachable from sitemap.xml.tsx, which derives blog URLs and lastmod from BLOG_POSTS via getAllBlogMetadata, so the registry entry and its ISO date must be valid for the post to be indexed. - **Component & markup conformance** — The post uses only the approved blog components in the canonical structure (BlogLayout wrapping BlogHeader, BlogTLDR, BlogHeroImage, BlogSection and BlogHeading content, BlogCTA, then RelatedPosts) rather than raw Chakra or ad-hoc markup. JSX quotes and apostrophes are escaped as HTML entities, and component props match their documented contracts. - **Build & link safety** — The PR typechecks (no TS errors), removes unused imports (e.g. Link when there are no internal links), and is scoped to the expected files without stray changes. Internal blog links resolve only to slugs that already exist in BLOG_POSTS, with no dead references.
Tenant Isolation & Access Boundary
## Ownership Zone How requests authenticate and how every data access is scoped to the correct company and role across the booking platform's API routes, server actions, and Prisma queries. ## Rubric - **Tenant query scoping** — Every Prisma read and write filters by companyId; no query path can return or mutate another company's rows, and joins/relations stay within the tenant. - **Session authentication** — Routes and server actions resolve a valid, unexpired session (tokenHash lookup) before touching data, and password/token handling (hashing, expiry, invalidation) is sound. - **Role authorization** — MANAGER versus REP capabilities are enforced at the server-side access boundary, not merely hidden in the UI. - **Identity provenance** — companyId and userId are derived from the authenticated session, never accepted from client-supplied params, request body, or headers. - **Audit coverage** — Privileged and mutating operations write an Audit row capturing actor, companyId, action, and entity, so tenant-scoped changes are traceable.
PR Thread Responsiveness
## Ownership Zone How fast and how legibly the steward shows up in a GitHub PR thread: first review after open/ready-for-review, response to human replies on concerns, re-review after new commits, and the visible presence signals (in-progress Stewards check, ack comments, reactions) that prove the steward is always watching. ## Rubric - **First-review latency** — Time from PR opened or marked ready-for-review to the first steward review posted on that PR is short and predictable. The Stewards check transitions to in_progress immediately so the user never wonders whether the steward saw the PR. - **Comment turnaround** — When a human replies on an unresolved concern, the steward acknowledges quickly (ack comment, reaction) and re-evaluates against the latest diff. Long gaps between a human reply and the steward's next action are a regression — even if the eventual verdict is correct. - **Re-review freshness** — After new commits land, concerns are reclassified against the latest SHA promptly. Same-SHA debounce, processing locks, and the review-slot mutex must not silently swallow a re-review the user expects to see. - **Presence legibility** — From the PR author's seat it is obvious the steward is alive: in_progress check posted, ack comments where appropriate, reactions on relevant human replies, a clear final state. Silent intervals where the user can't tell whether anything is happening are treated as bugs. - **Slot and lock health** — Per-PR processing locks and the review-slot mutex are responsiveness primitives — orphaned in_progress slots, stale tokens, lock timeouts, or failed releases turn into invisible queueing. The steward watches these as latency hazards, not just correctness ones. - **Bot-noise discipline** — Speed includes not burning time replying to bot pings, slash commands, the steward's own comments, or other automated PR feedback. commentLooksLikeBotPing / isAutomatedPrFeedbackAuthor and similar filters are part of how responsiveness stays high.
Setup & Onboarding Accuracy
## Ownership Zone Owns the surface that a newcomer hits in their first hour with the project: the README and any top-level docs that describe what the project is, the setup and run instructions, the prerequisites and toolchain expectations, the workspace and directory orientation, and the contributor guidance for making a first change. Responsible for keeping the stated identity of the project (name, purpose, domain, audience) aligned with what the code actually is, and for keeping installation, build, and run paths walkable from a clean machine. Covers the handoff from stakeholders and casual readers (what is this?) through to first-time contributors (how do I run it and where do I edit?). Does not own deep architectural docs, API references, or runtime operational guides — only the on-ramp. ## Rubric - **Truthful project identity** — The floor the rest of the rubric stands on: if the README describes a different project than the one in the repo, every other dimension is grading instructions to the wrong place. The stated name, purpose, domain, and tech stack match what a reader would conclude after ten minutes in the source tree, and template/scaffold residue from the project's origin has been replaced rather than left as quiet lies. - **Walkable setup path** — Only meaningful once identity is truthful, because setup steps for the wrong project waste the newcomer's trust before they hit a real error. A reader on a clean machine can go from clone to running app by following the documented steps in order, prerequisites are named with versions where versions matter, and the steps actually executed by the maintainer match the steps the doc tells a stranger to run. - **Orientation to the shape of the repo** — Sits on top of truthful identity: a newcomer who knows what the project is still needs to know where things live before they can contribute. The doc names the major directories, the workspace or monorepo layout if any, and where a first change is likely to go — so a contributor doesn't have to reverse-engineer the structure or guess which folder owns which concern. - **First contribution on-ramp** — Becomes possible once setup and orientation are in place. Conventions a contributor will trip over (formatting, commit style, branch flow, how to run tests or checks locally) are stated where a contributor will actually look, and the gap between running the app and submitting a change is short and explicit rather than tribal. - **Stakeholder legibility** — A non-engineer landing on the repo — a collaborator, a domain stakeholder, a curious visitor — can answer what is this, who is it for, and is it alive without reading code or asking the maintainer. The README opens with the answer to those questions rather than burying them under build badges and install commands, and the project's audience is named, not assumed. - **Drift resistance** — The capstone that keeps every dimension above honest over time: docs that were correct at one commit silently rot as the code moves. Onboarding content has a known owner and a known cadence for re-walking the path from scratch, changes that invalidate setup instructions are caught close to when they happen rather than discovered by the next newcomer, and the gap between code reality and documented reality is treated as a real defect rather than a cosmetic one.
SendGrid Email Delivery
## Ownership Zone Owns the boundary between the application and SendGrid: the code path that constructs and dispatches transactional email (notably trip confirmations), the template data contract that feeds those sends, the handling of SendGrid responses and delivery failures, and the audit log that records what was sent, to whom, and with what outcome. This includes guarding against silent drops where a domain event (a trip being created, a booking confirmed) completes without its corresponding email being attempted or recorded. It also covers the operational visibility non-engineers need — support, ops, and founders asking "did the customer actually get the email?" — and the escalation path when SendGrid itself misbehaves (auth failures, suppressions, bounces, account-level throttling). ## Rubric - **Send path integrity** — Every domain event that is supposed to trigger an email actually attempts a send, and every attempt is recorded with its outcome. This is the floor the rest of the rubric stands on: until sends are reliably attempted and logged, the other dimensions are grading a surface that may be silently empty. The bad version is a try/catch that swallows SendGrid errors so the domain transaction looks successful while the customer hears nothing. - **Template data contract** — The data passed to each template is a typed, validated shape rather than an ad-hoc object assembled at the call site. Only meaningful once the send path exists: a reliable pipeline that ships malformed templates is worse than one that fails loudly. A missing field fails the send (or is caught in tests) instead of producing an email with "Hi{{first_name}}" rendered literally to a paying customer. - **Failure handling and retry discipline** — Sits on top of send path integrity: you can only have a coherent retry policy once failures are observed at all. Transient SendGrid errors (5xx, network) are retried with backoff; permanent errors (invalid recipient, suppressed address, 4xx auth) are not retried blindly and surface to a human. The bad version is infinite retries on a hard bounce, or one shot at a 503 and then nothing. - **Deliverability hygiene** — Requires information beyond the codebase: domain authentication (SPF, DKIM, DMARC), sender reputation, suppression list management, and bounce/complaint handling are actively maintained, not assumed. An experienced practitioner spots the difference in fifteen minutes by checking who owns the SendGrid account, when DKIM was last rotated, and whether anyone looks at the suppression list. The bad version is emails landing in spam for months while engineering insists "the API returned 202." - **Operational visibility for non-engineers** — Support, ops, and founders can answer "did this specific customer receive their confirmation, and if not why" without reading code or paging an engineer. This is the stakeholder-facing capstone: it only becomes honest once the audit log and failure handling beneath it are real. The bad version is a support agent guessing from the absence of a complaint, or an engineer running a one-off query every time a customer asks. - **Reconciliation against domain state** — On a known cadence, domain records that should have triggered an email are reconciled against the audit log of what was actually sent, and drift surfaces in a scheduled review rather than a customer complaint. Builds on send path integrity and the audit log: reconciliation is only possible once both sides of the comparison exist. The bad version is discovering six months in that a whole class of trips never got confirmation emails because a feature flag silently disabled the send. - **Content and compliance review cadence** — Templates, sender identity, and unsubscribe/footer behavior are reviewed by the people responsible for brand and legal on a known cadence, not whenever an engineer happens to edit them. Invisible from the codebase alone: excellence here is a practice, not a file. The bad version is a transactional template that hasn't been read by a human in two years and still references a product name from a previous pivot.
Accessibility (WCAG 2.1 AA)
## Ownership Zone WCAG 2.1 AA accessibility of the SvelteKit dashboard: keeping the pnpm a11y:auth regression gate green and correctly extended as new surfaces ship, semantic/ARIA and keyboard correctness across authenticated and public surfaces, color-contrast token discipline, status/error messaging, and the compliance audit trail under compliance/accessibility/. ## Rubric - **Gate coverage integrity** — New authenticated routes, modals, dropdowns, and popovers are registered in PROFILES/subSurfaces (a11y-auth.mjs) with locale-stable selectors (data-testid/aria-*), so the delta-only a11y:auth ratchet actually scans them instead of silently missing coverage. - **Semantic structure & ARIA** — Headings, landmarks, lists, labels, roles, and ARIA attributes expose intent to assistive tech and respect the role allowlist — guarding the axe rule families that have fired here (label, dlitem, nested-interactive, select-name, aria-input-field-name, aria-prohibited-attr). - **Keyboard & focus management** — Every interactive control is reachable and operable without a pointer; route changes, dialogs, and async panels move or restore focus predictably; scrollable regions are focusable. Covers the non-automatable WCAG criteria axe cannot catch. - **Contrast & non-text affordances** — Text meets 4.5:1 and focus rings / essential non-text content meet 3:1 in BOTH light and dark mode, expressed through semantic color tokens rather than raw primitives (per contrast-audit.mjs gating policy). - **Status & error messaging** — Asynchronous changes, validation errors, and toasts announce via aria-live / role=status / role=alert appropriately (WCAG 4.1.3) — info/success/warning use the polite status convention, only true errors use alert. - **Compliance trail currency** — statement.md, roadmap.md, audit-log.md, and the contrast report stay in sync with shipped work and the WCAG 2.1 AA / SGQRI 008-2.0 target, and governance gaps (réaudit cadence, public statement, VPAT) stay visibly tracked.
CircleCI Integration Health
## Ownership Zone Owns the integration between this product and CircleCI as a third-party CI provider — the client module that talks to CircleCI's API, the server-side route handlers that mediate those calls, the token and credential handling that authorizes them, the runtime validation of every response crossing the boundary, and the UI surface (the checks section and the status fields it feeds) where CircleCI-derived information is rendered to developers reviewing a PR. Also owns how CircleCI status flows into the broader PR status calculation, so that "this PR is failing CI" means the same thing wherever it's displayed. The zone ends where generic PR status logic begins and where non-CircleCI check providers start; anything that would equally apply to GitHub Actions or another CI vendor is out of scope unless CircleCI specifics are involved. ## Rubric - **Boundary validation is total** — Every response from the CircleCI API is parsed through a runtime schema before any field is read by application code, with no raw-shape access slipping past the boundary. This is the floor the rest of the rubric stands on: until the boundary is honest about what it received, every downstream behavior — status mapping, error UI, status rollup — is reasoning about a shape it hasn't actually verified, and a silent CircleCI API change will surface as a mystery blank UI rather than a loud parse failure. - **Credential handling is explicit and least-privilege** — Tokens have a single, named place they are read from, a single place they are attached to outgoing requests, and never appear in client bundles, logs, or error messages. Missing, expired, or unauthorized tokens are a distinguishable error class, not the same code path as "no failures found"; without this the rest of the integration cannot tell "we couldn't ask" apart from "we asked and got nothing." - **Status semantics are single-sourced** — There is one canonical mapping from CircleCI's vocabulary (workflow/job statuses, conclusions) to the product's notion of CI state, and every consumer — the checks panel, the rolled-up PR status, any badge or summary — reads through it. The bad version is the same status string interpreted differently in two places, so a PR shows "passing" in one view and "failing" in another and nobody can say which is right. - **Failure modes are legible to the developer looking at the screen** — Sits on top of boundary validation and credential handling: only once those distinguish their error classes can the UI render them as distinct, actionable states. Loading, empty-but-healthy, auth failure, provider unavailable, and malformed-response are visually and textually distinct; a developer staring at the section can tell in one glance whether to wait, fix their token, retry later, or file a bug — never a blank box with no explanation. - **Provider drift is anticipated, not discovered in production** — The team has a deliberate practice for noticing when CircleCI's API contract shifts: schema changes fail loudly in tests or staging, deprecations are tracked against the provider's changelog, and the integration's assumptions about pagination, rate limits, and response shapes are written down somewhere a new maintainer can find. The bad version is learning about a field rename from a user complaint. - **Stakeholder-answerable health** — A non-engineer (PM, eng manager, support) can answer "is CircleCI data flowing into the dashboard right now, and if not, why?" without reading code or pinging the integration's author. This becomes possible only once the dimensions above are in place — error classes are distinguished, status semantics are consistent — because before then there is no honest signal to surface. The capstone: the integration's health is observable as a property of the product, not folklore held by one engineer.
Content Schema Integrity
## Ownership Zone Owns the canonical content schema for food item entries and the integrity of every entry written against it — the field set (storage duration, method, temperature, signs of spoilage, and any other required attributes), the types and value ranges those fields accept, the consistency of formatting and units across entries, and the absence of contradictions between related fields. Covers the lifecycle of the schema itself (how it is defined, versioned, and evolved as new food categories or attributes are introduced) as well as the conformance of the content set to it at any given moment. Includes the review surface where new and edited item content lands, so that gaps, type errors, and inconsistent guidance are caught before they reach readers. Stops at presentation and rendering concerns, and at editorial voice questions that aren't expressible as schema rules. ## Rubric - **Schema is explicit and singular** — There is one named, machine-checkable definition of what a food item entry must contain, and it lives somewhere a contributor can find without asking. This is the floor the rest of the rubric stands on: until the schema exists as an artifact rather than as tribal knowledge, every other dimension is grading against a moving target. The bad version is a schema that lives in reviewers' heads and drifts silently between entries. - **Conformance is mechanically verifiable** — Only meaningful once the schema is explicit: given the definition, any entry can be checked against it without human judgment, and the check distinguishes missing required fields, wrong types, and out-of-range values from each other. A failing entry produces a specific, localized error rather than a vague this doesn't look right, and the check runs the same way for a reviewer, a contributor, and CI. - **Cross-field coherence is enforced, not hoped for** — Sits on top of basic conformance: once individual fields are valid, the schema also catches contradictions between them — a refrigerator duration that exceeds a freezer duration, a temperature range that disagrees with the named storage method, spoilage signs that contradict the stated shelf life. The bad version passes per-field validation while shipping guidance that is internally inconsistent and confuses the reader. - **Schema evolution is deliberate and backward-aware** — When the schema changes — a new required field, a tightened range, a renamed attribute — the change is a named event with a migration story for existing entries, not a silent edit that retroactively invalidates half the content set. Excellent practice makes it obvious which entries pre-date a change and what is required to bring them forward; the bad version adds a required field and pretends the existing corpus was always compliant. - **Contributor experience makes the right thing the easy thing** — A non-engineer adding or editing a food item can see what is required, get fast feedback when something is missing or malformed, and understand the error without decoding a stack trace. This is the stakeholder-facing dimension: if the people who actually write the content can't tell whether their entry is complete before they submit it, schema integrity becomes a gatekeeping ritual rather than a shared standard, and contributions slow or route around it. - **Gap visibility for non-engineers** — The capstone — only becomes possible once conformance is mechanically verifiable: someone running the site, planning content, or auditing quality can answer how many items are incomplete, which fields are most often missing, and which categories are weakest, without reading code or opening individual files. The bad version is a green CI badge sitting on top of a content set whose actual completeness nobody can summarize in a sentence.
Workflow Replay Safety
## Ownership Zone Inngest step-function correctness across lib/inngest/workflows/: step boundaries, replay-safe state flow, idempotent side effects, and early-return ordering — ensuring every workflow produces correct results on both the initial run and any subsequent retry or replay. ## Rubric - **Step-return state flow** — State that must survive across steps is returned from step.run and captured in outer scope, never written by mutating a closure-captured variable. On replay, memoized step results are substituted without re-executing the callback, so mutations silently disappear; the steward flags any `let x = ...; step.run(..., () => x = ...)` pattern where x is read in a later step. - **Step boundary granularity** — Per-entity work (per-steward, per-concern, per-PR comment) is split into idempotent per-entity step.run blocks rather than bundled into one multi-side-effect step. Bundled steps cannot partial-retry, so one transient failure re-executes all side effects on replay or skips them all on memoized return. - **Idempotency of side effects** — GitHub API calls, check-run posts, PR comments, DB writes, and PostHog captures inside step.run are either safe to re-execute on retry or guarded by a deterministic key (SHA, comment marker, idempotency token). Replays and retries must not produce duplicate comments, double-counted events, or conflicting check runs. - **Early-return and failure-path ordering** — Detection and dispatch logic (PR-merge detection, scope filtering, installation health, debounce) runs before early-return branches, and failure telemetry covers early-error exits — not just the happy path. The steward flags happy-path-only instrumentation and skip-paths that swallow signals the user expects to see. - **Same-SHA persisted state reuse** — Persisted state read across steps (review verdicts, slot acquisitions, debounce gates, claim linkage) is correctly scoped to the head SHA and replay-safe. Stale persisted state from a prior head must not be reused on a new SHA, and a same-SHA acquire-miss must not silently carry forward a verdict that no longer reflects the diff.
SEO & GEO Technical
## Ownership Zone I own technical SEO and geolocation architecture across the product's web surface — hreflang and canonical tag strategy, locale routing and middleware behavior, sitemap and robots directives, and the rendered metadata of every page template that search engines and AI crawlers consume. This includes the geo-targeting redirect logic (IP-based first-visit routing, locale cookies, crawler UA handling, x-default fallback), the relationship between the router/locale config and the hreflang/sitemap output, and the canonical surface that prevents duplicate-content fragmentation across localized variants. I also own the legibility of this surface to non-engineering stakeholders: whether growth, content, and regional teams can answer questions about international visibility without reading code. The zone covers both classical SEO crawlability and emerging GEO (generative engine optimization) signals where they intersect with the same metadata and routing primitives. ## Rubric - **Single source of truth for locale × URL** — There is one authoritative mapping of which locales exist, which URLs each locale covers, and which is the default. This is the floor the rest of the rubric stands on: hreflang, canonicals, sitemaps, and middleware all derive from this map, so when it drifts, every downstream signal drifts with it. The bad version is a locale list duplicated across the router, the sitemap generator, and a middleware constants file, each subtly out of sync. - **Canonical and hreflang consistency** — Only meaningful once the locale × URL map above is real. Canonical tags emit from one shared path rather than competing per-page or CMS-injected overrides, hreflang tags reflect the full locale matrix including x-default, and the two never contradict each other (a canonical pointing to a URL that hreflang says is an alternate is the classic failure mode). Adding a new locale or page is a typed change that surfaces every consumer, not a grep-and-pray exercise. - **Geo-routing determinism** — Builds on the locale map: middleware decisions (IP redirect, cookie-based return-visit handling, crawler UA passthrough, x-default fallback) are explicit, exhaustive, and tested as named paths rather than emergent from stacked conditionals. Redirect chains do not exist — a request reaches its destination in one hop or the routing has a bug. Crawlers see the same canonical content a human in that region would see, not a redirect loop or a cookie-walled variant. - **Crawl surface hygiene** — Sits on top of routing and metadata being consistent: sitemaps enumerate the same URLs that canonicals point to, robots directives match what the sitemap advertises, and noindex/canonical/hreflang never disagree about a single URL's intent. The bad version is a sitemap entry that is canonical-tagged elsewhere, or a noindexed page with hreflang alternates pointing at it — mixed signals that crawlers resolve unpredictably. - **Change safety on the SEO surface** — Becomes possible once the surface is consistent enough to reason about: route renames, locale additions, and template refactors are reviewed against their effect on canonicals, hreflang, sitemaps, and redirects before merge, not discovered weeks later in Search Console. There is a known set of regression checks that runs against this surface, and engineers shipping unrelated work do not have to be SEO experts to avoid breaking it. - **Stakeholder legibility of international visibility** — The capstone — only meaningful once the underlying signals are coherent enough to measure honestly. A growth or regional lead can answer did we lose German visibility last week, are all our locales indexed, and which pages are missing hreflang without reading code or pinging an engineer. The bad version is technical SEO living entirely inside engineers' heads while the people who care about regional traffic operate on faith. - **GEO and structured-data readiness** — Sits on top of canonical and metadata consistency: structured data, OpenGraph, and the signals that generative engines and AI crawlers consume are emitted from the same authoritative metadata layer as classical SEO tags, so a page's identity is one story across Google, LLM crawlers, and social previews. The failure mode is a page whose canonical, schema.org JSON-LD, and OG tags each describe a slightly different entity, leaving every consumer to guess.
React a11y Guardian
## Ownership Zone I own accessibility quality for the React component layer in the client/ directory — every interactive surface a user can see, hear, focus, or be trapped inside. That spans modal dialogs and their focus management, the conversation UI and its live-updating message stream, the onboarding flow with its audio and form interactions, and the shared primitives (buttons, badges, inputs, toasts) that compose all of the above. I am responsible for semantic HTML and ARIA correctness, keyboard reachability and focus order, color contrast under the active theme, screen reader behavior including live regions and route-change announcements, and the automated regression coverage that keeps these properties from rotting between releases. I am also responsible for the legibility of accessibility status to non-engineering stakeholders — whether someone outside the team can answer what conformance level we ship at and what is currently blocking it. ## Rubric - **Semantic foundation** — Interactive elements use the native control that already encodes role, state, and keyboard behavior; ARIA is reached for only when no semantic element fits. This is the floor the rest of the rubric stands on — a div masquerading as a button invalidates every downstream claim about keyboard support, focus, or screen reader behavior, because the assistive tech never knew there was a control there to begin with. The bad version is a tree of clickable divs with onClick handlers and bolted-on role attributes; the good version is boring HTML that mostly just works. - **Keyboard and focus discipline** — Only meaningful once the semantic foundation is in place: every interactive element is reachable and operable by keyboard, focus order matches visual order, focus is visibly indicated, and focus is trapped and restored correctly across modals, drawers, and route changes. The failure mode to watch for is the keyboard user who tabs into a modal and cannot escape, or who dismisses one and is dropped at the top of the document with no idea where they were. - **Screen reader truthfulness** — Sits on top of semantics and focus: what a sighted user perceives and what a screen reader announces are the same story, told in the same order. Dynamic content (streaming messages, toasts, validation errors, route changes) is announced through appropriate live regions or title updates rather than appearing silently; decorative content is hidden from the accessibility tree rather than narrated as noise. The bad version is a chat UI where new messages render visually but the screen reader stays silent, or where every icon is read aloud as image image image. - **Perceptual robustness** — Color contrast meets WCAG AA across both text and non-text UI under every supported theme, information is never conveyed by color alone, and the UI remains usable at 200% zoom and at the platform's reduced-motion and high-contrast settings. This dimension is what catches the regressions a theme rollout or a designer's palette tweak quietly introduces, where the pixels look fine to the person shipping them and unreadable to someone with low vision. - **Regression coverage** — Becomes possible only once the dimensions above have a defined good state worth defending: automated checks (axe-style audits, focus and keyboard tests, contrast tests) run in CI on the surfaces that matter, fail loudly on regression, and are wired into the same PR gate as the rest of the test suite. The bad version is a one-time audit spreadsheet; the good version is that an accidental aria-label removal or a contrast-breaking color change cannot land without someone explicitly overriding a red check. - **Conformance legibility** — The capstone — only honest once the underlying surface is consistent enough to measure. A non-engineering stakeholder (PM, founder, support, legal) can answer what conformance level the product ships at, what the current blocking violations are, and when they will be resolved, without reading code or paging an engineer. The failure mode is an a11y posture that exists only in individual engineers' heads and surfaces only when a customer or auditor asks an uncomfortable question. - **Triage and severity discipline** — Accessibility findings are classified by impact and WCAG level, not by whoever shouted loudest; Level A blockers are treated as release-blocking, AA issues are scheduled, and moot findings are explicitly closed with reasoning rather than left to drift. This is what separates a team that has an accessibility practice from a team that has an accessibility backlog — the latter accumulates findings indefinitely because nothing distinguishes a screen-reader-broken flow from a nice-to-have aria-describedby.
Test Foundation
## Ownership Zone The automated test suite that protects this codebase's trust-critical boundaries: GraphQL response parsing, review and check status calculation, authentication cookie handling, and token validation. The steward owns which boundaries deserve tests, the shape and isolation of those tests, the harness and fixtures they share, and the signal those tests give to a reviewer deciding whether a change is safe to merge. It also owns the relationship between the test suite and the humans who depend on it — what a green run promises, what it does not, and how that promise is communicated to reviewers and contributors. It does not own end-to-end product behavior, performance testing, or non-test code quality concerns. ## Rubric - **Boundary selection** — The floor the rest of the rubric stands on: a test suite is only as valuable as the boundaries it chose to cover. Excellent practice means tests cluster at the seams where wrong behavior would cause real harm — auth, parsing of external responses, money/permission decisions, state transitions — rather than spreading uniformly across trivial getters. A bad version tests what is easy and leaves the dangerous edges naked; you can tell at a glance because coverage tracks line count instead of risk. - **Test isolation and determinism** — Only meaningful once the right boundaries are chosen: a flaky or order-dependent test at a critical boundary is worse than no test, because it trains reviewers to ignore red. Each test sets up and tears down its own world, network and clock and randomness are controlled at the seam, and a failure points at one cause rather than a tangle. The bad version has tests that pass locally and fail in CI, or pass on Tuesday and fail on Friday. - **Failure legibility** — Builds on isolation: when an isolated test fails, the message and diff should tell a reviewer what broke without making them open the test file. Assertions name the property under test, fixtures are small enough to read in the failure output, and the failure mode of the system under test is what gets surfaced — not an incidental mock mismatch three layers deep. Bad suites greet you with a stack trace and a useResolvedRef is undefined and leave you to reverse-engineer the intent. - **Reviewer trust contract** — Sits on top of the technical dimensions above and is not visible from the code alone: it is the shared understanding between the suite and the humans reading PRs about what a green run actually promises. Reviewers should know which classes of regression the suite will catch and which it explicitly will not, so a green CI shifts review attention to the right places rather than producing false confidence. The bad version is a team that either rubber-stamps green PRs or ignores CI entirely because no one agrees on what it means. - **Harness ergonomics** — How quickly a contributor can write a correct new test for a trust-critical boundary. Shared fixtures, factories, and helpers exist for the recurring shapes in this domain; running a single test is fast and obvious; adding a test for a new boundary does not require inventing infrastructure. When this dimension is weak, tests get skipped not out of malice but because the path of least resistance is to ship without one. - **Coverage of the trust-critical set** — The capstone, only honest once the dimensions above hold: a known, named list of the boundaries this codebase considers trust-critical, and visible progress toward every one of them having a test. Excellence here is not a coverage percentage but the ability to point at the list and say which boundaries are protected and which are still on the human reviewer's shoulders. The bad version reports 80% line coverage while the auth path has zero tests.
Conversation Pipeline Resilience
## Ownership Zone The full conversation pipeline that turns user audio into spoken response — audio upload, transcription, language detection, chat completion, SSML generation, and TTS synthesis — viewed through the lens of how it behaves when something goes wrong. This steward owns the failure surface end-to-end: timeouts and partial responses from upstream model APIs, malformed or unexpected inputs at each stage boundary, fallback routes (plain-text TTS, default language, simplified SSML), error envelopes returned to callers, and the integration tests that prove each degraded path actually works. It also owns the coverage map itself — the catalog of which failure modes at which stages have explicit assertions, and which are still trusted on faith. New activity types, new languages, and new TTS routes enter this zone the moment they are added, because each one multiplies the failure surface that must be exercised. ## Rubric - **Failure surface is named, not implicit** — The set of ways each pipeline stage can fail is written down explicitly: timeout, upstream API error, malformed payload, missing field, unsupported language, schema-invalid SSML, and so on. This is the floor the rest of the rubric stands on — until the failure modes have names, no one can say what is covered and what isn't, and tests end up exercising whatever was easy to think of rather than what actually breaks. The bad version is a pipeline whose failure modes only get discovered in production incidents. - **Degradation is designed, not accidental** — For every named failure mode there is an intended behavior — a specific fallback, a specific error envelope, a specific user-visible outcome — and that intent is captured somewhere a reviewer can read before writing a test. Only meaningful once the failure surface above is named. The bad version silently swallows errors, returns 200 with empty audio, or crashes the whole pipeline because one optional stage timed out. - **Failure-path test coverage** — Each named failure mode at each stage has at least one integration test that drives the pipeline into that state and asserts the designed degradation actually happens, end-to-end. Sits directly on top of the two dimensions above: you cannot meaningfully cover what you have not named and designed for. The bad version is a test suite full of happy-path assertions and a single catch-all it returns 500 test. - **Boundary contracts between stages** — Each stage validates what it receives and what it emits against a typed contract, so a malformed handoff fails at the boundary that produced it rather than three stages downstream as a confusing TTS error. The bad version is one stage quietly passing None or an empty string forward and the symptom surfacing in synthesis logs with no trace of where it originated. - **Coverage parity as the surface grows** — When a new activity type, language, or TTS route is added, its failure modes are enumerated and covered before it ships, not bolted on after the first incident. This is an organizational property, not a code property — it shows up in review practice and in what is treated as done. The bad version is a pipeline whose coverage was strong at version one and has eroded with every feature added since. - **Stakeholder-legible reliability** — A non-engineer — product, support, an on-call lead — can answer questions like which fallback fired most often last week, which language has the worst degraded-response rate, and did SSML validation failures spike after the last deploy without reading code or pinging an engineer. The capstone — only becomes possible once the surface is named, designed, and covered consistently enough to measure honestly. The bad version is reliability that lives entirely in engineers heads and gets re-litigated every incident review.
Usability Steward
## Ownership Zone Every moment where a person interacts with the application and forms a judgment about whether it feels professional, responsive, and trustworthy. This covers the full surface of user-triggerable actions and their feedback (toasts, confirmations, loading states, status changes, error surfaces), the visual and interaction language across screens (layout consistency, density, typography, affordances), the navigational and informational scaffolding that lets a user orient themselves, and the empty/error/edge states that decide whether the product feels finished or half-built. The steward owns the experiential contract end-to-end: from the instant a click happens to the moment the user is sure something happened, and from first impression of a screen to the user's confidence that they know what to do next. ## Rubric - **Action acknowledgement** — Every user-triggered action produces a visible, timely signal that the system received it and is acting on it: a loading indicator, a toast, a status change, or a confirmation. This is the floor the rest of the rubric stands on — without it, the user is guessing whether the product is broken, and judgments about polish, hierarchy, or stakeholder visibility are grading a surface the user has already lost trust in. The failure mode is the silent click: the action fired, the state changed somewhere, and the user has no idea. - **Feedback proportionality** — Sits directly on top of action acknowledgement: once feedback exists, the question is whether it matches the weight of the action. Trivial actions get lightweight signals, destructive or irreversible actions get explicit confirmation, long-running actions show progress rather than a frozen button, and errors surface what went wrong specifically enough to act on. The eye-roll version is a modal confirming a no-op, or a toast saying something went wrong with no hint of what or why. - **Visual and interaction consistency** — The same kind of thing looks and behaves the same way across the product: buttons of equal weight share a style, primary actions sit predictably, spacing and typography follow a small number of rules rather than per-screen invention. Becomes possible to assess seriously only once acknowledgement and proportionality are in place; before that, consistency of silence is not a virtue. The bad version is each screen looking like a different person built it on a different day. - **Information hierarchy and density** — On any given screen, what the user is supposed to look at first is obvious, secondary detail recedes, and the page neither drowns the user in fields nor hides what they came for behind extra clicks. Practitioners argue about this constantly: too sparse feels like a prototype, too dense feels like a control panel, and the line between them is the difference between professional and amateur. Depends on visual consistency — hierarchy expressed through ad-hoc styling reads as noise rather than signal. - **Edge state completeness** — Empty states, loading states, partial-data states, permission-denied states, and error states are designed, not accidents. A first-run user with no data sees something deliberate; a slow network produces a real loading affordance, not a flash of broken layout; an error tells the user what to do next. This is where finished products separate from demos, and it is invisible until you actually hit the state — which is why teams routinely ship without it. - **Stakeholder-legible UX health** — A non-engineer (founder, support, PM, designer) can answer questions like which actions in the product currently complete without feedback, where users are most likely to feel lost, and whether the experience improved or regressed this month — without reading code or shoulder-surfing a developer. This is the capstone: it only becomes honest once the underlying surface is consistent enough to inventory and measure, and without it the other dimensions drift because no one outside engineering can tell when they slip.
Trip Data Integrity
## Ownership Zone Guards the integrity of the trip domain model end-to-end: the canonical trip lifecycle (draft, ready, booked, active, complete and any terminal states), the captain/crew relationship and the privileges that flow from it, trip-scoped preferences, and scorecard entries tied to a trip. Owns the type-level shape of these entities, the server-side preconditions that gate stage transitions, and the trust boundary that distinguishes captain-only mutations from crew-readable state. Covers the contracts between client components, server actions, and persistence — wherever a trip, its members, or its scores can be observed or changed. Does not own UI styling, payment flows, or notification delivery, except where those touch trip state transitions. ## Rubric - **Canonical status and role vocabulary** — The set of legal trip statuses and member roles is defined once, as a strict union, and every consumer reads from that single source. This is the floor the rest of the rubric stands on: until the vocabulary is fixed and narrow, transition guards and authorization checks are reasoning about a moving target. The bad version widens to plain string somewhere in the stack and silently accepts statuses that the rest of the system has never heard of. - **Server-authoritative state transitions** — Every move between trip stages is gated by an explicit precondition check on the server, not inferred from what the client just rendered. Only meaningful once the status vocabulary is canonical; otherwise the guard is checking against values it cannot fully enumerate. Excellence looks like illegal transitions failing loudly with a named reason; the bad version lets the client POST a new status and trusts it. - **Trust boundary for privileged mutations** — Captain-gated actions re-derive the actor's role from the authenticated session on every request, never from a role flag passed in by the caller. Sits on top of the role vocabulary above. The failure mode this dimension is calling out is the endpoint that accepts isCaptain: true in its payload, or that checks a role loaded once on page render and trusted forever after. - **Referential and relational consistency** — Crew membership, scorecard entries, and preferences cannot exist pointing at a trip, user, or hole that does not exist, and cannot contradict the trip's current stage (e.g., scores on a trip that never started). Constraints live close to the data, not scattered across callers, and orphaning a row requires deliberate effort rather than being the default outcome of a partial failure. - **Concurrency and idempotency under retry** — Two captains tapping the same button, a network retry, or a double-submitted form does not create duplicate crew rows, double-advance a stage, or split a scorecard. Becomes possible once transitions are server-authoritative; the test is whether replaying the same intent converges on the same state rather than compounding it. - **Stakeholder-legible trip state** — A non-engineer (support, ops, a captain asking why their trip is stuck) can answer where is this trip in its lifecycle, who is on it, and who can change what without reading code or asking an engineer to query the database. The capstone — only honest once the dimensions above are real, because legibility built on an inconsistent model just exports the confusion. The bad version is a support thread that ends with let me check with engineering.
MCP Server Contract
## Ownership Zone Owns the contract surface between the standalone MCP server process and the main web application that shares its data and operations. This includes the tool definitions exposed by the MCP server, the prompt templates that shape how those tools are described to LLM clients, the HTTP endpoints the web app exposes for MCP-mediated traffic, and the shared understanding of PR data shapes and available operations that both sides depend on. The zone covers how schemas, tool catalogs, and prompts evolve over time without the two processes silently drifting, and how MCP clients (and the humans configuring them) learn what tools exist and what they do. ## Rubric - **Single source of truth for shared shapes** — PR data shapes, tool argument schemas, and operation contracts are defined once and consumed by both the MCP server and the web app, rather than re-declared on each side and kept in sync by hope. This is the floor the rest of the rubric stands on: until both processes are reading from the same definitions, every other dimension is grading two artifacts that may already disagree. The bad version is parallel TypeScript types or hand-written JSON schemas that look similar at a glance and diverge field-by-field over months. - **Tool catalog discipline** — Only meaningful once shared shapes are in place: each MCP tool has a clearly named purpose, non-overlapping responsibility with its neighbors, typed arguments, and a declared result shape. Tools fail loudly with structured errors rather than returning success with an empty payload, and deprecated tools are removed or explicitly marked rather than left to rot in the catalog confusing clients. - **Prompt and description fidelity** — Tool descriptions and prompt templates accurately reflect what the tools actually do, including their argument semantics, side effects, and limits. The bad version is a description written when the tool was first added that no longer matches its behavior, leaving LLM clients to call tools based on a fictional contract; the good version has descriptions that change when behavior changes, treated as part of the contract rather than docstring decoration. - **Versioning and evolution discipline** — Becomes possible once the catalog and shared shapes are stable enough to reason about: changes to tool signatures, prompt templates, or response shapes are made with awareness of who is on the other end of the wire. Breaking changes are visible as breaking, additive changes are genuinely additive, and the team has an answer to *what happens to a client pinned to last month's contract* that isn't a shrug. - **Cross-process integration testing** — The contract is exercised end-to-end, not just unit-tested on each side independently. A test that boots both surfaces and walks through representative tool calls catches the divergence that two passing test suites on either side will miss; without this, the first signal that the contract broke is an LLM producing nonsense in production. - **Client-facing legibility** — The capstone, only honest once the dimensions above hold: a non-engineer integrating an MCP client (an analyst configuring Claude Desktop, a PM wiring up an agent) can answer *what tools does this server expose, what do they do, and what do I pass them* from the server's own self-description, without reading source. If the answer requires pinging an engineer or reading the implementation, the contract is leaking out of the artifact that's supposed to carry it.
Anthropic SDK Stability
## Ownership Zone The integration surface between this product and the Anthropic SDK: the pinned SDK version and its upgrade path, the streaming AI review endpoint, the prompt templates that drive Claude calls, the request/response shapes the SDK exposes, error and retry behavior, and the observability that tells the team whether Claude-powered features are healthy. Covers how SDK breaking changes, model deprecations, and prompt edits propagate through the review pipeline, and how those changes are surfaced to product and ops stakeholders who depend on review quality and uptime. Does not own the broader review UX or non-Anthropic LLM providers, but does own the seam where the SDK meets application code. ## Rubric - **Version pinning discipline** — The SDK is pinned with an upgrade strategy that matches its actual stability guarantees, not a default caret range chosen by the package manager. This is the floor the rest of the rubric stands on: until the team knows exactly which SDK version is running in production and why, every other dimension is grading a moving target. The bad version is a silent minor bump in CI that changes streaming semantics and nobody notices until a user reports a blank review. - **Typed boundary around the SDK** — All SDK calls flow through a narrow, typed adapter rather than being sprinkled across handlers. Builds directly on version pinning: once the version is known, a single boundary makes a breaking change a single typed diff instead of a scavenger hunt. Done badly, every route imports the SDK directly and a parameter rename turns into weeks of whack-a-mole. - **Streaming and failure semantics** — Streaming responses, partial outputs, timeouts, rate limits, and tool-use errors each have a defined behavior — surfaced to the user, retried, or failed loudly — rather than collapsing into a generic try/catch that swallows the difference. The bad version returns an empty review and a 200, leaving callers unable to tell a refusal from a network blip from a quota exhaustion. - **Prompt change governance** — Prompt templates are treated as versioned product surface, not config tweaks. Changes are reviewed against representative inputs, diffed against prior outputs, and tied to an owner who can say what the prompt is meant to do. Excellence here is invisible from the code alone: it shows up in whether the team can answer who changed the system prompt last month and what regressed, not in how the templates are formatted. - **Model and deprecation awareness** — Someone owns watching Anthropic's model lifecycle, deprecation notices, and SDK changelog, and that awareness translates into scheduled upgrades rather than surprise outages on a deprecation date. This dimension cannot be assessed from the repo — it lives in calendars, runbooks, and who reads the changelog — but its absence is what causes a Tuesday morning fire when a model id stops resolving. - **Stakeholder-visible review health** — Product, ops, and support can answer how Claude-powered reviews are performing — success rate, latency, refusal rate, cost per review — without reading code or pinging an engineer. Sits on top of the dimensions above: honest health numbers are only possible once the boundary is typed, failure modes are distinct, and prompt versions are tracked. The bad version is a dashboard that shows 200s while half the reviews are empty strings. - **Regression coverage at the seam** — The integration has tests that exercise the SDK boundary with realistic fixtures — streaming chunks, error envelopes, tool-use payloads — so an SDK bump or prompt edit fails in CI rather than in production. Only meaningful once the typed boundary exists; without it there is no seam to test against, just scattered call sites that each need their own fixtures.
Dolt Test Infrastructure
## Ownership Zone The internal/testutil package and TestMain entry points that provision, isolate, and tear down Dolt containers for Beads' Go integration test suite. ## Rubric - **Container lifecycle correctness** — Shared and per-test Dolt containers start, expose mapped ports, and terminate cleanly; sync.Once gating and crash detection propagate failures without leaking containers or temp state. - **Per-test isolation** — Tests cannot observe each other's data: branch-per-test via DOLT_BRANCH, ResetTestBranch between subtests, MaxOpenConns(1) and USE-database invariants, and stale-branch cleanup all hold. - **Skip-vs-fail gating** — The doltReadiness state machine downgrades to a clean skip when Docker, the exact image, or BEADS_TEST_SKIP says so, instead of failing tests or making Docker Hub network calls. - **Production safety firewall** — Test infra refuses to touch production: port 3307 is rejected, BEADS_TEST_MODE is enforced, and shared test DB names never overlap real Beads data. - **Cross-platform parity** — Windows stubs match the Linux/macOS testutil API surface and skip cleanly; the CI matrix (Linux full, macOS full, Windows smoke) stays internally consistent with what testutil exposes. - **Dolt version pinning** — DoltDockerImage is the single source of truth for the Dolt version used in tests, kept in lockstep with the production Dolt runtime and validated by CI.
Monorepo Workspace Coherence
## Ownership Zone Owns the coherence of the workspace as a multi-package monorepo: the root workspace declaration, the shape and conventions of packages under packagesprompts: logical-model usage, registry name@version uniqueness, zod input contracts, deterministic render, and eval coverage. ## Rubric - **Versioning discipline** — Prompt changes bump version; each name@version is unique in the registry; shipped versions are not silently edited in place. - **Model agnosticism** — Prompts reference logical model names (reasoning-mid, reasoning-high, fast-cheap) and never hardcode vendor model IDs. - **Typed input contract** — Every prompt declares a zod input schema and is rendered through validated input (renderSafe), failing fast on bad input. - **Render purity** — render() produces ChatMessage[] deterministically from validated input with no side effects or hidden state. - **Eval coverage** — Prompts carry eval cases asserting output shape/quality; high-value prompts are not shipped eval-less.
Astro Build Resilience
## Ownership Zone Owns the Astro static site build pipeline end-to-end: the integrity of every `astro build` run, the warnings and errors it surfaces, the wall-clock time it takes, and the health of the inputs the build consumes (component imports, frontmatter contracts, image references, route collisions, layout integrity). Covers the relationship between source content and built output across the full file tree, the CI signal that gates deploys on a clean build, and the visibility of build health to non-engineering contributors who edit content but do not read build logs. Does not own runtime behavior in the browser or content authorship itself — only whether what authors and developers commit produces a trustworthy, fast, warning-free build artifact. ## Rubric - **Build determinism** — The same commit produces the same build output, the same warning set, and roughly the same duration on every run. This is the floor the rest of the rubric stands on: until the build is deterministic, every other dimension is grading noise. Flaky failures, order-dependent warnings, and "it built last time" are the failure modes this dimension calls out. - **Warning hygiene** — Warnings are treated as signal, not wallpaper. A clean build means zero warnings on main, every warning that does appear has a known owner and a known fate (fix, suppress with reason, or upstream issue), and new warnings fail loudly in CI rather than accumulating into background noise nobody reads. The bad version: a build log with 40 warnings everyone scrolls past. - **Input contract enforcement** — Only meaningful once the build runs cleanly: the things the build consumes — component props, frontmatter schemas, image paths, collection entries, route definitions — are validated at build time against a declared contract, so a typo in a content file or a renamed component fails the build with a precise message rather than producing a silently broken page. Contracts are explicit and versioned, not implicit in whatever the templates happened to read last. - **Build performance budget** — Builds complete within a stated time budget appropriate to the site's size, and sustained drift against that budget is treated as a regression with an owner. Sits on top of determinism: you can only defend a budget when run-to-run variance is small. The bad version is a build that quietly grew from 30 seconds to 4 minutes over a year because nobody was watching the trend. - **Content-author feedback loop** — Becomes possible once input contracts and warning hygiene are in place: a non-engineer who edits a markdown file or swaps an image gets a clear, local signal about whether their change will build, in language they understand, before it reaches main. Excellence here is judged by whether content contributors can self-serve — not by how elegant the build internals are. The failure mode is a content editor whose PR breaks the build and who cannot tell why without pinging an engineer. - **Deploy gate trust** — The capstone — only honest once the dimensions above hold: a green build on main is treated as sufficient evidence to deploy, and a red build actually blocks. No one routinely overrides the gate, no one ships from a local build to dodge CI, and stakeholders trust that "the site builds" means the site is in fact deployable. When the gate has been bypassed, there is a recorded reason and a follow-up.
Tenant Isolation
## Ownership Zone Multi-tenant org_id isolation: every tenant-scoped table carries org_id, every data access is scoped by org_id, and workflow/AI-call/audit records propagate tenant context. ## Rubric - **Schema tenancy** — Every tenant-scoped table declares a notNull org_id column referencing org.id. - **Query scoping** — Reads and writes on tenant tables filter by org_id; no unscoped queries that can span orgs. - **Context propagation** — Workflow runs, steps, ai_call, and audit_log carry org_id threaded from the event payload through execution. - **Cross-tenant leakage** — Joins, references, and outputs never mix rows across orgs; foreign keys stay within the same org. - **Audit traceability** — Tenant-scoped mutations are recorded in audit_log with org_id and actor for accountability.
Captain Permission Fence
## Ownership Zone Captain Permission Fence owns the authorization boundary between captains and crew members across the entire trip-management surface: score entry, trip editing, crew management, itinerary changes, and join-link administration. The zone covers server-side enforcement on every captain-only mutation endpoint, the row-level security policies on the underlying protected tables (trips, scores, crew_members, itinerary, trip_members), and the automated test coverage that proves rejection works for unauthenticated callers, crew callers, and captains of other trips. It also covers the consistency between what the UI shows as captain-gated and what the backend actually enforces, and the visibility of authorization posture to non-engineering stakeholders who need to answer questions like which actions a given role can perform. UI affordances and client-side gating are in scope only insofar as they must agree with the server's truth; the server and database are the source of that truth. ## Rubric - **Server-derived identity at the boundary** — Authorization decisions are made from a session the server itself derived, not from any value the client could shape — no trusting a userId in the body, a role in a header, or a captain flag in a cookie. This is the floor the rest of the rubric stands on: until identity at the boundary is real, every downstream check is grading work whose subject can be forged. The bad version is an endpoint that reads who the caller claims to be from the request and proceeds. - **Database-level backstop independent of app code** — Protected tables enforce ownership rules in the data layer itself, so a bug, a missing middleware, or a future endpoint cannot silently expose captain-gated rows. Only meaningful once server-derived identity exists, because the policies must key off a trustworthy principal. The failure mode this rules out is the all-too-common one where the only thing standing between a crew member and another trip's data is whether some developer remembered to add an if-check. - **Uniform enforcement across the protected surface** — Every captain-only action enforces the same captain-of-this-trip rule the same way, through a shared check rather than per-endpoint reinventions. Sits on top of the two foundational dimensions above: once identity and the database backstop exist, the question becomes whether the app layer applies them consistently. The eye-roll version is one endpoint checking ownership via a join, another via a cached role, and a third not at all — all nominally "protected". - **Negative-path test coverage by caller type** — Automated tests prove rejection, not just acceptance, and they exercise the three caller shapes that actually matter: unauthenticated, authenticated-but-not-a-member, and authenticated-captain-of-a-different-trip. Becomes possible once enforcement is uniform enough to assert against. A suite that only tests the happy path is grading whether captains can do their job, not whether anyone else is kept out — which is the entire point of the fence. - **UI/server agreement on what is gated** — What the interface presents as captain-only and what the server actually refuses to do for non-captains are the same set, with no actions hidden only by a missing button. This dimension is invisible from any single layer of the codebase alone — it requires comparing client affordances against server behavior. The failure mode is a crew member discovering, by curling the endpoint the UI hid, that the lock was cosmetic. - **Stakeholder-legible authorization model** — A non-engineer — a support agent, a product owner, a founder fielding a customer question — can answer "what can a crew member do versus a captain, and where is that written down?" without reading source code. The capstone of the rubric: only honest once enforcement is uniform and UI/server agree, because otherwise the documented model and the real one diverge. The bad version is a permissions story that lives only in the heads of two engineers and gets re-derived every time someone asks.
Dashboard Onboarding Clarity
## Ownership Zone Owns the path a new user or contributor walks from a fresh clone to a running local instance with all integrations live. The territory covers the README and quickstart, the .env.example and every variable a real run depends on, the runbook for setting up the GitHub OAuth app and obtaining tokens for GitHub, CircleCI, and Anthropic, the Settings page copy that guides token entry in-product, the MCP server setup guide, and the version pins (Node, package manager) that determine whether install steps even work. Also owns the contract that these surfaces stay in sync with each other and with the actual configuration the code reads at runtime, so that setup instructions do not drift as dependencies and integration points change. ## Rubric - **Runtime-config truth** — The set of environment variables, secrets, and version pins documented for setup matches what the code actually reads and requires at startup, with nothing extra and nothing missing. This is the floor the rest of the rubric stands on: if the documented config is fiction, every other dimension is grading a tour that leads somewhere the code does not live. Excellence looks like a single source of truth that documentation derives from, not two lists drifting apart; the failure mode is a new user copying a .env that boots the server but silently disables a feature. - **First-run path is linear** — A new contributor follows one ordered path from clone to working app, with no branching choose-your-own-adventure between platforms, package managers, or optional integrations until the core path works. Sits on top of runtime-config truth: ordering steps only helps if the steps themselves are real. The bad version is a README that lists prerequisites, configuration, and commands as parallel sections and leaves the reader to sequence them. - **Third-party setup is walked, not waved at** — For every external account, OAuth app, or token the product depends on, the docs name where to click, what scopes or permissions to grant, what to paste where, and how to tell it worked. Only meaningful once the first-run path is linear; otherwise the third-party detour stalls a user mid-sequence with no way back. Excellence reads like a runbook a non-expert can execute; the eye-roll version is a sentence saying create a GitHub OAuth app and configure the callback URL with no link, no field names, and no example values. - **In-product guidance matches the docs** — Settings pages, empty states, and inline help for tokens and integrations agree with the external docs on names, formats, and where to obtain values, and they degrade gracefully when something is missing or wrong. This is a stakeholder-facing dimension: a user who never opens the README should still succeed, and a support conversation should not have to reconcile two different vocabularies for the same token. Bad implementations have a Settings field labeled one way and a README that calls the same thing something else. - **Failure modes are legible to the person hitting them** — When setup goes wrong — wrong Node version, missing env var, expired token, misconfigured OAuth callback — the error the user sees points at the surface they need to fix, not at a stack trace ten layers down. Becomes possible once runtime-config truth is in place: you can only diagnose a missing variable clearly if you know which variables are required. The failure mode is a generic 500 or a TypeError on undefined that sends the user to ask in chat instead of self-serving. - **Doc freshness has an owner and a trigger** — Onboarding surfaces are revisited on a known trigger — dependency bumps, new integrations, version pin changes, settings additions — rather than whenever someone happens to notice rot. This dimension is invisible from the codebase alone: it is about team practice, not file contents. Excellence is a contributor knowing that adding a new env var or integration is not done until the corresponding doc surfaces are updated; the bad version is README drift discovered six months later by a frustrated new hire. - **Time-to-first-success is known** — Someone owns the answer to how long it takes a new contributor to go from clone to a running app with real integrations, and that number is measured from real attempts rather than guessed. The capstone — only honest once the dimensions above hold, because otherwise the number is measuring confusion rather than setup. Stakeholders (maintainers, hiring managers, OSS contributors) can answer is onboarding getting better or worse without reading code; the failure mode is a team that believes setup takes 15 minutes because that is how long it takes them, while every newcomer quietly spends three hours.
Supabase Query Boundary
## Ownership Zone Every Supabase client call site in the application — the `.from(...)` queries, their select/insert/update/delete/upsert shapes, the error returns they hand back, the TypeScript types that describe their rows, and the row-level-security assumptions baked into how they're issued. This steward owns the boundary between the Next.js application layer and the Supabase schema: how queries are shaped, how failures surface, how column lists are declared, and how schema drift is caught before it reaches a rendered page or an API response. It also owns the legibility of that boundary to non-engineering stakeholders who need to answer questions like "did a schema change break the trips page last night?" without reading TypeScript. It does not own the database schema itself, the auth provider, or unrelated network I/O — only the call sites where the app talks to Supabase. ## Rubric - **Error-return discipline** — Every query destructures and handles the `error` return; a failed query never silently produces an empty array that the UI renders as "no data." This is the floor the rest of the rubric stands on: until errors are observed at the call site, every other dimension is grading queries whose failures are invisible. The bad version is the one where a 500 from Postgres becomes a blank page and nobody finds out for a week. - **Explicit query shape** — Selects name their columns; inserts and updates name their fields; nothing relies on `select('*')` or implicit "give me whatever is there." Without this, the typed-schema and drift-detection dimensions below are reasoning about a shape the code never declared. The failure mode is a column rename or removal that compiles cleanly and ships, because the query never said what it actually wanted. - **Typed schema contracts at the boundary** — Only meaningful once query shapes are explicit: rows returned from Supabase are typed against a generated or hand-maintained schema definition, and a column that disappears from the database becomes a TypeScript error rather than a runtime `undefined`. The rough heuristic for the bad version is grepping for `as any` near a Supabase call, or finding handlers that destructure fields the schema no longer has. - **RLS and access-path coherence** — Sits on top of the dimensions above: queries are issued with the right client (anon vs service role) for the trust level of the caller, and the RLS policies the app depends on are documented somewhere a developer can find without spelunking the Supabase dashboard. The failure mode is a service-role client used in a user-facing route "because it was easier," quietly bypassing the policies the rest of the app assumes are in force. - **Schema-drift response cadence** — Becomes possible once the boundary is typed and explicit: when the database schema changes, there is a known path — generated types regenerated, affected call sites identified, owners notified — and that path runs on a cadence, not in reaction to a production incident. A team without this dimension finds out about drift from a customer; a team with it finds out from a CI failure or a scheduled review. - **Boundary observability for non-engineers** — The capstone — only honest once the surface is consistent enough to measure. A product manager, ops person, or founder can answer "are Supabase queries failing more than usual?" or "which tables does the app actually touch?" without paging an engineer or reading source. The bad version is a steward that knows the call sites perfectly but whose health is locked behind a developer's terminal.
Plugin Release Coherence
## Ownership Zone Version, identity, MCP server name, skill slug, and install-instruction consistency across the marketplace manifest, plugin manifest, SETUP.md, and README for the Steward Claude Code plugin. ## Rubric - **Version synchronization** — Marketplace version, plugin version, and any version references in SETUP/README move together on every release; no stale version strings linger after a bump. - **Identity and naming consistency** — Plugin name, MCP server name, marketplace name, and brand references match across manifest, SETUP, README, and skill files; old names (e.g. contextgraph) do not leak back in after a rename. - **Skill registration parity** — Every shipped skill under plugins/steward/skills/ is reflected with its real slug (e.g. steward:define-steward) in README and SETUP verification steps, and removed skills are removed from docs. - **Install and verify instructions** — Documented install, reload, update, /mcp check, and skill-availability check match what the current marketplace and plugin manifests actually expose; commands users are told to run still work. - **MCP server contract surface** — The mcpServers.steward declaration in plugin.json (name, type, url) matches what skills and docs tell users to expect, and changes to the server name or transport are propagated through every artifact.
Agentsonar Website Experience
## Ownership Zone The complete user-facing web experience for Agentsonar — visual design, interaction patterns, information architecture, performance characteristics, and accessibility. This includes the public website surfaces, landing pages, navigation flows, form interactions, and the overall impression a visitor forms in their first minutes. The steward owns the relationship between what the product does and what a visitor understands it does, the clarity of the value proposition, and whether the site invites engagement or creates friction. ## Rubric - **Value proposition clarity** — A visitor in their first 30 seconds understands what Agentsonar does and why they should care. The core promise is stated plainly, not buried in jargon or abstract language, and the landing experience immediately answers the question a prospect is asking: what problem does this solve for me? Confusion or misdirection at this layer is the floor the rest of the experience stands on. - **Information architecture and navigation** — The site structure reflects how a visitor thinks about the product, not how the engineering team organized the code. A user can find what they need without hunting; related concepts live near each other, and the path from entry point to key actions is obvious. Poor IA makes every other dimension harder — a beautiful page nobody can find is invisible. - **Interaction responsiveness and smoothness** — Forms, buttons, and interactive elements respond immediately and predictably. Lag, unresponsive clicks, or unclear feedback on state changes create doubt about whether the product itself is reliable. Interactions should feel snappy enough that the user never wonders if they were heard. - **Visual consistency and brand coherence** — The site speaks in a single visual voice — consistent typography, color use, spacing, and component design across pages. Inconsistency reads as unfinished or untrustworthy. The visual language should reinforce the positioning: if Agentsonar is modern and precise, the design should feel that way. - **Accessibility and inclusive design** — The site is usable by people with different abilities: keyboard navigation works, color contrast is sufficient, text is readable, and interactive elements are discoverable without a mouse. This is not a nice-to-have; it is the floor for a professional product. Inaccessible sites exclude users and signal carelessness. - **Stakeholder alignment on positioning** — The founding team, product, and marketing agree on what the site is saying about Agentsonar and who it is for. Without this alignment, the site becomes a patchwork of conflicting messages. This dimension is invisible in the code but shows up in whether the site reinforces or undermines the company's strategy.
Navigation & Route Coverage
## Ownership Zone Owns the complete map of routes the site generates and the navigation fabric that connects them — the header and primary nav, category and index pages, in-content cross-links within guides and food entries, footer links, and any programmatic linking between related items. Responsible for knowing every URL the generator emits, whether each one is reachable from at least one navigation path, and whether every internal href resolves to a real generated route. Covers the lifecycle of new pages joining the site (a new food item or guide must be wired into navigation, not just generated) and the lifecycle of removed or renamed pages (inbound links must follow). Also owns the visibility of navigation health to non-engineering contributors — writers and editors adding content should be able to see whether their page is reachable without reading code. ## Rubric - **Route enumeration is ground truth** — There exists a single, trustworthy answer to the question what URLs does this site emit, derived from the generator itself rather than guessed from the file tree or scraped after deploy. This is the floor the rest of the rubric stands on: until route enumeration is reliable, every other dimension is grading work against an unknown denominator, and orphan or broken-link claims are unfalsifiable. - **Link integrity is enforced, not hoped for** — Every internal href the site emits points at a route that actually exists in the enumerated set, and a dangling link fails the build or a checked gate rather than shipping silently to readers. Only meaningful once route enumeration is ground truth; with that in place, link integrity becomes a mechanical check rather than a judgment call. The bad version is a site where 404s are discovered by users. - **Reachability is a property of every page** — Every generated page has at least one inbound navigation path from a known entry point (home, header, category index, or a guide that itself is reachable), and orphans are treated as defects rather than as content that exists but no one can find. Sits on top of route enumeration: you cannot count orphans until you can list pages. The failure mode is a page that exists at a URL but is invisible to anyone who didn't author it. - **Navigation reflects the content model** — Categories, indexes, and cross-links mirror the actual shape of the content (taxonomy, relationships between items and guides, hierarchy depth) rather than drifting into a historical artifact of how the site looked two redesigns ago. Becomes possible once reachability is solid; the question shifts from can users get there to can users get there the way the content suggests they should. The eye-roll version is a category page that lists six items while the generator emits sixty. - **Content authors can self-serve** — Writers and editors adding a new food item or guide can tell, before merging, whether their page will be reachable and whether their internal links resolve, without asking an engineer or waiting for a deploy. This is the stakeholder-facing dimension: excellence here is judged by whether non-engineering contributors are unblocked, not by how clever the tooling is. The bad version is a tribal-knowledge process where only the original author knows which nav file to edit. - **Change hygiene on rename and removal** — When a page is renamed, moved, or retired, inbound links and redirects are updated as part of the same change, and the steward's map reconciles rather than carrying ghost entries. Only meaningful once enumeration and link integrity are in place; without them, rename hygiene degenerates into chasing 404s reported by readers. Excellence looks like no link rot accumulating across releases. - **Navigation health is legible without code** — Counts of orphaned pages, broken internal links, and unreachable routes are visible to a non-engineer in a place they can find on their own, with enough history to tell whether things are improving or regressing. The capstone — only honest once the underlying enumeration, integrity, and reachability dimensions are solid enough that the numbers mean what they say.
Input Sanitization
## Ownership Zone Every user-facing input surface in the codebase — form fields, URL parameters, API request bodies, file uploads, and any data sourced from external systems — and the validation, escaping, and encoding logic that prevents malicious payloads from reaching execution contexts. This includes input validation at the boundary, output encoding for the rendering context (HTML, SQL, shell, JSON), and the relationship between declared input schemas and the actual sanitization applied downstream. The steward owns the gap between what a user can send and what the system safely executes. ## Rubric - **Boundary validation is declarative** — Input validation lives at the entry point and is expressed in a single source of truth — a schema, type definition, or validation rule that every handler consults. Without this, validation logic scatters across handlers and diverges; a field validated in one endpoint is trusted unvalidated in another, and the gap is invisible until exploit time. Validation is impossible to skip by accident. - **Output encoding matches the context** — Data is encoded for the specific context it enters — HTML entities for HTML, SQL escaping for queries, shell quoting for commands, JSON escaping for JSON. A single encoding function applied everywhere is a sign that the team does not distinguish contexts; the same string safe in HTML is dangerous in SQL. Encoding is applied at the point of output, not assumed to have happened upstream. - **Injection vectors are named and tested** — The team knows which inputs can reach which execution contexts and has written tests that verify each vector is blocked. Without this, injection risks hide in the gap between what the team thinks is validated and what actually is. A new feature that adds a path from user input to a database query is a typed change that surfaces the injection test, not an implicit assumption. - **Dangerous operations are explicit** — Code that interprets user input as code — eval, dynamic SQL construction, template injection, unsafe deserialization — is visible and rare. If the codebase uses these patterns, they are justified in comments, isolated to a small surface, and guarded by strict input constraints. A reader should be able to find every place user input flows into code execution in under a minute. - **Validation failures are observable** — When input validation fails, the event is logged with enough context to detect patterns — repeated failures from the same source, systematic probing of a field, or a new attack vector. A validation failure that disappears silently or is only visible in a debug log is a missed signal; the team should be able to answer whether they are under attack without reading code. - **Security assumptions are documented** — The team has written down what they assume about input — which fields are trusted, which are user-controlled, which sanitization is applied where, and what the consequences are if an assumption breaks. Without this, the next engineer assumes the wrong thing and introduces a gap. Documentation is updated when assumptions change, not written once and forgotten.
Knowledge Store Integrity
## Ownership Zone The repository knowledge store — docs/, AGENTS.md, and ARCHITECTURE.md — keeping repository knowledge synchronized with repository state across quality, discoverability, traceability, structure, and coverage. ## Rubric - **Knowledge Freshness** — Generated and SYNC artifacts (db-schema, api-surface, dep-graph, repo-map) are regenerated to match current repository state; stale generated docs are caught. - **Knowledge Discoverability** — Docs live in the correct tier/location and are reachable from entry points (README, AGENTS.md, docs indexes); nothing is orphaned or misfiled. - **Cross-Reference Integrity** — Internal links and file-path references between docs, and from docs to code, resolve to real targets; no broken or dangling references. - **Traceability** — Each generated/analysis artifact names its source, and decision/history docs link to the commits, PRs, or canonical intent that justify them. - **Documentation Drift** — Narrative and canonical docs (ARCHITECTURE.md, docs/canonical/architecture.md) accurately describe current repository reality; divergences are flagged per the SYNC vs ASYNC tier rules. - **Repository Coverage** — Every significant repository asset (system, package, app, route, table, steward) is represented somewhere in the knowledge store; undocumented assets are detected.
Image Asset Health
## Ownership Zone Every image asset the site depends on — food item photos, guide illustrations, and the OG image generation pipeline — together with the references that bind them to content entries, components, and route templates. This covers the full lifecycle: which images exist on disk, which are referenced, which are generated on demand, whether each rendered page resolves to a real file, and whether the social-sharing surface produces valid output for every route. The zone includes the inverse direction too: assets that exist but are no longer referenced, and references that point at paths nothing produces. It does not extend to image content choices or visual design — only to whether the pipeline from authored reference to delivered pixels is intact, lean, and observable. ## Rubric - **Reference resolvability** — Every image path named in content, components, or templates resolves to a real, non-empty file at build time, and an unresolvable reference fails the build loudly rather than shipping a broken `<img>` tag to production. This is the floor the rest of the rubric stands on: until references resolve, sizing, generation, and orphan hygiene are all grading work that may render as a broken icon anyway. - **Generated-image pipeline integrity** — Routes that rely on generated imagery (OG cards, derived thumbnails, templated illustrations) produce valid, correctly-dimensioned output for every input the route can receive, not just the handful exercised during development. The bad version of this dimension is a generator that silently emits a 0-byte file or a fallback placeholder for half the catalogue and nobody notices until a link is shared. - **Asset library hygiene** — The set of files on disk stays close to the set of files actually referenced; orphans are pruned on a known cadence rather than accumulating as repo weight, and additions are deliberate rather than drive-by. Only meaningful once reference resolvability is in place — otherwise pruning is dangerous because you cannot trust the reference graph you are pruning against. - **Delivery weight discipline** — Images are sized, compressed, and formatted for the surface that actually consumes them, with the source-of-truth original kept separate from the web-delivery variant. A rubric-failing setup ships 4MB hero JPEGs to mobile, has no convention for which dimensions and formats are canonical, and treats every new image as a one-off decision. - **Authoring ergonomics** — Sits on top of the dimensions above: a content author can add a new food item or guide without learning the asset pipeline, knows exactly where to drop the image and how to reference it, and gets immediate feedback when they get it wrong. When this fails, you see the same handful of engineers re-explaining the conventions in PR review and authors avoiding image-heavy entries entirely. - **Stakeholder-facing visibility** — The capstone — only becomes possible once the surface is consistent enough to measure honestly. A non-engineer (content owner, founder, marketer checking a social share) can answer questions like how many pages have working previews, which entries are missing imagery, and whether last week's content drop rendered cleanly, without asking an engineer to grep the repo.
GitHub GraphQL Boundary
## Ownership Zone Every GitHub GraphQL query the application and MCP server issue, the TypeScript types those queries map onto, and the proxy layer that mediates between the GitHub API and the rest of the app. Covers query authoring and naming, schema validation against the live GitHub schema, response type fidelity, the handling of GraphQL-level and HTTP-level error paths (auth, rate limits, partial-data responses, network failures), and the visibility of API health to anyone debugging a broken UI state. The zone ends where domain logic begins — once a typed, validated response leaves the boundary, downstream concerns belong to other stewards. ## Rubric - **Schema-anchored queries** — Every query is checked against the real GitHub GraphQL schema as part of the normal development loop, not as a manual ritual. This is the floor the rest of the rubric stands on: until queries are anchored to the schema, type fidelity and error handling are grading work that may already be wrong. A renamed or removed field fails at build or CI time, not at runtime in front of a user, and the validation surface is impossible to bypass by accident. - **Type fidelity end-to-end** — Only meaningful once schema anchoring is in place: response types reflect what the schema actually returns, including nullability, union variants, and connection shapes. Raw API payloads do not enter the app via unchecked casts that paper over drift; when the schema changes, the type system surfaces every consumer rather than letting a silently-wrong shape propagate into rendering code. - **Explicit failure surface** — Each distinct failure mode at the GitHub boundary — network error, non-2xx HTTP, GraphQL errors array, partial data, 401 auth, 403/429 rate limit, timeout — has a named, structured handling path. Bad practice here is the catch-all that turns six different failures into one opaque message; good practice is that a caller can tell auth failure from rate limiting from a malformed query without reading the proxy source. - **Query hygiene and discoverability** — Queries are named, colocated with their types, and easy to enumerate. A practitioner asking what does this app ask GitHub for? can answer it from a single inventory rather than grepping. Anonymous one-off queries scattered across handlers are the failure mode this dimension calls out; a clean zone makes it obvious which queries exist, who calls them, and what schema surface they depend on. - **Boundary discipline** — Builds on type fidelity: the proxy is the only path between the app and GitHub, and it is the only place that knows about GitHub-specific concerns (auth headers, rate-limit semantics, GraphQL error shape). Domain code does not reach around the boundary, and the boundary does not leak GitHub-shaped error objects or untyped blobs into domain code. Violations show up as duplicated request logic or domain modules importing GitHub SDK types directly. - **Operator-visible API health** — The capstone, only possible once the failure surface is explicit and queries are enumerable: when the dashboard is empty or stale, a non-engineer can tell whether GitHub returned an error, rate-limited the app, returned partial data, or simply had nothing to show. Per-query failure rates, recent rate-limit hits, and auth status are visible without reading code, so debugging a broken UI state does not start with paging an engineer to add logging.
Env Config Safety
## Ownership Zone Owns the application's environment-variable configuration surface end to end: which variables are required, how they are validated, where they are read, how they are documented for new contributors, and how secrets are separated from public/feature-flag values. Covers the canonical validation module, the public env example file, and every consumer that reads configuration anywhere in the codebase. Responsible for the contract between the running application and its deployment environment — making sure missing or malformed configuration fails loudly at startup rather than silently degrading features in production. Also responsible for keeping the developer-onboarding and operator-handoff story honest, so that someone setting up a new environment knows exactly what to provide and what each value is for. ## Rubric - **Single point of access** — All configuration is read through one canonical, validated module; raw environment lookups scattered across the code are treated as bugs, not style preferences. This is the floor the rest of the rubric stands on: until every consumer goes through one path, validation, documentation, and secret hygiene are all grading a surface they don't actually control. The bad version is a codebase where each feature reaches into the environment on its own and "is this set?" has a different answer in every file. - **Fail-fast on startup** — Only meaningful once a single point of access exists: with one entry point, missing or malformed values can be caught before the app serves a single request, with an error message that names the variable and what it is for. The failure mode this rules out is the silent one — a feature that appears to work in development and quietly no-ops or 500s in production because a key was never set. Required vs. optional is an explicit decision per variable, not an accident of which code path runs first. - **Typed and narrowed values** — Sits on top of fail-fast validation: once a value is required, it is also coerced to its real shape (URL, boolean, enum, integer) and exposed to consumers as that type. Booleans aren't compared as strings, numeric limits aren't parsed at every call site, and an enum-shaped flag with an unexpected value is rejected at the boundary rather than silently falling through to a default branch downstream. - **Secret vs. public discipline** — Public values (anon keys, feature flags, client-side URLs) and true secrets (server-side API keys, signing keys) are separated by naming convention and by where they are allowed to be read. A practitioner can tell at a glance which bucket a variable is in, and the build cannot accidentally ship a server secret into a client bundle. The bad version is a flat list where everything looks the same and the only thing standing between a secret and the browser is somebody remembering. - **Onboarding and operator clarity** — Visible from outside the codebase, not from inside it: a new developer or a deploy operator can stand up a working environment from the documented example without reading source code, and every required variable has a placeholder, a one-line description, and a pointer to where to obtain it. Drift between the validation module and the example file is the canonical failure mode here — silently undocumented requirements that break new setups weeks after the variable was added. - **Change visibility for stakeholders** — The capstone — only becomes possible once the surface is unified, validated, and documented. When configuration requirements change (a new integration, a renamed key, a flag flipped on in production), the change is legible to the people who have to act on it: ops knows what to set, product knows which flag controls which behavior, and a non-engineer can answer "is this feature on in production?" without grepping the repo. The bad version is configuration changes that land as silent commits and surface as incidents.
CSP Policy Integrity
## Ownership Zone Every Content Security Policy directive served by the Next.js frontend — script-src, frame-src, connect-src, style-src, img-src, font-src, and the rest — along with each allowed origin, hash, or nonce, the feature or integration that justifies it, and the mechanism (middleware, headers config, meta tag) that delivers the policy to the browser. The zone covers how the policy is composed, how it is rolled out (report-only vs enforcing), how violations are observed, and how the policy stays aligned with the actual set of third parties the product depends on. It also covers the human-facing side: whether product, security, and integration owners can answer what is allowed, why, and what would break if it were removed. It does not own the third-party scripts themselves or the application code that uses them — only the trust boundary that decides what the browser is permitted to load and execute. ## Rubric - **Directive completeness and precision** — The floor the rest of the rubric stands on. Every fetch directive a modern app needs is explicitly set rather than inherited from default-src by accident, and each one lists the narrowest set of sources that actually make the feature work. The bad version is a single sprawling default-src with wildcards and a script-src that grew by accretion; the good version is a policy where you can point at any entry and name what would break without it. - **Provenance of every allowance** — Every origin, hash, and nonce in the policy traces back to a specific feature, vendor, or integration, recorded somewhere a human can read. Without this, the directive surface becomes a graveyard of entries no one dares delete; with it, removing a vendor is a normal cleanup task instead of a multi-hour archaeology dig. This is the dimension the directive inventory and justification-coverage metric exist to make reportable. - **Nonce and hash discipline over unsafe-inline** — Inline scripts and styles are admitted via per-request nonces or content hashes, not via blanket unsafe-inline or unsafe-eval escape hatches. The contrast: a policy that looks strict on paper but quietly carries unsafe-inline because one analytics snippet needed it three years ago is failing this dimension, even if every other directive is tight. - **Violation observability** — Only meaningful once the policy is precise enough to trust: a noisy policy produces noisy reports no one reads. CSP violation reports are collected, deduplicated, and routed somewhere a human actually looks, with enough context (directive, blocked URI, source file, user agent) to tell a real attack or regression apart from a browser extension. Silent enforcement with no report sink is the failure mode this calls out. - **Safe rollout and change discipline** — Becomes possible once observability is in place. New directives or tightened ones go through report-only before enforcement, changes are reviewed against the inventory rather than appended blindly, and there is a known path to ship a fix when a third party rotates a domain. The bad version is editing the policy directly in production and finding out from customer reports. - **Stakeholder legibility** — The capstone, and the dimension that fails most quietly. A non-engineer — a security reviewer, a vendor-onboarding PM, a compliance auditor — can answer what third parties the site trusts, why each is trusted, and what changed last quarter, without reading middleware source. If that question requires grepping the repo, the policy is technically correct but organizationally opaque.
STT Provider Boundary
## Ownership Zone Owns the contract surface between the transcription router and every speech-to-text provider implementation it dispatches to — currently Google Cloud Speech, OpenAI Whisper, GPT-4o Audio, Qwen3-ASR-Flash, and ElevenLabs Scribe, plus any future addition. Responsibilities span the request/response adapter for each provider, audio format and language code normalization, error and timeout semantics, model and version pinning, feature-flag and routing rules that select a provider, and the fallback behavior when a provider degrades or deprecates a model. Also owns the observability of provider behavior — latency, error rates, transcription quality signals — at a granularity that lets the team reason about which provider to trust for which traffic. Does not own the upstream audio capture pipeline, downstream consumers of transcripts, or the router's business-logic decisions beyond the provider-selection layer. ## Rubric - **Adapter contract uniformity** — Every provider sits behind the same input/output shape, the same error taxonomy, the same timeout and cancellation semantics, and the same handling of audio format, sample rate, and language code. This is the floor the rest of the rubric stands on: until the contract is uniform, routing decisions, quality comparisons, and fallback logic are all comparing apples to oracles. The bad version is each provider leaking its SDK's quirks — one returns segments, another returns a flat string, a third throws a vendor-specific error type — and callers branching on provider identity. - **Version and model pinning discipline** — Each provider call names an explicit model and API version rather than riding the vendor default, and the pinned version is tracked somewhere a human can read without grepping. Only meaningful once the adapter contract is uniform, because otherwise version drift hides inside per-provider quirks. The failure mode this calls out: a vendor silently rotates the default model, transcription characteristics change overnight, and nobody can say which deploy introduced the shift. - **Deprecation and change awareness** — Someone is responsible for knowing when each provider is deprecating a model, changing pricing, changing rate limits, or shipping a breaking API change, and that knowledge has a place to live other than one engineer's inbox. This dimension is not visible from the codebase alone — it lives in vendor changelogs, status pages, and account-rep emails. The bad version is finding out a model was sunset because production started 404ing. - **Routing and fallback intent is legible** — The rules that send a given request to a given provider — feature flags, traffic splits, language-based routing, cost tiers, A/B tests — are explicit, named, and explain *why* they exist, and fallback chains have defined trigger conditions rather than ad-hoc try/except. Sits on top of the uniform adapter contract: you can only route confidently across providers whose contracts you trust to behave the same. The failure mode is a tangle of conditionals where nobody can answer which provider a given customer's audio is hitting today, or what happens when it fails. - **Per-provider quality and reliability is measured** — Latency, error rate, timeout rate, and a transcription-quality signal (WER on a held-out set, human spot-checks, downstream rejection rate, or similar) are tracked per provider and per model version, at a granularity that lets the team notice regressions within days, not quarters. Becomes possible once pinning and uniform contracts are in place, because otherwise you cannot attribute a quality dip to a specific provider-and-version pair. The bad version is a vague sense that one provider is better without numbers to back it. - **Stakeholder-answerable provider posture** — A non-engineer — product, ops, support, finance — can get answers to questions like which provider is handling which traffic right now, what we pay per minute by provider, when we last switched a default, and what we'd lose if a given vendor went down tomorrow. This is the capstone: it only becomes honestly answerable once routing is legible and per-provider metrics exist. The failure mode is every such question becoming a half-day engineering investigation, and provider decisions getting made on vibes because the data is locked inside code.
OAuth Session Integrity
## Ownership Zone Owns the GitHub OAuth flow end-to-end — login initiation, callback handling, session establishment, and logout — and the full lifecycle of every httpOnly cookie token stored on behalf of the user (GitHub, CircleCI, Anthropic, and any future provider tokens that ride the same cookie surface). Responsible for how token expiry, revocation, corruption, and CSRF-class attacks are detected and surfaced, so that a stale or hostile credential fails cleanly at the auth boundary rather than cascading into downstream API routes. Guards the contract between edge-runtime auth routes and server-side proxying routes: which routes are allowed to assume a valid session, how that assumption is validated, and what happens when it does not hold. Also owns the operator-facing visibility into auth health — who is logged in, why logins fail, and which routes are protected — so that session-layer incidents are diagnosable without grepping the codebase. ## Rubric - **Cookie hygiene as the foundation** — Every token cookie is httpOnly, scoped, signed/encrypted as appropriate, and has a single owner that knows its set, read, and clear paths. This is the floor the rest of the rubric stands on: until cookie semantics are unambiguous, every other dimension is reasoning about state that other code paths can quietly mutate. The bad version is tokens written in one place and forgotten in another, where logout leaves residue and nobody can say which routes touch which cookie. - **CSRF and callback integrity** — The OAuth callback verifies that the response it is processing is the one this browser initiated: state parameter generated, stored, and checked; redirect targets constrained to a known set; replayed or cross-origin callbacks rejected loudly. Builds directly on cookie hygiene, since state itself rides the cookie surface. The failure mode this dimension exists to prevent is a callback that happily mints a session for whoever shows up with a valid-looking code. - **Failure-mode behavior under bad credentials** — Expired, revoked, malformed, and impersonated tokens produce a single well-defined outcome at the auth boundary: the session is invalidated, the user is sent through re-auth, and downstream handlers never see a half-valid credential. Only meaningful once cookie hygiene and callback integrity are in place; otherwise the system cannot tell a bad token from a missing one. The bad version is a 500 from a deep API call because a GitHub token silently expired three days ago. - **Route auth contract clarity** — Every server route falls into a known category — public, session-required, session-optional, internal — and the category is enforced in one obvious place rather than re-derived per handler. This sits on top of failure-mode behavior: a route only benefits from a clean failure path if it actually invokes the validator. The bad version is the auth check copy-pasted into some handlers, forgotten in others, and impossible to audit without reading every file. - **Stakeholder visibility into auth health** — Non-engineering stakeholders (support, ops, the person triaging a Monday-morning incident) can answer questions like did logins start failing last Thursday, is this user actually authenticated, and which provider token is stale — without paging an engineer to read logs. This dimension is not visible from the codebase alone; it is judged by whether the people downstream of the auth boundary can self-serve. Becomes possible only once the route contract and failure modes are consistent enough to measure honestly. - **Cross-provider token coherence** — When more than one provider's token rides the same session, their lifecycles are reasoned about together: a revoked GitHub token does not leave a live CircleCI cookie behind, and adding a new provider follows a known pattern rather than inventing a fourth cookie shape. This is partly an organizational property — it depends on whoever adds the next provider knowing the pattern exists — and partly a code property. The bad version is each provider integration looking like it was written by someone who had never seen the others. - **Auditability of session decisions** — Every session-affecting decision (issued, refreshed, rejected, cleared) leaves a trace that an operator can reconstruct after the fact, with enough context to distinguish user error from attack from bug. The capstone dimension: only meaningful once the decisions themselves are consistent across cookies, callbacks, failure modes, and routes. The bad version is a user reporting they were logged out and nobody, including the steward, being able to say why.
Layer Boundary Integrity
## Ownership Zone Monorepo layering and import-direction rules: the apps→systems→packages dependency flow, packages staying generic, systems staying infrastructure-free, and no cross-system imports. ## Rubric - **Import direction** — Dependencies flow apps→systems→packages only. packages never import systems or apps; systems never import apps. - **Cross-system isolation** — No system imports another system. Shared needs are extracted into a package, not reached across systems/. - **Package purity** — packages/ stay reusable and generic — no business logic or system-specific domain concepts leak in. - **System purity** — systems/ hold business logic only — no infrastructure wiring (db clients, provider SDK setup, deploy concerns) belongs there. - **Placement correctness** — New code lands in the layer the AGENTS.md 'Where Things Go' table dictates: integrations, prompts, workflows, and services in their designated paths.
WCAG 2.2 AA Compliance
## Ownership Zone Every user-facing surface in the workspace — pages, components, interactive widgets, forms, navigation, media, and dynamic content — held to WCAG 2.2 AA. The zone covers semantic structure and landmarks, keyboard operability and focus management, screen reader exposure (names, roles, states), color and non-color contrast, motion and timing, error identification and recovery, and the assistive-technology behavior of any custom or third-party UI. It also covers the supporting practice around compliance: how new work is gated before merge, how known gaps are tracked and prioritized, and how non-engineering stakeholders (product, legal, support) can answer questions about the workspace's accessibility posture without reading code. ## Rubric - **Semantic foundation** — Pages are built from real landmarks, headings in a sensible order, native form controls with associated labels, and lists that are actually lists. This is the floor the rest of the rubric stands on: contrast tweaks and ARIA polish on top of div soup buy nothing, because assistive tech has nothing to anchor to. The bad version is a tree of generic divs with role attributes sprinkled on top to simulate structure that should have been there from the start. - **Keyboard and focus discipline** — Every interactive element is reachable and operable by keyboard alone, focus order matches visual order, focus is visible at all times, and focus is managed deliberately when content moves (dialogs, route changes, disclosure). Only meaningful once the semantic foundation is real, since focus follows the document model. The failure mode this calls out is the invisible focus ring, the tab that escapes into a modal's backdrop, and the route change that strands a screen reader on stale content. - **Assistive-technology truthfulness** — What a screen reader announces matches what a sighted user perceives: accessible names exist and are accurate, state changes (expanded, selected, busy, invalid) are exposed, dynamic updates reach users via live regions or focus moves, and ARIA is used to fill gaps in native semantics rather than to paper over the wrong element. Sits on top of the semantic foundation; without it, ARIA becomes decoration. The bad version is a button labeled icon, a toggle whose pressed state never changes, and a toast no one hears. - **Perceivable presentation** — Text and meaningful non-text content meet contrast minimums, information is never conveyed by color alone, content reflows without loss at 400% zoom and 320 CSS pixels wide, and motion respects user preferences. This dimension is largely assessable from rendered output, and is where automated tooling earns its keep — but only catches the floor, not the ceiling. - **Pre-merge accessibility gate** — Not visible from a code snapshot alone; this is a property of how the team works. New and changed surfaces are checked against AA before they ship, automated checks block on regressions rather than warn, and authors know which manual checks (keyboard pass, screen reader smoke test) are expected for the kind of change they made. The contrast is a team where accessibility is a quarterly cleanup pass versus one where a regression cannot reach main. - **Known-gap hygiene** — Also a practice property, not a code property. Every known violation has an owner, a severity tied to user impact (not just rule id), and a remediation state that ages visibly; nothing rots silently in a backlog labeled accessibility. The failure mode is a five-year-old issue list where no one can tell which items are still real, which are duplicates, and which already shipped fixes. - **Stakeholder legibility** — The capstone — only possible once the gate and the gap list are honest. A product manager, support lead, or legal reviewer can answer questions like what is our current AA coverage, which surfaces are known-noncompliant, and what is the remediation timeline without paging an engineer or reading a PR. The bad version is an org that believes it is compliant because no one has asked recently.
PostHog Event Integrity
## Ownership Zone Every PostHog integration point across the platform — SDK initialisation and provider wiring on the web surface, every capture, identify, and group call site, autocapture and session replay configuration, feature-flag usage, and the relationship between events emitted in code and what growth, product, and founders consume downstream in PostHog dashboards, funnels, and retention reports. The zone extends to instrumentation gaps in adjacent surfaces (such as CLI or server-side tooling) where product-critical flows happen outside the browser and represent blind spots in the user journey. It also covers the event taxonomy itself — the naming conventions, property shapes, and type-safety guarantees that determine whether data arriving in PostHog is queryable signal or accumulating noise. The steward owns the contract between the code that emits events and the humans who try to answer questions from them. ## Rubric - **Event taxonomy discipline** — Every event name follows a single documented convention and the convention is enforced at the call site, not by downstream cleanup or rename rules in the warehouse. The failure this guards against is the same logical moment shipped under three slightly different string literals from three components, producing three lines in PostHog where there should be one. This is the floor the rest of the rubric stands on: no other dimension is meaningful if the taxonomy is incoherent, because every funnel and dashboard sits on top of names. - **Type-safe emit boundary** — Tracking calls reference a shared, typed catalogue of event names and property shapes rather than passing ad-hoc string literals and untyped property bags. Without this a typo or a renamed property silently breaks a funnel and nobody notices until a quarterly review. Builds directly on taxonomy discipline — the catalogue is the taxonomy made enforceable, and the compiler becomes the first reviewer of every analytics change. - **Identify and group hygiene** — Identify fires at session-start and auth-state-change with a stable user ID, and group associates users with their org or tenant where applicable, before any meaningful event is captured in that session. Without this events land as anonymous noise and org-level analytics are fiction; funnels built on unidentified events silently undercount conversion. Sits alongside taxonomy discipline as a foundational concern — a clean name on an anonymous event is still a half-measurement. - **Coverage of meaningful moments** — Signup, activation, the handful of key product actions, upgrade, error states, and churn-risk moments all fire an event, and coverage is judged by whether a product or growth stakeholder can answer what happened in the user journey from PostHog alone without asking an engineer to query the database. The bad version is a dashboard full of pageviews and autocapture clicks with no domain verbs, where every real question requires a SQL detour. Only meaningful once the taxonomy is stable enough that adding a new event doesn't create ambiguity with existing ones. - **SDK configuration consistency** — PostHog is initialised once per surface with explicit, reviewed settings for autocapture, session replay, cross-subdomain tracking, PII redaction, and feature-flag bootstrap, and those settings agree across client and server and across environments. Configuration disagreements produce data that looks correct in staging and breaks in production, or worse, leaks PII that a privacy review assumed was redacted. Becomes auditable once identify hygiene is in place, because misconfigured init is invisible when users aren't identified. - **Dashboard-to-code alignment** — Every event referenced in a dashboard, funnel, or insight corresponds to a live capture call, and every capture call is consumed by at least one downstream artefact a stakeholder actually looks at. Orphaned dashboard references produce silent zeros that erode trust in the analytics surface; orphaned capture calls waste payload and clutter the event stream so newcomers can't tell signal from legacy. This is a capstone dimension — only meaningful once the taxonomy, type safety, and coverage dimensions are healthy enough that the catalogue of events is stable and enumerable on both sides. - **Analytics health legibility** — A non-engineer can answer are events still flowing and did we lose tracking last week without paging someone, because ingestion volume, event-type cardinality, and identify-rate are monitored or at least reviewed on a known cadence. The bad version is discovering a three-week instrumentation outage when a board deck is being prepared. Sits on top of every other dimension: you can only monitor what you've named, typed, identified, and wired to something a stakeholder reads.
Accessibility Baseline
## Ownership Zone Every interactive surface on the site that a non-mouse, non-sighted, or assistive-technology user has to navigate — focus order and focus visibility, keyboard reachability of all controls, semantic roles and ARIA attributes, accessible names and descriptions, color contrast and motion preferences, and the live behavior of media controls (audio play/pause, captions, transcripts) and custom widgets like the phone mockup. Covers the full path from page structure (landmarks, headings, skip links) through component-level behavior (buttons, links, menus, dialogs) to dynamic states (loading, error, expanded/collapsed). Includes the relationship between the rendered DOM and what assistive tech actually announces, and the visibility of accessibility health to non-engineering stakeholders who need to know whether the site meets the standard the org has committed to. ## Rubric - **Semantic foundation** — The page is built from real HTML elements with correct roles and a sane heading and landmark structure; custom widgets only reach for ARIA when no native element fits, and never to paper over the wrong element underneath. This is the floor the rest of the rubric stands on: every downstream dimension assumes assistive tech is being handed a structure that means what it looks like, and a div-soup page with bolted-on roles makes keyboard and screen-reader excellence impossible to achieve no matter how much polish goes on top. - **Keyboard parity** — Anything a mouse user can do, a keyboard user can do in a predictable order, with a focus indicator that is always visible and never trapped where it shouldn't be. The bad version is the one where Tab skips a custom control entirely, or lands on it but Enter and Space do nothing, or opens a modal that the user cannot escape — keyboard parity is judged by walking the page with the mouse unplugged, not by reading the code. - **Accessible naming and state** — Every interactive control has a name a screen reader will actually speak, and its state (pressed, expanded, selected, busy, disabled) is exposed programmatically and stays in sync as the UI changes. Only meaningful once the semantic foundation is in place; until then, a correct aria-label is being attached to the wrong kind of element. The failure mode is the button announced as button, button, button across a whole toolbar, or the toggle whose visual state and aria-pressed have drifted apart. - **Media and motion respect** — Audio and video controls are operable without a mouse, captions and transcripts exist for spoken content, autoplay does not hijack focus or sound, and animations honor prefers-reduced-motion. Sits on top of keyboard parity and accessible naming: a media player that fails those is not made accessible by adding a transcript. The bad version is the one where the only way to pause the looping background audio is to find a control no screen reader announced. - **Lived testing with real assistive tech** — Excellence is judged by how the site behaves under an actual screen reader and keyboard, on the platforms users are on, not by automated scan scores alone. This dimension is largely invisible from the codebase: it lives in whether someone on the team has run VoiceOver, NVDA, or TalkBack on the real flows recently, and whether known assistive-tech quirks are tracked rather than rediscovered. Automated checks catch missing alt text; they do not catch a focus order that makes no narrative sense. - **Standard and stakeholder legibility** — The team has named the conformance target it is holding itself to (e.g. a specific WCAG level) and a non-engineering stakeholder — product, legal, a partner asking about compliance — can find out where the site stands against that target without reading code or filing a ticket. Becomes possible once the dimensions above are real enough to measure honestly; before then, any status report is fiction. The failure mode is the org that claims a conformance level in marketing copy while no one internally can point to what is and isn't covered.
Subscription & Usage Guardrails
## Ownership Zone Subscription lifecycle state machines, usage metering, free-tier enforcement, Stripe billing integration, and API access gating. ## Rubric - **State machine integrity** — Subscription status transitions (free_tier_active → grace_period → exceeded; active → past_due → unpaid → canceled) match the intended lifecycle, leave no orphan states, and trigger the correct side effects (content lock/unlock, emails, analytics). - **Usage metering accuracy** — CloudFront log parsing, bandwidth aggregation, storage tracking, and Stripe metered billing event submission faithfully reflect real consumption without double-counting or data loss. - **Free tier enforcement** — Limits (video count, file size, bandwidth), grace period timing, alert email thresholds, and content locking/unlocking apply consistently and at the correct thresholds defined in subscription constants. - **Access gating consistency** — SubscriptionGuard, plan checks, skipSubscriptionGuard decorators, and demo user exceptions enforce the correct access boundary for every API route without gaps or false blocks. - **Stripe webhook fidelity** — Incoming Stripe subscription and checkout events map to the correct internal state changes without gaps, silent failures, or status/plan mismatches between Stripe and the subscriptions table.
Code Hygiene
## Ownership Zone I own the ongoing campaign against accumulated cruft across the phin repositories — unused functions, unreferenced variables, dead imports, unreachable branches, commented-out code, orphaned files, and the lint and style violations that obscure what is actually live. My territory spans detection (knowing what is dead and proving it), removal (safely excising it without breaking implicit consumers), and prevention (keeping new accumulation from outpacing cleanup). I also own the legibility of the cleanup queue itself: what is pending, what was removed, and whether the trend is improving or degrading. I do not own architectural refactors, performance work, or test quality — only the discipline of keeping the surface area honest about what the code actually uses. ## Rubric - **Deadness is provable, not guessed** — The floor the rest of the rubric stands on. Before anything is removed, there is a defensible answer to how we know this is unused: static analysis, reference search, runtime telemetry, or explicit deprecation window. A bad practice removes things that look unused and learns from production breakage; a good one distinguishes genuinely dead code from code reached through reflection, dynamic dispatch, public API, or external callers, and treats the second category with appropriate caution. - **Lint and style speak with one voice** — Only meaningful once deadness is provable, because lint is the cheapest signal that something is unreferenced. The configured rules are consistent across the repo surface, violations either fail CI or are tracked with an expiry, and disables are justified inline rather than scattered as silent escape hatches. The failure mode this guards against: a lint config that warns about everything, blocks nothing, and trains everyone to ignore the output. - **Removal is reversible and reviewable** — Sits on top of the two dimensions above: once you can prove deadness and trust the lint signal, removals become small, isolated commits rather than sweeping purges. Each cleanup is scoped tightly enough that a reviewer can verify the claim of unused-ness, and the commit history makes it cheap to resurrect something if a hidden caller surfaces. Bad practice batches a thousand deletions into one untestable PR; good practice leaves a trail you can bisect. - **Accumulation is bounded, not just cleaned** — Becomes possible once removal is routine: the question shifts from how do we catch up to whether new cruft is entering faster than it leaves. There are guardrails — pre-commit checks, CI gates, or codeowner review — that catch dead imports and unused exports at the boundary, so cleanup work compounds instead of resetting every quarter. - **The backlog is legible to non-engineers** — A stakeholder-facing dimension. A product manager, tech lead, or founder can answer is hygiene improving or degrading without reading code or paging an engineer: the queue of pending cleanups has a visible depth, a trend, and an owner. The failure mode is hygiene as folklore — everyone agrees the codebase is messy, no one can point to a number, and the work is invisible until someone complains. - **Cleanup is decoupled from feature work** — An organizational property, not a code property: the team has an explicit cadence or budget for hygiene work, and it is not held hostage to whichever feature happens to touch the same file. Bad teams clean up only when they trip over something; good teams treat hygiene as scheduled maintenance with a known owner, so the rubric above can actually be enforced rather than aspired to.
Phlex Component Contracts
## Ownership Zone Every Phlex component class in the application — the Components::Base and Views::Base subclass hierarchy, their rendered HTML output, their behavior under nil and missing data, and their adherence to the shared RubyUI/Phlex conventions that hold the component library together. The zone covers the rendering contract each component exposes (what props it accepts, what HTML it produces, what it does when inputs are absent or malformed), the unit-level rendering tests that pin those contracts down, and the consistency of patterns across the hierarchy so that designers, product, and engineers can predict what a component will do without reading its source. It does not own page-level integration flows, controller logic, or styling decisions made outside the component layer — only the component-as-contract. ## Rubric - **Render-without-crashing floor** — Every component can be instantiated and rendered with its declared inputs without raising. This is the floor the rest of the rubric stands on: until rendering itself is reliable, nil-safety, output quality, and consistency are grading something that may not even reach the browser. A component that crashes on a missing optional prop, an empty collection, or a nil association is failing this dimension regardless of how clean its API looks. - **Nil and edge-input behavior is explicit** — Builds directly on the rendering floor: each component has a defined, tested answer for nil values, empty strings, empty collections, and missing optional associations — render nothing, render a placeholder, or fail loudly — and that answer is the same one a caller would guess from the component's name and props. The bad version silently swallows nils in some components and NoMethodErrors in others, so callers learn through production incidents which components tolerate which inputs. - **Output is valid, semantic HTML** — Components emit well-formed markup with correct nesting, appropriate semantic elements, and accessible attributes — not div soup that happens to look right in one browser. Only meaningful once rendering and nil-handling are stable; otherwise output validity is being judged on a sample that excludes the cases that actually break. - **Pattern consistency across the hierarchy** — Components that do similar jobs look similar: prop names, slot conventions, naming of variants, and the line between Components and Views are followed the same way across the library. The bad version is three different ways to pass children, two spellings of the same prop, and a Views class doing what a Component should do — every new contributor has to re-learn the library from scratch. - **Contracts are legible to non-engineers** — A designer, a PM, or a new engineer can answer what a component does, what inputs it takes, and what it looks like in its main states without reading its Ruby source. This dimension is invisible from the code alone: it lives in component catalogs, preview pages, naming, and the shared vocabulary the team actually uses in design reviews. Without it, the component library is a private dialect and every cross-functional conversation routes through an engineer. - **Change confidence** — Sits on top of every dimension above: a team can only refactor a base class, rename a prop, or upgrade the underlying Phlex/RubyUI version with confidence when rendering, edge inputs, output validity, and conventions are pinned down by tests. The bad version is a component layer everyone is afraid to touch, where improvements stall because no one can tell what a change will break.
Next.js Upgrade Resilience
## Ownership Zone Owns the resilience of the Next.js and React framework surface across upgrades — the pinned versions of next, react, react-dom, and eslint-config-next; the App Router conventions (segment filenames, route groups, layouts, server vs client component boundaries); the build and lint gates that catch framework-level regressions before deploy; and the backlog of known framework risks that need to be worked down. Also owns the relationship between the codebase and Vercel's deployment expectations, so that what builds locally builds on Vercel and what renders in dev renders in production. The zone covers everything that determines whether a framework or runtime bump is a routine chore or a silent outage. ## Rubric - **Version pinning discipline** — Framework-critical packages (next, react, react-dom, the matching eslint config) are pinned to exact versions, not caret or tilde ranges. This is the floor the rest of the rubric stands on: until the versions installed in CI, on a fresh clone, and on Vercel are provably identical, every other dimension is grading a moving target. The bad version of this dimension is a lockfile that drifts between environments and an upgrade that lands by accident on a Tuesday afternoon. - **Pre-deploy build gating** — A production build (and the framework's own type and lint passes) runs on every push and PR and blocks merge on failure. Only meaningful once versions are pinned — otherwise the gate is checking a different build than the one that ships. The failure mode this dimension calls out is discovering a broken build from the deploy log instead of from CI; excellence means the first place a framework regression surfaces is a red check, not a white screen. - **Routing and component-boundary correctness** — App Router conventions are followed strictly: canonical segment filenames, deliberate placement of server vs client components, no accidental client-bundling of server-only code. Sits on top of the build gate, because lint and type rules are the mechanism that makes these conventions enforceable rather than tribal. The bad version is a file named almost-but-not-quite right that silently fails to route, or a use client added to silence an error without understanding what crossed the boundary. - **Upgrade rehearsal and risk backlog** — The team treats framework upgrades as a rehearsed activity, not an emergency: known framework risks, deprecations, and migration steps live in a tracked backlog with priorities, and majors are taken on a deliberate cadence with a known rollback. Becomes possible once the prior dimensions exist, because rehearsal is only credible when versions are pinned and CI catches regressions. Excellence here is a reader being able to answer what's the next framework risk we owe time to without asking a person. - **Deployment-target fidelity** — The local and CI build environment matches what Vercel (or the equivalent target) actually runs: Node version, build command, environment variables, edge vs node runtime choices, and image/route configuration. The bad version is the works on my machine class of incident where the production runtime quietly disagrees with the dev runtime about a server component, a route handler, or a cached fetch. - **Stakeholder-legible upgrade posture** — A non-engineer stakeholder (PM, founder, ops) can answer are we current, are we exposed, and what would an upgrade cost without paging an engineer to read package.json. This is the capstone — only honest once pinning, gating, conventions, and the risk backlog are in place, because otherwise the answer is a guess dressed up as a status. Excellence is a posture that can be reported on, not folklore held in one engineer's head.
Dead Code
## Ownership Zone Unreferenced exports, orphan modules, unreachable branches, and rename/deletion residue across app/, lib/, components/, and scripts/. The steward keeps the surface area honest so reviewers and stewards aren't reasoning about code that no longer runs. ## Rubric - **Unreferenced exports** — Exported functions, types, constants, and React components with zero in-repo consumers and no legitimate external-consumer reason to remain exported. Stale re-exports from internal index files are included. - **Orphan modules** — Source files under app/, lib/, components/ that are not imported anywhere and are not framework entry points (route.ts, page.tsx, layout.tsx, middleware.ts, instrumentation.ts). Test fixtures and __mocks__ are out of scope. - **Unreachable branches** — Code after unconditional early returns/throws, always-true/always-false conditionals, env-gated paths whose env can no longer be set, and switch arms for enum members that were removed. - **Stale one-shot scripts** — scripts/backfill-*, scripts/bootstrap-*, scripts/replay-*, and similar single-purpose tools that have already completed their purpose. Keep ones with a documented reason to retain (e.g. periodically rerun); flag the rest for deletion. - **Removed-symbol residue** — Leftovers from renames or deletions: re-exports of vanished symbols, dead MCP tool registrations, schema fields with no writers/readers, dead public-route patterns, doc/CLAUDE.md references to APIs that no longer exist.
Backlog Delivery Flow
## Ownership Zone Friction and legibility of moving a backlog item from queued to merged in production, across the MCP server, the CLI, and the plugin: the lifecycle state machine and its truthful linkage to PRs and branches, the MCP and notification surface that tells agents and humans what to do next, and the trust signals that let a workspace widen backlog autonomy over time. Excludes PR-review verdict quality (owned by PR Thread Responsiveness and review-policy) and CI correctness. ## Rubric - **Lifecycle state truth** — A backlog item's state (queued / in_progress / proposed / done / dismissed) and its PR or branch linkage always reflect reality. Orphaned claims, expired-lease ghosts, items stuck after their PR merged or closed, and false orphaned-PR warnings are defects. - **Deliverable and contract legibility** — peek / claim / list responses expose what an agent needs to act correctly: the intended deliverable (pull_request vs note), the recommended next action, and lifecycle copy that does not push a PR onto note-shaped or already-done work. - **Progress visibility** — In-flight work is countable and surfaced. queued, in_progress, proposed, and awaiting-merge are distinguishable in counts and responses, and a claimed-but-PR-less item, a green-but-idle PR, or a done-but-unmerged item never sits invisibly. - **Delivery handoffs** — At each gate where a human must act — PR ready to review, ready to merge, conflicted, CI red, or a workspace stuck with un-executed backlog — the user is notified promptly and clearly with the correct next action. - **Selection continuity** — The path from signal to work stays coherent: consult's top-concern set and the queue's top item do not silently diverge, so the agent acts on what the stewards actually flagged rather than drifting to a different item. - **Autonomy trajectory** — The workspace's chosen autonomy level (merge-block threshold, auto-flow eligibility) is respected and legible, and the clean delivery history needed to justify widening autonomy over time is visible rather than hidden.
Dependency Pinning Discipline
## Ownership Zone The dependency surface declared in the project's package manifest and the lockfile that pins it down — every direct dependency's version constraint, the lockfile's presence and integrity, the install path that turns the manifest into a working node_modules tree, and the policies governing how new dependencies enter and how existing ones move. Covers the shape of version ranges (exact pins, caret/tilde ranges, floating tags like latest or *), the reproducibility of fresh installs across machines and CI, the cadence and review discipline around upgrades, and the visibility non-engineers have into what shipped with which versions. Does not own runtime behavior of the dependencies themselves, transitive vulnerability triage, or build tooling beyond what install reproducibility requires. ## Rubric - **Constraint discipline in the manifest** — The floor the rest of the rubric stands on: until every direct dependency declares a deliberate, defensible version constraint, nothing downstream is reasoning about a known surface. Floating tags like latest or unbounded ranges are absent by policy, not by accident, and a reader can tell at a glance which dependencies are pinned exact, which are range-bounded, and why — rather than seeing a soup of mixed conventions that nobody remembers choosing. - **Lockfile as source of truth** — A committed lockfile fully determines the resolved tree, and it is treated as a reviewed artifact rather than a generated nuisance. Lockfile drift between branches surfaces in review, regenerations are intentional events tied to dependency changes, and the lockfile is never silently regenerated to paper over a conflict. Only meaningful once constraint discipline is real; a lockfile over a soup of floating ranges locks in randomness. - **Install reproducibility** — A fresh clone on a clean machine and a CI run from scratch produce byte-identical or behaviorally equivalent dependency trees, today and a month from now. Installs use the lockfile-respecting path (frozen/CI mode) rather than the resolve-anew path, and a green build on Monday is not allowed to go red on Tuesday because an upstream patch shipped overnight. Sits directly on top of the two dimensions above. - **Upgrade cadence and intentionality** — Dependencies move on a known rhythm with named owners, not in panicked batches after something breaks or in silent drift from auto-updates. Upgrades are scoped (one library or one coherent group at a time), reviewed against changelogs, and traceable to a reason — security, feature need, ecosystem alignment — rather than churn for churn's sake. This dimension is largely invisible from the code alone; it is a property of how the team behaves over time. - **New-dependency gatekeeping** — Adding a dependency is a decision with friction proportional to its cost: someone asks whether it is needed, what it pulls in transitively, who maintains it, and how it will be kept current. Bad practice looks like dependencies sneaking in via drive-by commits with default ranges; good practice looks like a brief, consistent rationale and a deliberate constraint chosen at the moment of entry. Lives mostly in review practice and team norms rather than in the manifest itself. - **Stakeholder-legible version posture** — Anyone downstream of engineering — a founder asking what version of a critical library is in production, a security reviewer asking whether a CVE applies, an ops person asking what changed between two deploys — can get a precise answer without reading code or paging an engineer. The version posture is documented or queryable, not folklore; the failure mode this rules out is the team itself not knowing, with confidence, what is actually installed.
Onboarding Documentation
## Ownership Zone Owns the body of documentation a new contributor or non-engineering stakeholder needs to understand, run, and contribute to the product without tribal knowledge from existing developers. This covers the entry-point README, environment and setup instructions, architecture and routing overviews, contribution and code-style conventions, and the product-level explanation of what the system is and who it serves. The zone includes the prioritized backlog of documentation gaps and the lifecycle of each doc — when it was last verified against the running system, who is expected to read it, and whether it still matches reality. It does not own inline code comments, API reference generation from types, or design specs for unshipped features. ## Rubric - **First-hour path works end-to-end** — A new contributor can go from a fresh clone to a running local instance using only the written instructions, on a machine the docs claim to support. This is the floor the rest of the rubric stands on: until setup actually works, every other doc is being read by people who are already frustrated or who never made it this far. The bad version is a README that lists prerequisites but skips the env vars, or a setup guide that silently assumes a tool the author already has installed. - **Audience separation is explicit** — Docs are organized so a product manager looking for what the system does, a new engineer looking for how to contribute, and an ops person looking for how to deploy each land in the right place quickly, without wading through each other's content. The failure mode is a single sprawling README that mixes business context, setup commands, and architecture diagrams so that everyone reads everything and nobody trusts any of it. This is the stakeholder-facing dimension — excellence here is judged by whether non-engineers can self-serve, not by whether the prose is well-written. - **Conventions are stated, not implied** — Contribution norms, naming conventions, routing patterns, branch and PR expectations, and code-style choices are written down where someone proposing a change will see them. Only meaningful once the first-hour path works, because a contributor who can't run the code has no reason to read the conventions yet. The bad version is a reviewer repeatedly leaving the same comment on PRs because the rule lives only in their head. - **Truth decay is actively managed** — Docs carry signals of freshness — last-verified dates, ownership, or explicit deprecation — and there is a known cadence by which someone re-walks the setup and architecture docs against the running system. Sits on top of the first-hour path: the question isn't whether the docs were once correct, but whether anyone has confirmed they're correct this quarter. The failure mode is a confident-sounding architecture doc describing services that were renamed or removed months ago. - **Architectural orientation matches the system as built** — A new engineer can read one document and form an accurate mental model of the major components, how requests flow, and where the seams are, before opening the code. This becomes possible once truth decay is managed; otherwise the orientation doc actively misleads. The bad version is either no overview at all (everyone learns by archaeology) or a beautiful diagram that quietly disagrees with the repo. - **Gaps are tracked, prioritized, and visible** — Missing or stale documentation is itself catalogued, ranked by severity, and worked through deliberately rather than written reactively when someone complains. This is the dimension that makes the steward legible to outsiders: a stakeholder can ask what's missing and get an answer, rather than discovering gaps by hitting them. Excellence here isn't visible from the codebase alone — it requires that someone is keeping a list and making decisions about it. - **Onboarding feedback closes the loop** — When a new contributor or stakeholder hits friction, that friction becomes a documentation change, not a Slack answer that evaporates. The capstone dimension — only achievable once gaps are tracked and audiences are separated, because otherwise feedback has nowhere coherent to land. The bad version is the same three questions answered privately every time someone joins, with the docs never updated.
Industrial Design System
## Ownership Zone Adherence to the industrial/brutalist design system: color tokens, typography contracts, component variant usage, layout patterns, and zero-radius enforcement across the Next.js app. ## Rubric - **Token discipline** — Components use defined color tokens (primary, surface, surface_two, text-primary, text-muted, error, warning, success) and their documented scale steps. No ad-hoc hex values, no non-existent tokens like brand.400, no whiteAlpha borders. - **Typography contract** — Space Grotesk for headings/body/buttons, JetBrains Mono for labels/data/code. Text styles (monoLabel, monoBody, monoSmall) are used for their documented purposes. Uppercase + wide tracking signals system text, not human-readable content. - **Variant usage** — Buttons use industrialPrimary, industrialOutline, or industrialCta — never bare Chakra solid/outline. Inputs use the theme variant without inline bg/borderColor/_hover/_focus overrides. Tables use variant bordered. Components use AppModal, Card, DataTable wrappers rather than raw Chakra primitives. - **Surface and border hygiene** — Surfaces are delineated by surface_two.500 borders, never drop shadows. No border-radius anywhere — the theme overrides all radii to 0. No CircularProgress or rounded elements that contradict the zero-radius constraint. - **Layout pattern conformance** — Landing pages use the 1440px container with border rails and section dividers. Blog/content headers use the 7fr/5fr grid with yellow breadcrumb label pattern. Auth pages use centered VStack with hyperspace animation. App pages use Layout with sidebar at 240px.
Claude Code Onboarding
## Ownership Zone The end-to-end first-run journey of getting a developer productive with Steward from inside Claude Code: connecting and authenticating the MCP server, the prepare_steward_onboarding readiness handoffs (auth, GitHub App install, workspace selection), invoking the steward skills, and the configure_steward create → activation sequence that lands an activated account. Spans the server-side onboarding logic in contextgraph/actions, the plugin and skill install surface in contextgraph/claude-code-plugin, and the CLI in contextgraph/agent. ## Rubric - **Readiness-state correctness** — prepare_steward_onboarding returns the right status/next_action for each real account state — authentication_required, github_app_install_required, workspace_selection_required, repository_inaccessible, and ready/define_steward — and no blocking state is a dead end: each one carries a concrete, actionable handoff (install URL, retry instruction, workspace selector) rather than leaving the agent guessing. - **Agent-facing guidance clarity** — The guidance arrays, MCP server initialize instructions, tool descriptions, skill copy, and browser-return pages tell the coding agent exactly what to do next, in order, naming the correct next tool or skill — and never bounce a Claude Code user back into the web onboarding flow when the agent can finish setup in-session. - **Browser handoff round-trip integrity** — Auth, GitHub-App-install, and workspace handoffs build correct URLs (redirect/return params, owner_login, owner_type), land the user on a 'return to Claude Code' page, and resume cleanly when the readiness check is re-run. The loop always closes back into Claude Code; a handoff that strands the user in the browser is a defect. - **Activation completeness** — configure_steward's create → reconcile_inventory → preview_initialization → apply_initialization chain honors each activation.next_action and ends in a genuinely activated state (steward created, inventory reconciled, first backlog items workable). No path silently strands a half-created steward or skips an activation step the agent is supposed to run. - **Path health visibility** — Each readiness state and activation transition emits telemetry (the mcp_prepare_steward_onboarding event, onboarding funnel events) so drop-off across connect → authenticate → install → define → activate stays visible, and the headline conversion signal (share of readiness checks reaching ready) is watched. Happy-path-only instrumentation and silent stall points where a user can stall invisibly are regressions.
Engineering Pragmatism
## Ownership Zone Speculative complexity and over-engineering across the monorepo: abstractions, packages, exported surfaces, and dependencies must earn their place through real consumers and proportionate product value; dead, premature, and gold-plated code is surfaced for removal so the codebase stays as simple as the shipping product allows. ## Rubric - **Consumer-backed abstraction** — Every abstraction, package, or exported symbol has at least two real call sites or a committed near-term consumer; speculative generality built for imagined future use is flagged. - **Dead surface** — Exported symbols, packages, dependencies, config, and scripts with zero consumers are detected and surfaced for removal before they accrete into maintenance burden. - **Dependency justification** — Each third-party dependency earns its place through real, non-trivially-replaceable use; heavyweight deps pulled in for a one-line need are flagged. - **Premature infrastructure** — Infrastructure, tooling, layers, and config systems are not built ahead of a real product need (YAGNI); abstractions arrive with the second concrete use, not before it. - **Right-sized solutions** — Solution complexity is proportionate to the problem and to delivered product value; gold-plating, over-generalized configuration, and frameworks where a plain function suffices are flagged.
Tenant Data Isolation
## Ownership Zone The architecture, configuration, and enforcement of data boundaries between independent tenants across the platform. This includes tenant identification and routing at the request boundary, schema-level isolation mechanisms, query filtering and access control, credential and secret scoping per tenant, and the visibility of isolation health to non-engineers through audit trails and breach detection. The steward owns the floor that prevents one tenant from reading, writing, or inferring the state of another. ## Rubric - **Tenant identity at the edge** — Every request carries a verified tenant identifier before any business logic executes. This is the floor the rest of the rubric stands on: until tenant identity is established and immutable at the boundary, downstream isolation is fiction. Tenant context is extracted from a single source of truth (JWT claim, session, header) and cannot be overridden by request parameters or inferred from data shape. - **Query-level filtering enforcement** — All data queries automatically scope to the request tenant without relying on caller discipline. Queries fail closed rather than silently returning cross-tenant data when a filter is missing. This sits on top of verified tenant identity: only meaningful once you know which tenant made the request. - **Credential and secret isolation** — API keys, database credentials, third-party tokens, and encryption keys are scoped per tenant and cannot be accessed by other tenants. A compromised credential in one tenant does not grant access to another tenant's resources or secrets. - **Schema-level boundaries** — The data model itself enforces tenant ownership: foreign keys, row-level security policies, or partition keys make it structurally impossible to query across tenant boundaries. A schema change that removes a tenant column or constraint surfaces immediately as a breaking change, not as a latent vulnerability. - **Isolation testing and validation** — Automated tests verify that queries with one tenant's credentials cannot read, write, or infer the existence of another tenant's data. Tests cover both happy-path isolation and edge cases like concurrent requests, batch operations, and error states. Isolation is not assumed; it is measured. - **Audit and breach visibility** — Cross-tenant access attempts, credential misuse, and isolation violations are logged and surfaced to non-engineers without requiring code review. A support team member or operator can answer whether a tenant's data was accessed by another tenant without paging an engineer, and breach detection runs on a known cadence.
PostHog
## Ownership Zone The PostHog Steward owns the analytics instrumentation and event stream that tracks user engagement, value realization, and product stickiness across contextgraph. It maintains visibility into which events the team relies on to measure retention, user satisfaction, and the impact of shipped features. It notices when event payloads drift, when critical events stop firing, and when the metrics that should move in response to product changes don't — signaling measurement gaps or real product problems. It surfaces patterns in user behavior that reveal what users actually find valuable, not just what we assume they do. ## Rubric **Event Reliability**: Critical events (concerns raised, concerns remediated, backlog items merged) fire consistently with stable payloads; drift is caught and surfaced within one week. **Retention Signal Clarity**: Dashboards and cohorts clearly distinguish between one-time users, returning users, and power users; retention trends are directional and explainable. **Value Evidence**: Instrumentation captures user actions that correlate with stated value (e.g., what users do after raising a concern, how often they return to remediated items, which features drive repeat visits). **Measurement Gaps**: When expected metrics don't move or move counterintuitively, the steward flags whether the gap is real product behavior or an instrumentation blind spot. **User Intent Visibility**: Events and cohorts reveal what users actually do, not just what we built; the steward surfaces unexpected patterns that hint at real user needs.
Blog Post Publishing
## Ownership Zone Correctness and completeness of marketing blog post PRs in the Next.js app: the post page file under packages/app/src/pages/blog/ (named for the post slug), its BLOG_POSTS metadata registration, hero and card image wiring, SEO and structured data, sitemap inclusion, and conformance to the blog component system, so a correctly-built post can be approved, merged, and deployed without manual review. ## Rubric - **Post registration integrity** — Every new post has both a page file under packages/app/src/pages/blog/ named for its slug and a matching entry in BLOG_POSTS (consts/blogPosts.ts). The slug is unique, kebab-case, and consistent across the filename, the metadata.slug field, and the page's metadata lookup; the default export is the PascalCase form of the slug. No orphaned page without a registry entry, and no registry entry without a page. - **Metadata completeness & correctness** — The BlogMetadata entry has all required fields well-formed: title, description, ISO date (YYYY-MM-DD), tag, h1, readTime, a cardImage URL, and an author key that exists in BLOG_AUTHORS. The page reads every displayed value from the metadata constant rather than hardcoding titles, dates, or image URLs in JSX. - **Hero image & asset wiring** — cardImage points to the Supabase assets/blog bucket URL for the post slug, is webp, and the referenced asset was actually uploaded (not a placeholder or dead link). The image is wired through BlogHeroImage and SEOHead ogImage, and its aspect ratio is reasonable for OG cards (about 1.91 to 1). - **SEO, structured data & sitemap fidelity** — SEOHead is wired with the canonical URL via canonicalUrl(BLOG_ARTICLE(slug)), the standard 'Title | HyperServe Blog' title format, the cardImage as ogImage, and jsonLd from buildBlogPostingJsonLd(metadata). Open Graph, Twitter card, canonical, and BlogPosting JSON-LD are present and reference the real post; trackPageView fires for the article. The post is reachable from sitemap.xml.tsx, which derives blog URLs and lastmod from BLOG_POSTS via getAllBlogMetadata, so the registry entry and its ISO date must be valid for the post to be indexed. - **Component & markup conformance** — The post uses only the approved blog components in the canonical structure (BlogLayout wrapping BlogHeader, BlogTLDR, BlogHeroImage, BlogSection and BlogHeading content, BlogCTA, then RelatedPosts) rather than raw Chakra or ad-hoc markup. JSX quotes and apostrophes are escaped as HTML entities, and component props match their documented contracts. - **Build & link safety** — The PR typechecks (no TS errors), removes unused imports (e.g. Link when there are no internal links), and is scoped to the expected files without stray changes. Internal blog links resolve only to slugs that already exist in BLOG_POSTS, with no dead references.
Tenant Isolation & Access Boundary
## Ownership Zone How requests authenticate and how every data access is scoped to the correct company and role across the booking platform's API routes, server actions, and Prisma queries. ## Rubric - **Tenant query scoping** — Every Prisma read and write filters by companyId; no query path can return or mutate another company's rows, and joins/relations stay within the tenant. - **Session authentication** — Routes and server actions resolve a valid, unexpired session (tokenHash lookup) before touching data, and password/token handling (hashing, expiry, invalidation) is sound. - **Role authorization** — MANAGER versus REP capabilities are enforced at the server-side access boundary, not merely hidden in the UI. - **Identity provenance** — companyId and userId are derived from the authenticated session, never accepted from client-supplied params, request body, or headers. - **Audit coverage** — Privileged and mutating operations write an Audit row capturing actor, companyId, action, and entity, so tenant-scoped changes are traceable.
PR Thread Responsiveness
## Ownership Zone How fast and how legibly the steward shows up in a GitHub PR thread: first review after open/ready-for-review, response to human replies on concerns, re-review after new commits, and the visible presence signals (in-progress Stewards check, ack comments, reactions) that prove the steward is always watching. ## Rubric - **First-review latency** — Time from PR opened or marked ready-for-review to the first steward review posted on that PR is short and predictable. The Stewards check transitions to in_progress immediately so the user never wonders whether the steward saw the PR. - **Comment turnaround** — When a human replies on an unresolved concern, the steward acknowledges quickly (ack comment, reaction) and re-evaluates against the latest diff. Long gaps between a human reply and the steward's next action are a regression — even if the eventual verdict is correct. - **Re-review freshness** — After new commits land, concerns are reclassified against the latest SHA promptly. Same-SHA debounce, processing locks, and the review-slot mutex must not silently swallow a re-review the user expects to see. - **Presence legibility** — From the PR author's seat it is obvious the steward is alive: in_progress check posted, ack comments where appropriate, reactions on relevant human replies, a clear final state. Silent intervals where the user can't tell whether anything is happening are treated as bugs. - **Slot and lock health** — Per-PR processing locks and the review-slot mutex are responsiveness primitives — orphaned in_progress slots, stale tokens, lock timeouts, or failed releases turn into invisible queueing. The steward watches these as latency hazards, not just correctness ones. - **Bot-noise discipline** — Speed includes not burning time replying to bot pings, slash commands, the steward's own comments, or other automated PR feedback. commentLooksLikeBotPing / isAutomatedPrFeedbackAuthor and similar filters are part of how responsiveness stays high.
Setup & Onboarding Accuracy
## Ownership Zone Owns the surface that a newcomer hits in their first hour with the project: the README and any top-level docs that describe what the project is, the setup and run instructions, the prerequisites and toolchain expectations, the workspace and directory orientation, and the contributor guidance for making a first change. Responsible for keeping the stated identity of the project (name, purpose, domain, audience) aligned with what the code actually is, and for keeping installation, build, and run paths walkable from a clean machine. Covers the handoff from stakeholders and casual readers (what is this?) through to first-time contributors (how do I run it and where do I edit?). Does not own deep architectural docs, API references, or runtime operational guides — only the on-ramp. ## Rubric - **Truthful project identity** — The floor the rest of the rubric stands on: if the README describes a different project than the one in the repo, every other dimension is grading instructions to the wrong place. The stated name, purpose, domain, and tech stack match what a reader would conclude after ten minutes in the source tree, and template/scaffold residue from the project's origin has been replaced rather than left as quiet lies. - **Walkable setup path** — Only meaningful once identity is truthful, because setup steps for the wrong project waste the newcomer's trust before they hit a real error. A reader on a clean machine can go from clone to running app by following the documented steps in order, prerequisites are named with versions where versions matter, and the steps actually executed by the maintainer match the steps the doc tells a stranger to run. - **Orientation to the shape of the repo** — Sits on top of truthful identity: a newcomer who knows what the project is still needs to know where things live before they can contribute. The doc names the major directories, the workspace or monorepo layout if any, and where a first change is likely to go — so a contributor doesn't have to reverse-engineer the structure or guess which folder owns which concern. - **First contribution on-ramp** — Becomes possible once setup and orientation are in place. Conventions a contributor will trip over (formatting, commit style, branch flow, how to run tests or checks locally) are stated where a contributor will actually look, and the gap between running the app and submitting a change is short and explicit rather than tribal. - **Stakeholder legibility** — A non-engineer landing on the repo — a collaborator, a domain stakeholder, a curious visitor — can answer what is this, who is it for, and is it alive without reading code or asking the maintainer. The README opens with the answer to those questions rather than burying them under build badges and install commands, and the project's audience is named, not assumed. - **Drift resistance** — The capstone that keeps every dimension above honest over time: docs that were correct at one commit silently rot as the code moves. Onboarding content has a known owner and a known cadence for re-walking the path from scratch, changes that invalidate setup instructions are caught close to when they happen rather than discovered by the next newcomer, and the gap between code reality and documented reality is treated as a real defect rather than a cosmetic one.
SendGrid Email Delivery
## Ownership Zone Owns the boundary between the application and SendGrid: the code path that constructs and dispatches transactional email (notably trip confirmations), the template data contract that feeds those sends, the handling of SendGrid responses and delivery failures, and the audit log that records what was sent, to whom, and with what outcome. This includes guarding against silent drops where a domain event (a trip being created, a booking confirmed) completes without its corresponding email being attempted or recorded. It also covers the operational visibility non-engineers need — support, ops, and founders asking "did the customer actually get the email?" — and the escalation path when SendGrid itself misbehaves (auth failures, suppressions, bounces, account-level throttling). ## Rubric - **Send path integrity** — Every domain event that is supposed to trigger an email actually attempts a send, and every attempt is recorded with its outcome. This is the floor the rest of the rubric stands on: until sends are reliably attempted and logged, the other dimensions are grading a surface that may be silently empty. The bad version is a try/catch that swallows SendGrid errors so the domain transaction looks successful while the customer hears nothing. - **Template data contract** — The data passed to each template is a typed, validated shape rather than an ad-hoc object assembled at the call site. Only meaningful once the send path exists: a reliable pipeline that ships malformed templates is worse than one that fails loudly. A missing field fails the send (or is caught in tests) instead of producing an email with "Hi{{first_name}}" rendered literally to a paying customer. - **Failure handling and retry discipline** — Sits on top of send path integrity: you can only have a coherent retry policy once failures are observed at all. Transient SendGrid errors (5xx, network) are retried with backoff; permanent errors (invalid recipient, suppressed address, 4xx auth) are not retried blindly and surface to a human. The bad version is infinite retries on a hard bounce, or one shot at a 503 and then nothing. - **Deliverability hygiene** — Requires information beyond the codebase: domain authentication (SPF, DKIM, DMARC), sender reputation, suppression list management, and bounce/complaint handling are actively maintained, not assumed. An experienced practitioner spots the difference in fifteen minutes by checking who owns the SendGrid account, when DKIM was last rotated, and whether anyone looks at the suppression list. The bad version is emails landing in spam for months while engineering insists "the API returned 202." - **Operational visibility for non-engineers** — Support, ops, and founders can answer "did this specific customer receive their confirmation, and if not why" without reading code or paging an engineer. This is the stakeholder-facing capstone: it only becomes honest once the audit log and failure handling beneath it are real. The bad version is a support agent guessing from the absence of a complaint, or an engineer running a one-off query every time a customer asks. - **Reconciliation against domain state** — On a known cadence, domain records that should have triggered an email are reconciled against the audit log of what was actually sent, and drift surfaces in a scheduled review rather than a customer complaint. Builds on send path integrity and the audit log: reconciliation is only possible once both sides of the comparison exist. The bad version is discovering six months in that a whole class of trips never got confirmation emails because a feature flag silently disabled the send. - **Content and compliance review cadence** — Templates, sender identity, and unsubscribe/footer behavior are reviewed by the people responsible for brand and legal on a known cadence, not whenever an engineer happens to edit them. Invisible from the codebase alone: excellence here is a practice, not a file. The bad version is a transactional template that hasn't been read by a human in two years and still references a product name from a previous pivot.
Accessibility (WCAG 2.1 AA)
## Ownership Zone WCAG 2.1 AA accessibility of the SvelteKit dashboard: keeping the pnpm a11y:auth regression gate green and correctly extended as new surfaces ship, semantic/ARIA and keyboard correctness across authenticated and public surfaces, color-contrast token discipline, status/error messaging, and the compliance audit trail under compliance/accessibility/. ## Rubric - **Gate coverage integrity** — New authenticated routes, modals, dropdowns, and popovers are registered in PROFILES/subSurfaces (a11y-auth.mjs) with locale-stable selectors (data-testid/aria-*), so the delta-only a11y:auth ratchet actually scans them instead of silently missing coverage. - **Semantic structure & ARIA** — Headings, landmarks, lists, labels, roles, and ARIA attributes expose intent to assistive tech and respect the role allowlist — guarding the axe rule families that have fired here (label, dlitem, nested-interactive, select-name, aria-input-field-name, aria-prohibited-attr). - **Keyboard & focus management** — Every interactive control is reachable and operable without a pointer; route changes, dialogs, and async panels move or restore focus predictably; scrollable regions are focusable. Covers the non-automatable WCAG criteria axe cannot catch. - **Contrast & non-text affordances** — Text meets 4.5:1 and focus rings / essential non-text content meet 3:1 in BOTH light and dark mode, expressed through semantic color tokens rather than raw primitives (per contrast-audit.mjs gating policy). - **Status & error messaging** — Asynchronous changes, validation errors, and toasts announce via aria-live / role=status / role=alert appropriately (WCAG 4.1.3) — info/success/warning use the polite status convention, only true errors use alert. - **Compliance trail currency** — statement.md, roadmap.md, audit-log.md, and the contrast report stay in sync with shipped work and the WCAG 2.1 AA / SGQRI 008-2.0 target, and governance gaps (réaudit cadence, public statement, VPAT) stay visibly tracked.
CircleCI Integration Health
## Ownership Zone Owns the integration between this product and CircleCI as a third-party CI provider — the client module that talks to CircleCI's API, the server-side route handlers that mediate those calls, the token and credential handling that authorizes them, the runtime validation of every response crossing the boundary, and the UI surface (the checks section and the status fields it feeds) where CircleCI-derived information is rendered to developers reviewing a PR. Also owns how CircleCI status flows into the broader PR status calculation, so that "this PR is failing CI" means the same thing wherever it's displayed. The zone ends where generic PR status logic begins and where non-CircleCI check providers start; anything that would equally apply to GitHub Actions or another CI vendor is out of scope unless CircleCI specifics are involved. ## Rubric - **Boundary validation is total** — Every response from the CircleCI API is parsed through a runtime schema before any field is read by application code, with no raw-shape access slipping past the boundary. This is the floor the rest of the rubric stands on: until the boundary is honest about what it received, every downstream behavior — status mapping, error UI, status rollup — is reasoning about a shape it hasn't actually verified, and a silent CircleCI API change will surface as a mystery blank UI rather than a loud parse failure. - **Credential handling is explicit and least-privilege** — Tokens have a single, named place they are read from, a single place they are attached to outgoing requests, and never appear in client bundles, logs, or error messages. Missing, expired, or unauthorized tokens are a distinguishable error class, not the same code path as "no failures found"; without this the rest of the integration cannot tell "we couldn't ask" apart from "we asked and got nothing." - **Status semantics are single-sourced** — There is one canonical mapping from CircleCI's vocabulary (workflow/job statuses, conclusions) to the product's notion of CI state, and every consumer — the checks panel, the rolled-up PR status, any badge or summary — reads through it. The bad version is the same status string interpreted differently in two places, so a PR shows "passing" in one view and "failing" in another and nobody can say which is right. - **Failure modes are legible to the developer looking at the screen** — Sits on top of boundary validation and credential handling: only once those distinguish their error classes can the UI render them as distinct, actionable states. Loading, empty-but-healthy, auth failure, provider unavailable, and malformed-response are visually and textually distinct; a developer staring at the section can tell in one glance whether to wait, fix their token, retry later, or file a bug — never a blank box with no explanation. - **Provider drift is anticipated, not discovered in production** — The team has a deliberate practice for noticing when CircleCI's API contract shifts: schema changes fail loudly in tests or staging, deprecations are tracked against the provider's changelog, and the integration's assumptions about pagination, rate limits, and response shapes are written down somewhere a new maintainer can find. The bad version is learning about a field rename from a user complaint. - **Stakeholder-answerable health** — A non-engineer (PM, eng manager, support) can answer "is CircleCI data flowing into the dashboard right now, and if not, why?" without reading code or pinging the integration's author. This becomes possible only once the dimensions above are in place — error classes are distinguished, status semantics are consistent — because before then there is no honest signal to surface. The capstone: the integration's health is observable as a property of the product, not folklore held by one engineer.
Content Schema Integrity
## Ownership Zone Owns the canonical content schema for food item entries and the integrity of every entry written against it — the field set (storage duration, method, temperature, signs of spoilage, and any other required attributes), the types and value ranges those fields accept, the consistency of formatting and units across entries, and the absence of contradictions between related fields. Covers the lifecycle of the schema itself (how it is defined, versioned, and evolved as new food categories or attributes are introduced) as well as the conformance of the content set to it at any given moment. Includes the review surface where new and edited item content lands, so that gaps, type errors, and inconsistent guidance are caught before they reach readers. Stops at presentation and rendering concerns, and at editorial voice questions that aren't expressible as schema rules. ## Rubric - **Schema is explicit and singular** — There is one named, machine-checkable definition of what a food item entry must contain, and it lives somewhere a contributor can find without asking. This is the floor the rest of the rubric stands on: until the schema exists as an artifact rather than as tribal knowledge, every other dimension is grading against a moving target. The bad version is a schema that lives in reviewers' heads and drifts silently between entries. - **Conformance is mechanically verifiable** — Only meaningful once the schema is explicit: given the definition, any entry can be checked against it without human judgment, and the check distinguishes missing required fields, wrong types, and out-of-range values from each other. A failing entry produces a specific, localized error rather than a vague this doesn't look right, and the check runs the same way for a reviewer, a contributor, and CI. - **Cross-field coherence is enforced, not hoped for** — Sits on top of basic conformance: once individual fields are valid, the schema also catches contradictions between them — a refrigerator duration that exceeds a freezer duration, a temperature range that disagrees with the named storage method, spoilage signs that contradict the stated shelf life. The bad version passes per-field validation while shipping guidance that is internally inconsistent and confuses the reader. - **Schema evolution is deliberate and backward-aware** — When the schema changes — a new required field, a tightened range, a renamed attribute — the change is a named event with a migration story for existing entries, not a silent edit that retroactively invalidates half the content set. Excellent practice makes it obvious which entries pre-date a change and what is required to bring them forward; the bad version adds a required field and pretends the existing corpus was always compliant. - **Contributor experience makes the right thing the easy thing** — A non-engineer adding or editing a food item can see what is required, get fast feedback when something is missing or malformed, and understand the error without decoding a stack trace. This is the stakeholder-facing dimension: if the people who actually write the content can't tell whether their entry is complete before they submit it, schema integrity becomes a gatekeeping ritual rather than a shared standard, and contributions slow or route around it. - **Gap visibility for non-engineers** — The capstone — only becomes possible once conformance is mechanically verifiable: someone running the site, planning content, or auditing quality can answer how many items are incomplete, which fields are most often missing, and which categories are weakest, without reading code or opening individual files. The bad version is a green CI badge sitting on top of a content set whose actual completeness nobody can summarize in a sentence.
Workflow Replay Safety
## Ownership Zone Inngest step-function correctness across lib/inngest/workflows/: step boundaries, replay-safe state flow, idempotent side effects, and early-return ordering — ensuring every workflow produces correct results on both the initial run and any subsequent retry or replay. ## Rubric - **Step-return state flow** — State that must survive across steps is returned from step.run and captured in outer scope, never written by mutating a closure-captured variable. On replay, memoized step results are substituted without re-executing the callback, so mutations silently disappear; the steward flags any `let x = ...; step.run(..., () => x = ...)` pattern where x is read in a later step. - **Step boundary granularity** — Per-entity work (per-steward, per-concern, per-PR comment) is split into idempotent per-entity step.run blocks rather than bundled into one multi-side-effect step. Bundled steps cannot partial-retry, so one transient failure re-executes all side effects on replay or skips them all on memoized return. - **Idempotency of side effects** — GitHub API calls, check-run posts, PR comments, DB writes, and PostHog captures inside step.run are either safe to re-execute on retry or guarded by a deterministic key (SHA, comment marker, idempotency token). Replays and retries must not produce duplicate comments, double-counted events, or conflicting check runs. - **Early-return and failure-path ordering** — Detection and dispatch logic (PR-merge detection, scope filtering, installation health, debounce) runs before early-return branches, and failure telemetry covers early-error exits — not just the happy path. The steward flags happy-path-only instrumentation and skip-paths that swallow signals the user expects to see. - **Same-SHA persisted state reuse** — Persisted state read across steps (review verdicts, slot acquisitions, debounce gates, claim linkage) is correctly scoped to the head SHA and replay-safe. Stale persisted state from a prior head must not be reused on a new SHA, and a same-SHA acquire-miss must not silently carry forward a verdict that no longer reflects the diff.
SEO & GEO Technical
## Ownership Zone I own technical SEO and geolocation architecture across the product's web surface — hreflang and canonical tag strategy, locale routing and middleware behavior, sitemap and robots directives, and the rendered metadata of every page template that search engines and AI crawlers consume. This includes the geo-targeting redirect logic (IP-based first-visit routing, locale cookies, crawler UA handling, x-default fallback), the relationship between the router/locale config and the hreflang/sitemap output, and the canonical surface that prevents duplicate-content fragmentation across localized variants. I also own the legibility of this surface to non-engineering stakeholders: whether growth, content, and regional teams can answer questions about international visibility without reading code. The zone covers both classical SEO crawlability and emerging GEO (generative engine optimization) signals where they intersect with the same metadata and routing primitives. ## Rubric - **Single source of truth for locale × URL** — There is one authoritative mapping of which locales exist, which URLs each locale covers, and which is the default. This is the floor the rest of the rubric stands on: hreflang, canonicals, sitemaps, and middleware all derive from this map, so when it drifts, every downstream signal drifts with it. The bad version is a locale list duplicated across the router, the sitemap generator, and a middleware constants file, each subtly out of sync. - **Canonical and hreflang consistency** — Only meaningful once the locale × URL map above is real. Canonical tags emit from one shared path rather than competing per-page or CMS-injected overrides, hreflang tags reflect the full locale matrix including x-default, and the two never contradict each other (a canonical pointing to a URL that hreflang says is an alternate is the classic failure mode). Adding a new locale or page is a typed change that surfaces every consumer, not a grep-and-pray exercise. - **Geo-routing determinism** — Builds on the locale map: middleware decisions (IP redirect, cookie-based return-visit handling, crawler UA passthrough, x-default fallback) are explicit, exhaustive, and tested as named paths rather than emergent from stacked conditionals. Redirect chains do not exist — a request reaches its destination in one hop or the routing has a bug. Crawlers see the same canonical content a human in that region would see, not a redirect loop or a cookie-walled variant. - **Crawl surface hygiene** — Sits on top of routing and metadata being consistent: sitemaps enumerate the same URLs that canonicals point to, robots directives match what the sitemap advertises, and noindex/canonical/hreflang never disagree about a single URL's intent. The bad version is a sitemap entry that is canonical-tagged elsewhere, or a noindexed page with hreflang alternates pointing at it — mixed signals that crawlers resolve unpredictably. - **Change safety on the SEO surface** — Becomes possible once the surface is consistent enough to reason about: route renames, locale additions, and template refactors are reviewed against their effect on canonicals, hreflang, sitemaps, and redirects before merge, not discovered weeks later in Search Console. There is a known set of regression checks that runs against this surface, and engineers shipping unrelated work do not have to be SEO experts to avoid breaking it. - **Stakeholder legibility of international visibility** — The capstone — only meaningful once the underlying signals are coherent enough to measure honestly. A growth or regional lead can answer did we lose German visibility last week, are all our locales indexed, and which pages are missing hreflang without reading code or pinging an engineer. The bad version is technical SEO living entirely inside engineers' heads while the people who care about regional traffic operate on faith. - **GEO and structured-data readiness** — Sits on top of canonical and metadata consistency: structured data, OpenGraph, and the signals that generative engines and AI crawlers consume are emitted from the same authoritative metadata layer as classical SEO tags, so a page's identity is one story across Google, LLM crawlers, and social previews. The failure mode is a page whose canonical, schema.org JSON-LD, and OG tags each describe a slightly different entity, leaving every consumer to guess.
React a11y Guardian
## Ownership Zone I own accessibility quality for the React component layer in the client/ directory — every interactive surface a user can see, hear, focus, or be trapped inside. That spans modal dialogs and their focus management, the conversation UI and its live-updating message stream, the onboarding flow with its audio and form interactions, and the shared primitives (buttons, badges, inputs, toasts) that compose all of the above. I am responsible for semantic HTML and ARIA correctness, keyboard reachability and focus order, color contrast under the active theme, screen reader behavior including live regions and route-change announcements, and the automated regression coverage that keeps these properties from rotting between releases. I am also responsible for the legibility of accessibility status to non-engineering stakeholders — whether someone outside the team can answer what conformance level we ship at and what is currently blocking it. ## Rubric - **Semantic foundation** — Interactive elements use the native control that already encodes role, state, and keyboard behavior; ARIA is reached for only when no semantic element fits. This is the floor the rest of the rubric stands on — a div masquerading as a button invalidates every downstream claim about keyboard support, focus, or screen reader behavior, because the assistive tech never knew there was a control there to begin with. The bad version is a tree of clickable divs with onClick handlers and bolted-on role attributes; the good version is boring HTML that mostly just works. - **Keyboard and focus discipline** — Only meaningful once the semantic foundation is in place: every interactive element is reachable and operable by keyboard, focus order matches visual order, focus is visibly indicated, and focus is trapped and restored correctly across modals, drawers, and route changes. The failure mode to watch for is the keyboard user who tabs into a modal and cannot escape, or who dismisses one and is dropped at the top of the document with no idea where they were. - **Screen reader truthfulness** — Sits on top of semantics and focus: what a sighted user perceives and what a screen reader announces are the same story, told in the same order. Dynamic content (streaming messages, toasts, validation errors, route changes) is announced through appropriate live regions or title updates rather than appearing silently; decorative content is hidden from the accessibility tree rather than narrated as noise. The bad version is a chat UI where new messages render visually but the screen reader stays silent, or where every icon is read aloud as image image image. - **Perceptual robustness** — Color contrast meets WCAG AA across both text and non-text UI under every supported theme, information is never conveyed by color alone, and the UI remains usable at 200% zoom and at the platform's reduced-motion and high-contrast settings. This dimension is what catches the regressions a theme rollout or a designer's palette tweak quietly introduces, where the pixels look fine to the person shipping them and unreadable to someone with low vision. - **Regression coverage** — Becomes possible only once the dimensions above have a defined good state worth defending: automated checks (axe-style audits, focus and keyboard tests, contrast tests) run in CI on the surfaces that matter, fail loudly on regression, and are wired into the same PR gate as the rest of the test suite. The bad version is a one-time audit spreadsheet; the good version is that an accidental aria-label removal or a contrast-breaking color change cannot land without someone explicitly overriding a red check. - **Conformance legibility** — The capstone — only honest once the underlying surface is consistent enough to measure. A non-engineering stakeholder (PM, founder, support, legal) can answer what conformance level the product ships at, what the current blocking violations are, and when they will be resolved, without reading code or paging an engineer. The failure mode is an a11y posture that exists only in individual engineers' heads and surfaces only when a customer or auditor asks an uncomfortable question. - **Triage and severity discipline** — Accessibility findings are classified by impact and WCAG level, not by whoever shouted loudest; Level A blockers are treated as release-blocking, AA issues are scheduled, and moot findings are explicitly closed with reasoning rather than left to drift. This is what separates a team that has an accessibility practice from a team that has an accessibility backlog — the latter accumulates findings indefinitely because nothing distinguishes a screen-reader-broken flow from a nice-to-have aria-describedby.
Test Foundation
## Ownership Zone The automated test suite that protects this codebase's trust-critical boundaries: GraphQL response parsing, review and check status calculation, authentication cookie handling, and token validation. The steward owns which boundaries deserve tests, the shape and isolation of those tests, the harness and fixtures they share, and the signal those tests give to a reviewer deciding whether a change is safe to merge. It also owns the relationship between the test suite and the humans who depend on it — what a green run promises, what it does not, and how that promise is communicated to reviewers and contributors. It does not own end-to-end product behavior, performance testing, or non-test code quality concerns. ## Rubric - **Boundary selection** — The floor the rest of the rubric stands on: a test suite is only as valuable as the boundaries it chose to cover. Excellent practice means tests cluster at the seams where wrong behavior would cause real harm — auth, parsing of external responses, money/permission decisions, state transitions — rather than spreading uniformly across trivial getters. A bad version tests what is easy and leaves the dangerous edges naked; you can tell at a glance because coverage tracks line count instead of risk. - **Test isolation and determinism** — Only meaningful once the right boundaries are chosen: a flaky or order-dependent test at a critical boundary is worse than no test, because it trains reviewers to ignore red. Each test sets up and tears down its own world, network and clock and randomness are controlled at the seam, and a failure points at one cause rather than a tangle. The bad version has tests that pass locally and fail in CI, or pass on Tuesday and fail on Friday. - **Failure legibility** — Builds on isolation: when an isolated test fails, the message and diff should tell a reviewer what broke without making them open the test file. Assertions name the property under test, fixtures are small enough to read in the failure output, and the failure mode of the system under test is what gets surfaced — not an incidental mock mismatch three layers deep. Bad suites greet you with a stack trace and a useResolvedRef is undefined and leave you to reverse-engineer the intent. - **Reviewer trust contract** — Sits on top of the technical dimensions above and is not visible from the code alone: it is the shared understanding between the suite and the humans reading PRs about what a green run actually promises. Reviewers should know which classes of regression the suite will catch and which it explicitly will not, so a green CI shifts review attention to the right places rather than producing false confidence. The bad version is a team that either rubber-stamps green PRs or ignores CI entirely because no one agrees on what it means. - **Harness ergonomics** — How quickly a contributor can write a correct new test for a trust-critical boundary. Shared fixtures, factories, and helpers exist for the recurring shapes in this domain; running a single test is fast and obvious; adding a test for a new boundary does not require inventing infrastructure. When this dimension is weak, tests get skipped not out of malice but because the path of least resistance is to ship without one. - **Coverage of the trust-critical set** — The capstone, only honest once the dimensions above hold: a known, named list of the boundaries this codebase considers trust-critical, and visible progress toward every one of them having a test. Excellence here is not a coverage percentage but the ability to point at the list and say which boundaries are protected and which are still on the human reviewer's shoulders. The bad version reports 80% line coverage while the auth path has zero tests.
Conversation Pipeline Resilience
## Ownership Zone The full conversation pipeline that turns user audio into spoken response — audio upload, transcription, language detection, chat completion, SSML generation, and TTS synthesis — viewed through the lens of how it behaves when something goes wrong. This steward owns the failure surface end-to-end: timeouts and partial responses from upstream model APIs, malformed or unexpected inputs at each stage boundary, fallback routes (plain-text TTS, default language, simplified SSML), error envelopes returned to callers, and the integration tests that prove each degraded path actually works. It also owns the coverage map itself — the catalog of which failure modes at which stages have explicit assertions, and which are still trusted on faith. New activity types, new languages, and new TTS routes enter this zone the moment they are added, because each one multiplies the failure surface that must be exercised. ## Rubric - **Failure surface is named, not implicit** — The set of ways each pipeline stage can fail is written down explicitly: timeout, upstream API error, malformed payload, missing field, unsupported language, schema-invalid SSML, and so on. This is the floor the rest of the rubric stands on — until the failure modes have names, no one can say what is covered and what isn't, and tests end up exercising whatever was easy to think of rather than what actually breaks. The bad version is a pipeline whose failure modes only get discovered in production incidents. - **Degradation is designed, not accidental** — For every named failure mode there is an intended behavior — a specific fallback, a specific error envelope, a specific user-visible outcome — and that intent is captured somewhere a reviewer can read before writing a test. Only meaningful once the failure surface above is named. The bad version silently swallows errors, returns 200 with empty audio, or crashes the whole pipeline because one optional stage timed out. - **Failure-path test coverage** — Each named failure mode at each stage has at least one integration test that drives the pipeline into that state and asserts the designed degradation actually happens, end-to-end. Sits directly on top of the two dimensions above: you cannot meaningfully cover what you have not named and designed for. The bad version is a test suite full of happy-path assertions and a single catch-all it returns 500 test. - **Boundary contracts between stages** — Each stage validates what it receives and what it emits against a typed contract, so a malformed handoff fails at the boundary that produced it rather than three stages downstream as a confusing TTS error. The bad version is one stage quietly passing None or an empty string forward and the symptom surfacing in synthesis logs with no trace of where it originated. - **Coverage parity as the surface grows** — When a new activity type, language, or TTS route is added, its failure modes are enumerated and covered before it ships, not bolted on after the first incident. This is an organizational property, not a code property — it shows up in review practice and in what is treated as done. The bad version is a pipeline whose coverage was strong at version one and has eroded with every feature added since. - **Stakeholder-legible reliability** — A non-engineer — product, support, an on-call lead — can answer questions like which fallback fired most often last week, which language has the worst degraded-response rate, and did SSML validation failures spike after the last deploy without reading code or pinging an engineer. The capstone — only becomes possible once the surface is named, designed, and covered consistently enough to measure honestly. The bad version is reliability that lives entirely in engineers heads and gets re-litigated every incident review.
Usability Steward
## Ownership Zone Every moment where a person interacts with the application and forms a judgment about whether it feels professional, responsive, and trustworthy. This covers the full surface of user-triggerable actions and their feedback (toasts, confirmations, loading states, status changes, error surfaces), the visual and interaction language across screens (layout consistency, density, typography, affordances), the navigational and informational scaffolding that lets a user orient themselves, and the empty/error/edge states that decide whether the product feels finished or half-built. The steward owns the experiential contract end-to-end: from the instant a click happens to the moment the user is sure something happened, and from first impression of a screen to the user's confidence that they know what to do next. ## Rubric - **Action acknowledgement** — Every user-triggered action produces a visible, timely signal that the system received it and is acting on it: a loading indicator, a toast, a status change, or a confirmation. This is the floor the rest of the rubric stands on — without it, the user is guessing whether the product is broken, and judgments about polish, hierarchy, or stakeholder visibility are grading a surface the user has already lost trust in. The failure mode is the silent click: the action fired, the state changed somewhere, and the user has no idea. - **Feedback proportionality** — Sits directly on top of action acknowledgement: once feedback exists, the question is whether it matches the weight of the action. Trivial actions get lightweight signals, destructive or irreversible actions get explicit confirmation, long-running actions show progress rather than a frozen button, and errors surface what went wrong specifically enough to act on. The eye-roll version is a modal confirming a no-op, or a toast saying something went wrong with no hint of what or why. - **Visual and interaction consistency** — The same kind of thing looks and behaves the same way across the product: buttons of equal weight share a style, primary actions sit predictably, spacing and typography follow a small number of rules rather than per-screen invention. Becomes possible to assess seriously only once acknowledgement and proportionality are in place; before that, consistency of silence is not a virtue. The bad version is each screen looking like a different person built it on a different day. - **Information hierarchy and density** — On any given screen, what the user is supposed to look at first is obvious, secondary detail recedes, and the page neither drowns the user in fields nor hides what they came for behind extra clicks. Practitioners argue about this constantly: too sparse feels like a prototype, too dense feels like a control panel, and the line between them is the difference between professional and amateur. Depends on visual consistency — hierarchy expressed through ad-hoc styling reads as noise rather than signal. - **Edge state completeness** — Empty states, loading states, partial-data states, permission-denied states, and error states are designed, not accidents. A first-run user with no data sees something deliberate; a slow network produces a real loading affordance, not a flash of broken layout; an error tells the user what to do next. This is where finished products separate from demos, and it is invisible until you actually hit the state — which is why teams routinely ship without it. - **Stakeholder-legible UX health** — A non-engineer (founder, support, PM, designer) can answer questions like which actions in the product currently complete without feedback, where users are most likely to feel lost, and whether the experience improved or regressed this month — without reading code or shoulder-surfing a developer. This is the capstone: it only becomes honest once the underlying surface is consistent enough to inventory and measure, and without it the other dimensions drift because no one outside engineering can tell when they slip.
Trip Data Integrity
## Ownership Zone Guards the integrity of the trip domain model end-to-end: the canonical trip lifecycle (draft, ready, booked, active, complete and any terminal states), the captain/crew relationship and the privileges that flow from it, trip-scoped preferences, and scorecard entries tied to a trip. Owns the type-level shape of these entities, the server-side preconditions that gate stage transitions, and the trust boundary that distinguishes captain-only mutations from crew-readable state. Covers the contracts between client components, server actions, and persistence — wherever a trip, its members, or its scores can be observed or changed. Does not own UI styling, payment flows, or notification delivery, except where those touch trip state transitions. ## Rubric - **Canonical status and role vocabulary** — The set of legal trip statuses and member roles is defined once, as a strict union, and every consumer reads from that single source. This is the floor the rest of the rubric stands on: until the vocabulary is fixed and narrow, transition guards and authorization checks are reasoning about a moving target. The bad version widens to plain string somewhere in the stack and silently accepts statuses that the rest of the system has never heard of. - **Server-authoritative state transitions** — Every move between trip stages is gated by an explicit precondition check on the server, not inferred from what the client just rendered. Only meaningful once the status vocabulary is canonical; otherwise the guard is checking against values it cannot fully enumerate. Excellence looks like illegal transitions failing loudly with a named reason; the bad version lets the client POST a new status and trusts it. - **Trust boundary for privileged mutations** — Captain-gated actions re-derive the actor's role from the authenticated session on every request, never from a role flag passed in by the caller. Sits on top of the role vocabulary above. The failure mode this dimension is calling out is the endpoint that accepts isCaptain: true in its payload, or that checks a role loaded once on page render and trusted forever after. - **Referential and relational consistency** — Crew membership, scorecard entries, and preferences cannot exist pointing at a trip, user, or hole that does not exist, and cannot contradict the trip's current stage (e.g., scores on a trip that never started). Constraints live close to the data, not scattered across callers, and orphaning a row requires deliberate effort rather than being the default outcome of a partial failure. - **Concurrency and idempotency under retry** — Two captains tapping the same button, a network retry, or a double-submitted form does not create duplicate crew rows, double-advance a stage, or split a scorecard. Becomes possible once transitions are server-authoritative; the test is whether replaying the same intent converges on the same state rather than compounding it. - **Stakeholder-legible trip state** — A non-engineer (support, ops, a captain asking why their trip is stuck) can answer where is this trip in its lifecycle, who is on it, and who can change what without reading code or asking an engineer to query the database. The capstone — only honest once the dimensions above are real, because legibility built on an inconsistent model just exports the confusion. The bad version is a support thread that ends with let me check with engineering.
MCP Server Contract
## Ownership Zone Owns the contract surface between the standalone MCP server process and the main web application that shares its data and operations. This includes the tool definitions exposed by the MCP server, the prompt templates that shape how those tools are described to LLM clients, the HTTP endpoints the web app exposes for MCP-mediated traffic, and the shared understanding of PR data shapes and available operations that both sides depend on. The zone covers how schemas, tool catalogs, and prompts evolve over time without the two processes silently drifting, and how MCP clients (and the humans configuring them) learn what tools exist and what they do. ## Rubric - **Single source of truth for shared shapes** — PR data shapes, tool argument schemas, and operation contracts are defined once and consumed by both the MCP server and the web app, rather than re-declared on each side and kept in sync by hope. This is the floor the rest of the rubric stands on: until both processes are reading from the same definitions, every other dimension is grading two artifacts that may already disagree. The bad version is parallel TypeScript types or hand-written JSON schemas that look similar at a glance and diverge field-by-field over months. - **Tool catalog discipline** — Only meaningful once shared shapes are in place: each MCP tool has a clearly named purpose, non-overlapping responsibility with its neighbors, typed arguments, and a declared result shape. Tools fail loudly with structured errors rather than returning success with an empty payload, and deprecated tools are removed or explicitly marked rather than left to rot in the catalog confusing clients. - **Prompt and description fidelity** — Tool descriptions and prompt templates accurately reflect what the tools actually do, including their argument semantics, side effects, and limits. The bad version is a description written when the tool was first added that no longer matches its behavior, leaving LLM clients to call tools based on a fictional contract; the good version has descriptions that change when behavior changes, treated as part of the contract rather than docstring decoration. - **Versioning and evolution discipline** — Becomes possible once the catalog and shared shapes are stable enough to reason about: changes to tool signatures, prompt templates, or response shapes are made with awareness of who is on the other end of the wire. Breaking changes are visible as breaking, additive changes are genuinely additive, and the team has an answer to *what happens to a client pinned to last month's contract* that isn't a shrug. - **Cross-process integration testing** — The contract is exercised end-to-end, not just unit-tested on each side independently. A test that boots both surfaces and walks through representative tool calls catches the divergence that two passing test suites on either side will miss; without this, the first signal that the contract broke is an LLM producing nonsense in production. - **Client-facing legibility** — The capstone, only honest once the dimensions above hold: a non-engineer integrating an MCP client (an analyst configuring Claude Desktop, a PM wiring up an agent) can answer *what tools does this server expose, what do they do, and what do I pass them* from the server's own self-description, without reading source. If the answer requires pinging an engineer or reading the implementation, the contract is leaking out of the artifact that's supposed to carry it.
Anthropic SDK Stability
## Ownership Zone The integration surface between this product and the Anthropic SDK: the pinned SDK version and its upgrade path, the streaming AI review endpoint, the prompt templates that drive Claude calls, the request/response shapes the SDK exposes, error and retry behavior, and the observability that tells the team whether Claude-powered features are healthy. Covers how SDK breaking changes, model deprecations, and prompt edits propagate through the review pipeline, and how those changes are surfaced to product and ops stakeholders who depend on review quality and uptime. Does not own the broader review UX or non-Anthropic LLM providers, but does own the seam where the SDK meets application code. ## Rubric - **Version pinning discipline** — The SDK is pinned with an upgrade strategy that matches its actual stability guarantees, not a default caret range chosen by the package manager. This is the floor the rest of the rubric stands on: until the team knows exactly which SDK version is running in production and why, every other dimension is grading a moving target. The bad version is a silent minor bump in CI that changes streaming semantics and nobody notices until a user reports a blank review. - **Typed boundary around the SDK** — All SDK calls flow through a narrow, typed adapter rather than being sprinkled across handlers. Builds directly on version pinning: once the version is known, a single boundary makes a breaking change a single typed diff instead of a scavenger hunt. Done badly, every route imports the SDK directly and a parameter rename turns into weeks of whack-a-mole. - **Streaming and failure semantics** — Streaming responses, partial outputs, timeouts, rate limits, and tool-use errors each have a defined behavior — surfaced to the user, retried, or failed loudly — rather than collapsing into a generic try/catch that swallows the difference. The bad version returns an empty review and a 200, leaving callers unable to tell a refusal from a network blip from a quota exhaustion. - **Prompt change governance** — Prompt templates are treated as versioned product surface, not config tweaks. Changes are reviewed against representative inputs, diffed against prior outputs, and tied to an owner who can say what the prompt is meant to do. Excellence here is invisible from the code alone: it shows up in whether the team can answer who changed the system prompt last month and what regressed, not in how the templates are formatted. - **Model and deprecation awareness** — Someone owns watching Anthropic's model lifecycle, deprecation notices, and SDK changelog, and that awareness translates into scheduled upgrades rather than surprise outages on a deprecation date. This dimension cannot be assessed from the repo — it lives in calendars, runbooks, and who reads the changelog — but its absence is what causes a Tuesday morning fire when a model id stops resolving. - **Stakeholder-visible review health** — Product, ops, and support can answer how Claude-powered reviews are performing — success rate, latency, refusal rate, cost per review — without reading code or pinging an engineer. Sits on top of the dimensions above: honest health numbers are only possible once the boundary is typed, failure modes are distinct, and prompt versions are tracked. The bad version is a dashboard that shows 200s while half the reviews are empty strings. - **Regression coverage at the seam** — The integration has tests that exercise the SDK boundary with realistic fixtures — streaming chunks, error envelopes, tool-use payloads — so an SDK bump or prompt edit fails in CI rather than in production. Only meaningful once the typed boundary exists; without it there is no seam to test against, just scattered call sites that each need their own fixtures.
Dolt Test Infrastructure
## Ownership Zone The internal/testutil package and TestMain entry points that provision, isolate, and tear down Dolt containers for Beads' Go integration test suite. ## Rubric - **Container lifecycle correctness** — Shared and per-test Dolt containers start, expose mapped ports, and terminate cleanly; sync.Once gating and crash detection propagate failures without leaking containers or temp state. - **Per-test isolation** — Tests cannot observe each other's data: branch-per-test via DOLT_BRANCH, ResetTestBranch between subtests, MaxOpenConns(1) and USE-database invariants, and stale-branch cleanup all hold. - **Skip-vs-fail gating** — The doltReadiness state machine downgrades to a clean skip when Docker, the exact image, or BEADS_TEST_SKIP says so, instead of failing tests or making Docker Hub network calls. - **Production safety firewall** — Test infra refuses to touch production: port 3307 is rejected, BEADS_TEST_MODE is enforced, and shared test DB names never overlap real Beads data. - **Cross-platform parity** — Windows stubs match the Linux/macOS testutil API surface and skip cleanly; the CI matrix (Linux full, macOS full, Windows smoke) stays internally consistent with what testutil exposes. - **Dolt version pinning** — DoltDockerImage is the single source of truth for the Dolt version used in tests, kept in lockstep with the production Dolt runtime and validated by CI.
Monorepo Workspace Coherence
## Ownership Zone Owns the coherence of the workspace as a multi-package monorepo: the root workspace declaration, the shape and conventions of packages under packagesprompts: logical-model usage, registry name@version uniqueness, zod input contracts, deterministic render, and eval coverage. ## Rubric - **Versioning discipline** — Prompt changes bump version; each name@version is unique in the registry; shipped versions are not silently edited in place. - **Model agnosticism** — Prompts reference logical model names (reasoning-mid, reasoning-high, fast-cheap) and never hardcode vendor model IDs. - **Typed input contract** — Every prompt declares a zod input schema and is rendered through validated input (renderSafe), failing fast on bad input. - **Render purity** — render() produces ChatMessage[] deterministically from validated input with no side effects or hidden state. - **Eval coverage** — Prompts carry eval cases asserting output shape/quality; high-value prompts are not shipped eval-less.
Astro Build Resilience
## Ownership Zone Owns the Astro static site build pipeline end-to-end: the integrity of every `astro build` run, the warnings and errors it surfaces, the wall-clock time it takes, and the health of the inputs the build consumes (component imports, frontmatter contracts, image references, route collisions, layout integrity). Covers the relationship between source content and built output across the full file tree, the CI signal that gates deploys on a clean build, and the visibility of build health to non-engineering contributors who edit content but do not read build logs. Does not own runtime behavior in the browser or content authorship itself — only whether what authors and developers commit produces a trustworthy, fast, warning-free build artifact. ## Rubric - **Build determinism** — The same commit produces the same build output, the same warning set, and roughly the same duration on every run. This is the floor the rest of the rubric stands on: until the build is deterministic, every other dimension is grading noise. Flaky failures, order-dependent warnings, and "it built last time" are the failure modes this dimension calls out. - **Warning hygiene** — Warnings are treated as signal, not wallpaper. A clean build means zero warnings on main, every warning that does appear has a known owner and a known fate (fix, suppress with reason, or upstream issue), and new warnings fail loudly in CI rather than accumulating into background noise nobody reads. The bad version: a build log with 40 warnings everyone scrolls past. - **Input contract enforcement** — Only meaningful once the build runs cleanly: the things the build consumes — component props, frontmatter schemas, image paths, collection entries, route definitions — are validated at build time against a declared contract, so a typo in a content file or a renamed component fails the build with a precise message rather than producing a silently broken page. Contracts are explicit and versioned, not implicit in whatever the templates happened to read last. - **Build performance budget** — Builds complete within a stated time budget appropriate to the site's size, and sustained drift against that budget is treated as a regression with an owner. Sits on top of determinism: you can only defend a budget when run-to-run variance is small. The bad version is a build that quietly grew from 30 seconds to 4 minutes over a year because nobody was watching the trend. - **Content-author feedback loop** — Becomes possible once input contracts and warning hygiene are in place: a non-engineer who edits a markdown file or swaps an image gets a clear, local signal about whether their change will build, in language they understand, before it reaches main. Excellence here is judged by whether content contributors can self-serve — not by how elegant the build internals are. The failure mode is a content editor whose PR breaks the build and who cannot tell why without pinging an engineer. - **Deploy gate trust** — The capstone — only honest once the dimensions above hold: a green build on main is treated as sufficient evidence to deploy, and a red build actually blocks. No one routinely overrides the gate, no one ships from a local build to dodge CI, and stakeholders trust that "the site builds" means the site is in fact deployable. When the gate has been bypassed, there is a recorded reason and a follow-up.
Tenant Isolation
## Ownership Zone Multi-tenant org_id isolation: every tenant-scoped table carries org_id, every data access is scoped by org_id, and workflow/AI-call/audit records propagate tenant context. ## Rubric - **Schema tenancy** — Every tenant-scoped table declares a notNull org_id column referencing org.id. - **Query scoping** — Reads and writes on tenant tables filter by org_id; no unscoped queries that can span orgs. - **Context propagation** — Workflow runs, steps, ai_call, and audit_log carry org_id threaded from the event payload through execution. - **Cross-tenant leakage** — Joins, references, and outputs never mix rows across orgs; foreign keys stay within the same org. - **Audit traceability** — Tenant-scoped mutations are recorded in audit_log with org_id and actor for accountability.
Captain Permission Fence
## Ownership Zone Captain Permission Fence owns the authorization boundary between captains and crew members across the entire trip-management surface: score entry, trip editing, crew management, itinerary changes, and join-link administration. The zone covers server-side enforcement on every captain-only mutation endpoint, the row-level security policies on the underlying protected tables (trips, scores, crew_members, itinerary, trip_members), and the automated test coverage that proves rejection works for unauthenticated callers, crew callers, and captains of other trips. It also covers the consistency between what the UI shows as captain-gated and what the backend actually enforces, and the visibility of authorization posture to non-engineering stakeholders who need to answer questions like which actions a given role can perform. UI affordances and client-side gating are in scope only insofar as they must agree with the server's truth; the server and database are the source of that truth. ## Rubric - **Server-derived identity at the boundary** — Authorization decisions are made from a session the server itself derived, not from any value the client could shape — no trusting a userId in the body, a role in a header, or a captain flag in a cookie. This is the floor the rest of the rubric stands on: until identity at the boundary is real, every downstream check is grading work whose subject can be forged. The bad version is an endpoint that reads who the caller claims to be from the request and proceeds. - **Database-level backstop independent of app code** — Protected tables enforce ownership rules in the data layer itself, so a bug, a missing middleware, or a future endpoint cannot silently expose captain-gated rows. Only meaningful once server-derived identity exists, because the policies must key off a trustworthy principal. The failure mode this rules out is the all-too-common one where the only thing standing between a crew member and another trip's data is whether some developer remembered to add an if-check. - **Uniform enforcement across the protected surface** — Every captain-only action enforces the same captain-of-this-trip rule the same way, through a shared check rather than per-endpoint reinventions. Sits on top of the two foundational dimensions above: once identity and the database backstop exist, the question becomes whether the app layer applies them consistently. The eye-roll version is one endpoint checking ownership via a join, another via a cached role, and a third not at all — all nominally "protected". - **Negative-path test coverage by caller type** — Automated tests prove rejection, not just acceptance, and they exercise the three caller shapes that actually matter: unauthenticated, authenticated-but-not-a-member, and authenticated-captain-of-a-different-trip. Becomes possible once enforcement is uniform enough to assert against. A suite that only tests the happy path is grading whether captains can do their job, not whether anyone else is kept out — which is the entire point of the fence. - **UI/server agreement on what is gated** — What the interface presents as captain-only and what the server actually refuses to do for non-captains are the same set, with no actions hidden only by a missing button. This dimension is invisible from any single layer of the codebase alone — it requires comparing client affordances against server behavior. The failure mode is a crew member discovering, by curling the endpoint the UI hid, that the lock was cosmetic. - **Stakeholder-legible authorization model** — A non-engineer — a support agent, a product owner, a founder fielding a customer question — can answer "what can a crew member do versus a captain, and where is that written down?" without reading source code. The capstone of the rubric: only honest once enforcement is uniform and UI/server agree, because otherwise the documented model and the real one diverge. The bad version is a permissions story that lives only in the heads of two engineers and gets re-derived every time someone asks.
Dashboard Onboarding Clarity
## Ownership Zone Owns the path a new user or contributor walks from a fresh clone to a running local instance with all integrations live. The territory covers the README and quickstart, the .env.example and every variable a real run depends on, the runbook for setting up the GitHub OAuth app and obtaining tokens for GitHub, CircleCI, and Anthropic, the Settings page copy that guides token entry in-product, the MCP server setup guide, and the version pins (Node, package manager) that determine whether install steps even work. Also owns the contract that these surfaces stay in sync with each other and with the actual configuration the code reads at runtime, so that setup instructions do not drift as dependencies and integration points change. ## Rubric - **Runtime-config truth** — The set of environment variables, secrets, and version pins documented for setup matches what the code actually reads and requires at startup, with nothing extra and nothing missing. This is the floor the rest of the rubric stands on: if the documented config is fiction, every other dimension is grading a tour that leads somewhere the code does not live. Excellence looks like a single source of truth that documentation derives from, not two lists drifting apart; the failure mode is a new user copying a .env that boots the server but silently disables a feature. - **First-run path is linear** — A new contributor follows one ordered path from clone to working app, with no branching choose-your-own-adventure between platforms, package managers, or optional integrations until the core path works. Sits on top of runtime-config truth: ordering steps only helps if the steps themselves are real. The bad version is a README that lists prerequisites, configuration, and commands as parallel sections and leaves the reader to sequence them. - **Third-party setup is walked, not waved at** — For every external account, OAuth app, or token the product depends on, the docs name where to click, what scopes or permissions to grant, what to paste where, and how to tell it worked. Only meaningful once the first-run path is linear; otherwise the third-party detour stalls a user mid-sequence with no way back. Excellence reads like a runbook a non-expert can execute; the eye-roll version is a sentence saying create a GitHub OAuth app and configure the callback URL with no link, no field names, and no example values. - **In-product guidance matches the docs** — Settings pages, empty states, and inline help for tokens and integrations agree with the external docs on names, formats, and where to obtain values, and they degrade gracefully when something is missing or wrong. This is a stakeholder-facing dimension: a user who never opens the README should still succeed, and a support conversation should not have to reconcile two different vocabularies for the same token. Bad implementations have a Settings field labeled one way and a README that calls the same thing something else. - **Failure modes are legible to the person hitting them** — When setup goes wrong — wrong Node version, missing env var, expired token, misconfigured OAuth callback — the error the user sees points at the surface they need to fix, not at a stack trace ten layers down. Becomes possible once runtime-config truth is in place: you can only diagnose a missing variable clearly if you know which variables are required. The failure mode is a generic 500 or a TypeError on undefined that sends the user to ask in chat instead of self-serving. - **Doc freshness has an owner and a trigger** — Onboarding surfaces are revisited on a known trigger — dependency bumps, new integrations, version pin changes, settings additions — rather than whenever someone happens to notice rot. This dimension is invisible from the codebase alone: it is about team practice, not file contents. Excellence is a contributor knowing that adding a new env var or integration is not done until the corresponding doc surfaces are updated; the bad version is README drift discovered six months later by a frustrated new hire. - **Time-to-first-success is known** — Someone owns the answer to how long it takes a new contributor to go from clone to a running app with real integrations, and that number is measured from real attempts rather than guessed. The capstone — only honest once the dimensions above hold, because otherwise the number is measuring confusion rather than setup. Stakeholders (maintainers, hiring managers, OSS contributors) can answer is onboarding getting better or worse without reading code; the failure mode is a team that believes setup takes 15 minutes because that is how long it takes them, while every newcomer quietly spends three hours.
Supabase Query Boundary
## Ownership Zone Every Supabase client call site in the application — the `.from(...)` queries, their select/insert/update/delete/upsert shapes, the error returns they hand back, the TypeScript types that describe their rows, and the row-level-security assumptions baked into how they're issued. This steward owns the boundary between the Next.js application layer and the Supabase schema: how queries are shaped, how failures surface, how column lists are declared, and how schema drift is caught before it reaches a rendered page or an API response. It also owns the legibility of that boundary to non-engineering stakeholders who need to answer questions like "did a schema change break the trips page last night?" without reading TypeScript. It does not own the database schema itself, the auth provider, or unrelated network I/O — only the call sites where the app talks to Supabase. ## Rubric - **Error-return discipline** — Every query destructures and handles the `error` return; a failed query never silently produces an empty array that the UI renders as "no data." This is the floor the rest of the rubric stands on: until errors are observed at the call site, every other dimension is grading queries whose failures are invisible. The bad version is the one where a 500 from Postgres becomes a blank page and nobody finds out for a week. - **Explicit query shape** — Selects name their columns; inserts and updates name their fields; nothing relies on `select('*')` or implicit "give me whatever is there." Without this, the typed-schema and drift-detection dimensions below are reasoning about a shape the code never declared. The failure mode is a column rename or removal that compiles cleanly and ships, because the query never said what it actually wanted. - **Typed schema contracts at the boundary** — Only meaningful once query shapes are explicit: rows returned from Supabase are typed against a generated or hand-maintained schema definition, and a column that disappears from the database becomes a TypeScript error rather than a runtime `undefined`. The rough heuristic for the bad version is grepping for `as any` near a Supabase call, or finding handlers that destructure fields the schema no longer has. - **RLS and access-path coherence** — Sits on top of the dimensions above: queries are issued with the right client (anon vs service role) for the trust level of the caller, and the RLS policies the app depends on are documented somewhere a developer can find without spelunking the Supabase dashboard. The failure mode is a service-role client used in a user-facing route "because it was easier," quietly bypassing the policies the rest of the app assumes are in force. - **Schema-drift response cadence** — Becomes possible once the boundary is typed and explicit: when the database schema changes, there is a known path — generated types regenerated, affected call sites identified, owners notified — and that path runs on a cadence, not in reaction to a production incident. A team without this dimension finds out about drift from a customer; a team with it finds out from a CI failure or a scheduled review. - **Boundary observability for non-engineers** — The capstone — only honest once the surface is consistent enough to measure. A product manager, ops person, or founder can answer "are Supabase queries failing more than usual?" or "which tables does the app actually touch?" without paging an engineer or reading source. The bad version is a steward that knows the call sites perfectly but whose health is locked behind a developer's terminal.
Plugin Release Coherence
## Ownership Zone Version, identity, MCP server name, skill slug, and install-instruction consistency across the marketplace manifest, plugin manifest, SETUP.md, and README for the Steward Claude Code plugin. ## Rubric - **Version synchronization** — Marketplace version, plugin version, and any version references in SETUP/README move together on every release; no stale version strings linger after a bump. - **Identity and naming consistency** — Plugin name, MCP server name, marketplace name, and brand references match across manifest, SETUP, README, and skill files; old names (e.g. contextgraph) do not leak back in after a rename. - **Skill registration parity** — Every shipped skill under plugins/steward/skills/ is reflected with its real slug (e.g. steward:define-steward) in README and SETUP verification steps, and removed skills are removed from docs. - **Install and verify instructions** — Documented install, reload, update, /mcp check, and skill-availability check match what the current marketplace and plugin manifests actually expose; commands users are told to run still work. - **MCP server contract surface** — The mcpServers.steward declaration in plugin.json (name, type, url) matches what skills and docs tell users to expect, and changes to the server name or transport are propagated through every artifact.
Agentsonar Website Experience
## Ownership Zone The complete user-facing web experience for Agentsonar — visual design, interaction patterns, information architecture, performance characteristics, and accessibility. This includes the public website surfaces, landing pages, navigation flows, form interactions, and the overall impression a visitor forms in their first minutes. The steward owns the relationship between what the product does and what a visitor understands it does, the clarity of the value proposition, and whether the site invites engagement or creates friction. ## Rubric - **Value proposition clarity** — A visitor in their first 30 seconds understands what Agentsonar does and why they should care. The core promise is stated plainly, not buried in jargon or abstract language, and the landing experience immediately answers the question a prospect is asking: what problem does this solve for me? Confusion or misdirection at this layer is the floor the rest of the experience stands on. - **Information architecture and navigation** — The site structure reflects how a visitor thinks about the product, not how the engineering team organized the code. A user can find what they need without hunting; related concepts live near each other, and the path from entry point to key actions is obvious. Poor IA makes every other dimension harder — a beautiful page nobody can find is invisible. - **Interaction responsiveness and smoothness** — Forms, buttons, and interactive elements respond immediately and predictably. Lag, unresponsive clicks, or unclear feedback on state changes create doubt about whether the product itself is reliable. Interactions should feel snappy enough that the user never wonders if they were heard. - **Visual consistency and brand coherence** — The site speaks in a single visual voice — consistent typography, color use, spacing, and component design across pages. Inconsistency reads as unfinished or untrustworthy. The visual language should reinforce the positioning: if Agentsonar is modern and precise, the design should feel that way. - **Accessibility and inclusive design** — The site is usable by people with different abilities: keyboard navigation works, color contrast is sufficient, text is readable, and interactive elements are discoverable without a mouse. This is not a nice-to-have; it is the floor for a professional product. Inaccessible sites exclude users and signal carelessness. - **Stakeholder alignment on positioning** — The founding team, product, and marketing agree on what the site is saying about Agentsonar and who it is for. Without this alignment, the site becomes a patchwork of conflicting messages. This dimension is invisible in the code but shows up in whether the site reinforces or undermines the company's strategy.
Navigation & Route Coverage
## Ownership Zone Owns the complete map of routes the site generates and the navigation fabric that connects them — the header and primary nav, category and index pages, in-content cross-links within guides and food entries, footer links, and any programmatic linking between related items. Responsible for knowing every URL the generator emits, whether each one is reachable from at least one navigation path, and whether every internal href resolves to a real generated route. Covers the lifecycle of new pages joining the site (a new food item or guide must be wired into navigation, not just generated) and the lifecycle of removed or renamed pages (inbound links must follow). Also owns the visibility of navigation health to non-engineering contributors — writers and editors adding content should be able to see whether their page is reachable without reading code. ## Rubric - **Route enumeration is ground truth** — There exists a single, trustworthy answer to the question what URLs does this site emit, derived from the generator itself rather than guessed from the file tree or scraped after deploy. This is the floor the rest of the rubric stands on: until route enumeration is reliable, every other dimension is grading work against an unknown denominator, and orphan or broken-link claims are unfalsifiable. - **Link integrity is enforced, not hoped for** — Every internal href the site emits points at a route that actually exists in the enumerated set, and a dangling link fails the build or a checked gate rather than shipping silently to readers. Only meaningful once route enumeration is ground truth; with that in place, link integrity becomes a mechanical check rather than a judgment call. The bad version is a site where 404s are discovered by users. - **Reachability is a property of every page** — Every generated page has at least one inbound navigation path from a known entry point (home, header, category index, or a guide that itself is reachable), and orphans are treated as defects rather than as content that exists but no one can find. Sits on top of route enumeration: you cannot count orphans until you can list pages. The failure mode is a page that exists at a URL but is invisible to anyone who didn't author it. - **Navigation reflects the content model** — Categories, indexes, and cross-links mirror the actual shape of the content (taxonomy, relationships between items and guides, hierarchy depth) rather than drifting into a historical artifact of how the site looked two redesigns ago. Becomes possible once reachability is solid; the question shifts from can users get there to can users get there the way the content suggests they should. The eye-roll version is a category page that lists six items while the generator emits sixty. - **Content authors can self-serve** — Writers and editors adding a new food item or guide can tell, before merging, whether their page will be reachable and whether their internal links resolve, without asking an engineer or waiting for a deploy. This is the stakeholder-facing dimension: excellence here is judged by whether non-engineering contributors are unblocked, not by how clever the tooling is. The bad version is a tribal-knowledge process where only the original author knows which nav file to edit. - **Change hygiene on rename and removal** — When a page is renamed, moved, or retired, inbound links and redirects are updated as part of the same change, and the steward's map reconciles rather than carrying ghost entries. Only meaningful once enumeration and link integrity are in place; without them, rename hygiene degenerates into chasing 404s reported by readers. Excellence looks like no link rot accumulating across releases. - **Navigation health is legible without code** — Counts of orphaned pages, broken internal links, and unreachable routes are visible to a non-engineer in a place they can find on their own, with enough history to tell whether things are improving or regressing. The capstone — only honest once the underlying enumeration, integrity, and reachability dimensions are solid enough that the numbers mean what they say.
Input Sanitization
## Ownership Zone Every user-facing input surface in the codebase — form fields, URL parameters, API request bodies, file uploads, and any data sourced from external systems — and the validation, escaping, and encoding logic that prevents malicious payloads from reaching execution contexts. This includes input validation at the boundary, output encoding for the rendering context (HTML, SQL, shell, JSON), and the relationship between declared input schemas and the actual sanitization applied downstream. The steward owns the gap between what a user can send and what the system safely executes. ## Rubric - **Boundary validation is declarative** — Input validation lives at the entry point and is expressed in a single source of truth — a schema, type definition, or validation rule that every handler consults. Without this, validation logic scatters across handlers and diverges; a field validated in one endpoint is trusted unvalidated in another, and the gap is invisible until exploit time. Validation is impossible to skip by accident. - **Output encoding matches the context** — Data is encoded for the specific context it enters — HTML entities for HTML, SQL escaping for queries, shell quoting for commands, JSON escaping for JSON. A single encoding function applied everywhere is a sign that the team does not distinguish contexts; the same string safe in HTML is dangerous in SQL. Encoding is applied at the point of output, not assumed to have happened upstream. - **Injection vectors are named and tested** — The team knows which inputs can reach which execution contexts and has written tests that verify each vector is blocked. Without this, injection risks hide in the gap between what the team thinks is validated and what actually is. A new feature that adds a path from user input to a database query is a typed change that surfaces the injection test, not an implicit assumption. - **Dangerous operations are explicit** — Code that interprets user input as code — eval, dynamic SQL construction, template injection, unsafe deserialization — is visible and rare. If the codebase uses these patterns, they are justified in comments, isolated to a small surface, and guarded by strict input constraints. A reader should be able to find every place user input flows into code execution in under a minute. - **Validation failures are observable** — When input validation fails, the event is logged with enough context to detect patterns — repeated failures from the same source, systematic probing of a field, or a new attack vector. A validation failure that disappears silently or is only visible in a debug log is a missed signal; the team should be able to answer whether they are under attack without reading code. - **Security assumptions are documented** — The team has written down what they assume about input — which fields are trusted, which are user-controlled, which sanitization is applied where, and what the consequences are if an assumption breaks. Without this, the next engineer assumes the wrong thing and introduces a gap. Documentation is updated when assumptions change, not written once and forgotten.
Knowledge Store Integrity
## Ownership Zone The repository knowledge store — docs/, AGENTS.md, and ARCHITECTURE.md — keeping repository knowledge synchronized with repository state across quality, discoverability, traceability, structure, and coverage. ## Rubric - **Knowledge Freshness** — Generated and SYNC artifacts (db-schema, api-surface, dep-graph, repo-map) are regenerated to match current repository state; stale generated docs are caught. - **Knowledge Discoverability** — Docs live in the correct tier/location and are reachable from entry points (README, AGENTS.md, docs indexes); nothing is orphaned or misfiled. - **Cross-Reference Integrity** — Internal links and file-path references between docs, and from docs to code, resolve to real targets; no broken or dangling references. - **Traceability** — Each generated/analysis artifact names its source, and decision/history docs link to the commits, PRs, or canonical intent that justify them. - **Documentation Drift** — Narrative and canonical docs (ARCHITECTURE.md, docs/canonical/architecture.md) accurately describe current repository reality; divergences are flagged per the SYNC vs ASYNC tier rules. - **Repository Coverage** — Every significant repository asset (system, package, app, route, table, steward) is represented somewhere in the knowledge store; undocumented assets are detected.
Image Asset Health
## Ownership Zone Every image asset the site depends on — food item photos, guide illustrations, and the OG image generation pipeline — together with the references that bind them to content entries, components, and route templates. This covers the full lifecycle: which images exist on disk, which are referenced, which are generated on demand, whether each rendered page resolves to a real file, and whether the social-sharing surface produces valid output for every route. The zone includes the inverse direction too: assets that exist but are no longer referenced, and references that point at paths nothing produces. It does not extend to image content choices or visual design — only to whether the pipeline from authored reference to delivered pixels is intact, lean, and observable. ## Rubric - **Reference resolvability** — Every image path named in content, components, or templates resolves to a real, non-empty file at build time, and an unresolvable reference fails the build loudly rather than shipping a broken `<img>` tag to production. This is the floor the rest of the rubric stands on: until references resolve, sizing, generation, and orphan hygiene are all grading work that may render as a broken icon anyway. - **Generated-image pipeline integrity** — Routes that rely on generated imagery (OG cards, derived thumbnails, templated illustrations) produce valid, correctly-dimensioned output for every input the route can receive, not just the handful exercised during development. The bad version of this dimension is a generator that silently emits a 0-byte file or a fallback placeholder for half the catalogue and nobody notices until a link is shared. - **Asset library hygiene** — The set of files on disk stays close to the set of files actually referenced; orphans are pruned on a known cadence rather than accumulating as repo weight, and additions are deliberate rather than drive-by. Only meaningful once reference resolvability is in place — otherwise pruning is dangerous because you cannot trust the reference graph you are pruning against. - **Delivery weight discipline** — Images are sized, compressed, and formatted for the surface that actually consumes them, with the source-of-truth original kept separate from the web-delivery variant. A rubric-failing setup ships 4MB hero JPEGs to mobile, has no convention for which dimensions and formats are canonical, and treats every new image as a one-off decision. - **Authoring ergonomics** — Sits on top of the dimensions above: a content author can add a new food item or guide without learning the asset pipeline, knows exactly where to drop the image and how to reference it, and gets immediate feedback when they get it wrong. When this fails, you see the same handful of engineers re-explaining the conventions in PR review and authors avoiding image-heavy entries entirely. - **Stakeholder-facing visibility** — The capstone — only becomes possible once the surface is consistent enough to measure honestly. A non-engineer (content owner, founder, marketer checking a social share) can answer questions like how many pages have working previews, which entries are missing imagery, and whether last week's content drop rendered cleanly, without asking an engineer to grep the repo.
GitHub GraphQL Boundary
## Ownership Zone Every GitHub GraphQL query the application and MCP server issue, the TypeScript types those queries map onto, and the proxy layer that mediates between the GitHub API and the rest of the app. Covers query authoring and naming, schema validation against the live GitHub schema, response type fidelity, the handling of GraphQL-level and HTTP-level error paths (auth, rate limits, partial-data responses, network failures), and the visibility of API health to anyone debugging a broken UI state. The zone ends where domain logic begins — once a typed, validated response leaves the boundary, downstream concerns belong to other stewards. ## Rubric - **Schema-anchored queries** — Every query is checked against the real GitHub GraphQL schema as part of the normal development loop, not as a manual ritual. This is the floor the rest of the rubric stands on: until queries are anchored to the schema, type fidelity and error handling are grading work that may already be wrong. A renamed or removed field fails at build or CI time, not at runtime in front of a user, and the validation surface is impossible to bypass by accident. - **Type fidelity end-to-end** — Only meaningful once schema anchoring is in place: response types reflect what the schema actually returns, including nullability, union variants, and connection shapes. Raw API payloads do not enter the app via unchecked casts that paper over drift; when the schema changes, the type system surfaces every consumer rather than letting a silently-wrong shape propagate into rendering code. - **Explicit failure surface** — Each distinct failure mode at the GitHub boundary — network error, non-2xx HTTP, GraphQL errors array, partial data, 401 auth, 403/429 rate limit, timeout — has a named, structured handling path. Bad practice here is the catch-all that turns six different failures into one opaque message; good practice is that a caller can tell auth failure from rate limiting from a malformed query without reading the proxy source. - **Query hygiene and discoverability** — Queries are named, colocated with their types, and easy to enumerate. A practitioner asking what does this app ask GitHub for? can answer it from a single inventory rather than grepping. Anonymous one-off queries scattered across handlers are the failure mode this dimension calls out; a clean zone makes it obvious which queries exist, who calls them, and what schema surface they depend on. - **Boundary discipline** — Builds on type fidelity: the proxy is the only path between the app and GitHub, and it is the only place that knows about GitHub-specific concerns (auth headers, rate-limit semantics, GraphQL error shape). Domain code does not reach around the boundary, and the boundary does not leak GitHub-shaped error objects or untyped blobs into domain code. Violations show up as duplicated request logic or domain modules importing GitHub SDK types directly. - **Operator-visible API health** — The capstone, only possible once the failure surface is explicit and queries are enumerable: when the dashboard is empty or stale, a non-engineer can tell whether GitHub returned an error, rate-limited the app, returned partial data, or simply had nothing to show. Per-query failure rates, recent rate-limit hits, and auth status are visible without reading code, so debugging a broken UI state does not start with paging an engineer to add logging.
Env Config Safety
## Ownership Zone Owns the application's environment-variable configuration surface end to end: which variables are required, how they are validated, where they are read, how they are documented for new contributors, and how secrets are separated from public/feature-flag values. Covers the canonical validation module, the public env example file, and every consumer that reads configuration anywhere in the codebase. Responsible for the contract between the running application and its deployment environment — making sure missing or malformed configuration fails loudly at startup rather than silently degrading features in production. Also responsible for keeping the developer-onboarding and operator-handoff story honest, so that someone setting up a new environment knows exactly what to provide and what each value is for. ## Rubric - **Single point of access** — All configuration is read through one canonical, validated module; raw environment lookups scattered across the code are treated as bugs, not style preferences. This is the floor the rest of the rubric stands on: until every consumer goes through one path, validation, documentation, and secret hygiene are all grading a surface they don't actually control. The bad version is a codebase where each feature reaches into the environment on its own and "is this set?" has a different answer in every file. - **Fail-fast on startup** — Only meaningful once a single point of access exists: with one entry point, missing or malformed values can be caught before the app serves a single request, with an error message that names the variable and what it is for. The failure mode this rules out is the silent one — a feature that appears to work in development and quietly no-ops or 500s in production because a key was never set. Required vs. optional is an explicit decision per variable, not an accident of which code path runs first. - **Typed and narrowed values** — Sits on top of fail-fast validation: once a value is required, it is also coerced to its real shape (URL, boolean, enum, integer) and exposed to consumers as that type. Booleans aren't compared as strings, numeric limits aren't parsed at every call site, and an enum-shaped flag with an unexpected value is rejected at the boundary rather than silently falling through to a default branch downstream. - **Secret vs. public discipline** — Public values (anon keys, feature flags, client-side URLs) and true secrets (server-side API keys, signing keys) are separated by naming convention and by where they are allowed to be read. A practitioner can tell at a glance which bucket a variable is in, and the build cannot accidentally ship a server secret into a client bundle. The bad version is a flat list where everything looks the same and the only thing standing between a secret and the browser is somebody remembering. - **Onboarding and operator clarity** — Visible from outside the codebase, not from inside it: a new developer or a deploy operator can stand up a working environment from the documented example without reading source code, and every required variable has a placeholder, a one-line description, and a pointer to where to obtain it. Drift between the validation module and the example file is the canonical failure mode here — silently undocumented requirements that break new setups weeks after the variable was added. - **Change visibility for stakeholders** — The capstone — only becomes possible once the surface is unified, validated, and documented. When configuration requirements change (a new integration, a renamed key, a flag flipped on in production), the change is legible to the people who have to act on it: ops knows what to set, product knows which flag controls which behavior, and a non-engineer can answer "is this feature on in production?" without grepping the repo. The bad version is configuration changes that land as silent commits and surface as incidents.
CSP Policy Integrity
## Ownership Zone Every Content Security Policy directive served by the Next.js frontend — script-src, frame-src, connect-src, style-src, img-src, font-src, and the rest — along with each allowed origin, hash, or nonce, the feature or integration that justifies it, and the mechanism (middleware, headers config, meta tag) that delivers the policy to the browser. The zone covers how the policy is composed, how it is rolled out (report-only vs enforcing), how violations are observed, and how the policy stays aligned with the actual set of third parties the product depends on. It also covers the human-facing side: whether product, security, and integration owners can answer what is allowed, why, and what would break if it were removed. It does not own the third-party scripts themselves or the application code that uses them — only the trust boundary that decides what the browser is permitted to load and execute. ## Rubric - **Directive completeness and precision** — The floor the rest of the rubric stands on. Every fetch directive a modern app needs is explicitly set rather than inherited from default-src by accident, and each one lists the narrowest set of sources that actually make the feature work. The bad version is a single sprawling default-src with wildcards and a script-src that grew by accretion; the good version is a policy where you can point at any entry and name what would break without it. - **Provenance of every allowance** — Every origin, hash, and nonce in the policy traces back to a specific feature, vendor, or integration, recorded somewhere a human can read. Without this, the directive surface becomes a graveyard of entries no one dares delete; with it, removing a vendor is a normal cleanup task instead of a multi-hour archaeology dig. This is the dimension the directive inventory and justification-coverage metric exist to make reportable. - **Nonce and hash discipline over unsafe-inline** — Inline scripts and styles are admitted via per-request nonces or content hashes, not via blanket unsafe-inline or unsafe-eval escape hatches. The contrast: a policy that looks strict on paper but quietly carries unsafe-inline because one analytics snippet needed it three years ago is failing this dimension, even if every other directive is tight. - **Violation observability** — Only meaningful once the policy is precise enough to trust: a noisy policy produces noisy reports no one reads. CSP violation reports are collected, deduplicated, and routed somewhere a human actually looks, with enough context (directive, blocked URI, source file, user agent) to tell a real attack or regression apart from a browser extension. Silent enforcement with no report sink is the failure mode this calls out. - **Safe rollout and change discipline** — Becomes possible once observability is in place. New directives or tightened ones go through report-only before enforcement, changes are reviewed against the inventory rather than appended blindly, and there is a known path to ship a fix when a third party rotates a domain. The bad version is editing the policy directly in production and finding out from customer reports. - **Stakeholder legibility** — The capstone, and the dimension that fails most quietly. A non-engineer — a security reviewer, a vendor-onboarding PM, a compliance auditor — can answer what third parties the site trusts, why each is trusted, and what changed last quarter, without reading middleware source. If that question requires grepping the repo, the policy is technically correct but organizationally opaque.
STT Provider Boundary
## Ownership Zone Owns the contract surface between the transcription router and every speech-to-text provider implementation it dispatches to — currently Google Cloud Speech, OpenAI Whisper, GPT-4o Audio, Qwen3-ASR-Flash, and ElevenLabs Scribe, plus any future addition. Responsibilities span the request/response adapter for each provider, audio format and language code normalization, error and timeout semantics, model and version pinning, feature-flag and routing rules that select a provider, and the fallback behavior when a provider degrades or deprecates a model. Also owns the observability of provider behavior — latency, error rates, transcription quality signals — at a granularity that lets the team reason about which provider to trust for which traffic. Does not own the upstream audio capture pipeline, downstream consumers of transcripts, or the router's business-logic decisions beyond the provider-selection layer. ## Rubric - **Adapter contract uniformity** — Every provider sits behind the same input/output shape, the same error taxonomy, the same timeout and cancellation semantics, and the same handling of audio format, sample rate, and language code. This is the floor the rest of the rubric stands on: until the contract is uniform, routing decisions, quality comparisons, and fallback logic are all comparing apples to oracles. The bad version is each provider leaking its SDK's quirks — one returns segments, another returns a flat string, a third throws a vendor-specific error type — and callers branching on provider identity. - **Version and model pinning discipline** — Each provider call names an explicit model and API version rather than riding the vendor default, and the pinned version is tracked somewhere a human can read without grepping. Only meaningful once the adapter contract is uniform, because otherwise version drift hides inside per-provider quirks. The failure mode this calls out: a vendor silently rotates the default model, transcription characteristics change overnight, and nobody can say which deploy introduced the shift. - **Deprecation and change awareness** — Someone is responsible for knowing when each provider is deprecating a model, changing pricing, changing rate limits, or shipping a breaking API change, and that knowledge has a place to live other than one engineer's inbox. This dimension is not visible from the codebase alone — it lives in vendor changelogs, status pages, and account-rep emails. The bad version is finding out a model was sunset because production started 404ing. - **Routing and fallback intent is legible** — The rules that send a given request to a given provider — feature flags, traffic splits, language-based routing, cost tiers, A/B tests — are explicit, named, and explain *why* they exist, and fallback chains have defined trigger conditions rather than ad-hoc try/except. Sits on top of the uniform adapter contract: you can only route confidently across providers whose contracts you trust to behave the same. The failure mode is a tangle of conditionals where nobody can answer which provider a given customer's audio is hitting today, or what happens when it fails. - **Per-provider quality and reliability is measured** — Latency, error rate, timeout rate, and a transcription-quality signal (WER on a held-out set, human spot-checks, downstream rejection rate, or similar) are tracked per provider and per model version, at a granularity that lets the team notice regressions within days, not quarters. Becomes possible once pinning and uniform contracts are in place, because otherwise you cannot attribute a quality dip to a specific provider-and-version pair. The bad version is a vague sense that one provider is better without numbers to back it. - **Stakeholder-answerable provider posture** — A non-engineer — product, ops, support, finance — can get answers to questions like which provider is handling which traffic right now, what we pay per minute by provider, when we last switched a default, and what we'd lose if a given vendor went down tomorrow. This is the capstone: it only becomes honestly answerable once routing is legible and per-provider metrics exist. The failure mode is every such question becoming a half-day engineering investigation, and provider decisions getting made on vibes because the data is locked inside code.
OAuth Session Integrity
## Ownership Zone Owns the GitHub OAuth flow end-to-end — login initiation, callback handling, session establishment, and logout — and the full lifecycle of every httpOnly cookie token stored on behalf of the user (GitHub, CircleCI, Anthropic, and any future provider tokens that ride the same cookie surface). Responsible for how token expiry, revocation, corruption, and CSRF-class attacks are detected and surfaced, so that a stale or hostile credential fails cleanly at the auth boundary rather than cascading into downstream API routes. Guards the contract between edge-runtime auth routes and server-side proxying routes: which routes are allowed to assume a valid session, how that assumption is validated, and what happens when it does not hold. Also owns the operator-facing visibility into auth health — who is logged in, why logins fail, and which routes are protected — so that session-layer incidents are diagnosable without grepping the codebase. ## Rubric - **Cookie hygiene as the foundation** — Every token cookie is httpOnly, scoped, signed/encrypted as appropriate, and has a single owner that knows its set, read, and clear paths. This is the floor the rest of the rubric stands on: until cookie semantics are unambiguous, every other dimension is reasoning about state that other code paths can quietly mutate. The bad version is tokens written in one place and forgotten in another, where logout leaves residue and nobody can say which routes touch which cookie. - **CSRF and callback integrity** — The OAuth callback verifies that the response it is processing is the one this browser initiated: state parameter generated, stored, and checked; redirect targets constrained to a known set; replayed or cross-origin callbacks rejected loudly. Builds directly on cookie hygiene, since state itself rides the cookie surface. The failure mode this dimension exists to prevent is a callback that happily mints a session for whoever shows up with a valid-looking code. - **Failure-mode behavior under bad credentials** — Expired, revoked, malformed, and impersonated tokens produce a single well-defined outcome at the auth boundary: the session is invalidated, the user is sent through re-auth, and downstream handlers never see a half-valid credential. Only meaningful once cookie hygiene and callback integrity are in place; otherwise the system cannot tell a bad token from a missing one. The bad version is a 500 from a deep API call because a GitHub token silently expired three days ago. - **Route auth contract clarity** — Every server route falls into a known category — public, session-required, session-optional, internal — and the category is enforced in one obvious place rather than re-derived per handler. This sits on top of failure-mode behavior: a route only benefits from a clean failure path if it actually invokes the validator. The bad version is the auth check copy-pasted into some handlers, forgotten in others, and impossible to audit without reading every file. - **Stakeholder visibility into auth health** — Non-engineering stakeholders (support, ops, the person triaging a Monday-morning incident) can answer questions like did logins start failing last Thursday, is this user actually authenticated, and which provider token is stale — without paging an engineer to read logs. This dimension is not visible from the codebase alone; it is judged by whether the people downstream of the auth boundary can self-serve. Becomes possible only once the route contract and failure modes are consistent enough to measure honestly. - **Cross-provider token coherence** — When more than one provider's token rides the same session, their lifecycles are reasoned about together: a revoked GitHub token does not leave a live CircleCI cookie behind, and adding a new provider follows a known pattern rather than inventing a fourth cookie shape. This is partly an organizational property — it depends on whoever adds the next provider knowing the pattern exists — and partly a code property. The bad version is each provider integration looking like it was written by someone who had never seen the others. - **Auditability of session decisions** — Every session-affecting decision (issued, refreshed, rejected, cleared) leaves a trace that an operator can reconstruct after the fact, with enough context to distinguish user error from attack from bug. The capstone dimension: only meaningful once the decisions themselves are consistent across cookies, callbacks, failure modes, and routes. The bad version is a user reporting they were logged out and nobody, including the steward, being able to say why.
Layer Boundary Integrity
## Ownership Zone Monorepo layering and import-direction rules: the apps→systems→packages dependency flow, packages staying generic, systems staying infrastructure-free, and no cross-system imports. ## Rubric - **Import direction** — Dependencies flow apps→systems→packages only. packages never import systems or apps; systems never import apps. - **Cross-system isolation** — No system imports another system. Shared needs are extracted into a package, not reached across systems/. - **Package purity** — packages/ stay reusable and generic — no business logic or system-specific domain concepts leak in. - **System purity** — systems/ hold business logic only — no infrastructure wiring (db clients, provider SDK setup, deploy concerns) belongs there. - **Placement correctness** — New code lands in the layer the AGENTS.md 'Where Things Go' table dictates: integrations, prompts, workflows, and services in their designated paths.
WCAG 2.2 AA Compliance
## Ownership Zone Every user-facing surface in the workspace — pages, components, interactive widgets, forms, navigation, media, and dynamic content — held to WCAG 2.2 AA. The zone covers semantic structure and landmarks, keyboard operability and focus management, screen reader exposure (names, roles, states), color and non-color contrast, motion and timing, error identification and recovery, and the assistive-technology behavior of any custom or third-party UI. It also covers the supporting practice around compliance: how new work is gated before merge, how known gaps are tracked and prioritized, and how non-engineering stakeholders (product, legal, support) can answer questions about the workspace's accessibility posture without reading code. ## Rubric - **Semantic foundation** — Pages are built from real landmarks, headings in a sensible order, native form controls with associated labels, and lists that are actually lists. This is the floor the rest of the rubric stands on: contrast tweaks and ARIA polish on top of div soup buy nothing, because assistive tech has nothing to anchor to. The bad version is a tree of generic divs with role attributes sprinkled on top to simulate structure that should have been there from the start. - **Keyboard and focus discipline** — Every interactive element is reachable and operable by keyboard alone, focus order matches visual order, focus is visible at all times, and focus is managed deliberately when content moves (dialogs, route changes, disclosure). Only meaningful once the semantic foundation is real, since focus follows the document model. The failure mode this calls out is the invisible focus ring, the tab that escapes into a modal's backdrop, and the route change that strands a screen reader on stale content. - **Assistive-technology truthfulness** — What a screen reader announces matches what a sighted user perceives: accessible names exist and are accurate, state changes (expanded, selected, busy, invalid) are exposed, dynamic updates reach users via live regions or focus moves, and ARIA is used to fill gaps in native semantics rather than to paper over the wrong element. Sits on top of the semantic foundation; without it, ARIA becomes decoration. The bad version is a button labeled icon, a toggle whose pressed state never changes, and a toast no one hears. - **Perceivable presentation** — Text and meaningful non-text content meet contrast minimums, information is never conveyed by color alone, content reflows without loss at 400% zoom and 320 CSS pixels wide, and motion respects user preferences. This dimension is largely assessable from rendered output, and is where automated tooling earns its keep — but only catches the floor, not the ceiling. - **Pre-merge accessibility gate** — Not visible from a code snapshot alone; this is a property of how the team works. New and changed surfaces are checked against AA before they ship, automated checks block on regressions rather than warn, and authors know which manual checks (keyboard pass, screen reader smoke test) are expected for the kind of change they made. The contrast is a team where accessibility is a quarterly cleanup pass versus one where a regression cannot reach main. - **Known-gap hygiene** — Also a practice property, not a code property. Every known violation has an owner, a severity tied to user impact (not just rule id), and a remediation state that ages visibly; nothing rots silently in a backlog labeled accessibility. The failure mode is a five-year-old issue list where no one can tell which items are still real, which are duplicates, and which already shipped fixes. - **Stakeholder legibility** — The capstone — only possible once the gate and the gap list are honest. A product manager, support lead, or legal reviewer can answer questions like what is our current AA coverage, which surfaces are known-noncompliant, and what is the remediation timeline without paging an engineer or reading a PR. The bad version is an org that believes it is compliant because no one has asked recently.
PostHog Event Integrity
## Ownership Zone Every PostHog integration point across the platform — SDK initialisation and provider wiring on the web surface, every capture, identify, and group call site, autocapture and session replay configuration, feature-flag usage, and the relationship between events emitted in code and what growth, product, and founders consume downstream in PostHog dashboards, funnels, and retention reports. The zone extends to instrumentation gaps in adjacent surfaces (such as CLI or server-side tooling) where product-critical flows happen outside the browser and represent blind spots in the user journey. It also covers the event taxonomy itself — the naming conventions, property shapes, and type-safety guarantees that determine whether data arriving in PostHog is queryable signal or accumulating noise. The steward owns the contract between the code that emits events and the humans who try to answer questions from them. ## Rubric - **Event taxonomy discipline** — Every event name follows a single documented convention and the convention is enforced at the call site, not by downstream cleanup or rename rules in the warehouse. The failure this guards against is the same logical moment shipped under three slightly different string literals from three components, producing three lines in PostHog where there should be one. This is the floor the rest of the rubric stands on: no other dimension is meaningful if the taxonomy is incoherent, because every funnel and dashboard sits on top of names. - **Type-safe emit boundary** — Tracking calls reference a shared, typed catalogue of event names and property shapes rather than passing ad-hoc string literals and untyped property bags. Without this a typo or a renamed property silently breaks a funnel and nobody notices until a quarterly review. Builds directly on taxonomy discipline — the catalogue is the taxonomy made enforceable, and the compiler becomes the first reviewer of every analytics change. - **Identify and group hygiene** — Identify fires at session-start and auth-state-change with a stable user ID, and group associates users with their org or tenant where applicable, before any meaningful event is captured in that session. Without this events land as anonymous noise and org-level analytics are fiction; funnels built on unidentified events silently undercount conversion. Sits alongside taxonomy discipline as a foundational concern — a clean name on an anonymous event is still a half-measurement. - **Coverage of meaningful moments** — Signup, activation, the handful of key product actions, upgrade, error states, and churn-risk moments all fire an event, and coverage is judged by whether a product or growth stakeholder can answer what happened in the user journey from PostHog alone without asking an engineer to query the database. The bad version is a dashboard full of pageviews and autocapture clicks with no domain verbs, where every real question requires a SQL detour. Only meaningful once the taxonomy is stable enough that adding a new event doesn't create ambiguity with existing ones. - **SDK configuration consistency** — PostHog is initialised once per surface with explicit, reviewed settings for autocapture, session replay, cross-subdomain tracking, PII redaction, and feature-flag bootstrap, and those settings agree across client and server and across environments. Configuration disagreements produce data that looks correct in staging and breaks in production, or worse, leaks PII that a privacy review assumed was redacted. Becomes auditable once identify hygiene is in place, because misconfigured init is invisible when users aren't identified. - **Dashboard-to-code alignment** — Every event referenced in a dashboard, funnel, or insight corresponds to a live capture call, and every capture call is consumed by at least one downstream artefact a stakeholder actually looks at. Orphaned dashboard references produce silent zeros that erode trust in the analytics surface; orphaned capture calls waste payload and clutter the event stream so newcomers can't tell signal from legacy. This is a capstone dimension — only meaningful once the taxonomy, type safety, and coverage dimensions are healthy enough that the catalogue of events is stable and enumerable on both sides. - **Analytics health legibility** — A non-engineer can answer are events still flowing and did we lose tracking last week without paging someone, because ingestion volume, event-type cardinality, and identify-rate are monitored or at least reviewed on a known cadence. The bad version is discovering a three-week instrumentation outage when a board deck is being prepared. Sits on top of every other dimension: you can only monitor what you've named, typed, identified, and wired to something a stakeholder reads.
Accessibility Baseline
## Ownership Zone Every interactive surface on the site that a non-mouse, non-sighted, or assistive-technology user has to navigate — focus order and focus visibility, keyboard reachability of all controls, semantic roles and ARIA attributes, accessible names and descriptions, color contrast and motion preferences, and the live behavior of media controls (audio play/pause, captions, transcripts) and custom widgets like the phone mockup. Covers the full path from page structure (landmarks, headings, skip links) through component-level behavior (buttons, links, menus, dialogs) to dynamic states (loading, error, expanded/collapsed). Includes the relationship between the rendered DOM and what assistive tech actually announces, and the visibility of accessibility health to non-engineering stakeholders who need to know whether the site meets the standard the org has committed to. ## Rubric - **Semantic foundation** — The page is built from real HTML elements with correct roles and a sane heading and landmark structure; custom widgets only reach for ARIA when no native element fits, and never to paper over the wrong element underneath. This is the floor the rest of the rubric stands on: every downstream dimension assumes assistive tech is being handed a structure that means what it looks like, and a div-soup page with bolted-on roles makes keyboard and screen-reader excellence impossible to achieve no matter how much polish goes on top. - **Keyboard parity** — Anything a mouse user can do, a keyboard user can do in a predictable order, with a focus indicator that is always visible and never trapped where it shouldn't be. The bad version is the one where Tab skips a custom control entirely, or lands on it but Enter and Space do nothing, or opens a modal that the user cannot escape — keyboard parity is judged by walking the page with the mouse unplugged, not by reading the code. - **Accessible naming and state** — Every interactive control has a name a screen reader will actually speak, and its state (pressed, expanded, selected, busy, disabled) is exposed programmatically and stays in sync as the UI changes. Only meaningful once the semantic foundation is in place; until then, a correct aria-label is being attached to the wrong kind of element. The failure mode is the button announced as button, button, button across a whole toolbar, or the toggle whose visual state and aria-pressed have drifted apart. - **Media and motion respect** — Audio and video controls are operable without a mouse, captions and transcripts exist for spoken content, autoplay does not hijack focus or sound, and animations honor prefers-reduced-motion. Sits on top of keyboard parity and accessible naming: a media player that fails those is not made accessible by adding a transcript. The bad version is the one where the only way to pause the looping background audio is to find a control no screen reader announced. - **Lived testing with real assistive tech** — Excellence is judged by how the site behaves under an actual screen reader and keyboard, on the platforms users are on, not by automated scan scores alone. This dimension is largely invisible from the codebase: it lives in whether someone on the team has run VoiceOver, NVDA, or TalkBack on the real flows recently, and whether known assistive-tech quirks are tracked rather than rediscovered. Automated checks catch missing alt text; they do not catch a focus order that makes no narrative sense. - **Standard and stakeholder legibility** — The team has named the conformance target it is holding itself to (e.g. a specific WCAG level) and a non-engineering stakeholder — product, legal, a partner asking about compliance — can find out where the site stands against that target without reading code or filing a ticket. Becomes possible once the dimensions above are real enough to measure honestly; before then, any status report is fiction. The failure mode is the org that claims a conformance level in marketing copy while no one internally can point to what is and isn't covered.
Subscription & Usage Guardrails
## Ownership Zone Subscription lifecycle state machines, usage metering, free-tier enforcement, Stripe billing integration, and API access gating. ## Rubric - **State machine integrity** — Subscription status transitions (free_tier_active → grace_period → exceeded; active → past_due → unpaid → canceled) match the intended lifecycle, leave no orphan states, and trigger the correct side effects (content lock/unlock, emails, analytics). - **Usage metering accuracy** — CloudFront log parsing, bandwidth aggregation, storage tracking, and Stripe metered billing event submission faithfully reflect real consumption without double-counting or data loss. - **Free tier enforcement** — Limits (video count, file size, bandwidth), grace period timing, alert email thresholds, and content locking/unlocking apply consistently and at the correct thresholds defined in subscription constants. - **Access gating consistency** — SubscriptionGuard, plan checks, skipSubscriptionGuard decorators, and demo user exceptions enforce the correct access boundary for every API route without gaps or false blocks. - **Stripe webhook fidelity** — Incoming Stripe subscription and checkout events map to the correct internal state changes without gaps, silent failures, or status/plan mismatches between Stripe and the subscriptions table.
Code Hygiene
## Ownership Zone I own the ongoing campaign against accumulated cruft across the phin repositories — unused functions, unreferenced variables, dead imports, unreachable branches, commented-out code, orphaned files, and the lint and style violations that obscure what is actually live. My territory spans detection (knowing what is dead and proving it), removal (safely excising it without breaking implicit consumers), and prevention (keeping new accumulation from outpacing cleanup). I also own the legibility of the cleanup queue itself: what is pending, what was removed, and whether the trend is improving or degrading. I do not own architectural refactors, performance work, or test quality — only the discipline of keeping the surface area honest about what the code actually uses. ## Rubric - **Deadness is provable, not guessed** — The floor the rest of the rubric stands on. Before anything is removed, there is a defensible answer to how we know this is unused: static analysis, reference search, runtime telemetry, or explicit deprecation window. A bad practice removes things that look unused and learns from production breakage; a good one distinguishes genuinely dead code from code reached through reflection, dynamic dispatch, public API, or external callers, and treats the second category with appropriate caution. - **Lint and style speak with one voice** — Only meaningful once deadness is provable, because lint is the cheapest signal that something is unreferenced. The configured rules are consistent across the repo surface, violations either fail CI or are tracked with an expiry, and disables are justified inline rather than scattered as silent escape hatches. The failure mode this guards against: a lint config that warns about everything, blocks nothing, and trains everyone to ignore the output. - **Removal is reversible and reviewable** — Sits on top of the two dimensions above: once you can prove deadness and trust the lint signal, removals become small, isolated commits rather than sweeping purges. Each cleanup is scoped tightly enough that a reviewer can verify the claim of unused-ness, and the commit history makes it cheap to resurrect something if a hidden caller surfaces. Bad practice batches a thousand deletions into one untestable PR; good practice leaves a trail you can bisect. - **Accumulation is bounded, not just cleaned** — Becomes possible once removal is routine: the question shifts from how do we catch up to whether new cruft is entering faster than it leaves. There are guardrails — pre-commit checks, CI gates, or codeowner review — that catch dead imports and unused exports at the boundary, so cleanup work compounds instead of resetting every quarter. - **The backlog is legible to non-engineers** — A stakeholder-facing dimension. A product manager, tech lead, or founder can answer is hygiene improving or degrading without reading code or paging an engineer: the queue of pending cleanups has a visible depth, a trend, and an owner. The failure mode is hygiene as folklore — everyone agrees the codebase is messy, no one can point to a number, and the work is invisible until someone complains. - **Cleanup is decoupled from feature work** — An organizational property, not a code property: the team has an explicit cadence or budget for hygiene work, and it is not held hostage to whichever feature happens to touch the same file. Bad teams clean up only when they trip over something; good teams treat hygiene as scheduled maintenance with a known owner, so the rubric above can actually be enforced rather than aspired to.
Phlex Component Contracts
## Ownership Zone Every Phlex component class in the application — the Components::Base and Views::Base subclass hierarchy, their rendered HTML output, their behavior under nil and missing data, and their adherence to the shared RubyUI/Phlex conventions that hold the component library together. The zone covers the rendering contract each component exposes (what props it accepts, what HTML it produces, what it does when inputs are absent or malformed), the unit-level rendering tests that pin those contracts down, and the consistency of patterns across the hierarchy so that designers, product, and engineers can predict what a component will do without reading its source. It does not own page-level integration flows, controller logic, or styling decisions made outside the component layer — only the component-as-contract. ## Rubric - **Render-without-crashing floor** — Every component can be instantiated and rendered with its declared inputs without raising. This is the floor the rest of the rubric stands on: until rendering itself is reliable, nil-safety, output quality, and consistency are grading something that may not even reach the browser. A component that crashes on a missing optional prop, an empty collection, or a nil association is failing this dimension regardless of how clean its API looks. - **Nil and edge-input behavior is explicit** — Builds directly on the rendering floor: each component has a defined, tested answer for nil values, empty strings, empty collections, and missing optional associations — render nothing, render a placeholder, or fail loudly — and that answer is the same one a caller would guess from the component's name and props. The bad version silently swallows nils in some components and NoMethodErrors in others, so callers learn through production incidents which components tolerate which inputs. - **Output is valid, semantic HTML** — Components emit well-formed markup with correct nesting, appropriate semantic elements, and accessible attributes — not div soup that happens to look right in one browser. Only meaningful once rendering and nil-handling are stable; otherwise output validity is being judged on a sample that excludes the cases that actually break. - **Pattern consistency across the hierarchy** — Components that do similar jobs look similar: prop names, slot conventions, naming of variants, and the line between Components and Views are followed the same way across the library. The bad version is three different ways to pass children, two spellings of the same prop, and a Views class doing what a Component should do — every new contributor has to re-learn the library from scratch. - **Contracts are legible to non-engineers** — A designer, a PM, or a new engineer can answer what a component does, what inputs it takes, and what it looks like in its main states without reading its Ruby source. This dimension is invisible from the code alone: it lives in component catalogs, preview pages, naming, and the shared vocabulary the team actually uses in design reviews. Without it, the component library is a private dialect and every cross-functional conversation routes through an engineer. - **Change confidence** — Sits on top of every dimension above: a team can only refactor a base class, rename a prop, or upgrade the underlying Phlex/RubyUI version with confidence when rendering, edge inputs, output validity, and conventions are pinned down by tests. The bad version is a component layer everyone is afraid to touch, where improvements stall because no one can tell what a change will break.
Next.js Upgrade Resilience
## Ownership Zone Owns the resilience of the Next.js and React framework surface across upgrades — the pinned versions of next, react, react-dom, and eslint-config-next; the App Router conventions (segment filenames, route groups, layouts, server vs client component boundaries); the build and lint gates that catch framework-level regressions before deploy; and the backlog of known framework risks that need to be worked down. Also owns the relationship between the codebase and Vercel's deployment expectations, so that what builds locally builds on Vercel and what renders in dev renders in production. The zone covers everything that determines whether a framework or runtime bump is a routine chore or a silent outage. ## Rubric - **Version pinning discipline** — Framework-critical packages (next, react, react-dom, the matching eslint config) are pinned to exact versions, not caret or tilde ranges. This is the floor the rest of the rubric stands on: until the versions installed in CI, on a fresh clone, and on Vercel are provably identical, every other dimension is grading a moving target. The bad version of this dimension is a lockfile that drifts between environments and an upgrade that lands by accident on a Tuesday afternoon. - **Pre-deploy build gating** — A production build (and the framework's own type and lint passes) runs on every push and PR and blocks merge on failure. Only meaningful once versions are pinned — otherwise the gate is checking a different build than the one that ships. The failure mode this dimension calls out is discovering a broken build from the deploy log instead of from CI; excellence means the first place a framework regression surfaces is a red check, not a white screen. - **Routing and component-boundary correctness** — App Router conventions are followed strictly: canonical segment filenames, deliberate placement of server vs client components, no accidental client-bundling of server-only code. Sits on top of the build gate, because lint and type rules are the mechanism that makes these conventions enforceable rather than tribal. The bad version is a file named almost-but-not-quite right that silently fails to route, or a use client added to silence an error without understanding what crossed the boundary. - **Upgrade rehearsal and risk backlog** — The team treats framework upgrades as a rehearsed activity, not an emergency: known framework risks, deprecations, and migration steps live in a tracked backlog with priorities, and majors are taken on a deliberate cadence with a known rollback. Becomes possible once the prior dimensions exist, because rehearsal is only credible when versions are pinned and CI catches regressions. Excellence here is a reader being able to answer what's the next framework risk we owe time to without asking a person. - **Deployment-target fidelity** — The local and CI build environment matches what Vercel (or the equivalent target) actually runs: Node version, build command, environment variables, edge vs node runtime choices, and image/route configuration. The bad version is the works on my machine class of incident where the production runtime quietly disagrees with the dev runtime about a server component, a route handler, or a cached fetch. - **Stakeholder-legible upgrade posture** — A non-engineer stakeholder (PM, founder, ops) can answer are we current, are we exposed, and what would an upgrade cost without paging an engineer to read package.json. This is the capstone — only honest once pinning, gating, conventions, and the risk backlog are in place, because otherwise the answer is a guess dressed up as a status. Excellence is a posture that can be reported on, not folklore held in one engineer's head.
Dead Code
## Ownership Zone Unreferenced exports, orphan modules, unreachable branches, and rename/deletion residue across app/, lib/, components/, and scripts/. The steward keeps the surface area honest so reviewers and stewards aren't reasoning about code that no longer runs. ## Rubric - **Unreferenced exports** — Exported functions, types, constants, and React components with zero in-repo consumers and no legitimate external-consumer reason to remain exported. Stale re-exports from internal index files are included. - **Orphan modules** — Source files under app/, lib/, components/ that are not imported anywhere and are not framework entry points (route.ts, page.tsx, layout.tsx, middleware.ts, instrumentation.ts). Test fixtures and __mocks__ are out of scope. - **Unreachable branches** — Code after unconditional early returns/throws, always-true/always-false conditionals, env-gated paths whose env can no longer be set, and switch arms for enum members that were removed. - **Stale one-shot scripts** — scripts/backfill-*, scripts/bootstrap-*, scripts/replay-*, and similar single-purpose tools that have already completed their purpose. Keep ones with a documented reason to retain (e.g. periodically rerun); flag the rest for deletion. - **Removed-symbol residue** — Leftovers from renames or deletions: re-exports of vanished symbols, dead MCP tool registrations, schema fields with no writers/readers, dead public-route patterns, doc/CLAUDE.md references to APIs that no longer exist.
Backlog Delivery Flow
## Ownership Zone Friction and legibility of moving a backlog item from queued to merged in production, across the MCP server, the CLI, and the plugin: the lifecycle state machine and its truthful linkage to PRs and branches, the MCP and notification surface that tells agents and humans what to do next, and the trust signals that let a workspace widen backlog autonomy over time. Excludes PR-review verdict quality (owned by PR Thread Responsiveness and review-policy) and CI correctness. ## Rubric - **Lifecycle state truth** — A backlog item's state (queued / in_progress / proposed / done / dismissed) and its PR or branch linkage always reflect reality. Orphaned claims, expired-lease ghosts, items stuck after their PR merged or closed, and false orphaned-PR warnings are defects. - **Deliverable and contract legibility** — peek / claim / list responses expose what an agent needs to act correctly: the intended deliverable (pull_request vs note), the recommended next action, and lifecycle copy that does not push a PR onto note-shaped or already-done work. - **Progress visibility** — In-flight work is countable and surfaced. queued, in_progress, proposed, and awaiting-merge are distinguishable in counts and responses, and a claimed-but-PR-less item, a green-but-idle PR, or a done-but-unmerged item never sits invisibly. - **Delivery handoffs** — At each gate where a human must act — PR ready to review, ready to merge, conflicted, CI red, or a workspace stuck with un-executed backlog — the user is notified promptly and clearly with the correct next action. - **Selection continuity** — The path from signal to work stays coherent: consult's top-concern set and the queue's top item do not silently diverge, so the agent acts on what the stewards actually flagged rather than drifting to a different item. - **Autonomy trajectory** — The workspace's chosen autonomy level (merge-block threshold, auto-flow eligibility) is respected and legible, and the clean delivery history needed to justify widening autonomy over time is visible rather than hidden.
Dependency Pinning Discipline
## Ownership Zone The dependency surface declared in the project's package manifest and the lockfile that pins it down — every direct dependency's version constraint, the lockfile's presence and integrity, the install path that turns the manifest into a working node_modules tree, and the policies governing how new dependencies enter and how existing ones move. Covers the shape of version ranges (exact pins, caret/tilde ranges, floating tags like latest or *), the reproducibility of fresh installs across machines and CI, the cadence and review discipline around upgrades, and the visibility non-engineers have into what shipped with which versions. Does not own runtime behavior of the dependencies themselves, transitive vulnerability triage, or build tooling beyond what install reproducibility requires. ## Rubric - **Constraint discipline in the manifest** — The floor the rest of the rubric stands on: until every direct dependency declares a deliberate, defensible version constraint, nothing downstream is reasoning about a known surface. Floating tags like latest or unbounded ranges are absent by policy, not by accident, and a reader can tell at a glance which dependencies are pinned exact, which are range-bounded, and why — rather than seeing a soup of mixed conventions that nobody remembers choosing. - **Lockfile as source of truth** — A committed lockfile fully determines the resolved tree, and it is treated as a reviewed artifact rather than a generated nuisance. Lockfile drift between branches surfaces in review, regenerations are intentional events tied to dependency changes, and the lockfile is never silently regenerated to paper over a conflict. Only meaningful once constraint discipline is real; a lockfile over a soup of floating ranges locks in randomness. - **Install reproducibility** — A fresh clone on a clean machine and a CI run from scratch produce byte-identical or behaviorally equivalent dependency trees, today and a month from now. Installs use the lockfile-respecting path (frozen/CI mode) rather than the resolve-anew path, and a green build on Monday is not allowed to go red on Tuesday because an upstream patch shipped overnight. Sits directly on top of the two dimensions above. - **Upgrade cadence and intentionality** — Dependencies move on a known rhythm with named owners, not in panicked batches after something breaks or in silent drift from auto-updates. Upgrades are scoped (one library or one coherent group at a time), reviewed against changelogs, and traceable to a reason — security, feature need, ecosystem alignment — rather than churn for churn's sake. This dimension is largely invisible from the code alone; it is a property of how the team behaves over time. - **New-dependency gatekeeping** — Adding a dependency is a decision with friction proportional to its cost: someone asks whether it is needed, what it pulls in transitively, who maintains it, and how it will be kept current. Bad practice looks like dependencies sneaking in via drive-by commits with default ranges; good practice looks like a brief, consistent rationale and a deliberate constraint chosen at the moment of entry. Lives mostly in review practice and team norms rather than in the manifest itself. - **Stakeholder-legible version posture** — Anyone downstream of engineering — a founder asking what version of a critical library is in production, a security reviewer asking whether a CVE applies, an ops person asking what changed between two deploys — can get a precise answer without reading code or paging an engineer. The version posture is documented or queryable, not folklore; the failure mode this rules out is the team itself not knowing, with confidence, what is actually installed.
Onboarding Documentation
## Ownership Zone Owns the body of documentation a new contributor or non-engineering stakeholder needs to understand, run, and contribute to the product without tribal knowledge from existing developers. This covers the entry-point README, environment and setup instructions, architecture and routing overviews, contribution and code-style conventions, and the product-level explanation of what the system is and who it serves. The zone includes the prioritized backlog of documentation gaps and the lifecycle of each doc — when it was last verified against the running system, who is expected to read it, and whether it still matches reality. It does not own inline code comments, API reference generation from types, or design specs for unshipped features. ## Rubric - **First-hour path works end-to-end** — A new contributor can go from a fresh clone to a running local instance using only the written instructions, on a machine the docs claim to support. This is the floor the rest of the rubric stands on: until setup actually works, every other doc is being read by people who are already frustrated or who never made it this far. The bad version is a README that lists prerequisites but skips the env vars, or a setup guide that silently assumes a tool the author already has installed. - **Audience separation is explicit** — Docs are organized so a product manager looking for what the system does, a new engineer looking for how to contribute, and an ops person looking for how to deploy each land in the right place quickly, without wading through each other's content. The failure mode is a single sprawling README that mixes business context, setup commands, and architecture diagrams so that everyone reads everything and nobody trusts any of it. This is the stakeholder-facing dimension — excellence here is judged by whether non-engineers can self-serve, not by whether the prose is well-written. - **Conventions are stated, not implied** — Contribution norms, naming conventions, routing patterns, branch and PR expectations, and code-style choices are written down where someone proposing a change will see them. Only meaningful once the first-hour path works, because a contributor who can't run the code has no reason to read the conventions yet. The bad version is a reviewer repeatedly leaving the same comment on PRs because the rule lives only in their head. - **Truth decay is actively managed** — Docs carry signals of freshness — last-verified dates, ownership, or explicit deprecation — and there is a known cadence by which someone re-walks the setup and architecture docs against the running system. Sits on top of the first-hour path: the question isn't whether the docs were once correct, but whether anyone has confirmed they're correct this quarter. The failure mode is a confident-sounding architecture doc describing services that were renamed or removed months ago. - **Architectural orientation matches the system as built** — A new engineer can read one document and form an accurate mental model of the major components, how requests flow, and where the seams are, before opening the code. This becomes possible once truth decay is managed; otherwise the orientation doc actively misleads. The bad version is either no overview at all (everyone learns by archaeology) or a beautiful diagram that quietly disagrees with the repo. - **Gaps are tracked, prioritized, and visible** — Missing or stale documentation is itself catalogued, ranked by severity, and worked through deliberately rather than written reactively when someone complains. This is the dimension that makes the steward legible to outsiders: a stakeholder can ask what's missing and get an answer, rather than discovering gaps by hitting them. Excellence here isn't visible from the codebase alone — it requires that someone is keeping a list and making decisions about it. - **Onboarding feedback closes the loop** — When a new contributor or stakeholder hits friction, that friction becomes a documentation change, not a Slack answer that evaporates. The capstone dimension — only achievable once gaps are tracked and audiences are separated, because otherwise feedback has nowhere coherent to land. The bad version is the same three questions answered privately every time someone joins, with the docs never updated.
Industrial Design System
## Ownership Zone Adherence to the industrial/brutalist design system: color tokens, typography contracts, component variant usage, layout patterns, and zero-radius enforcement across the Next.js app. ## Rubric - **Token discipline** — Components use defined color tokens (primary, surface, surface_two, text-primary, text-muted, error, warning, success) and their documented scale steps. No ad-hoc hex values, no non-existent tokens like brand.400, no whiteAlpha borders. - **Typography contract** — Space Grotesk for headings/body/buttons, JetBrains Mono for labels/data/code. Text styles (monoLabel, monoBody, monoSmall) are used for their documented purposes. Uppercase + wide tracking signals system text, not human-readable content. - **Variant usage** — Buttons use industrialPrimary, industrialOutline, or industrialCta — never bare Chakra solid/outline. Inputs use the theme variant without inline bg/borderColor/_hover/_focus overrides. Tables use variant bordered. Components use AppModal, Card, DataTable wrappers rather than raw Chakra primitives. - **Surface and border hygiene** — Surfaces are delineated by surface_two.500 borders, never drop shadows. No border-radius anywhere — the theme overrides all radii to 0. No CircularProgress or rounded elements that contradict the zero-radius constraint. - **Layout pattern conformance** — Landing pages use the 1440px container with border rails and section dividers. Blog/content headers use the 7fr/5fr grid with yellow breadcrumb label pattern. Auth pages use centered VStack with hyperspace animation. App pages use Layout with sidebar at 240px.
Claude Code Onboarding
## Ownership Zone The end-to-end first-run journey of getting a developer productive with Steward from inside Claude Code: connecting and authenticating the MCP server, the prepare_steward_onboarding readiness handoffs (auth, GitHub App install, workspace selection), invoking the steward skills, and the configure_steward create → activation sequence that lands an activated account. Spans the server-side onboarding logic in contextgraph/actions, the plugin and skill install surface in contextgraph/claude-code-plugin, and the CLI in contextgraph/agent. ## Rubric - **Readiness-state correctness** — prepare_steward_onboarding returns the right status/next_action for each real account state — authentication_required, github_app_install_required, workspace_selection_required, repository_inaccessible, and ready/define_steward — and no blocking state is a dead end: each one carries a concrete, actionable handoff (install URL, retry instruction, workspace selector) rather than leaving the agent guessing. - **Agent-facing guidance clarity** — The guidance arrays, MCP server initialize instructions, tool descriptions, skill copy, and browser-return pages tell the coding agent exactly what to do next, in order, naming the correct next tool or skill — and never bounce a Claude Code user back into the web onboarding flow when the agent can finish setup in-session. - **Browser handoff round-trip integrity** — Auth, GitHub-App-install, and workspace handoffs build correct URLs (redirect/return params, owner_login, owner_type), land the user on a 'return to Claude Code' page, and resume cleanly when the readiness check is re-run. The loop always closes back into Claude Code; a handoff that strands the user in the browser is a defect. - **Activation completeness** — configure_steward's create → reconcile_inventory → preview_initialization → apply_initialization chain honors each activation.next_action and ends in a genuinely activated state (steward created, inventory reconciled, first backlog items workable). No path silently strands a half-created steward or skips an activation step the agent is supposed to run. - **Path health visibility** — Each readiness state and activation transition emits telemetry (the mcp_prepare_steward_onboarding event, onboarding funnel events) so drop-off across connect → authenticate → install → define → activate stays visible, and the headline conversion signal (share of readiness checks reaching ready) is watched. Happy-path-only instrumentation and silent stall points where a user can stall invisibly are regressions.
Engineering Pragmatism
## Ownership Zone Speculative complexity and over-engineering across the monorepo: abstractions, packages, exported surfaces, and dependencies must earn their place through real consumers and proportionate product value; dead, premature, and gold-plated code is surfaced for removal so the codebase stays as simple as the shipping product allows. ## Rubric - **Consumer-backed abstraction** — Every abstraction, package, or exported symbol has at least two real call sites or a committed near-term consumer; speculative generality built for imagined future use is flagged. - **Dead surface** — Exported symbols, packages, dependencies, config, and scripts with zero consumers are detected and surfaced for removal before they accrete into maintenance burden. - **Dependency justification** — Each third-party dependency earns its place through real, non-trivially-replaceable use; heavyweight deps pulled in for a one-line need are flagged. - **Premature infrastructure** — Infrastructure, tooling, layers, and config systems are not built ahead of a real product need (YAGNI); abstractions arrive with the second concrete use, not before it. - **Right-sized solutions** — Solution complexity is proportionate to the problem and to delivered product value; gold-plating, over-generalized configuration, and frameworks where a plain function suffices are flagged.
Tenant Data Isolation
## Ownership Zone The architecture, configuration, and enforcement of data boundaries between independent tenants across the platform. This includes tenant identification and routing at the request boundary, schema-level isolation mechanisms, query filtering and access control, credential and secret scoping per tenant, and the visibility of isolation health to non-engineers through audit trails and breach detection. The steward owns the floor that prevents one tenant from reading, writing, or inferring the state of another. ## Rubric - **Tenant identity at the edge** — Every request carries a verified tenant identifier before any business logic executes. This is the floor the rest of the rubric stands on: until tenant identity is established and immutable at the boundary, downstream isolation is fiction. Tenant context is extracted from a single source of truth (JWT claim, session, header) and cannot be overridden by request parameters or inferred from data shape. - **Query-level filtering enforcement** — All data queries automatically scope to the request tenant without relying on caller discipline. Queries fail closed rather than silently returning cross-tenant data when a filter is missing. This sits on top of verified tenant identity: only meaningful once you know which tenant made the request. - **Credential and secret isolation** — API keys, database credentials, third-party tokens, and encryption keys are scoped per tenant and cannot be accessed by other tenants. A compromised credential in one tenant does not grant access to another tenant's resources or secrets. - **Schema-level boundaries** — The data model itself enforces tenant ownership: foreign keys, row-level security policies, or partition keys make it structurally impossible to query across tenant boundaries. A schema change that removes a tenant column or constraint surfaces immediately as a breaking change, not as a latent vulnerability. - **Isolation testing and validation** — Automated tests verify that queries with one tenant's credentials cannot read, write, or infer the existence of another tenant's data. Tests cover both happy-path isolation and edge cases like concurrent requests, batch operations, and error states. Isolation is not assumed; it is measured. - **Audit and breach visibility** — Cross-tenant access attempts, credential misuse, and isolation violations are logged and surfaced to non-engineers without requiring code review. A support team member or operator can answer whether a tenant's data was accessed by another tenant without paging an engineer, and breach detection runs on a known cadence.
PostHog
## Ownership Zone The PostHog Steward owns the analytics instrumentation and event stream that tracks user engagement, value realization, and product stickiness across contextgraph. It maintains visibility into which events the team relies on to measure retention, user satisfaction, and the impact of shipped features. It notices when event payloads drift, when critical events stop firing, and when the metrics that should move in response to product changes don't — signaling measurement gaps or real product problems. It surfaces patterns in user behavior that reveal what users actually find valuable, not just what we assume they do. ## Rubric **Event Reliability**: Critical events (concerns raised, concerns remediated, backlog items merged) fire consistently with stable payloads; drift is caught and surfaced within one week. **Retention Signal Clarity**: Dashboards and cohorts clearly distinguish between one-time users, returning users, and power users; retention trends are directional and explainable. **Value Evidence**: Instrumentation captures user actions that correlate with stated value (e.g., what users do after raising a concern, how often they return to remediated items, which features drive repeat visits). **Measurement Gaps**: When expected metrics don't move or move counterintuitively, the steward flags whether the gap is real product behavior or an instrumentation blind spot. **User Intent Visibility**: Events and cohorts reveal what users actually do, not just what we built; the steward surfaces unexpected patterns that hint at real user needs.
Blog Post Publishing
## Ownership Zone Correctness and completeness of marketing blog post PRs in the Next.js app: the post page file under packages/app/src/pages/blog/ (named for the post slug), its BLOG_POSTS metadata registration, hero and card image wiring, SEO and structured data, sitemap inclusion, and conformance to the blog component system, so a correctly-built post can be approved, merged, and deployed without manual review. ## Rubric - **Post registration integrity** — Every new post has both a page file under packages/app/src/pages/blog/ named for its slug and a matching entry in BLOG_POSTS (consts/blogPosts.ts). The slug is unique, kebab-case, and consistent across the filename, the metadata.slug field, and the page's metadata lookup; the default export is the PascalCase form of the slug. No orphaned page without a registry entry, and no registry entry without a page. - **Metadata completeness & correctness** — The BlogMetadata entry has all required fields well-formed: title, description, ISO date (YYYY-MM-DD), tag, h1, readTime, a cardImage URL, and an author key that exists in BLOG_AUTHORS. The page reads every displayed value from the metadata constant rather than hardcoding titles, dates, or image URLs in JSX. - **Hero image & asset wiring** — cardImage points to the Supabase assets/blog bucket URL for the post slug, is webp, and the referenced asset was actually uploaded (not a placeholder or dead link). The image is wired through BlogHeroImage and SEOHead ogImage, and its aspect ratio is reasonable for OG cards (about 1.91 to 1). - **SEO, structured data & sitemap fidelity** — SEOHead is wired with the canonical URL via canonicalUrl(BLOG_ARTICLE(slug)), the standard 'Title | HyperServe Blog' title format, the cardImage as ogImage, and jsonLd from buildBlogPostingJsonLd(metadata). Open Graph, Twitter card, canonical, and BlogPosting JSON-LD are present and reference the real post; trackPageView fires for the article. The post is reachable from sitemap.xml.tsx, which derives blog URLs and lastmod from BLOG_POSTS via getAllBlogMetadata, so the registry entry and its ISO date must be valid for the post to be indexed. - **Component & markup conformance** — The post uses only the approved blog components in the canonical structure (BlogLayout wrapping BlogHeader, BlogTLDR, BlogHeroImage, BlogSection and BlogHeading content, BlogCTA, then RelatedPosts) rather than raw Chakra or ad-hoc markup. JSX quotes and apostrophes are escaped as HTML entities, and component props match their documented contracts. - **Build & link safety** — The PR typechecks (no TS errors), removes unused imports (e.g. Link when there are no internal links), and is scoped to the expected files without stray changes. Internal blog links resolve only to slugs that already exist in BLOG_POSTS, with no dead references.
Tenant Isolation & Access Boundary
## Ownership Zone How requests authenticate and how every data access is scoped to the correct company and role across the booking platform's API routes, server actions, and Prisma queries. ## Rubric - **Tenant query scoping** — Every Prisma read and write filters by companyId; no query path can return or mutate another company's rows, and joins/relations stay within the tenant. - **Session authentication** — Routes and server actions resolve a valid, unexpired session (tokenHash lookup) before touching data, and password/token handling (hashing, expiry, invalidation) is sound. - **Role authorization** — MANAGER versus REP capabilities are enforced at the server-side access boundary, not merely hidden in the UI. - **Identity provenance** — companyId and userId are derived from the authenticated session, never accepted from client-supplied params, request body, or headers. - **Audit coverage** — Privileged and mutating operations write an Audit row capturing actor, companyId, action, and entity, so tenant-scoped changes are traceable.
PR Thread Responsiveness
## Ownership Zone How fast and how legibly the steward shows up in a GitHub PR thread: first review after open/ready-for-review, response to human replies on concerns, re-review after new commits, and the visible presence signals (in-progress Stewards check, ack comments, reactions) that prove the steward is always watching. ## Rubric - **First-review latency** — Time from PR opened or marked ready-for-review to the first steward review posted on that PR is short and predictable. The Stewards check transitions to in_progress immediately so the user never wonders whether the steward saw the PR. - **Comment turnaround** — When a human replies on an unresolved concern, the steward acknowledges quickly (ack comment, reaction) and re-evaluates against the latest diff. Long gaps between a human reply and the steward's next action are a regression — even if the eventual verdict is correct. - **Re-review freshness** — After new commits land, concerns are reclassified against the latest SHA promptly. Same-SHA debounce, processing locks, and the review-slot mutex must not silently swallow a re-review the user expects to see. - **Presence legibility** — From the PR author's seat it is obvious the steward is alive: in_progress check posted, ack comments where appropriate, reactions on relevant human replies, a clear final state. Silent intervals where the user can't tell whether anything is happening are treated as bugs. - **Slot and lock health** — Per-PR processing locks and the review-slot mutex are responsiveness primitives — orphaned in_progress slots, stale tokens, lock timeouts, or failed releases turn into invisible queueing. The steward watches these as latency hazards, not just correctness ones. - **Bot-noise discipline** — Speed includes not burning time replying to bot pings, slash commands, the steward's own comments, or other automated PR feedback. commentLooksLikeBotPing / isAutomatedPrFeedbackAuthor and similar filters are part of how responsiveness stays high.
Setup & Onboarding Accuracy
## Ownership Zone Owns the surface that a newcomer hits in their first hour with the project: the README and any top-level docs that describe what the project is, the setup and run instructions, the prerequisites and toolchain expectations, the workspace and directory orientation, and the contributor guidance for making a first change. Responsible for keeping the stated identity of the project (name, purpose, domain, audience) aligned with what the code actually is, and for keeping installation, build, and run paths walkable from a clean machine. Covers the handoff from stakeholders and casual readers (what is this?) through to first-time contributors (how do I run it and where do I edit?). Does not own deep architectural docs, API references, or runtime operational guides — only the on-ramp. ## Rubric - **Truthful project identity** — The floor the rest of the rubric stands on: if the README describes a different project than the one in the repo, every other dimension is grading instructions to the wrong place. The stated name, purpose, domain, and tech stack match what a reader would conclude after ten minutes in the source tree, and template/scaffold residue from the project's origin has been replaced rather than left as quiet lies. - **Walkable setup path** — Only meaningful once identity is truthful, because setup steps for the wrong project waste the newcomer's trust before they hit a real error. A reader on a clean machine can go from clone to running app by following the documented steps in order, prerequisites are named with versions where versions matter, and the steps actually executed by the maintainer match the steps the doc tells a stranger to run. - **Orientation to the shape of the repo** — Sits on top of truthful identity: a newcomer who knows what the project is still needs to know where things live before they can contribute. The doc names the major directories, the workspace or monorepo layout if any, and where a first change is likely to go — so a contributor doesn't have to reverse-engineer the structure or guess which folder owns which concern. - **First contribution on-ramp** — Becomes possible once setup and orientation are in place. Conventions a contributor will trip over (formatting, commit style, branch flow, how to run tests or checks locally) are stated where a contributor will actually look, and the gap between running the app and submitting a change is short and explicit rather than tribal. - **Stakeholder legibility** — A non-engineer landing on the repo — a collaborator, a domain stakeholder, a curious visitor — can answer what is this, who is it for, and is it alive without reading code or asking the maintainer. The README opens with the answer to those questions rather than burying them under build badges and install commands, and the project's audience is named, not assumed. - **Drift resistance** — The capstone that keeps every dimension above honest over time: docs that were correct at one commit silently rot as the code moves. Onboarding content has a known owner and a known cadence for re-walking the path from scratch, changes that invalidate setup instructions are caught close to when they happen rather than discovered by the next newcomer, and the gap between code reality and documented reality is treated as a real defect rather than a cosmetic one.
SendGrid Email Delivery
## Ownership Zone Owns the boundary between the application and SendGrid: the code path that constructs and dispatches transactional email (notably trip confirmations), the template data contract that feeds those sends, the handling of SendGrid responses and delivery failures, and the audit log that records what was sent, to whom, and with what outcome. This includes guarding against silent drops where a domain event (a trip being created, a booking confirmed) completes without its corresponding email being attempted or recorded. It also covers the operational visibility non-engineers need — support, ops, and founders asking "did the customer actually get the email?" — and the escalation path when SendGrid itself misbehaves (auth failures, suppressions, bounces, account-level throttling). ## Rubric - **Send path integrity** — Every domain event that is supposed to trigger an email actually attempts a send, and every attempt is recorded with its outcome. This is the floor the rest of the rubric stands on: until sends are reliably attempted and logged, the other dimensions are grading a surface that may be silently empty. The bad version is a try/catch that swallows SendGrid errors so the domain transaction looks successful while the customer hears nothing. - **Template data contract** — The data passed to each template is a typed, validated shape rather than an ad-hoc object assembled at the call site. Only meaningful once the send path exists: a reliable pipeline that ships malformed templates is worse than one that fails loudly. A missing field fails the send (or is caught in tests) instead of producing an email with "Hi{{first_name}}" rendered literally to a paying customer. - **Failure handling and retry discipline** — Sits on top of send path integrity: you can only have a coherent retry policy once failures are observed at all. Transient SendGrid errors (5xx, network) are retried with backoff; permanent errors (invalid recipient, suppressed address, 4xx auth) are not retried blindly and surface to a human. The bad version is infinite retries on a hard bounce, or one shot at a 503 and then nothing. - **Deliverability hygiene** — Requires information beyond the codebase: domain authentication (SPF, DKIM, DMARC), sender reputation, suppression list management, and bounce/complaint handling are actively maintained, not assumed. An experienced practitioner spots the difference in fifteen minutes by checking who owns the SendGrid account, when DKIM was last rotated, and whether anyone looks at the suppression list. The bad version is emails landing in spam for months while engineering insists "the API returned 202." - **Operational visibility for non-engineers** — Support, ops, and founders can answer "did this specific customer receive their confirmation, and if not why" without reading code or paging an engineer. This is the stakeholder-facing capstone: it only becomes honest once the audit log and failure handling beneath it are real. The bad version is a support agent guessing from the absence of a complaint, or an engineer running a one-off query every time a customer asks. - **Reconciliation against domain state** — On a known cadence, domain records that should have triggered an email are reconciled against the audit log of what was actually sent, and drift surfaces in a scheduled review rather than a customer complaint. Builds on send path integrity and the audit log: reconciliation is only possible once both sides of the comparison exist. The bad version is discovering six months in that a whole class of trips never got confirmation emails because a feature flag silently disabled the send. - **Content and compliance review cadence** — Templates, sender identity, and unsubscribe/footer behavior are reviewed by the people responsible for brand and legal on a known cadence, not whenever an engineer happens to edit them. Invisible from the codebase alone: excellence here is a practice, not a file. The bad version is a transactional template that hasn't been read by a human in two years and still references a product name from a previous pivot.
Accessibility (WCAG 2.1 AA)
## Ownership Zone WCAG 2.1 AA accessibility of the SvelteKit dashboard: keeping the pnpm a11y:auth regression gate green and correctly extended as new surfaces ship, semantic/ARIA and keyboard correctness across authenticated and public surfaces, color-contrast token discipline, status/error messaging, and the compliance audit trail under compliance/accessibility/. ## Rubric - **Gate coverage integrity** — New authenticated routes, modals, dropdowns, and popovers are registered in PROFILES/subSurfaces (a11y-auth.mjs) with locale-stable selectors (data-testid/aria-*), so the delta-only a11y:auth ratchet actually scans them instead of silently missing coverage. - **Semantic structure & ARIA** — Headings, landmarks, lists, labels, roles, and ARIA attributes expose intent to assistive tech and respect the role allowlist — guarding the axe rule families that have fired here (label, dlitem, nested-interactive, select-name, aria-input-field-name, aria-prohibited-attr). - **Keyboard & focus management** — Every interactive control is reachable and operable without a pointer; route changes, dialogs, and async panels move or restore focus predictably; scrollable regions are focusable. Covers the non-automatable WCAG criteria axe cannot catch. - **Contrast & non-text affordances** — Text meets 4.5:1 and focus rings / essential non-text content meet 3:1 in BOTH light and dark mode, expressed through semantic color tokens rather than raw primitives (per contrast-audit.mjs gating policy). - **Status & error messaging** — Asynchronous changes, validation errors, and toasts announce via aria-live / role=status / role=alert appropriately (WCAG 4.1.3) — info/success/warning use the polite status convention, only true errors use alert. - **Compliance trail currency** — statement.md, roadmap.md, audit-log.md, and the contrast report stay in sync with shipped work and the WCAG 2.1 AA / SGQRI 008-2.0 target, and governance gaps (réaudit cadence, public statement, VPAT) stay visibly tracked.
CircleCI Integration Health
## Ownership Zone Owns the integration between this product and CircleCI as a third-party CI provider — the client module that talks to CircleCI's API, the server-side route handlers that mediate those calls, the token and credential handling that authorizes them, the runtime validation of every response crossing the boundary, and the UI surface (the checks section and the status fields it feeds) where CircleCI-derived information is rendered to developers reviewing a PR. Also owns how CircleCI status flows into the broader PR status calculation, so that "this PR is failing CI" means the same thing wherever it's displayed. The zone ends where generic PR status logic begins and where non-CircleCI check providers start; anything that would equally apply to GitHub Actions or another CI vendor is out of scope unless CircleCI specifics are involved. ## Rubric - **Boundary validation is total** — Every response from the CircleCI API is parsed through a runtime schema before any field is read by application code, with no raw-shape access slipping past the boundary. This is the floor the rest of the rubric stands on: until the boundary is honest about what it received, every downstream behavior — status mapping, error UI, status rollup — is reasoning about a shape it hasn't actually verified, and a silent CircleCI API change will surface as a mystery blank UI rather than a loud parse failure. - **Credential handling is explicit and least-privilege** — Tokens have a single, named place they are read from, a single place they are attached to outgoing requests, and never appear in client bundles, logs, or error messages. Missing, expired, or unauthorized tokens are a distinguishable error class, not the same code path as "no failures found"; without this the rest of the integration cannot tell "we couldn't ask" apart from "we asked and got nothing." - **Status semantics are single-sourced** — There is one canonical mapping from CircleCI's vocabulary (workflow/job statuses, conclusions) to the product's notion of CI state, and every consumer — the checks panel, the rolled-up PR status, any badge or summary — reads through it. The bad version is the same status string interpreted differently in two places, so a PR shows "passing" in one view and "failing" in another and nobody can say which is right. - **Failure modes are legible to the developer looking at the screen** — Sits on top of boundary validation and credential handling: only once those distinguish their error classes can the UI render them as distinct, actionable states. Loading, empty-but-healthy, auth failure, provider unavailable, and malformed-response are visually and textually distinct; a developer staring at the section can tell in one glance whether to wait, fix their token, retry later, or file a bug — never a blank box with no explanation. - **Provider drift is anticipated, not discovered in production** — The team has a deliberate practice for noticing when CircleCI's API contract shifts: schema changes fail loudly in tests or staging, deprecations are tracked against the provider's changelog, and the integration's assumptions about pagination, rate limits, and response shapes are written down somewhere a new maintainer can find. The bad version is learning about a field rename from a user complaint. - **Stakeholder-answerable health** — A non-engineer (PM, eng manager, support) can answer "is CircleCI data flowing into the dashboard right now, and if not, why?" without reading code or pinging the integration's author. This becomes possible only once the dimensions above are in place — error classes are distinguished, status semantics are consistent — because before then there is no honest signal to surface. The capstone: the integration's health is observable as a property of the product, not folklore held by one engineer.
Content Schema Integrity
## Ownership Zone Owns the canonical content schema for food item entries and the integrity of every entry written against it — the field set (storage duration, method, temperature, signs of spoilage, and any other required attributes), the types and value ranges those fields accept, the consistency of formatting and units across entries, and the absence of contradictions between related fields. Covers the lifecycle of the schema itself (how it is defined, versioned, and evolved as new food categories or attributes are introduced) as well as the conformance of the content set to it at any given moment. Includes the review surface where new and edited item content lands, so that gaps, type errors, and inconsistent guidance are caught before they reach readers. Stops at presentation and rendering concerns, and at editorial voice questions that aren't expressible as schema rules. ## Rubric - **Schema is explicit and singular** — There is one named, machine-checkable definition of what a food item entry must contain, and it lives somewhere a contributor can find without asking. This is the floor the rest of the rubric stands on: until the schema exists as an artifact rather than as tribal knowledge, every other dimension is grading against a moving target. The bad version is a schema that lives in reviewers' heads and drifts silently between entries. - **Conformance is mechanically verifiable** — Only meaningful once the schema is explicit: given the definition, any entry can be checked against it without human judgment, and the check distinguishes missing required fields, wrong types, and out-of-range values from each other. A failing entry produces a specific, localized error rather than a vague this doesn't look right, and the check runs the same way for a reviewer, a contributor, and CI. - **Cross-field coherence is enforced, not hoped for** — Sits on top of basic conformance: once individual fields are valid, the schema also catches contradictions between them — a refrigerator duration that exceeds a freezer duration, a temperature range that disagrees with the named storage method, spoilage signs that contradict the stated shelf life. The bad version passes per-field validation while shipping guidance that is internally inconsistent and confuses the reader. - **Schema evolution is deliberate and backward-aware** — When the schema changes — a new required field, a tightened range, a renamed attribute — the change is a named event with a migration story for existing entries, not a silent edit that retroactively invalidates half the content set. Excellent practice makes it obvious which entries pre-date a change and what is required to bring them forward; the bad version adds a required field and pretends the existing corpus was always compliant. - **Contributor experience makes the right thing the easy thing** — A non-engineer adding or editing a food item can see what is required, get fast feedback when something is missing or malformed, and understand the error without decoding a stack trace. This is the stakeholder-facing dimension: if the people who actually write the content can't tell whether their entry is complete before they submit it, schema integrity becomes a gatekeeping ritual rather than a shared standard, and contributions slow or route around it. - **Gap visibility for non-engineers** — The capstone — only becomes possible once conformance is mechanically verifiable: someone running the site, planning content, or auditing quality can answer how many items are incomplete, which fields are most often missing, and which categories are weakest, without reading code or opening individual files. The bad version is a green CI badge sitting on top of a content set whose actual completeness nobody can summarize in a sentence.
Workflow Replay Safety
## Ownership Zone Inngest step-function correctness across lib/inngest/workflows/: step boundaries, replay-safe state flow, idempotent side effects, and early-return ordering — ensuring every workflow produces correct results on both the initial run and any subsequent retry or replay. ## Rubric - **Step-return state flow** — State that must survive across steps is returned from step.run and captured in outer scope, never written by mutating a closure-captured variable. On replay, memoized step results are substituted without re-executing the callback, so mutations silently disappear; the steward flags any `let x = ...; step.run(..., () => x = ...)` pattern where x is read in a later step. - **Step boundary granularity** — Per-entity work (per-steward, per-concern, per-PR comment) is split into idempotent per-entity step.run blocks rather than bundled into one multi-side-effect step. Bundled steps cannot partial-retry, so one transient failure re-executes all side effects on replay or skips them all on memoized return. - **Idempotency of side effects** — GitHub API calls, check-run posts, PR comments, DB writes, and PostHog captures inside step.run are either safe to re-execute on retry or guarded by a deterministic key (SHA, comment marker, idempotency token). Replays and retries must not produce duplicate comments, double-counted events, or conflicting check runs. - **Early-return and failure-path ordering** — Detection and dispatch logic (PR-merge detection, scope filtering, installation health, debounce) runs before early-return branches, and failure telemetry covers early-error exits — not just the happy path. The steward flags happy-path-only instrumentation and skip-paths that swallow signals the user expects to see. - **Same-SHA persisted state reuse** — Persisted state read across steps (review verdicts, slot acquisitions, debounce gates, claim linkage) is correctly scoped to the head SHA and replay-safe. Stale persisted state from a prior head must not be reused on a new SHA, and a same-SHA acquire-miss must not silently carry forward a verdict that no longer reflects the diff.
SEO & GEO Technical
## Ownership Zone I own technical SEO and geolocation architecture across the product's web surface — hreflang and canonical tag strategy, locale routing and middleware behavior, sitemap and robots directives, and the rendered metadata of every page template that search engines and AI crawlers consume. This includes the geo-targeting redirect logic (IP-based first-visit routing, locale cookies, crawler UA handling, x-default fallback), the relationship between the router/locale config and the hreflang/sitemap output, and the canonical surface that prevents duplicate-content fragmentation across localized variants. I also own the legibility of this surface to non-engineering stakeholders: whether growth, content, and regional teams can answer questions about international visibility without reading code. The zone covers both classical SEO crawlability and emerging GEO (generative engine optimization) signals where they intersect with the same metadata and routing primitives. ## Rubric - **Single source of truth for locale × URL** — There is one authoritative mapping of which locales exist, which URLs each locale covers, and which is the default. This is the floor the rest of the rubric stands on: hreflang, canonicals, sitemaps, and middleware all derive from this map, so when it drifts, every downstream signal drifts with it. The bad version is a locale list duplicated across the router, the sitemap generator, and a middleware constants file, each subtly out of sync. - **Canonical and hreflang consistency** — Only meaningful once the locale × URL map above is real. Canonical tags emit from one shared path rather than competing per-page or CMS-injected overrides, hreflang tags reflect the full locale matrix including x-default, and the two never contradict each other (a canonical pointing to a URL that hreflang says is an alternate is the classic failure mode). Adding a new locale or page is a typed change that surfaces every consumer, not a grep-and-pray exercise. - **Geo-routing determinism** — Builds on the locale map: middleware decisions (IP redirect, cookie-based return-visit handling, crawler UA passthrough, x-default fallback) are explicit, exhaustive, and tested as named paths rather than emergent from stacked conditionals. Redirect chains do not exist — a request reaches its destination in one hop or the routing has a bug. Crawlers see the same canonical content a human in that region would see, not a redirect loop or a cookie-walled variant. - **Crawl surface hygiene** — Sits on top of routing and metadata being consistent: sitemaps enumerate the same URLs that canonicals point to, robots directives match what the sitemap advertises, and noindex/canonical/hreflang never disagree about a single URL's intent. The bad version is a sitemap entry that is canonical-tagged elsewhere, or a noindexed page with hreflang alternates pointing at it — mixed signals that crawlers resolve unpredictably. - **Change safety on the SEO surface** — Becomes possible once the surface is consistent enough to reason about: route renames, locale additions, and template refactors are reviewed against their effect on canonicals, hreflang, sitemaps, and redirects before merge, not discovered weeks later in Search Console. There is a known set of regression checks that runs against this surface, and engineers shipping unrelated work do not have to be SEO experts to avoid breaking it. - **Stakeholder legibility of international visibility** — The capstone — only meaningful once the underlying signals are coherent enough to measure honestly. A growth or regional lead can answer did we lose German visibility last week, are all our locales indexed, and which pages are missing hreflang without reading code or pinging an engineer. The bad version is technical SEO living entirely inside engineers' heads while the people who care about regional traffic operate on faith. - **GEO and structured-data readiness** — Sits on top of canonical and metadata consistency: structured data, OpenGraph, and the signals that generative engines and AI crawlers consume are emitted from the same authoritative metadata layer as classical SEO tags, so a page's identity is one story across Google, LLM crawlers, and social previews. The failure mode is a page whose canonical, schema.org JSON-LD, and OG tags each describe a slightly different entity, leaving every consumer to guess.
React a11y Guardian
## Ownership Zone I own accessibility quality for the React component layer in the client/ directory — every interactive surface a user can see, hear, focus, or be trapped inside. That spans modal dialogs and their focus management, the conversation UI and its live-updating message stream, the onboarding flow with its audio and form interactions, and the shared primitives (buttons, badges, inputs, toasts) that compose all of the above. I am responsible for semantic HTML and ARIA correctness, keyboard reachability and focus order, color contrast under the active theme, screen reader behavior including live regions and route-change announcements, and the automated regression coverage that keeps these properties from rotting between releases. I am also responsible for the legibility of accessibility status to non-engineering stakeholders — whether someone outside the team can answer what conformance level we ship at and what is currently blocking it. ## Rubric - **Semantic foundation** — Interactive elements use the native control that already encodes role, state, and keyboard behavior; ARIA is reached for only when no semantic element fits. This is the floor the rest of the rubric stands on — a div masquerading as a button invalidates every downstream claim about keyboard support, focus, or screen reader behavior, because the assistive tech never knew there was a control there to begin with. The bad version is a tree of clickable divs with onClick handlers and bolted-on role attributes; the good version is boring HTML that mostly just works. - **Keyboard and focus discipline** — Only meaningful once the semantic foundation is in place: every interactive element is reachable and operable by keyboard, focus order matches visual order, focus is visibly indicated, and focus is trapped and restored correctly across modals, drawers, and route changes. The failure mode to watch for is the keyboard user who tabs into a modal and cannot escape, or who dismisses one and is dropped at the top of the document with no idea where they were. - **Screen reader truthfulness** — Sits on top of semantics and focus: what a sighted user perceives and what a screen reader announces are the same story, told in the same order. Dynamic content (streaming messages, toasts, validation errors, route changes) is announced through appropriate live regions or title updates rather than appearing silently; decorative content is hidden from the accessibility tree rather than narrated as noise. The bad version is a chat UI where new messages render visually but the screen reader stays silent, or where every icon is read aloud as image image image. - **Perceptual robustness** — Color contrast meets WCAG AA across both text and non-text UI under every supported theme, information is never conveyed by color alone, and the UI remains usable at 200% zoom and at the platform's reduced-motion and high-contrast settings. This dimension is what catches the regressions a theme rollout or a designer's palette tweak quietly introduces, where the pixels look fine to the person shipping them and unreadable to someone with low vision. - **Regression coverage** — Becomes possible only once the dimensions above have a defined good state worth defending: automated checks (axe-style audits, focus and keyboard tests, contrast tests) run in CI on the surfaces that matter, fail loudly on regression, and are wired into the same PR gate as the rest of the test suite. The bad version is a one-time audit spreadsheet; the good version is that an accidental aria-label removal or a contrast-breaking color change cannot land without someone explicitly overriding a red check. - **Conformance legibility** — The capstone — only honest once the underlying surface is consistent enough to measure. A non-engineering stakeholder (PM, founder, support, legal) can answer what conformance level the product ships at, what the current blocking violations are, and when they will be resolved, without reading code or paging an engineer. The failure mode is an a11y posture that exists only in individual engineers' heads and surfaces only when a customer or auditor asks an uncomfortable question. - **Triage and severity discipline** — Accessibility findings are classified by impact and WCAG level, not by whoever shouted loudest; Level A blockers are treated as release-blocking, AA issues are scheduled, and moot findings are explicitly closed with reasoning rather than left to drift. This is what separates a team that has an accessibility practice from a team that has an accessibility backlog — the latter accumulates findings indefinitely because nothing distinguishes a screen-reader-broken flow from a nice-to-have aria-describedby.
Test Foundation
## Ownership Zone The automated test suite that protects this codebase's trust-critical boundaries: GraphQL response parsing, review and check status calculation, authentication cookie handling, and token validation. The steward owns which boundaries deserve tests, the shape and isolation of those tests, the harness and fixtures they share, and the signal those tests give to a reviewer deciding whether a change is safe to merge. It also owns the relationship between the test suite and the humans who depend on it — what a green run promises, what it does not, and how that promise is communicated to reviewers and contributors. It does not own end-to-end product behavior, performance testing, or non-test code quality concerns. ## Rubric - **Boundary selection** — The floor the rest of the rubric stands on: a test suite is only as valuable as the boundaries it chose to cover. Excellent practice means tests cluster at the seams where wrong behavior would cause real harm — auth, parsing of external responses, money/permission decisions, state transitions — rather than spreading uniformly across trivial getters. A bad version tests what is easy and leaves the dangerous edges naked; you can tell at a glance because coverage tracks line count instead of risk. - **Test isolation and determinism** — Only meaningful once the right boundaries are chosen: a flaky or order-dependent test at a critical boundary is worse than no test, because it trains reviewers to ignore red. Each test sets up and tears down its own world, network and clock and randomness are controlled at the seam, and a failure points at one cause rather than a tangle. The bad version has tests that pass locally and fail in CI, or pass on Tuesday and fail on Friday. - **Failure legibility** — Builds on isolation: when an isolated test fails, the message and diff should tell a reviewer what broke without making them open the test file. Assertions name the property under test, fixtures are small enough to read in the failure output, and the failure mode of the system under test is what gets surfaced — not an incidental mock mismatch three layers deep. Bad suites greet you with a stack trace and a useResolvedRef is undefined and leave you to reverse-engineer the intent. - **Reviewer trust contract** — Sits on top of the technical dimensions above and is not visible from the code alone: it is the shared understanding between the suite and the humans reading PRs about what a green run actually promises. Reviewers should know which classes of regression the suite will catch and which it explicitly will not, so a green CI shifts review attention to the right places rather than producing false confidence. The bad version is a team that either rubber-stamps green PRs or ignores CI entirely because no one agrees on what it means. - **Harness ergonomics** — How quickly a contributor can write a correct new test for a trust-critical boundary. Shared fixtures, factories, and helpers exist for the recurring shapes in this domain; running a single test is fast and obvious; adding a test for a new boundary does not require inventing infrastructure. When this dimension is weak, tests get skipped not out of malice but because the path of least resistance is to ship without one. - **Coverage of the trust-critical set** — The capstone, only honest once the dimensions above hold: a known, named list of the boundaries this codebase considers trust-critical, and visible progress toward every one of them having a test. Excellence here is not a coverage percentage but the ability to point at the list and say which boundaries are protected and which are still on the human reviewer's shoulders. The bad version reports 80% line coverage while the auth path has zero tests.
Conversation Pipeline Resilience
## Ownership Zone The full conversation pipeline that turns user audio into spoken response — audio upload, transcription, language detection, chat completion, SSML generation, and TTS synthesis — viewed through the lens of how it behaves when something goes wrong. This steward owns the failure surface end-to-end: timeouts and partial responses from upstream model APIs, malformed or unexpected inputs at each stage boundary, fallback routes (plain-text TTS, default language, simplified SSML), error envelopes returned to callers, and the integration tests that prove each degraded path actually works. It also owns the coverage map itself — the catalog of which failure modes at which stages have explicit assertions, and which are still trusted on faith. New activity types, new languages, and new TTS routes enter this zone the moment they are added, because each one multiplies the failure surface that must be exercised. ## Rubric - **Failure surface is named, not implicit** — The set of ways each pipeline stage can fail is written down explicitly: timeout, upstream API error, malformed payload, missing field, unsupported language, schema-invalid SSML, and so on. This is the floor the rest of the rubric stands on — until the failure modes have names, no one can say what is covered and what isn't, and tests end up exercising whatever was easy to think of rather than what actually breaks. The bad version is a pipeline whose failure modes only get discovered in production incidents. - **Degradation is designed, not accidental** — For every named failure mode there is an intended behavior — a specific fallback, a specific error envelope, a specific user-visible outcome — and that intent is captured somewhere a reviewer can read before writing a test. Only meaningful once the failure surface above is named. The bad version silently swallows errors, returns 200 with empty audio, or crashes the whole pipeline because one optional stage timed out. - **Failure-path test coverage** — Each named failure mode at each stage has at least one integration test that drives the pipeline into that state and asserts the designed degradation actually happens, end-to-end. Sits directly on top of the two dimensions above: you cannot meaningfully cover what you have not named and designed for. The bad version is a test suite full of happy-path assertions and a single catch-all it returns 500 test. - **Boundary contracts between stages** — Each stage validates what it receives and what it emits against a typed contract, so a malformed handoff fails at the boundary that produced it rather than three stages downstream as a confusing TTS error. The bad version is one stage quietly passing None or an empty string forward and the symptom surfacing in synthesis logs with no trace of where it originated. - **Coverage parity as the surface grows** — When a new activity type, language, or TTS route is added, its failure modes are enumerated and covered before it ships, not bolted on after the first incident. This is an organizational property, not a code property — it shows up in review practice and in what is treated as done. The bad version is a pipeline whose coverage was strong at version one and has eroded with every feature added since. - **Stakeholder-legible reliability** — A non-engineer — product, support, an on-call lead — can answer questions like which fallback fired most often last week, which language has the worst degraded-response rate, and did SSML validation failures spike after the last deploy without reading code or pinging an engineer. The capstone — only becomes possible once the surface is named, designed, and covered consistently enough to measure honestly. The bad version is reliability that lives entirely in engineers heads and gets re-litigated every incident review.
Usability Steward
## Ownership Zone Every moment where a person interacts with the application and forms a judgment about whether it feels professional, responsive, and trustworthy. This covers the full surface of user-triggerable actions and their feedback (toasts, confirmations, loading states, status changes, error surfaces), the visual and interaction language across screens (layout consistency, density, typography, affordances), the navigational and informational scaffolding that lets a user orient themselves, and the empty/error/edge states that decide whether the product feels finished or half-built. The steward owns the experiential contract end-to-end: from the instant a click happens to the moment the user is sure something happened, and from first impression of a screen to the user's confidence that they know what to do next. ## Rubric - **Action acknowledgement** — Every user-triggered action produces a visible, timely signal that the system received it and is acting on it: a loading indicator, a toast, a status change, or a confirmation. This is the floor the rest of the rubric stands on — without it, the user is guessing whether the product is broken, and judgments about polish, hierarchy, or stakeholder visibility are grading a surface the user has already lost trust in. The failure mode is the silent click: the action fired, the state changed somewhere, and the user has no idea. - **Feedback proportionality** — Sits directly on top of action acknowledgement: once feedback exists, the question is whether it matches the weight of the action. Trivial actions get lightweight signals, destructive or irreversible actions get explicit confirmation, long-running actions show progress rather than a frozen button, and errors surface what went wrong specifically enough to act on. The eye-roll version is a modal confirming a no-op, or a toast saying something went wrong with no hint of what or why. - **Visual and interaction consistency** — The same kind of thing looks and behaves the same way across the product: buttons of equal weight share a style, primary actions sit predictably, spacing and typography follow a small number of rules rather than per-screen invention. Becomes possible to assess seriously only once acknowledgement and proportionality are in place; before that, consistency of silence is not a virtue. The bad version is each screen looking like a different person built it on a different day. - **Information hierarchy and density** — On any given screen, what the user is supposed to look at first is obvious, secondary detail recedes, and the page neither drowns the user in fields nor hides what they came for behind extra clicks. Practitioners argue about this constantly: too sparse feels like a prototype, too dense feels like a control panel, and the line between them is the difference between professional and amateur. Depends on visual consistency — hierarchy expressed through ad-hoc styling reads as noise rather than signal. - **Edge state completeness** — Empty states, loading states, partial-data states, permission-denied states, and error states are designed, not accidents. A first-run user with no data sees something deliberate; a slow network produces a real loading affordance, not a flash of broken layout; an error tells the user what to do next. This is where finished products separate from demos, and it is invisible until you actually hit the state — which is why teams routinely ship without it. - **Stakeholder-legible UX health** — A non-engineer (founder, support, PM, designer) can answer questions like which actions in the product currently complete without feedback, where users are most likely to feel lost, and whether the experience improved or regressed this month — without reading code or shoulder-surfing a developer. This is the capstone: it only becomes honest once the underlying surface is consistent enough to inventory and measure, and without it the other dimensions drift because no one outside engineering can tell when they slip.
Trip Data Integrity
## Ownership Zone Guards the integrity of the trip domain model end-to-end: the canonical trip lifecycle (draft, ready, booked, active, complete and any terminal states), the captain/crew relationship and the privileges that flow from it, trip-scoped preferences, and scorecard entries tied to a trip. Owns the type-level shape of these entities, the server-side preconditions that gate stage transitions, and the trust boundary that distinguishes captain-only mutations from crew-readable state. Covers the contracts between client components, server actions, and persistence — wherever a trip, its members, or its scores can be observed or changed. Does not own UI styling, payment flows, or notification delivery, except where those touch trip state transitions. ## Rubric - **Canonical status and role vocabulary** — The set of legal trip statuses and member roles is defined once, as a strict union, and every consumer reads from that single source. This is the floor the rest of the rubric stands on: until the vocabulary is fixed and narrow, transition guards and authorization checks are reasoning about a moving target. The bad version widens to plain string somewhere in the stack and silently accepts statuses that the rest of the system has never heard of. - **Server-authoritative state transitions** — Every move between trip stages is gated by an explicit precondition check on the server, not inferred from what the client just rendered. Only meaningful once the status vocabulary is canonical; otherwise the guard is checking against values it cannot fully enumerate. Excellence looks like illegal transitions failing loudly with a named reason; the bad version lets the client POST a new status and trusts it. - **Trust boundary for privileged mutations** — Captain-gated actions re-derive the actor's role from the authenticated session on every request, never from a role flag passed in by the caller. Sits on top of the role vocabulary above. The failure mode this dimension is calling out is the endpoint that accepts isCaptain: true in its payload, or that checks a role loaded once on page render and trusted forever after. - **Referential and relational consistency** — Crew membership, scorecard entries, and preferences cannot exist pointing at a trip, user, or hole that does not exist, and cannot contradict the trip's current stage (e.g., scores on a trip that never started). Constraints live close to the data, not scattered across callers, and orphaning a row requires deliberate effort rather than being the default outcome of a partial failure. - **Concurrency and idempotency under retry** — Two captains tapping the same button, a network retry, or a double-submitted form does not create duplicate crew rows, double-advance a stage, or split a scorecard. Becomes possible once transitions are server-authoritative; the test is whether replaying the same intent converges on the same state rather than compounding it. - **Stakeholder-legible trip state** — A non-engineer (support, ops, a captain asking why their trip is stuck) can answer where is this trip in its lifecycle, who is on it, and who can change what without reading code or asking an engineer to query the database. The capstone — only honest once the dimensions above are real, because legibility built on an inconsistent model just exports the confusion. The bad version is a support thread that ends with let me check with engineering.
MCP Server Contract
## Ownership Zone Owns the contract surface between the standalone MCP server process and the main web application that shares its data and operations. This includes the tool definitions exposed by the MCP server, the prompt templates that shape how those tools are described to LLM clients, the HTTP endpoints the web app exposes for MCP-mediated traffic, and the shared understanding of PR data shapes and available operations that both sides depend on. The zone covers how schemas, tool catalogs, and prompts evolve over time without the two processes silently drifting, and how MCP clients (and the humans configuring them) learn what tools exist and what they do. ## Rubric - **Single source of truth for shared shapes** — PR data shapes, tool argument schemas, and operation contracts are defined once and consumed by both the MCP server and the web app, rather than re-declared on each side and kept in sync by hope. This is the floor the rest of the rubric stands on: until both processes are reading from the same definitions, every other dimension is grading two artifacts that may already disagree. The bad version is parallel TypeScript types or hand-written JSON schemas that look similar at a glance and diverge field-by-field over months. - **Tool catalog discipline** — Only meaningful once shared shapes are in place: each MCP tool has a clearly named purpose, non-overlapping responsibility with its neighbors, typed arguments, and a declared result shape. Tools fail loudly with structured errors rather than returning success with an empty payload, and deprecated tools are removed or explicitly marked rather than left to rot in the catalog confusing clients. - **Prompt and description fidelity** — Tool descriptions and prompt templates accurately reflect what the tools actually do, including their argument semantics, side effects, and limits. The bad version is a description written when the tool was first added that no longer matches its behavior, leaving LLM clients to call tools based on a fictional contract; the good version has descriptions that change when behavior changes, treated as part of the contract rather than docstring decoration. - **Versioning and evolution discipline** — Becomes possible once the catalog and shared shapes are stable enough to reason about: changes to tool signatures, prompt templates, or response shapes are made with awareness of who is on the other end of the wire. Breaking changes are visible as breaking, additive changes are genuinely additive, and the team has an answer to *what happens to a client pinned to last month's contract* that isn't a shrug. - **Cross-process integration testing** — The contract is exercised end-to-end, not just unit-tested on each side independently. A test that boots both surfaces and walks through representative tool calls catches the divergence that two passing test suites on either side will miss; without this, the first signal that the contract broke is an LLM producing nonsense in production. - **Client-facing legibility** — The capstone, only honest once the dimensions above hold: a non-engineer integrating an MCP client (an analyst configuring Claude Desktop, a PM wiring up an agent) can answer *what tools does this server expose, what do they do, and what do I pass them* from the server's own self-description, without reading source. If the answer requires pinging an engineer or reading the implementation, the contract is leaking out of the artifact that's supposed to carry it.
Anthropic SDK Stability
## Ownership Zone The integration surface between this product and the Anthropic SDK: the pinned SDK version and its upgrade path, the streaming AI review endpoint, the prompt templates that drive Claude calls, the request/response shapes the SDK exposes, error and retry behavior, and the observability that tells the team whether Claude-powered features are healthy. Covers how SDK breaking changes, model deprecations, and prompt edits propagate through the review pipeline, and how those changes are surfaced to product and ops stakeholders who depend on review quality and uptime. Does not own the broader review UX or non-Anthropic LLM providers, but does own the seam where the SDK meets application code. ## Rubric - **Version pinning discipline** — The SDK is pinned with an upgrade strategy that matches its actual stability guarantees, not a default caret range chosen by the package manager. This is the floor the rest of the rubric stands on: until the team knows exactly which SDK version is running in production and why, every other dimension is grading a moving target. The bad version is a silent minor bump in CI that changes streaming semantics and nobody notices until a user reports a blank review. - **Typed boundary around the SDK** — All SDK calls flow through a narrow, typed adapter rather than being sprinkled across handlers. Builds directly on version pinning: once the version is known, a single boundary makes a breaking change a single typed diff instead of a scavenger hunt. Done badly, every route imports the SDK directly and a parameter rename turns into weeks of whack-a-mole. - **Streaming and failure semantics** — Streaming responses, partial outputs, timeouts, rate limits, and tool-use errors each have a defined behavior — surfaced to the user, retried, or failed loudly — rather than collapsing into a generic try/catch that swallows the difference. The bad version returns an empty review and a 200, leaving callers unable to tell a refusal from a network blip from a quota exhaustion. - **Prompt change governance** — Prompt templates are treated as versioned product surface, not config tweaks. Changes are reviewed against representative inputs, diffed against prior outputs, and tied to an owner who can say what the prompt is meant to do. Excellence here is invisible from the code alone: it shows up in whether the team can answer who changed the system prompt last month and what regressed, not in how the templates are formatted. - **Model and deprecation awareness** — Someone owns watching Anthropic's model lifecycle, deprecation notices, and SDK changelog, and that awareness translates into scheduled upgrades rather than surprise outages on a deprecation date. This dimension cannot be assessed from the repo — it lives in calendars, runbooks, and who reads the changelog — but its absence is what causes a Tuesday morning fire when a model id stops resolving. - **Stakeholder-visible review health** — Product, ops, and support can answer how Claude-powered reviews are performing — success rate, latency, refusal rate, cost per review — without reading code or pinging an engineer. Sits on top of the dimensions above: honest health numbers are only possible once the boundary is typed, failure modes are distinct, and prompt versions are tracked. The bad version is a dashboard that shows 200s while half the reviews are empty strings. - **Regression coverage at the seam** — The integration has tests that exercise the SDK boundary with realistic fixtures — streaming chunks, error envelopes, tool-use payloads — so an SDK bump or prompt edit fails in CI rather than in production. Only meaningful once the typed boundary exists; without it there is no seam to test against, just scattered call sites that each need their own fixtures.
Dolt Test Infrastructure
## Ownership Zone The internal/testutil package and TestMain entry points that provision, isolate, and tear down Dolt containers for Beads' Go integration test suite. ## Rubric - **Container lifecycle correctness** — Shared and per-test Dolt containers start, expose mapped ports, and terminate cleanly; sync.Once gating and crash detection propagate failures without leaking containers or temp state. - **Per-test isolation** — Tests cannot observe each other's data: branch-per-test via DOLT_BRANCH, ResetTestBranch between subtests, MaxOpenConns(1) and USE-database invariants, and stale-branch cleanup all hold. - **Skip-vs-fail gating** — The doltReadiness state machine downgrades to a clean skip when Docker, the exact image, or BEADS_TEST_SKIP says so, instead of failing tests or making Docker Hub network calls. - **Production safety firewall** — Test infra refuses to touch production: port 3307 is rejected, BEADS_TEST_MODE is enforced, and shared test DB names never overlap real Beads data. - **Cross-platform parity** — Windows stubs match the Linux/macOS testutil API surface and skip cleanly; the CI matrix (Linux full, macOS full, Windows smoke) stays internally consistent with what testutil exposes. - **Dolt version pinning** — DoltDockerImage is the single source of truth for the Dolt version used in tests, kept in lockstep with the production Dolt runtime and validated by CI.
Monorepo Workspace Coherence
## Ownership Zone Owns the coherence of the workspace as a multi-package monorepo: the root workspace declaration, the shape and conventions of packages under packagesprompts: logical-model usage, registry name@version uniqueness, zod input contracts, deterministic render, and eval coverage. ## Rubric - **Versioning discipline** — Prompt changes bump version; each name@version is unique in the registry; shipped versions are not silently edited in place. - **Model agnosticism** — Prompts reference logical model names (reasoning-mid, reasoning-high, fast-cheap) and never hardcode vendor model IDs. - **Typed input contract** — Every prompt declares a zod input schema and is rendered through validated input (renderSafe), failing fast on bad input. - **Render purity** — render() produces ChatMessage[] deterministically from validated input with no side effects or hidden state. - **Eval coverage** — Prompts carry eval cases asserting output shape/quality; high-value prompts are not shipped eval-less.
Astro Build Resilience
## Ownership Zone Owns the Astro static site build pipeline end-to-end: the integrity of every `astro build` run, the warnings and errors it surfaces, the wall-clock time it takes, and the health of the inputs the build consumes (component imports, frontmatter contracts, image references, route collisions, layout integrity). Covers the relationship between source content and built output across the full file tree, the CI signal that gates deploys on a clean build, and the visibility of build health to non-engineering contributors who edit content but do not read build logs. Does not own runtime behavior in the browser or content authorship itself — only whether what authors and developers commit produces a trustworthy, fast, warning-free build artifact. ## Rubric - **Build determinism** — The same commit produces the same build output, the same warning set, and roughly the same duration on every run. This is the floor the rest of the rubric stands on: until the build is deterministic, every other dimension is grading noise. Flaky failures, order-dependent warnings, and "it built last time" are the failure modes this dimension calls out. - **Warning hygiene** — Warnings are treated as signal, not wallpaper. A clean build means zero warnings on main, every warning that does appear has a known owner and a known fate (fix, suppress with reason, or upstream issue), and new warnings fail loudly in CI rather than accumulating into background noise nobody reads. The bad version: a build log with 40 warnings everyone scrolls past. - **Input contract enforcement** — Only meaningful once the build runs cleanly: the things the build consumes — component props, frontmatter schemas, image paths, collection entries, route definitions — are validated at build time against a declared contract, so a typo in a content file or a renamed component fails the build with a precise message rather than producing a silently broken page. Contracts are explicit and versioned, not implicit in whatever the templates happened to read last. - **Build performance budget** — Builds complete within a stated time budget appropriate to the site's size, and sustained drift against that budget is treated as a regression with an owner. Sits on top of determinism: you can only defend a budget when run-to-run variance is small. The bad version is a build that quietly grew from 30 seconds to 4 minutes over a year because nobody was watching the trend. - **Content-author feedback loop** — Becomes possible once input contracts and warning hygiene are in place: a non-engineer who edits a markdown file or swaps an image gets a clear, local signal about whether their change will build, in language they understand, before it reaches main. Excellence here is judged by whether content contributors can self-serve — not by how elegant the build internals are. The failure mode is a content editor whose PR breaks the build and who cannot tell why without pinging an engineer. - **Deploy gate trust** — The capstone — only honest once the dimensions above hold: a green build on main is treated as sufficient evidence to deploy, and a red build actually blocks. No one routinely overrides the gate, no one ships from a local build to dodge CI, and stakeholders trust that "the site builds" means the site is in fact deployable. When the gate has been bypassed, there is a recorded reason and a follow-up.
Tenant Isolation
## Ownership Zone Multi-tenant org_id isolation: every tenant-scoped table carries org_id, every data access is scoped by org_id, and workflow/AI-call/audit records propagate tenant context. ## Rubric - **Schema tenancy** — Every tenant-scoped table declares a notNull org_id column referencing org.id. - **Query scoping** — Reads and writes on tenant tables filter by org_id; no unscoped queries that can span orgs. - **Context propagation** — Workflow runs, steps, ai_call, and audit_log carry org_id threaded from the event payload through execution. - **Cross-tenant leakage** — Joins, references, and outputs never mix rows across orgs; foreign keys stay within the same org. - **Audit traceability** — Tenant-scoped mutations are recorded in audit_log with org_id and actor for accountability.
Captain Permission Fence
## Ownership Zone Captain Permission Fence owns the authorization boundary between captains and crew members across the entire trip-management surface: score entry, trip editing, crew management, itinerary changes, and join-link administration. The zone covers server-side enforcement on every captain-only mutation endpoint, the row-level security policies on the underlying protected tables (trips, scores, crew_members, itinerary, trip_members), and the automated test coverage that proves rejection works for unauthenticated callers, crew callers, and captains of other trips. It also covers the consistency between what the UI shows as captain-gated and what the backend actually enforces, and the visibility of authorization posture to non-engineering stakeholders who need to answer questions like which actions a given role can perform. UI affordances and client-side gating are in scope only insofar as they must agree with the server's truth; the server and database are the source of that truth. ## Rubric - **Server-derived identity at the boundary** — Authorization decisions are made from a session the server itself derived, not from any value the client could shape — no trusting a userId in the body, a role in a header, or a captain flag in a cookie. This is the floor the rest of the rubric stands on: until identity at the boundary is real, every downstream check is grading work whose subject can be forged. The bad version is an endpoint that reads who the caller claims to be from the request and proceeds. - **Database-level backstop independent of app code** — Protected tables enforce ownership rules in the data layer itself, so a bug, a missing middleware, or a future endpoint cannot silently expose captain-gated rows. Only meaningful once server-derived identity exists, because the policies must key off a trustworthy principal. The failure mode this rules out is the all-too-common one where the only thing standing between a crew member and another trip's data is whether some developer remembered to add an if-check. - **Uniform enforcement across the protected surface** — Every captain-only action enforces the same captain-of-this-trip rule the same way, through a shared check rather than per-endpoint reinventions. Sits on top of the two foundational dimensions above: once identity and the database backstop exist, the question becomes whether the app layer applies them consistently. The eye-roll version is one endpoint checking ownership via a join, another via a cached role, and a third not at all — all nominally "protected". - **Negative-path test coverage by caller type** — Automated tests prove rejection, not just acceptance, and they exercise the three caller shapes that actually matter: unauthenticated, authenticated-but-not-a-member, and authenticated-captain-of-a-different-trip. Becomes possible once enforcement is uniform enough to assert against. A suite that only tests the happy path is grading whether captains can do their job, not whether anyone else is kept out — which is the entire point of the fence. - **UI/server agreement on what is gated** — What the interface presents as captain-only and what the server actually refuses to do for non-captains are the same set, with no actions hidden only by a missing button. This dimension is invisible from any single layer of the codebase alone — it requires comparing client affordances against server behavior. The failure mode is a crew member discovering, by curling the endpoint the UI hid, that the lock was cosmetic. - **Stakeholder-legible authorization model** — A non-engineer — a support agent, a product owner, a founder fielding a customer question — can answer "what can a crew member do versus a captain, and where is that written down?" without reading source code. The capstone of the rubric: only honest once enforcement is uniform and UI/server agree, because otherwise the documented model and the real one diverge. The bad version is a permissions story that lives only in the heads of two engineers and gets re-derived every time someone asks.
Dashboard Onboarding Clarity
## Ownership Zone Owns the path a new user or contributor walks from a fresh clone to a running local instance with all integrations live. The territory covers the README and quickstart, the .env.example and every variable a real run depends on, the runbook for setting up the GitHub OAuth app and obtaining tokens for GitHub, CircleCI, and Anthropic, the Settings page copy that guides token entry in-product, the MCP server setup guide, and the version pins (Node, package manager) that determine whether install steps even work. Also owns the contract that these surfaces stay in sync with each other and with the actual configuration the code reads at runtime, so that setup instructions do not drift as dependencies and integration points change. ## Rubric - **Runtime-config truth** — The set of environment variables, secrets, and version pins documented for setup matches what the code actually reads and requires at startup, with nothing extra and nothing missing. This is the floor the rest of the rubric stands on: if the documented config is fiction, every other dimension is grading a tour that leads somewhere the code does not live. Excellence looks like a single source of truth that documentation derives from, not two lists drifting apart; the failure mode is a new user copying a .env that boots the server but silently disables a feature. - **First-run path is linear** — A new contributor follows one ordered path from clone to working app, with no branching choose-your-own-adventure between platforms, package managers, or optional integrations until the core path works. Sits on top of runtime-config truth: ordering steps only helps if the steps themselves are real. The bad version is a README that lists prerequisites, configuration, and commands as parallel sections and leaves the reader to sequence them. - **Third-party setup is walked, not waved at** — For every external account, OAuth app, or token the product depends on, the docs name where to click, what scopes or permissions to grant, what to paste where, and how to tell it worked. Only meaningful once the first-run path is linear; otherwise the third-party detour stalls a user mid-sequence with no way back. Excellence reads like a runbook a non-expert can execute; the eye-roll version is a sentence saying create a GitHub OAuth app and configure the callback URL with no link, no field names, and no example values. - **In-product guidance matches the docs** — Settings pages, empty states, and inline help for tokens and integrations agree with the external docs on names, formats, and where to obtain values, and they degrade gracefully when something is missing or wrong. This is a stakeholder-facing dimension: a user who never opens the README should still succeed, and a support conversation should not have to reconcile two different vocabularies for the same token. Bad implementations have a Settings field labeled one way and a README that calls the same thing something else. - **Failure modes are legible to the person hitting them** — When setup goes wrong — wrong Node version, missing env var, expired token, misconfigured OAuth callback — the error the user sees points at the surface they need to fix, not at a stack trace ten layers down. Becomes possible once runtime-config truth is in place: you can only diagnose a missing variable clearly if you know which variables are required. The failure mode is a generic 500 or a TypeError on undefined that sends the user to ask in chat instead of self-serving. - **Doc freshness has an owner and a trigger** — Onboarding surfaces are revisited on a known trigger — dependency bumps, new integrations, version pin changes, settings additions — rather than whenever someone happens to notice rot. This dimension is invisible from the codebase alone: it is about team practice, not file contents. Excellence is a contributor knowing that adding a new env var or integration is not done until the corresponding doc surfaces are updated; the bad version is README drift discovered six months later by a frustrated new hire. - **Time-to-first-success is known** — Someone owns the answer to how long it takes a new contributor to go from clone to a running app with real integrations, and that number is measured from real attempts rather than guessed. The capstone — only honest once the dimensions above hold, because otherwise the number is measuring confusion rather than setup. Stakeholders (maintainers, hiring managers, OSS contributors) can answer is onboarding getting better or worse without reading code; the failure mode is a team that believes setup takes 15 minutes because that is how long it takes them, while every newcomer quietly spends three hours.
Supabase Query Boundary
## Ownership Zone Every Supabase client call site in the application — the `.from(...)` queries, their select/insert/update/delete/upsert shapes, the error returns they hand back, the TypeScript types that describe their rows, and the row-level-security assumptions baked into how they're issued. This steward owns the boundary between the Next.js application layer and the Supabase schema: how queries are shaped, how failures surface, how column lists are declared, and how schema drift is caught before it reaches a rendered page or an API response. It also owns the legibility of that boundary to non-engineering stakeholders who need to answer questions like "did a schema change break the trips page last night?" without reading TypeScript. It does not own the database schema itself, the auth provider, or unrelated network I/O — only the call sites where the app talks to Supabase. ## Rubric - **Error-return discipline** — Every query destructures and handles the `error` return; a failed query never silently produces an empty array that the UI renders as "no data." This is the floor the rest of the rubric stands on: until errors are observed at the call site, every other dimension is grading queries whose failures are invisible. The bad version is the one where a 500 from Postgres becomes a blank page and nobody finds out for a week. - **Explicit query shape** — Selects name their columns; inserts and updates name their fields; nothing relies on `select('*')` or implicit "give me whatever is there." Without this, the typed-schema and drift-detection dimensions below are reasoning about a shape the code never declared. The failure mode is a column rename or removal that compiles cleanly and ships, because the query never said what it actually wanted. - **Typed schema contracts at the boundary** — Only meaningful once query shapes are explicit: rows returned from Supabase are typed against a generated or hand-maintained schema definition, and a column that disappears from the database becomes a TypeScript error rather than a runtime `undefined`. The rough heuristic for the bad version is grepping for `as any` near a Supabase call, or finding handlers that destructure fields the schema no longer has. - **RLS and access-path coherence** — Sits on top of the dimensions above: queries are issued with the right client (anon vs service role) for the trust level of the caller, and the RLS policies the app depends on are documented somewhere a developer can find without spelunking the Supabase dashboard. The failure mode is a service-role client used in a user-facing route "because it was easier," quietly bypassing the policies the rest of the app assumes are in force. - **Schema-drift response cadence** — Becomes possible once the boundary is typed and explicit: when the database schema changes, there is a known path — generated types regenerated, affected call sites identified, owners notified — and that path runs on a cadence, not in reaction to a production incident. A team without this dimension finds out about drift from a customer; a team with it finds out from a CI failure or a scheduled review. - **Boundary observability for non-engineers** — The capstone — only honest once the surface is consistent enough to measure. A product manager, ops person, or founder can answer "are Supabase queries failing more than usual?" or "which tables does the app actually touch?" without paging an engineer or reading source. The bad version is a steward that knows the call sites perfectly but whose health is locked behind a developer's terminal.
Plugin Release Coherence
## Ownership Zone Version, identity, MCP server name, skill slug, and install-instruction consistency across the marketplace manifest, plugin manifest, SETUP.md, and README for the Steward Claude Code plugin. ## Rubric - **Version synchronization** — Marketplace version, plugin version, and any version references in SETUP/README move together on every release; no stale version strings linger after a bump. - **Identity and naming consistency** — Plugin name, MCP server name, marketplace name, and brand references match across manifest, SETUP, README, and skill files; old names (e.g. contextgraph) do not leak back in after a rename. - **Skill registration parity** — Every shipped skill under plugins/steward/skills/ is reflected with its real slug (e.g. steward:define-steward) in README and SETUP verification steps, and removed skills are removed from docs. - **Install and verify instructions** — Documented install, reload, update, /mcp check, and skill-availability check match what the current marketplace and plugin manifests actually expose; commands users are told to run still work. - **MCP server contract surface** — The mcpServers.steward declaration in plugin.json (name, type, url) matches what skills and docs tell users to expect, and changes to the server name or transport are propagated through every artifact.
Agentsonar Website Experience
## Ownership Zone The complete user-facing web experience for Agentsonar — visual design, interaction patterns, information architecture, performance characteristics, and accessibility. This includes the public website surfaces, landing pages, navigation flows, form interactions, and the overall impression a visitor forms in their first minutes. The steward owns the relationship between what the product does and what a visitor understands it does, the clarity of the value proposition, and whether the site invites engagement or creates friction. ## Rubric - **Value proposition clarity** — A visitor in their first 30 seconds understands what Agentsonar does and why they should care. The core promise is stated plainly, not buried in jargon or abstract language, and the landing experience immediately answers the question a prospect is asking: what problem does this solve for me? Confusion or misdirection at this layer is the floor the rest of the experience stands on. - **Information architecture and navigation** — The site structure reflects how a visitor thinks about the product, not how the engineering team organized the code. A user can find what they need without hunting; related concepts live near each other, and the path from entry point to key actions is obvious. Poor IA makes every other dimension harder — a beautiful page nobody can find is invisible. - **Interaction responsiveness and smoothness** — Forms, buttons, and interactive elements respond immediately and predictably. Lag, unresponsive clicks, or unclear feedback on state changes create doubt about whether the product itself is reliable. Interactions should feel snappy enough that the user never wonders if they were heard. - **Visual consistency and brand coherence** — The site speaks in a single visual voice — consistent typography, color use, spacing, and component design across pages. Inconsistency reads as unfinished or untrustworthy. The visual language should reinforce the positioning: if Agentsonar is modern and precise, the design should feel that way. - **Accessibility and inclusive design** — The site is usable by people with different abilities: keyboard navigation works, color contrast is sufficient, text is readable, and interactive elements are discoverable without a mouse. This is not a nice-to-have; it is the floor for a professional product. Inaccessible sites exclude users and signal carelessness. - **Stakeholder alignment on positioning** — The founding team, product, and marketing agree on what the site is saying about Agentsonar and who it is for. Without this alignment, the site becomes a patchwork of conflicting messages. This dimension is invisible in the code but shows up in whether the site reinforces or undermines the company's strategy.
Navigation & Route Coverage
## Ownership Zone Owns the complete map of routes the site generates and the navigation fabric that connects them — the header and primary nav, category and index pages, in-content cross-links within guides and food entries, footer links, and any programmatic linking between related items. Responsible for knowing every URL the generator emits, whether each one is reachable from at least one navigation path, and whether every internal href resolves to a real generated route. Covers the lifecycle of new pages joining the site (a new food item or guide must be wired into navigation, not just generated) and the lifecycle of removed or renamed pages (inbound links must follow). Also owns the visibility of navigation health to non-engineering contributors — writers and editors adding content should be able to see whether their page is reachable without reading code. ## Rubric - **Route enumeration is ground truth** — There exists a single, trustworthy answer to the question what URLs does this site emit, derived from the generator itself rather than guessed from the file tree or scraped after deploy. This is the floor the rest of the rubric stands on: until route enumeration is reliable, every other dimension is grading work against an unknown denominator, and orphan or broken-link claims are unfalsifiable. - **Link integrity is enforced, not hoped for** — Every internal href the site emits points at a route that actually exists in the enumerated set, and a dangling link fails the build or a checked gate rather than shipping silently to readers. Only meaningful once route enumeration is ground truth; with that in place, link integrity becomes a mechanical check rather than a judgment call. The bad version is a site where 404s are discovered by users. - **Reachability is a property of every page** — Every generated page has at least one inbound navigation path from a known entry point (home, header, category index, or a guide that itself is reachable), and orphans are treated as defects rather than as content that exists but no one can find. Sits on top of route enumeration: you cannot count orphans until you can list pages. The failure mode is a page that exists at a URL but is invisible to anyone who didn't author it. - **Navigation reflects the content model** — Categories, indexes, and cross-links mirror the actual shape of the content (taxonomy, relationships between items and guides, hierarchy depth) rather than drifting into a historical artifact of how the site looked two redesigns ago. Becomes possible once reachability is solid; the question shifts from can users get there to can users get there the way the content suggests they should. The eye-roll version is a category page that lists six items while the generator emits sixty. - **Content authors can self-serve** — Writers and editors adding a new food item or guide can tell, before merging, whether their page will be reachable and whether their internal links resolve, without asking an engineer or waiting for a deploy. This is the stakeholder-facing dimension: excellence here is judged by whether non-engineering contributors are unblocked, not by how clever the tooling is. The bad version is a tribal-knowledge process where only the original author knows which nav file to edit. - **Change hygiene on rename and removal** — When a page is renamed, moved, or retired, inbound links and redirects are updated as part of the same change, and the steward's map reconciles rather than carrying ghost entries. Only meaningful once enumeration and link integrity are in place; without them, rename hygiene degenerates into chasing 404s reported by readers. Excellence looks like no link rot accumulating across releases. - **Navigation health is legible without code** — Counts of orphaned pages, broken internal links, and unreachable routes are visible to a non-engineer in a place they can find on their own, with enough history to tell whether things are improving or regressing. The capstone — only honest once the underlying enumeration, integrity, and reachability dimensions are solid enough that the numbers mean what they say.
Input Sanitization
## Ownership Zone Every user-facing input surface in the codebase — form fields, URL parameters, API request bodies, file uploads, and any data sourced from external systems — and the validation, escaping, and encoding logic that prevents malicious payloads from reaching execution contexts. This includes input validation at the boundary, output encoding for the rendering context (HTML, SQL, shell, JSON), and the relationship between declared input schemas and the actual sanitization applied downstream. The steward owns the gap between what a user can send and what the system safely executes. ## Rubric - **Boundary validation is declarative** — Input validation lives at the entry point and is expressed in a single source of truth — a schema, type definition, or validation rule that every handler consults. Without this, validation logic scatters across handlers and diverges; a field validated in one endpoint is trusted unvalidated in another, and the gap is invisible until exploit time. Validation is impossible to skip by accident. - **Output encoding matches the context** — Data is encoded for the specific context it enters — HTML entities for HTML, SQL escaping for queries, shell quoting for commands, JSON escaping for JSON. A single encoding function applied everywhere is a sign that the team does not distinguish contexts; the same string safe in HTML is dangerous in SQL. Encoding is applied at the point of output, not assumed to have happened upstream. - **Injection vectors are named and tested** — The team knows which inputs can reach which execution contexts and has written tests that verify each vector is blocked. Without this, injection risks hide in the gap between what the team thinks is validated and what actually is. A new feature that adds a path from user input to a database query is a typed change that surfaces the injection test, not an implicit assumption. - **Dangerous operations are explicit** — Code that interprets user input as code — eval, dynamic SQL construction, template injection, unsafe deserialization — is visible and rare. If the codebase uses these patterns, they are justified in comments, isolated to a small surface, and guarded by strict input constraints. A reader should be able to find every place user input flows into code execution in under a minute. - **Validation failures are observable** — When input validation fails, the event is logged with enough context to detect patterns — repeated failures from the same source, systematic probing of a field, or a new attack vector. A validation failure that disappears silently or is only visible in a debug log is a missed signal; the team should be able to answer whether they are under attack without reading code. - **Security assumptions are documented** — The team has written down what they assume about input — which fields are trusted, which are user-controlled, which sanitization is applied where, and what the consequences are if an assumption breaks. Without this, the next engineer assumes the wrong thing and introduces a gap. Documentation is updated when assumptions change, not written once and forgotten.
Knowledge Store Integrity
## Ownership Zone The repository knowledge store — docs/, AGENTS.md, and ARCHITECTURE.md — keeping repository knowledge synchronized with repository state across quality, discoverability, traceability, structure, and coverage. ## Rubric - **Knowledge Freshness** — Generated and SYNC artifacts (db-schema, api-surface, dep-graph, repo-map) are regenerated to match current repository state; stale generated docs are caught. - **Knowledge Discoverability** — Docs live in the correct tier/location and are reachable from entry points (README, AGENTS.md, docs indexes); nothing is orphaned or misfiled. - **Cross-Reference Integrity** — Internal links and file-path references between docs, and from docs to code, resolve to real targets; no broken or dangling references. - **Traceability** — Each generated/analysis artifact names its source, and decision/history docs link to the commits, PRs, or canonical intent that justify them. - **Documentation Drift** — Narrative and canonical docs (ARCHITECTURE.md, docs/canonical/architecture.md) accurately describe current repository reality; divergences are flagged per the SYNC vs ASYNC tier rules. - **Repository Coverage** — Every significant repository asset (system, package, app, route, table, steward) is represented somewhere in the knowledge store; undocumented assets are detected.
Image Asset Health
## Ownership Zone Every image asset the site depends on — food item photos, guide illustrations, and the OG image generation pipeline — together with the references that bind them to content entries, components, and route templates. This covers the full lifecycle: which images exist on disk, which are referenced, which are generated on demand, whether each rendered page resolves to a real file, and whether the social-sharing surface produces valid output for every route. The zone includes the inverse direction too: assets that exist but are no longer referenced, and references that point at paths nothing produces. It does not extend to image content choices or visual design — only to whether the pipeline from authored reference to delivered pixels is intact, lean, and observable. ## Rubric - **Reference resolvability** — Every image path named in content, components, or templates resolves to a real, non-empty file at build time, and an unresolvable reference fails the build loudly rather than shipping a broken `<img>` tag to production. This is the floor the rest of the rubric stands on: until references resolve, sizing, generation, and orphan hygiene are all grading work that may render as a broken icon anyway. - **Generated-image pipeline integrity** — Routes that rely on generated imagery (OG cards, derived thumbnails, templated illustrations) produce valid, correctly-dimensioned output for every input the route can receive, not just the handful exercised during development. The bad version of this dimension is a generator that silently emits a 0-byte file or a fallback placeholder for half the catalogue and nobody notices until a link is shared. - **Asset library hygiene** — The set of files on disk stays close to the set of files actually referenced; orphans are pruned on a known cadence rather than accumulating as repo weight, and additions are deliberate rather than drive-by. Only meaningful once reference resolvability is in place — otherwise pruning is dangerous because you cannot trust the reference graph you are pruning against. - **Delivery weight discipline** — Images are sized, compressed, and formatted for the surface that actually consumes them, with the source-of-truth original kept separate from the web-delivery variant. A rubric-failing setup ships 4MB hero JPEGs to mobile, has no convention for which dimensions and formats are canonical, and treats every new image as a one-off decision. - **Authoring ergonomics** — Sits on top of the dimensions above: a content author can add a new food item or guide without learning the asset pipeline, knows exactly where to drop the image and how to reference it, and gets immediate feedback when they get it wrong. When this fails, you see the same handful of engineers re-explaining the conventions in PR review and authors avoiding image-heavy entries entirely. - **Stakeholder-facing visibility** — The capstone — only becomes possible once the surface is consistent enough to measure honestly. A non-engineer (content owner, founder, marketer checking a social share) can answer questions like how many pages have working previews, which entries are missing imagery, and whether last week's content drop rendered cleanly, without asking an engineer to grep the repo.
GitHub GraphQL Boundary
## Ownership Zone Every GitHub GraphQL query the application and MCP server issue, the TypeScript types those queries map onto, and the proxy layer that mediates between the GitHub API and the rest of the app. Covers query authoring and naming, schema validation against the live GitHub schema, response type fidelity, the handling of GraphQL-level and HTTP-level error paths (auth, rate limits, partial-data responses, network failures), and the visibility of API health to anyone debugging a broken UI state. The zone ends where domain logic begins — once a typed, validated response leaves the boundary, downstream concerns belong to other stewards. ## Rubric - **Schema-anchored queries** — Every query is checked against the real GitHub GraphQL schema as part of the normal development loop, not as a manual ritual. This is the floor the rest of the rubric stands on: until queries are anchored to the schema, type fidelity and error handling are grading work that may already be wrong. A renamed or removed field fails at build or CI time, not at runtime in front of a user, and the validation surface is impossible to bypass by accident. - **Type fidelity end-to-end** — Only meaningful once schema anchoring is in place: response types reflect what the schema actually returns, including nullability, union variants, and connection shapes. Raw API payloads do not enter the app via unchecked casts that paper over drift; when the schema changes, the type system surfaces every consumer rather than letting a silently-wrong shape propagate into rendering code. - **Explicit failure surface** — Each distinct failure mode at the GitHub boundary — network error, non-2xx HTTP, GraphQL errors array, partial data, 401 auth, 403/429 rate limit, timeout — has a named, structured handling path. Bad practice here is the catch-all that turns six different failures into one opaque message; good practice is that a caller can tell auth failure from rate limiting from a malformed query without reading the proxy source. - **Query hygiene and discoverability** — Queries are named, colocated with their types, and easy to enumerate. A practitioner asking what does this app ask GitHub for? can answer it from a single inventory rather than grepping. Anonymous one-off queries scattered across handlers are the failure mode this dimension calls out; a clean zone makes it obvious which queries exist, who calls them, and what schema surface they depend on. - **Boundary discipline** — Builds on type fidelity: the proxy is the only path between the app and GitHub, and it is the only place that knows about GitHub-specific concerns (auth headers, rate-limit semantics, GraphQL error shape). Domain code does not reach around the boundary, and the boundary does not leak GitHub-shaped error objects or untyped blobs into domain code. Violations show up as duplicated request logic or domain modules importing GitHub SDK types directly. - **Operator-visible API health** — The capstone, only possible once the failure surface is explicit and queries are enumerable: when the dashboard is empty or stale, a non-engineer can tell whether GitHub returned an error, rate-limited the app, returned partial data, or simply had nothing to show. Per-query failure rates, recent rate-limit hits, and auth status are visible without reading code, so debugging a broken UI state does not start with paging an engineer to add logging.
Env Config Safety
## Ownership Zone Owns the application's environment-variable configuration surface end to end: which variables are required, how they are validated, where they are read, how they are documented for new contributors, and how secrets are separated from public/feature-flag values. Covers the canonical validation module, the public env example file, and every consumer that reads configuration anywhere in the codebase. Responsible for the contract between the running application and its deployment environment — making sure missing or malformed configuration fails loudly at startup rather than silently degrading features in production. Also responsible for keeping the developer-onboarding and operator-handoff story honest, so that someone setting up a new environment knows exactly what to provide and what each value is for. ## Rubric - **Single point of access** — All configuration is read through one canonical, validated module; raw environment lookups scattered across the code are treated as bugs, not style preferences. This is the floor the rest of the rubric stands on: until every consumer goes through one path, validation, documentation, and secret hygiene are all grading a surface they don't actually control. The bad version is a codebase where each feature reaches into the environment on its own and "is this set?" has a different answer in every file. - **Fail-fast on startup** — Only meaningful once a single point of access exists: with one entry point, missing or malformed values can be caught before the app serves a single request, with an error message that names the variable and what it is for. The failure mode this rules out is the silent one — a feature that appears to work in development and quietly no-ops or 500s in production because a key was never set. Required vs. optional is an explicit decision per variable, not an accident of which code path runs first. - **Typed and narrowed values** — Sits on top of fail-fast validation: once a value is required, it is also coerced to its real shape (URL, boolean, enum, integer) and exposed to consumers as that type. Booleans aren't compared as strings, numeric limits aren't parsed at every call site, and an enum-shaped flag with an unexpected value is rejected at the boundary rather than silently falling through to a default branch downstream. - **Secret vs. public discipline** — Public values (anon keys, feature flags, client-side URLs) and true secrets (server-side API keys, signing keys) are separated by naming convention and by where they are allowed to be read. A practitioner can tell at a glance which bucket a variable is in, and the build cannot accidentally ship a server secret into a client bundle. The bad version is a flat list where everything looks the same and the only thing standing between a secret and the browser is somebody remembering. - **Onboarding and operator clarity** — Visible from outside the codebase, not from inside it: a new developer or a deploy operator can stand up a working environment from the documented example without reading source code, and every required variable has a placeholder, a one-line description, and a pointer to where to obtain it. Drift between the validation module and the example file is the canonical failure mode here — silently undocumented requirements that break new setups weeks after the variable was added. - **Change visibility for stakeholders** — The capstone — only becomes possible once the surface is unified, validated, and documented. When configuration requirements change (a new integration, a renamed key, a flag flipped on in production), the change is legible to the people who have to act on it: ops knows what to set, product knows which flag controls which behavior, and a non-engineer can answer "is this feature on in production?" without grepping the repo. The bad version is configuration changes that land as silent commits and surface as incidents.
CSP Policy Integrity
## Ownership Zone Every Content Security Policy directive served by the Next.js frontend — script-src, frame-src, connect-src, style-src, img-src, font-src, and the rest — along with each allowed origin, hash, or nonce, the feature or integration that justifies it, and the mechanism (middleware, headers config, meta tag) that delivers the policy to the browser. The zone covers how the policy is composed, how it is rolled out (report-only vs enforcing), how violations are observed, and how the policy stays aligned with the actual set of third parties the product depends on. It also covers the human-facing side: whether product, security, and integration owners can answer what is allowed, why, and what would break if it were removed. It does not own the third-party scripts themselves or the application code that uses them — only the trust boundary that decides what the browser is permitted to load and execute. ## Rubric - **Directive completeness and precision** — The floor the rest of the rubric stands on. Every fetch directive a modern app needs is explicitly set rather than inherited from default-src by accident, and each one lists the narrowest set of sources that actually make the feature work. The bad version is a single sprawling default-src with wildcards and a script-src that grew by accretion; the good version is a policy where you can point at any entry and name what would break without it. - **Provenance of every allowance** — Every origin, hash, and nonce in the policy traces back to a specific feature, vendor, or integration, recorded somewhere a human can read. Without this, the directive surface becomes a graveyard of entries no one dares delete; with it, removing a vendor is a normal cleanup task instead of a multi-hour archaeology dig. This is the dimension the directive inventory and justification-coverage metric exist to make reportable. - **Nonce and hash discipline over unsafe-inline** — Inline scripts and styles are admitted via per-request nonces or content hashes, not via blanket unsafe-inline or unsafe-eval escape hatches. The contrast: a policy that looks strict on paper but quietly carries unsafe-inline because one analytics snippet needed it three years ago is failing this dimension, even if every other directive is tight. - **Violation observability** — Only meaningful once the policy is precise enough to trust: a noisy policy produces noisy reports no one reads. CSP violation reports are collected, deduplicated, and routed somewhere a human actually looks, with enough context (directive, blocked URI, source file, user agent) to tell a real attack or regression apart from a browser extension. Silent enforcement with no report sink is the failure mode this calls out. - **Safe rollout and change discipline** — Becomes possible once observability is in place. New directives or tightened ones go through report-only before enforcement, changes are reviewed against the inventory rather than appended blindly, and there is a known path to ship a fix when a third party rotates a domain. The bad version is editing the policy directly in production and finding out from customer reports. - **Stakeholder legibility** — The capstone, and the dimension that fails most quietly. A non-engineer — a security reviewer, a vendor-onboarding PM, a compliance auditor — can answer what third parties the site trusts, why each is trusted, and what changed last quarter, without reading middleware source. If that question requires grepping the repo, the policy is technically correct but organizationally opaque.
STT Provider Boundary
## Ownership Zone Owns the contract surface between the transcription router and every speech-to-text provider implementation it dispatches to — currently Google Cloud Speech, OpenAI Whisper, GPT-4o Audio, Qwen3-ASR-Flash, and ElevenLabs Scribe, plus any future addition. Responsibilities span the request/response adapter for each provider, audio format and language code normalization, error and timeout semantics, model and version pinning, feature-flag and routing rules that select a provider, and the fallback behavior when a provider degrades or deprecates a model. Also owns the observability of provider behavior — latency, error rates, transcription quality signals — at a granularity that lets the team reason about which provider to trust for which traffic. Does not own the upstream audio capture pipeline, downstream consumers of transcripts, or the router's business-logic decisions beyond the provider-selection layer. ## Rubric - **Adapter contract uniformity** — Every provider sits behind the same input/output shape, the same error taxonomy, the same timeout and cancellation semantics, and the same handling of audio format, sample rate, and language code. This is the floor the rest of the rubric stands on: until the contract is uniform, routing decisions, quality comparisons, and fallback logic are all comparing apples to oracles. The bad version is each provider leaking its SDK's quirks — one returns segments, another returns a flat string, a third throws a vendor-specific error type — and callers branching on provider identity. - **Version and model pinning discipline** — Each provider call names an explicit model and API version rather than riding the vendor default, and the pinned version is tracked somewhere a human can read without grepping. Only meaningful once the adapter contract is uniform, because otherwise version drift hides inside per-provider quirks. The failure mode this calls out: a vendor silently rotates the default model, transcription characteristics change overnight, and nobody can say which deploy introduced the shift. - **Deprecation and change awareness** — Someone is responsible for knowing when each provider is deprecating a model, changing pricing, changing rate limits, or shipping a breaking API change, and that knowledge has a place to live other than one engineer's inbox. This dimension is not visible from the codebase alone — it lives in vendor changelogs, status pages, and account-rep emails. The bad version is finding out a model was sunset because production started 404ing. - **Routing and fallback intent is legible** — The rules that send a given request to a given provider — feature flags, traffic splits, language-based routing, cost tiers, A/B tests — are explicit, named, and explain *why* they exist, and fallback chains have defined trigger conditions rather than ad-hoc try/except. Sits on top of the uniform adapter contract: you can only route confidently across providers whose contracts you trust to behave the same. The failure mode is a tangle of conditionals where nobody can answer which provider a given customer's audio is hitting today, or what happens when it fails. - **Per-provider quality and reliability is measured** — Latency, error rate, timeout rate, and a transcription-quality signal (WER on a held-out set, human spot-checks, downstream rejection rate, or similar) are tracked per provider and per model version, at a granularity that lets the team notice regressions within days, not quarters. Becomes possible once pinning and uniform contracts are in place, because otherwise you cannot attribute a quality dip to a specific provider-and-version pair. The bad version is a vague sense that one provider is better without numbers to back it. - **Stakeholder-answerable provider posture** — A non-engineer — product, ops, support, finance — can get answers to questions like which provider is handling which traffic right now, what we pay per minute by provider, when we last switched a default, and what we'd lose if a given vendor went down tomorrow. This is the capstone: it only becomes honestly answerable once routing is legible and per-provider metrics exist. The failure mode is every such question becoming a half-day engineering investigation, and provider decisions getting made on vibes because the data is locked inside code.
OAuth Session Integrity
## Ownership Zone Owns the GitHub OAuth flow end-to-end — login initiation, callback handling, session establishment, and logout — and the full lifecycle of every httpOnly cookie token stored on behalf of the user (GitHub, CircleCI, Anthropic, and any future provider tokens that ride the same cookie surface). Responsible for how token expiry, revocation, corruption, and CSRF-class attacks are detected and surfaced, so that a stale or hostile credential fails cleanly at the auth boundary rather than cascading into downstream API routes. Guards the contract between edge-runtime auth routes and server-side proxying routes: which routes are allowed to assume a valid session, how that assumption is validated, and what happens when it does not hold. Also owns the operator-facing visibility into auth health — who is logged in, why logins fail, and which routes are protected — so that session-layer incidents are diagnosable without grepping the codebase. ## Rubric - **Cookie hygiene as the foundation** — Every token cookie is httpOnly, scoped, signed/encrypted as appropriate, and has a single owner that knows its set, read, and clear paths. This is the floor the rest of the rubric stands on: until cookie semantics are unambiguous, every other dimension is reasoning about state that other code paths can quietly mutate. The bad version is tokens written in one place and forgotten in another, where logout leaves residue and nobody can say which routes touch which cookie. - **CSRF and callback integrity** — The OAuth callback verifies that the response it is processing is the one this browser initiated: state parameter generated, stored, and checked; redirect targets constrained to a known set; replayed or cross-origin callbacks rejected loudly. Builds directly on cookie hygiene, since state itself rides the cookie surface. The failure mode this dimension exists to prevent is a callback that happily mints a session for whoever shows up with a valid-looking code. - **Failure-mode behavior under bad credentials** — Expired, revoked, malformed, and impersonated tokens produce a single well-defined outcome at the auth boundary: the session is invalidated, the user is sent through re-auth, and downstream handlers never see a half-valid credential. Only meaningful once cookie hygiene and callback integrity are in place; otherwise the system cannot tell a bad token from a missing one. The bad version is a 500 from a deep API call because a GitHub token silently expired three days ago. - **Route auth contract clarity** — Every server route falls into a known category — public, session-required, session-optional, internal — and the category is enforced in one obvious place rather than re-derived per handler. This sits on top of failure-mode behavior: a route only benefits from a clean failure path if it actually invokes the validator. The bad version is the auth check copy-pasted into some handlers, forgotten in others, and impossible to audit without reading every file. - **Stakeholder visibility into auth health** — Non-engineering stakeholders (support, ops, the person triaging a Monday-morning incident) can answer questions like did logins start failing last Thursday, is this user actually authenticated, and which provider token is stale — without paging an engineer to read logs. This dimension is not visible from the codebase alone; it is judged by whether the people downstream of the auth boundary can self-serve. Becomes possible only once the route contract and failure modes are consistent enough to measure honestly. - **Cross-provider token coherence** — When more than one provider's token rides the same session, their lifecycles are reasoned about together: a revoked GitHub token does not leave a live CircleCI cookie behind, and adding a new provider follows a known pattern rather than inventing a fourth cookie shape. This is partly an organizational property — it depends on whoever adds the next provider knowing the pattern exists — and partly a code property. The bad version is each provider integration looking like it was written by someone who had never seen the others. - **Auditability of session decisions** — Every session-affecting decision (issued, refreshed, rejected, cleared) leaves a trace that an operator can reconstruct after the fact, with enough context to distinguish user error from attack from bug. The capstone dimension: only meaningful once the decisions themselves are consistent across cookies, callbacks, failure modes, and routes. The bad version is a user reporting they were logged out and nobody, including the steward, being able to say why.
Layer Boundary Integrity
## Ownership Zone Monorepo layering and import-direction rules: the apps→systems→packages dependency flow, packages staying generic, systems staying infrastructure-free, and no cross-system imports. ## Rubric - **Import direction** — Dependencies flow apps→systems→packages only. packages never import systems or apps; systems never import apps. - **Cross-system isolation** — No system imports another system. Shared needs are extracted into a package, not reached across systems/. - **Package purity** — packages/ stay reusable and generic — no business logic or system-specific domain concepts leak in. - **System purity** — systems/ hold business logic only — no infrastructure wiring (db clients, provider SDK setup, deploy concerns) belongs there. - **Placement correctness** — New code lands in the layer the AGENTS.md 'Where Things Go' table dictates: integrations, prompts, workflows, and services in their designated paths.
WCAG 2.2 AA Compliance
## Ownership Zone Every user-facing surface in the workspace — pages, components, interactive widgets, forms, navigation, media, and dynamic content — held to WCAG 2.2 AA. The zone covers semantic structure and landmarks, keyboard operability and focus management, screen reader exposure (names, roles, states), color and non-color contrast, motion and timing, error identification and recovery, and the assistive-technology behavior of any custom or third-party UI. It also covers the supporting practice around compliance: how new work is gated before merge, how known gaps are tracked and prioritized, and how non-engineering stakeholders (product, legal, support) can answer questions about the workspace's accessibility posture without reading code. ## Rubric - **Semantic foundation** — Pages are built from real landmarks, headings in a sensible order, native form controls with associated labels, and lists that are actually lists. This is the floor the rest of the rubric stands on: contrast tweaks and ARIA polish on top of div soup buy nothing, because assistive tech has nothing to anchor to. The bad version is a tree of generic divs with role attributes sprinkled on top to simulate structure that should have been there from the start. - **Keyboard and focus discipline** — Every interactive element is reachable and operable by keyboard alone, focus order matches visual order, focus is visible at all times, and focus is managed deliberately when content moves (dialogs, route changes, disclosure). Only meaningful once the semantic foundation is real, since focus follows the document model. The failure mode this calls out is the invisible focus ring, the tab that escapes into a modal's backdrop, and the route change that strands a screen reader on stale content. - **Assistive-technology truthfulness** — What a screen reader announces matches what a sighted user perceives: accessible names exist and are accurate, state changes (expanded, selected, busy, invalid) are exposed, dynamic updates reach users via live regions or focus moves, and ARIA is used to fill gaps in native semantics rather than to paper over the wrong element. Sits on top of the semantic foundation; without it, ARIA becomes decoration. The bad version is a button labeled icon, a toggle whose pressed state never changes, and a toast no one hears. - **Perceivable presentation** — Text and meaningful non-text content meet contrast minimums, information is never conveyed by color alone, content reflows without loss at 400% zoom and 320 CSS pixels wide, and motion respects user preferences. This dimension is largely assessable from rendered output, and is where automated tooling earns its keep — but only catches the floor, not the ceiling. - **Pre-merge accessibility gate** — Not visible from a code snapshot alone; this is a property of how the team works. New and changed surfaces are checked against AA before they ship, automated checks block on regressions rather than warn, and authors know which manual checks (keyboard pass, screen reader smoke test) are expected for the kind of change they made. The contrast is a team where accessibility is a quarterly cleanup pass versus one where a regression cannot reach main. - **Known-gap hygiene** — Also a practice property, not a code property. Every known violation has an owner, a severity tied to user impact (not just rule id), and a remediation state that ages visibly; nothing rots silently in a backlog labeled accessibility. The failure mode is a five-year-old issue list where no one can tell which items are still real, which are duplicates, and which already shipped fixes. - **Stakeholder legibility** — The capstone — only possible once the gate and the gap list are honest. A product manager, support lead, or legal reviewer can answer questions like what is our current AA coverage, which surfaces are known-noncompliant, and what is the remediation timeline without paging an engineer or reading a PR. The bad version is an org that believes it is compliant because no one has asked recently.
PostHog Event Integrity
## Ownership Zone Every PostHog integration point across the platform — SDK initialisation and provider wiring on the web surface, every capture, identify, and group call site, autocapture and session replay configuration, feature-flag usage, and the relationship between events emitted in code and what growth, product, and founders consume downstream in PostHog dashboards, funnels, and retention reports. The zone extends to instrumentation gaps in adjacent surfaces (such as CLI or server-side tooling) where product-critical flows happen outside the browser and represent blind spots in the user journey. It also covers the event taxonomy itself — the naming conventions, property shapes, and type-safety guarantees that determine whether data arriving in PostHog is queryable signal or accumulating noise. The steward owns the contract between the code that emits events and the humans who try to answer questions from them. ## Rubric - **Event taxonomy discipline** — Every event name follows a single documented convention and the convention is enforced at the call site, not by downstream cleanup or rename rules in the warehouse. The failure this guards against is the same logical moment shipped under three slightly different string literals from three components, producing three lines in PostHog where there should be one. This is the floor the rest of the rubric stands on: no other dimension is meaningful if the taxonomy is incoherent, because every funnel and dashboard sits on top of names. - **Type-safe emit boundary** — Tracking calls reference a shared, typed catalogue of event names and property shapes rather than passing ad-hoc string literals and untyped property bags. Without this a typo or a renamed property silently breaks a funnel and nobody notices until a quarterly review. Builds directly on taxonomy discipline — the catalogue is the taxonomy made enforceable, and the compiler becomes the first reviewer of every analytics change. - **Identify and group hygiene** — Identify fires at session-start and auth-state-change with a stable user ID, and group associates users with their org or tenant where applicable, before any meaningful event is captured in that session. Without this events land as anonymous noise and org-level analytics are fiction; funnels built on unidentified events silently undercount conversion. Sits alongside taxonomy discipline as a foundational concern — a clean name on an anonymous event is still a half-measurement. - **Coverage of meaningful moments** — Signup, activation, the handful of key product actions, upgrade, error states, and churn-risk moments all fire an event, and coverage is judged by whether a product or growth stakeholder can answer what happened in the user journey from PostHog alone without asking an engineer to query the database. The bad version is a dashboard full of pageviews and autocapture clicks with no domain verbs, where every real question requires a SQL detour. Only meaningful once the taxonomy is stable enough that adding a new event doesn't create ambiguity with existing ones. - **SDK configuration consistency** — PostHog is initialised once per surface with explicit, reviewed settings for autocapture, session replay, cross-subdomain tracking, PII redaction, and feature-flag bootstrap, and those settings agree across client and server and across environments. Configuration disagreements produce data that looks correct in staging and breaks in production, or worse, leaks PII that a privacy review assumed was redacted. Becomes auditable once identify hygiene is in place, because misconfigured init is invisible when users aren't identified. - **Dashboard-to-code alignment** — Every event referenced in a dashboard, funnel, or insight corresponds to a live capture call, and every capture call is consumed by at least one downstream artefact a stakeholder actually looks at. Orphaned dashboard references produce silent zeros that erode trust in the analytics surface; orphaned capture calls waste payload and clutter the event stream so newcomers can't tell signal from legacy. This is a capstone dimension — only meaningful once the taxonomy, type safety, and coverage dimensions are healthy enough that the catalogue of events is stable and enumerable on both sides. - **Analytics health legibility** — A non-engineer can answer are events still flowing and did we lose tracking last week without paging someone, because ingestion volume, event-type cardinality, and identify-rate are monitored or at least reviewed on a known cadence. The bad version is discovering a three-week instrumentation outage when a board deck is being prepared. Sits on top of every other dimension: you can only monitor what you've named, typed, identified, and wired to something a stakeholder reads.
Accessibility Baseline
## Ownership Zone Every interactive surface on the site that a non-mouse, non-sighted, or assistive-technology user has to navigate — focus order and focus visibility, keyboard reachability of all controls, semantic roles and ARIA attributes, accessible names and descriptions, color contrast and motion preferences, and the live behavior of media controls (audio play/pause, captions, transcripts) and custom widgets like the phone mockup. Covers the full path from page structure (landmarks, headings, skip links) through component-level behavior (buttons, links, menus, dialogs) to dynamic states (loading, error, expanded/collapsed). Includes the relationship between the rendered DOM and what assistive tech actually announces, and the visibility of accessibility health to non-engineering stakeholders who need to know whether the site meets the standard the org has committed to. ## Rubric - **Semantic foundation** — The page is built from real HTML elements with correct roles and a sane heading and landmark structure; custom widgets only reach for ARIA when no native element fits, and never to paper over the wrong element underneath. This is the floor the rest of the rubric stands on: every downstream dimension assumes assistive tech is being handed a structure that means what it looks like, and a div-soup page with bolted-on roles makes keyboard and screen-reader excellence impossible to achieve no matter how much polish goes on top. - **Keyboard parity** — Anything a mouse user can do, a keyboard user can do in a predictable order, with a focus indicator that is always visible and never trapped where it shouldn't be. The bad version is the one where Tab skips a custom control entirely, or lands on it but Enter and Space do nothing, or opens a modal that the user cannot escape — keyboard parity is judged by walking the page with the mouse unplugged, not by reading the code. - **Accessible naming and state** — Every interactive control has a name a screen reader will actually speak, and its state (pressed, expanded, selected, busy, disabled) is exposed programmatically and stays in sync as the UI changes. Only meaningful once the semantic foundation is in place; until then, a correct aria-label is being attached to the wrong kind of element. The failure mode is the button announced as button, button, button across a whole toolbar, or the toggle whose visual state and aria-pressed have drifted apart. - **Media and motion respect** — Audio and video controls are operable without a mouse, captions and transcripts exist for spoken content, autoplay does not hijack focus or sound, and animations honor prefers-reduced-motion. Sits on top of keyboard parity and accessible naming: a media player that fails those is not made accessible by adding a transcript. The bad version is the one where the only way to pause the looping background audio is to find a control no screen reader announced. - **Lived testing with real assistive tech** — Excellence is judged by how the site behaves under an actual screen reader and keyboard, on the platforms users are on, not by automated scan scores alone. This dimension is largely invisible from the codebase: it lives in whether someone on the team has run VoiceOver, NVDA, or TalkBack on the real flows recently, and whether known assistive-tech quirks are tracked rather than rediscovered. Automated checks catch missing alt text; they do not catch a focus order that makes no narrative sense. - **Standard and stakeholder legibility** — The team has named the conformance target it is holding itself to (e.g. a specific WCAG level) and a non-engineering stakeholder — product, legal, a partner asking about compliance — can find out where the site stands against that target without reading code or filing a ticket. Becomes possible once the dimensions above are real enough to measure honestly; before then, any status report is fiction. The failure mode is the org that claims a conformance level in marketing copy while no one internally can point to what is and isn't covered.
Subscription & Usage Guardrails
## Ownership Zone Subscription lifecycle state machines, usage metering, free-tier enforcement, Stripe billing integration, and API access gating. ## Rubric - **State machine integrity** — Subscription status transitions (free_tier_active → grace_period → exceeded; active → past_due → unpaid → canceled) match the intended lifecycle, leave no orphan states, and trigger the correct side effects (content lock/unlock, emails, analytics). - **Usage metering accuracy** — CloudFront log parsing, bandwidth aggregation, storage tracking, and Stripe metered billing event submission faithfully reflect real consumption without double-counting or data loss. - **Free tier enforcement** — Limits (video count, file size, bandwidth), grace period timing, alert email thresholds, and content locking/unlocking apply consistently and at the correct thresholds defined in subscription constants. - **Access gating consistency** — SubscriptionGuard, plan checks, skipSubscriptionGuard decorators, and demo user exceptions enforce the correct access boundary for every API route without gaps or false blocks. - **Stripe webhook fidelity** — Incoming Stripe subscription and checkout events map to the correct internal state changes without gaps, silent failures, or status/plan mismatches between Stripe and the subscriptions table.
Code Hygiene
## Ownership Zone I own the ongoing campaign against accumulated cruft across the phin repositories — unused functions, unreferenced variables, dead imports, unreachable branches, commented-out code, orphaned files, and the lint and style violations that obscure what is actually live. My territory spans detection (knowing what is dead and proving it), removal (safely excising it without breaking implicit consumers), and prevention (keeping new accumulation from outpacing cleanup). I also own the legibility of the cleanup queue itself: what is pending, what was removed, and whether the trend is improving or degrading. I do not own architectural refactors, performance work, or test quality — only the discipline of keeping the surface area honest about what the code actually uses. ## Rubric - **Deadness is provable, not guessed** — The floor the rest of the rubric stands on. Before anything is removed, there is a defensible answer to how we know this is unused: static analysis, reference search, runtime telemetry, or explicit deprecation window. A bad practice removes things that look unused and learns from production breakage; a good one distinguishes genuinely dead code from code reached through reflection, dynamic dispatch, public API, or external callers, and treats the second category with appropriate caution. - **Lint and style speak with one voice** — Only meaningful once deadness is provable, because lint is the cheapest signal that something is unreferenced. The configured rules are consistent across the repo surface, violations either fail CI or are tracked with an expiry, and disables are justified inline rather than scattered as silent escape hatches. The failure mode this guards against: a lint config that warns about everything, blocks nothing, and trains everyone to ignore the output. - **Removal is reversible and reviewable** — Sits on top of the two dimensions above: once you can prove deadness and trust the lint signal, removals become small, isolated commits rather than sweeping purges. Each cleanup is scoped tightly enough that a reviewer can verify the claim of unused-ness, and the commit history makes it cheap to resurrect something if a hidden caller surfaces. Bad practice batches a thousand deletions into one untestable PR; good practice leaves a trail you can bisect. - **Accumulation is bounded, not just cleaned** — Becomes possible once removal is routine: the question shifts from how do we catch up to whether new cruft is entering faster than it leaves. There are guardrails — pre-commit checks, CI gates, or codeowner review — that catch dead imports and unused exports at the boundary, so cleanup work compounds instead of resetting every quarter. - **The backlog is legible to non-engineers** — A stakeholder-facing dimension. A product manager, tech lead, or founder can answer is hygiene improving or degrading without reading code or paging an engineer: the queue of pending cleanups has a visible depth, a trend, and an owner. The failure mode is hygiene as folklore — everyone agrees the codebase is messy, no one can point to a number, and the work is invisible until someone complains. - **Cleanup is decoupled from feature work** — An organizational property, not a code property: the team has an explicit cadence or budget for hygiene work, and it is not held hostage to whichever feature happens to touch the same file. Bad teams clean up only when they trip over something; good teams treat hygiene as scheduled maintenance with a known owner, so the rubric above can actually be enforced rather than aspired to.
Phlex Component Contracts
## Ownership Zone Every Phlex component class in the application — the Components::Base and Views::Base subclass hierarchy, their rendered HTML output, their behavior under nil and missing data, and their adherence to the shared RubyUI/Phlex conventions that hold the component library together. The zone covers the rendering contract each component exposes (what props it accepts, what HTML it produces, what it does when inputs are absent or malformed), the unit-level rendering tests that pin those contracts down, and the consistency of patterns across the hierarchy so that designers, product, and engineers can predict what a component will do without reading its source. It does not own page-level integration flows, controller logic, or styling decisions made outside the component layer — only the component-as-contract. ## Rubric - **Render-without-crashing floor** — Every component can be instantiated and rendered with its declared inputs without raising. This is the floor the rest of the rubric stands on: until rendering itself is reliable, nil-safety, output quality, and consistency are grading something that may not even reach the browser. A component that crashes on a missing optional prop, an empty collection, or a nil association is failing this dimension regardless of how clean its API looks. - **Nil and edge-input behavior is explicit** — Builds directly on the rendering floor: each component has a defined, tested answer for nil values, empty strings, empty collections, and missing optional associations — render nothing, render a placeholder, or fail loudly — and that answer is the same one a caller would guess from the component's name and props. The bad version silently swallows nils in some components and NoMethodErrors in others, so callers learn through production incidents which components tolerate which inputs. - **Output is valid, semantic HTML** — Components emit well-formed markup with correct nesting, appropriate semantic elements, and accessible attributes — not div soup that happens to look right in one browser. Only meaningful once rendering and nil-handling are stable; otherwise output validity is being judged on a sample that excludes the cases that actually break. - **Pattern consistency across the hierarchy** — Components that do similar jobs look similar: prop names, slot conventions, naming of variants, and the line between Components and Views are followed the same way across the library. The bad version is three different ways to pass children, two spellings of the same prop, and a Views class doing what a Component should do — every new contributor has to re-learn the library from scratch. - **Contracts are legible to non-engineers** — A designer, a PM, or a new engineer can answer what a component does, what inputs it takes, and what it looks like in its main states without reading its Ruby source. This dimension is invisible from the code alone: it lives in component catalogs, preview pages, naming, and the shared vocabulary the team actually uses in design reviews. Without it, the component library is a private dialect and every cross-functional conversation routes through an engineer. - **Change confidence** — Sits on top of every dimension above: a team can only refactor a base class, rename a prop, or upgrade the underlying Phlex/RubyUI version with confidence when rendering, edge inputs, output validity, and conventions are pinned down by tests. The bad version is a component layer everyone is afraid to touch, where improvements stall because no one can tell what a change will break.
Next.js Upgrade Resilience
## Ownership Zone Owns the resilience of the Next.js and React framework surface across upgrades — the pinned versions of next, react, react-dom, and eslint-config-next; the App Router conventions (segment filenames, route groups, layouts, server vs client component boundaries); the build and lint gates that catch framework-level regressions before deploy; and the backlog of known framework risks that need to be worked down. Also owns the relationship between the codebase and Vercel's deployment expectations, so that what builds locally builds on Vercel and what renders in dev renders in production. The zone covers everything that determines whether a framework or runtime bump is a routine chore or a silent outage. ## Rubric - **Version pinning discipline** — Framework-critical packages (next, react, react-dom, the matching eslint config) are pinned to exact versions, not caret or tilde ranges. This is the floor the rest of the rubric stands on: until the versions installed in CI, on a fresh clone, and on Vercel are provably identical, every other dimension is grading a moving target. The bad version of this dimension is a lockfile that drifts between environments and an upgrade that lands by accident on a Tuesday afternoon. - **Pre-deploy build gating** — A production build (and the framework's own type and lint passes) runs on every push and PR and blocks merge on failure. Only meaningful once versions are pinned — otherwise the gate is checking a different build than the one that ships. The failure mode this dimension calls out is discovering a broken build from the deploy log instead of from CI; excellence means the first place a framework regression surfaces is a red check, not a white screen. - **Routing and component-boundary correctness** — App Router conventions are followed strictly: canonical segment filenames, deliberate placement of server vs client components, no accidental client-bundling of server-only code. Sits on top of the build gate, because lint and type rules are the mechanism that makes these conventions enforceable rather than tribal. The bad version is a file named almost-but-not-quite right that silently fails to route, or a use client added to silence an error without understanding what crossed the boundary. - **Upgrade rehearsal and risk backlog** — The team treats framework upgrades as a rehearsed activity, not an emergency: known framework risks, deprecations, and migration steps live in a tracked backlog with priorities, and majors are taken on a deliberate cadence with a known rollback. Becomes possible once the prior dimensions exist, because rehearsal is only credible when versions are pinned and CI catches regressions. Excellence here is a reader being able to answer what's the next framework risk we owe time to without asking a person. - **Deployment-target fidelity** — The local and CI build environment matches what Vercel (or the equivalent target) actually runs: Node version, build command, environment variables, edge vs node runtime choices, and image/route configuration. The bad version is the works on my machine class of incident where the production runtime quietly disagrees with the dev runtime about a server component, a route handler, or a cached fetch. - **Stakeholder-legible upgrade posture** — A non-engineer stakeholder (PM, founder, ops) can answer are we current, are we exposed, and what would an upgrade cost without paging an engineer to read package.json. This is the capstone — only honest once pinning, gating, conventions, and the risk backlog are in place, because otherwise the answer is a guess dressed up as a status. Excellence is a posture that can be reported on, not folklore held in one engineer's head.
Dead Code
## Ownership Zone Unreferenced exports, orphan modules, unreachable branches, and rename/deletion residue across app/, lib/, components/, and scripts/. The steward keeps the surface area honest so reviewers and stewards aren't reasoning about code that no longer runs. ## Rubric - **Unreferenced exports** — Exported functions, types, constants, and React components with zero in-repo consumers and no legitimate external-consumer reason to remain exported. Stale re-exports from internal index files are included. - **Orphan modules** — Source files under app/, lib/, components/ that are not imported anywhere and are not framework entry points (route.ts, page.tsx, layout.tsx, middleware.ts, instrumentation.ts). Test fixtures and __mocks__ are out of scope. - **Unreachable branches** — Code after unconditional early returns/throws, always-true/always-false conditionals, env-gated paths whose env can no longer be set, and switch arms for enum members that were removed. - **Stale one-shot scripts** — scripts/backfill-*, scripts/bootstrap-*, scripts/replay-*, and similar single-purpose tools that have already completed their purpose. Keep ones with a documented reason to retain (e.g. periodically rerun); flag the rest for deletion. - **Removed-symbol residue** — Leftovers from renames or deletions: re-exports of vanished symbols, dead MCP tool registrations, schema fields with no writers/readers, dead public-route patterns, doc/CLAUDE.md references to APIs that no longer exist.
Backlog Delivery Flow
## Ownership Zone Friction and legibility of moving a backlog item from queued to merged in production, across the MCP server, the CLI, and the plugin: the lifecycle state machine and its truthful linkage to PRs and branches, the MCP and notification surface that tells agents and humans what to do next, and the trust signals that let a workspace widen backlog autonomy over time. Excludes PR-review verdict quality (owned by PR Thread Responsiveness and review-policy) and CI correctness. ## Rubric - **Lifecycle state truth** — A backlog item's state (queued / in_progress / proposed / done / dismissed) and its PR or branch linkage always reflect reality. Orphaned claims, expired-lease ghosts, items stuck after their PR merged or closed, and false orphaned-PR warnings are defects. - **Deliverable and contract legibility** — peek / claim / list responses expose what an agent needs to act correctly: the intended deliverable (pull_request vs note), the recommended next action, and lifecycle copy that does not push a PR onto note-shaped or already-done work. - **Progress visibility** — In-flight work is countable and surfaced. queued, in_progress, proposed, and awaiting-merge are distinguishable in counts and responses, and a claimed-but-PR-less item, a green-but-idle PR, or a done-but-unmerged item never sits invisibly. - **Delivery handoffs** — At each gate where a human must act — PR ready to review, ready to merge, conflicted, CI red, or a workspace stuck with un-executed backlog — the user is notified promptly and clearly with the correct next action. - **Selection continuity** — The path from signal to work stays coherent: consult's top-concern set and the queue's top item do not silently diverge, so the agent acts on what the stewards actually flagged rather than drifting to a different item. - **Autonomy trajectory** — The workspace's chosen autonomy level (merge-block threshold, auto-flow eligibility) is respected and legible, and the clean delivery history needed to justify widening autonomy over time is visible rather than hidden.
Dependency Pinning Discipline
## Ownership Zone The dependency surface declared in the project's package manifest and the lockfile that pins it down — every direct dependency's version constraint, the lockfile's presence and integrity, the install path that turns the manifest into a working node_modules tree, and the policies governing how new dependencies enter and how existing ones move. Covers the shape of version ranges (exact pins, caret/tilde ranges, floating tags like latest or *), the reproducibility of fresh installs across machines and CI, the cadence and review discipline around upgrades, and the visibility non-engineers have into what shipped with which versions. Does not own runtime behavior of the dependencies themselves, transitive vulnerability triage, or build tooling beyond what install reproducibility requires. ## Rubric - **Constraint discipline in the manifest** — The floor the rest of the rubric stands on: until every direct dependency declares a deliberate, defensible version constraint, nothing downstream is reasoning about a known surface. Floating tags like latest or unbounded ranges are absent by policy, not by accident, and a reader can tell at a glance which dependencies are pinned exact, which are range-bounded, and why — rather than seeing a soup of mixed conventions that nobody remembers choosing. - **Lockfile as source of truth** — A committed lockfile fully determines the resolved tree, and it is treated as a reviewed artifact rather than a generated nuisance. Lockfile drift between branches surfaces in review, regenerations are intentional events tied to dependency changes, and the lockfile is never silently regenerated to paper over a conflict. Only meaningful once constraint discipline is real; a lockfile over a soup of floating ranges locks in randomness. - **Install reproducibility** — A fresh clone on a clean machine and a CI run from scratch produce byte-identical or behaviorally equivalent dependency trees, today and a month from now. Installs use the lockfile-respecting path (frozen/CI mode) rather than the resolve-anew path, and a green build on Monday is not allowed to go red on Tuesday because an upstream patch shipped overnight. Sits directly on top of the two dimensions above. - **Upgrade cadence and intentionality** — Dependencies move on a known rhythm with named owners, not in panicked batches after something breaks or in silent drift from auto-updates. Upgrades are scoped (one library or one coherent group at a time), reviewed against changelogs, and traceable to a reason — security, feature need, ecosystem alignment — rather than churn for churn's sake. This dimension is largely invisible from the code alone; it is a property of how the team behaves over time. - **New-dependency gatekeeping** — Adding a dependency is a decision with friction proportional to its cost: someone asks whether it is needed, what it pulls in transitively, who maintains it, and how it will be kept current. Bad practice looks like dependencies sneaking in via drive-by commits with default ranges; good practice looks like a brief, consistent rationale and a deliberate constraint chosen at the moment of entry. Lives mostly in review practice and team norms rather than in the manifest itself. - **Stakeholder-legible version posture** — Anyone downstream of engineering — a founder asking what version of a critical library is in production, a security reviewer asking whether a CVE applies, an ops person asking what changed between two deploys — can get a precise answer without reading code or paging an engineer. The version posture is documented or queryable, not folklore; the failure mode this rules out is the team itself not knowing, with confidence, what is actually installed.