{"capabilities":[{"capability_id":"repository","command_ids":["baseline","check","inspect","report","rules"],"input_kinds":["git-tree","repository-manifest"],"status":"stable","summary":"Inspect exact Git trees and evaluate versioned repository policy.","title":"Repository architecture"},{"capability_id":"pull-request-commits","command_ids":["pull-request.commits"],"input_kinds":["git-history","pull-request-metadata"],"status":"stable","summary":"Require concise history or one complete explicitly numbered series.","title":"Pull-request commit policy"},{"capability_id":"pull-request-size","command_ids":["pull-request.size"],"input_kinds":["git-diff","git-attributes"],"status":"stable","summary":"Count authored code and test churn; exclude generated and binary output.","title":"Pull-request review size"},{"capability_id":"pull-request-review-policy","command_ids":["pull-request.review-policy","pull-request.text"],"input_kinds":["git-diff","repository-manifest","provider-evidence"],"status":"preview","summary":"Keep PR prose short and code examples well-formed, with isolated SQL migrations and current human review for migrations and declared domain roots.","title":"Pull-request review policy"},{"capability_id":"rest","command_ids":["rest.discover","rest.doctor"],"input_kinds":["API operation map","Actix Web","Axum","Django REST Framework with drf-spectacular","Echo","Express","FastAPI","Gin","Hono","Huma","NestJS","OpenAPI","Rocket","Spring with springdoc-openapi","chi","flask-smorest","net/http","utoipa"],"status":"preview","summary":"Discover API frameworks without executing application code.","title":"REST and OpenAPI"}],"catalog_version":"8.0.0","categories":[{"category_id":"repository","label":"Repository changes","order":20,"topics":[{"label":"Artifacts","order":10,"topic_id":"artifacts"},{"label":"Documentation","order":20,"topic_id":"documentation"}]}],"commands":[{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"baseline","options":[{"choices":[],"default":".repo-standards/repository.toml","help":"","names":["--manifest"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Deterministic YYYY-MM-DD","names":["--as-of"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":false,"help":"Read the staged Git index instead of the committed HEAD tree.","names":["--staged"],"repeatable":false,"required":false,"value_type":"bool"},{"choices":[],"default":null,"help":"","names":["--enable-rule"],"repeatable":false,"required":false,"value_type":"list"},{"choices":[],"default":false,"help":"Include active warnings in the reviewed baseline.","names":["--ratchet-warnings"],"repeatable":false,"required":false,"value_type":"bool"}],"path":["baseline"],"summary":"Print baseline JSON from exact Git evidence without writing files."},{"arguments":[],"command_id":"capabilities","options":[],"path":["capabilities"],"summary":"Describe the stable machine capabilities without inspecting a repository."},{"arguments":[],"command_id":"catalog","options":[],"path":["catalog"],"summary":"Export the deterministic public product, rule, command, and schema catalog."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"check","options":[{"choices":[],"default":".repo-standards/repository.toml","help":"","names":["--manifest"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":".repo-standards/baseline.json","help":"","names":["--baseline"],"repeatable":false,"required":false,"value_type":"str"},{"choices":["report","ratchet","strict"],"default":"strict","help":"","names":["--mode"],"repeatable":false,"required":false,"value_type":"Mode"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"},{"choices":[],"default":null,"help":"Deterministic YYYY-MM-DD","names":["--as-of"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Base for Makefiles and new SQL migrations; staged uses HEAD.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":false,"help":"Analyze the exact staged Git index; ignore unstaged and untracked bytes.","names":["--staged"],"repeatable":false,"required":false,"value_type":"bool"},{"choices":[],"default":null,"help":"Activate a current rule ID for this run.","names":["--enable-rule"],"repeatable":false,"required":false,"value_type":"list"},{"choices":[],"default":false,"help":"Include active warnings in --mode ratchet comparisons.","names":["--ratchet-warnings"],"repeatable":false,"required":false,"value_type":"bool"}],"path":["check"],"summary":"Analyze one repository manifest.\n\nWithout a nonempty rule selection, reject undeclared JavaScript and bespoke\nverifier scripts. Use .mts for ESM tooling and .cts for CommonJS. The\nuntyped-javascript rule reviews .js, .jsx, .mjs and .cjs case-insensitively;\ntyped variants and source maps remain outside this rule. A nonempty\nenabled_rules list or --enable-rule selects the requested rules instead.\nMigrations must update loaders, callers, type checks and runtime tests.\nTyped tool presets such as eslint.strict.ts need no JavaScript artifact\ndeclaration. Prefer a tool's supported TypeScript preset over declaring\nits generated JavaScript output solely to satisfy this policy.\n\nRequired JavaScript uses exact \\[\\[javascript.artifacts]] records in the\nmanifest: path, kind and a nonblank reason. Allowed kinds are tool-config,\ngenerated, vendor, fixture and runtime. Only generated requires and accepts\nsource: a distinct tracked non-JavaScript file, including Python or schemas.\nPaths are literal Git paths; wildcard characters never expand patterns.\nPaths must be canonical repository-relative regular files in the selected\nGit tree or index. Globs, duplicates, stale paths and over 1,000 records fail.\nNames and folders grant no exemptions. Declarations record intent; they\nprove neither generation nor runtime necessity. No application code runs.\nIndependent verifier and operational-test rules still apply.\n\nWarnings remain advisory in strict/report mode. To block new warnings,\nfirst resolve violations and review required artifact declarations. Print\nnative JSON with `repo-standards baseline . --ratchet-warnings`, review it,\nthen commit it at .repo-standards/baseline.json. Run this command with\n--mode ratchet --ratchet-warnings; use --staged on both for exact index input.\nBaseline creation explicitly accepts eligible current findings. Its optional\ninclude_warnings setting defaults to false for existing schema-2 baselines.\nComparison settings must match; stale scope, policy and entries fail closed.\nWarning opt-in covers all enabled rules without changing their severity.\nUncappable rules remain uncappable. Use `repo-standards schema baseline`\nfor the wire format. Python callers create baselines with\nbaseline_from_report(report, include_warnings=True), serialize with\nbaseline_dict, and analyze with RepositoryAnalysisRequest using both\nselection=RatchetAnalysis(baseline_path, include_warnings=True)."},{"arguments":[{"choices":[],"default":null,"help":"Git commit-message file to validate.","names":["message_file"],"repeatable":false,"required":true,"value_type":"Path"}],"command_id":"commit-message","options":[{"choices":[],"default":false,"help":"Apply only verified mechanical header normalization.","names":["--fix-safe/--no-fix-safe"],"repeatable":false,"required":false,"value_type":"bool"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"},{"choices":[],"default":false,"help":"Advise on descriptive subject length without blocking.","names":["--advise"],"repeatable":false,"required":false,"value_type":"bool"}],"path":["commit-message"],"summary":"Enforce `[(i/n) ][TICKET] type(scope)!: description` and safely normalize spacing/case."},{"arguments":[{"choices":[],"default":null,"help":"","names":["rule_id"],"repeatable":false,"required":true,"value_type":"repo_standards.core.models.RuleId"}],"command_id":"explain","options":[],"path":["explain"],"summary":"Explain one immutable rule."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"inspect","options":[{"choices":[],"default":"all","help":"Filter: all, project, workflow, cloudbuild, dockerfile, terraform, openapi.","names":["--kind"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Filter by repository path prefix.","names":["--path-prefix"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"100","help":"Page size from 1 through 500.","names":["--limit"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Opaque cursor returned by the prior page.","names":["--cursor"],"repeatable":false,"required":false,"value_type":"str"}],"path":["inspect"],"summary":"Inventory tracked inert repository metadata without requiring a manifest."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"pull-request.commits","options":[{"choices":[],"default":"","help":"Exact pull-request base revision.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"HEAD","help":"Exact pull-request head revision.","names":["--head"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Pull-request base ref name.","names":["--base-ref"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Pull-request head ref name.","names":["--head-ref"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Exact PR head owner/name identity used by transition exemptions.","names":["--repository-id"],"repeatable":false,"required":false,"value_type":"repo_standards.core.models.RepositoryId"},{"choices":[],"default":5,"help":"Maximum unnumbered non-merge commits.","names":["--max-commits"],"repeatable":false,"required":false,"value_type":"int"},{"choices":[],"default":null,"help":"Trusted JSON transition exemption; repeat for multiple transitions.","names":["--transition-exemption"],"repeatable":false,"required":false,"value_type":"list"},{"choices":[],"default":null,"help":"GitHub Actions event payload containing exact pull-request evidence.","names":["--github-event"],"repeatable":false,"required":false,"value_type":"Path"},{"choices":[],"default":false,"help":"Report policy findings without a nonzero policy exit.","names":["--advisory"],"repeatable":false,"required":false,"value_type":"bool"},{"choices":[],"default":false,"help":"Suppress output only when analysis completes successfully.","names":["--quiet"],"repeatable":false,"required":false,"value_type":"bool"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"}],"path":["pull-request","commits"],"summary":"Require concise PR history or one complete explicitly numbered series."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"pull-request.documentation","options":[{"choices":[],"default":"","help":"Trusted base revision used for policy.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"HEAD","help":"Head revision to compare with the base.","names":["--head"],"repeatable":false,"required":false,"value_type":"str"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"}],"path":["pull-request","documentation"],"summary":"Reject new README/docs content and enforce the trusted Markdown page budget."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"pull-request.review-policy","options":[{"choices":[],"default":"","help":"Exact trusted base commit SHA.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"","help":"Exact evaluated pull-request head commit SHA.","names":["--head"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Strict, complete provider evidence JSON.","names":["--evidence"],"repeatable":false,"required":false,"value_type":"Path"},{"choices":[],"default":null,"help":"Explicit trusted manifest; defaults to the manifest in --base.","names":["--manifest"],"repeatable":false,"required":false,"value_type":"Path"},{"choices":[],"default":"pr-size-excluded","help":"Git attribute that marks repository-specific excluded artifacts.","names":["--generated-attribute"],"repeatable":false,"required":false,"value_type":"str"}],"path":["pull-request","review-policy"],"summary":"Require short prose, well-formed examples, isolated migrations and human consensus.\n\nDefaults: 2,000 total characters and 500 prose characters. Use closed,\nlanguage-tagged code fences when examples help explain the change.\n\nThe total includes Markdown and comments.\nMigration-only PRs and declared domain roots need current human approval.\nCoupling other files requires a tracked migration_exception with reason,\nalternatives, and every coupled path, plus two human approvals on this head.\nTrusted promotion exemptions preserve their existing scope behavior."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"pull-request.size","options":[{"choices":[],"default":"","help":"Trusted base revision used for diff and policy.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"HEAD","help":"Head revision to compare with the base.","names":["--head"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"pr-size-excluded","help":"Git attribute that marks repository-specific excluded artifacts.","names":["--generated-attribute"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Write the complete canonical JSON report to this path.","names":["--report-path"],"repeatable":false,"required":false,"value_type":"Path"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"}],"path":["pull-request","size"],"summary":"Count authored production and test churn; exclude declared generated artifacts.\n\nTest categories describe paths, not a review-cost exemption. Review each case:\neach case should protect a distinct contract, regression, boundary, interaction,\nor lifecycle. Consolidate equivalent cases into readable named tables and reuse\nowned fixtures; preserve independent oracles, case isolation, and safety checks.\nCoverage percentages and test counts alone do not justify another case.\n\nCounted review lines include production and test categories, including support\nand configuration. Churn measures additions plus deletions, not net LOC.\n\nSource-semantic test-quality checks belong to Code Standards. Do not infer\nquality from a test filename, file length, or the excluded-line count."},{"arguments":[{"choices":[],"default":null,"help":"UTF-8 file containing the proposed PR body.","names":["body_file"],"repeatable":false,"required":true,"value_type":"Path"}],"command_id":"pull-request.text","options":[{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"},{"choices":[],"default":null,"help":"Proposed single-line PR title.","names":["--title"],"repeatable":false,"required":false,"value_type":"str"}],"path":["pull-request","text"],"summary":"Preview default description budgets without Git or provider evidence; warnings exit zero."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"report","options":[{"choices":[],"default":".repo-standards/repository.toml","help":"","names":["--manifest"],"repeatable":false,"required":false,"value_type":"str"},{"choices":["json","pretty-json","text"],"default":"text","help":"","names":["--format"],"repeatable":false,"required":false,"value_type":"OutputFormat"},{"choices":[],"default":null,"help":"Deterministic YYYY-MM-DD","names":["--as-of"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Compare Makefiles and new SQL migrations to this commit.","names":["--base"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Activate a current rule ID for this run.","names":["--enable-rule"],"repeatable":false,"required":false,"value_type":"list"}],"path":["report"],"summary":"Analyze one manifest without blocking on completed policy findings."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"rest.discover","options":[],"path":["rest","discover"],"summary":"Discover committed OpenAPI entry candidates without importing application code."},{"arguments":[{"choices":[],"default":".","help":"","names":["root"],"repeatable":false,"required":false,"value_type":"Path"}],"command_id":"rest.doctor","options":[],"path":["rest","doctor"],"summary":"Return the installed capability handshake and inert repository detection."},{"arguments":[],"command_id":"rules","options":[{"choices":[],"default":null,"help":"Filter rule IDs by prefix.","names":["--rule-prefix"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Filter by warning or error.","names":["--severity"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":"100","help":"Page size from 1 through 500.","names":["--limit"],"repeatable":false,"required":false,"value_type":"str"},{"choices":[],"default":null,"help":"Opaque cursor returned by the prior page.","names":["--cursor"],"repeatable":false,"required":false,"value_type":"str"}],"path":["rules"],"summary":"List installed policy rules as bounded deterministic JSON."},{"arguments":[{"choices":[],"default":"report","help":"","names":["document"],"repeatable":false,"required":false,"value_type":"str"}],"command_id":"schema","options":[],"path":["schema"],"summary":"Print repository report, baseline or catalog JSON Schema."}],"kind":"repo-standards.catalog","policies":[{"bindings":[{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":45,"rule_id":"repository/artifacts/bespoke-iac-verifiers","rule_version":7,"severity":"error"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"verified","precedence":51,"rule_id":"repository/artifacts/local-residue","rule_version":1,"severity":"warning"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"verified","precedence":48,"rule_id":"repository/artifacts/makefile-growth","rule_version":2,"severity":"error"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"verified","precedence":53,"rule_id":"repository/artifacts/migration-consolidation","rule_version":1,"severity":"warning"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"verified","precedence":46,"rule_id":"repository/artifacts/operational-script-tests","rule_version":6,"severity":"warning"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"verified","precedence":44,"rule_id":"repository/artifacts/schema-derived-config-examples","rule_version":3,"severity":"warning"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":55,"rule_id":"repository/artifacts/script-test-directories","rule_version":1,"severity":"error"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":40,"rule_id":"repository/artifacts/terraform-examples","rule_version":1,"severity":"error"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":47,"rule_id":"repository/artifacts/terraform-test-files","rule_version":2,"severity":"error"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":54,"rule_id":"repository/artifacts/undeclared-images","rule_version":2,"severity":"error"},{"classification":"judgment-heavy","default_activation":"disabled","evidence_level":"declared","precedence":49,"rule_id":"repository/artifacts/untyped-javascript","rule_version":2,"severity":"error"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":50,"rule_id":"repository/documentation/placement","rule_version":4,"severity":"error"},{"classification":"objective-boundary","default_activation":"disabled","evidence_level":"verified","precedence":52,"rule_id":"repository/documentation/pull-request-template-sections","rule_version":3,"severity":"warning"}],"policy_id":"sarj","policy_version":36,"title":"Sarj repository standard"}],"product":{"distribution":"repo-standards","executables":["repo-standards"],"name":"repo-standards","product_id":"repo-standards","repository_url":"https://github.com/sarj-ai/repo-standards","summary":"Deterministic repository architecture, pull-request, and API contract analysis.","title":"Sarj Repo Standards","website_url":"https://engineering.sarj.ai/projects/repo-standards/"},"provenance":{"content_digest":"8cd4845380d24ccc1facd2f1acad519f996712fb29f676df0cdd844db8093a51","distribution":"repo-standards","package_version":"8.0.0","repository_url":"https://github.com/sarj-ai/repo-standards"},"rules":[{"category_id":"repository","default_severity":"error","description":"Retired verifier basenames are prohibited everywhere. Other executable-script basenames beginning with verify require objective source, test, script, bin, or component ownership, including at the repository root. Operational placement remains prohibited except for conventional source inside an objectively owned tool or harness.","examples":[{"after":"explicit environment tfvars","before":"iac/scripts/verify-dev-apply-plan.jq","expected_severity":"error","id":"sarj-artifact-no-bespoke-iac-verifiers","language":"text","title":"Bespoke IaC verifier"}],"fix":"Run one-off IaC rehearsals outside Git and summarize evidence in the PR. For a permanent check, name the recurring regression existing gates miss, its owned harness, execution cost, and failure action. Preserve distinct behavior and safety contracts in native checks or that harness; then remove the redundant helper, invocations, and unused dependencies. Renaming, moving, or translating the helper does not resolve duplication.","kind":"rule","references":[],"rule_id":"repository/artifacts/bespoke-iac-verifiers","rule_version":7,"slug":"bespoke-iac-verifiers","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/bespoke-iac-verifiers"},"title":"Do not commit bespoke verifier scripts","topic_id":"artifacts","why":"Repository-specific verifier entrypoints create parallel validation paths that drift from shared policy, owned test suites, and deployment contracts. Durable executable verification belongs in an objectively owned tool or harness."},{"category_id":"repository","default_severity":"warning","description":"Tracked .pyc, .pyo and .tsbuildinfo filenames, and exact .DS_Store and Thumbs.db, .eslintcache and .coverage basenames, case-insensitively, need review as local residue. Only the final filename is matched; directories grant no exemptions.","examples":[{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"src/package/client.py\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"src/package/client.py\",\"src/package/__pycache__/client.cpython-315.pyc\"]}","expected_severity":"warning","id":"sarj-artifact-local-residue-bytecode","language":"json","title":"Retain Python source and untrack its local cache"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"tsconfig.json\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"tsconfig.json\",\"tsconfig.tsbuildinfo\"]}","expected_severity":"warning","id":"sarj-artifact-local-residue-build-cache","language":"json","title":"Retain build settings and untrack incremental state"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"assets/theme.css\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"assets/theme.css\",\"assets/Thumbs.db\"]}","expected_severity":"warning","id":"sarj-artifact-local-residue-desktop-metadata","language":"json","title":"Retain the asset and untrack desktop thumbnail metadata"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"eslint.config.ts\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"eslint.config.ts\",\".eslintcache\"]}","expected_severity":"warning","id":"sarj-artifact-local-residue-eslint-cache","language":"json","title":"Retain lint settings and untrack local lint state"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\".coveragerc\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\".coveragerc\",\".coverage\"]}","expected_severity":"warning","id":"sarj-artifact-local-residue-coverage-data","language":"json","title":"Retain coverage settings and untrack measured state"}],"fix":"Review the file's behavior and distribution contract. Untrack disposable output and ignore future copies; gitignore does not affect existing tracked files. Retain required fixtures or runtime artifacts with an existing exact, dated fingerprint exception. Do not rename the file or delete a distinct test contract merely to silence the warning.","kind":"rule","references":[],"rule_id":"repository/artifacts/local-residue","rule_version":1,"slug":"local-residue","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/local-residue"},"title":"Review tracked caches, bytecode, coverage data and OS metadata","topic_id":"artifacts","why":"Interpreter bytecode, incremental build or lint state, coverage data and desktop metadata can drift from checked source or local tools. Some distributions and fixtures are intentional, so a matching filename is review evidence rather than proof that deletion is safe."},{"category_id":"repository","default_severity":"error","description":"Do not create Makefiles or grow existing ones without a scoped, documented exception. Compare exact Git snapshots per path, counting comments, blank lines and an unterminated final line; CRLF and LF count equally. New paths, including empty files and move/copy destinations, require an exception. Equal size, shrinkage and deletion pass; changes in one file do not offset another. Match Makefile, GNUmakefile, Makecall, Makefile.*, GNUmakefile.* and *.mk case-insensitively; exclude suffix variants ending in .md, .mdx, .rst, .adoc or .txt. Vendor, generated and fixture paths have no automatic exemption. Arbitrary custom names and included non-Make files are outside this scope. Exact-path makefiles.exceptions records require max_lines, owner, reason, issue, created_on and expires_on, with at most 90 days of validity. Standalone exception use requires --as-of; the Code Standards bridge supplies UTC. Baselines and generic diagnostic exceptions cannot authorize growth.","examples":[{"after":"{\"base\":{\"Makefile\":2},\"head\":{\"Makefile\":2}}","before":"{\"base\":{\"Makefile\":2},\"head\":{\"Makefile\":3}}","expected_severity":"error","id":"sarj-artifact-makefile-growth","language":"json","title":"Existing Makefile grows between Git snapshots"},{"after":"{\"base\":{},\"head\":{}}","before":"{\"base\":{},\"head\":{\"tools/Makefile\":0}}","expected_severity":"error","id":"sarj-artifact-new-empty-makefile","language":"json","title":"An empty Makefile is still a new artifact"}],"fix":"Prefer existing native commands; remove redundant wrappers with their callers and preserve necessary contracts until safely migrated. Do not transfer aliases into replacement scripts or task files. Use --base for branch-wide committed comparisons; the local default covers the last commit and staged checks use HEAD. Missing comparison objects produce incomplete analysis.","kind":"rule","references":[],"rule_id":"repository/artifacts/makefile-growth","rule_version":2,"slug":"makefile-growth","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/makefile-growth"},"title":"Do not add or grow Makefiles without a scoped exception","topic_id":"artifacts","why":"Convenience wrappers duplicate native command interfaces and add maintenance and review noise."},{"category_id":"repository","default_severity":"warning","description":"A Git comparison adding multiple logical SQL revisions in one migration stream needs consolidation review. Conventional migrations directories, migration-set components and configured review-policy migration roots identify separate streams. Automatic discovery excludes test, fixture, example, vendor and generated paths; explicit manifest roots remain authoritative. Base stream roots retain their ownership: head changes cannot remove them or split them into child streams. New roots outside those streams remain independent.","examples":[{"after":"{\"base\":[],\"head\":[\"db/migrations/001.sql\"]}","before":"{\"base\":[],\"head\":[\"db/migrations/001.sql\",\"db/migrations/002.sql\"]}","expected_severity":"warning","id":"sarj-migration-consolidation","language":"json","title":"One new logical SQL revision per stream"}],"fix":"Combine compatible new revisions in their original statement order, preserve framework metadata and rollback contracts, and rerun against the pull-request base. Do not rewrite applied history. Retain necessary boundaries with an exact reviewed exception. No automatic rewrite is offered. Direct SQL files, up/down pairs, Flyway V/U versions and Prisma revision directories are recognized; repeatable Flyway R__ scripts and other nested layouts are outside this rule.","kind":"rule","references":[],"rule_id":"repository/artifacts/migration-consolidation","rule_version":1,"slug":"migration-consolidation","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/migration-consolidation"},"title":"Consolidate compatible new SQL migrations in one pull request","topic_id":"artifacts","why":"Separate unapplied migrations from one change add needless history and execution boundaries. Required transaction, rollback and deployment boundaries can still justify multiple revisions, so filenames alone support a warning rather than proving that concatenation is safe."},{"category_id":"repository","default_severity":"warning","description":"Tracked script test/spec artifacts in operational trees are review candidates. Top-level .github/scripts test/spec artifacts also require review, including nested paths and declared packages; this does not change verifier ownership. An exact declared nonoperational native package may own conventional tests when substantive tracked lockfile or source-entrypoint evidence supports it. This package exception excludes top-level operational roots, package-local operational directories, GitHub automation, and native Terraform modules. Repository Standards owns this path boundary; semantic workflow analysis belongs in Code Standards.","examples":[{"after":"Retained distinct coverage or an equivalent existing check","before":"iac/bell/preview-contract.test.ts","expected_severity":"warning","id":"sarj-artifact-no-operational-script-tests","language":"text","title":"Operational test requiring contract review"},{"after":"Retained distinct coverage or an equivalent existing check","before":".github/scripts/deployment-steps.test.mts","expected_severity":"warning","id":"sarj-artifact-github-script-tests","language":"text","title":"GitHub script test requiring contract review"}],"fix":"Name the wrong outcome and retained check that rejects it. Keep one-off rollout rehearsals and reports outside Git. Recurring tests need a distinct regression, an owned harness, and a bounded execution cost. Remove redundant tests and invocations only after proving equivalent coverage; retain distinct behavior and safety contracts. Moving or renaming is not remediation.","kind":"rule","references":[],"rule_id":"repository/artifacts/operational-script-tests","rule_version":6,"slug":"operational-script-tests","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/operational-script-tests"},"title":"Review operational script tests for duplicate contracts","topic_id":"artifacts","why":"Deployment tests can repeat contracts owned by Terraform, providers, shared policy, or runtime behavior. Filenames and placement do not establish redundancy or test value; workflow contents are outside this rule's evidence."},{"category_id":"repository","default_severity":"warning","description":"Tracked backend.conf and env example, sample, template, or schema basenames are prohibited, case-insensitively.","examples":[{"after":"services/api/settings.py","before":"services/api/.env.local.example","expected_severity":"warning","id":"sarj-artifact-no-schema-derived-config-examples","language":"text","title":"Schema-derived configuration example"}],"fix":"Delete the duplicate artifact and generate developer-facing configuration from the authoritative Terraform, Zod, Pydantic, or deployment schema.","kind":"rule","references":[],"rule_id":"repository/artifacts/schema-derived-config-examples","rule_version":3,"slug":"schema-derived-config-examples","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/schema-derived-config-examples"},"title":"Reject hand-maintained configuration examples","topic_id":"artifacts","why":"Hand-maintained configuration examples duplicate Terraform, Zod, or Pydantic contracts and drift from the settings the application actually accepts."},{"category_id":"repository","default_severity":"error","description":"Prohibit script-language source under scripts/{test,tests,spec,specs,__tests__}, including nested roots and support files, case-insensitively. Documentation and data remain allowed. Exact-content fingerprints bind legacy baselines.","examples":[{"after":"python/release/tests/test_release.py","before":"python/scripts/tests/test_release.py","expected_severity":"error","id":"sarj-artifact-script-test-directories","language":"text","title":"Script test code belongs with its durable owner"}],"fix":"Reuse native lint, type, build, plan or smoke checks when they establish a one-off change's contract. Put distinct durable coverage in its owning package or shared policy suite. Retain legacy safety coverage through a reviewed exact-content baseline or exception. Delete tests only when their contracts are retired or retained coverage rejects the same wrong outcomes; renaming duplicates is not remediation.","kind":"rule","references":[],"rule_id":"repository/artifacts/script-test-directories","rule_version":1,"slug":"script-test-directories","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/script-test-directories"},"title":"Keep test code out of script test directories","topic_id":"artifacts","why":"An explicit directory policy prevents a growing parallel script-test suite. This is a placement gate, not evidence that an existing test lacks value or that a one-off change needs a new unit test."},{"category_id":"repository","default_severity":"error","description":"Tracked filenames ending in .tfvars.example, .tfvars.sample, or .tfvars.template are prohibited.","examples":[{"after":"deployments/alpha/terraform/variables.tf","before":"deployments/alpha/terraform/terraform.tfvars.example","expected_severity":"error","id":"sarj-artifact-no-example-tfvars","language":"text","title":"Terraform example variables"}],"fix":"Delete the example file and document validated inputs in variables.tf.","kind":"rule","references":[],"rule_id":"repository/artifacts/terraform-examples","rule_version":1,"slug":"terraform-examples","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/terraform-examples"},"title":"Do not commit example tfvars files","topic_id":"artifacts","why":"One typed variable interface prevents copied configuration from drifting."},{"category_id":"repository","default_severity":"error","description":"Tracked paths ending in .tftest.hcl or .tftest.json are prohibited, case-insensitively.","examples":[{"after":"shared rendered-plan validation","before":"iac/tests/routing.tftest.hcl","expected_severity":"error","id":"sarj-artifact-no-terraform-test-files","language":"text","title":"Terraform-native test file"}],"fix":"Identify each distinct behavior and safety contract the test checks. Before deleting it and its invocations, demonstrate that retained or replacement shared rendered-plan, provider, or runtime checks reject the same wrong outcomes. Passing runs or equal coverage counts alone do not establish equivalence.","kind":"rule","references":[],"rule_id":"repository/artifacts/terraform-test-files","rule_version":2,"slug":"terraform-test-files","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/terraform-test-files"},"title":"Do not commit native Terraform test files","topic_id":"artifacts","why":"A separate Terraform-native test harness duplicates setup and review conventions; one shared rendered-plan, provider, or runtime validation path keeps infrastructure checks discoverable and consistent."},{"category_id":"repository","default_severity":"error","description":"Tracked PNG, JPEG, GIF, WebP, AVIF, SVG, SVGZ, ICO, BMP, TIFF, APNG, HEIC, HEIF and JXL paths require an exact images.artifacts declaration with an application, documentation or fixture purpose and a nonblank reason. The rule is explicitly activated by a consumer; directories and file size do not grant exemptions.","examples":[{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"docs/review/before.png\"]}","expected_severity":"error","id":"sarj-image-review-evidence","language":"json","title":"Attach review screenshots instead of tracking them"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n[[images.artifacts]]\\npath = \\\"public/logo.svg\\\"\\nkind = \\\"application\\\"\\nreason = \\\"Application brand mark.\\\"\\n\",\"tracked\":[\"public/logo.svg\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"public/logo.svg\"]}","expected_severity":"error","id":"sarj-image-application-asset","language":"json","title":"Declare an application image without deleting it"},{"after":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n[[images.artifacts]]\\npath = \\\"tests/fixtures/input.png\\\"\\nkind = \\\"fixture\\\"\\nreason = \\\"Decoder regression input.\\\"\\n\",\"tracked\":[\"tests/fixtures/input.png\"]}","before":"{\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\",\"tracked\":[\"tests/fixtures/input.png\"]}","expected_severity":"error","id":"sarj-image-fixture","language":"json","title":"Retain image bytes required by a real test"}],"fix":"Attach PR evidence to its review or retain it externally, then untrack the review-only file. For a durable asset, declare its exact tracked path, purpose and reason. Glob-looking characters are literal and declarations must match regular files in the selected Git tree or index. No automatic deletion, content decoding or recognition of extensionless images is offered.","kind":"rule","references":[],"rule_id":"repository/artifacts/undeclared-images","rule_version":2,"slug":"undeclared-images","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/undeclared-images"},"title":"Declare durable image assets and keep review evidence out of Git","topic_id":"artifacts","why":"PR screenshots and transient QA output add binary history without being application assets or maintained test inputs. Legitimate logos, icons, documentation illustrations and image fixtures remain valid through reviewed declarations. Paths establish missing ownership, not image quality or author intent."},{"category_id":"repository","default_severity":"error","description":"Tracked .js, .jsx, .mjs and .cjs paths, case-insensitively, need an exact javascript.artifacts declaration or migration to typed source. Config, vendor, generated and test names do not grant automatic exemptions.","examples":[{"after":"scripts/generate-catalog.mts","before":"scripts/generate-catalog.mjs","expected_severity":"error","id":"sarj-artifact-untyped-javascript-source","language":"text","title":"Typed tooling source"},{"after":"{\"tracked\":[\"generated/rules.mjs\",\"scripts/generate.py\"],\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n[[javascript.artifacts]]\\npath = \\\"generated/rules.mjs\\\"\\nkind = \\\"generated\\\"\\nsource = \\\"scripts/generate.py\\\"\\nreason = \\\"External tools load this generated ESM artifact.\\\"\\n\"}","before":"{\"tracked\":[\"generated/rules.mjs\",\"scripts/generate.py\"],\"manifest\":\"repository_id = \\\"example-repository\\\"\\ncomponents = []\\n\"}","expected_severity":"error","id":"sarj-artifact-untyped-javascript-generated","language":"json","title":"Required Python-generated JavaScript"}],"fix":"Use .mts for authored ESM tooling, .cts for CommonJS, and the framework's typed source convention for applications. Review module loading and callers before migrating. For required JavaScript, declare the exact path, artifact kind and reason; generated output also needs a tracked non-JavaScript source. A declaration records intent and does not prove generation or semantic necessity.","kind":"rule","references":[],"rule_id":"repository/artifacts/untyped-javascript","rule_version":2,"slug":"untyped-javascript","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/untyped-javascript"},"title":"Prefer typed source and declare required JavaScript artifacts","topic_id":"artifacts","why":"Authored JavaScript can escape the TypeScript checking contract. Runtime, tool, vendor and fixture artifacts may require JavaScript; explicit declarations make that intent reviewable without inferring it from a filename."},{"category_id":"repository","default_severity":"error","description":"Tracked Markdown must have a durable documentation or tool-contract role.","examples":[{"after":"docs/deployment/alpha-terraform.md","before":"deployments/alpha/terraform/README.md","expected_severity":"error","id":"sarj-layout-markdown-placement","language":"text","title":"Markdown placement"}],"fix":"Move durable guidance into an approved docs root or delete transient notes. Before relocating required skill references, review the owning SKILL.md and preserve its relative-path contract. This path-only rule does not resolve Markdown references; a plugin or references directory alone proves no ownership.","kind":"rule","references":[],"rule_id":"repository/documentation/placement","rule_version":4,"slug":"documentation-placement","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/documentation/placement"},"title":"Keep Markdown in durable owned locations","topic_id":"documentation","why":"Owned documentation stays discoverable instead of becoming repository debris."},{"category_id":"repository","default_severity":"warning","description":"Each required PR section needs a heading in the PR template. Merge Risk is always required by Review Policy; required_body_sections adds other required headings.","examples":[{"after":"{\"required\":[\"What & why\",\"Test evidence\"],\"template\":\"## What & why\\n\\n## Test evidence\\n\"}","before":"{\"required\":[\"What & why\",\"Test evidence\"],\"template\":\"## What & why\\n\"}","expected_severity":"warning","id":"sarj-documentation-pull-request-template-sections","language":"json","title":"The PR template has no Test evidence heading"},{"after":"{\"required\":[\"What & why\"],\"template\":\"## What & why\\n\"}","before":"{\"required\":[\"What & why\"],\"template\":null}","expected_severity":"warning","id":"sarj-documentation-pull-request-template-absent","language":"json","title":"There is no PR template"},{"after":"{\"required\":[],\"template\":null}","before":"{\"required\":[\"Test evidence\"],\"template\":null}","expected_severity":"warning","id":"sarj-documentation-pull-request-template-optional","language":"json","title":"No required headings need no template"}],"fix":"Add the missing heading to the PR template.","kind":"rule","references":[],"rule_id":"repository/documentation/pull-request-template-sections","rule_version":3,"slug":"pull-request-template-sections","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/documentation/pull-request-template-sections"},"title":"Keep the PR template in sync with required sections","topic_id":"documentation","why":"People write PRs from the template. If a required heading is not there, their PR fails the check."}],"safety":{"inspection_input":"exact Git tree","mutation":false,"network_default":false,"network_mode":"disabled","repository_code_execution":false},"schemas":[{"cli_selector":"baseline","document":{"$id":"urn:repo-standards:schema:baseline:v2","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"fingerprints":{"items":{"pattern":"^[0-9a-f]{64}$","type":"string"},"type":"array","uniqueItems":true},"include_warnings":{"default":false,"type":"boolean"},"policy":{"minLength":1,"type":"string"},"policy_version":{"minimum":1,"type":"integer"},"repository_id":{"minLength":1,"type":"string"},"schema_version":{"const":2},"scope_digest":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"required":["schema_version","repository_id","policy","policy_version","scope_digest","fingerprints"],"type":"object"},"media_type":"application/schema+json","schema_id":"baseline","title":"Repository policy baseline"},{"cli_selector":"report","document":{"$id":"urn:repo-standards:schema:report:v3","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"oneOf":[{"properties":{"completion":{"const":"complete"},"conclusion":{"const":"passed"},"diagnostics":{"maxItems":0},"execution_issues":{"maxItems":0}},"required":["completion","conclusion","diagnostics","execution_issues"]},{"properties":{"completion":{"const":"complete"},"conclusion":{"const":"findings"},"diagnostics":{"minItems":1},"execution_issues":{"maxItems":0}},"required":["completion","conclusion","diagnostics","execution_issues"]},{"properties":{"completion":{"const":"incomplete"},"conclusion":{"const":"inconclusive"},"diagnostics":{"maxItems":0},"execution_issues":{"minItems":1}},"required":["completion","conclusion","diagnostics","execution_issues"]}],"properties":{"baseline":{"type":"object"},"command":{"enum":["check","report"]},"completion":{"enum":["complete","incomplete"]},"conclusion":{"enum":["passed","findings","inconclusive"]},"diagnostics":{"items":{"additionalProperties":false,"properties":{"component_id":{"type":"string"},"disposition":{"enum":["active","excepted"]},"evidence_level":{"enum":["verified","declared","external","unknown"]},"exception":{"additionalProperties":false,"properties":{"created_on":{"format":"date","type":"string"},"expires_on":{"format":"date","type":"string"},"issue":{"type":"string"},"owner":{"type":"string"},"reason":{"type":"string"}},"required":["owner","issue","reason","created_on","expires_on"],"type":["object","null"]},"expected":{},"finding_key":{"pattern":"^[0-9a-f]{64}$","type":"string"},"fingerprint":{"pattern":"^[0-9a-f]{64}$","type":"string"},"location":{"additionalProperties":false,"properties":{"column":{"minimum":1,"type":"integer"},"end_column":{"minimum":1,"type":"integer"},"end_line":{"minimum":1,"type":"integer"},"line":{"minimum":1,"type":"integer"},"manifest_anchor":{"type":"string"},"path":{"type":"string"},"pointer":{"type":"string"}},"required":["path","manifest_anchor"],"type":"object"},"manifest_anchor":{"type":"string"},"message":{"type":"string"},"observed":{},"path":{"type":"string"},"prerequisites":{"items":{"type":"string"},"type":"array"},"related_locations":{"items":{"additionalProperties":false,"properties":{"location":{"additionalProperties":false,"properties":{"column":{"minimum":1,"type":"integer"},"end_column":{"minimum":1,"type":"integer"},"end_line":{"minimum":1,"type":"integer"},"line":{"minimum":1,"type":"integer"},"path":{"type":"string"},"pointer":{"type":"string"}},"required":["path"],"type":"object"},"message":{"type":"string"},"relationship":{"type":"string"}},"required":["location","message","relationship"],"type":"object"},"type":"array"},"remediation":{"additionalProperties":false,"properties":{"steps":{"items":{"type":"string"},"type":"array"},"summary":{"type":"string"},"validation":{"items":{"type":"string"},"type":"array"}},"required":["summary","steps","validation"],"type":"object"},"rule_id":{"type":"string"},"rule_version":{"minimum":1,"type":"integer"},"severity":{"enum":["warning","error"]},"subject_kind":{"type":"string"}},"required":["rule_id","rule_version","severity","evidence_level","component_id","subject_kind","observed","expected","message","path","manifest_anchor","location","remediation","prerequisites","disposition","exception","fingerprint"],"type":"object"},"type":"array"},"execution_issues":{"items":{"additionalProperties":false,"properties":{"code":{"pattern":"^[a-z][a-z0-9.-]+$","type":"string"},"message":{"type":"string"},"phase":{"type":"string"},"remediation":{"items":{"type":"string"},"type":"array"},"retryable":{"type":"boolean"}},"required":["code","phase","message","retryable","remediation"],"type":"object"},"type":"array"},"input_provenance":{"type":"object"},"mode":{"enum":["report","ratchet","strict"]},"policy":{"additionalProperties":false,"properties":{"id":{"type":"string"},"version":{"type":"integer"}},"required":["id","version"],"type":"object"},"provenance":{"type":"object"},"ratchet":{"type":"object"},"ratchet_comparison":{"type":"object"},"repository_id":{"type":"string"},"schema_version":{"const":3},"scope_digest":{"pattern":"^[0-9a-f]{64}$","type":"string"},"summary":{"additionalProperties":{"type":"integer"},"type":"object"},"tool":{"additionalProperties":false,"properties":{"name":{"const":"repo-standards"},"version":{"type":"string"}},"required":["name","version"],"type":"object"}},"required":["schema_version","completion","conclusion","mode","repository_id","policy","scope_digest","summary","execution_issues","diagnostics","tool","command","provenance","baseline","ratchet"],"type":"object"},"media_type":"application/schema+json","schema_id":"report","title":"Repository analysis report"},{"cli_selector":"catalog","document":{"$defs":{"CapabilityDescriptor":{"additionalProperties":false,"properties":{"capability_id":{"title":"Capability Id","type":"string"},"command_ids":{"items":{"type":"string"},"title":"Command Ids","type":"array"},"input_kinds":{"items":{"type":"string"},"title":"Input Kinds","type":"array"},"status":{"enum":["preview","beta","stable"],"title":"Status","type":"string"},"summary":{"title":"Summary","type":"string"},"title":{"title":"Title","type":"string"}},"required":["capability_id","title","summary","status","command_ids","input_kinds"],"title":"CapabilityDescriptor","type":"object"},"CategoryDescriptor":{"additionalProperties":false,"properties":{"category_id":{"title":"Category Id","type":"string"},"label":{"title":"Label","type":"string"},"order":{"title":"Order","type":"integer"},"topics":{"items":{"$ref":"#/$defs/TopicDescriptor"},"title":"Topics","type":"array"}},"required":["category_id","label","order","topics"],"title":"CategoryDescriptor","type":"object"},"CommandDescriptor":{"additionalProperties":false,"properties":{"arguments":{"items":{"$ref":"#/$defs/ParameterDescriptor"},"title":"Arguments","type":"array"},"command_id":{"title":"Command Id","type":"string"},"options":{"items":{"$ref":"#/$defs/ParameterDescriptor"},"title":"Options","type":"array"},"path":{"items":{"type":"string"},"title":"Path","type":"array"},"summary":{"title":"Summary","type":"string"}},"required":["command_id","path","summary","options","arguments"],"title":"CommandDescriptor","type":"object"},"ExampleDescriptor":{"additionalProperties":false,"properties":{"after":{"minLength":1,"title":"After","type":"string"},"before":{"minLength":1,"title":"Before","type":"string"},"expected_severity":{"enum":["warning","error"],"title":"Expected Severity","type":"string"},"id":{"minLength":1,"title":"Id","type":"string"},"language":{"enum":["json","text","toml","yaml"],"title":"Language","type":"string"},"title":{"maxLength":56,"minLength":1,"title":"Title","type":"string"}},"required":["id","title","language","before","after","expected_severity"],"title":"ExampleDescriptor","type":"object"},"JSONScalar":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"JSONValue":{"anyOf":[{"$ref":"#/$defs/JSONScalar"},{"items":{"$ref":"#/$defs/JSONValue"},"type":"array"},{"additionalProperties":{"$ref":"#/$defs/JSONValue"},"type":"object"}]},"ParameterDescriptor":{"additionalProperties":false,"properties":{"choices":{"items":{"type":"string"},"title":"Choices","type":"array"},"default":{"$ref":"#/$defs/JSONValue"},"help":{"title":"Help","type":"string"},"names":{"items":{"type":"string"},"title":"Names","type":"array"},"repeatable":{"title":"Repeatable","type":"boolean"},"required":{"title":"Required","type":"boolean"},"value_type":{"title":"Value Type","type":"string"}},"required":["names","value_type","required","default","choices","help","repeatable"],"title":"ParameterDescriptor","type":"object"},"PolicyDescriptor":{"additionalProperties":false,"properties":{"bindings":{"items":{"$ref":"#/$defs/PolicyRuleBinding"},"title":"Bindings","type":"array"},"policy_id":{"title":"Policy Id","type":"string"},"policy_version":{"exclusiveMinimum":0,"title":"Policy Version","type":"integer"},"title":{"title":"Title","type":"string"}},"required":["policy_id","policy_version","title","bindings"],"title":"PolicyDescriptor","type":"object"},"PolicyRuleBinding":{"additionalProperties":false,"properties":{"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Classification"},"default_activation":{"const":"disabled","default":"disabled","title":"Default Activation","type":"string"},"evidence_level":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Evidence Level"},"precedence":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Precedence"},"rule_id":{"title":"Rule Id","type":"string"},"rule_version":{"exclusiveMinimum":0,"title":"Rule Version","type":"integer"},"severity":{"enum":["warning","error"],"title":"Severity","type":"string"}},"required":["rule_id","rule_version","severity"],"title":"PolicyRuleBinding","type":"object"},"ProductDescriptor":{"additionalProperties":false,"properties":{"distribution":{"title":"Distribution","type":"string"},"executables":{"items":{"type":"string"},"title":"Executables","type":"array"},"name":{"title":"Name","type":"string"},"product_id":{"const":"repo-standards","title":"Product Id","type":"string"},"repository_url":{"title":"Repository Url","type":"string"},"summary":{"title":"Summary","type":"string"},"title":{"title":"Title","type":"string"},"website_url":{"title":"Website Url","type":"string"}},"required":["product_id","name","title","summary","distribution","executables","repository_url","website_url"],"title":"ProductDescriptor","type":"object"},"ProvenanceDescriptor":{"additionalProperties":false,"properties":{"content_digest":{"title":"Content Digest","type":"string"},"distribution":{"title":"Distribution","type":"string"},"package_version":{"title":"Package Version","type":"string"},"repository_url":{"title":"Repository Url","type":"string"}},"required":["distribution","package_version","repository_url","content_digest"],"title":"ProvenanceDescriptor","type":"object"},"RuleDescriptor":{"additionalProperties":false,"properties":{"category_id":{"title":"Category Id","type":"string"},"default_severity":{"enum":["warning","error"],"title":"Default Severity","type":"string"},"description":{"minLength":1,"title":"Description","type":"string"},"examples":{"items":{"$ref":"#/$defs/ExampleDescriptor"},"minItems":1,"title":"Examples","type":"array"},"fix":{"minLength":1,"title":"Fix","type":"string"},"kind":{"const":"rule","default":"rule","title":"Kind","type":"string"},"references":{"items":{"pattern":"^https://","type":"string"},"title":"References","type":"array"},"rule_id":{"pattern":"^[a-z0-9][a-z0-9-]*(/[a-z0-9][a-z0-9-]*){2,}$","title":"Rule Id","type":"string"},"rule_version":{"exclusiveMinimum":0,"title":"Rule Version","type":"integer"},"slug":{"maxLength":64,"minLength":3,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","title":"Slug","type":"string"},"source":{"$ref":"#/$defs/SourcePointer"},"title":{"maxLength":72,"minLength":1,"title":"Title","type":"string"},"topic_id":{"title":"Topic Id","type":"string"},"why":{"minLength":1,"title":"Why","type":"string"}},"required":["rule_id","slug","rule_version","title","category_id","topic_id","default_severity","description","why","fix","references","examples","source"],"title":"RuleDescriptor","type":"object"},"SafetyDescriptor":{"additionalProperties":false,"properties":{"inspection_input":{"title":"Inspection Input","type":"string"},"mutation":{"title":"Mutation","type":"boolean"},"network_default":{"title":"Network Default","type":"boolean"},"network_mode":{"title":"Network Mode","type":"string"},"repository_code_execution":{"title":"Repository Code Execution","type":"boolean"}},"required":["mutation","repository_code_execution","network_default","network_mode","inspection_input"],"title":"SafetyDescriptor","type":"object"},"SchemaDescriptor":{"additionalProperties":false,"properties":{"cli_selector":{"title":"Cli Selector","type":"string"},"document":{"$ref":"#/$defs/JSONValue"},"media_type":{"const":"application/schema+json","title":"Media Type","type":"string"},"schema_id":{"title":"Schema Id","type":"string"},"title":{"title":"Title","type":"string"}},"required":["schema_id","title","media_type","cli_selector","document"],"title":"SchemaDescriptor","type":"object"},"SourcePointer":{"additionalProperties":false,"properties":{"path":{"minLength":1,"pattern":"^(?!/|~)(?!.*(?:^|/)\\.\\.(?:/|$)).+$","title":"Path","type":"string"},"symbol":{"minLength":1,"title":"Symbol","type":"string"}},"required":["path","symbol"],"title":"SourcePointer","type":"object"},"TopicDescriptor":{"additionalProperties":false,"properties":{"label":{"title":"Label","type":"string"},"order":{"title":"Order","type":"integer"},"topic_id":{"title":"Topic Id","type":"string"}},"required":["topic_id","label","order"],"title":"TopicDescriptor","type":"object"}},"$id":"https://repo-standards.sarj.ai/schema/catalog.schema.json","additionalProperties":false,"properties":{"capabilities":{"items":{"$ref":"#/$defs/CapabilityDescriptor"},"title":"Capabilities","type":"array"},"catalog_version":{"title":"Catalog Version","type":"string"},"categories":{"items":{"$ref":"#/$defs/CategoryDescriptor"},"title":"Categories","type":"array"},"commands":{"items":{"$ref":"#/$defs/CommandDescriptor"},"title":"Commands","type":"array"},"kind":{"const":"repo-standards.catalog","default":"repo-standards.catalog","title":"Kind","type":"string"},"policies":{"items":{"$ref":"#/$defs/PolicyDescriptor"},"title":"Policies","type":"array"},"product":{"$ref":"#/$defs/ProductDescriptor"},"provenance":{"$ref":"#/$defs/ProvenanceDescriptor"},"rules":{"items":{"$ref":"#/$defs/RuleDescriptor"},"title":"Rules","type":"array"},"safety":{"$ref":"#/$defs/SafetyDescriptor"},"schemas":{"items":{"$ref":"#/$defs/SchemaDescriptor"},"title":"Schemas","type":"array"}},"required":["catalog_version","product","provenance","safety","capabilities","categories","policies","rules","commands","schemas"],"title":"Catalog","type":"object"},"media_type":"application/schema+json","schema_id":"catalog","title":"Repo Standards public catalog"}]}
