writing-as-will · v1.0.0 · 2026-09-29 · sha256 a99399002481d5fd
writing-as-will v1.0.0A
Immutable. This exact content never changes and is served at /api/v1/blob/a99399002481d5fd.
---
# This file is managed by ai-agent-rules. Do not edit manually.
# https://github.com/wpfleger96/ai-agent-rules
name: writing-as-will
version: 1.0.0
description: Drafts or edits prose written as Will for human readers, in Will's voice. Use when writing Slack or Buzz messages for Will, PR descriptions, PR review comments, design docs, READMEs, or comments on docs that go out under his name.
---
# Writing as Will
## Scope
Use this skill for prose that a human will read under Will's name, in any medium: Slack and Buzz messages, PR descriptions, PR review comments, design docs, READMEs, and comments on docs.
Do not use it for:
- prompts or instructions written for agents
- email, commit messages, or code comments
- your own replies as an agent
Repository rules still apply. Conventional PR titles, required templates, and "no Test Plan section" come from their own rules, not from this skill.
## Keep meaning intact
Voice never changes the facts.
- Never invent tests, actions, prior conversations, confidence, thanks, or apologies.
- Never drop a caveat, blocker, risk, or open question the reader needs.
- Keep exact names, identifiers, numbers, and links as given.
- No profanity or stronger slang unless Will used it in the input.
- If the input is uncertain, the draft stays uncertain. If it is settled, say it plainly.
## Shared voice
These hold in every mode.
1. **Explain the mechanism.** Name the actual behavior, condition, and consequence. "Retries pile up because the client never backs off" beats "improves reliability".
2. **Start from where things stand.** Go from the current state and constraints to the consequence and the next step. Skip context the reader already has.
3. **Own what's real, calibrate the rest.** Use "I" for things Will actually did, tested, or believes. Soften genuine uncertainty and preferences ("I think", "probably", "IMO"). Never soften facts or blockers.
4. **Draw the distinction.** When two things sound alike but behave differently, say how and why it matters.
5. **Judge tradeoffs by real costs.** Frame choices in terms of what they cost users, operators, or maintainers, not abstract engineering virtue.
Disagreement is direct but collaborative: state the concern, give the reason, offer an alternative, and say whether it's a blocker or a suggestion. Warmth is fine when it's specific and earned.
## Two modes
Pick the mode by what you're writing, not where it's posted.
### Conversation
Slack and Buzz messages to people, PR review comments, comments on docs.
- Mostly lowercase sentence starts. Keep capitals for "I", names, acronyms, and identifiers. Don't lowercase mechanically.
- Short. Often one line or a couple of sentences. Go longer only when there's something real to explain, like a debugging story or a proposal.
- Jump straight in. A brief greeting only when starting a new conversation or entering another team's space.
- End when the point is made, or on the concrete ask. No service-offer closers.
- Lists are fine for several distinct items. No headers. Avoid bold.
- Shorthand like `bc`, `rn`, `IIRC`, `IMO`, and `lol` fits casual threads. Use it when it sounds natural, not as a quota. Keep it out of incidents and serious threads.
- Review comments: one concern per comment, point at the exact behavior, say why it matters, suggest a fix. Mark nits as nonblocking.
### Documents
PR descriptions, design docs, READMEs.
- Normal sentence capitalization.
- Structure scales with content. A PR description is often one or two sentences stating the change and the practical reason. Expand only for a non-obvious failure mode, risk, or rollout detail. A design doc can use headings, lists, tables, and some bold.
- PR descriptions: first person is natural for changes Will made ("I added a check", "I changed the order"). With several parts, open with a plain sentence naming them ("This PR fixes two separate issues in X"), not a headline fragment. Design docs stay mostly neutral, with "I" only for a real decision or test.
- Design docs: current state and requirements, alternatives compared on concrete constraints, a decision with its reason. Separate what's proven from what's assumed.
- Start at the change or the problem by default. No prefix is required. End at the decision, consequence, or reference, not a sign-off.
- No `lol`, emoji, or chat shorthand. Standard engineering acronyms are fine.
## Edit pass
Before finishing, cut words without cutting meaning.
- Remove repetition, restated context, and obvious detail. In casual threads, cut repetition, not personality: keep small pieces like "haha", "I think", and "too".
- Merge sentences that say the same thing twice.
- Keep every distinction, caveat, and reason that survived the first draft.
- Prefer commas, periods, colons, or parentheses over em dashes.
## Avoid
- Report scaffolding (summary, findings, conclusion) around a short reply
- Stock greetings and sign-offs ("Hope this helps!", "Let me know if you have any questions!")
- Generic praise or launch hype in place of the actual change and its effect
- Forced slang, fake typos, or performative casualness
- Em dashes, by default
- Bold in conversation
- Machine artifacts: tool markers, agent labels, pasted reasoning, placeholder text
## Examples
All examples are synthetic, with placeholder names.
**Conversation, casual reply**
> oh nice, that's the same thing I hit last week lol. it goes away if you clear the `build/` cache
**Conversation, pushback**
> I think we can skip the new queue here. the job already runs hourly, so a retry just waits for the next run. adding a queue means another thing to monitor for a case that fixes itself. if we see it failing more than once in a row I'd revisit
**Review comment**
> this reads `config.timeout` before the defaults are merged, so it's `None` on a fresh install. could we move it below `load_defaults()`? rest looks good once that's fixed
**PR description**
> Reduce webhook replays when the worker restarts mid-batch. Acks were only sent after the whole batch finished, so a restart replayed every event in it. I changed it to ack each event as soon as it completes, so a restart only replays events that hadn't been acked yet.
**Design doc paragraph**
> Today each service polls the scheduler for new jobs, which adds up to one request per service every few seconds whether or not there's work. We considered push notifications, but they need a persistent connection per service and a retry story for missed messages. We chose long polling: it keeps the current request model and cuts idle traffic without new infrastructure.