mirror of
https://github.com/prdlk/leetcode.git
synced 2026-09-16 23:16:26 +00:00
feat(skills): add campaign-issues and project-fields skill docs
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
---
|
||||
name: campaign-issues
|
||||
description: Create GitHub issues for this LeetCode campaign — individual problem issues and the topic issues that own them — using the repo's exact title, label, milestone, body, and sub-issue conventions. Use when asked to add/create an issue for a LeetCode problem or a topic, attach a problem to its topic, or backfill the issue catalog.
|
||||
---
|
||||
|
||||
# Campaign issues
|
||||
|
||||
The GitHub issue tracker **is the campaign catalog**: ~24 `topic` issues each own a
|
||||
set of `problem` sub-issues. The Worker reconciles this catalog into D1 nightly
|
||||
(`/admin/reconcile`), so a correctly-labelled issue is all that's needed — the SRS,
|
||||
digest, charts, and Project mirror pick it up automatically. Get the labels/body shape
|
||||
right; everything downstream is reconciliation.
|
||||
|
||||
All commands use `gh` against `prdlk/leetcode` and fall back to `gh auth token`.
|
||||
|
||||
## Problem issue
|
||||
|
||||
One issue per LeetCode problem, attached as a sub-issue of its topic.
|
||||
|
||||
- **Title:** `LC <num> · <Title> · <Difficulty> · <set>`
|
||||
- `<Difficulty>` ∈ `Easy | Medium | Hard` (LeetCode's own rating — do not invent).
|
||||
- `<set>` ∈ `core | optional | deferred` (see set semantics below).
|
||||
- Separators are middle dots `·` (U+00B7), single spaces around each.
|
||||
- **Labels** (four, all required):
|
||||
- `problem`
|
||||
- `diff:easy` | `diff:medium` | `diff:hard` — matches `<Difficulty>`.
|
||||
- `set:core` | `set:optional` | `set:deferred` — matches `<set>`.
|
||||
- `phase:N` — the **topic's** phase (same phase label the topic issue carries).
|
||||
- **Milestone:**
|
||||
- `core` / `optional` → the topic's phase milestone.
|
||||
- `deferred` → `Review — Transfer & Mocks` (deferred Hards are parked until week 8).
|
||||
- Pass the milestone **title**, not its number, to `--milestone`.
|
||||
- **Body** (exact shape; `<slug>` is the LeetCode URL slug, `<topic-issue>` the owning topic's number):
|
||||
|
||||
```
|
||||
https://leetcode.com/problems/<slug>/
|
||||
|
||||
- **Topic:** #<topic-issue>
|
||||
- **Set:** <core|optional|deferred>
|
||||
- **Language:** Python
|
||||
|
||||
### Close-out (paste before closing this issue)
|
||||
- Time: O(?)
|
||||
- Space: O(?)
|
||||
- Edge case traced:
|
||||
- First attempt passed: yes / no
|
||||
- Miss note:
|
||||
```
|
||||
|
||||
Create it:
|
||||
|
||||
```sh
|
||||
gh issue create --repo prdlk/leetcode \
|
||||
--title "LC 42 · Trapping Rain Water · Hard · core" \
|
||||
--label problem --label set:core --label diff:hard --label phase:1 \
|
||||
--milestone "Phase I — Linear Structures" \
|
||||
--body "https://leetcode.com/problems/trapping-rain-water/
|
||||
|
||||
- **Topic:** #9
|
||||
- **Set:** core
|
||||
- **Language:** Python
|
||||
|
||||
### Close-out (paste before closing this issue)
|
||||
- Time: O(?)
|
||||
- Space: O(?)
|
||||
- Edge case traced:
|
||||
- First attempt passed: yes / no
|
||||
- Miss note:"
|
||||
```
|
||||
|
||||
Then **attach it as a sub-issue of the topic** (this is a separate API call — creating
|
||||
the issue does not link it). The sub-issues API wants the child's internal **id**, not
|
||||
its issue number, and the field is integer-typed, so use `-F` (not `-f`):
|
||||
|
||||
```sh
|
||||
child_id=$(gh api repos/prdlk/leetcode/issues/211 --jq '.id')
|
||||
gh api --method POST repos/prdlk/leetcode/issues/9/sub_issues -F sub_issue_id=$child_id
|
||||
# verify
|
||||
gh api repos/prdlk/leetcode/issues/9/sub_issues --jq '.[] | "\(.number) \(.title)"'
|
||||
```
|
||||
|
||||
## Topic issue
|
||||
|
||||
One issue per curriculum topic; owns the problem sub-issues.
|
||||
|
||||
- **Title:** `Topic NN — <Name>` (zero-padded number, em dash, e.g. `Topic 07 — Monotonic Stack`).
|
||||
- **Labels:** `topic`, `phase:N`.
|
||||
- **Milestone:** that phase's milestone (title, not number).
|
||||
- **Body:**
|
||||
|
||||
```
|
||||
**Scheduled:** <Weekday Mon DD, YYYY>
|
||||
**Phase:** <Roman> — <Phase name> (Week N)
|
||||
**Builds on:** Topic <n>
|
||||
|
||||
### Trigger
|
||||
TODO
|
||||
|
||||
### Invariant
|
||||
TODO
|
||||
|
||||
### Trap
|
||||
TODO
|
||||
|
||||
### Close-out ritual
|
||||
Before every submit, out loud:
|
||||
1. State time and space complexity.
|
||||
2. Trace one edge case.
|
||||
|
||||
### Day rules
|
||||
- 90-minute coding cap. Stop at the cap, even mid-problem.
|
||||
- Core problems first. Optional only if the core is done.
|
||||
- Finished early? Do this topic's optional set. Do not start tomorrow.
|
||||
```
|
||||
|
||||
`Scheduled` should come from the calendar of record — `apps/api/data/schedule.json`
|
||||
(day → topic issue) — not guessed.
|
||||
|
||||
## Reference tables
|
||||
|
||||
Set semantics (from the label descriptions):
|
||||
|
||||
| set | meaning | milestone |
|
||||
|---|---|---|
|
||||
| `core` | must solve on the topic day | topic's phase milestone |
|
||||
| `optional` | solve only if the clock allows | topic's phase milestone |
|
||||
| `deferred` | a Hard, parked until week 8 | `Review — Transfer & Mocks` |
|
||||
|
||||
Milestones (`--milestone` takes the **title**):
|
||||
|
||||
| # | title |
|
||||
|---|---|
|
||||
| 1 | Phase I — Linear Structures |
|
||||
| 2 | Phase II — Nodal & Grid |
|
||||
| 3 | Phase III — Hierarchical |
|
||||
| 4 | Phase IV — Relational |
|
||||
| 5 | Phase V — Decision Space |
|
||||
| 6 | Review — Transfer & Mocks |
|
||||
|
||||
Find a topic issue and confirm its phase before creating problems under it:
|
||||
|
||||
```sh
|
||||
gh issue list --repo prdlk/leetcode --label topic --state all --limit 30 \
|
||||
--json number,title,labels,milestone
|
||||
```
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **`-F` vs `-f`:** `sub_issue_id` must be an integer; `-f` sends a string and the API
|
||||
rejects it with `is not of type integer`.
|
||||
- **id, not number:** the sub-issue payload wants the child's `.id` (a large opaque
|
||||
integer), never its display `#number`.
|
||||
- **`--milestone` wants the title string**, not the numeric id (`'1' not found` otherwise).
|
||||
- **Reconcile, don't react:** don't edit D1 or the Project by hand — a correct issue is
|
||||
reconciled into SRS state on the nightly cron. Solutions landing in `work/` are what
|
||||
close problem issues (via `close-solved.yml`), which then roll up to close topics.
|
||||
- **Difficulty is LeetCode's**, `set` is our scheduling choice — they're independent. A
|
||||
Hard can be `core` if we deliberately schedule it (vs the usual `deferred`).
|
||||
Reference in New Issue
Block a user