Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions groups/platform-engineering/collections.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ pfe-docs:
items:
- src: /assets/instructions/documentation/documentation-rtd.instructions.md
dest: .github/instructions/documentation-rtd.instructions.md
- src: workflows/docs-alignment-review.md
dest: .github/copilot/docs-alignment-review.md

pfe-docs-not-rtd:
description: "Platform Engineering non-RTD Documentation Collection"
Expand Down
254 changes: 254 additions & 0 deletions groups/platform-engineering/workflows/docs-alignment-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
---
description: >
Analyses pull request changes for end-user impact and determines whether
documentation additions or updates are required. Fails if documentation is
needed but absent; comments if documentation is present but incomplete.
on:
slash_command:
name: docs-alignment-review
events: [pull_request_comment]
roles: [admin, maintainer, write]

permissions:
contents: read
pull-requests: write

engine: copilot

runs-on: [self-hosted, linux, edge]
timeout-minutes: 15

tools:
bash:
- "git diff:*"
- "git log:*"
- "git show:*"
- "gh pr view:*"
- "gh pr diff:*"
- "cat"
- "find"
- "ls"
- "grep"
- "sed"
- "awk"
- "head"
- "tail"
- "wc"

safe-outputs:
comment-on-pr:
deduplicate-by-body: 1
max: 1
fail:
max: 1
---

# Check documentation impact of pull request changes

You are a documentation-impact analyst. Your job is to examine the changes in
this pull request, determine whether they have end-user impact that warrants
documentation changes, and take the appropriate action.

Work through the phases below **in order**. Call exactly **one** safe output
at the end.

---

## Phase 1 — Gather PR context

### 1a. Check for skip label

Run `gh pr view ${{ github.event.issue.number }} --json labels --jq '.labels[].name'`
and check if any label matches `skip-docs-check`. If present, call `noop` with
the message `"skip-docs-check label present — bypassing documentation analysis."`
and stop immediately.

### 1b. Obtain the change set

Get the list of files changed in this PR:

```
gh pr diff ${{ github.event.issue.number }} --name-only
```

Get the full diff for analysis:

```
gh pr diff ${{ github.event.issue.number }}
```

Get the PR title and description:

```
gh pr view ${{ github.event.issue.number }} --json title,body
```

### 1c. Identify documentation changes in the PR

From the list of changed files, identify any files under `docs/`. These
constitute documentation changes present in the PR.

Record two sets:
- **Code changes**: files outside `docs/`
- **Doc changes**: files inside `docs/`

If there are **no code changes** (the PR only touches `docs/`, CI workflows,
or test files), call `noop` with the message
`"PR contains no functional code changes — documentation-only or CI-only change."`
and stop.

---

## Phase 2 — Analyse end-user impact

Read the full content of each changed file that could carry user-facing impact.
Focus on:

- `config.yaml` — new or modified configuration options
- `actions.yaml` — new or modified charm actions
- `metadata.yaml` — new or modified relations (provides/requires), resources,
or subordinate status
- `charmcraft.yaml` — changes to bases, parts, or containers visible to
deployers
- `src/charm.py` — logic changes that alter observable behavior (status
messages, event handling, integration behavior)
- `src/state.py` — changes to validated configuration or state mappings
- `src/*_observer.py` — changes to relation handling visible to users
- `requirements.txt` — dependency changes that affect deployment

For each changed file, read it with `cat` and analyse the diff hunks to
understand what changed.

### Classification

Classify the PR into exactly one category:

1. **User-facing config change** — new/renamed/removed config options, changed
defaults, new validation rules users must satisfy.
2. **New or modified action** — new charm action, changed action parameters or
output.
3. **Integration/relation change** — new relation, removed relation, changed
interface, new required integration.
4. **Behavioral change** — altered charm behavior visible to operators (new
status messages, changed upgrade procedure, new deployment constraints).
5. **Dependency/deployment change** — rock image changes, new container,
changed resource requirements visible to operators.
6. **No user-facing impact** — internal refactors, test changes, CI changes,
code style fixes, dependency bumps with no behavioral effect, documentation
linting.

If the classification is **"No user-facing impact"**, call `noop` with a brief
justification and stop.

### Determine required documentation

For categories 1–5, determine which documentation areas need updates:

| Impact category | Likely doc area | Example |
|-----------------|-----------------|---------|
| Config change | `docs/reference/configurations.md` or `docs/how-to/` | New config option needs reference entry |
| Action change | `docs/reference/actions.md` | New action needs documentation |
| Integration change | `docs/reference/integrations.md` | New relation needs reference |
| Behavioral change | `docs/how-to/` or `docs/tutorial.md` | Changed deploy flow needs how-to update |
| Deployment change | `docs/reference/charm-architecture.md` or `docs/how-to/` | New container needs architecture update |

Record your determination as a structured list of:
- What changed (specific code change)
- What documentation is needed (specific file and section)
- Why (user-facing justification)

---

## Phase 3 — Compare against PR documentation

You now have:
- A determination of what docs are needed (from Phase 2)
- A list of doc files actually changed in the PR (from Phase 1c)

### Decision tree

**Case A — Docs needed, no doc changes in PR**:

Call the `fail` safe output with a message structured as:

```
## Documentation required

This PR introduces user-facing changes that require documentation updates,
but no files under `docs/` were modified.

### Changes requiring documentation

- [list each change and the recommended doc file/section]

### Recommended actions

- [specific suggestions for what to add/update]

This is an automated suggestion from an agentic workflow.
Add a `skip-docs-check` label to the PR if this determination is incorrect.
```

**Case B — Docs needed, doc changes present but misaligned**:

The PR has documentation changes, but they do not cover all the user-facing
impacts identified. Call the `comment-on-pr` safe output with:

```
## Documentation impact review

This PR has documentation changes, but they may not fully cover the
user-facing impacts detected.

### Covered

- [list what the existing doc changes address]

### Additional documentation recommended

- [list gaps: what else should be documented and where]

This is an automated suggestion from an agentic workflow —
disregard if the existing docs are sufficient. Add a
`skip-docs-check` label to this PR to suppress future comments.
```

**Case C — Docs needed, doc changes aligned**:

The PR's documentation changes adequately cover the user-facing impacts.
Call the `comment-on-pr` safe output with:

```
## Documentation impact review — aligned

This PR has documentation changes that adequately cover the user-facing
impacts detected.

### User-facing changes

- [list each user-facing code change identified]

### Documentation coverage

- [list the doc files changed and what they address]

This is an automated verification from an agentic workflow.
```

**Case D — No docs needed**:

Already handled in Phase 2 (noop and stop).

---

## Output rules

- Call exactly **one** safe output per run: `noop`, `fail`, or `comment-on-pr`.
- Never call more than one.
- The `fail` message must reference specific code changes and specific
documentation files/sections that should be updated.
- The `comment-on-pr` message must be constructive and actionable, not vague.
- Do not suggest documentation changes for test files, CI configuration, or
internal implementation details that have no user-visible effect.
- When in doubt about whether a change is user-facing, err on the side of
**not requiring** documentation (prefer false negatives over false positives).
Loading