feat(good-oss-citizen): hard-stop on beginner-reserved issue labels#49
Open
jbaruch wants to merge 1 commit into
Open
feat(good-oss-citizen): hard-stop on beginner-reserved issue labels#49jbaruch wants to merge 1 commit into
jbaruch wants to merge 1 commit into
Conversation
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>
There was a problem hiding this comment.
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
reconandproposeskill 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. |
|
|
||
| ### 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)). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Author-Model: claude-opus-4-8
Summary
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.reconStep 3 stops on the label before the policy-conditional check;proposeStep 1 + Step 6 treat it as unconditional.triageneeds no change — it never selects/implements an issue, so the always-on rule covers it.dataweave-good-first-issue-no-policy: project with no AI policy + agood 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 existingtaskrunner-good-first-issue-trapkeeps covering the policy-backed path.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.shenvelope smoke test — 23 commands + negative path passtessl skill review --threshold 85— recon 90%, propose 90%criteria.jsonvalid, weights sum to 100