Skip to content

feat: implement issue #1403 — [Phase 1] Write docs/agentic-interaction-model.md — the event-first standard, three trigger classes, the GITHUB_TOKEN bridge rule, and the timer contract - #1413

Merged
don-petry merged 4 commits into
mainfrom
dev-lead/issue-1403-20260802-0115
Aug 2, 2026
Merged

feat: implement issue #1403 — [Phase 1] Write docs/agentic-interaction-model.md — the event-first standard, three trigger classes, the GITHUB_TOKEN bridge rule, and the timer contract#1413
don-petry merged 4 commits into
mainfrom
dev-lead/issue-1403-20260802-0115

Conversation

@don-petry

@don-petry don-petry commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

User description

Closes #1403

Implemented by dev-lead agent. Please review.


CodeAnt-AI Description

Define how agentic workflows are triggered, scheduled, and prevented from entering runaway loops

What Changed

  • Documents three workflow trigger classes: event-driven reactions, reconciliation backstops, and scheduled-origin work
  • Establishes rules for timer cadence, stop conditions, idempotency, human-gated work, and prevention of self-triggered loops
  • Defines the GITHUB_TOKEN event boundary and the approved PAT-based and timer-based ways to bridge it
  • Classifies the repository’s current agentic workflows and specifies the machine-checkable table that CI will validate
  • Sets the standalone interaction-contract format and explains how future validation will check triggers, emitted events, budgets, and stop markers
  • Makes the existing per-PR automation budget and runaway detector the authoritative safety controls

Impact

✅ Fewer agent-triggered runaway loops
✅ Clearer event-versus-timer workflow behavior
✅ Safer recovery from missed workflow events

💡 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.

…n-model.md — the event-first standard, three trigger classes, the GITHUB_TOKEN bridge rule, and the timer contract
@don-petry
don-petry requested a review from a team as a code owner August 2, 2026 01:24
@codeant-ai

codeant-ai Bot commented Aug 2, 2026

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Reviewed your PR 7dadb90 Aug 02, 2026 · 01:24 01:24

@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.

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@donpetry-bot, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 51 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 27dd086d-3ff8-42b1-90e8-d8837c3b54e4

📥 Commits

Reviewing files that changed from the base of the PR and between d91ff16 and 225e93b.

📒 Files selected for processing (1)
  • docs/agentic-interaction-model.md

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.

@codeant-ai codeant-ai Bot added the size:L This PR changes 100-499 lines, ignoring generated files label Aug 2, 2026

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

Copy link
Copy Markdown

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 introduces a new normative document, docs/agentic-interaction-model.md, which codifies the triggering and interaction patterns of agentic roles to prevent runaway loops and ensure consistent event-driven behavior. The feedback suggests enhancing the documentation regarding Personal Access Tokens (PATs) by noting that fine-grained PATs are restricted to a single resource owner, and recommending classic PATs or GitHub App installation tokens as alternatives for workflows spanning multiple organizations.

Comment thread docs/agentic-interaction-model.md Outdated
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add normative agentic interaction model standard (triggers, bridges, timers)

📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Define an event-first standard for triggering agentic roles and avoiding cron-based polling.
• Specify trigger taxonomy (Class 1/2/3), GITHUB_TOKEN boundary rule, and a timer contract.
• Add CI-verifiable workflow classification table and a schema for future per-role contracts.
Diagram

graph TD
  DOC["docs/agentic-interaction-model.md"] --> CONTRACT["Per-role interaction contracts (future)"] --> VALID["validate-interaction-model (CI)"] --> WF["Agentic workflows (.github/workflows)"] --> EVT["GitHub webhook events"]
  WF --> CRON["schedule.cron timers"]
  WF --> BRIDGE["PAT-backed repository_dispatch"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Promote org-wide standard first (in petry-projects/.github)
  • ➕ Single canonical source across repos from day one
  • ➕ Avoids later promotion/migration work
  • ➖ Blocks progress on repo-local inventory/table and validator sequencing
  • ➖ Requires cross-repo coordination/release cadence to land safely
2. Put interaction contract directly into persona.yml now
  • ➕ One manifest per role (persona + interaction)
  • ➕ Leverages existing persona validation tooling
  • ➖ Currently blocked by external persona.schema.json constraints (would fail validate-personas)
  • ➖ Couples rollout to another repo’s schema release timing
3. Skip prose; rely on only machine-readable contracts + validator
  • ➕ Maximally enforceable; less narrative drift
  • ➕ Keeps the standard close to code/CI rules
  • ➖ Loses rationale and postmortem-derived context that reviewers/authors need
  • ➖ Harder onboarding; increases risk of misusing timers/bridges despite passing schema

Recommendation: Keep the PR’s approach: a repo-local normative doc that (1) captures the rationale (event-first, #860 rules, token boundary), (2) fixes machine-parseable table shape, and (3) explicitly sequences the later contract/validator work. It unblocks Phase 1 immediately without cross-repo schema dependencies, while still defining a clean path to eventual org-wide promotion and persona.yml integration once the upstream schema can accept it.

Files changed (1) +427 / -0

Documentation (1) +427 / -0
agentic-interaction-model.mdAdd normative agentic interaction model standard and workflow classification table +427/-0

Add normative agentic interaction model standard and workflow classification table

• Introduces a repo-local, normative spec covering event-first triggering, a three-class trigger taxonomy, the GITHUB_TOKEN event-boundary rule with sanctioned bridges, and a timer behavior contract. Includes a fixed-shape, machine-parseable table classifying current agentic workflows and defines the schema/location decision for future per-role interaction contracts and CI enforcement.

docs/agentic-interaction-model.md

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — review-changes (applied)

Changes committed and pushed.

@don-petry
don-petry enabled auto-merge (squash) August 2, 2026 01:26
@qodo-code-review

qodo-code-review Bot commented Aug 2, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 48 rules

Grey Divider


Action required

1. timer_role dash misparsed ✓ Resolved 🐞 Bug ≡ Correctness
Description
§3 defines R as “timer_role column is non-empty”, but the §4 table uses  to represent “no
timer_role”, which is non-empty. A validator implemented per this spec will treat most Class 1/Class
3 rows as having R=true and misclassify/fail them unless it special-cases  as null (not
documented).
Code

docs/agentic-interaction-model.md[R155-176]

+| Workflow (path) | Class | timer_role | Justification (cite the `on:` triggers) |
+|---|---|---|---|
+| `.github/workflows/dev-lead.yml` | 1 | — | `pull_request`, `pull_request_review`, `pull_request_review_comment`, `issue_comment`, `issues:labeled`, `check_run`, `repository_dispatch` — pure webhook reactions; no `schedule`. |
+| `.github/workflows/pr-review-trigger.yml` | 1 | — | `check_suite`, `pull_request_review`, `pull_request`, `repository_dispatch:[pr-review-mention]`, `workflow_dispatch` — webhook reactions; no `schedule`. |
+| `.github/workflows/ci-failure-analyst.lock.yml` | 1 | — | `check_run:[completed]` only — reacts to a completing check. |
+| `.github/workflows/dismiss-stale-bot-reviews.yml` | 1 | — | `pull_request:[synchronize]`, `pull_request_review:[submitted]` — reacts to a push/re-review. |
+| `.github/workflows/issue-triage-runner.yml` | 1 | — | `issues:[opened, reopened]` — reacts to a new/reopened issue. |
+| `.github/workflows/pr-review-mention.yml` | 1 | — | Mention router: `issue_comment`, `pull_request_review_comment`, `pull_request:[review_requested]`; parses + dispatches, no clock. |
+| `.github/workflows/persona-mention.yml` | 1 | — | Mention router: `issue_comment`, `pull_request_review_comment`, `discussion_comment` — dispatches to the persona runner, no clock. |
+| `.github/workflows/pr-review-sweep.yml` | 2 | backstop | `schedule: '2,17,32,47 * * * *'` backstop **plus** `workflow_run:[completed]` fast path (#898) scoped to the completing CI run's PR(s); idempotent, per-branch `cancel-in-progress`. |
+| `.github/workflows/initiative-driver.yml` | 2 | safety-net | `issues:[closed, labeled]` fast path **plus** `schedule: '23 */6 * * *'` explicitly "safety net for missed close events"; sweeps every open `initiative:auto` epic idempotently. |
+| `.github/workflows/dev-lead-retry.yml` | 2 | self-heal | `schedule: '15 */2 * * *'` + `workflow_dispatch`; re-dispatches `status=rate-limited` PRs once the limit clears. **Leak flagged in §6** — no event fast-path, so it behaves as a de-facto convergence clock rather than a true backstop. |
+| `.github/workflows/token-report.yml` | 3 | — | `schedule: '34 8 * * 1'` weekly cost rollup; origin is the cadence. |
+| `.github/workflows/reviewer-report.yml` | 3 | — | `schedule: '53 9 * * 1'` weekly review-activity report. |
+| `.github/workflows/daily-pr-review-health.yml` | 3 | — | `schedule: '13 6 * * *'` daily health scan of run history. |
+| `.github/workflows/feature-ideation.yml` | 3 | — | `schedule: '7 7 * * 5'` weekly ideation run; `workflow_dispatch` bridges the `discussion` event it cannot run inline. |
+| `.github/workflows/readme-refresh.yml` | 3 | — | `schedule: '41 9 * * 1'` weekly org-README regeneration. |
+| `.github/workflows/standards-sync.yml` | 3 | — | `schedule: '11 9 * * 1'` (guard enforces first-Monday-only) standards sync. |
+| `.github/workflows/idea-triage.yml` | 3 | — | `schedule: '37 13 * * 1'` weekly Idea Promotion Queue refresh. |
+| `.github/workflows/initiative-planner-canary.yml` | 3 | — | `schedule: '30 6 * * *'` daily dry-run canary of `initiative-planner.yml`. |
+| `.github/workflows/initiative-driver-canary.yml` | 3 | — | `schedule: '40 6 * * *'` daily dry-run canary of `initiative-driver.yml`. |
+| `.github/workflows/pr-review-canary.yml` | 3 | — | `schedule: '50 6 * * *'` daily canary; the `push:[main]` (paths-gated) trigger is a post-merge gate, not an event fast-path — origin is the cadence. |
Relevance

●●● Strong

Non-empty sentinel in “machine-checkable” table likely treated as correctness bug; similar doc/table
consistency fixes were accepted.

PR-#1135
PR-#367
PR-#1218

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The document defines R using a strict non-empty check, but then populates the “empty” timer_role
cells with a non-empty sentinel (), creating a direct contradiction for any parser following the
spec verbatim.

docs/agentic-interaction-model.md[118-131]
docs/agentic-interaction-model.md[155-176]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The parse contract says `R` is true when the `timer_role` cell is non-empty, but the classification table uses the literal em dash `—` for “no value”. That makes `R` true for rows that intend `R` to be false.

## Issue Context
This doc states the table is “machine-checkable” and will be parsed by `validate-interaction-model`.

## Fix
Pick one canonical representation and document it:
- Prefer: require an actually empty cell for “no timer_role” (e.g., `| ... | 1 |  | ... |`).
- If you want to keep `—` for readability, explicitly define `—` (and optionally `N/A`) as equivalent to empty, and update the definition of `R` accordingly.

## Fix Focus Areas
- docs/agentic-interaction-model.md[118-138]
- docs/agentic-interaction-model.md[155-177]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Dispatch-only class gap ✓ Resolved 🐞 Bug ≡ Correctness
Description
§3 excludes repository_dispatch from E, but §2 explicitly permits repository_dispatch as a
Class 1 trigger, and this repo contains workflows whose only trigger is repository_dispatch. Under
the published discriminator, those workflows satisfy none of Class 1/2/3, so the model is not
self-consistent without an exception.
Code

docs/agentic-interaction-model.md[R120-130]

+Let E  = the workflow has >=1 GitHub webhook event trigger that represents work
+         (pull_request, pull_request_review, pull_request_review_comment,
+          issue_comment, issues, check_run, check_suite, workflow_run,
+          discussion_comment, push, ...), EXCLUDING workflow_dispatch and
+          repository_dispatch (a manual/bridge trigger, not a clock and not a
+          primary-work webhook).
+Let R  = the row's timer_role column is non-empty (backstop | safety-net | self-heal).
+
+Class 1  ⇒  E and not S and not R     (pure event reaction; a schedule here is drift)
+Class 2  ⇒  S and R                   (a cadence whose role reconciles event-driven work)
+Class 3  ⇒  S and not R               (a cadence that IS the origin: report / canary)
Relevance

●●● Strong

Team often fixes spec/validator contract inconsistencies in docs, especially when CI validators will
consume them.

PR-#367
PR-#772
PR-#1234

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The doc simultaneously (1) permits repository_dispatch for Class 1 triggers, (2) excludes it from
E in the discriminator, and (3) the repo contains workflows whose only on: trigger is
repository_dispatch, which makes them fail all three class predicates as written.

docs/agentic-interaction-model.md[62-66]
docs/agentic-interaction-model.md[118-131]
.github/workflows/persona-runner.yml[13-18]
.github/workflows/gh-aw-cross-org.yml[8-11]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The class discriminator defines `E` as “work-representing webhook events” but explicitly excludes `repository_dispatch`. However, the same document treats `repository_dispatch` as a sanctioned event-driven trigger, and the repo has workflows triggered only by `repository_dispatch`, which become unclassifiable under the current logic.

## Issue Context
Examples in this repo:
- `.github/workflows/persona-runner.yml` is triggered only by `repository_dispatch`.
- `.github/workflows/gh-aw-cross-org.yml` is triggered only by `repository_dispatch`.

## Fix
Update the discriminator to handle `repository_dispatch` in a documented way, e.g.:
- Option A: Include `repository_dispatch` in `E` (while still excluding `workflow_dispatch`).
- Option B: Add a separate boolean (e.g., `D = has repository_dispatch`) and define Class 1 as `(E or D) and not S and not R`.
- If you truly want to exclude repository_dispatch-only workflows from classification, explicitly scope §2/§3/§4 to “entrypoint workflows that subscribe to GitHub-native webhooks” and document that dispatch-only workflows are out of model/validator scope.

## Fix Focus Areas
- docs/agentic-interaction-model.md[54-67]
- docs/agentic-interaction-model.md[118-131]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment thread docs/agentic-interaction-model.md
Comment thread docs/agentic-interaction-model.md
@don-petry
don-petry disabled auto-merge August 2, 2026 01:27

@don-petry don-petry left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Review — PR #1413 (docs/agentic-interaction-model.md, story #1403)

Strong first draft. §3's formal class discriminator is the best part of this document: making Class 1 vs {2,3} derivable from the on: block while Class 2 vs 3 turns on the declared timer_role is exactly right — a timer's role genuinely isn't visible in on:, and stating that as a consistency invariant rather than a derived label is what makes #1406 implementable. §8.2's decision (standalone contract, not persona.yml) is correct and the cross-repo sequencing rationale matches the caller-stub skew rule. §6.3's honest labelling of dev-lead-retry as the leak, and §9's refusal to add new counters, both land well.

Fact-checks passed. I verified several rows against the real on: blocks and they are accurate: pr-review-mention.ymlpull_request:[review_requested] ✅, issue-triage-runner.ymlissues:[opened, reopened] ✅, standards-sync.yml's first-Monday guard ✅ (.github/workflows/standards-sync.yml:28-40). No factual errors found in the rows that exist.

Requesting changes for one substantive gap.


1. (must fix) The §4 table is incomplete, and §10's enforcement is one-directional — so omissions are silent and permanent

§10 specifies the validator as: "Every row of the §4 table is parsed ... and its asserted Class is checked against that workflow's actual on: triggers." That is row → reality. Nothing checks reality → row. A workflow with no row therefore passes CI forever, and a new agentic role can be added with no row at all — which defeats the stated purpose of this initiative ("enforceable as we add more agentic roles").

This is not hypothetical: 13 agentic workflows currently have no row, several heavily agent/LLM-driven:

Missing workflow Why it belongs in the table
actions-fleet-monitor.yml This document cites it in §5 as the canonical PAT-bridge example, then omits it from the classification. Internal inconsistency.
dependency-advisory.yml Claude-driven PR advisory that posts "No action required." comments — squarely the no-action noise class this initiative exists to reduce.
spec-drift.yml Advisory agent; posts a comment on the story issue.
initiative-planner.yml The BMAD planner (agent refs: 14) — and it is the discussion:[labeled]workflow_dispatch bridge, a §5 case worth classifying explicitly.
gh-aw-cross-org.yml repository_dispatch receiver (agent refs: 18).
stale-manager.yml, docs-health-check.yml, skill-eval-report.yml Scheduled agentic (gh-aw) roles — Class 3.
premature-closure-audit.yml, auto-rebase-health.yml Scheduled audits/reports — Class 3.
auto-rebase-retry.yml workflow_run self-heal handler — a Class 1 reaction (and an interesting edge case for the taxonomy: a self-heal reaction, not a self-heal timer).
pr-auto-review.yml workflow_run / check_suite / pull_request_review / pull_request; it was 6 runs/hr in the baseline census, so it is materially part of the interaction surface.
persona-runner.yml The persona runtime (repository_dispatch) — the receiving half of the mention bridge.

Asks:

  1. Add rows for the agentic workflows above (or explicitly exclude each, per ask 3).
  2. Add a completeness rule to §10 — and a matching AC on #1406: every workflow in the agentic set has exactly one row; an agentic workflow with no row fails the check. Bidirectional, not row-only.
  3. Replace the prose exclusion note under the table with an explicit, enumerable exclusion list. Today it reads "Non-agentic infrastructure workflows (CI, Lint, gate guards ..., dependabot plumbing, thin caller stubs) are out of scope: they are not roles that interact." A validator cannot evaluate "is not a role that interacts" — so as written, completeness is undecidable and ask 2 cannot be implemented. Make it a literal allowlist/denylist (a path list in this doc, or a small data file the validator reads), so "is this workflow in scope?" has a mechanical answer.

Without 2 and 3, the table is CI-verified only for the rows someone remembered to write — which is closer to review-verified than §10 claims.

2. (minor) auto-rebase-retry.yml exposes a taxonomy edge worth one sentence

It is a workflow_run reaction that retries a failed prior run — semantically self-heal, but it is Class 1 (an event reaction), and §6.1 defines self-heal only as a timer_role. Please state explicitly that timer_role applies only to Class 2/3 schedules, and that an event-driven retry handler is plain Class 1 with no timer_role. Otherwise the first implementer to classify it will reasonably guess wrong.

3. (nit) §4's intro says "fixed-column markdown table with exactly these columns"

Worth pinning the separator/escaping convention too (justification cells contain |-free prose and backticked paths today). #1406 has to parse this; one sentence on the escaping rule now prevents a fixture rewrite later.


Nothing here is a disagreement with the model itself — §§1–3 and §§5–9 are sound and I'd merge them as-is. The gap is that §4 + §10 currently under-deliver the "enforceable" half of the story's own title, and that is the half this initiative is for.

Comment thread docs/agentic-interaction-model.md
Comment thread docs/agentic-interaction-model.md Outdated
Comment thread docs/agentic-interaction-model.md
Comment thread docs/agentic-interaction-model.md
@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

Copy link
Copy Markdown
Collaborator Author

Response to don-petry's review

Addressed all three asks (must-fix, minor, nit) plus the two qodo-code-review correctness bugs.

Must-fix: §4 table completeness + §10 bidirectional enforcement

14 missing rows added to §4 (the 13 you listed plus release-notes.yml, which has a push:[main] trigger and was equally absent):

Added workflow Class Note
auto-rebase-retry.yml 1 workflow_run reaction; explicit note that event-driven retry handlers carry no timer_role
dependency-advisory.yml 1 pull_request paths-filtered reaction
spec-drift.yml 1 pull_request:[closed] post-merge advisory
release-notes.yml 1 push:[main] reaction
gh-aw-cross-org.yml 1 repository_dispatch receiver (fix for qodo bug 2)
persona-runner.yml 1 repository_dispatch receiver (fix for qodo bug 2)
initiative-planner.yml 1 workflow_dispatch-only bridge; Class 1 by declaration
pr-auto-review.yml 1 multi-event readiness gate
actions-fleet-monitor.yml 3 daily fleet scan; resolves the §5-cited-but-unclassified inconsistency
stale-manager.yml 3 weekly stale scan
docs-health-check.yml 3 weekly docs health
skill-eval-report.yml 3 daily skill eval
premature-closure-audit.yml 3 weekly closure audit
auto-rebase-health.yml 3 daily auto-rebase health

Prose exclusion note replaced with an explicit two-column path table (20 entries grouped by category: CI infra, tests, gate guards, Dependabot plumbing, thin caller stubs, reusable workflows, manual admin tools). Each row is a resolvable path — the validator now has a mechanical yes/no answer for every .github/workflows/*.yml file.

§10 completeness rule added as a new bullet under validate-interaction-model verifies: — bidirectional: every in-scope workflow must have exactly one row; absent from both table and exclusion list = CI failure. AC for #1406 stated inline.

Minor: auto-rebase-retry.yml taxonomy edge (§6.1)

Added a paragraph after the Class 3 timer_role note: "A Class 1 event-driven workflow also carries no timer_role even when it is semantically self-healing. auto-rebase-retry.yml, for example, re-runs a failed job via workflow_run — but it is Class 1 (a workflow_run reaction), and timer_role is exclusively a property of Class 2/3 scheduled workflows."

Nit: §4 escaping convention

Added after the "CI-verified, not review-verified" sentence: "Escaping convention: justification cells must be |-free (rephrase rather than escape); backtick spans are allowed; the separator row uses ---|---|---|--- with no padding."

Bonus: qodo correctness bugs fixed

  • Dash misparsing (§3 R): and N/A are now explicitly defined as empty (R = false).
  • Dispatch-only class gap (§3 E): repository_dispatch is now included in E; only workflow_dispatch remains excluded. §2 Class 1 updated to match. workflow_dispatch-only workflows (e.g. initiative-planner.yml) are Class 1 by declaration with validator note.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — review-changes (applied)

Changes committed and pushed.

@don-petry
don-petry enabled auto-merge (squash) August 2, 2026 01:41
@don-petry
don-petry disabled auto-merge August 2, 2026 01:42

@don-petry don-petry left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Re-review — all findings addressed ✅

Verified the two review-changes commits (d24d319a, 4c9fc396) independently against the branch, not just the response summary.

Finding Status Verification
1a — missing rows Table went 20 → 34 rows. All 13 I listed are present, plus release-notes.yml which dev-lead found on its own.
1b — explicit exclusion list Prose note replaced with a 20-row path table, each entry a resolvable path with a category rationale. The scope question now has a mechanical answer.
1c — bidirectional completeness §10 gains a "Completeness (bidirectional)" bullet: every in-scope workflow must have exactly one row; absent from both table and exclusion list = CI failure. The #1406 AC is stated inline.
2timer_role taxonomy edge §6.1 now states timer_role is "exclusively a property of Class 2/3 scheduled workflows", with auto-rebase-retry.yml as the worked example.
3 — separator/escaping convention (nit) §4 now pins it: justification cells must be `

Independent invariant check. I verified the document now satisfies the rule it just introduced — the check #1406 will implement:

workflows on branch : 54
covered by doc      : 54   (34 classified + 20 excluded)
in neither list     : 0    ← full coverage
stale rows          : 0    ← no row names a non-existent workflow

Exact 54/54. No gaps, no stale rows. Also confirmed several corrections dev-lead made to my own characterizations were right: spec-drift.yml is pull_request:[closed] (post-merge advisory, not a synchronize reaction), and initiative-planner.yml is workflow_dispatch-only at the stub with the discussion:[labeled] signal arriving via the redispatch bridge.

No further findings. From my side this is ready to merge — I can't post a formal approval because dev-lead authors as don-petry, the same account I review from (see the note below), so treat this as an explicit approve-equivalent.


Process gap this PR surfaced (logging separately, not a blocker here)

I attempted to post this review's predecessor as CHANGES_REQUESTED and GitHub refused: "Can not request changes on your own pull request." dev-lead's declared runtime.identity.account is don-petry — the same account the human owner uses — so the owner structurally cannot use the blocking review path on any dev-lead PR. I fell back to COMMENTED + inline threads, which dev-lead's fix-reviews did enumerate and honor correctly, so the outcome was right; but the mechanically blocking path was unavailable.

This is the review-path sibling of the issue-comment gap that maintainer-comment-gate.sh (#1290) was built to close — that gate exists precisely because dev-lead posts as don-petry and login alone cannot separate agent from maintainer. Worth tracking under epic #1402 since it is squarely an agent-interaction-model concern.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — review-changes (no-changes)

No changes were needed for this PR.

@don-petry

Copy link
Copy Markdown
Collaborator Author

The gate-integrity gap this PR surfaced — the maintainer review threads here were resolved by the agent identity (resolvedBy: don-petry), and CHANGES_REQUESTED was unavailable for the same shared-identity reason — is now tracked as #1415 under epic #1402. No action needed on this PR; the findings themselves were addressed correctly. Recording the link here so the evidence trail points at the fix.

@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: 4c9fc3967cae7eb5c0b041f376a4f4333ba3bea5
Review mode: triage-approved (single reviewer)

Summary

Docs-only PR adding docs/agentic-interaction-model.md (+489, single file): the normative agentic interaction standard for issue #1403. Triage assessment confirmed — LOW risk, all CI green, all review threads resolved, owner posted an approve-equivalent re-review. Independent spot-checks verified the classification table against real on: blocks and confirmed the 54-workflow file set at the PR head is identical to current main (no stale rows despite BEHIND status).

Linked issue analysis

Closes #1403. All 7 acceptance criteria substantively addressed: (1) docs/agentic-interaction-model.md exists, shaped repo-local-first for org promotion; (2) event-first principle + three trigger classes with per-class rules and a 34-row classification table plus a 20-row exclusion list (§1–§4); (3) GITHUB_TOKEN event-boundary rule with the two sanctioned bridges — PAT repository_dispatch and stop-condition-gated backstop timer (§5); (4) timer contract with the backstop|safety-net|self-heal timer_role taxonomy, stop-condition-before-acting, idempotency, human-gate markers, never re-arm (§6); (5) the seven #860 postmortem learnings encoded as normative rules (§7); (6) interaction-contract schema decision fixed — standalone repo-local file, with the persona.yml promotion sequenced behind the org schema change (§8); (7) no new count-based breakers; existing pr-automation-budget (10) + runaway detector remain the ceiling (§9).

Findings

No blocking findings.

  • Prior review cycle fully resolved. The owner's must-fix findings (table completeness, machine-checkable exclusion list, bidirectional §10 enforcement), the timer_role taxonomy edge, and the separator/escaping nit were all addressed across commits d24d319/4c9fc396; the owner's re-review verified each and stated approve-equivalent (a formal approval is impossible since dev-lead authors as the same account). All 7 inline review threads are resolved.
  • Independent verification (this review): the pr-review-sweep.yml row matches its actual on: block at the PR head (cron 2,17,32,47 + workflow_run fast path); the workflow file set at the PR head is byte-identical to current origin/main — 54 files, zero content diffs — so the table's 54/54 coverage (34 classified + 20 excluded) holds against main today and no rows are stale.
  • Secret scan: the run_secret_scanning MCP tool is not available in this environment; the gitleaks CI check passed. Diff is pure markdown documentation — no secrets, no executable code, no workflow changes.
  • Non-blocking note: the doc is a point-in-time inventory until the #1406 validator lands; any workflow added/removed on main before then will silently stale the table. That is a known, accepted gap this initiative's Story 4 exists to close.

CI status

All required checks green at 4c9fc39: Lint, ShellCheck, CodeQL (actions + python), unit-tests, guard, holdout-guard, AgentShield, Agent Security Scan, Secret scan (gitleaks), SonarCloud quality gate, Compile agentic workflows — all SUCCESS. Cancelled/skipped entries are superseded duplicate runs and inapplicable ecosystem audits. Mergeable; branch is BEHIND main but with zero conflicting content.


Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.

@sonarqubecloud

sonarqubecloud Bot commented Aug 2, 2026

Copy link
Copy Markdown

@don-petry
don-petry merged commit 7261a9e into main Aug 2, 2026
27 checks passed
@don-petry
don-petry deleted the dev-lead/issue-1403-20260802-0115 branch August 2, 2026 01:50
@donpetry-bot

Copy link
Copy Markdown
Contributor

Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-08-02T02:50:38Z.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files

Projects

None yet

2 participants