Skip to content

feat(good-oss-citizen): hard-stop on beginner-reserved issue labels#49

Open
jbaruch wants to merge 1 commit into
mainfrom
feat/good-first-issue-hard-stop
Open

feat(good-oss-citizen): hard-stop on beginner-reserved issue labels#49
jbaruch wants to merge 1 commit into
mainfrom
feat/good-first-issue-hard-stop

Conversation

@jbaruch

@jbaruch jbaruch commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Author-Model: claude-opus-4-8

Summary

  • Treat good first issue (and equivalents: good-first-issue, good_first_issue, beginner, first-timers-only, e-easy, level: starter) as an unconditional hard stop — decline to write code or a PR regardless of the project's AI policy. Previously the tile only redirected when an AI policy explicitly restricted AI on the label.
  • New always-on rule "Never work on beginner-reserved issues — hard stop" (with the why: these are newcomer on-ramps, so the rule states the reasoning to keep it from being worked around). recon Step 3 stops on the label before the policy-conditional check; propose Step 1 + Step 6 treat it as unconditional. triage needs no change — it never selects/implements an issue, so the always-on rule covers it.
  • New eval dataweave-good-first-issue-no-policy: project with no AI policy + a good first issue (demo-dataweave Bump tessl-labs/good-oss-citizen to 1.0.2 [skip ci] #8) → agent must still decline and redirect to AI-workable alternatives (Expand maintainer setup docs with tessl.json and semi-automatic install #4, Detect and follow existing issue/PR templates #9, ci(review): add jbaruch/coding-policy PR review workflows #10). The existing taskrunner-good-first-issue-trap keeps covering the policy-backed path.
  • README + CHANGELOG documented.

This is a deliberate, opinionated product stance (per #47), not a bug fix: beginner-reserved labels are reserved for human newcomers even when the project would technically allow AI.

Closes #47

Test plan

  • github.sh envelope smoke test — 23 commands + negative path pass
  • tessl skill review --threshold 85 — recon 90%, propose 90%
  • eval criteria.json valid, weights sum to 100
  • baseline eval (no tile) = 0/100 — agent writes & commits the fix (the trap)
  • with-context lift recorded post-publish (clean measurement needs plugin-mode + the tile→plugin path fix in chore(plugin): migrate from tile format to plugin format #46)

Treat `good first issue` (and equivalents: good-first-issue,
good_first_issue, beginner, first-timers-only, e-easy, level: starter)
as an unconditional hard stop — decline to write code or a PR
regardless of the project's AI policy. Previously the tile only
redirected when an AI policy explicitly restricted AI on the label.

These labels exist to give human newcomers an on-ramp; an AI agent
claiming one defeats that purpose even when the project would
technically allow it. The stance is deliberate and opinionated, so
the rule states the "why" to keep it from being worked around.

- rules: new "Never work on beginner-reserved issues" hard-stop rule
- recon: Step 3 stops on the label before the policy-conditional check
- propose: Step 1 + Step 6 treat the label as unconditional
- eval: dataweave-good-first-issue-no-policy (no policy + the label
  still declines/redirects), where baseline would write the fix
- README + CHANGELOG documented

Closes #47

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 2, 2026 21:50

Copilot AI 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.

Pull request overview

This PR updates the good-oss-citizen tile to treat “beginner-reserved” issue labels (notably good first issue and common equivalents) as an unconditional hard stop, regardless of whether the target project has an AI policy or what it permits. This aligns tile behavior with the product stance in #47: preserve newcomer on-ramps by redirecting AI-assisted contributors to other issues.

Changes:

  • Add an always-on rule: never work on beginner-reserved issues (unconditional), and route to the existing redirect flow.
  • Update recon and propose skill guidance to stop on beginner-reserved labels before any policy-conditional label checks.
  • Add a new eval scenario (dataweave-good-first-issue-no-policy) to ensure the agent declines even when the target repo has no AI policy; document the behavior in README/CHANGELOG.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tiles/good-oss-citizen/skills/recon/SKILL.md Makes beginner-reserved labels an unconditional Step 3 stop; adjusts Step 2 examples away from “good first issue” being policy-conditional.
tiles/good-oss-citizen/skills/propose/SKILL.md Updates Step 1 and redirect guidance to treat beginner-reserved labels as an unconditional hard stop.
tiles/good-oss-citizen/rules/good-oss-citizen.md Adds the new always-on rule “Never work on beginner-reserved issues — hard stop” with rationale.
tiles/good-oss-citizen/README.md Documents the new rule in the tile’s “Rules” summary.
tiles/good-oss-citizen/evals/dataweave-good-first-issue-no-policy/task.md Adds an eval task prompting the agent to take a good first issue in a repo with no AI policy.
tiles/good-oss-citizen/evals/dataweave-good-first-issue-no-policy/criteria.json Adds weighted checklist criteria validating the unconditional decline + redirect behavior.
CHANGELOG.md Records the behavior change and the new eval scenario under [Unreleased].

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 19 to 22
- Is it assigned to someone? If yes, warn — competing PRs are bad etiquette.
- Has someone commented claiming it ("I'd like to work on this", "I'll take this")? Same problem — warn and suggest alternatives.
- Is it labeled "good first issue"? Check AI_POLICY.md — some projects forbid AI on these.
- Is it labeled `good first issue` or an equivalent beginner-reserved label (`good-first-issue`, `good_first_issue`, `beginner`, `first-timers-only`, `e-easy`, `level: starter`)? **Unconditional hard stop** — do NOT write code or draft a PR, regardless of the project's AI policy (this stands even when no AI policy exists). These are reserved as on-ramps for human newcomers; redirect instead (see "When redirecting away from an issue" below). See the rule "Never work on beginner-reserved issues — hard stop."
- Is it labeled internal, blocked, or pending design?
bash .tessl/tiles/tessl-labs/good-oss-citizen/skills/recon/scripts/bash/github.sh ai-policy OWNER/REPO
```
The script returns `data.files` — an array with one entry per policy file (`AI_POLICY.md`, `CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`), each carrying `found` and `content`. Read every entry whose `found` is `true` and determine the project's AI stance. Look for explicit negatives alongside "AI": "do not", "cannot", "banned", "prohibited", "not allowed", "not accepted." Check for hard-stop consequences: "PRs will be closed", "contributions rejected", "account suspended." If you find these, that's a ban. Look for disclosure language: "must disclose", "required to disclose", "include what tool." Check for conditional restrictions: "AI not allowed on good-first-issue", "AI only with full human review." Absence of any AI mention means no policy — NOT a ban. Then act:
The script returns `data.files` — an array with one entry per policy file (`AI_POLICY.md`, `CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`), each carrying `found` and `content`. Read every entry whose `found` is `true` and determine the project's AI stance. Look for explicit negatives alongside "AI": "do not", "cannot", "banned", "prohibited", "not allowed", "not accepted." Check for hard-stop consequences: "PRs will be closed", "contributions rejected", "account suspended." If you find these, that's a ban. Look for disclosure language: "must disclose", "required to disclose", "include what tool." Check for conditional restrictions: "AI not allowed on `security` issues", "AI only with full human review." Absence of any AI mention means no policy — NOT a ban. (Beginner-reserved labels like `good first issue` are handled unconditionally in Step 3 — they stop you regardless of policy, so they are not the kind of conditional, policy-driven restriction this step is looking for.) Then act:
The tile has three layers:

- **Rules** (always-on, ~2.8k tokens) — the commandments. Never forge a DCO sign-off, never submit without human review, respect AI bans, never write code for a claimed issue. These fire regardless of which skill activated.
- **Rules** (always-on, ~3.1k tokens) — the commandments. Never forge a DCO sign-off, never submit without human review, respect AI bans, never write code for a claimed issue, never touch a beginner-reserved `good first issue`. These fire regardless of which skill activated.
Comment thread CHANGELOG.md

### Changed — Treat beginner-reserved issue labels as an unconditional hard stop

The tile now declines to write code or draft a PR for any issue labeled `good first issue` (or an equivalent newcomer-reserved label: `good-first-issue`, `good_first_issue`, `beginner`, `first-timers-only`, `e-easy`, `level: starter`) **regardless of the target project's AI policy** — previously it only redirected when the project's AI policy explicitly restricted AI on the label. This is a deliberate, opinionated stance: these labels exist to give human newcomers an on-ramp, and an AI agent claiming one defeats that purpose even when the project would technically allow it ([#47](https://github.com/tesslio/good-oss-citizen/issues/47)).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Never work on good first issue-labeled issues (unconditional)

2 participants