Skip to content

Commit 4d339e8

Browse files
committed
docs: record the language pass and bump to v1.50.0
Convert the SKILL.md prose to ASD-STE100 and carry the same conversion into the AGENTS.md, GEMINI.md, and .cursor cascade, on each line that holds guidance of its own. No pointer, path, or file name moves in any of the three, and the router table, the ownership table, and every reference row are untouched. The frontmatter description is byte-identical at 1013 characters, measured the way the validation workflow measures it. SKILL.md is 33860 of the 40960 bytes the docs-integrity workflow allows. Every heading is unchanged, so all 297 anchored links across the repository still resolve. The changelog row releases the whole range since v1.49.0 rather than this session alone: the boundary scrub, then language pass waves 1, 2, and 3. The version is applied in SKILL.md frontmatter and in the four issue-template placeholders that track it.
1 parent 9b998bf commit 4d339e8

9 files changed

Lines changed: 197 additions & 193 deletions

File tree

.cursor/rules/secure-code-auditor.mdc

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,38 @@ description: Backend security review and secure-by-default coding, Django/DRF-fi
33
alwaysApply: false
44
---
55

6-
When doing backend security review or writing backend code in this repo, use the
6+
When you review backend security or write backend code in this repo, use the
77
skill defined in `SKILL.md` at the repo root as the source of truth. Read
88
`SKILL.md` first for the router and mode logic, then open the relevant
99
`references/*.md` file(s). At review-time read `01-audit-workflow.md` before
1010
any topic file: it owns the sweep — the phase order and what each phase hands
11-
the next, the entry-point inventory
12-
that has to be enumerated from declarations rather than from a generated
13-
schema, the principals and boundaries, hypothesis ordering, the budget rule
14-
that enumerates a tree too large to read closely in full and rations only the
15-
close reading, the six-item gate
16-
a hypothesis discharges before it is written as a finding together with the
17-
benign Django and DRF patterns it rules out, the coverage
18-
ledger that keeps examined-and-clean apart from not-examined and is read back
19-
at each phase boundary rather than recalled, and the WSTG
20-
mapping at section granularity naming which testing-guide sections the sweep
21-
covers and which are declared non-goals — and the topic
22-
files answer the questions that sweep raises. The router is grouped — OWASP
23-
spine, cross-cutting
24-
surfaces, package decisions — and the "Ownership and boundaries" section below
25-
it names the single owning file whenever two rows could both match, as a table
26-
of topic, owner, and deciding distinction with three splits kept in prose, so
27-
read that before assuming a topic is duplicated.
28-
Review-time produces prioritized findings (severity,
29-
location, CWE + OWASP mapping, an optional ASVS 5.0 chapter or WSTG section
30-
where the project is held to that standard, the confirmed source-to-sink path
31-
and the protection
32-
that failed, fix); write-time applies the secure-default
33-
contract and closes with a short security-decisions note rather than a findings
34-
report. Each write-time rule sits beside the control it completes in the
35-
reference file, so the file you opened for the concern already carries the rule
36-
for writing it. The methodology, both output formats, the severity rubric
37-
including how a race and a surviving-personal-data failure are rated, the
38-
baseline severity table beneath it that makes an ordinary finding class
39-
reproducible between runs, the ASVS
40-
chapter mapping and its declared non-goals, and the rule for a secure default
41-
that conflicts with the request are in
42-
`references/00-methodology-and-severity.md`.
11+
the next, the entry-point inventory that has to be enumerated from declarations
12+
rather than from a generated schema, the principals and boundaries, hypothesis
13+
ordering, the budget rule that enumerates a tree too large to read closely in
14+
full and rations only the close reading, the six-item gate a hypothesis
15+
discharges before it is written as a finding together with the benign Django
16+
and DRF patterns it rules out, the coverage ledger that keeps
17+
examined-and-clean apart from not-examined and is read back at each phase
18+
boundary rather than recalled, and the WSTG mapping at section granularity
19+
naming which testing-guide sections the sweep covers and which are declared
20+
non-goals — and the topic files answer the questions that sweep raises. The
21+
router is grouped — OWASP spine, cross-cutting surfaces, package decisions —
22+
and the "Ownership and boundaries" section below it names the single owning
23+
file whenever two rows could both match, as a table of topic, owner, and
24+
deciding distinction with three splits kept in prose, so read that before
25+
assuming a topic is duplicated. Review-time produces prioritized findings
26+
(severity, location, CWE + OWASP mapping, an optional ASVS 5.0 chapter or WSTG
27+
section where the project is held to that standard, the confirmed
28+
source-to-sink path and the protection that failed, fix); write-time applies
29+
the secure-default contract and closes with a short security-decisions note
30+
rather than a findings report. Each write-time rule sits beside the control it
31+
completes in the reference file, so the file you opened for the concern already
32+
carries the rule for writing it. The methodology, both output formats, the
33+
severity rubric including how a race and a surviving-personal-data failure are
34+
rated, the baseline severity table beneath it that makes an ordinary finding
35+
class reproducible between runs, the ASVS chapter mapping and its declared
36+
non-goals, and the rule for a secure default that conflicts with the request
37+
are in `references/00-methodology-and-severity.md`.
4338

4439
Treat the privilege model and object-/field-level authorization, impersonation
4540
and break-glass access, OAuth2/OIDC and social login, API-key lifecycle/scoping,
@@ -121,9 +116,9 @@ view — it carries the inventory of every sink and the reference that owns each
121116
one — and the security-hardening library index for dated package
122117
dispositions.
123118

124-
Read-only triage scripts are in `scripts/`; all three parse with the `ast`
125-
module rather than grepping lines, so a hit is a structural match carrying the
126-
reference file that owns it, `entrypoint_inventory.py` enumerates the declared
119+
Read-only triage scripts are in `scripts/`. All three parse with the `ast`
120+
module rather than match lines, so a hit is a structural match that carries the
121+
reference file that owns it. `entrypoint_inventory.py` enumerates the declared
127122
entry points a sweep starts from, and `settings_scan.py` reads a settings
128123
package rather than a single module. Do not rely on this summary alone — read
129124
the referenced files.

.github/ISSUE_TEMPLATE/01-bug.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ body:
2222
attributes:
2323
label: Skill version
2424
description: The value of metadata.version in SKILL.md.
25-
placeholder: 1.49.0
25+
placeholder: 1.50.0
2626
validations:
2727
required: true
2828
- type: textarea

.github/ISSUE_TEMPLATE/02-correction.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ body:
2020
attributes:
2121
label: Skill version
2222
description: The value of metadata.version in SKILL.md.
23-
placeholder: 1.49.0
23+
placeholder: 1.50.0
2424
validations:
2525
required: true
2626
- type: textarea

.github/ISSUE_TEMPLATE/03-coverage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ body:
2929
attributes:
3030
label: Skill version
3131
description: The value of metadata.version in SKILL.md.
32-
placeholder: 1.49.0
32+
placeholder: 1.50.0
3333
validations:
3434
required: true
3535
- type: textarea

.github/ISSUE_TEMPLATE/04-library-index.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ body:
5757
attributes:
5858
label: Skill version
5959
description: The value of metadata.version in SKILL.md.
60-
placeholder: 1.49.0
60+
placeholder: 1.50.0
6161
validations:
6262
required: true
6363
- type: dropdown

AGENTS.md

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# AGENTS.md
22

33
This repository is a backend security skill. Its canonical instructions live in
4-
`SKILL.md`, which routes to the topic files under `references/`. Any agent
5-
working in this repo should load `SKILL.md` first and then read only the
4+
`SKILL.md`, which routes to the topic files under `references/`. An agent that
5+
works in this repo should load `SKILL.md` first, and then read only the
66
`references/*.md` file(s) relevant to the task.
77

88
Primary integration: **Claude** (Anthropic Agent Skills). The files below let
9-
other agents use the same content; they are pointers, not copies. If anything
10-
here disagrees with `SKILL.md`, `SKILL.md` wins. The current version is recorded
11-
in `SKILL.md` frontmatter (`metadata.version`).
9+
other agents use the same content. They are pointers, not copies. If anything
10+
here disagrees with `SKILL.md`, `SKILL.md` wins. The current version is
11+
recorded in `SKILL.md` frontmatter (`metadata.version`).
1212

1313
## What this skill does
1414
Reviews backend code for security issues and applies secure defaults while
@@ -177,63 +177,65 @@ read differently because one calls `getlist` and the other subscripts the
177177
- Review-time: audit existing code, produce prioritized findings (severity,
178178
location, CWE + OWASP mapping, an optional ASVS 5.0 chapter, WSTG section, or
179179
LLM/Agentic Top 10 entry token where the project is actually held to that
180-
standard, the
181-
shortest source-to-sink path the finding was confirmed on together with the
182-
protection that failed, concrete fix). Read-only by default. Load
183-
`references/01-audit-workflow.md` before any topic file; it owns the sweep
184-
the findings are produced by, and the topic files answer the questions that
185-
sweep generates.
186-
- Write-time: apply the standing secure-default contract while generating code,
187-
apply the secure default where it conflicts with the request and say so, and
188-
close with a short security-decisions note rather than a findings report. The
189-
rule for each generation moment sits beside the control it completes, in the
190-
reference the router already sends you to, so opening a file for the concern
191-
loads the rule for writing it.
192-
Mode selection, both output formats, the severity rubric including how a race
193-
and a surviving-personal-data failure are rated, the baseline severity table
194-
that makes an ordinary finding class reproducible between runs while the rubric
195-
keeps deciding the borderline one, the ASVS 5.0 chapter mapping with the
196-
chapters this skill treats as non-goals, the conflict rule, and the convention
197-
that every control is stated in a review form and a write-time form together
198-
are defined in `references/00-methodology-and-severity.md`.
180+
standard, the shortest source-to-sink path the finding was confirmed on
181+
together with the protection that failed, concrete fix). Read-only by
182+
default. Load `references/01-audit-workflow.md` before any topic file. It
183+
owns the sweep that produces the findings, and the topic files answer the
184+
questions that sweep generates.
185+
- Write-time: apply the standing secure-default contract while you generate
186+
code. Apply the secure default where it conflicts with the request, and say
187+
so. Close with a short security-decisions note rather than a findings report.
188+
The rule for each generation moment sits beside the control it completes, in
189+
the reference the router already sends you to. A file opened for the concern
190+
therefore loads the rule for writing it. Mode selection, both output formats,
191+
the severity rubric including how a race and a surviving-personal-data
192+
failure are rated, the baseline severity table that makes an ordinary finding
193+
class reproducible between runs while the rubric keeps deciding the
194+
borderline one, the ASVS 5.0 chapter mapping with the chapters this skill
195+
treats as non-goals, the conflict rule, and the convention that every control
196+
is stated in a review form and a write-time form together are defined in
197+
`references/00-methodology-and-severity.md`.
199198

