Repository navigation
docs(personas): registration is conditional — shared-runtime personas are not ring-registered (ADR-0006) - #1082
Conversation
… are not ring-registered (ADR-0006) Implements the standards half of ADR-0006, accepted in combsmith/.github-private#1688 and recorded in that repo's docs/architecture/adr/0006-shared-runtime-personas-are-not-ring-registered.md. A persona is a CALLER of the shared persona runtime, not a reusable. persona-runner.yml consumes the runtime by local relative path with no agent_ref input, so no caller pins a per-persona channel tag — a ring promotion would advance a tag nothing reads. Registering each persona also inverts ADR-0001's two-tier boundary, which puts the reusable (the thing consumers pin) as the unit of release. persona.schema.json — `canary` drops out of `required` and its description records when to include it. A dedicated-reusable persona is unaffected: a manifest WITH the block still validates. persona-standards.md — §6 steps 2/3 make registration conditional on the persona shipping its own reusable, and state that a shared-runtime persona MUST NOT appear in canary-rings.json (a registered id is a defect, not a promotion) and omits the `canary` block. §6 step 4 records that such a persona has no per-persona tag to stage: promotion evidence is persona_reach_check.sh plus an observed live mention, never a ring label, and reach is governed by the persona-mention router's own rings. §7's Definition of Done splits into the two paths. Verified: schema parses; a manifest with `canary` omitted validates at status canary/ring0/stable, and one retaining `canary` still validates; markdownlint clean. Note for consumers: `status`'s enum is draft|canary|ring0|ring1|stable| retired — there is no `next`, though the registry channel and persona_reach_check.sh's PRC_RING_ORDER both use that word. Left as-is here (out of scope); flagged so callers advance to `canary`, not `next`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015YTfTumtrmd5jdFX9W1XvT
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing |
🤖 CodeAnt AI — Review Status
|
Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Team Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request updates the persona standards and JSON schema to support shared-runtime personas per ADR-0006, making the canary block optional. The reviewer suggests adding conditional validation rules to the JSON schema to programmatically enforce that the canary block is required if and only if a dedicated reusable runtime is defined.
Dev-Lead — review-changes (applied)Changes committed and pushed. |
|
CI checks on this PR are still running. Once they complete, re-mention Posted by the donpetry-bot PR-review cascade. |
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: LOW
Reviewed commit: 2f47fbeba9678700193d41cc8361bff6fbf0db70
Review mode: triage-approved (single reviewer)
Summary
Standards half of ADR-0006: makes persona ring registration conditional on the persona shipping its own reusable. persona.schema.json drops canary from required and adds two allOf if/then rules enforcing the biconditional (runtime.reusable ⇔ canary); persona-standards.md §6 steps 2-4 and the §7 DoD split into the dedicated-reusable vs shared-runtime paths. Docs + declarative schema only; no executable code or workflow changes. Schema verified valid JSON at head; biconditional independently re-tested with jsonschema (canary-without-runtime.reusable correctly fails; shared-runtime manifest without canary passes the new rules).
Linked issue analysis
No issue formally linked via closingIssuesReferences. The PR implements the standards half of ADR-0006 (decided in combsmith/.github-private#1688, decision record in #1693). PR body asks that the ADR decision-record PR (#1693 in .github-private) merge first — a sequencing note for the human merger, not a correctness blocker here. The pre-existing status-enum/'next' vocabulary mismatch flagged in the PR body is confirmed real (enum is draft|canary|ring0|ring1|stable|retired) and correctly left out of scope.
Findings
- Two review threads (gemini-code-assist, codeant-ai) flagged that the canary-optional change was description-only and should be schema-enforced. Both were addressed in the head commit (2f47fbe): the two allOf conditional rules are present and I verified they behave as intended. Threads are not UI-marked resolved, but each has an owner reply confirming the applied fix, which I independently verified in the head diff — treated as resolved in substance.
- Schema coherence checked: runtime.reusable exists as a defined property, so the new if/then conditions are well-formed under additionalProperties:false.
- No secrets or secret-like content in the diff (markdown + JSON schema). run_secret_scanning MCP tool unavailable in this environment; gitleaks CI check is green.
- No security-sensitive surfaces touched (no workflows, no scripts, no auth/credentials).
CI status
All checks green: Lint, ShellCheck, Agent Security Scan, Secret scan (gitleaks), CodeQL, SonarCloud (quality gate passed, 0 new issues), AgentShield, duplicate-decl-gate, CodeRabbit all SUCCESS. Skipped checks are conditional (dependabot-automerge, ecosystem-specific dependency audits, dev-lead ci-relay).
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.
Dev-Lead — fix-bot-comment (no-changes)Agent reasoning |
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: MEDIUM
Reviewed commit: a9467b55f09f07ffe0c2d64b98b6f9bec44dbe2a
Review mode: triage-approved (single reviewer)
Summary
Standards half of ADR-0006: makes persona ring registration conditional on shipping a dedicated reusable. Shared-runtime personas omit the canary block and must not appear in canary-rings.json. Docs change plus a schema tightening — two new allOf biconditional rules (runtime.reusable ⇔ canary) that programmatically enforce the constraint bot reviewers flagged. Triage low-risk assessment confirmed.
Linked issue analysis
No linked issues via closing references. The PR implements ADR-0006 (approved in combsmith/.github-private#1688, decision record #1693) and its body documents the decision rationale, verification (both schema paths validate), and follow-up enforcement work in .github-private. The noted pre-existing status-enum/next-vocabulary inconsistency is explicitly and reasonably left out of scope.
Findings
No blocking findings.
- Schema conditionals verified coherent: runtime.reusable exists in the schema (runtime requires only identity), so the new allOf rules (reusable present → canary required; canary present → runtime.reusable required) correctly encode the ADR-0006 biconditional without breaking either path.
- Both prior bot review threads (gemini-code-assist, codeant-ai) requested exactly this programmatic enforcement; the author added it in the head commit and both threads are resolved.
- Docs changes in persona-standards.md (§6 steps 2–4, §7 DoD split) are internally consistent with the schema change and with the ADR.
- Secret scan: run_secret_scanning MCP tool unavailable in this environment; gitleaks CI check passed. No secrets, credentials, or workflow changes in the diff.
CI status
All checks green: Lint, ShellCheck, CodeQL, Agent Security Scan, AgentShield, SonarCloud (quality gate passed), Secret scan (gitleaks), duplicate-decl-gate, dependency-audit. CANCELLED dev-lead dispatch/ci-relay entries are superseded runs; the latest dispatch succeeded. Branch is BEHIND main but MERGEABLE.
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.
Superseded by automated re-review at a9467b5.
|
Dev-Lead — fix-bot-comment (no-changes)Agent reasoning |
donpetry-bot
left a comment
There was a problem hiding this comment.
Automated review — APPROVED ✓
Risk: MEDIUM
Reviewed commit: 1488fc1f0424d0a54a34a114a51d62d32bb33c7d
Review mode: triage-approved (single reviewer)
Summary
Standards half of ADR-0006: persona ring registration becomes conditional on shipping a dedicated reusable. Shared-runtime personas omit the canary block and must not appear in canary-rings.json. Docs update plus two schema allOf biconditional rules (runtime.reusable ⇔ canary). Re-review after a merge of main; the only delta since the prior approved review (a9467b5) is an automated one-line profile/README.md refresh — no substantive change. Triage low-risk assessment confirmed.
Linked issue analysis
No linked issues via closing references. The PR implements ADR-0006 (decision discussion combsmith/.github-private#1688, decision record PR #1693) and documents rationale, verification of both schema paths, and follow-up enforcement work. Note: #1693 (the ADR record this PR says to merge first) is still open — a merge-ordering note for the merger, not a review blocker. The pre-existing status-enum/next vocabulary inconsistency is explicitly left out of scope with a clear rationale.
Findings
No blocking findings.
- Delta since prior approved review at
a9467b5is only a merge of main (automated README refresh, 1 line, unrelated to this change). - Schema verified: valid JSON at head;
runtime.reusableexists (runtime requires onlyidentity), so the new allOf rules (reusable present → canary required; canary present → runtime.reusable required) correctly encode the ADR-0006 biconditional without breaking the dedicated-reusable path. - Both bot review threads (gemini-code-assist, codeant-ai) asked for exactly this programmatic enforcement and are resolved.
- persona-standards.md changes (§6 steps 2–4, §7 DoD split) are internally consistent with the schema change.
- Sequencing (non-blocking): ADR record PR .github-private#1693 is still open; PR body asks for it to merge first.
- Secret scan: run_secret_scanning MCP tool unavailable in this environment; gitleaks CI check passed. No secrets, credentials, or workflow files in the diff.
CI status
All checks green at head 1488fc1: Lint, ShellCheck, CodeQL, Agent Security Scan, AgentShield, SonarCloud (quality gate passed), Secret scan (gitleaks), duplicate-decl-gate, dependency-audit, pr-auto-review, dev-lead dispatch. Skipped entries (dependabot, ci-relay, unused ecosystem audits) are expected.
Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.
…-0006 (#1701) * fix(personas): unbreak validate-personas — drop canary blocks per ADR-0006 FLEET UNBLOCK. petry-projects/.github c676b4f3 (PR #1082, 16:07:52Z today) landed the ADR-0006 schema with a bidirectional rule: a manifest carrying a `canary` block MUST also declare `runtime.reusable`. All nine manifests here carry `canary` and none declares `runtime.reusable`, so every one of them began failing instantly: persona manifest invalid: personas/business-analyst/persona.yml: schema violation at runtime: 'reusable' is a required property validate-personas.py fetches the schema LIVE from .github@main, so an org-repo commit gated every open PR in this repo with no coordinating change on this side. Main's last green Lint predates it by 21 seconds. This is the fix-forward, not a revert: removing `canary` is exactly what ADR-0006 mandates for a shared-runtime persona, so the manifests were already non-conforming — the schema simply started saying so. * personas/*/persona.yml (all nine) — drop the `canary` block. Every one is served wholly by the shared persona runtime; none ships its own reusable. * validate-personas.py — `canary` is now optional, so the unconditional manifest["canary"]["agent"] read is guarded (that read would KeyError on a conforming manifest — flagged by codeant on #1693 and true). * validate-personas.py — the non-draft registry invariant becomes conditional and BIDIRECTIONAL, keyed on the manifest's own `canary` block: with one, past draft still requires a registry entry; without one, a registry entry is now itself a failure ("a registered shared-runtime persona is a defect, not a promotion"). This is the inversion ADR-0006 authorizes and what #1631 needs to flip a manifest past draft. * tests — three cases pinning the inversion in both directions plus the still-checked canary.agent path. Verified: validate-personas.py green against the LIVE .github@main schema (9 manifests); both new failure directions reproduce with the intended messages; the two pre-existing registry tests remain compatible. The bats suite cannot run on macOS (its `sed -i` is GNU-only — 34 identical failures on unmodified main confirm the environment, not a regression); the new cases follow the file's existing idiom and run on Linux CI. Refs #1688, ADR-0006 (#1693), combsmith/.github#1082 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015YTfTumtrmd5jdFX9W1XvT * chore: dev-lead update (review-changes) [skip ci-relay] * fix(personas): dev-lead keeps its canary block — it ships its own reusable Corrects an over-application of ADR-0006 in this PR's first commit. I stripped `canary` from all nine manifests, but ADR-0006's omit-the-block rule covers only personas served wholly by the SHARED persona runtime. Its final boundary says the opposite for the other case: "A persona that ever gains its own reusable ... returns to ADR-0002 in full and MUST be registered like any other agent." dev-lead ships .github/workflows/dev-lead-reusable.yml and IS a registered ring agent (agents.dev-lead in canary-rings.json, 162 release tags). It is the one persona of the nine on the dedicated-reusable path. The bug was invisible until the review fix landed: the shared-runtime prohibition was originally gated behind `status != draft`, and every persona here is draft. codeant-ai caught that gating (a draft persona could carry a registry entry undetected), and moving the check out of the draft gate immediately surfaced the real defect underneath: personas/dev-lead/persona.yml: no canary block (shared-runtime persona, ADR-0006) but an agents.dev-lead entry exists ... remove the entry The guard was right; the manifest sweep was wrong. * restore dev-lead's `canary` block * declare `runtime.reusable: .github/workflows/dev-lead-reusable.yml` — required by the schema whenever `canary` is present, and true of dev-lead * comment recording WHY this persona is the exception, so the next sweep does not strip it again Verified: validate-personas.py green against the LIVE .github@main schema AND the LIVE canary-rings.json — the exact CI path (9 manifests, no --registry). bats 33/38 with python3 >= 3.10 on PATH; all four ADR-0006 cases pass, and the 5 failures are pre-existing `sed -i` tests this PR never touched (macOS BSD sed; they run on Linux CI). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015YTfTumtrmd5jdFX9W1XvT --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>



User description
Standards half of ADR-0006, approved in combsmith/.github-private#1688 — Decision: how should shared-runtime personas be represented in the canary ring model?
Decision record: combsmith/.github-private#1693 — docs(adr): ADR-0006. Merge that first; this PR is the standard catching up to it.
Why
A persona is a caller of the shared persona runtime, not a reusable.
persona-runner.ymlconsumes the runtime by local relative path with noagent_refinput, so no caller pins a per-persona channel tag — a ring promotion would advance a tag nothing reads. Registering each persona also inverts ADR-0001's boundary, which makes the reusable (what consumers pin) the unit of release.At nine personas the alternative would have produced ~396 unconsumed cut-and-move operations per month, on a gate that cannot attribute a regression to the persona that caused it.
Changes
personas/persona.schema.json—canarydrops out ofrequired; its description records when to include it. Two lines changed.persona-standards.md— §6 steps 2/3 make registration conditional on shipping a dedicated reusable, and state a shared-runtime persona MUST NOT appear incanary-rings.json(a registered id is a defect, not a promotion) and omitscanary. Step 4 records that promotion evidence ispersona_reach_check.shplus an observed live mention, never a ring label. §7's DoD splits into the two paths.Verification
canaryomitted validates atcanary/ring0/stable, and one retainingcanarystill validates — the dedicated-reusable path is unbroken.markdownlint-cli2clean.Pre-existing inconsistency found while testing (not fixed here)
status's enum isdraft|canary|ring0|ring1|stable|retired— there is nonext, yet the registry channel andpersona_reach_check.sh'sPRC_RING_ORDERboth use that word. A manifest set tostatus: nextfails schema validation today.This matters for combsmith/.github-private#1631 — [Phase 4] Promote
solution-architectpastdraft, whose AC #1 says "advancesdraft → next": that literal value would fail. Callers should advance tocanary. Left unfixed here as out of scope — worth its own decision on whether to align the vocabularies.Follows
Enforcement in
.github-private:validate-personas.py(drops the non-draft-must-be-registered invariant) andscripts/persona_reach_check.sh+ bats (inverts the skew rule), then #1631 unblocks.CodeAnt-AI Description
Make persona ring registration conditional on how the persona is delivered
What Changed
canaryblock and must not be added to the ring registry.Impact
✅ Fewer unconsumed persona promotions✅ Clearer rollout evidence for shared-runtime personas✅ Valid manifests without nonexistent ring entries💡 Usage Guide
Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.