Skip to content

Broaden the house-style rules beyond READMEs #169

Description

@thecodedrift

Follow-up to the dogfooding issue (OSS-28 / #104). no-em-dashes and no-blocklist-phrases now exist and are scoped to **/README.md. This issue is the decision to widen them.

What widening costs

Measured against the current tree:

Area em/en dashes
packages/cli/src (incl. src/agent/*.txt recipe text) 636
openspec/ 1584
.conventions/ 13
CLAUDE.md 34
**/README.md (in scope today) 24

load-bearing appears 27 times. That is ~2300 findings at level: error, which is why the rules did not ship repo-wide.

Why this is not one decision

The areas differ in kind, and probably want different answers:

  • packages/cli/src/agent/*.txt is agent-facing recipe text — prose we author and ship as a product surface. The strongest case for enforcement, and the largest single remediation.
  • TypeScript comments are reachable: Vale reads .ts in its comments-only tier, so a rule sees the comments and never the code. Enforceable without touching source.
  • openspec/ carries the largest count, and archived changes under openspec/changes/archive/ are historical records. Rewriting them would edit the record of what was proposed at the time, which feat: resolve the CLI invocation as a recipe variable #143's review thread already established we do not do. Archives probably want a permanent exclusion rather than a remediation.
  • CLAUDE.md and .conventions/ are small enough to fix in one pass.

Also worth settling

Two corrections to the rules as OSS-28 specified them, both measured:

  • nonword: true is required on no-em-dashes. The snippet in OSS-28 omits it. Without it the rule parses, passes verify, and never fires — Vale wraps every token in word boundaries, and an em dash is non-word on both sides. It is a silent no-op, which is the worst failure mode for a rule nobody re-checks.
  • landed on was dropped from the blocklist. Measured firing on "the plane landed on time", exactly the literal sense OSS-28 says to protect. we landed already covers "we landed on the second option", so the broader token only added false positives.

The third rule OSS-28 describes — the "not X, Y" antithesis construction — is still unwritten. The issue itself is undecided between three approaches and calls whatever ships a heuristic, so it wants a human call rather than a default.

Suggested order

READMEs are enforced now. Next cheapest is CLAUDE.md plus .conventions/, then TypeScript comments, then the recipe text. openspec/changes/archive/ should be excluded permanently rather than scheduled.

Refs #104

🤖 Generated with Claude Code

https://claude.ai/code/session_017cEN93Acyp4zBwP3oDnyy1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions