Skip to content

Commit c6b8df3

Browse files
committed
release: v0.6.0
Adopting-this-into-your-project README guide (six-step onboarding path), plus the carried-forward v0.6-prep fix from the private staging repo: agent-permission-guard.py FORBIDDEN_PATTERNS regex hardened to be case-insensitive and whitespace-tolerant, with a pinning regression test. See CHANGELOG.md [0.6.0] for the full entry.
1 parent be3084b commit c6b8df3

5 files changed

Lines changed: 83 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55

66
## [Unreleased]
77

8+
## [0.6.0] - 2026-07-20
9+
10+
### Added
11+
12+
- `README.md` — "Adopting this into your project" section: a six-step path
13+
(operating model → `AGENTS.md`/`agents/` → scripts against your own repo →
14+
templates → worked examples → `agent-skills-integration.md`) consolidating
15+
guidance that was previously scattered across the README and `docs/`
16+
817
## [0.5.0] - 2026-07-16
918

1019
### Added
@@ -223,7 +232,8 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
223232
- `CONTRIBUTING.md`, `SECURITY.md`, issue/PR templates, `release-check` CI workflow
224233
- Roadmap and changelog for intentional release cadence
225234

226-
[Unreleased]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.5.0...HEAD
235+
[Unreleased]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.6.0...HEAD
236+
[0.6.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.5.0...v0.6.0
227237
[0.5.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.4.0...v0.5.0
228238
[0.4.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.3.0...v0.4.0
229239
[0.3.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.2.0...v0.3.0

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,34 @@ python3 scripts/llms-txt-generator.py
4242
python3 scripts/agent-permission-guard.py --settings /path/to/your/settings.json
4343
```
4444

45+
## Adopting this into your project
46+
47+
A step-by-step path for pulling these standards into your own repo, not just this one:
48+
49+
1. **Read the model**[`docs/ai-engineering-operating-model.md`](docs/ai-engineering-operating-model.md)
50+
explains the four layers (requirements, roles, artifacts, checks) and the
51+
failure modes they guard against.
52+
2. **Pull in agent conventions** — copy or reference [`AGENTS.md`](AGENTS.md) and
53+
the role specs in [`agents/`](agents/) into your own repo so any AI coding
54+
tool reads the same rules.
55+
3. **Run the checks against your repo** — point the Quick start scripts above at
56+
your own monorepo (`--root /path/to/your/repo`) instead of this one.
57+
4. **Adopt templates as needed** — the ADR, impact assessment, maturity
58+
checklist, LLM eval, and completion checklist templates in
59+
[`templates/`](templates/) are meant to be copied, not just read.
60+
5. **Study the worked traces**[`examples/worked-example/`](examples/worked-example/)
61+
and [`examples/agent-permission-guard/`](examples/agent-permission-guard/) show
62+
a requirement moving end-to-end: TR-ID → ADR → maturity row → script → CI gate.
63+
6. **Reconcile with tools you already use**[`docs/agent-skills-integration.md`](docs/agent-skills-integration.md)
64+
covers how this layers under AGENTS.md, agent-skills, and Cursor rules rather
65+
than replacing them.
66+
67+
None of this requires forking the repo — steps 2–4 are copy-in, and every
68+
script in step 3 takes a root-path argument (`--root`, `--path`, `--out`,
69+
`--settings`, or a positional path, depending on the script — see each
70+
command's `--help`) precisely so it can target your own repo instead of this
71+
one.
72+
4573
## Enforced workflow
4674

4775
See [`examples/worked-example/`](examples/worked-example/) for a synthetic trace:

ROADMAP.md

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,18 @@ See `CHANGELOG.md` for shipped versions.
8484
(v0.4 item 1) to any agent framework that reads the emerging llms.txt
8585
convention (https://llmstxt.org), not just Cursor
8686

87-
## v0.6 — Agentic security & operations patterns
87+
## v0.6 — Adoption guide
88+
89+
- [x] `README.md` "Adopting this into your project" section: a six-step path
90+
(operating-model doc, `AGENTS.md`/`agents/`, running the Quick-start
91+
scripts against the reader's own repo, `templates/`, the two worked
92+
examples, `docs/agent-skills-integration.md`) consolidating onboarding
93+
guidance that was previously scattered across the README and `docs/`
94+
95+
## v0.7 — Agentic security & operations patterns (current)
8896

8997
From the 2026-07-13 Zero-Trust-for-AI-Agents review (private ADRs: private-repo
90-
ADR-030/031/032, private-repo ADR-018, cloud deployment proposal rev 7). Two
98+
ADR-030/031/032, private-repo ADR-018, and a private-repo deployment proposal). Two
9199
maturity classes — this repo exports packaged practice, not aspirations.
92100

93101
**Export-ready (shipped + tested in the private monorepo, 2026-07-13):**
@@ -116,15 +124,15 @@ evidence TR-SEC-010 had — commits, tests, an operating track record):**
116124

117125
- [ ] **Disposition contract** — triage agents emit a structured disposition
118126
(query / think / report) as a loop-contract output field, extending
119-
TR-AGT-003 (deployment proposal rev 7)
127+
TR-AGT-003 (private-repo deployment proposal)
120128
- [ ] **Agreement-rate-gated authority promotion** — the measurable form of
121129
the advisory-first trust ramp: agent verdicts run advisory while
122130
human-agreement rate is measured; promotion to blocking/trusted cites
123-
the rate, rule by rule, never the whole queue at once (rev 7)
131+
the rate, rule by rule, never the whole queue at once (private-repo deployment proposal)
124132
- [ ] **Agent-ops metric floor** — dwell time (anomaly → human awareness),
125133
coverage (fraction of agent outputs a human reviewed), and
126134
explainability-by-trigger-ID (every agent output cites the ID of its
127-
triggering event, a mandatory loop-contract field) (rev 7)
135+
triggering event, a mandatory loop-contract field) (private-repo deployment proposal)
128136
- [ ] **Compartmentalization worked example** — the most-exposed agent gets
129137
the fewest permissions (write-only into a quarantine zone), the
130138
most-privileged agent gets no public egress, and promotion out of
@@ -143,7 +151,7 @@ evidence TR-SEC-010 had — commits, tests, an operating track record):**
143151
- [ ] **Layering rule** for agent/platform rollouts (operating-model doc):
144152
foundational ops/observability ships first; every subsequent phase is
145153
sized to be immediately usable — no functionality that idles behind
146-
unmet dependencies (rev 7)
154+
unmet dependencies (private-repo deployment proposal)
147155

148156
## Non-goals
149157

scripts/agent-permission-guard.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,20 @@
5656
"pip install", "npm install", "bash -c", "python -c", "python3 -c",
5757
"git push", "curl", "cat >", "rm -rf", "sudo",
5858
)
59+
60+
61+
def _verb_pattern(verb: str) -> str:
62+
# Tolerate case and irregular whitespace (tabs, doubled spaces) between
63+
# tokens -- a grant string shouldn't dodge FORBIDDEN by formatting alone.
64+
return r"\s+".join(re.escape(token) for token in verb.split())
65+
66+
5967
FORBIDDEN_PATTERNS: list[tuple[str, re.Pattern[str]]] = [
6068
("wildcard_dangerous_verb", re.compile(
61-
r"(?:" + "|".join(re.escape(v) for v in _DANGEROUS_VERBS) + r").*\*"
69+
r"(?:" + "|".join(_verb_pattern(v) for v in _DANGEROUS_VERBS) + r").*\*",
70+
re.IGNORECASE,
6271
)),
63-
("unrestricted_home_read", re.compile(r"Read\(//?\*\*\)")),
72+
("unrestricted_home_read", re.compile(r"Read\(//?\*\*\)", re.IGNORECASE)),
6473
]
6574

6675

tests/test_agent_permission_guard.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,25 @@ def test_forbidden_wildcard_grant_fails_even_if_added_to_baseline(tmp_path: Path
7171
assert "'Bash(curl:*)'" in result.stdout
7272

7373

74+
def test_forbidden_match_is_case_and_whitespace_insensitive(tmp_path: Path) -> None:
75+
settings = tmp_path / BASELINE_KEY
76+
write_settings(settings, [
77+
"Bash(git status:*)", "Bash(pytest:*)",
78+
"Bash(PIP INSTALL:*)", "Bash(pip install:*)",
79+
])
80+
result = subprocess.run(
81+
[sys.executable, str(GUARD), "--settings", BASELINE_KEY],
82+
capture_output=True,
83+
text=True,
84+
cwd=tmp_path,
85+
)
86+
assert result.returncode == 1
87+
forbidden_lines = [l for l in result.stdout.splitlines() if l.startswith("FORBIDDEN")]
88+
assert len(forbidden_lines) == 2
89+
assert "'Bash(PIP INSTALL:*)'" in result.stdout
90+
assert "'Bash(pip install:*)'" in result.stdout
91+
92+
7493
def test_unreviewed_grant_not_matching_baseline_key_fails(tmp_path: Path) -> None:
7594
other_path = "some/other/settings.json"
7695
settings = tmp_path / other_path

0 commit comments

Comments
 (0)