Update to Codex Security
Snapshot Oct 7, 2026 · 06:02 UTC · version 0.1.32
Package or technical metadata updated
Package contents changed in 77 files: .app.json, .codex-plugin/plugin.json, .mcp.json, …. Open the file diff to inspect the edits.
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Package file
e4d5b22326ee380de5d779f7b5ba590c8d1bee9a80e8869fb2bd7f4def8e974d
a7bbe314059c7311e169474823e3978f267e560c3e961ba49fb94032da9843fe
Package file
480
479
Package file
3ddcc187fe2f1aff961bf55444e70bfbc3f825b6185ab3f29860d1a813a395f9
527d1a0db286884729572d400b0ad9b0ff852d4a12b36228ff5fbef180f7de9d
Package file
40b84baf510169eadfd5f0fe0ad95001caedb7bc662d77c9ac2a4fbec7dd0845
7c5968060f6e848859ce02450d6e02e67029d8d39011bbda1059b19de6309ebf
Compare saved observations
Download comparison JSONChanged files
examples/completed-scan/report.md →
mcp/native/THIRD_PARTY_NOTICES.txt →
mcp/native/darwin-arm64/unix.node →
mcp/native/darwin-x64/unix.node →
mcp/native/linux-arm64-gnu/unix.node →
mcp/native/linux-arm64-musl/unix.node →
mcp/native/linux-x64-gnu/unix.node →
mcp/native/linux-x64-musl/unix.node →
mcp/native/win32-arm64/windows.node →
mcp/native/win32-x64/windows.node →
references/artifact-storage.md →
references/config-preflight.md →
references/scan-artifacts.md →
schemas/coverage.schema.json →
schemas/scan-manifest.schema.json →
schemas/tools/scan-draft.schema.json →
scripts/deep_scan_workbench.py →
scripts/filesystem_identity.py →
scripts/finalize_scan_contract.py →
scripts/generate_in_scope_files.py →
scripts/generate_rank_input.py →
scripts/launch_codex_security_mcp →
scripts/normalize_candidates.py →
scripts/report_projection.py →
scripts/threat_model_projection.py →
scripts/windows_scan_local_files.py →
scripts/workbench/storage.py →
scripts/workbench_constants.py →
scripts/workbench_finding_index.py →
scripts/workbench_native_indexes.py →
scripts/workbench_progress.py →
scripts/workbench_publication.py →
scripts/workbench_remediation.py →
scripts/workbench_saved_results.py →
scripts/workbench_scan_start.py →
scripts/workbench_scan_usage.py →
scripts/workbench_severity.py →
scripts/workbench_source_excerpt.py →
scripts/workbench_target_state.py →
scripts/workbench_validation.py →
skills/assess-patch-risk/SKILL.md →
skills/assess-patch-risk/scripts/validate_patch_risk_assessment.py →
skills/attack-path-analysis/SKILL.md →
skills/deep-security-scan/SKILL.md →
skills/finding-discovery/SKILL.md →
skills/propose-security-hardening/references/proposal-format.md →
skills/security-diff-scan/SKILL.md →
skills/security-scan/SKILL.md →
skills/security-scan/references/desktop-scan.md →
skills/security-scan/references/scan-artifacts-and-ledger.md →
skills/threat-model/SKILL.md →
skills/track-findings/SKILL.md →
skills/track-findings/references/github-security-advisories.md →
skills/track-findings/references/jira.md →
skills/triage-finding/SKILL.md →
skills/triage-finding/agents/openai.yaml →
skills/triage-finding/references/ticket-intake.md →
skills/triage-finding/references/triage-result-contract.md →
scripts/generate_rank_input.py
--- before +++ after @@ -8,42 +8,29 @@ - `make-diff-rank-input` creates the deterministic diff-scoped JSONL candidate worklist from Git changed paths. It supports committed revision diffs and local working-tree patches. -- `make-rank-shards` partitions the ranking input into deterministic shards. -- `make-rank-pool-plan` assigns those shards to a deterministic bounded worker - pool. -- `validate-rank-worker` validates one worker slot and emits a content-bound - completion receipt. -- `validate-rank-shard` validates one completed worker output before the - coordinator accepts it. -- `validate-rank-pool` validates the pool plan and every assigned shard output. -- `merge-rank-outputs` validates and combines worker-local shard outputs. -- `copy-deep-review-input` copies every candidate into the deep-review worklist - for exhaustive mode. -- `select-deep-review-input` selects the ranked rows for deep review. """ from __future__ import annotations import argparse -import hashlib import json import os -import re import subprocess import sys -from collections import Counter -from collections.abc import Callable from pathlib import Path # Some plugin hosts launch Python with safe-path isolation enabled. sys.path.insert(0, str(Path(__file__).resolve().parent)) +from generate_in_scope_files import windows_stream_component from rank_preview import ( DEFAULT_PREVIEW_BYTES, + DEFAULT_PREVIEW_READ_BYTES, TEXT_CODE_EXTENSIONS, + is_binary_sample, preview_for, preview_for_bytes, ) -from workbench_target import git_blob_bytes, git_directory_snapshot_paths +from workbench_target import git_blob_bytes, git_command, git_directory_snapshot_paths EXCLUDED_DIRS = { ".cache", @@ -121,15 +108,7 @@ "yarn.lock", } -SHARD_INPUT_GLOB = "rank-shard-*.input.jsonl" -SHARD_OUTPUT_GLOB = "rank-shard-*.output.jsonl" -SHARD_INPUT_PATTERN = re.compile(r"^rank-shard-([0-9]{4,})\.input\.jsonl$") -RANK_POOL_PLAN_SCHEMA_VERSION = 1 -RANK_POOL_STRATEGY = "round_robin" -RANK_POOL_WORKER_CAP = 6 JsonRow = dict[str, object] -RowValidator = Callable[[JsonRow, Path, int], None] -RankWorkerAssignment = tuple[int, list[str], list[str]] def parse_args() -> argparse.Namespace: @@ -171,14 +150,6 @@ ) scoped.add_argument("--out", required=True, help="Output scoped-source-input.jsonl path.") - bind = subparsers.add_parser( - "bind-repo-scopes", - help="Copy SDK scoped-path targets into the unsealed manifest and coverage documents.", - ) - bind.add_argument("--scopes-file", required=True, help="JSON array of requested scopes.") - bind.add_argument("--manifest", required=True, help="Unsealed scan-manifest.json path.") - bind.add_argument("--coverage", required=True, help="Unsealed coverage.json path.") - diff = subparsers.add_parser( "make-diff-rank-input", help="Create rank_input.jsonl from Git changed source-like files.", @@ -201,86 +172,6 @@ help=f"Maximum UTF-8 bytes in each preview. Defaults to {DEFAULT_PREVIEW_BYTES}.", ) - shards = subparsers.add_parser( - "make-rank-shards", - help="Partition rank_input.jsonl into deterministic worker input shards.", - ) - shards.add_argument("--rank-input", required=True, help="Deterministic rank input JSONL.") - shards.add_argument("--out-dir", required=True, help="Directory for worker input shards.") - shards.add_argument( - "--max-rows", - type=int, - default=150, - help="Maximum rows per shard. Defaults to 150.", - ) - - pool_plan = subparsers.add_parser( - "make-rank-pool-plan", - help="Assign rank shards to a deterministic bounded worker pool.", - ) - pool_plan.add_argument("--shard-dir", required=True, help="Directory of rank shards.") - pool_plan.add_argument( - "--usable-worker-slots", - required=True, - type=int, - help="Usable ranking-worker slots reported by capability preflight; capped at 6.", - ) - pool_plan.add_argument("--out", required=True, help="Output rank_worker_assignments.json path.") - - validate_shard = subparsers.add_parser( - "validate-rank-shard", - help="Validate one worker output against its rank input shard.", - ) - validate_shard.add_argument("--input", required=True, help="Worker rank input shard.") - validate_shard.add_argument("--output", required=True, help="Worker rank output shard.") - - validate_worker = subparsers.add_parser( - "validate-rank-worker", - help="Validate one assigned ranking-worker slot and emit its completion receipt.", - ) - validate_worker.add_argument("--plan", required=True, help="Rank pool plan JSON path.") - validate_worker.add_argument("--shard-dir", required=True, help="Directory of rank shards.") - validate_worker.add_argument( - "--slot", - required=True, - type=int, - help="One-based ranking-worker slot from the rank pool plan.", - ) - - validate_pool = subparsers.add_parser( - "validate-rank-pool", - help="Validate a rank pool plan and every assigned shard output.", - ) - validate_pool.add_argument("--plan", required=True, help="Rank pool plan JSON path.") - validate_pool.add_argument("--shard-dir", required=True, help="Directory of rank shards.") - - merge = subparsers.add_parser( - "merge-rank-outputs", - help="Validate worker shard outputs and create rank_output.jsonl.", - ) - merge.add_argument("--rank-input", required=True, help="Authoritative rank input JSONL.") - merge.add_argument("--shard-dir", required=True, help="Directory of input and output shards.") - merge.add_argument("--out", required=True, help="Output rank_output.jsonl path.") - - copy = subparsers.add_parser( - "copy-deep-review-input", - help="Create deep_review_input.jsonl directly from rank_input.jsonl.", - ) - copy.add_argument("--rank-input", required=True, help="Deterministic rank input JSONL.") - copy.add_argument("--out", required=True, help="Output deep_review_input.jsonl path.") - - select = subparsers.add_parser( - "select-deep-review-input", - help="Create deep_review_input.jsonl from worker-produced rank_output.jsonl.", - ) - select.add_argument("--rank-output", required=True, help="Worker ranking output JSONL.") - select.add_argument("--out", required=True, help="Output deep_review_input.jsonl path.") - select.add_argument( - "--top-percent", - type=int, - default=100, - help="Percent of included files to keep for deep review.", - ) return parser.parse_args() @@ -299,17 +190,6 @@ return path_is_excluded(path) -def windows_stream_component(path: Path) -> str | None: - """Return the first NTFS alternate-data-stream component.""" - - if os.name != "nt": - return None - return next( - (component for component in path.parts if component != path.anchor and ":" in component), - None, - ) - - def resolve_scope( repo: Path, scope: str, @@ -362,14 +242,6 @@ handle.write("\n") -def write_json(output: Path, payload: dict[str, object]) -> None: - output.parent.mkdir(parents=True, exist_ok=True) - output.write_text( - json.dumps(payload, ensure_ascii=False, indent=2, sort_keys=True) + "\n", - encoding="utf-8", - ) - - def load_scopes_file(scopes_file: Path) -> list[str]: try: loaded: object = json.loads(scopes_file.read_text(encoding="utf-8")) @@ -384,82 +256,6 @@ return loaded -def load_jsonl(path: Path, label: str, validator: RowValidator) -> list[JsonRow]: - if not path.exists(): - raise SystemExit(f"{label} missing: {path}") - - rows: list[JsonRow] = [] - with path.open(encoding="utf-8") as handle: - for line_number, raw_line in enumerate(handle, start=1): - if not raw_line.strip(): - raise SystemExit(f"{path}:{line_number}: blank JSONL rows are not allowed") - try: - parsed: object = json.loads(raw_line) - except json.JSONDecodeError as exc: - raise SystemExit(f"{path}:{line_number}: invalid JSON: {exc.msg}") from exc - if not isinstance(parsed, dict): - raise SystemExit(f"{path}:{line_number}: expected a JSON object") - row = {str(key): value for key, value in parsed.items()} - validator(row, path, line_number) - rows.append(row) - return rows - - -def require_exact_fields(row: JsonRow, expected: set[str], path: Path, line_number: int) -> None: - actual = set(row) - if actual != expected: - missing = sorted(expected - actual) - unexpected = sorted(actual - expected) - details: list[str] = [] - if missing: - details.append(f"missing fields {missing}") - if unexpected: - details.append(f"unexpected fields {unexpected}") - raise SystemExit(f"{path}:{line_number}: {'; '.join(details)}") - - -def require_string( - row: JsonRow, field: str, path: Path, line_number: int, *, allow_empty: bool -) -> None: - value = row[field] - if not isinstance(value, str) or (not allow_empty and not value.strip()): - requirement = "a string" if allow_empty else "a non-empty string" - raise SystemExit(f"{path}:{line_number}: {field} must be {requirement}") - - -def validate_rank_input_row(row: JsonRow, path: Path, line_number: int) -> None: - require_exact_fields(row, {"path", "area", "preview"}, path, line_number) - require_string(row, "path", path, line_number, allow_empty=False) - require_string(row, "area", path, line_number, allow_empty=True) - require_string(row, "preview", path, line_number, allow_empty=True) - - -def validate_rank_output_row(row: JsonRow, path: Path, line_number: int) -> None: - require_exact_fields(row, {"path", "area", "score", "include", "reason"}, path, line_number) - require_string(row, "path", path, line_number, allow_empty=False) - require_string(row, "area", path, line_number, allow_empty=True) - score = row["score"] - if isinstance(score, bool) or not isinstance(score, int): - raise SystemExit(f"{path}:{line_number}: score must be an integer from 1 through 10") - if not 1 <= score <= 10: - raise SystemExit(f"{path}:{line_number}: score must be from 1 through 10") - if not isinstance(row["include"], bool): - raise SystemExit(f"{path}:{line_number}: include must be a boolean") - require_string(row, "reason", path, line_number, allow_empty=False) - - -def require_unique_paths(rows: list[JsonRow], label: str) -> None: - seen: set[str] = set() - duplicates: set[str] = set() - for row in rows: - path = str(row["path"]) - if path in seen: - duplicates.add(path) - seen.add(path) - if duplicates: - raise SystemExit(f"{label} contains duplicate paths: {sorted(duplicates)}") - - def make_repo_rank_input(args: argparse.Namespace) -> None: repo = Path(args.repo).expanduser().resolve() if not repo.is_dir(): @@ -542,8 +338,11 @@ "--hidden", "--no-require-git", "--null", + # Also exclude descendants when the scope starts inside .git. "--glob", - "!.git/**", + "!**/.git", + "--glob", + "!**/.git/**", "--", str(scope_path.relative_to(repo)), ] @@ -595,49 +394,17 @@ print(f"Wrote {len(rows)} scoped paths to {output}") -def bind_repo_scopes(args: argparse.Namespace) -> None: - scopes = load_scopes_file(Path(args.scopes_file).expanduser()) - manifest_path = Path(args.manifest).expanduser() - coverage_path = Path(args.coverage).expanduser() - try: - manifest: object = json.loads(manifest_path.read_text(encoding="utf-8")) - coverage: object = json.loads(coverage_path.read_text(encoding="utf-8")) - if not isinstance(manifest, dict) or not isinstance(coverage, dict): - raise ValueError("expected JSON objects") - scan = manifest.get("scan") - if not isinstance(scan, dict): - raise ValueError("manifest.scan must be an object") - scope = scan.get("scope") - if not isinstance(scope, dict): - raise ValueError("manifest.scan.scope must be an object") - except (OSError, UnicodeError, json.JSONDecodeError, ValueError) as exc: - raise SystemExit("Unable to bind requested scopes into the scan contract") from exc - scope["includePaths"] = scopes - coverage["includePaths"] = scopes - manifest_path.write_text( - json.dumps(manifest, ensure_ascii=True, indent=2) + "\n", encoding="utf-8" - ) - coverage_path.write_text( - json.dumps(coverage, ensure_ascii=True, indent=2) + "\n", encoding="utf-8" - ) - print(f"Bound {len(scopes)} requested scopes into the scan contract") - - def run_git_changed_paths(repo: Path, diff_args: list[str]) -> list[tuple[Path, str]]: - result = subprocess.run( - [ - "git", - "-C", - str(repo), - "diff", - "--name-status", - "-z", - "--diff-filter=ACMRD", - *diff_args, - ], - check=True, - capture_output=True, + result = git_command( + repo, + "diff", + "--name-status", + "-z", + "--diff-filter=ACMRD", + *diff_args, + text=False, ) + result.check_returncode() fields = result.stdout.split(b"\0") if fields and not fields[-1]: fields.pop() @@ -661,11 +428,15 @@ if mode == "local-patch": unstaged = run_git_changed_paths(repo, [base]) staged = run_git_changed_paths(repo, ["--cached", base]) - untracked = subprocess.run( - ["git", "-C", str(repo), "ls-files", "--others", "--exclude-standard", "-z"], - capture_output=True, - check=True, + untracked = git_command( + repo, + "ls-files", + "--others", + "--exclude-standard", + "-z", + text=False, ) + untracked.check_returncode() combined = dict(staged) combined.update(unstaged) combined.update( @@ -707,20 +478,21 @@ for path, status in changed: rel = path.relative_to(repo) - if status == "D": - preview = "" - elif args.mode == "revisions": + preview = "" + if status != "D" and args.mode == "revisions": content = revision_blobs[rel] if content is None: raise SystemExit( f"Unable to read committed diff blob: {args.head}:{rel.as_posix()}" ) - preview, is_binary = preview_for_bytes(rel, content, args.preview_bytes) + if is_binary_sample(content): + continue + preview, is_binary = preview_for_bytes( + rel, content[:DEFAULT_PREVIEW_READ_BYTES], args.preview_bytes + ) if is_binary: continue - elif path.is_symlink(): - preview = "" - elif path.is_file(): + elif status != "D" and not path.is_symlink() and path.is_file(): try: path.resolve(strict=True).relative_to(repo) except (OSError, ValueError): @@ -729,8 +501,6 @@ preview, is_binary = preview_for(path, args.preview_bytes) if is_binary: continue - else: - preview = "" rows.append({"path": rel.as_posix(), "area": args.area, "preview": preview}) rows.sort(key=lambda row: str(row["path"])) @@ -739,454 +509,14 @@ print(f"Wrote {len(rows)} rows to {output}") -def make_rank_shards(args: argparse.Namespace) -> None: - if args.max_rows < 1: - raise SystemExit("--max-rows must be at least 1") - - rank_input = Path(args.rank_input).expanduser() - rows = load_jsonl(rank_input, "Rank input", validate_rank_input_row) - require_unique_paths(rows, "Rank input") - - output_dir = Path(args.out_dir).expanduser() - output_dir.mkdir(parents=True, exist_ok=True) - existing = sorted((*output_dir.glob(SHARD_INPUT_GLOB), *output_dir.glob(SHARD_OUTPUT_GLOB))) - if existing: - raise SystemExit(f"Rank shard directory already contains shard files: {output_dir}") - - shard_count = 0 - for start in range(0, len(rows), args.max_rows): - shard_count += 1 - shard_path = output_dir / f"rank-shard-{shard_count:04d}.input.jsonl" - write_jsonl(shard_path, rows[start : start + args.max_rows]) - - print(f"Wrote {shard_count} rank shards to {output_dir}") - - -def discover_input_shards(shard_dir: Path) -> list[Path]: - if not shard_dir.is_dir(): - raise SystemExit(f"Rank shard directory missing: {shard_dir}") - - numbered_shards: list[tuple[int, Path]] = [] - for path in shard_dir.glob(SHARD_INPUT_GLOB): - match = SHARD_INPUT_PATTERN.fullmatch(path.name) - if match is None: - raise SystemExit(f"Rank input shard has invalid name: {path.name}") - numbered_shards.append((int(match.group(1)), path)) - numbered_shards.sort(key=lambda item: (item[0], item[1].name)) - input_shards = [path for _, path in numbered_shards] - expected_names = [ - f"rank-shard-{index:04d}.input.jsonl" for index in range(1, len(input_shards) + 1) - ] - actual_names = [path.name for path in input_shards] - if actual_names != expected_names: - raise SystemExit( - "Rank input shards must use contiguous canonical names; " - f"expected={expected_names}; actual={actual_names}" - ) - return input_shards - - -def output_name_for(input_name: str) -> str: - return input_name.replace(".input.jsonl", ".output.jsonl") - - -def require_plan_shard_dir(plan_path: Path, shard_dir: Path) -> None: - expected = plan_path.parent / "rank_shards" - if shard_dir.resolve() != expected.resolve(): - raise SystemExit( - "Rank shard directory must be the assignment plan's sibling rank_shards " - f"directory; expected={expected}; actual={shard_dir}" - ) - - -def require_no_misplaced_rank_shards(plan_path: Path) -> None: - misplaced = sorted( - ( - *plan_path.parent.glob(SHARD_INPUT_GLOB), - *plan_path.parent.glob(SHARD_OUTPUT_GLOB), - ), - key=lambda path: path.name, - ) - if misplaced: - raise SystemExit( - "Rank shard artifacts must be stored in the assignment plan's sibling " - f"rank_shards directory; misplaced={[path.name for path in misplaced]}" - ) - - -def make_rank_pool_plan(args: argparse.Namespace) -> None: - if args.usable_worker_slots < 1: - raise SystemExit("--usable-worker-slots must be at least 1") - - shard_dir = Path(args.shard_dir).expanduser() - output = Path(args.out).expanduser() - require_plan_shard_dir(output, shard_dir) - input_shards = discover_input_shards(shard_dir) - worker_count = min(len(input_shards), args.usable_worker_slots, RANK_POOL_WORKER_CAP) - workers: list[dict[str, object]] = [] - for worker_index in range(worker_count): - assigned_inputs = [path.name for path in input_shards[worker_index::worker_count]] - workers.append( - { - "slot": worker_index + 1, - "input_shards": assigned_inputs, - "output_shards": [output_name_for(name) for name in assigned_inputs], - } - ) - - plan: dict[str, object] = { - "schema_version": RANK_POOL_PLAN_SCHEMA_VERSION, - "strategy": RANK_POOL_STRATEGY, - "shard_count": len(input_shards), - "ranking_worker_count": worker_count, - "workers": workers, - } - write_json(output, plan) - print(f"Assigned {len(input_shards)} rank shards to {worker_count} ranking workers in {output}") - - -def load_rank_pool_plan(plan_path: Path) -> tuple[dict[str, object], bytes]: - if not plan_path.exists(): - raise SystemExit(f"Rank pool plan missing: {plan_path}") - plan_bytes = plan_path.read_bytes() - try: - payload: object = json.loads(plan_bytes) - except json.JSONDecodeError as exc: - raise SystemExit(f"{plan_path}: invalid JSON: {exc.msg}") from exc - if not isinstance(payload, dict): - raise SystemExit(f"{plan_path}: expected a JSON object") - return {str(key): value for key, value in payload.items()}, plan_bytes - - -def require_integer(value: object, label: str, *, minimum: int) -> int: - if isinstance(value, bool) or not isinstance(value, int) or value < minimum: - raise SystemExit(f"{label} must be an integer of at least {minimum}") - return value - - -def require_string_list(value: object, label: str) -> list[str]: - if not isinstance(value, list) or not value: - raise SystemExit(f"{label} must be a non-empty list") - if any(not isinstance(item, str) or not item for item in value): - raise SystemExit(f"{label} entries must be non-empty strings") - return [item for item in value if isinstance(item, str)] - - -def assignment_differences( - assigned_names: list[str], expected_names: list[str] -) -> tuple[list[str], list[str], list[str]]: - counts = Counter(assigned_names) - duplicates = sorted(name for name, count in counts.items() if count > 1) - assigned = set(assigned_names) - expected = set(expected_names) - return sorted(expected - assigned), duplicates, sorted(assigned - expected) - - -def validate_rank_pool_plan( - plan_path: Path, shard_dir: Path -) -> tuple[list[Path], list[str], list[RankWorkerAssignment], bytes]: - require_plan_shard_dir(plan_path, shard_dir) - require_no_misplaced_rank_shards(plan_path) - input_shards = discover_input_shards(shard_dir) - input_names = [path.name for path in input_shards] - output_names = [output_name_for(name) for name in input_names] - plan, plan_bytes = load_rank_pool_plan(plan_path) - expected_fields = { - "schema_version", - "strategy", - "shard_count", - "ranking_worker_count", - "workers", - } - actual_fields = set(plan) - if actual_fields != expected_fields: - raise SystemExit( - f"{plan_path}: rank pool plan fields do not match schema; " - f"missing={sorted(expected_fields - actual_fields)}; " - f"unexpected={sorted(actual_fields - expected_fields)}" - ) - schema_version = require_integer( - plan["schema_version"], f"{plan_path}: schema_version", minimum=1 - ) - if schema_version != RANK_POOL_PLAN_SCHEMA_VERSION: - raise SystemExit(f"{plan_path}: schema_version must be {RANK_POOL_PLAN_SCHEMA_VERSION}") - if plan["strategy"] != RANK_POOL_STRATEGY: - raise SystemExit(f"{plan_path}: strategy must be {RANK_POOL_STRATEGY}") - - shard_count = require_integer(plan["shard_count"], f"{plan_path}: shard_count", minimum=0) - if shard_count != len(input_shards): - raise SystemExit( - f"{plan_path}: shard_count does not match input shards; " - f"plan={shard_count}; actual={len(input_shards)}" - ) - worker_count = require_integer( - plan["ranking_worker_count"], f"{plan_path}: ranking_worker_count", minimum=0 - ) - if shard_count > 0 and worker_count == 0: - raise SystemExit( - f"{plan_path}: ranking_worker_count must be at least 1 when input shards exist" - ) - if worker_count > shard_count: - raise SystemExit(f"{plan_path}: ranking_worker_count cannot exceed shard_count") - if worker_count > RANK_POOL_WORKER_CAP: - raise SystemExit(f"{plan_path}: ranking_worker_count cannot exceed {RANK_POOL_WORKER_CAP}") - - workers = plan["workers"] - if not isinstance(workers, list) or len(workers) != worker_count: - raise SystemExit( - f"{plan_path}: workers must contain exactly {worker_count} worker assignments" - ) - - assigned_inputs: list[str] = [] - assigned_outputs: list[str] = [] - parsed_workers: list[RankWorkerAssignment] = [] - worker_fields = {"slot", "input_shards", "output_shards"} - for worker_index, raw_worker in enumerate(workers): - label = f"{plan_path}: workers[{worker_index}]" - if not isinstance(raw_worker, dict): - raise SystemExit(f"{label} must be a JSON object") - worker = {str(key): value for key, value in raw_worker.items()} - if set(worker) != worker_fields: - raise SystemExit( - f"{label} fields do not match schema; " - f"missing={sorted(worker_fields - set(worker))}; " - f"unexpected={sorted(set(worker) - worker_fields)}" - ) - slot = require_integer(worker["slot"], f"{label}.slot", minimum=1) - if slot != worker_index + 1: - raise SystemExit(f"{label}.slot must be {worker_index + 1}") - worker_inputs = require_string_list(worker["input_shards"], f"{label}.input_shards") - worker_outputs = require_string_list(worker["output_shards"], f"{label}.output_shards") - if len(worker_inputs) != len(worker_outputs): - raise SystemExit(f"{label} input_shards and output_shards lengths must match") - expected_worker_outputs = [output_name_for(name) for name in worker_inputs] - if worker_outputs != expected_worker_outputs: - raise SystemExit(f"{label}.output_shards do not match its input_shards") - assigned_inputs.extend(worker_inputs) - assigned_outputs.extend(worker_outputs) - parsed_workers.append((slot, worker_inputs, worker_outputs)) - - missing, duplicates, unexpected = assignment_differences(assigned_inputs, input_names) - if missing or duplicates or unexpected: - raise SystemExit( - f"{plan_path}: pool plan must assign each input shard exactly once; " - f"missing={missing}; duplicates={duplicates}; unexpected={unexpected}" - ) - missing, duplicates, unexpected = assignment_differences(assigned_outputs, output_names) - if missing or duplicates or unexpected: - raise SystemExit( - f"{plan_path}: pool plan must assign each output shard exactly once; " - f"missing={missing}; duplicates={duplicates}; unexpected={unexpected}" - ) - - for worker_index, (_, worker_inputs, worker_outputs) in enumerate(parsed_workers): - expected_inputs = input_names[worker_index::worker_count] - expected_outputs = output_names[worker_index::worker_count] - if worker_inputs != expected_inputs or worker_outputs != expected_outputs: - raise SystemExit( - f"{plan_path}: worker slot {worker_index + 1} does not match the deterministic " - f"{RANK_POOL_STRATEGY} assignment" - ) - return input_shards, output_names, parsed_workers, plan_bytes - - -def validate_rank_worker_command(args: argparse.Namespace) -> None: - plan_path = Path(args.plan).expanduser() - shard_dir = Path(args.shard_dir).expanduser() - _, _, workers, plan_bytes = validate_rank_pool_plan(plan_path, shard_dir) - - slot = require_integer(args.slot, "--slot", minimum=1) - worker_count = len(workers) - if slot > worker_count: - raise SystemExit(f"--slot must be at most {worker_count}") - - assigned_slot, input_names, output_names = workers[slot - 1] - if assigned_slot != slot: - raise SystemExit(f"{plan_path}: worker assignment for slot {slot} is inconsistent") - - row_count = 0 - outputs_digest = hashlib.sha256() - for input_name, output_name in zip(input_names, output_names, strict=True): - input_shard = shard_dir / input_name - output_shard = shard_dir / output_name - _, output_rows = validate_rank_shard(input_shard, output_shard) - output_bytes = output_shard.read_bytes() - row_count += len(output_rows) - outputs_digest.update(output_name.encode("utf-8")) - outputs_digest.update(b"\0") - outputs_digest.update(output_bytes) - outputs_digest.update(b"\0") - - receipt: dict[str, object] = { - "schema_version": 1, - "plan_sha256": hashlib.sha256(plan_bytes).hexdigest(), - "slot": slot, - "ranking_worker_count": worker_count, - "output_shards": len(output_names), - "rows": row_count, - "outputs_sha256": outputs_digest.hexdigest(), - "status": "complete", - } - print("RANK_WORKER_RECEIPT " + json.dumps(receipt, sort_keys=True, separators=(",", ":"))) - - -def validate_rank_pool_command(args: argparse.Namespace) -> None: - plan_path = Path(args.plan).expanduser() - shard_dir = Path(args.shard_dir).expanduser() - input_shards, expected_output_names, workers, _ = validate_rank_pool_plan(plan_path, shard_dir) - - actual_output_names = {path.name for path in shard_dir.glob(SHARD_OUTPUT_GLOB)} - expected_outputs = set(expected_output_names) - if actual_output_names != expected_outputs: - missing = sorted(expected_outputs - actual_output_names) - unexpected = sorted(actual_output_names - expected_outputs) - raise SystemExit( - "Rank pool outputs are incomplete; " - f"missing output shards={missing}; unexpected output shards={unexpected}" - ) - - row_count = 0 - for input_shard in input_shards: - output_shard = input_shard.with_name(output_name_for(input_shard.name)) - _, shard_outputs = validate_rank_shard(input_shard, output_shard) - row_count += len(shard_outputs) - print( - f"Validated {len(workers)} ranking workers, " - f"{len(input_shards)} shards, and {row_count} ranking rows" - ) - - -def validate_rank_shard( - input_shard: Path, output_shard: Path -) -> tuple[list[JsonRow], list[JsonRow]]: - shard_inputs = load_jsonl(input_shard, "Rank input shard", validate_rank_input_row) - require_unique_paths(shard_inputs, f"Rank input shard {input_shard.name}") - shard_outputs = load_jsonl(output_shard, "Rank output shard", validate_rank_output_row) - require_unique_paths(shard_outputs, f"Rank output shard {output_shard.name}") - - expected_paths = {str(row["path"]) for row in shard_inputs} - actual_paths = {str(row["path"]) for row in shard_outputs} - if expected_paths != actual_paths: - missing = sorted(expected_paths - actual_paths) - unknown = sorted(actual_paths - expected_paths) - raise SystemExit( - f"{output_shard}: paths do not match its input shard; " - f"missing={missing}; unknown={unknown}" - ) - - area_by_path = {str(row["path"]): row["area"] for row in shard_inputs} - for row in shard_outputs: - row_path = str(row["path"]) - if row["area"] != area_by_path[row_path]: - raise SystemExit(f"{output_shard}: area does not match rank input for {row_path}") - return shard_inputs, shard_outputs - - -def validate_rank_shard_command(args: argparse.Namespace) -> None: - input_shard = Path(args.input).expanduser() - output_shard = Path(args.output).expanduser() - _, output_rows = validate_rank_shard(input_shard, output_shard) - print(f"Validated {len(output_rows)} ranking rows in {output_shard}") - - -def merge_rank_outputs(args: argparse.Namespace) -> None: - rank_input = Path(args.rank_input).expanduser() - authoritative_rows = load_jsonl(rank_input, "Rank input", validate_rank_input_row) - require_unique_paths(authoritative_rows, "Rank input") - - shard_dir = Path(args.shard_dir).expanduser() - input_shards = discover_input_shards(shard_dir) - output_shards = sorted(shard_dir.glob(SHARD_OUTPUT_GLOB)) - expected_output_names = { - path.name.replace(".input.jsonl", ".output.jsonl") for path in input_shards - } - actual_output_names = {path.name for path in output_shards} - if expected_output_names != actual_output_names: - missing = sorted(expected_output_names - actual_output_names) - unexpected = sorted(actual_output_names - expected_output_names) - details: list[str] = [] - if missing: - details.append(f"missing output shards {missing}") - if unexpected: - details.append(f"unexpected output shards {unexpected}") - raise SystemExit(f"Rank shard outputs are incomplete: {'; '.join(details)}") - - sharded_inputs: list[JsonRow] = [] - output_by_path: dict[str, JsonRow] = {} - for input_shard in input_shards: - output_shard = input_shard.with_name( - input_shard.name.replace(".input.jsonl", ".output.jsonl") - ) - shard_inputs, shard_outputs = validate_rank_shard(input_shard, output_shard) - sharded_inputs.extend(shard_inputs) - for row in shard_outputs: - row_path = str(row["path"]) - if row_path in output_by_path: - raise SystemExit(f"Rank outputs contain duplicate path: {row_path}") - output_by_path[row_path] = row - - if sharded_inputs != authoritative_rows: - raise SystemExit("Rank input shards do not exactly partition the authoritative rank input") - - merged = [output_by_path[str(row["path"])] for row in authoritative_rows] - output = Path(args.out).expanduser() - write_jsonl(output, merged) - print(f"Merged {len(merged)} ranking rows into {output}") - - -def copy_deep_review_input(args: argparse.Namespace) -> None: - rank_input = Path(args.rank_input).expanduser() - rows = load_jsonl(rank_input, "Rank input", validate_rank_input_row) - require_unique_paths(rows, "Rank input") - selected = [{"path": row["path"], "area": row["area"]} for row in rows] - - output = Path(args.out).expanduser() - write_jsonl(output, selected) - print(f"Copied {len(selected)} rows into {output}") - - -def select_deep_review_input(args: argparse.Namespace) -> None: - rank_output = Path(args.rank_output).expanduser() - rows = load_jsonl(rank_output, "Rank output", validate_rank_output_row) - require_unique_paths(rows, "Rank output") - - included = [row for row in rows if row["include"]] - base_rows = included if included else rows - base_rows.sort(key=lambda row: (-int(row["score"]), str(row["path"]))) - keep = max(1, int(len(base_rows) * (args.top_percent / 100.0))) if base_rows else 0 - selected = [{"path": row["path"], "area": row["area"]} for row in base_rows[:keep]] - - output = Path(args.out).expanduser() - write_jsonl(output, selected) - print(f"Selected {len(selected)} of {len(base_rows)} rows into {output}") - - def main() -> None: args = parse_args() if args.command == "make-repo-rank-input": make_repo_rank_input(args) elif args.command == "make-repo-scope-input": make_repo_scope_input(args) - elif args.command == "bind-repo-scopes": - bind_repo_scopes(args) elif args.command == "make-diff-rank-input": make_diff_rank_input(args) - elif args.command == "make-rank-shards": - make_rank_shards(args) - elif args.command == "make-rank-pool-plan": - make_rank_pool_plan(args) - elif args.command == "validate-rank-shard": - validate_rank_shard_command(args) - elif args.command == "validate-rank-worker": - validate_rank_worker_command(args) - elif args.command == "validate-rank-pool": - validate_rank_pool_command(args) - elif args.command == "merge-rank-outputs": - merge_rank_outputs(args) - elif args.command == "copy-deep-review-input": - copy_deep_review_input(args) - elif args.command == "select-deep-review-input": - select_deep_review_input(args) else: raise SystemExit(f"Unknown command: {args.command}")
Full technical diff · 148 changed fields
changed /files/.app.json/sha256
"e4d5b22326ee380de5d779f7b5ba590c8d1bee9a80e8869fb2bd7f4def8e974d"
"a7bbe314059c7311e169474823e3978f267e560c3e961ba49fb94032da9843fe"
changed /files/.app.json/size
480
479
changed /files/.codex-plugin~1plugin.json/sha256
"3ddcc187fe2f1aff961bf55444e70bfbc3f825b6185ab3f29860d1a813a395f9"
"527d1a0db286884729572d400b0ad9b0ff852d4a12b36228ff5fbef180f7de9d"
changed /files/.mcp.json/sha256
"40b84baf510169eadfd5f0fe0ad95001caedb7bc662d77c9ac2a4fbec7dd0845"
"7c5968060f6e848859ce02450d6e02e67029d8d39011bbda1059b19de6309ebf"
changed /files/.mcp.json/size
1649
1679
changed /files/examples~1completed-scan~1report.md/sha256
"c2083b2f763ed5ddcee4524ee01025c9b8996e1e9740263d751494b7a61fe82e"
"83b7c709c0b49d1500b52e61a88ea70b8423ebebec38308b1294cf094838b66f"
changed /files/examples~1completed-scan~1report.md/size
2945
4116
changed /files/integrity.json/sha256
"d8f7683d4ed54915958087c1532c15a0eb0e87db1424addea133794979b609cc"
"6b342df66fb9b5ce7fc8c9de0e974b59d21340cdc06167df46d1a19bd4ea9441"
changed /files/integrity.json/size
17616
17465
changed /files/mcp~1helpers.mjs.br.part-000/sha256
"a771236cf650b155f4afc89169897ca199bafaa673187b781904df8bee8af96a"
"6299f73c92c4f924bffc6b1bed001480603473967006b3e75941bc49a21f18d5"
changed /files/mcp~1helpers.mjs.br.part-000/size
6539
63398
changed /files/mcp~1native~1THIRD_PARTY_NOTICES.txt/sha256
"bcb3277e216ef458f18b80ddf97e1b7c2827e920a2c432077ff6f7d060281445"
"16ac63908855f5bb7eab864923cc1855b406bd7051dfcd70d7e69684f6c69955"
changed /files/mcp~1native~1darwin-arm64~1unix.node/sha256
"1895d5afd007ce02210075683413be6088ea20af8a8608a42ac82b7d9bf90181"
"093e87d8de3d2676fc9a2a1430f571bf4fc970b2bbef4c7ded0bf8924e45f473"
changed /files/mcp~1native~1darwin-arm64~1unix.node/size
371616
354352
changed /files/mcp~1native~1darwin-x64~1unix.node/sha256
"94aba646f50e669b873b44f78512886dcf78be87a13feb95471e687fdc1f9f91"
"57c45d212d35ce7599afc7b9b21693e18443753231bad1fb5146a4e224db68ec"
changed /files/mcp~1native~1darwin-x64~1unix.node/size
364544
343296
changed /files/mcp~1native~1linux-arm64-gnu~1unix.node/sha256
"bd89532fbd21d251d9c645d6026864b0a08b16565bedb018e627e459cae0ddef"
"6b352aaaac21f9ad9b772481429ba7bc8433a0e44ca5ffe433ad47289c3007f6"
changed /files/mcp~1native~1linux-arm64-gnu~1unix.node/size
465648
465088
changed /files/mcp~1native~1linux-arm64-musl~1unix.node/sha256
"65475c3deb4ed355739ad7395e39204f5ffcc945c61b2e42ca357560de3fe7de"
"3a55ec4f42202c58a29654701c31a8deab386969d14e2ab85f23e81345b4fedb"
changed /files/mcp~1native~1linux-arm64-musl~1unix.node/size
397992
332456
changed /files/mcp~1native~1linux-x64-gnu~1unix.node/sha256
"d19c3d41b2993543a1296dc38d2183df4a947349b45f3c43618c4ecde74e3cac"
"ed2061078400010852a9f8d3ecdf7bc0a008d13adc9e9d5c6954f5cb686a2a2a"
changed /files/mcp~1native~1linux-x64-gnu~1unix.node/size
386424
365352
changed /files/mcp~1native~1linux-x64-musl~1unix.node/sha256
"46fa397234fad923a2e325f80e2a833ba48c79b32bbb7f0452fb7f0791de5d5e"
"c2e4c07ac6dde175464c6315937652465b200e5f28590898663523beaf4e9ab6"
changed /files/mcp~1native~1linux-x64-musl~1unix.node/size
385688
369304
changed /files/mcp~1native~1win32-arm64~1windows.node/sha256
"df8dd512fd8d92a8af3fede3f00a235732f847c6f3da91a2b9a702650ddd7439"
"19f78e88fd8934038201c26b044123bc05db74f5d7065df10a32583ccbcf7a55"
changed /files/mcp~1native~1win32-arm64~1windows.node/size
460800
419840
changed /files/mcp~1native~1win32-x64~1windows.node/sha256
"f961856d20361508fa3b5ad05a4fb04f07d0dff4d7b60f3cfc377467b518c17b"
"5aed21edb5fe06efac49d9bd3899d6242f60b1bfac2b710b967a76c924d98298"
changed /files/mcp~1native~1win32-x64~1windows.node/size
496128
453120
changed /files/mcp~1server.mjs.br.part-000/sha256
"0259e86ae3ceb3c555521d959fd9cddb0d67e2921fc1db9fd27a55d849a48806"
"7ef9c7387b405b51e2aec793a86696bf793506a8f34155199035aa515b3a415a"
changed /files/mcp~1server.mjs.br.part-001/sha256
"3c6c93cd01ac739436e91ffe2685c5267672cf18794dbe1b19ac1ac5f93d421f"
"94d6412009e284ecbc17bd14d07e0116d8e74e572a62198912ac5a03f95a50c2"
changed /files/mcp~1server.mjs.br.part-001/size
122535
126028
changed /files/references~1artifact-storage.md/sha256
"851076fcdc93c7adb87f3e26ff103c5546b875e2bc08ddb676fbbca0827899b1"
"ccce9c76f5d044fbce333d6129fbb55eb63f512c15c2ebeeca405e296f38325b"
changed /files/references~1artifact-storage.md/size
6975
7632
changed /files/references~1config-preflight.md/sha256
"6ba05681c8d94968842fc98553b58b8fc5f1ea3da45834a41dd60179c8bbb9f3"
"5894f9fd7efcae7034404a2c062ee3d7417520753be16ddcdb3acf5b884f048d"
changed /files/references~1config-preflight.md/size
18881
19162
changed /files/references~1core-scan.md/sha256
"77b082eb8613cf93427ff730e4ae5d85b0a0dca37c02a8af1ea69f679ac3d1d9"
"9c0eca53147383a89cd345eac7791ea75b954f7f083448ef25019d8f9ba30afe"
changed /files/references~1core-scan.md/size
19422
22978
changed /files/references~1final-report.md/sha256
"9fe5a42b37964def3a8394449c3502e8b6ee50b8f85e6525313e23ba2dcd5040"
"9c34375584c8ae76959b0eae038b86b2b8ed7874517c249fcae8715314c76298"
changed /files/references~1final-report.md/size
29052
29931
changed /files/references~1scan-artifacts.md/sha256
"d8d416b359b9a46bd3d9cf9fb487d1ff2dc6eb32dc26e93ab47de7b1d240f479"
"eecdccac30b8ad65bb702dc9ac8d9718dcb0b95532a94a61195268d22bdf504b"
changed /files/references~1scan-artifacts.md/size
10800
11243
changed /files/references~1scan-contract.md/sha256
"8a84ca15feef973044bfe619b4e586bf9323b9cbc2f386b961138c76ebd6d189"
"b362636c29d1e8b18053481abe2f97d7bb099a97040f5b63aa2702a41c1d62c8"
changed /files/references~1scan-contract.md/size
14043
14537
changed /files/references~1threat-model.md/sha256
"f53d10c617d45d671e7cb15408f87c4f36b29026e2a6a59d1457881780b6818a"
"f3dd2d05d7f0c61b13d29a78e810b367772fe22d5ac58adbbc00080a9495706e"
changed /files/references~1threat-model.md/size
14690
15203
changed /files/schemas~1coverage.schema.json/sha256
"7964b132998ca4dcdd19c75f5d92483e1d44cb71462237709b968ec548c10652"
"6ac14e659e884e9582d8bd9ba480f6364ca17309e1a3dee9469ab025a3380b11"
changed /files/schemas~1coverage.schema.json/size
4670
5198
changed /files/schemas~1scan-manifest.schema.json/sha256
"265a48629113f77cd65a3127f1f7e95d3c39ae60e868685837a6aa31d4133310"
"c621d4136ac81741ac8da1960c7f5e92ade22c0b5490e378ea4339b09e45b6f3"
changed /files/schemas~1scan-manifest.schema.json/size
8048
9513
changed /files/schemas~1tools~1scan-draft.schema.json/sha256
"d5970c06e2ec00d1da5b0e84b677244f32046fd99c81901e608b7974b9ab0d89"
"151f9dffc83e1c5b4f0a7fba20b90fb3196fdaa9719180eb0009ba2b50f75d48"
changed /files/schemas~1tools~1scan-draft.schema.json/size
21535
23475
changed /files/scripts~1config_preflight.py/sha256
"37b9f4cee4c4dddade0e8599ea8df19aee29a99bd1be956b553ab46c3b63d407"
"f4d4103650977d078b71f49da6b1e287b6db2f2b7b5fb08e943722a6d869354e"
changed /files/scripts~1config_preflight.py/size
35211
35176
changed /files/scripts~1deep_scan_workbench.py/sha256
"c659739775e192dee0f90a42549a1763fb95228fb5fd17579812ab454bfc7d21"
"5012b337503f44e086fbf021be9db8340f8ba992fe5169c5534752e900947cf5"
changed /files/scripts~1deep_scan_workbench.py/size
88194
84709
changed /files/scripts~1filesystem_identity.py/sha256
"2b3a22761f28faa2f45f192ff14b17fd80f1f43d9d4174007c51d21f4cbf47c1"
"5298f2012b6e48ab1106837a5440ef2b3966383e2321507a47593010bb4dd01f"
changed /files/scripts~1filesystem_identity.py/size
926
893
changed /files/scripts~1finalize_scan_contract.py/sha256
"7f191c50ded50600b0a70be1e11b724f0355f166a690312226990d88e895d159"
"3fa92d8e2ccadb032cf458f0fde444785e8ee5ced0abe6346c285b07ef153e27"
changed /files/scripts~1finalize_scan_contract.py/size
121437
133770
changed /files/scripts~1finding_preview.py/sha256
"0df185e83a55cfcd9da151054de32b04e8f0bc0ceee3a2d9269d0d119fc12854"
"ebdf8e7b7e465c0937e73e945e3593d659b2f15ff1db08d0b4a2d3b106174c4d"
changed /files/scripts~1finding_preview.py/size
15968
16089
changed /files/scripts~1generate_in_scope_files.py/sha256
"e59583c111b4f3edd3f57e114bfb7f62a7dbad8424b4851bdfd23a8219336806"
"0b420d786b17e4f91451b5b686fdb4d6beee3913eebb952f8fcbf220aec6230e"
changed /files/scripts~1generate_in_scope_files.py/size
11801
11646
changed /files/scripts~1generate_rank_input.py/sha256
"0c0ead74ae98b4adfbd6a2eacb91ea492b11e60434c4259ae36213c0ddc5f3f8"
"e7c0bddbdb7e9236f7431d84b86be4c3fc202daa8d1306d6baa930110635b671"
changed /files/scripts~1generate_rank_input.py/size
47421
17899
changed /files/scripts~1launch_codex_security_mcp/sha256
"b82af11478dc85f666b6ec0919c53034dd287c29ffcb1af7e5debbb425618c5d"
"56794e736a1e8f588f9959a2e707ea3ed9bc7d4d2b796c132e91d5fbed59e600"
changed /files/scripts~1launch_codex_security_mcp/size
1228
1793
removed /files/scripts~1normalize_candidates.py
{
"sha256": "8da9b66deec6320a3e55c033a097480bedd340f0442b31077999a2e2d82e851e",
"size": 13136
}Field is absent
changed /files/scripts~1rank_preview.py/sha256
"013885da19308feeb0bcea8968097ba8eee8b063b23a6ca5af8a7269ca777afa"
"627d0b89c9d4436162ab9bcb80f7aa562605695e784dc612307c7eda6fef3a7f"
changed /files/scripts~1rank_preview.py/size
34987
34726
changed /files/scripts~1report_projection.py/sha256
"474de8e927442b1c5c7fc4adb5addd98906ae86db05da1aa20bd54ad5fca48fb"
"1b24978a3cdb3c336ac27a2b39fb35457bade13a4aad0782710fe38ac39965cf"
changed /files/scripts~1report_projection.py/size
41587
41098
changed /files/scripts~1snapshot_sqlite.py/sha256
"a501b0f4b6656f4f9b6a389835e73f0d8105051191646b64af4268f0d4a3eaee"
"9e0be851702f0962070ece6e0e2959e3955fc99126f68452d175fc22bc38423b"
changed /files/scripts~1snapshot_sqlite.py/size
852
1084
added /files/scripts~1threat_model_projection.py
Field was absent
{
"sha256": "32e4d5cd370a49cdc5658c3ded3d4d63ba7f41a44b34b67da87321048d088111",
"size": 6711
}changed /files/scripts~1windows_scan_local_files.py/sha256
"3034ec0b2e5d29fb8edbbd7237b91b1063b0245cdc546d85209129fef1ab2fbf"
"c26276695435d134c1354048c3c74c3c6b0ed203158a93b63b67ef0b6bfab843"
changed /files/scripts~1windows_scan_local_files.py/size
24480
24919
changed /files/scripts~1workbench~1storage.py/sha256
"973275d28c851b1b8408f7ac59e89a2a68057f2aecb4831e6aa2396c83a39e6d"
"5e389073520fb7668defd433228befd9e7b9c8309c1b6024bffd6213d59f1d88"
changed /files/scripts~1workbench~1storage.py/size
608
973
changed /files/scripts~1workbench_cli.py/sha256
"74752d032261afd831876d774724b150b35d6c8f0a3f70574c5c8ddad20f31b3"
"959e951fa5daf326049ee61bd0773999be92600b65a9062e56b4f62fc4e2aa55"
changed /files/scripts~1workbench_cli.py/size
21184
21260
changed /files/scripts~1workbench_constants.py/sha256
"06548d28c6d66b99f6c11f63918101c6cce39df6346fc6c5e977b9d09cd2a950"
"0ff12b11b2ae9f71c1de6cff0afc234b035379bb1193f1ca9a56ddeb7aa32cf7"
changed /files/scripts~1workbench_constants.py/size
2261
2187
changed /files/scripts~1workbench_db.py/sha256
"01d7d27013f24cf26cbca4a6e2331d7eb1bd0afc5e570c44376cd3e2e4fd5cb7"
"94bf11d7d74202ae7efbdd4f70a036393d4ba013ffc2ada44172a59be41f97f2"
changed /files/scripts~1workbench_db.py/size
149800
146186
changed /files/scripts~1workbench_finding_index.py/sha256
"410f4c2fb2bd063130e945d06aad63582b6a3e6fed9c448dcf740d85a6c3ce78"
"4618f994786fa2300e78592fa2868bc0a585368127027c1940a0e504b0254265"
changed /files/scripts~1workbench_finding_index.py/size
4191
3938
changed /files/scripts~1workbench_native_indexes.py/sha256
"0ada4190b7050fde77c3f04a8f36b1f6479da368aa1ed39c9587ce23645ba468"
"114dbf1e4050302948c4b8f24d69454f127d128e3bc35e34a5f3ec9dd3b187cd"
changed /files/scripts~1workbench_native_indexes.py/size
9984
9870
changed /files/scripts~1workbench_progress.py/sha256
"d106181710b59c3cd2d66a26d4a4556741d02d606999224a36cfb09771092a6e"
"42c7d0b8b4d253095e1062922cd9e59b10b966ac314bef092cb78cad2217b967"
changed /files/scripts~1workbench_progress.py/size
13897
13296
changed /files/scripts~1workbench_publication.py/sha256
"7813a522da6924e065a5a517efc54e80529c686773d084297f760e405b1cecd5"
"9312a2962b797ed355d6b05fb375da6325aeb5c5ead5d52f2fb7114ef3ad9635"
changed /files/scripts~1workbench_publication.py/size
20574
20346
changed /files/scripts~1workbench_remediation.py/sha256
"d0c7a4b3a283aea128802b4c1a4295580bc2ebd83c6c7108eb1ce288aaa20017"
"96585805c4956917bb473c3b60493a3c15daa2028b074b756e36358a9ac76525"
changed /files/scripts~1workbench_remediation.py/size
7815
7281
changed /files/scripts~1workbench_saved_results.py/sha256
"db445b651bd677359ef0a5c2bbb70e896eccd60becbd80e8c7a77aa3010f289c"
"436b23a4d169006437985bb352bfd792da9e465c4c7506dce31bfd5e78524c6d"
changed /files/scripts~1workbench_saved_results.py/size
72501
119202
changed /files/scripts~1workbench_scan_start.py/sha256
"8ce5f6e6d34670026f50da234c881074bd4864f41c9c574f6b2232ef968c7b1e"
"647e54ce40a7dc5b17d6abe547406f22ca0cb4eee628938b4c21629eb8e73c35"
changed /files/scripts~1workbench_scan_start.py/size
8210
7963
changed /files/scripts~1workbench_scan_usage.py/sha256
"4fb61d682ba05839ad57d33a8a2c9a9ffaa51ea7721c2cc7d629d2d687e2607a"
"21d845f8967c9206351e54f94fd2b4bbfe834434e35b642992d7a829b76cd94e"
changed /files/scripts~1workbench_scan_usage.py/size
22317
22094
changed /files/scripts~1workbench_schema.py/sha256
"6a382c792b39c0a41118a2d4325b967f3cb0dca2a2e6e84411e4e72a675372e7"
"25ef8550ded14785fa47b19f1fa358422d8883affc94641c84e68c172e800cc0"
changed /files/scripts~1workbench_schema.py/size
58474
51783
changed /files/scripts~1workbench_severity.py/sha256
"6313c3302a40504e8b1ebaabcc081bdcbbb97c9b348a7d63c381ea04042e898d"
"ec74f540595e8052e295846303f31988329e0dc68fcebdd92572673555b1c99d"
changed /files/scripts~1workbench_severity.py/size
4489
4625
changed /files/scripts~1workbench_source_excerpt.py/sha256
"0cd15d26c3a1feadf1858d1be25f9703ad09307ab1ecfb866260b8c1991cf74e"
"5681d4a5c547404f687c644f54432c10e0770b6ba4c1e6be321664579a252a24"
changed /files/scripts~1workbench_source_excerpt.py/size
2989
3210
changed /files/scripts~1workbench_target.py/sha256
"bc21dc8cb392a5639d787fde956f6b4d2769bf9c3f1cb805f164557df787563c"
"08ed149295b9347ac37f2b8523c822a35f165283422c7644dabecfa236b81b72"
changed /files/scripts~1workbench_target.py/size
28827
32451
changed /files/scripts~1workbench_target_state.py/sha256
"f48897fb7937e7474126dc88f85bcc359a1a99fb845a77f5d896dbe8b506b45a"
"9c133f67397ab4b90ce1275edc09a7e6d05900236209bc72e8f113b9f0cde287"
changed /files/scripts~1workbench_target_state.py/size
1953
1920
changed /files/scripts~1workbench_validation.py/sha256
"3cc29fc7a342dc9b55976c37c641c1e7a2abf91625fb9abfb1165a59e251ad29"
"11259b8ce1e135c5a86677964f29e6331e65e5fd80a1931c80f7fac507cccb13"
changed /files/scripts~1workbench_validation.py/size
6773
6547
changed /files/skills~1assess-patch-risk~1SKILL.md/sha256
"b7337a909fe0ea7f3b203178df60161ea42236405c0bb8697d43ec5736be744b"
"c3b62a8c1d6135945a055134f50329047bb908972fc7b320a592edbc3d38b419"
changed /files/skills~1assess-patch-risk~1SKILL.md/size
8679
9511
removed /files/skills~1assess-patch-risk~1scripts~1validate_patch_risk_assessment.py
{
"sha256": "b57a804b1e30c94ed01d5a3a36f8a31b15a6e3b9f751a41c5ade07ff35019d77",
"size": 6645
}Field is absent
changed /files/skills~1attack-path-analysis~1SKILL.md/sha256
"9f9f45603c68a1e796d8151b3373842aa7e89f0e1dc8e985f7ab1bb342547444"
"9465d2750182acbf6dd8f61e60bb47dc1ca502be5cc3f4a71da7ad39935d1eb1"
changed /files/skills~1attack-path-analysis~1SKILL.md/size
8567
8568
changed /files/skills~1deep-security-scan~1SKILL.md/sha256
"e3e758d1a6b96b42453fc631b58e04e851cec71318b18d53e2d1c344f6edc4db"
"d6aed0d9b47065a1384a96d0a45c843b0cda8ba48e3d2cbe96c65357c6e55ee3"
changed /files/skills~1deep-security-scan~1SKILL.md/size
13815
14096
changed /files/skills~1finding-discovery~1SKILL.md/sha256
"1d3a159a5ed83722ddf7369dad9f7788e283454a8ee963cef35ccd8102ea8b0e"
"14cc797e750ca4bdd8b060c4cf96d7d32f25b132aa8f80d0a0837683fe010790"
changed /files/skills~1finding-discovery~1SKILL.md/size
25450
25598
changed /files/skills~1propose-security-hardening~1references~1proposal-format.md/sha256
"6c0000722629098365afbf6809c3402121f90438600fb574fbc2c77aeb649ba4"
"72b93c32f1cbe7d25a3d347d0894e7b642942e68f2d8a3c0409bc398a41b06e7"
changed /files/skills~1propose-security-hardening~1references~1proposal-format.md/size
25476
25933
changed /files/skills~1security-diff-scan~1SKILL.md/sha256
"0a4c519ad713585876ea7eb0a8af4b59892c86746f4c69851db9ab347b7fad2f"
"f85962d46f141227d794a25253a39232bc4e1ad756509ecd3d8769b85b735136"
changed /files/skills~1security-diff-scan~1SKILL.md/size
5449
6102
changed /files/skills~1security-scan~1SKILL.md/sha256
"5b8f5d7debeca14c6b37e8e7ba737671362b8eb4b7f49e693c99c6bd04bc8fa0"
"104e2f93fc965c34e91970f517a89e330d5b29dbb243dcea5d95d83f14d135cf"
changed /files/skills~1security-scan~1SKILL.md/size
6975
9007
changed /files/skills~1security-scan~1references~1desktop-scan.md/sha256
"fc20c0a72913cf88f99879091c5b64e4161a42670e84bff29b629210006cd860"
"62a3b3baac5773c36eb291c74c0304dd97157aff5b89dd56fa8b0fed08803389"
changed /files/skills~1security-scan~1references~1desktop-scan.md/size
4428
4747
changed /files/skills~1security-scan~1references~1scan-artifacts-and-ledger.md/sha256
"443084c974eb80747a6dc4e092c7fca55f412ca5ab3f14e2d27dc1223cc690a4"
"c95780a7af36fd42716f4c909bb57e68b438769b13f8d6f02ac06ffa73c838ff"
changed /files/skills~1security-scan~1references~1scan-artifacts-and-ledger.md/size
13628
14716
changed /files/skills~1threat-model~1SKILL.md/sha256
"f45f02d9f607ec6797b730c71b15310f971403193cc56a984a1cbb1710b495ee"
"42568e50c787c4c0bfb9495ad67e72ab6c1a951bb910ecba2c67cff8961c4d56"
changed /files/skills~1threat-model~1SKILL.md/size
3149
3606
changed /files/skills~1track-findings~1SKILL.md/sha256
"8e3726e86ef0df509f1a635961f268e1bf04a4622a83e21c1d079f546cc61dcb"
"a6d2f30e6d5ca7bd9d74d83017f2f5481c5829585941208a1673b82c683d292b"
changed /files/skills~1track-findings~1SKILL.md/size
20543
11371
changed /files/skills~1track-findings~1references~1github-security-advisories.md/sha256
"f56010d265d0ce56e555dd73a92777a6d3be8f5d31bd2af7ff163423a667d10e"
"5e583aa2f77db32e4983b8b4bb857b1c7eaebfa1f43fc833b551c96acab70d4e"
changed /files/skills~1track-findings~1references~1github-security-advisories.md/size
4065
3288
changed /files/skills~1track-findings~1references~1jira.md/sha256
"05affbdefbfd8054d08f16e5fe15729ade440b5627a4561f8693bd97fb3a3ea2"
"bb1f7bb6fa638f20f1caad35b04482ae33f0cdbf2ab9c617e7805575dff457a0"
changed /files/skills~1track-findings~1references~1jira.md/size
5995
3027
changed /files/skills~1triage-finding~1SKILL.md/sha256
"70b0e771f286443ea32bbf466ad378b36f9123b4aa171ab02c6680fdbdb704f9"
"83081950bd4b29ff37cf82d137aec164532ae56b03dbaad3f4dd1d5423e758a7"
changed /files/skills~1triage-finding~1SKILL.md/size
27559
10004
changed /files/skills~1triage-finding~1agents~1openai.yaml/sha256
"1d53cfba14878c05745309eec3f682f70c5e8d49ecc033628cf832a5dd27c9cb"
"4a4094210aa6360cf503f5adf7be1e590e27898f3163da1b713632d2828e8563"
changed /files/skills~1triage-finding~1agents~1openai.yaml/size
770
400
changed /files/skills~1triage-finding~1references~1ticket-intake.md/sha256
"bd545655e0402f5f326f34191a67b6dd30c382914e9ae81b2e66ad745860e78a"
"693b415fdfcdcf8e6d5539677ff89c79bb36995ae22916d87866ce2c25113439"
changed /files/skills~1triage-finding~1references~1ticket-intake.md/size
6250
3645
changed /files/skills~1triage-finding~1references~1triage-result-contract.md/sha256
"321027c102cf36119376ef86f0701a4a7c6fc22e46d28fd240639aae156b134a"
"709c1d803c001a47c884ba10ac97f8c1434c3ce06a75033778343a662b25729b"
changed /files/skills~1triage-finding~1references~1triage-result-contract.md/size
4411
4447
Full snapshot data
{
"files": {
".app.json": {
"sha256": "a7bbe314059c7311e169474823e3978f267e560c3e961ba49fb94032da9843fe",
"size": 479
},
".codex-plugin/plugin.json": {
"sha256": "527d1a0db286884729572d400b0ad9b0ff852d4a12b36228ff5fbef180f7de9d",
"size": 1582
},
".mcp.json": {
"sha256": "7c5968060f6e848859ce02450d6e02e67029d8d39011bbda1059b19de6309ebf",
"size": 1679
},
"OWNERS": {
"sha256": "49be76d15302e4f158b3ef907e9802a955ab9c0a59a039827eab4cb6221f0e5f",
"size": 41
},
"assets/logo.png": {
"sha256": "9b9c2b09b2fa064611fb62307d321d5c2ea70cf0789f7ce34cdb0fc0d9190b3a",
"size": 99567
},
"examples/completed-scan/coverage.json": {
"sha256": "d55b9b98d48323b4659dfee6531ec83ec538f2084325412b7188bf85ad68b01b",
"size": 467
},
"examples/completed-scan/findings.json": {
"sha256": "a6dc4521d6478828224fbafc33585401a47bfeb0e56e07b5d2886e8a29937f2f",
"size": 1844
},
"examples/completed-scan/report.md": {
"sha256": "83b7c709c0b49d1500b52e61a88ea70b8423ebebec38308b1294cf094838b66f",
"size": 4116
},
"examples/completed-scan/scan-manifest.json": {
"sha256": "d245ae9fc62a676293c6821e562d1a2d7d59db12d5b8dc99b85f7c5f1462fe00",
"size": 1245
},
"integrity.json": {
"sha256": "6b342df66fb9b5ce7fc8c9de0e974b59d21340cdc06167df46d1a19bd4ea9441",
"size": 17465
},
"mcp/helpers.mjs": {
"sha256": "c272f3761e5c405619b26e4d0fd621df5ac189f2ee1bb32b975480e9835f9ca8",
"size": 1097
},
"mcp/helpers.mjs.br.part-000": {
"sha256": "6299f73c92c4f924bffc6b1bed001480603473967006b3e75941bc49a21f18d5",
"size": 63398
},
"mcp/native/COPYRIGHT-library.html": {
"sha256": "0a65bb747c49c7bb816cbc7188319bd6e4e8d08091c1190b8a3c0971c47968ed",
"size": 279302
},
"mcp/native/THIRD_PARTY_NOTICES.txt": {
"sha256": "16ac63908855f5bb7eab864923cc1855b406bd7051dfcd70d7e69684f6c69955",
"size": 308404
},
"mcp/native/darwin-arm64/unix.node": {
"sha256": "093e87d8de3d2676fc9a2a1430f571bf4fc970b2bbef4c7ded0bf8924e45f473",
"size": 354352
},
"mcp/native/darwin-x64/unix.node": {
"sha256": "57c45d212d35ce7599afc7b9b21693e18443753231bad1fb5146a4e224db68ec",
"size": 343296
},
"mcp/native/licenses/Apache-2.0.txt": {
"sha256": "074e6e32c86a4c0ef8b3ed25b721ca23aca83df277cd88106ef7177c354615ff",
"size": 10280
},
"mcp/native/licenses/BSD-2-Clause.txt": {
"sha256": "f32fb3b417a194167cfad068223fc975ba96c5960513a10f66a3c28720aec1df",
"size": 1267
},
"mcp/native/licenses/MIT.txt": {
"sha256": "b85dcd3e453d05982552c52b5fc9e0bdd6d23c6f8e844b984a88af32570b0cc0",
"size": 1078
},
"mcp/native/licenses/Unicode-3.0.txt": {
"sha256": "f5062c9a188d81dfe66b56db4182dcf9e4b17c0d9b0d311a8e20b3a1b075c443",
"size": 1995
},
"mcp/native/linux-arm64-gnu/unix.node": {
"sha256": "6b352aaaac21f9ad9b772481429ba7bc8433a0e44ca5ffe433ad47289c3007f6",
"size": 465088
},
"mcp/native/linux-arm64-musl/unix.node": {
"sha256": "3a55ec4f42202c58a29654701c31a8deab386969d14e2ab85f23e81345b4fedb",
"size": 332456
},
"mcp/native/linux-x64-gnu/unix.node": {
"sha256": "ed2061078400010852a9f8d3ecdf7bc0a008d13adc9e9d5c6954f5cb686a2a2a",
"size": 365352
},
"mcp/native/linux-x64-musl/unix.node": {
"sha256": "c2e4c07ac6dde175464c6315937652465b200e5f28590898663523beaf4e9ab6",
"size": 369304
},
"mcp/native/win32-arm64/windows.node": {
"sha256": "19f78e88fd8934038201c26b044123bc05db74f5d7065df10a32583ccbcf7a55",
"size": 419840
},
"mcp/native/win32-x64/windows.node": {
"sha256": "5aed21edb5fe06efac49d9bd3899d6242f60b1bfac2b710b967a76c924d98298",
"size": 453120
},
"mcp/server.mjs": {
"sha256": "c58624aa4c4bd3efbb67601c9c2e98759f167f608320a6cd342814b2f2e6a636",
"size": 1096
},
"mcp/server.mjs.br.part-000": {
"sha256": "7ef9c7387b405b51e2aec793a86696bf793506a8f34155199035aa515b3a415a",
"size": 140000
},
"mcp/server.mjs.br.part-001": {
"sha256": "94d6412009e284ecbc17bd14d07e0116d8e74e572a62198912ac5a03f95a50c2",
"size": 126028
},
"preflight/capability-profiles.toml": {
"sha256": "543a0f6a0e81cbbac1fe43e2e3d44d6163a6792384ab9c768ac519295d9ec8a1",
"size": 2350
},
"references/artifact-storage.md": {
"sha256": "ccce9c76f5d044fbce333d6129fbb55eb63f512c15c2ebeeca405e296f38325b",
"size": 7632
},
"references/config-preflight.md": {
"sha256": "5894f9fd7efcae7034404a2c062ee3d7417520753be16ddcdb3acf5b884f048d",
"size": 19162
},
"references/core-scan.md": {
"sha256": "9c0eca53147383a89cd345eac7791ea75b954f7f083448ef25019d8f9ba30afe",
"size": 22978
},
"references/desktop-config-preflight.md": {
"sha256": "d03e7c604a0459509a4a3238289c3ad0725811e8b11fb7d0044ce8bcee6a7a26",
"size": 1587
},
"references/final-report.md": {
"sha256": "9c34375584c8ae76959b0eae038b86b2b8ed7874517c249fcae8715314c76298",
"size": 29931
},
"references/finding-detail-fields.md": {
"sha256": "9e4dcc5633ca1f31291688606e4ec0d56067ed485e748ac9e7d433984f9ab451",
"size": 11920
},
"references/sarif-adapter.md": {
"sha256": "32725cc851d998c9b33f0232c435d720383c86bc13526b04d356b85d08101cc5",
"size": 2341
},
"references/scan-artifacts.md": {
"sha256": "eecdccac30b8ad65bb702dc9ac8d9718dcb0b95532a94a61195268d22bdf504b",
"size": 11243
},
"references/scan-contract.md": {
"sha256": "b362636c29d1e8b18053481abe2f97d7bb099a97040f5b63aa2702a41c1d62c8",
"size": 14537
},
"references/scan-prologue.md": {
"sha256": "1d23ab6db651134b54307cdea873ffa711a83458bda563f1e126f35e83b278e9",
"size": 4812
},
"references/security-guidance.md": {
"sha256": "a0f49ad3bd09fa6180a100d81326b75bf87a2d49893ca9e37b64ab151c759a80",
"size": 1801
},
"references/static-finding-assessment.md": {
"sha256": "78de933caef1c8d971dab83fbb71877602a1197a52eaa7a59d6ff7bc399d0bc7",
"size": 3949
},
"references/threat-model.md": {
"sha256": "f3dd2d05d7f0c61b13d29a78e810b367772fe22d5ac58adbbc00080a9495706e",
"size": 15203
},
"schemas/coverage.schema.json": {
"sha256": "6ac14e659e884e9582d8bd9ba480f6364ca17309e1a3dee9469ab025a3380b11",
"size": 5198
},
"schemas/definitions/artifact-common.schema.json": {
"sha256": "8187236867a2397515571d937deac92dcbf23d3db5e330d32b1f24aced4b9abc",
"size": 1065
},
"schemas/definitions/discovery-candidate.schema.json": {
"sha256": "b0cf54fc1ae1947db0f6a6f73e17d1124d528226de763fb89489d05fd612331b",
"size": 2951
},
"schemas/findings.schema.json": {
"sha256": "a480337cc0fa4c48c44fc7be17c6c4348767815570775cda80f2aaf797b8e56c",
"size": 19167
},
"schemas/patch-risk-assessment.schema.json": {
"sha256": "536492481c5b67910ce8d3754d61c7d5a44c5cb78fe3f081e8f5d1620d6ae9c9",
"size": 6854
},
"schemas/scan-manifest.schema.json": {
"sha256": "c621d4136ac81741ac8da1960c7f5e92ade22c0b5490e378ea4339b09e45b6f3",
"size": 9513
},
"schemas/tools/candidate-attack-paths.schema.json": {
"sha256": "f6fcb643b4b975466c4717356a0768b0572812cd832578d8714557f5e3d16935",
"size": 6055
},
"schemas/tools/candidate-validations.schema.json": {
"sha256": "c871eb3462b7873c1774e6aade62acdd570636e43c0ac3c7b41b7041ca5627e9",
"size": 4916
},
"schemas/tools/deep-reducer.schema.json": {
"sha256": "5f0c25f826445251415986097c41127018d19b6c690cd99720fd9365893b0028",
"size": 2221
},
"schemas/tools/discovery-candidates.schema.json": {
"sha256": "dcd2031d64015c69b415c66e57d6e90cbdef91152a445a6f409c14d80153afa6",
"size": 2473
},
"schemas/tools/review-items.schema.json": {
"sha256": "acc4f4909446a62811728dd1d6581456053da8d26f774b7af208a1856f86ac5b",
"size": 2250
},
"schemas/tools/scan-draft.schema.json": {
"sha256": "151f9dffc83e1c5b4f0a7fba20b90fb3196fdaa9719180eb0009ba2b50f75d48",
"size": 23475
},
"schemas/tools/worker-threat-model.schema.json": {
"sha256": "a00f875918794661316a033bd2d03426d61ab1e41d4a36c548c07525dcfde478",
"size": 435
},
"scripts/config_preflight.py": {
"sha256": "f4d4103650977d078b71f49da6b1e287b6db2f2b7b5fb08e943722a6d869354e",
"size": 35176
},
"scripts/deep_scan_config.py": {
"sha256": "44229bc7b2e7f4c7654e2e9ed91650a28630eeb00fcc38358f19d69739771f8c",
"size": 5042
},
"scripts/deep_scan_defaults.json": {
"sha256": "89bdb96ff721f0f1d509f3c5c83f5fc89022f14406d0a84df781b7e0e42cde66",
"size": 143
},
"scripts/deep_scan_workbench.py": {
"sha256": "5012b337503f44e086fbf021be9db8340f8ba992fe5169c5534752e900947cf5",
"size": 84709
},
"scripts/filesystem_identity.py": {
"sha256": "5298f2012b6e48ab1106837a5440ef2b3966383e2321507a47593010bb4dd01f",
"size": 893
},
"scripts/finalize_scan_contract.py": {
"sha256": "3fa92d8e2ccadb032cf458f0fde444785e8ee5ced0abe6346c285b07ef153e27",
"size": 133770
},
"scripts/finding_preview.py": {
"sha256": "ebdf8e7b7e465c0937e73e945e3593d659b2f15ff1db08d0b4a2d3b106174c4d",
"size": 16089
},
"scripts/generate_in_scope_files.py": {
"sha256": "0b420d786b17e4f91451b5b686fdb4d6beee3913eebb952f8fcbf220aec6230e",
"size": 11646
},
"scripts/generate_rank_input.py": {
"sha256": "e7c0bddbdb7e9236f7431d84b86be4c3fc202daa8d1306d6baa930110635b671",
"size": 17899
},
"scripts/launch_codex_security_mcp": {
"sha256": "56794e736a1e8f588f9959a2e707ea3ed9bc7d4d2b796c132e91d5fbed59e600",
"size": 1793
},
"scripts/launch_codex_security_mcp.cmd": {
"sha256": "2539c0914bb130d76629e8176ac93762cd0051677ac2c525e7ba524b0b828f80",
"size": 2582
},
"scripts/rank_preview.py": {
"sha256": "627d0b89c9d4436162ab9bcb80f7aa562605695e784dc612307c7eda6fef3a7f",
"size": 34726
},
"scripts/report_projection.py": {
"sha256": "1b24978a3cdb3c336ac27a2b39fb35457bade13a4aad0782710fe38ac39965cf",
"size": 41098
},
"scripts/reserved_artifact_paths.json": {
"sha256": "58ba1cf42437ac3af65c85a66eeff46f22572e45081fa2620f4b241173efcc50",
"size": 186
},
"scripts/snapshot_sqlite.py": {
"sha256": "9e0be851702f0962070ece6e0e2959e3955fc99126f68452d175fc22bc38423b",
"size": 1084
},
"scripts/threat_model_projection.py": {
"sha256": "32e4d5cd370a49cdc5658c3ded3d4d63ba7f41a44b34b67da87321048d088111",
"size": 6711
},
"scripts/validate_scan_contract.py": {
"sha256": "38a5eb0126ea06b22eb82c5829e4ffcbebd2c1e55f99634454622fedd7b9e1a0",
"size": 3803
},
"scripts/validate_tracking_source.py": {
"sha256": "802fb3062456128c7adceb6048183811120255b222018e123e10c5ba0caa4bdc",
"size": 2813
},
"scripts/windows_scan_local_files.py": {
"sha256": "c26276695435d134c1354048c3c74c3c6b0ed203158a93b63b67ef0b6bfab843",
"size": 24919
},
"scripts/workbench/__init__.py": {
"sha256": "3635fffd60f51d5a5d889e20c91df803c667f8b1b29cbcf68c96cb2e0a9c33ed",
"size": 58
},
"scripts/workbench/handoff.py": {
"sha256": "83606054cc47064514a612d8ce16353cce669fe07b61852d73bc0c94b75c8ee5",
"size": 8914
},
"scripts/workbench/storage.py": {
"sha256": "5e389073520fb7668defd433228befd9e7b9c8309c1b6024bffd6213d59f1d88",
"size": 973
},
"scripts/workbench_cli.py": {
"sha256": "959e951fa5daf326049ee61bd0773999be92600b65a9062e56b4f62fc4e2aa55",
"size": 21260
},
"scripts/workbench_constants.py": {
"sha256": "0ff12b11b2ae9f71c1de6cff0afc234b035379bb1193f1ca9a56ddeb7aa32cf7",
"size": 2187
},
"scripts/workbench_dashboard.py": {
"sha256": "5770b77ff551cde46c22fae9239ef8ce28254320da77876e0b936dc35b829967",
"size": 5990
},
"scripts/workbench_db.py": {
"sha256": "94bf11d7d74202ae7efbdd4f70a036393d4ba013ffc2ada44172a59be41f97f2",
"size": 146186
},
"scripts/workbench_feedback.py": {
"sha256": "675bc5897444a39950297f74353fa6fd296f73d3a5ac87d294647ae8425151dd",
"size": 4120
},
"scripts/workbench_finding_index.py": {
"sha256": "4618f994786fa2300e78592fa2868bc0a585368127027c1940a0e504b0254265",
"size": 3938
},
"scripts/workbench_finding_workflows.py": {
"sha256": "de44bfc28c0a4d2021643a50d5a42408f4853bb4a21cf9d1f4ffb43a695b06ce",
"size": 8754
},
"scripts/workbench_findings.py": {
"sha256": "b78e2ca68f29cf002b6215985225e1b3996c8edd08601569945405d42c33b301",
"size": 8881
},
"scripts/workbench_native_indexes.py": {
"sha256": "114dbf1e4050302948c4b8f24d69454f127d128e3bc35e34a5f3ec9dd3b187cd",
"size": 9870
},
"scripts/workbench_progress.py": {
"sha256": "42c7d0b8b4d253095e1062922cd9e59b10b966ac314bef092cb78cad2217b967",
"size": 13296
},
"scripts/workbench_publication.py": {
"sha256": "9312a2962b797ed355d6b05fb375da6325aeb5c5ead5d52f2fb7114ef3ad9635",
"size": 20346
},
"scripts/workbench_remediation.py": {
"sha256": "96585805c4956917bb473c3b60493a3c15daa2028b074b756e36358a9ac76525",
"size": 7281
},
"scripts/workbench_saved_results.py": {
"sha256": "436b23a4d169006437985bb352bfd792da9e465c4c7506dce31bfd5e78524c6d",
"size": 119202
},
"scripts/workbench_scan_history.py": {
"sha256": "920a4c6448c4ee87500e4488fdfa5a294dfa0696f94f55f2e2cbe544e5acf60f",
"size": 48177
},
"scripts/workbench_scan_start.py": {
"sha256": "647e54ce40a7dc5b17d6abe547406f22ca0cb4eee628938b4c21629eb8e73c35",
"size": 7963
},
"scripts/workbench_scan_usage.py": {
"sha256": "21d845f8967c9206351e54f94fd2b4bbfe834434e35b642992d7a829b76cd94e",
"size": 22094
},
"scripts/workbench_schema.py": {
"sha256": "25ef8550ded14785fa47b19f1fa358422d8883affc94641c84e68c172e800cc0",
"size": 51783
},
"scripts/workbench_severity.py": {
"sha256": "ec74f540595e8052e295846303f31988329e0dc68fcebdd92572673555b1c99d",
"size": 4625
},
"scripts/workbench_source_excerpt.py": {
"sha256": "5681d4a5c547404f687c644f54432c10e0770b6ba4c1e6be321664579a252a24",
"size": 3210
},
"scripts/workbench_target.py": {
"sha256": "08ed149295b9347ac37f2b8523c822a35f165283422c7644dabecfa236b81b72",
"size": 32451
},
"scripts/workbench_target_state.py": {
"sha256": "9c133f67397ab4b90ce1275edc09a7e6d05900236209bc72e8f113b9f0cde287",
"size": 1920
},
"scripts/workbench_validation.py": {
"sha256": "11259b8ce1e135c5a86677964f29e6331e65e5fd80a1931c80f7fac507cccb13",
"size": 6547
},
"skills/assess-patch-risk/SKILL.md": {
"sha256": "c3b62a8c1d6135945a055134f50329047bb908972fc7b320a592edbc3d38b419",
"size": 9511
},
"skills/assess-patch-risk/agents/openai.yaml": {
"sha256": "fec61f321e18022579cac25ffb33286f48cc316172a0b8d502f2bf4faecba025",
"size": 274
},
"skills/assess-patch-risk/references/risk-rubric.md": {
"sha256": "078a71175191580791685808980cb1815dc97265cfee8c0ddad1f4d3b8203b4a",
"size": 5049
},
"skills/attack-path-analysis/SKILL.md": {
"sha256": "9465d2750182acbf6dd8f61e60bb47dc1ca502be5cc3f4a71da7ad39935d1eb1",
"size": 8568
},
"skills/attack-path-analysis/agents/openai.yaml": {
"sha256": "d9355cbcf0bc81098c9e837d9d4e8644e598410d052a862ab11cf91ef9ccb633",
"size": 261
},
"skills/attack-path-analysis/references/attack-path-facts.md": {
"sha256": "8c8f1abb46ddf045d76908df78e3a273da8d61aaa0f37fc992534a3ddfe42430",
"size": 2882
},
"skills/attack-path-analysis/references/severity-policy.md": {
"sha256": "44719bb96a1065df7683a4f7968145efd3b3f365ec95c22a4bed5b20b5d8a0a1",
"size": 15288
},
"skills/deep-security-scan/SKILL.md": {
"sha256": "d6aed0d9b47065a1384a96d0a45c843b0cda8ba48e3d2cbe96c65357c6e55ee3",
"size": 14096
},
"skills/deep-security-scan/agents/openai.yaml": {
"sha256": "3f8d781bf372b0d053a017eabaebf947d5d48d9be2b82cb67da211128924c3f1",
"size": 192
},
"skills/define-security-policy/SKILL.md": {
"sha256": "2817e1a03980a7ebea478c8d9e6c622e3c6205123e767a1e32f0204c06729cc7",
"size": 6256
},
"skills/define-security-policy/agents/openai.yaml": {
"sha256": "8c40b0f8bd1eb7feabdcea69f12c2a7d18e492e96893c0702507ffd808b8e2b4",
"size": 210
},
"skills/finding-discovery/SKILL.md": {
"sha256": "14cc797e750ca4bdd8b060c4cf96d7d32f25b132aa8f80d0a0837683fe010790",
"size": 25598
},
"skills/finding-discovery/agents/openai.yaml": {
"sha256": "c044dd83a7624b90ed19f11adc899202685ce64e32502f1d46225f69f9a2c962",
"size": 220
},
"skills/fix-finding/SKILL.md": {
"sha256": "ba7311f43b2c0742da0d5c6bdb2f0b26601c09cc59747cf8c62a09f8d0bb86d2",
"size": 9477
},
"skills/fix-finding/agents/openai.yaml": {
"sha256": "5dac397bf3a17e45283691b656179eb56d19e34881af380f098d7c455bce52d7",
"size": 225
},
"skills/propose-security-hardening/SKILL.md": {
"sha256": "ad07d88da7c2bc9e551849cdde686b0daad380ed0aac798e6c06444681d75959",
"size": 22791
},
"skills/propose-security-hardening/agents/openai.yaml": {
"sha256": "1bcab19d48eb4b768c0dc435bd2e738f1471c2345cce5865bb31bdca5be0b134",
"size": 293
},
"skills/propose-security-hardening/references/proposal-format.md": {
"sha256": "72b93c32f1cbe7d25a3d347d0894e7b642942e68f2d8a3c0409bc398a41b06e7",
"size": 25933
},
"skills/security-diff-scan/SKILL.md": {
"sha256": "f85962d46f141227d794a25253a39232bc4e1ad756509ecd3d8769b85b735136",
"size": 6102
},
"skills/security-diff-scan/agents/openai.yaml": {
"sha256": "f3d31e09befbb8532b53fdccb63a34c0b894a7fb96215b40e84647cd9f8e1b50",
"size": 284
},
"skills/security-scan/SKILL.md": {
"sha256": "104e2f93fc965c34e91970f517a89e330d5b29dbb243dcea5d95d83f14d135cf",
"size": 9007
},
"skills/security-scan/agents/openai.yaml": {
"sha256": "5952ae0b0f7d378b7e6ab3fe793335a0e26e5d15bd2d7fdd14ecdd795607ceb6",
"size": 271
},
"skills/security-scan/references/desktop-scan.md": {
"sha256": "62a3b3baac5773c36eb291c74c0304dd97157aff5b89dd56fa8b0fed08803389",
"size": 4747
},
"skills/security-scan/references/scan-artifacts-and-ledger.md": {
"sha256": "c95780a7af36fd42716f4c909bb57e68b438769b13f8d6f02ac06ffa73c838ff",
"size": 14716
},
"skills/threat-model/SKILL.md": {
"sha256": "42568e50c787c4c0bfb9495ad67e72ab6c1a951bb910ecba2c67cff8961c4d56",
"size": 3606
},
"skills/threat-model/agents/openai.yaml": {
"sha256": "a3533478c2548248ef07c9afbbe0a7451f1fa1882883b4def0906d8113b7dd6c",
"size": 171
},
"skills/track-findings/SKILL.md": {
"sha256": "a6d2f30e6d5ca7bd9d74d83017f2f5481c5829585941208a1673b82c683d292b",
"size": 11371
},
"skills/track-findings/agents/openai.yaml": {
"sha256": "39e73c0003afc8bd9d3cf53c027d8274e724dc41f46e3cd6863ad34bb4de4200",
"size": 279
},
"skills/track-findings/references/github-security-advisories.md": {
"sha256": "5e583aa2f77db32e4983b8b4bb857b1c7eaebfa1f43fc833b551c96acab70d4e",
"size": 3288
},
"skills/track-findings/references/jira.md": {
"sha256": "bb1f7bb6fa638f20f1caad35b04482ae33f0cdbf2ab9c617e7805575dff457a0",
"size": 3027
},
"skills/triage-finding/SKILL.md": {
"sha256": "83081950bd4b29ff37cf82d137aec164532ae56b03dbaad3f4dd1d5423e758a7",
"size": 10004
},
"skills/triage-finding/agents/openai.yaml": {
"sha256": "4a4094210aa6360cf503f5adf7be1e590e27898f3163da1b713632d2828e8563",
"size": 400
},
"skills/triage-finding/references/github-rest-intake.md": {
"sha256": "f026bef041ca92f3d9b47a131794aa54e98cf8d7716fae3f71ab53e8ab09c79f",
"size": 9314
},
"skills/triage-finding/references/ticket-intake.md": {
"sha256": "693b415fdfcdcf8e6d5539677ff89c79bb36995ae22916d87866ce2c25113439",
"size": 3645
},
"skills/triage-finding/references/triage-result-contract.md": {
"sha256": "709c1d803c001a47c884ba10ac97f8c1434c3ce06a75033778343a662b25729b",
"size": 4447
},
"skills/validation/SKILL.md": {
"sha256": "3c4660f79b12a92728e6bb25027064c3a911d0960d39aeafc8fda9e42ce517a5",
"size": 12845
},
"skills/validation/agents/openai.yaml": {
"sha256": "7516bcd4748b55566694284d7d953a7db0c94d5a2123895fabb36d7d9d7d74e4",
"size": 183
},
"skills/validation/references/validation-guidance.md": {
"sha256": "42f7a9d85b78d0deb5e6eda82b8c59ed101c40d36065833b9cf39fe50699e255",
"size": 26823
},
"skills/verify-fix/SKILL.md": {
"sha256": "3d4530484c7e4c18b6afe7c6527247e96517dce1ebd1bda9d349cd367ecb0ae3",
"size": 3025
},
"skills/verify-fix/agents/openai.yaml": {
"sha256": "ac35fc4704cde35b6bf103e16a16d0a44f2b9c2671e1634292cf285905cf40f3",
"size": 235
},
"skills/vulnerability-writeup/SKILL.md": {
"sha256": "d08582d9963ce3bfbc3fe81b6e85a01e6fe306713d7951bfd8dd2fbc3df75de4",
"size": 27640
},
"skills/vulnerability-writeup/agents/openai.yaml": {
"sha256": "7987566daac59e3dd6c5211fe020f71fc4c862843c231d10c28a45697d680f9e",
"size": 290
},
"skills/vulnerability-writeup/references/report-format.md": {
"sha256": "60568466f7057562d7359dc3a396632c760c147582603896d7e569a77487d0b1",
"size": 14682
}
}
}SHA-256 of public snapshot: 8e8a2a0d24309bd11d1c54794bd1027470e5f7bc759784322ed68d7643d69ec8