Skip to content

docs(personas): registration is conditional — shared-runtime personas are not ring-registered (ADR-0006) - #1082

Merged
don-petry merged 4 commits into
mainfrom
feat/adr-0006-personas-not-ring-registered
Sep 7, 2026
Merged

don-petry merged 4 commits into
mainfrom
feat/adr-0006-personas-not-ring-registered

Conversation

@don-petry

@don-petry don-petry commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

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.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 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 — canary drops out of required; 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 in canary-rings.json (a registered id is a defect, not a promotion) and omits canary. Step 4 records that promotion evidence is persona_reach_check.sh plus an observed live mention, never a ring label. §7's DoD splits into the two paths.

Verification

  • Schema parses; a manifest with canary omitted validates at canary/ring0/stable, and one retaining canary still validates — the dedicated-reusable path is unbroken.
  • markdownlint-cli2 clean.

Pre-existing inconsistency found while testing (not fixed here)

status's enum is draft|canary|ring0|ring1|stable|retired — there is no next, yet the registry channel and persona_reach_check.sh's PRC_RING_ORDER both use that word. A manifest set to status: next fails schema validation today.

This matters for combsmith/.github-private#1631 — [Phase 4] Promote solution-architect past draft, whose AC #1 says "advances draft → next": that literal value would fail. Callers should advance to canary. 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) and scripts/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

  • Shared-runtime personas can omit the canary block and must not be added to the ring registry.
  • Personas with their own reusable continue using ring registration and staged promotion.
  • Shared-runtime promotion is verified through reach checks and a live mention resolving to the persona, instead of per-persona ring labels.
  • Completion requirements now distinguish dedicated-reusable personas from shared-runtime personas.

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:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

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:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

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.

… 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
@don-petry
don-petry requested a review from a team as a code owner September 7, 2026 15:23
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@codeant-ai

codeant-ai Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Reviewed your PR 1ed4b6d Sep 07, 2026 · 15:23 15:25

@codeant-ai

codeant-ai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@coderabbitai

coderabbitai Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Team

Run ID: 76023b66-1b9f-4985-a0ab-c9b4692f8240


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread standards/personas/persona.schema.json
Comment thread standards/personas/persona.schema.json
@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — review-changes (applied)

Changes committed and pushed.

@don-petry
don-petry enabled auto-merge (squash) September 7, 2026 15:30
@don-petry
don-petry disabled auto-merge September 7, 2026 15:30
@donpetry-bot

Copy link
Copy Markdown
Contributor

CI checks on this PR are still running. Once they complete, re-mention @donpetry-bot to trigger a fresh review.

Posted by the donpetry-bot PR-review cascade.

@don-petry
don-petry enabled auto-merge (squash) September 7, 2026 15:35
donpetry-bot
donpetry-bot previously approved these changes Sep 7, 2026

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@don-petry
don-petry disabled auto-merge September 7, 2026 15:57
@don-petry
don-petry enabled auto-merge (squash) September 7, 2026 16:00
@don-petry
don-petry disabled auto-merge September 7, 2026 16:01
@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — fix-bot-comment (no-changes)

Agent reasoning
## Summary
**Bot:** SonarCloud (passed quality gate with 0 new issues)
**Issues addressed:** 2
- **gemini-code-assist thread** — Conditional schema validation: Added two allOf rules to `standards/personas/persona.schema.json` enforcing the biconditional requirement (if `runtime.reusable` then `canary` required; if `canary` then `runtime.reusable` required). [replied + thread resolved]
- **codeant-ai thread** — Schema validation for shared-runtime personas: Same allOf rules prevent both invalid registrations (shared-runtime with canary) and missing pointers (dedicated-reusable without canary). [replied + thread resolved]
**Files changed:** `standards/personas/persona.schema.json` (already in head commit `2f47fbe`)
**Skipped (informational):** 0 — SonarCloud reported 0 new issues and 0 security hotspots; all CI checks passing; no Tier 1 blockers.

@don-petry
don-petry enabled auto-merge (squash) September 7, 2026 16:02

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@donpetry-bot
donpetry-bot dismissed their stale review September 7, 2026 16:05

Superseded by automated re-review at a9467b5.

@sonarqubecloud

sonarqubecloud Bot commented Sep 7, 2026

Copy link
Copy Markdown

@don-petry
don-petry disabled auto-merge September 7, 2026 16:06
@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — fix-bot-comment (no-changes)

Agent reasoning
- No `CHANGES_REQUESTED` reviews
**Prior Bot Comments:**
The `gemini-code-assist[bot]` comment (Sept 7, 15:25) suggested adding conditional validation rules to the JSON schema. According to `donpetry-bot`'s approval review (Sept 7, 16:05), this has already been implemented in the head commit (`a9467b55...`): "the new allOf rules (reusable present → canary required; canary present → runtime.reusable required) correctly encode the ADR-0006 biconditional."
---
## Summary
**Bot:** sonarcloud[bot] (via quality gate badge)  
**Issues addressed:** 0  
**Files changed:** None  
**Skipped (informational):** 0  
The SonarCloud quality gate report contains no actionable findings — it reports a passing gate with zero new issues, zero security hotspots, and zero coverage/duplication problems. The prior suggestion from `gemini-code-assist[bot]` has been addressed in the current commit. No changes required.

@don-petry
don-petry enabled auto-merge (squash) September 7, 2026 16:06
@don-petry
don-petry merged commit c676b4f into main Sep 7, 2026
22 checks passed
@don-petry
don-petry deleted the feat/adr-0006-personas-not-ring-registered branch September 7, 2026 16:07

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 a9467b5 is only a merge of main (automated README refresh, 1 line, unrelated to this change).
  • Schema verified: valid JSON at head; runtime.reusable exists (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 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.

don-petry added a commit to combsmith/.github-private that referenced this pull request Sep 7, 2026
…-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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants