adr-writer
Use when a decision changes architecture, interfaces, the Prisma schema, dependencies, sources policy, or supersedes a prior decision. Contains the ADR template used in docs/adr/ and the register of standing decisions.
- License 许可
- MIT
- 最近更新
- 2026-11-10
- Stars
- ★ 32
- Forks
- 11
01 前言 Front Matter
- name
- adr-writer
- description
- Use when a decision changes architecture, interfaces, the Prisma schema, dependencies, sources policy, or supersedes a prior decision. Contains the ADR template used in docs/adr/ and the register of standing decisions.
03 SKILL.md 正文
ADR Writer
Architecture Decision Records live in docs/adr/NNNN-slug.md and are
indexed in docs/adr/README.md — add the index line in the same commit.
When an ADR is required
- New process boundary, HTTP framework, queue, or scheduler choice
- New job source family or a change to the "never scrape" policy (ADR 0005)
- A new seam that swaps implementations (like the AI provider, ADR 0007)
- New dependency with operational weight (a CLI in the image, a DB)
- Superseding any prior ADR
Not required: a new fetcher that follows an existing template, a settings toggle, UI changes, refactors that keep contracts.
Template (as short as the decision allows)
# NNNN — <decision, stated as a sentence>
**Status:** Accepted (YYYY-MM-DD) | Superseded by NNNN
## Context
What forces the decision; the facts that shaped it (numbers, measured
behaviour, external constraints).
## Decision
What we do, stated so a reviewer can check the code against it. A small
table or interface signature is welcome.
## Consequences
✅ what becomes easier ❌ what we accept
## When to revisit
The concrete trigger that would reopen this.
Supersede mechanics
The new ADR says Supersedes NNNN (or Amends / Extends NNNN) in its
status line; the old one's status line links back (Superseded by MMMM,
amended by MMMM (what changed)), and the register line in
docs/adr/README.md carries the same note. Both link.
Never rewrite the substance of an accepted ADR. A new decision gets a new
ADR. A fact that changed without a new decision (a renamed symbol, a count
that grew, a behaviour a later release reversed) gets a dated addendum at
the end: ## Addendum (YYYY-MM-DD): <what changed>, one short line per
statement, naming the version, file or ADR that changed it.
Standing register
Generated from docs/adr/README.md on 2026-09-24; the README is the source
of truth when the two disagree.
- 0001 Hono not Express
- 0002 Worker and web as separate processes
- 0003 No queue, just node-cron
- 0004 One active profile, not multi-tenant — superseded by 0028
- 0005 No LinkedIn / Indeed / Workday — amended by 0034, 0036
- 0006 Discovery via HN parser, not ATS-vendor lists
- 0007 One AI provider seam: Messages API or Claude Code CLI — extended by 0013, 0014, 0027, 0055
- 0008 Resume module lives in the web process, files in Postgres — amended by 0063
- 0009 Web tools through the AI seam, for job verification only
- 0010 Two scores: live keyword coverage in the browser, AI match on demand — amended by 0012, 0038
- 0011 PDF resume text comes from unpdf, not a hand-rolled parser
- 0012 The resume-match score is computed by application code, not by the model — amended by 0044, 0045
- 0013 AI engine is chosen at runtime from AppSettings, with a Gemini CLI backend (extends 0007) — amended by 0014; extended by 0027
- 0014 AI engines form a priority chain with automatic failover (extends 0013) — extended by 0027, 0060
- 0015 The profile is drafted from the resume scan, never written by AI
- 0016 Job liveness via a free three-rung ladder before AI verify
- 0017 Starter-pack entries pin a hand-verified board — extended by 0040
- 0018 Cross-listing is annotated, never merged
- 0019 Source health is a per-company streak;
emptyresets it but does not prove health — amended by 0035 - 0020 The fact gate blocks fabrication, not imprecision
- 0021 Cover letters generate from stored inputs only — extended by 0042
- 0022 Fences make untrusted text data, and an attempt evidence
- 0023 Trust is apply-link flags, not a score
- 0024 Funnel history is an append-only stage ledger — amended by 0025
- 0025 Work columns are user-defined; fixed entry and exits
- 0026 Database tables are snake_case, mapped with
@@map() - 0027 Per-engine AI keys live in the database,
.envas fallback (extends 0013 and 0014) - 0028 Several searches run in parallel, scored by one call per posting (supersedes 0004)
- 0029 A comparison is a quick check by default; suggestions are a second call — amended by 0042, 0043, 0044
- 0030 The strength review grades; the code scores
- 0031 A job's location is three columns next to the string, filled by hints and a parser
- 0032 A search hunts in countries and groups; the classifier's place may only narrow the parser's
- 0033 A search says where its candidate lives; the model decides whether a posting is open to them
- 0034 A vendor's own licence governs keyed access, and the vendor's terms are code
- 0035 Many installs, one set of boards: spread the tick, shuffle the walk, revalidate
- 0036 Watched companies are checked by reading what a site publishes for machines, never by rendering it — addendum 2026-09-28: a page drawn in the browser is pasted
- 0037 Suggestions carry replacement text; the fact gate decides what is applicable — extended by 0042; amended by 0044
- 0038 Save patches the user's .docx in place; text-only versions are the fallback (supersedes the text-only consequence of 0010) — extended by 0039, amended by 0059
- 0039 A resume that cannot be patched is re-typeset from JSON Resume, in the user's own typography (extends 0038) — extended by 0059
- 0040 The default source set is the aggregators; employer boards are starter packs (extends 0017)
- 0041 Alerts go through a channel seam; Telegram and Discord are its first two channels
- 0042 The verifier's company facts are context for the match, never evidence (extends 0021 and 0037)
- 0043 A posting refreshed from the company's own listing keeps its original and is re-judged
- 0044 The posting is read once, on its own, and the reading is kept — amended by 0045
- 0045 The resume text decides whether a keyword is present (amends 0012 and 0044)
- 0046 The resume's domains are read at scan time and compared with the posting's
- 0047 A screening scores evidence, not keywords, and a person decides — extended by 0050, which supersedes its score formula
- 0048 Applicants' resumes are redacted before any model reads them, and they expire
- 0049 Employer mode is a switchable mode, not a second product and not a card
- 0050 The rubric is a list of criteria the person chooses, answered one by one with a quote (extends 0047; supersedes its score formula)
- 0051 A shortlist is compared head to head, twice, and the comparison is never a score
- 0052 Calibration reports agreement with the person's decisions and never tunes the rubric by itself
- 0053 Uniqueness lives in the database, and a row's state is written with the row
- 0054
npm startruns ApplyPack with a built-in Postgres; Docker is the server option - 0055 Every AI attempt is a ledger row, and a bill, a plan and a local model are never added together (extends 0007)
- 0056 A company can be muted, and a company applied to can rest, before any AI reads its postings
- 0057 A model on this machine is an engine of its own, and it is held to its window (extends 0013/0014) — extended by 0060
- 0058 How strongly the text shows a term counts, a little (score v6) (amends 0012/0045)
- 0059 The Tailor page edits the resume as a document, and a save is always one (extends 0038/0039)
- 0060 An engine takes the tasks it is given, and the order decides among those that take one (extends 0014/0057)
- 0061 The interface speaks several languages; what a model writes stays English — addendum 2026-10-06: the worker and the browser modules follow later
- 0062 Rows the user brings are read from what they hand over, and nothing is fetched
- 0063 The worker prepares an application pack for a strong new match (amends 0008)
Check a proposal against these before touching process layout, sources, scheduling, profiles, how the AI is called, the resume score or employer mode.
04 同仓库更多 Skills
wizard
Generate an interactive bash wizard that walks a human through steps only they can perform. Use when provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, or running a one-off migration or cutover. Don't invoke this for steps the agent can perform itself.
ui-review
Senior UI/UX review of an ApplyPack dashboard page, screenshot, or primitive. Use when asked to critique, audit, or find improvements in the dashboard. Produces prioritized findings, never code.
testing-gate
Required verification per change type for ApplyPack (pure module → unit test, fetcher → smoke run, schema → hand-written migration, dashboard → rebuild + screenshot). Read before implementing any feature and before every commit.
stop-slop
Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells.
resolving-merge-conflicts
Use when you need to resolve an in-progress git merge/rebase conflict.
release-discipline
Tag and GitHub-release rules for this repository — when a merge gets a version tag, how releases stay in parity with tags, and the release-notes format. Read after every PR merge, before tagging, and at the start of a new stage (parity check).