200199
## How to use the content
201200
1. Read `SKILL.md` for the router, mode logic, and severity summary.
202201
2. At review-time, read `references/01-audit-workflow.md` next and run its
203-
phases; the entry-point inventory decides which topic files are needed and
202+
phases. The entry-point inventory decides which topic files are needed, and
204203
the coverage ledger records what each pass reached. That file also carries
205-
the WSTG mapping at section granularity, which says which testing-guide
206-
sections this sweep covers and which are declared non-goals rather than
207-
gaps.
204+
the WSTG mapping at section granularity. That mapping says which
205+
testing-guide sections this sweep covers, and which are declared non-goals
206+
rather than gaps.
208207
3. Open the `references/*.md` file(s) for the concern in front of you. The
209208
router is grouped — the OWASP Top 10:2025 spine, then cross-cutting
210209
surfaces, then package decisions — so pick the group, then the row.
211210
4. Where two rows could both match, the "Ownership and boundaries" section
212-
below the router names the single owning file for each contested topic, as a
213-
table of topic, owner, and the distinction that decides a case near the
214-
boundary; three splits keep a paragraph because a row would misstate the
211+
below the router names the single owning file for each contested topic. It
212+
is a table of topic, owner, and the distinction that decides a case near the
213+
boundary. Three splits keep a paragraph, because a row would misstate the
215214
axis they turn on. Every other file cross-references the owner rather than
216-
restating its rules, and each reference file repeats its own half of that
215+
restates its rules, and each reference file repeats its own half of that
217216
rule in its opening paragraph.
218217
5. Optional read-only triage (standard library only, no network; `--json` on any
219218
of the three is JSON Lines, one object per line, consumed a record at a time):
220219
- `python scripts/entrypoint_inventory.py path/to/project --settings path/to/settings --json`
221220
- `python scripts/settings_scan.py path/to/settings/ --json`
222221
- `python scripts/dangerous_patterns.py path/to/project`
223222
- `python scripts/dangerous_patterns.py path/to/project --json --min-severity MEDIUM`
224-
- `python scripts/dangerous_patterns.py --selftest`
225-
All three parse with the `ast` module rather than grepping lines, so a hit is a
226-
structural match rather than a text one, every row names the reference file that
227-
owns it, a `dangerous_patterns.py` hit additionally carries a stable rule
228-
identifier, and a file that fails to parse is reported as unparsed rather than
229-
skipped in silence. Every `--json` stream ends with one `kind: "summary"`
230-
record, so an empty stream never occurs. The inventory enumerates the declared entry points the sweep
231-
starts from — routes at their include-resolved prefix, routers and actions,
232-
Ninja, GraphQL, gRPC, Channels, Celery, commands, signals, admin, middleware —
233-
marking each HTTP-reachable row as declaring its authorization, inheriting it,
234-
or having none, and the settings scan reads a whole settings package rather than
235-
one module, naming which module each effective value came from. Treat script
236-
output as leads to verify, not confirmed findings.
223+
- `python scripts/dangerous_patterns.py --selftest` All three parse with the
224+
`ast` module rather than match lines, so a hit is a structural match
225+
rather than a text one. Every row names the reference file that owns it. A
226+
`dangerous_patterns.py` hit also carries a stable rule identifier. A file
227+
that fails to parse is reported as unparsed rather than skipped in
228+
silence. Every `--json` stream ends with one `kind: "summary"` record, so
229+
an empty stream never occurs.
230+
231+
The inventory enumerates the declared entry points the sweep starts from —
232+
routes at their include-resolved prefix, routers and actions, Ninja,
233+
GraphQL, gRPC, Channels, Celery, commands, signals, admin, middleware. It
234+
marks each HTTP-reachable row as one of three states: it declares its
235+
authorization, it inherits it, or it has none. The settings scan reads a
236+
whole settings package rather than one module, and names which module each
237+
effective value came from. Treat script output as leads to verify, not
238+
confirmed findings.
237239

238240
## Tool-specific entry points
239241
- Claude Code: `SKILL.md` (native Agent Skill).

GEMINI.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -189,17 +189,17 @@ rule that a Go-binary tool such as Trivy, Grype, Syft, or cosign is documented
189189
as a CI pattern rather than tiered in an index that gates pip-installable
190190
dependencies.
191191

192-
Primary integration is Claude; this file exists so Gemini CLI uses the same
193-
single source of truth. Modes (review-time / write-time), the severity rubric
194-
and how it rates a race and a surviving-personal-data failure, the baseline
195-
severity table under it that makes an ordinary finding class rate the same way
196-
between runs, the findings format including the evidence line every finding
197-
carries, the ASVS 5.0 chapter mapping and the chapters declared out of scope
198-
alongside the terms on which a WSTG section is admissible in the same optional
199-
position,
200-
the write-time secure-default contract with the security-decisions note it
201-
returns in place of a report, and the rule for a default that conflicts with
202-
the request are in `references/00-methodology-and-severity.md`. That file also
203-
indexes which reference carries the write-time rule for each generation moment;
204-
every rule itself lives beside the control it completes rather than in a list.
205-
The version is recorded in `SKILL.md` frontmatter (`metadata.version`).
192+
Primary integration is Claude. This file exists so that Gemini CLI uses the
193+
same single source of truth. Modes (review-time / write-time), the severity
194+
rubric and how it rates a race and a surviving-personal-data failure, the
195+
baseline severity table under it that makes an ordinary finding class rate the
196+
same way between runs, the findings format including the evidence line every
197+
finding carries, the ASVS 5.0 chapter mapping and the chapters declared out of
198+
scope alongside the terms on which a WSTG section is admissible in the same
199+
optional position, the write-time secure-default contract with the
200+
security-decisions note it returns in place of a report, and the rule for a
201+
default that conflicts with the request are in
202+
`references/00-methodology-and-severity.md`. That file also indexes which
203+
reference carries the write-time rule for each generation moment; every rule
204+
itself lives beside the control it completes rather than in a list. The version
205+
is recorded in `SKILL.md` frontmatter (`metadata.version`).

0 commit comments

Comments
 (0)