Update to Codex Advisor
Snapshot Oct 28, 2026 · 13:16 UTC · version 1.4.10
Package or technical metadata updated
Package or technical metadata updated
Observed in package metadata. These changes alone do not establish a new customer-facing feature.
Up to 3 plugins free · no card required.
All fields and original values.
These are saved file metadata. Open a changed file to read its text edits.
Package file
Sep 30, 2026 · 23:15 UTC
{"sha256":"ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a","size":234585}
Oct 28, 2026 · 13:16 UTC
Not present
Package file
Sep 30, 2026 · 23:15 UTC
{"sha256":"ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a","size":234585}
Oct 28, 2026 · 13:16 UTC
Not present
Package file
Sep 30, 2026 · 23:15 UTC
bd2b05047cb9c0e431191d6dbb7c5f8a6baae2afb5fe52f37ac8fed46588edac
Oct 28, 2026 · 13:16 UTC
4ab3069acea26fc5863aaacaf2dadfe0052c9d68fa22eb0211da0440c7ad3d31
Package file
Sep 30, 2026 · 23:15 UTC
2298
Oct 28, 2026 · 13:16 UTC
2503
Compare saved observations
Download comparison JSONChanged files
Choose a file to see its text changes. Binary or large files show metadata only.
.codex-plugin/assets/composer-icon.png →
.codex-plugin/assets/logo.png →
LICENSE →
scripts/advisor_discovery.py →
scripts/evaluate-triggers.sh →
skills/consultation/SKILL.md →
skills/consultation/references/operations.md →
tests/advisor_transport_support.py →
tests/test_advisor_config.py →
scripts/advisor_state.py
− removed · + added
--- before +++ after @@ -0,0 +1,367 @@ +"""Owner-only Advisor state, validation, and bounded local probes.""" + +from __future__ import annotations + +import fcntl +import json +import os +import re +import selectors +import stat +import subprocess +import tempfile +import time +from collections.abc import Callable, Iterator, Mapping, Sequence +from contextlib import contextmanager +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +from advisor_process import terminate_owned + +SCHEMA_VERSION = 1 +TRANSPORT_CONTRACT_VERSION = "1.4" +MAX_JSON_BYTES = 1_000_000 +MAX_LIVE_CONFIG_BYTES = 64 * 1024 +MAX_JOURNAL_RECORDS = 1_024 +JOURNAL_RETENTION_SECONDS = 30 * 24 * 60 * 60 +JOURNAL_OUTCOMES = frozenset( + ("accepted", "failed", "timed_out", "cancelled", "retry_exhausted") +) +ATTEMPT_OUTCOMES = frozenset( + ( + "accepted", + "rejected_response", + "launch_failed", + "runtime_failed", + "timed_out", + "cancelled", + ) +) +MAX_PAGES = 64 +MAX_MODELS = 2_000 +DEFAULT_DEADLINE_SECONDS = 300 +MIN_DEADLINE_SECONDS = 30 +MAX_DEADLINE_SECONDS = 900 +LOCK_DEADLINE_SECONDS = 5 +CANARY_CLEANUP_GRACE_SECONDS = 5 +EFFORTS = frozenset( + ("none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra") +) +TIERS = frozenset(("standard", "specialist")) +JOURNAL_TIERS = frozenset((*TIERS, "compatibility-test", "opt-in")) +SELECTOR_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$") +PRESET_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$") +TOKEN_RE = re.compile(r"^[0-9a-f]{32}$") +_MISSING = object() +_NO_DEFAULT = object() + + +class ConfigError(ValueError): + pass + + +class RevisionConflict(ConfigError): + pass + + +class DiscoveryUnavailable(ConfigError): + pass + + +class DiscoveryError(ConfigError): + pass + + +def _run_bounded_output( + argv: Sequence[str], *, timeout_seconds: float, max_bytes: int +) -> tuple[int, bytes]: + """Run a local probe with bounded time, output, and process ownership.""" + try: + process = subprocess.Popen( + list(argv), + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + start_new_session=True, + ) + except OSError as exc: + raise ConfigError("local process probe is unavailable") from exc + if process.stdout is None: + terminate_owned(process) + raise ConfigError("local process probe is unavailable") + os.set_blocking(process.stdout.fileno(), False) + selector = selectors.DefaultSelector() + selector.register(process.stdout, selectors.EVENT_READ) + deadline = time.monotonic() + timeout_seconds + output = bytearray() + reached_eof = False + try: + while not reached_eof: + remaining = deadline - time.monotonic() + if remaining <= 0: + raise ConfigError("local process probe is unavailable") + events = selector.select(remaining) + if not events: + raise ConfigError("local process probe is unavailable") + while True: + try: + chunk = os.read( + process.stdout.fileno(), max_bytes + 1 - len(output) + ) + except BlockingIOError: + break + if not chunk: + reached_eof = True + break + output.extend(chunk) + if len(output) > max_bytes: + raise ConfigError("local process probe exceeded output limit") + returncode = process.wait(timeout=max(0.01, deadline - time.monotonic())) + return returncode, bytes(output) + except (OSError, subprocess.TimeoutExpired) as exc: + raise ConfigError("local process probe is unavailable") from exc + finally: + selector.close() + if process.poll() is None: + terminate_owned(process) + + +def _duplicate_key(pairs: list[tuple[str, Any]]) -> dict[str, Any]: + result = {} + for key, value in pairs: + if key in result: + raise ConfigError("duplicate JSON key") + result[key] = value + return result + + +def _safe_directory(path: Path, *, create: bool) -> None: + if create: + try: + parent = path.parent.lstat() + except FileNotFoundError as exc: + raise ConfigError("Codex home directory is missing") from exc + if stat.S_ISLNK(parent.st_mode) or not stat.S_ISDIR(parent.st_mode): + raise ConfigError("Codex home directory is unsafe") + try: + path.mkdir(mode=0o700, exist_ok=True) + except OSError as exc: + raise ConfigError("cannot create Advisor state directory") from exc + # Check the state root and Codex-home ancestor. Do not reject macOS system + # aliases above that trusted boundary (for example /var -> /private/var). + current = path + for _ in range(2): + try: + info = current.lstat() + except FileNotFoundError as exc: + raise ConfigError("Advisor state directory is missing") from exc + if stat.S_ISLNK(info.st_mode) or not stat.S_ISDIR(info.st_mode): + raise ConfigError("Advisor state directory is unsafe") + if current == path and (info.st_uid != os.getuid() or info.st_mode & 0o077): + raise ConfigError("Advisor state directory is not owner-only") + current = current.parent + + +def read_json(path: Path, *, missing: Any = _NO_DEFAULT) -> Any: + try: + info = path.lstat() + except FileNotFoundError: + if missing is _NO_DEFAULT: + raise ConfigError(f"state file is missing: {path.name}") + return missing + if stat.S_ISLNK(info.st_mode) or not stat.S_ISREG(info.st_mode): + raise ConfigError(f"unsafe state file: {path.name}") + if info.st_uid != os.getuid() or info.st_mode & 0o077: + raise ConfigError(f"state file is not owner-only: {path.name}") + if info.st_size > MAX_JSON_BYTES: + raise ConfigError(f"state file is too large: {path.name}") + try: + with path.open("r", encoding="utf-8") as handle: + return json.load(handle, object_pairs_hook=_duplicate_key) + except (OSError, UnicodeDecodeError, json.JSONDecodeError, RecursionError) as exc: + raise ConfigError(f"invalid JSON in {path.name}") from exc + + +def _require_keys(value: Any, required: set[str], *, label: str) -> dict[str, Any]: + if not isinstance(value, dict) or set(value) != required: + raise ConfigError(f"invalid {label} keys") + return value + + +def _validate_selector(value: Any, *, label: str = "model") -> str: + if not isinstance(value, str) or not SELECTOR_RE.fullmatch(value): + raise ConfigError(f"unsafe {label} selector") + return value + + +def _validate_effort(value: Any) -> str: + if not isinstance(value, str) or value not in EFFORTS: + raise ConfigError("unsupported effort") + return value + + +def validate_pair(value: Any) -> dict[str, str]: + value = _require_keys(value, {"model", "effort"}, label="model pair") + return { + "model": _validate_selector(value["model"]), + "effort": _validate_effort(value["effort"]), + } + + +@dataclass(frozen=True) +class StatePaths: + root: Path + + @property + def settings(self) -> Path: + return self.root / "settings.json" + + @property + def prior_settings(self) -> Path: + """One owner-only prior revision retained for explicit restoration.""" + return self.root / "settings.previous.json" + + @property + def invalid_settings(self) -> Path: + """Most recently preserved malformed settings bytes.""" + return self.root / "settings.invalid.json" + + @property + def catalog(self) -> Path: + return self.root / "catalog.json" + + @property + def lock(self) -> Path: + return self.root / ".lock" + + @property + def canaries(self) -> Path: + return self.root / "canaries" + + @property + def journal(self) -> Path: + return self.root / "usage-journal" + + +def state_paths(codex_home: str | os.PathLike[str] | None = None) -> StatePaths: + home = Path(codex_home or os.environ.get("CODEX_HOME") or Path.home() / ".codex") + if not home.is_absolute(): + raise ConfigError("CODEX_HOME must be absolute") + return StatePaths(home / "advisor") + + +@contextmanager +def state_lock( + paths: StatePaths, *, on_status: Callable[[str], None] | None = None +) -> Iterator[None]: + _safe_directory(paths.root, create=True) + try: + fd = os.open( + paths.lock, os.O_RDWR | os.O_CREAT | getattr(os, "O_NOFOLLOW", 0), 0o600 + ) + except OSError as exc: + raise ConfigError("cannot open Advisor state lock") from exc + try: + info = os.fstat(fd) + if ( + not stat.S_ISREG(info.st_mode) + or info.st_uid != os.getuid() + or info.st_mode & 0o077 + ): + raise ConfigError("Advisor state lock is unsafe") + deadline = time.monotonic() + LOCK_DEADLINE_SECONDS + reported = False + while True: + try: + fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + break + except BlockingIOError: + if time.monotonic() >= deadline: + raise ConfigError("Advisor state lock timed out") + if on_status and not reported: + on_status("waiting for local state lock") + reported = True + time.sleep(0.05) + yield + finally: + try: + fcntl.flock(fd, fcntl.LOCK_UN) + finally: + os.close(fd) + + +def _read_safe_bytes(path: Path) -> bytes: + """Read one bounded owner-only state file without parsing its contents.""" + try: + info = path.lstat() + except FileNotFoundError as exc: + raise ConfigError(f"state file is missing: {path.name}") from exc + if ( + stat.S_ISLNK(info.st_mode) + or not stat.S_ISREG(info.st_mode) + or info.st_uid != os.getuid() + or info.st_mode & 0o077 + ): + raise ConfigError(f"unsafe state file: {path.name}") + if info.st_size > MAX_JSON_BYTES: + raise ConfigError(f"state file is too large: {path.name}") + try: + return path.read_bytes() + except OSError as exc: + raise ConfigError(f"state file is unreadable: {path.name}") from exc + + +def _atomic_write_bytes(path: Path, encoded: bytes) -> None: + """Atomically replace one owner-only state file with bounded bytes.""" + _safe_directory(path.parent, create=False) + if len(encoded) > MAX_JSON_BYTES: + raise ConfigError("state JSON exceeds byte limit") + if path.exists() or path.is_symlink(): + info = path.lstat() + if ( + stat.S_ISLNK(info.st_mode) + or not stat.S_ISREG(info.st_mode) + or info.st_uid != os.getuid() + or info.st_mode & 0o077 + ): + raise ConfigError(f"unsafe state file: {path.name}") + descriptor, staged_name = tempfile.mkstemp( + prefix=f".{path.name}.", suffix=".tmp", dir=path.parent + ) + staged = Path(staged_name) + try: + os.fchmod(descriptor, 0o600) + with os.fdopen(descriptor, "wb") as handle: + handle.write(encoded) + handle.flush() + os.fsync(handle.fileno()) + os.replace(staged, path) + except Exception: + staged.unlink(missing_ok=True) + raise + + +def _atomic_write(path: Path, value: Mapping[str, Any]) -> None: + encoded = (json.dumps(value, sort_keys=True, separators=(",", ":")) + "\n").encode() + _atomic_write_bytes(path, encoded) + + +def current_codex_version(*, timeout_seconds: float = 5.0) -> str: + """Return the exact installed CLI version using a bounded local probe.""" + try: + returncode, output = _run_bounded_output( + ["codex", "--version"], + timeout_seconds=timeout_seconds, + max_bytes=4096, + ) + except ConfigError as exc: + raise ConfigError("Codex CLI version is unavailable") from exc + if returncode != 0: + raise ConfigError("Codex CLI version is unavailable") + try: + version = output.decode("utf-8").strip() + except UnicodeDecodeError as exc: + raise ConfigError("Codex CLI version is unavailable") from exc + if not version or "\n" in version or "\r" in version: + raise ConfigError("Codex CLI version is unavailable") + return version
Full technical diff · 47 changed fields
removed /files/.codex-plugin~1assets~1composer-icon.png
{
"sha256": "ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a",
"size": 234585
}Field is absent
removed /files/.codex-plugin~1assets~1logo.png
{
"sha256": "ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a",
"size": 234585
}Field is absent
changed /files/.codex-plugin~1plugin.json/sha256
"bd2b05047cb9c0e431191d6dbb7c5f8a6baae2afb5fe52f37ac8fed46588edac"
"4ab3069acea26fc5863aaacaf2dadfe0052c9d68fa22eb0211da0440c7ad3d31"
changed /files/.codex-plugin~1plugin.json/size
2298
2503
added /files/LICENSE
Field was absent
{
"sha256": "9bd605a064788e28a3961c76ba61142bed298270bfa96b06028ac450821a5258",
"size": 1071
}added /files/NOTICE.md
Field was absent
{
"sha256": "6fbd501f4d2dc5deb6656dbe7571ce7c78c59db8bac92416c41f2f7fd1891316",
"size": 332
}changed /files/advisor.toml/sha256
"55b952049fb9ac8b472f700321a5d92eb579605c7147797f41735b221ecab191"
"73bbb4b5bad3eb5146af1e17c270517187028266da3c4a3db722e6adf81a71da"
changed /files/advisor.toml/size
595
597
changed /files/agents~1advisor-sol.toml/sha256
"517f670937b2174dcd6467e39381b55d3ba133bd97c697c988bf77082dd1531d"
"b3d58c2bd9164f0117338e9d620c3c668abf7eba12949bb840704b65d86c9a1f"
changed /files/agents~1advisor-sol.toml/size
1584
1586
changed /files/agents~1advisor-terra.toml/sha256
"4b46bd1f354e17d0ed2eaa746fb3f838e2d5bee04ed44524b9557de1820b064e"
"97e9beed9a0a571423a580b6d5190d9b6b2d65a31f5dcef694f02c0246dea1ee"
changed /files/models.json/sha256
"06f8c49d7943d56682a40633a6bb072831d087d6f589f25096c2042e8017a252"
"7e6fa2bf8998c8c6f55534b15da19bccf6d239db74da517b9bf78d2063e4caa3"
changed /files/models.json/size
899
903
changed /files/scripts~1advisor-config.sh/sha256
"41fe054137a6530e6d14c7a4811c857c131a95d81eae6a95080f0cf45d151e28"
"3889220b9198ca419a3deece0a0d8f212965b5d9b95e62effa2b27df49abdd70"
changed /files/scripts~1advisor-config.sh/size
325
692
added /files/scripts~1advisor_canary.py
Field was absent
{
"sha256": "39c912ee039e087bb1abc614a6fa7eee56057084991cf66230528f4e1c1f7a5e",
"size": 10505
}added /files/scripts~1advisor_catalog.py
Field was absent
{
"sha256": "c78f3898475acb922432cc0c78c70cd67b3c61e5072ec7b77a76789f7a51a01f",
"size": 14818
}changed /files/scripts~1advisor_config.py/sha256
"f5feee3e230f98a988b305f916eb4684282ca4597eebfa11286ab4acb1aa4c8d"
"e7539d73a9317b4c39e3c222052fdabfa165ea274f43706b2f922523877e73bf"
changed /files/scripts~1advisor_config.py/size
90558
16411
added /files/scripts~1advisor_discovery.py
Field was absent
{
"sha256": "03b4df7bf8fc58b7ac3ed3576831ba128a616fd8817be4abe9faf3b97cb464d9",
"size": 9135
}added /files/scripts~1advisor_doctor.py
Field was absent
{
"sha256": "0cd8973ace6fee18fab8400725090d919e73e3cde20a3bd8033029a1d529d603",
"size": 9041
}added /files/scripts~1advisor_journal.py
Field was absent
{
"sha256": "6a2a994097b01fa8c956dcd73763565169e7ee5fca2cb05ee1fbca8bad852c88",
"size": 9681
}added /files/scripts~1advisor_settings.py
Field was absent
{
"sha256": "8a3f89f0983534ed726cc1bb1dc8f7dcf14d0443e08dba655fa1d4692756be9d",
"size": 13440
}added /files/scripts~1advisor_state.py
Field was absent
{
"sha256": "e788e9b64d2cdb21c52ca76e6a7b68b5d7695e449f66d80f440da0319118b56e",
"size": 12326
}changed /files/scripts~1evaluate-triggers.sh/sha256
"ead7570ec2086ed726820b56251596120107f8e7bc07caa028d6ee89342dd8fe"
"e2a5d537e51a2c9c1cd31c0a8060e9fbdc7d9eecad3ccdbcc9c3baddf4f238c9"
changed /files/scripts~1evaluate-triggers.sh/size
25580
25586
changed /files/scripts~1install-agents.sh/sha256
"59ac0e3cadae49cd6228d592a0e665aef80a0f03cd46e00f639c3c792753285f"
"c8bcb94735ae0bdb276a05e68e69bba293155fe3644545bff0cd920208ebd83b"
changed /files/scripts~1install-agents.sh/size
16432
18620
changed /files/scripts~1run-advisor.sh/sha256
"e93d33441b827c3b6cb87ea75cee87dd4e7d7c8381fdb1c676b8421f30e83131"
"c31b5f6af99f5d577748260e63ea0cebc17ef55a7c20e93917358e2bf1afb4ab"
changed /files/scripts~1run-advisor.sh/size
27596
27506
changed /files/scripts~1verify.sh/sha256
"06a5b9bceda7dfb693353744e75fb371e335f815be25e5dd0fe4b5c941f52566"
"dde2181752a614b3b914b48dd62f29798185b6dbe3e5d57ddcbe068ef8ef0d62"
changed /files/scripts~1verify.sh/size
129023
4700
removed /files/settings.schema.json
{
"sha256": "2b38841cbc898b9da626845e23b6db002d71755a1ff16114e67fb2ad9b1a9cb5",
"size": 1200
}Field is absent
changed /files/skills~1consultation~1SKILL.md/sha256
"8314e737292358a8731034058946cf53a534082e5d098f1d03ec5b4a24517dd5"
"fc07af46962e0ddcdc0d4fadd53c959d7938580e624fcb959820105d92f5cc9f"
changed /files/skills~1consultation~1SKILL.md/size
17484
17488
changed /files/skills~1consultation~1references~1operations.md/sha256
"3d82d8689478200f19ac76aa02375512a8c8bd096959b8c78f73d81b5c548004"
"41f6790b742bf146e9f58ae2b7d5fc710e07f19b4ed2fe282cdd63475f621047"
changed /files/skills~1consultation~1references~1operations.md/size
22558
22564
added /files/tests~1advisor_transport_support.py
Field was absent
{
"sha256": "ab4d43ce97049e90f3902947c9251c087b681e5a2f6b963085b85b5c0b54ffd2",
"size": 11089
}changed /files/tests~1test_advisor_cli.py/sha256
"b1b2ad9415e560da63ff6f8f8cfb76233b828de6fb459f306e3a6b58b3100f64"
"0edfa5b16f1d35ebb714b177ab4b6c12ad3f4647ab965e290e1c19415058540b"
changed /files/tests~1test_advisor_cli.py/size
17635
27646
changed /files/tests~1test_advisor_config.py/sha256
"169b5aa46700a4f09c6ee0dbadf3d02b1b6c91465a356de38804d5ebdc8ed9dc"
"aa52b9fadef51b8121f4da4038914058952c1268aac23b68e1d8c7dcddd9a677"
changed /files/tests~1test_advisor_config.py/size
25728
28147
added /files/tests~1test_advisor_setup.py
Field was absent
{
"sha256": "88f7545477e62f2a3d4317e32410eecdd92ea907679fc64206eddbd824d12ed9",
"size": 10603
}changed /files/tests~1test_advisor_transport.py/sha256
"aa566e1057819c5c1385b8659ddb51eb1f7e55ec8551e2acdb52a1feadb9067f"
"d5318adabba6b6c1d2d5b7c9d41d48f91ac6b61352f897e5368afbf1bcacc4b9"
changed /files/tests~1test_advisor_transport.py/size
26202
21224
changed /files/tests~1test_advisor_usage.py/sha256
"d5a5d1ecf82c9a2254e3565d24d7854ef05442cbacc1725432503138f153f70b"
"3cfe33013652669e3756f5945248ac33776ce7f03ab53435aca794ca50f53d68"
changed /files/tests~1test_advisor_usage.py/size
24681
24870
Full snapshot data
{
"files": {
".codex-plugin/plugin.json": {
"sha256": "4ab3069acea26fc5863aaacaf2dadfe0052c9d68fa22eb0211da0440c7ad3d31",
"size": 2503
},
"LICENSE": {
"sha256": "9bd605a064788e28a3961c76ba61142bed298270bfa96b06028ac450821a5258",
"size": 1071
},
"NOTICE.md": {
"sha256": "6fbd501f4d2dc5deb6656dbe7571ce7c78c59db8bac92416c41f2f7fd1891316",
"size": 332
},
"advisor-response.schema.json": {
"sha256": "01019be4a32a8257d852d50ec791184e6edbfbaa39cafd61a575e990c9933c40",
"size": 666
},
"advisor.toml": {
"sha256": "73bbb4b5bad3eb5146af1e17c270517187028266da3c4a3db722e6adf81a71da",
"size": 597
},
"agents/advisor-astra.toml": {
"sha256": "355b6e0286a15900f64e8bf6a5e743b26eb4a9fdf7e282ef70c7adb61352f754",
"size": 1582
},
"agents/advisor-sol.toml": {
"sha256": "b3d58c2bd9164f0117338e9d620c3c668abf7eba12949bb840704b65d86c9a1f",
"size": 1586
},
"agents/advisor-terra.toml": {
"sha256": "97e9beed9a0a571423a580b6d5190d9b6b2d65a31f5dcef694f02c0246dea1ee",
"size": 1597
},
"assets/advisor-composer-icon.png": {
"sha256": "ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a",
"size": 234585
},
"assets/advisor-logo.png": {
"sha256": "ea58c4a9d45cdc20ed9ded61d690d96487004a5f12643f9bb09e53260eabbf6a",
"size": 234585
},
"evals/trigger-cases.json": {
"sha256": "68aa2b683073c632d16f146c55598ff906044248ad85998aaac3f9074278cfc1",
"size": 2943
},
"models.json": {
"sha256": "7e6fa2bf8998c8c6f55534b15da19bccf6d239db74da517b9bf78d2063e4caa3",
"size": 903
},
"scripts/advisor-audit.sh": {
"sha256": "c8e905fbf62f620b273ff839f574a0f1a0367b46e6b839426f0c05721a886bc8",
"size": 37485
},
"scripts/advisor-config.sh": {
"sha256": "3889220b9198ca419a3deece0a0d8f212965b5d9b95e62effa2b27df49abdd70",
"size": 692
},
"scripts/advisor_canary.py": {
"sha256": "39c912ee039e087bb1abc614a6fa7eee56057084991cf66230528f4e1c1f7a5e",
"size": 10505
},
"scripts/advisor_catalog.py": {
"sha256": "c78f3898475acb922432cc0c78c70cd67b3c61e5072ec7b77a76789f7a51a01f",
"size": 14818
},
"scripts/advisor_config.py": {
"sha256": "e7539d73a9317b4c39e3c222052fdabfa165ea274f43706b2f922523877e73bf",
"size": 16411
},
"scripts/advisor_discovery.py": {
"sha256": "03b4df7bf8fc58b7ac3ed3576831ba128a616fd8817be4abe9faf3b97cb464d9",
"size": 9135
},
"scripts/advisor_doctor.py": {
"sha256": "0cd8973ace6fee18fab8400725090d919e73e3cde20a3bd8033029a1d529d603",
"size": 9041
},
"scripts/advisor_journal.py": {
"sha256": "6a2a994097b01fa8c956dcd73763565169e7ee5fca2cb05ee1fbca8bad852c88",
"size": 9681
},
"scripts/advisor_process.py": {
"sha256": "841274eebb90ef5d0a99fe26ab5f2ff30e86883dcb3d20bce112206625953c04",
"size": 17793
},
"scripts/advisor_settings.py": {
"sha256": "8a3f89f0983534ed726cc1bb1dc8f7dcf14d0443e08dba655fa1d4692756be9d",
"size": 13440
},
"scripts/advisor_state.py": {
"sha256": "e788e9b64d2cdb21c52ca76e6a7b68b5d7695e449f66d80f440da0319118b56e",
"size": 12326
},
"scripts/evaluate-triggers.sh": {
"sha256": "e2a5d537e51a2c9c1cd31c0a8060e9fbdc7d9eecad3ccdbcc9c3baddf4f238c9",
"size": 25586
},
"scripts/inspect-agent-runtime.sh": {
"sha256": "bb5d7d3011529e73899c76474527d8106486f67017ea09bccb107b36bc4e8831",
"size": 4560
},
"scripts/inspect-parent-runtime.sh": {
"sha256": "b647eb7ea5d00c2fe297840e7a4ad8a2e13e9ddedcd679cf89da3865f41080bd",
"size": 2224
},
"scripts/install-agents.sh": {
"sha256": "c8bcb94735ae0bdb276a05e68e69bba293155fe3644545bff0cd920208ebd83b",
"size": 18620
},
"scripts/run-advisor.sh": {
"sha256": "c31b5f6af99f5d577748260e63ea0cebc17ef55a7c20e93917358e2bf1afb4ab",
"size": 27506
},
"scripts/verify.sh": {
"sha256": "dde2181752a614b3b914b48dd62f29798185b6dbe3e5d57ddcbe068ef8ef0d62",
"size": 4700
},
"skills/consultation/SKILL.md": {
"sha256": "fc07af46962e0ddcdc0d4fadd53c959d7938580e624fcb959820105d92f5cc9f",
"size": 17488
},
"skills/consultation/agents/openai.yaml": {
"sha256": "3a9c1d3552e1d5aa94812fea0bc6af189a5bde271596ca8de7b3ea979e01a73f",
"size": 312
},
"skills/consultation/references/operations.md": {
"sha256": "41f6790b742bf146e9f58ae2b7d5fc710e07f19b4ed2fe282cdd63475f621047",
"size": 22564
},
"tests/advisor_transport_support.py": {
"sha256": "ab4d43ce97049e90f3902947c9251c087b681e5a2f6b963085b85b5c0b54ffd2",
"size": 11089
},
"tests/test_advisor_cli.py": {
"sha256": "0edfa5b16f1d35ebb714b177ab4b6c12ad3f4647ab965e290e1c19415058540b",
"size": 27646
},
"tests/test_advisor_config.py": {
"sha256": "aa52b9fadef51b8121f4da4038914058952c1268aac23b68e1d8c7dcddd9a677",
"size": 28147
},
"tests/test_advisor_setup.py": {
"sha256": "88f7545477e62f2a3d4317e32410eecdd92ea907679fc64206eddbd824d12ed9",
"size": 10603
},
"tests/test_advisor_transport.py": {
"sha256": "d5318adabba6b6c1d2d5b7c9d41d48f91ac6b61352f897e5368afbf1bcacc4b9",
"size": 21224
},
"tests/test_advisor_usage.py": {
"sha256": "3cfe33013652669e3756f5945248ac33776ce7f03ab53435aca794ca50f53d68",
"size": 24870
}
}
}SHA-256 of public snapshot: a367e114a58cede454294847a55b600b337e44eb1140d8192311a44c4c2da40e