grace — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited grace (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
GRACE means Graph-RAG Anchored Code Engineering: a contract-first AI engineering methodology built around semantic markup, .grace XML artifacts, knowledge-graph navigation, assertions, scopes, and log-driven verification.
This repository ships the GRACE skills plus the optional grace CLI. It is a packaging and distribution repository, not an end-user application.
Current packaged version: 4.2.1
skills/grace/*plugins/grace/skills/grace/*.claude-plugin/marketplace.jsonplugins/grace/.claude-plugin/plugin.jsonopenpackage.yml@osovv/grace-cliGRACE 4 uses .grace as the durable project model:
| Area | Purpose |
|---|---|
.grace/context/*.xml | Requirements, technology, principles, deployment, and UX constraints |
.grace/graph/index.xml + routed graph docs | Current graph projection source for GD-*, M-*, and DF-* anchors |
.grace/verification/index.xml + routed verification docs | Current verification projection source for deterministic V-M-* entries |
.grace/changes/active/C-* | Active GraceChangeSpec, optional design context, and GraceChangePlan bundles |
.grace/changes/archive/C-* | Applied, rejected, cancelled, or superseded change bundles |
| Source/test files with GRACE markup | File-local contracts, links, and semantic block anchors |
GRACE 4 does not dual-validate legacy GRACE 3 project docs as current state. Existing GRACE 3 projects use $grace-migrate; the CLI validates the generated .grace result but does not convert legacy docs itself.
Verification commands run from the project root by default. A V-M-* entry may declare one contained project-relative <Cwd>packages/example</Cwd> while keeping <TestFiles><File>...</File></TestFiles> paths project-root-relative. Absolute paths, .. escapes, and symlink escapes fail closed.
TypeScript/JavaScript semantic analysis is bundled and compiler-backed. Governed Python and Dart files require their respective runtimes on PATH; Python export analysis is exact when a static __all__ is present (including Unicode identifiers) and otherwise emits heuristic confidence. A missing runtime fails closed with actionable analysis.runtime-missing; an installed adapter that fails emits analysis.adapter-failed. Neither failure state is presented as exact MODULE_MAP parity.
Languages without a registered adapter — including Go, Rust, Java, shell, C/C++, C#, and PowerShell — are governed structurally: markup validity, contract completeness, and MODULE_MAP shape are enforced, while export parity is not analyzed. MODULE_MAP for these languages is taken on trust. Governance is opt-in per file; sources without GRACE markers are never flagged.
Markers are recognized behind the //, #, --, ; and block-comment * prefixes, so a language whose comments use none of those — XML-comment dialects such as .xaml or .csproj — cannot carry them.
Install skills first. The CLI is optional but recommended once skills are installed.
opkg install gh@osovv/grace-marketplace
opkg install gh@osovv/grace-marketplace -g
opkg install gh@osovv/grace-marketplace --platforms claude-code/plugin marketplace add osovv/grace-marketplace
/plugin install grace@grace-marketplacegit clone https://github.com/osovv/grace-marketplace
cp -r grace-marketplace/skills/grace/grace-* /path/to/your/agent/skills/Requires bun on PATH. GRACE skills invoke the installed stable grace binary directly; they do not default to bunx, npx, or a prerelease dist-tag.
# Install the current stable release from npm `latest`
bun add -g @osovv/grace-cli
grace --version
grace lint --path /path/to/grace4-projectFor a new GRACE 4 project:
$grace-init to create .grace..grace/context artifacts with your agent.$grace-spec for a change.$grace-plan after spec approval.grace lint --path /path/to/project --assertions current.grace lint --path /path/to/project --change C-ID --assertions baseline before execution; add --run-commands when the baseline declares MustPassCommand.grace status --path /path/to/project --json.$grace-execute and choose sequential or parallel-safe mode. Parallel-safe mode additionally requires grace lint --path /path/to/project --parallel-preflight.grace lint --path /path/to/project --change C-ID --assertions final; add --run-commands when the target declares MustPassCommand.Existing GRACE 3 projects should run $grace-migrate and review the migration report before writing .grace artifacts.
Migration cleanup is separately gated: successful current lint, fresh status proving GRACE 4 with no integrity errors, git/worktree inspection, exact cleanup paths, and explicit cleanup confirmation are mandatory. Dirty or non-git cleanup requires an additional acknowledgement naming that risk; any cleanup failure stops without automatic destructive retry.
| Skill | Purpose |
|---|---|
grace-init | Bootstrap the .grace skeleton, templates, and agent guidance |
grace-spec | Create an approved GRACE 4 change spec and optional design context |
grace-plan | Design assertions, scopes, tasks, and verification gates from an approved spec |
grace-execute | Execute the approved plan in sequential or parallel-safe mode |
grace-refactor | Rename, move, split, merge, and extract modules without artifact drift |
grace-setup-subagents | Scaffold GRACE worker and reviewer presets |
grace-fix | Debug issues from graph, contracts, tests, traces, and semantic blocks |
grace-refresh | Detect drift and propose reconciliation changes |
grace-status | Report .grace health and suggest the next safe action |
grace-ask | Answer architecture and implementation questions from .grace artifacts |
grace-cli | Use the optional grace binary as a fast lint and artifact-query layer |
grace-explainer | Explain the GRACE methodology itself |
grace-verification | Build and maintain .grace/verification entries and evidence |
grace-reviewer | Review semantic integrity, projections, scopes, and verification quality |
grace-migrate | Agent-applied GRACE 3 to GRACE 4 migration with CLI validation |
| Command | What It Does | |
|---|---|---|
grace lint --path <root> --assertions current | Run the pre-implementation full-project check, including baselines of active approved changes; do not use it as post-edit target/final evidence | |
| `grace lint --path <root> --change C-ID --assertions target \ | final --run-commands` | Execute declared MustPassCommand gates with compact progress on stderr, per-command timings, a default 600s per-command timeout (--command-timeout), and full run logs under ~/.cache/grace/run-commands/ (--keepRuns bounds how many non-passing runs are kept) |
grace lint --path <root> --change C-ID --assertions baseline [--run-commands] | Validate the immutable selected baseline before implementation; command assertions run only when explicitly enabled | |
grace lint --path <root> --change C-ID --assertions target --run-commands | Validate selected target assertions and explicitly opt into MustPassCommand execution | |
grace lint --path <root> --change C-ID --assertions final [--run-commands] | Run the final full-project gate, evaluate the selected target, and keep unrelated approved baselines active without re-evaluating the selected baseline | |
grace lint --path <root> --parallel-preflight | Run the explicit approved-plan scope coexistence gate required for parallel-safe execution | |
grace status --path <root> | Report durable health, stale plans, scope conflicts, and explained/unexplained observed git drift | |
grace module find <query> --path <root> | Search graph projection modules by id, path, text, dependency, or verification id | |
grace module show <id-or-path> --path <root> | Show graph projection context and linked file-local markup | |
grace module show <id> --with verification --path <root> | Include matching deterministic V-M-* verification entries | |
grace verification find <query> --path <root> | Search verification projection entries | |
grace verification show <id-or-module> --path <root> | Show one verification entry and module context | |
grace file show <path> --path <root> | Show file-local MODULE_CONTRACT, MODULE_MAP, and CHANGE_SUMMARY |
MustPassCommand entries are leaf project evidence such as tests, typecheck, build, format, or package checks. Do not nest grace lint, grace status, or another GRACE lifecycle command inside plan assertions; selected target/final lint is the external orchestration gate.
Each <Command> may declare an optional budgetSeconds attribute — <Command budgetSeconds="1800">bun run gate:e2e</Command> — which becomes that command's timeout under --run-commands in preference to the global --command-timeout. The grammar matches --command-timeout: a non-negative whole number of seconds, where 0 disables the timeout for that command and omitting the attribute keeps the global default. Lint also reports assertion.command-subsumed as a warning when two commands in the same assertion section share a command head and one's path arguments are a component-wise prefix of the other's, so a gate that re-runs bun test src/grace4 under bun test src is visible rather than merely slow.
Output modes:
grace lint: text, jsongrace status: text, jsongrace module find: table, jsongrace module show: text, jsongrace verification find: table, jsongrace verification show: text, jsongrace file show: text, jsonLint, status, and projection-backed navigation fail closed: invalid options, invalid grammar, malformed active assertions/scopes, duplicate ownership, missing routed files, or ambiguous targets produce structured results or a nonzero error envelope. JSON command failures emit one stable { "schemaVersion": "1.0.0", "ok": false, "error": { ... } } envelope on stdout; text failures emit one concise actionable line without a stack trace.
An optional .grace-lint.json file at the project root (next to .grace) controls how grace lint and the query commands collect code files, and how long command-run evidence is kept:
{
"ignoredDirs": ["generated", "fixtures-output"],
"runLogRetention": 25
}ignoredDirs lists directory names to prune from file collection, on top of the built-in set below. Names match at any depth; globs and paths are not supported.runLogRetention is how many non-passing --run-commands run directories survive pruning, default 10. The newest passing run of every change is protected and never pruned, so evidence an archived change cites stays on disk. --keepRuns N overrides the key for a single run; 0 keeps no non-passing runs at all, which removes the current run as soon as it fails or runs without a --change to bind it to.ignoredDirs, or a runLogRetention that is not a non-negative integer is a config.* lint error, and query commands refuse to run until the file is fixed.walk.unreadable-directory warning instead of aborting the run; add its name to ignoredDirs to prune it silently. Explain any of these codes with grace lint --explain <code>.Built-in ignored directories:
.git, .svn, .hgnode_modules, dist, build, coverage, .next, .nuxt, .output, out, .turbo, .vite, .parcel-cache, .svelte-kit, .astro, storybook-static, .cache, .yarn, .nyc_output, bower_components, jspm_packages, .stryker-tmp, .serverless, .docusaurus__pycache__, venv, .venv, .tox, .nox, .pytest_cache, .mypy_cache, .ruff_cache, .pyre, .pytype, htmlcov, .eggs, .hypothesis, .ipynb_checkpoints, __pypackages__, .pixi, covertest-results, test-reports, playwright-report, blob-report, allure-results, allure-report, test-output, newman, cucumber-report, cucumber-reportstarget, .gradle, .ideavendor.build, Pods, Carthage, DerivedDataobj.dart_tooltmp, .bundle.vscodebin is deliberately not built in: .NET puts compiled output there, but Node, Rails and others keep real source in it, and ignoredDirs can only add to this set. A .NET project that wants it pruned adds "ignoredDirs": ["bin"].
Successful per-file language analyses are cached across runs, so unchanged governed files are not re-analyzed. Entries are keyed by file content and extension plus a schema version: any file edit or analyzer logic change invalidates the entry automatically, and failed analyses are never cached, so fixing a missing runtime takes effect immediately.
$XDG_CACHE_HOME/grace-cli/analysis, falling back to ~/.cache/grace-cli/analysis. Override the base directory with GRACE_CACHE_DIR.GRACE_NO_CACHE=1..grace and produces no drift noise.Prefer this order when narrowing scope:
.grace/graph/index.xml for graph document routing.M-* and DF-* anchors..grace/verification/index.xml for verification routing.V-M-* entries..grace/changes/active/C-* for in-flight specs and plans.LINKS:, START_MODULE_CONTRACT, START_CONTRACT:, and START_BLOCK_.Common anchors:
GD-* graph document wrappersM-* module IDsDF-* data-flow IDsVD-* verification document wrappersV-M-* verification IDsC-* change bundlesT-* implementation plan tasks| Path | Purpose |
|---|---|
skills/grace/* | Canonical skill sources |
plugins/grace/skills/grace/* | Packaged mirror used for marketplace distribution |
.claude-plugin/marketplace.json | Marketplace entry and published skill set |
plugins/grace/.claude-plugin/plugin.json | Packaged plugin manifest |
src/grace.ts | CLI entrypoint |
src/grace4/* | GRACE 4 project detection, XML parsing, grammar, projections, assertions, and scopes |
src/lint/* | grace lint implementation |
src/query/* | Projection-backed query layer for CLI navigation |
scripts/validate-marketplace.ts | Packaging, version, path, and mirror validation |
RELEASING.md | Manual release checklist and validation commands |
bun test
bun run ./scripts/validate-marketplace.ts
bun run validate:packed
bun run validate:releaseFor CLI changes, keep tests in src/grace-lint.test.ts, src/grace-status.test.ts, and src/grace-query.test.ts aligned with the GRACE 4 .grace fixture model.
Stable releases use a protected-main two-stage flow. release:bump runs on a clean release branch that contains current origin/main, updates and validates the version surfaces, commits them, pushes the branch, and finds or creates the release PR without creating a tag. After its required checks pass and the PR is merged, release:finalize X.Y.Z runs from clean synchronized main, revalidates the exact stable state, creates the annotated tag, and pushes only that tag. CI independently requires the stable tag commit to equal fetched origin/main and gates npm latest publication through the reviewer-protected stable-release environment, whose explicit deployment policies allow only branch main and tags v*. Protected main requires Linux, Windows, and real-Dart checks without requiring a separate PR approval, while an active ruleset keeps v* tags immutable. bun run release:checklist verifies those controls and, after publication from the exact release tag commit, verifies HEAD == tag, npm/GitHub channel metadata, and that the local npm pack shasum matches the immutable published tarball.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.