|
| 1 | +# Issue Format |
| 2 | + |
| 3 | +Every issue in the PSModule organization follows the same structure. The format makes issues: |
| 4 | + |
| 5 | +- **Readable** by anyone — human or agent — without prior context. |
| 6 | +- **Actionable** by an implementer without back-and-forth. |
| 7 | +- **Traceable** because decisions and changes are recorded. |
| 8 | + |
| 9 | +## Properties of every issue |
| 10 | + |
| 11 | +- **Every change has an issue.** Features, fixes, refactors, documentation, maintenance — all tracked as issues before work begins. |
| 12 | +- **The description is the single source of truth.** It reflects the current state of the work at all times. Decisions, scope changes, and approach changes are written directly into the description. |
| 13 | +- **Comments record change history only.** Each description update is accompanied by a comment summarizing what changed and why. |
| 14 | +- **Tone is impersonal.** No first-person ("I", "my") or second-person ("you", "your") language. Neutral references like "the user", "the developer", or passive constructions. |
| 15 | +- **External references are hyperlinks.** Every mention of an API, RFC, library, doc, or tool is a clickable `[text](url)` link. No bare URLs. |
| 16 | +- **No duplicates.** Existing issues are searched before creating or restructuring. Duplicates are consolidated or cross-linked. |
| 17 | + |
| 18 | +## Title |
| 19 | + |
| 20 | +A clear, imperative-mood statement of the work. Not a question, not a symptom. |
| 21 | + |
| 22 | +- Scope or area when it aids disambiguation: `Build-PSModule: Add retry logic to publish step`. |
| 23 | +- No type prefixes (`[Bug]`, `[Feature]`) — labels handle categorization. |
| 24 | + |
| 25 | +### Well-formed |
| 26 | + |
| 27 | +- `Add pagination support to Get-GitHubRepository` |
| 28 | +- `Fix null reference when Context is not resolved` |
| 29 | +- `Update installation guide with prerequisites` |
| 30 | + |
| 31 | +### Malformed |
| 32 | + |
| 33 | +- `Bug in module` |
| 34 | +- `Please fix` |
| 35 | +- `WIP` |
| 36 | + |
| 37 | +## The three sections |
| 38 | + |
| 39 | +The description has three sections separated by horizontal rules (`---`), ordered from behavioural to architectural to tactical. The user need is understood before the technical discussion. |
| 40 | + |
| 41 | +| Section | Owner | Present in | |
| 42 | +| ------- | -------------- | ----------------------------------------------------- | |
| 43 | +| 1 — Context and Request | Ideator → Clarifier | Every issue at every level (Task, PBI, Epic) | |
| 44 | +| 2 — Technical Decisions | Planner | Task always; PBI / Epic for decomposition rationale | |
| 45 | +| 3 — Implementation Plan | Planner | Task always (task list); PBI / Epic (links to children) | |
| 46 | + |
| 47 | +## Section 1 — Context and Request |
| 48 | + |
| 49 | +Describes the **user experience** — what someone wants, what isn't working, or what is missing. Written from the user's perspective, not the implementer's. |
| 50 | + |
| 51 | +Two parts: |
| 52 | + |
| 53 | +- **Context** — who the user is, what they're trying to accomplish, the situation. |
| 54 | +- **Request** — the problem or need, as the user experiences it. |
| 55 | + |
| 56 | +Answers: |
| 57 | + |
| 58 | +- What does the user want to do? |
| 59 | +- What is the user experiencing today (for bugs / gaps)? |
| 60 | +- What should the experience look like instead? |
| 61 | +- Why does it matter? |
| 62 | + |
| 63 | +Framing by work type: |
| 64 | + |
| 65 | +| Type | Framing | |
| 66 | +| -------------- | ---------------------------------------------------------------------- | |
| 67 | +| Feature | Desired capability from the user's point of view. | |
| 68 | +| Bug / Fix | What happens vs. What is expected. | |
| 69 | +| Change request | Current experience vs. Desired experience. | |
| 70 | +| Maintenance | User impact — how internal work improves reliability, speed, etc. | |
| 71 | +| Documentation | What is confusing or missing — the gap a user runs into. | |
| 72 | + |
| 73 | +Elements per work type: |
| 74 | + |
| 75 | +| Element | Feature | Bug / Fix | Change request | Maintenance | Documentation | |
| 76 | +| ------------------------ | :-----: | :-------: | :------------: | :---------: | :-----------: | |
| 77 | +| Acceptance criteria | ✓ | ✓ | ✓ | ✓ | ✓ | |
| 78 | +| Reproduction steps | | ✓ | | | | |
| 79 | +| Environment / version | | ✓ | | | | |
| 80 | +| Regression indicator | | ✓ | | | | |
| 81 | +| Known workarounds | | ✓ | ○ | | | |
| 82 | +| Error messages / logs | | ✓ | | ○ | | |
| 83 | +| Screenshots / visuals | ○ | ✓ | ○ | | ○ | |
| 84 | + |
| 85 | +✓ = present when applicable, ○ = optional |
| 86 | + |
| 87 | +This section **does not contain** file paths, function internals, API endpoints, or implementation patterns. Those belong in Section 2. |
| 88 | + |
| 89 | +## Section 2 — Technical Decisions |
| 90 | + |
| 91 | +The technical choices that shape the plan. Sits between the user-facing request and the tactical plan. |
| 92 | + |
| 93 | +Why this section exists: |
| 94 | + |
| 95 | +- Different technical choices lead to fundamentally different plans — deciding upfront avoids rework. |
| 96 | +- Conscious, documented choices replace implicit assumptions buried in code. |
| 97 | +- Reviewers see the **reasoning** behind the plan, not just the plan itself. |
| 98 | + |
| 99 | +Structure: |
| 100 | + |
| 101 | +- Each decision is a bolded label or heading, followed by the chosen approach and a brief rationale. |
| 102 | +- Alternatives considered are included when they help explain the choice. |
| 103 | +- Open decisions are marked with `Open:` and resolved before the implementation plan is written. |
| 104 | +- When a decision changes later, this section is updated and a comment documents the change. |
| 105 | + |
| 106 | +Typical decision areas: |
| 107 | + |
| 108 | +- Where new code lives (paths, modules). |
| 109 | +- Patterns or conventions followed (e.g., "follow the existing pattern in `Get-GitHubRelease`"). |
| 110 | +- Naming choices. |
| 111 | +- Whether to extend or create new. |
| 112 | +- Dependencies on other functions, modules, or APIs. |
| 113 | +- Error handling strategy. |
| 114 | +- Breaking changes and backward compatibility. |
| 115 | +- Test strategy (unit, integration, mocks). |
| 116 | + |
| 117 | +## Section 3 — Implementation Plan |
| 118 | + |
| 119 | +The task-level roadmap. Implementers track progress here; reviewers use it to understand scope. |
| 120 | + |
| 121 | +Structure: |
| 122 | + |
| 123 | +- Every discrete piece of work is a checkbox: `- [ ]`. |
| 124 | +- Tasks are grouped under subheadings when work spans multiple areas (files, components, tests). |
| 125 | +- Each task is specific and actionable — file paths, function names, modules. |
| 126 | +- All tasks start unchecked. Checking happens during implementation. |
| 127 | +- Tasks are ordered logically — dependencies first, tests last. |
| 128 | + |
| 129 | +For PBIs and Epics, Section 3 is **a list of links to child issues**, not inline tasks. See [Issue Hierarchy](Issue-Hierarchy.md). |
| 130 | + |
| 131 | +## Comments |
| 132 | + |
| 133 | +Every description update is accompanied by a comment. Comments preserve the change history so reasoning is not lost when the description is overwritten. |
| 134 | + |
| 135 | +A comment contains: |
| 136 | + |
| 137 | +- A brief summary line. |
| 138 | +- Bullet points detailing what was added, changed, or removed. |
| 139 | +- Any gaps or open questions that need input. |
| 140 | + |
| 141 | +## Formatting |
| 142 | + |
| 143 | +Issues use [GitHub Flavored Markdown](https://github.github.com/gfm/) with the full feature set: |
| 144 | + |
| 145 | +- `- [ ]` / `- [x]` task lists. |
| 146 | +- Tables for comparisons, label definitions, decision matrices. |
| 147 | +- Fenced code blocks with language identifiers. |
| 148 | +- `>` blockquotes for callouts. |
| 149 | +- `> [!NOTE]`, `> [!TIP]`, `> [!IMPORTANT]`, `> [!WARNING]`, `> [!CAUTION]` alerts. |
| 150 | +- `<details><summary>…</summary>…</details>` collapsible sections. |
| 151 | +- `#123`, `@user`, and commit SHA autolinks. |
| 152 | +- Backtick-wrapped inline code for identifiers. |
| 153 | +- `---` horizontal rules between sections. |
| 154 | +- `[text](url)` links for all external references. |
| 155 | +- **No hard line breaks within a paragraph.** GitHub renders mid-paragraph newlines as spaces, which creates inconsistent visual spacing. |
| 156 | + |
| 157 | +## Labels |
| 158 | + |
| 159 | +Labels categorize. The category is never encoded in the title. |
| 160 | + |
| 161 | +| Label | Use for | |
| 162 | +| ----------- | ---------------------------------------------------- | |
| 163 | +| `Major` | Breaking changes | |
| 164 | +| `Minor` | New features or enhancements | |
| 165 | +| `Patch` | Small fixes or improvements | |
| 166 | +| `NoRelease` | Documentation, maintenance, CI/CD — no version bump | |
| 167 | +| `Bug` | Bug reports | |
| 168 | +| `Feature` | Feature requests | |
| 169 | +| `Question` | Questions or discussion | |
| 170 | + |
| 171 | +Issue **types** (Epic / PBI / Task) are GitHub-native and separate from labels — see [Issue Hierarchy](Issue-Hierarchy.md). |
0 commit comments