diff --git a/.github/workflows/refresh-github-signals.yml b/.github/workflows/refresh-github-signals.yml
index ed73416a..b242d1e1 100644
--- a/.github/workflows/refresh-github-signals.yml
+++ b/.github/workflows/refresh-github-signals.yml
@@ -60,7 +60,7 @@ jobs:
- name: Refresh GitHub signal artifacts
run: |
- python3 tools/github/sync_latest_signals.py \
+ python3 scripts/github/sync_latest_signals.py \
--repo openai/codex \
--token-env GH_API_TOKEN
@@ -68,8 +68,8 @@ jobs:
id: changes
run: |
if [ -z "$(git status --porcelain -- \
- tools/github/bundles \
- tools/github/analysis \
+ artifacts/github/bundles \
+ artifacts/github/analysis \
site/src/content/signals \
site/src/content/release-deltas/openai-codex-latest.json)" ]; then
echo "changed=false" >> "$GITHUB_OUTPUT"
@@ -87,8 +87,8 @@ jobs:
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add \
- tools/github/bundles \
- tools/github/analysis \
+ artifacts/github/bundles \
+ artifacts/github/analysis \
site/src/content/signals \
site/src/content/release-deltas/openai-codex-latest.json
git commit -m "chore(decodex): refresh github signals"
diff --git a/Makefile.toml b/Makefile.toml
index 01063fd6..46f2799c 100644
--- a/Makefile.toml
+++ b/Makefile.toml
@@ -60,8 +60,8 @@ dependencies = [
[tasks.check-site-content]
workspace = false
script = [
- "python3 tools/github/validate_change_bundle.py tools/github/bundles",
- "python3 tools/github/validate_signal_entry.py site/src/content/signals",
+ "python3 scripts/github/validate_change_bundle.py artifacts/github/bundles",
+ "python3 scripts/github/validate_signal_entry.py site/src/content/signals",
]
[tasks.check-site-types]
diff --git a/README.md b/README.md
index 2965ee5a..6221f115 100644
--- a/README.md
+++ b/README.md
@@ -1,55 +1,87 @@
+
+
# Decodex
-Decodex is a mono repo for repo-native agent orchestration and public Codex signal
-publishing.
+Repo-native agent orchestration and public Codex signal publishing.
+
+[](https://www.gnu.org/licenses/gpl-3.0)
+[](https://github.com/hack-ink/decodex/actions/workflows/language.yml)
+[](https://github.com/hack-ink/decodex/actions/workflows/release.yml)
+[](https://github.com/hack-ink/decodex/tags)
+[](https://github.com/hack-ink/decodex)
+[](https://github.com/hack-ink/decodex)
+
+https://decodex.space
+
+

-The repository has two deliberately separate product surfaces:
+
-- a local Rust runtime and operator control plane for retained coding-agent lanes
-- a static public site that publishes GitHub-backed Codex change signals
+## Feature Highlights
-The static site remains the public surface by default. Runtime and operator behavior
-does not become a public site backend just because both surfaces now live in one
-workspace.
+- Rust CLI and runtime for repo-native retained coding-agent lanes.
+- Explicit project registry under `~/.codex/decodex/projects//`.
+- Local operator listener with a read-only dashboard at `/` and `/dashboard`, plus
+ `GET /state` for JSON snapshots.
+- Static Astro site that publishes GitHub-backed Codex change signals.
+- Deterministic GitHub signal pipeline for change bundles, release deltas, rendered
+ signal entries, and content validation.
+- Installable Decodex plugin with reusable agent-facing skills for manual CLI,
+ automation, commit, land, and labels.
+- Repository documentation split by question type into spec, runbook, reference, and
+ decision lanes.
## Status
+Prototype / in active development.
+
This repository now integrates the former runtime repository and the static signal site
-into one Decodex workspace:
+into one Decodex workspace. The static site remains the public surface by default.
+Runtime and operator behavior does not become a public site backend just because both
+surfaces live in one workspace.
+
+Supported runtime host targets are macOS and Linux. Windows remains unsupported for the
+runtime.
+
+## App identity
+
+- Product display name: **Decodex**.
+- Runtime CLI binary: **decodex**.
+- Public site: .
+- Lower-case `decodex` remains only for stable technical identifiers such as the
+ repository slug, Cargo package name, CLI binary, plugin package, config keys, and
+ schema names.
+
+## Workspace posture
- `apps/decodex/` owns the Rust package that builds the `decodex` CLI and runtime.
- `site/` owns the Astro static site and checked-in public content.
-- `tools/github/` owns deterministic GitHub bundle, release-delta, render, and
+- `scripts/github/` owns deterministic GitHub bundle, release-delta, render, and
validation scripts.
+- `artifacts/github/` owns checked-in GitHub bundles and editorial analysis drafts.
- `plugins/decodex/` owns the installable Decodex plugin and reusable agent-facing
skills.
+- `dev/skills/` owns repository-development skill-like instructions that are not
+ packaged with the installable Decodex plugin.
- `docs/` remains the authoritative documentation surface.
-Supported runtime host targets are macOS and Linux. Windows remains unsupported for the
-runtime.
+Runtime authority stays in `apps/decodex/src/`, the registered project contracts under
+`~/.codex/decodex/projects//`, and the governing specs under `docs/spec/`.
+Public site authority stays in `site/`, `scripts/github/`, `artifacts/github/`, and
+the site/content specs.
+
+## Runtime platform support
+
+- The Decodex runtime contract is Unix-only: macOS and Linux.
+- Windows is outside the runtime contract.
+- The public site is static and deploys through GitHub Pages.
+- Starting `decodex serve` without `--config` loads enabled projects from the explicit
+ registry only. It does not scan Codex history, repo-local config files, or currently
+ open worktrees to infer projects.
+
+## Usage
-## Repository Layout
-
-- `apps/decodex/src/` holds the Decodex runtime, orchestration logic, tracker
- integrations, app-server integration, operator HTTP server, and authoritative
- implementation behavior.
-- `site/` holds the static Astro application and site-owned content collections.
-- `tools/github/` holds deterministic public-signal collection and validation tooling.
-- `plugins/decodex/` holds the canonical Decodex plugin source.
-- `docs/spec/` holds normative runtime, workflow, site, and content contracts.
-- `docs/runbook/` holds operator procedures, validation sequences, deployment steps, and
- content workflows.
-- `docs/reference/` holds current repository and artifact surface maps.
-- `docs/decisions/` holds durable design rationale and tradeoffs.
-- `docs/research/` holds machine-authored research run artifacts used by shipped
- research tooling.
-- `docs/plans/` holds historical saved plan artifacts from the static-site bootstrap.
-- `scripts/` and `dev/` hold repository-level helpers that are not part of the shipped
- runtime binary.
-- `decodex.example.toml` is the redacted project-config template; live project
- contracts live under `~/.codex/decodex/projects//`.
-
-## Runtime CLI
+### Runtime CLI
From the workspace root:
@@ -62,22 +94,25 @@ cargo run -p decodex -- run --dry-run
cargo run -p decodex -- serve --interval 60s --listen-address 127.0.0.1:8912
```
-Install the local runtime binary from the package directory:
+### Install from Source
```sh
+git clone https://github.com/hack-ink/decodex
+cd decodex
+
cargo install --path apps/decodex --force
decodex --version
```
+### Project contracts
+
Project contracts are managed outside checkouts under
`~/.codex/decodex/projects//` with fixed filenames:
- `project.toml` for service paths and credential environment-variable names
- `WORKFLOW.md` for execution policy
-Starting `decodex serve` without `--config` loads enabled projects from the explicit
-registry only. It does not scan Codex history, repo-local config files, or currently
-open worktrees to infer projects.
+The redacted template for a project config lives at `decodex.example.toml`.
## Static Site
@@ -99,29 +134,28 @@ The public site does not own:
- app-server orchestration
- the operator dashboard served by `decodex serve`
-The static-site boundary is recorded in
-[`docs/decisions/static-public-site.md`](docs/decisions/static-public-site.md). GitHub
-Pages setup for `https://decodex.space` lives in
-[`docs/runbook/github-pages-deploy.md`](docs/runbook/github-pages-deploy.md).
+The static-site boundary is recorded in `docs/decisions/static-public-site.md`. GitHub
+Pages setup for `https://decodex.space` lives in `docs/runbook/github-pages-deploy.md`.
## GitHub Signal Pipeline
The GitHub-first public signal path stays deterministic and reviewable:
-- `tools/github/build_change_bundle.py` builds normalized GitHub bundles.
-- `plugins/decodex/skills/github-signal/SKILL.md` defines the Codex editorial step.
-- `tools/github/sync_latest_signals.py` discovers recent merged PRs and refreshes
+- `scripts/github/build_change_bundle.py` builds normalized GitHub bundles under
+ `artifacts/github/bundles/`.
+- `dev/skills/github-signal/SKILL.md` records the repo-local Codex editorial
+ instructions. It is not part of the installable Decodex plugin distribution.
+- `scripts/github/sync_latest_signals.py` discovers recent merged PRs and refreshes
content artifacts.
-- `tools/github/render_signal_entry.py` renders reviewed analysis drafts into site
+- `scripts/github/render_signal_entry.py` renders reviewed analysis drafts into site
content.
-- `tools/github/validate_signal_entry.py` validates the published signal collection.
+- `scripts/github/validate_signal_entry.py` validates the published signal collection.
- `.github/workflows/refresh-github-signals.yml` refreshes GitHub-backed signals every
hour from a trusted runner.
- `.github/workflows/deploy-pages.yml` publishes the Astro site to GitHub Pages on
pushes to `main`.
-The governing workflow lives in
-[`docs/runbook/local-github-signal-workflow.md`](docs/runbook/local-github-signal-workflow.md).
+The governing workflow lives at `docs/runbook/local-github-signal-workflow.md`.
## Operator Dashboard
@@ -137,7 +171,7 @@ node dev/operator-dashboard-mock.mjs --listen-address 127.0.0.1:57399 --use-code
```
The dashboard semantics and local-vs-external state boundary live in
-[`docs/reference/operator-control-plane.md`](docs/reference/operator-control-plane.md).
+`docs/reference/operator-control-plane.md`.
## Development
@@ -164,17 +198,80 @@ Static-site/content checks are available separately:
cargo make decodex-checks
```
+## Workspace Layout
+
+The tracked workspace currently keeps:
+
+- `apps/decodex/` as the Rust package that builds the `decodex` CLI and runtime
+- `site/` as the Astro static site for the public Decodex signal surface
+- `scripts/github/` as the deterministic GitHub collection, normalization, render, and
+ validation script surface
+- `artifacts/github/` as checked-in GitHub bundle and analysis artifacts
+- `plugins/decodex/` as the canonical installable Decodex plugin source
+- `dev/skills/` as repo-development skill-like instructions that are not packaged with
+ the installable Decodex plugin
+- `docs/spec/` as the normative runtime, workflow, site, and content contract lane
+- `docs/runbook/` as the operator procedures, validation sequences, deployment steps,
+ and content workflow lane
+- `docs/reference/` as the current repository and artifact surface map lane
+- `docs/decisions/` as the durable design-rationale lane
+- `docs/research/` as machine-authored research artifacts used by shipped research
+ tooling
+- `docs/plans/` as historical saved plan artifacts from the static-site bootstrap
+- `dev/` as local development helpers outside `dev/skills/`, such as the operator
+ dashboard mock server
+- `assets/` as shared static assets that are not owned by the Astro app's generated
+ output
+- `.github/` as CI, release, Pages deployment, and content-refresh workflows
+
+Generated or local-only directories such as `target/`, `site/dist/`, `site/.astro/`,
+`.worktrees/`, `.workspaces/`, and `.codex/` are not part of the tracked repository
+structure. For the authoritative layout and ownership map, read
+`docs/reference/workspace-layout.md`.
+
## Documentation
-- Repository router: [`docs/index.md`](docs/index.md)
-- Documentation policy: [`docs/policy.md`](docs/policy.md)
-- Specifications: [`docs/spec/index.md`](docs/spec/index.md)
-- Operational runbooks: [`docs/runbook/index.md`](docs/runbook/index.md)
-- Reference docs: [`docs/reference/index.md`](docs/reference/index.md)
-- Design decisions: [`docs/decisions/index.md`](docs/decisions/index.md)
-- Workspace layout: [`docs/reference/workspace-layout.md`](docs/reference/workspace-layout.md)
-- Static-site decision: [`docs/decisions/static-public-site.md`](docs/decisions/static-public-site.md)
+- Product and development overview: this `README.md`
+- Unified documentation router: `docs/index.md`
+- Normative specs: `docs/spec/index.md`
+- Procedural runbooks: `docs/runbook/index.md`
+- Current implementation references: `docs/reference/index.md`
+- Durable design rationale: `docs/decisions/index.md`
+- Documentation policy and placement rules: `docs/policy.md`
+
+## Support Me
+
+If you find this project helpful and would like to support its development, you can buy me a coffee!
+
+Your support is greatly appreciated and motivates me to keep improving this project.
+
+- **Fiat**
+ - [Ko-fi](https://ko-fi.com/hack_ink)
+ - [Afdian](https://afdian.com/a/hack_ink)
+- **Crypto**
+ - **Bitcoin**
+ - `bc1pedlrf67ss52md29qqkzr2avma6ghyrt4jx9ecp9457qsl75x247sqcp43c`
+ - **Ethereum**
+ - `0x3e25247CfF03F99a7D83b28F207112234feE73a6`
+ - **Polkadot**
+ - `156HGo9setPcU2qhFMVWLkcmtCEGySLwNqa3DaEiYSWtte4Y`
+
+Thank you for your support!
+
+## Appreciation
+
+We would like to extend our heartfelt gratitude to the following projects and contributors:
+
+- The Rust community for their continuous support and development of the Rust ecosystem.
+
+## Additional Acknowledgements
+
+- TODO
+
+
+
+### License
-## License
+Licensed under [GPL-3.0](LICENSE).
-Licensed under [GPL-3.0](LICENSE).
+
diff --git a/artifacts/github/README.md b/artifacts/github/README.md
new file mode 100644
index 00000000..aea86e50
--- /dev/null
+++ b/artifacts/github/README.md
@@ -0,0 +1,9 @@
+# GitHub Artifacts
+
+This directory stores checked-in GitHub signal pipeline artifacts.
+
+- `bundles/` holds normalized `github_change_bundle/v1` inputs.
+- `analysis/` holds reviewed Codex editorial analysis drafts.
+
+Executable automation for these artifacts lives under `scripts/github/`. Repo-local
+editorial instructions live under `dev/skills/github-signal/`.
diff --git a/tools/github/analysis/openai-codex-pr-12334.analysis.json b/artifacts/github/analysis/openai-codex-pr-12334.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-12334.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-12334.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-13494.analysis.json b/artifacts/github/analysis/openai-codex-pr-13494.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-13494.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-13494.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14632.analysis.json b/artifacts/github/analysis/openai-codex-pr-14632.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14632.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14632.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14847.analysis.json b/artifacts/github/analysis/openai-codex-pr-14847.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14847.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14847.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14867.analysis.json b/artifacts/github/analysis/openai-codex-pr-14867.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14867.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14867.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14888.analysis.json b/artifacts/github/analysis/openai-codex-pr-14888.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14888.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14888.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14945.analysis.json b/artifacts/github/analysis/openai-codex-pr-14945.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14945.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14945.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14970.analysis.json b/artifacts/github/analysis/openai-codex-pr-14970.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14970.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14970.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-14988.analysis.json b/artifacts/github/analysis/openai-codex-pr-14988.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-14988.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-14988.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15011.analysis.json b/artifacts/github/analysis/openai-codex-pr-15011.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15011.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15011.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15021.analysis.json b/artifacts/github/analysis/openai-codex-pr-15021.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15021.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15021.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15041.analysis.json b/artifacts/github/analysis/openai-codex-pr-15041.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15041.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15041.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15042.analysis.json b/artifacts/github/analysis/openai-codex-pr-15042.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15042.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15042.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15056.analysis.json b/artifacts/github/analysis/openai-codex-pr-15056.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15056.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15056.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15072.analysis.json b/artifacts/github/analysis/openai-codex-pr-15072.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15072.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15072.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15075.analysis.json b/artifacts/github/analysis/openai-codex-pr-15075.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15075.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15075.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15076.analysis.json b/artifacts/github/analysis/openai-codex-pr-15076.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15076.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15076.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15077.analysis.json b/artifacts/github/analysis/openai-codex-pr-15077.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15077.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15077.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15088.analysis.json b/artifacts/github/analysis/openai-codex-pr-15088.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15088.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15088.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15089.analysis.json b/artifacts/github/analysis/openai-codex-pr-15089.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15089.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15089.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15090.analysis.json b/artifacts/github/analysis/openai-codex-pr-15090.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15090.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15090.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15092.analysis.json b/artifacts/github/analysis/openai-codex-pr-15092.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15092.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15092.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15100.analysis.json b/artifacts/github/analysis/openai-codex-pr-15100.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15100.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15100.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15102.analysis.json b/artifacts/github/analysis/openai-codex-pr-15102.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15102.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15102.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15103.analysis.json b/artifacts/github/analysis/openai-codex-pr-15103.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15103.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15103.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15104.analysis.json b/artifacts/github/analysis/openai-codex-pr-15104.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15104.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15104.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15111.analysis.json b/artifacts/github/analysis/openai-codex-pr-15111.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15111.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15111.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15118.analysis.json b/artifacts/github/analysis/openai-codex-pr-15118.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15118.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15118.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15119.analysis.json b/artifacts/github/analysis/openai-codex-pr-15119.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15119.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15119.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15125.analysis.json b/artifacts/github/analysis/openai-codex-pr-15125.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15125.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15125.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15150.analysis.json b/artifacts/github/analysis/openai-codex-pr-15150.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15150.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15150.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15154.analysis.json b/artifacts/github/analysis/openai-codex-pr-15154.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15154.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15154.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15163.analysis.json b/artifacts/github/analysis/openai-codex-pr-15163.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15163.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15163.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15175.analysis.json b/artifacts/github/analysis/openai-codex-pr-15175.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15175.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15175.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15180.analysis.json b/artifacts/github/analysis/openai-codex-pr-15180.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15180.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15180.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15185.analysis.json b/artifacts/github/analysis/openai-codex-pr-15185.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15185.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15185.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15190.analysis.json b/artifacts/github/analysis/openai-codex-pr-15190.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15190.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15190.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15195.analysis.json b/artifacts/github/analysis/openai-codex-pr-15195.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15195.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15195.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15196.analysis.json b/artifacts/github/analysis/openai-codex-pr-15196.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15196.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15196.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15198.analysis.json b/artifacts/github/analysis/openai-codex-pr-15198.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15198.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15198.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15199.analysis.json b/artifacts/github/analysis/openai-codex-pr-15199.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15199.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15199.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15201.analysis.json b/artifacts/github/analysis/openai-codex-pr-15201.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15201.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15201.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15203.analysis.json b/artifacts/github/analysis/openai-codex-pr-15203.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15203.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15203.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15206.analysis.json b/artifacts/github/analysis/openai-codex-pr-15206.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15206.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15206.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15207.analysis.json b/artifacts/github/analysis/openai-codex-pr-15207.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15207.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15207.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15215.analysis.json b/artifacts/github/analysis/openai-codex-pr-15215.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15215.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15215.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15216.analysis.json b/artifacts/github/analysis/openai-codex-pr-15216.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15216.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15216.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15217.analysis.json b/artifacts/github/analysis/openai-codex-pr-15217.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15217.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15217.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15220.analysis.json b/artifacts/github/analysis/openai-codex-pr-15220.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15220.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15220.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15222.analysis.json b/artifacts/github/analysis/openai-codex-pr-15222.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15222.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15222.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15223.analysis.json b/artifacts/github/analysis/openai-codex-pr-15223.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15223.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15223.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15232.analysis.json b/artifacts/github/analysis/openai-codex-pr-15232.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15232.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15232.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15233.analysis.json b/artifacts/github/analysis/openai-codex-pr-15233.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15233.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15233.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15252.analysis.json b/artifacts/github/analysis/openai-codex-pr-15252.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15252.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15252.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15253.analysis.json b/artifacts/github/analysis/openai-codex-pr-15253.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15253.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15253.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15254.analysis.json b/artifacts/github/analysis/openai-codex-pr-15254.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15254.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15254.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15259.analysis.json b/artifacts/github/analysis/openai-codex-pr-15259.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15259.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15259.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15262.analysis.json b/artifacts/github/analysis/openai-codex-pr-15262.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15262.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15262.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15263.analysis.json b/artifacts/github/analysis/openai-codex-pr-15263.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15263.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15263.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15264.analysis.json b/artifacts/github/analysis/openai-codex-pr-15264.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15264.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15264.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15275.analysis.json b/artifacts/github/analysis/openai-codex-pr-15275.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15275.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15275.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15279.analysis.json b/artifacts/github/analysis/openai-codex-pr-15279.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15279.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15279.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15348.analysis.json b/artifacts/github/analysis/openai-codex-pr-15348.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15348.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15348.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15376.analysis.json b/artifacts/github/analysis/openai-codex-pr-15376.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15376.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15376.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15390.analysis.json b/artifacts/github/analysis/openai-codex-pr-15390.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15390.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15390.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15409.analysis.json b/artifacts/github/analysis/openai-codex-pr-15409.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15409.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15409.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15414.analysis.json b/artifacts/github/analysis/openai-codex-pr-15414.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15414.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15414.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15443.analysis.json b/artifacts/github/analysis/openai-codex-pr-15443.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15443.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15443.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15659.analysis.json b/artifacts/github/analysis/openai-codex-pr-15659.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15659.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15659.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15759.analysis.json b/artifacts/github/analysis/openai-codex-pr-15759.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15759.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15759.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15785.analysis.json b/artifacts/github/analysis/openai-codex-pr-15785.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15785.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15785.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-15802.analysis.json b/artifacts/github/analysis/openai-codex-pr-15802.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-15802.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-15802.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16010.analysis.json b/artifacts/github/analysis/openai-codex-pr-16010.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16010.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16010.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16082.analysis.json b/artifacts/github/analysis/openai-codex-pr-16082.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16082.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16082.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16153.analysis.json b/artifacts/github/analysis/openai-codex-pr-16153.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16153.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16153.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16204.analysis.json b/artifacts/github/analysis/openai-codex-pr-16204.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16204.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16204.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16508.analysis.json b/artifacts/github/analysis/openai-codex-pr-16508.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16508.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16508.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16631.analysis.json b/artifacts/github/analysis/openai-codex-pr-16631.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16631.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16631.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16633.analysis.json b/artifacts/github/analysis/openai-codex-pr-16633.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16633.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16633.analysis.json
diff --git a/tools/github/analysis/openai-codex-pr-16946.analysis.json b/artifacts/github/analysis/openai-codex-pr-16946.analysis.json
similarity index 100%
rename from tools/github/analysis/openai-codex-pr-16946.analysis.json
rename to artifacts/github/analysis/openai-codex-pr-16946.analysis.json
diff --git a/tools/github/bundles/openai-codex-pr-12334.json b/artifacts/github/bundles/openai-codex-pr-12334.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-12334.json
rename to artifacts/github/bundles/openai-codex-pr-12334.json
diff --git a/tools/github/bundles/openai-codex-pr-13494.json b/artifacts/github/bundles/openai-codex-pr-13494.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-13494.json
rename to artifacts/github/bundles/openai-codex-pr-13494.json
diff --git a/tools/github/bundles/openai-codex-pr-14632.json b/artifacts/github/bundles/openai-codex-pr-14632.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14632.json
rename to artifacts/github/bundles/openai-codex-pr-14632.json
diff --git a/tools/github/bundles/openai-codex-pr-14847.json b/artifacts/github/bundles/openai-codex-pr-14847.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14847.json
rename to artifacts/github/bundles/openai-codex-pr-14847.json
diff --git a/tools/github/bundles/openai-codex-pr-14867.json b/artifacts/github/bundles/openai-codex-pr-14867.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14867.json
rename to artifacts/github/bundles/openai-codex-pr-14867.json
diff --git a/tools/github/bundles/openai-codex-pr-14888.json b/artifacts/github/bundles/openai-codex-pr-14888.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14888.json
rename to artifacts/github/bundles/openai-codex-pr-14888.json
diff --git a/tools/github/bundles/openai-codex-pr-14945.json b/artifacts/github/bundles/openai-codex-pr-14945.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14945.json
rename to artifacts/github/bundles/openai-codex-pr-14945.json
diff --git a/tools/github/bundles/openai-codex-pr-14970.json b/artifacts/github/bundles/openai-codex-pr-14970.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14970.json
rename to artifacts/github/bundles/openai-codex-pr-14970.json
diff --git a/tools/github/bundles/openai-codex-pr-14988.json b/artifacts/github/bundles/openai-codex-pr-14988.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-14988.json
rename to artifacts/github/bundles/openai-codex-pr-14988.json
diff --git a/tools/github/bundles/openai-codex-pr-15011.json b/artifacts/github/bundles/openai-codex-pr-15011.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15011.json
rename to artifacts/github/bundles/openai-codex-pr-15011.json
diff --git a/tools/github/bundles/openai-codex-pr-15021.json b/artifacts/github/bundles/openai-codex-pr-15021.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15021.json
rename to artifacts/github/bundles/openai-codex-pr-15021.json
diff --git a/tools/github/bundles/openai-codex-pr-15041.json b/artifacts/github/bundles/openai-codex-pr-15041.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15041.json
rename to artifacts/github/bundles/openai-codex-pr-15041.json
diff --git a/tools/github/bundles/openai-codex-pr-15042.json b/artifacts/github/bundles/openai-codex-pr-15042.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15042.json
rename to artifacts/github/bundles/openai-codex-pr-15042.json
diff --git a/tools/github/bundles/openai-codex-pr-15056.json b/artifacts/github/bundles/openai-codex-pr-15056.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15056.json
rename to artifacts/github/bundles/openai-codex-pr-15056.json
diff --git a/tools/github/bundles/openai-codex-pr-15072.json b/artifacts/github/bundles/openai-codex-pr-15072.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15072.json
rename to artifacts/github/bundles/openai-codex-pr-15072.json
diff --git a/tools/github/bundles/openai-codex-pr-15075.json b/artifacts/github/bundles/openai-codex-pr-15075.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15075.json
rename to artifacts/github/bundles/openai-codex-pr-15075.json
diff --git a/tools/github/bundles/openai-codex-pr-15076.json b/artifacts/github/bundles/openai-codex-pr-15076.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15076.json
rename to artifacts/github/bundles/openai-codex-pr-15076.json
diff --git a/tools/github/bundles/openai-codex-pr-15077.json b/artifacts/github/bundles/openai-codex-pr-15077.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15077.json
rename to artifacts/github/bundles/openai-codex-pr-15077.json
diff --git a/tools/github/bundles/openai-codex-pr-15088.json b/artifacts/github/bundles/openai-codex-pr-15088.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15088.json
rename to artifacts/github/bundles/openai-codex-pr-15088.json
diff --git a/tools/github/bundles/openai-codex-pr-15089.json b/artifacts/github/bundles/openai-codex-pr-15089.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15089.json
rename to artifacts/github/bundles/openai-codex-pr-15089.json
diff --git a/tools/github/bundles/openai-codex-pr-15090.json b/artifacts/github/bundles/openai-codex-pr-15090.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15090.json
rename to artifacts/github/bundles/openai-codex-pr-15090.json
diff --git a/tools/github/bundles/openai-codex-pr-15092.json b/artifacts/github/bundles/openai-codex-pr-15092.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15092.json
rename to artifacts/github/bundles/openai-codex-pr-15092.json
diff --git a/tools/github/bundles/openai-codex-pr-15100.json b/artifacts/github/bundles/openai-codex-pr-15100.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15100.json
rename to artifacts/github/bundles/openai-codex-pr-15100.json
diff --git a/tools/github/bundles/openai-codex-pr-15102.json b/artifacts/github/bundles/openai-codex-pr-15102.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15102.json
rename to artifacts/github/bundles/openai-codex-pr-15102.json
diff --git a/tools/github/bundles/openai-codex-pr-15103.json b/artifacts/github/bundles/openai-codex-pr-15103.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15103.json
rename to artifacts/github/bundles/openai-codex-pr-15103.json
diff --git a/tools/github/bundles/openai-codex-pr-15104.json b/artifacts/github/bundles/openai-codex-pr-15104.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15104.json
rename to artifacts/github/bundles/openai-codex-pr-15104.json
diff --git a/tools/github/bundles/openai-codex-pr-15111.json b/artifacts/github/bundles/openai-codex-pr-15111.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15111.json
rename to artifacts/github/bundles/openai-codex-pr-15111.json
diff --git a/tools/github/bundles/openai-codex-pr-15118.json b/artifacts/github/bundles/openai-codex-pr-15118.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15118.json
rename to artifacts/github/bundles/openai-codex-pr-15118.json
diff --git a/tools/github/bundles/openai-codex-pr-15119.json b/artifacts/github/bundles/openai-codex-pr-15119.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15119.json
rename to artifacts/github/bundles/openai-codex-pr-15119.json
diff --git a/tools/github/bundles/openai-codex-pr-15125.json b/artifacts/github/bundles/openai-codex-pr-15125.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15125.json
rename to artifacts/github/bundles/openai-codex-pr-15125.json
diff --git a/tools/github/bundles/openai-codex-pr-15150.json b/artifacts/github/bundles/openai-codex-pr-15150.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15150.json
rename to artifacts/github/bundles/openai-codex-pr-15150.json
diff --git a/tools/github/bundles/openai-codex-pr-15154.json b/artifacts/github/bundles/openai-codex-pr-15154.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15154.json
rename to artifacts/github/bundles/openai-codex-pr-15154.json
diff --git a/tools/github/bundles/openai-codex-pr-15163.json b/artifacts/github/bundles/openai-codex-pr-15163.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15163.json
rename to artifacts/github/bundles/openai-codex-pr-15163.json
diff --git a/tools/github/bundles/openai-codex-pr-15175.json b/artifacts/github/bundles/openai-codex-pr-15175.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15175.json
rename to artifacts/github/bundles/openai-codex-pr-15175.json
diff --git a/tools/github/bundles/openai-codex-pr-15180.json b/artifacts/github/bundles/openai-codex-pr-15180.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15180.json
rename to artifacts/github/bundles/openai-codex-pr-15180.json
diff --git a/tools/github/bundles/openai-codex-pr-15185.json b/artifacts/github/bundles/openai-codex-pr-15185.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15185.json
rename to artifacts/github/bundles/openai-codex-pr-15185.json
diff --git a/tools/github/bundles/openai-codex-pr-15190.json b/artifacts/github/bundles/openai-codex-pr-15190.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15190.json
rename to artifacts/github/bundles/openai-codex-pr-15190.json
diff --git a/tools/github/bundles/openai-codex-pr-15195.json b/artifacts/github/bundles/openai-codex-pr-15195.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15195.json
rename to artifacts/github/bundles/openai-codex-pr-15195.json
diff --git a/tools/github/bundles/openai-codex-pr-15196.json b/artifacts/github/bundles/openai-codex-pr-15196.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15196.json
rename to artifacts/github/bundles/openai-codex-pr-15196.json
diff --git a/tools/github/bundles/openai-codex-pr-15198.json b/artifacts/github/bundles/openai-codex-pr-15198.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15198.json
rename to artifacts/github/bundles/openai-codex-pr-15198.json
diff --git a/tools/github/bundles/openai-codex-pr-15199.json b/artifacts/github/bundles/openai-codex-pr-15199.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15199.json
rename to artifacts/github/bundles/openai-codex-pr-15199.json
diff --git a/tools/github/bundles/openai-codex-pr-15201.json b/artifacts/github/bundles/openai-codex-pr-15201.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15201.json
rename to artifacts/github/bundles/openai-codex-pr-15201.json
diff --git a/tools/github/bundles/openai-codex-pr-15203.json b/artifacts/github/bundles/openai-codex-pr-15203.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15203.json
rename to artifacts/github/bundles/openai-codex-pr-15203.json
diff --git a/tools/github/bundles/openai-codex-pr-15206.json b/artifacts/github/bundles/openai-codex-pr-15206.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15206.json
rename to artifacts/github/bundles/openai-codex-pr-15206.json
diff --git a/tools/github/bundles/openai-codex-pr-15207.json b/artifacts/github/bundles/openai-codex-pr-15207.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15207.json
rename to artifacts/github/bundles/openai-codex-pr-15207.json
diff --git a/tools/github/bundles/openai-codex-pr-15215.json b/artifacts/github/bundles/openai-codex-pr-15215.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15215.json
rename to artifacts/github/bundles/openai-codex-pr-15215.json
diff --git a/tools/github/bundles/openai-codex-pr-15216.json b/artifacts/github/bundles/openai-codex-pr-15216.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15216.json
rename to artifacts/github/bundles/openai-codex-pr-15216.json
diff --git a/tools/github/bundles/openai-codex-pr-15217.json b/artifacts/github/bundles/openai-codex-pr-15217.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15217.json
rename to artifacts/github/bundles/openai-codex-pr-15217.json
diff --git a/tools/github/bundles/openai-codex-pr-15220.json b/artifacts/github/bundles/openai-codex-pr-15220.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15220.json
rename to artifacts/github/bundles/openai-codex-pr-15220.json
diff --git a/tools/github/bundles/openai-codex-pr-15222.json b/artifacts/github/bundles/openai-codex-pr-15222.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15222.json
rename to artifacts/github/bundles/openai-codex-pr-15222.json
diff --git a/tools/github/bundles/openai-codex-pr-15223.json b/artifacts/github/bundles/openai-codex-pr-15223.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15223.json
rename to artifacts/github/bundles/openai-codex-pr-15223.json
diff --git a/tools/github/bundles/openai-codex-pr-15232.json b/artifacts/github/bundles/openai-codex-pr-15232.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15232.json
rename to artifacts/github/bundles/openai-codex-pr-15232.json
diff --git a/tools/github/bundles/openai-codex-pr-15233.json b/artifacts/github/bundles/openai-codex-pr-15233.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15233.json
rename to artifacts/github/bundles/openai-codex-pr-15233.json
diff --git a/tools/github/bundles/openai-codex-pr-15252.json b/artifacts/github/bundles/openai-codex-pr-15252.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15252.json
rename to artifacts/github/bundles/openai-codex-pr-15252.json
diff --git a/tools/github/bundles/openai-codex-pr-15253.json b/artifacts/github/bundles/openai-codex-pr-15253.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15253.json
rename to artifacts/github/bundles/openai-codex-pr-15253.json
diff --git a/tools/github/bundles/openai-codex-pr-15254.json b/artifacts/github/bundles/openai-codex-pr-15254.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15254.json
rename to artifacts/github/bundles/openai-codex-pr-15254.json
diff --git a/tools/github/bundles/openai-codex-pr-15259.json b/artifacts/github/bundles/openai-codex-pr-15259.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15259.json
rename to artifacts/github/bundles/openai-codex-pr-15259.json
diff --git a/tools/github/bundles/openai-codex-pr-15262.json b/artifacts/github/bundles/openai-codex-pr-15262.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15262.json
rename to artifacts/github/bundles/openai-codex-pr-15262.json
diff --git a/tools/github/bundles/openai-codex-pr-15263.json b/artifacts/github/bundles/openai-codex-pr-15263.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15263.json
rename to artifacts/github/bundles/openai-codex-pr-15263.json
diff --git a/tools/github/bundles/openai-codex-pr-15264.json b/artifacts/github/bundles/openai-codex-pr-15264.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15264.json
rename to artifacts/github/bundles/openai-codex-pr-15264.json
diff --git a/tools/github/bundles/openai-codex-pr-15275.json b/artifacts/github/bundles/openai-codex-pr-15275.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15275.json
rename to artifacts/github/bundles/openai-codex-pr-15275.json
diff --git a/tools/github/bundles/openai-codex-pr-15279.json b/artifacts/github/bundles/openai-codex-pr-15279.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15279.json
rename to artifacts/github/bundles/openai-codex-pr-15279.json
diff --git a/tools/github/bundles/openai-codex-pr-15348.json b/artifacts/github/bundles/openai-codex-pr-15348.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15348.json
rename to artifacts/github/bundles/openai-codex-pr-15348.json
diff --git a/tools/github/bundles/openai-codex-pr-15376.json b/artifacts/github/bundles/openai-codex-pr-15376.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15376.json
rename to artifacts/github/bundles/openai-codex-pr-15376.json
diff --git a/tools/github/bundles/openai-codex-pr-15390.json b/artifacts/github/bundles/openai-codex-pr-15390.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15390.json
rename to artifacts/github/bundles/openai-codex-pr-15390.json
diff --git a/tools/github/bundles/openai-codex-pr-15409.json b/artifacts/github/bundles/openai-codex-pr-15409.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15409.json
rename to artifacts/github/bundles/openai-codex-pr-15409.json
diff --git a/tools/github/bundles/openai-codex-pr-15414.json b/artifacts/github/bundles/openai-codex-pr-15414.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15414.json
rename to artifacts/github/bundles/openai-codex-pr-15414.json
diff --git a/tools/github/bundles/openai-codex-pr-15443.json b/artifacts/github/bundles/openai-codex-pr-15443.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15443.json
rename to artifacts/github/bundles/openai-codex-pr-15443.json
diff --git a/tools/github/bundles/openai-codex-pr-15659.json b/artifacts/github/bundles/openai-codex-pr-15659.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15659.json
rename to artifacts/github/bundles/openai-codex-pr-15659.json
diff --git a/tools/github/bundles/openai-codex-pr-15759.json b/artifacts/github/bundles/openai-codex-pr-15759.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15759.json
rename to artifacts/github/bundles/openai-codex-pr-15759.json
diff --git a/tools/github/bundles/openai-codex-pr-15785.json b/artifacts/github/bundles/openai-codex-pr-15785.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15785.json
rename to artifacts/github/bundles/openai-codex-pr-15785.json
diff --git a/tools/github/bundles/openai-codex-pr-15802.json b/artifacts/github/bundles/openai-codex-pr-15802.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-15802.json
rename to artifacts/github/bundles/openai-codex-pr-15802.json
diff --git a/tools/github/bundles/openai-codex-pr-16010.json b/artifacts/github/bundles/openai-codex-pr-16010.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16010.json
rename to artifacts/github/bundles/openai-codex-pr-16010.json
diff --git a/tools/github/bundles/openai-codex-pr-16082.json b/artifacts/github/bundles/openai-codex-pr-16082.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16082.json
rename to artifacts/github/bundles/openai-codex-pr-16082.json
diff --git a/tools/github/bundles/openai-codex-pr-16153.json b/artifacts/github/bundles/openai-codex-pr-16153.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16153.json
rename to artifacts/github/bundles/openai-codex-pr-16153.json
diff --git a/tools/github/bundles/openai-codex-pr-16204.json b/artifacts/github/bundles/openai-codex-pr-16204.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16204.json
rename to artifacts/github/bundles/openai-codex-pr-16204.json
diff --git a/tools/github/bundles/openai-codex-pr-16508.json b/artifacts/github/bundles/openai-codex-pr-16508.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16508.json
rename to artifacts/github/bundles/openai-codex-pr-16508.json
diff --git a/tools/github/bundles/openai-codex-pr-16631.json b/artifacts/github/bundles/openai-codex-pr-16631.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16631.json
rename to artifacts/github/bundles/openai-codex-pr-16631.json
diff --git a/tools/github/bundles/openai-codex-pr-16633.json b/artifacts/github/bundles/openai-codex-pr-16633.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16633.json
rename to artifacts/github/bundles/openai-codex-pr-16633.json
diff --git a/tools/github/bundles/openai-codex-pr-16946.json b/artifacts/github/bundles/openai-codex-pr-16946.json
similarity index 100%
rename from tools/github/bundles/openai-codex-pr-16946.json
rename to artifacts/github/bundles/openai-codex-pr-16946.json
diff --git a/plugins/decodex/skills/github-signal/SKILL.md b/dev/skills/github-signal/SKILL.md
similarity index 84%
rename from plugins/decodex/skills/github-signal/SKILL.md
rename to dev/skills/github-signal/SKILL.md
index 0b35dc0c..cd8d29ec 100644
--- a/plugins/decodex/skills/github-signal/SKILL.md
+++ b/dev/skills/github-signal/SKILL.md
@@ -1,11 +1,14 @@
---
name: github-signal
-description: Use when turning a normalized GitHub bundle under `tools/github/bundles/` into a Decodex signal draft, especially for requests to analyze a PR-first bundle, decide if a change is signal-worthy, or write/update the local editorial analysis JSON that feeds `tools/github/render_signal_entry.py`.
+description: Use when turning a normalized GitHub bundle under `artifacts/github/bundles/` into a Decodex signal draft, especially for requests to analyze a PR-first bundle, decide if a change is signal-worthy, or write/update the local editorial analysis JSON that feeds `scripts/github/render_signal_entry.py`.
---
# Decodex GitHub Signal
Use this skill for the local editorial step in the GitHub-first Decodex workflow.
+This is a Decodex repository-development instruction surface, not a complete
+user-facing plugin skill, and it must not be packaged with the installable Decodex
+plugin.
This skill does not replace the deterministic scripts. It tells Codex how to read a
bundle, decide whether it deserves publication, and draft the analysis JSON that the
@@ -19,8 +22,8 @@ repo already renders into a final `signal_entry/v1`.
## Inputs
-- A normalized bundle JSON under `tools/github/bundles/`
-- An output path under `tools/github/analysis/`
+- A normalized bundle JSON under `artifacts/github/bundles/`
+- An output path under `artifacts/github/analysis/`
## Boundaries
@@ -119,7 +122,7 @@ Write a JSON analysis draft with these fields:
1. Validate the bundle first.
2. Read `primary_pr.title`, `primary_pr.body`, `files`, and `commits`.
3. Decide whether the change is signal-worthy.
-4. Draft the editorial JSON under `tools/github/analysis/`.
+4. Draft the editorial JSON under `artifacts/github/analysis/`.
5. Render the final signal entry with the repo script.
6. Validate the published signal collection and site build.
@@ -128,22 +131,22 @@ Write a JSON analysis draft with these fields:
Validate a bundle:
```bash
-python3 tools/github/validate_change_bundle.py tools/github/bundles/.json
+python3 scripts/github/validate_change_bundle.py artifacts/github/bundles/.json
```
Render the final signal entry after drafting:
```bash
-python3 tools/github/render_signal_entry.py \
- --bundle tools/github/bundles/.json \
- --analysis tools/github/analysis/.analysis.json \
+python3 scripts/github/render_signal_entry.py \
+ --bundle artifacts/github/bundles/.json \
+ --analysis artifacts/github/analysis/.analysis.json \
--out site/src/content/signals/.json
```
Validate the published output:
```bash
-python3 tools/github/validate_signal_entry.py site/src/content/signals
+python3 scripts/github/validate_signal_entry.py site/src/content/signals
npm run build --prefix site
npm run check --prefix site
```
diff --git a/plugins/decodex/skills/github-signal/agents/openai.yaml b/dev/skills/github-signal/agents/openai.yaml
similarity index 53%
rename from plugins/decodex/skills/github-signal/agents/openai.yaml
rename to dev/skills/github-signal/agents/openai.yaml
index b9e1ca8c..1ca79fa3 100644
--- a/plugins/decodex/skills/github-signal/agents/openai.yaml
+++ b/dev/skills/github-signal/agents/openai.yaml
@@ -1,7 +1,7 @@
interface:
display_name: "Decodex GitHub Signal"
short_description: "Draft GitHub-backed Decodex signal analysis."
- default_prompt: "Use $decodex:github-signal to turn a GitHub bundle into a Decodex signal draft."
+ default_prompt: "Use the repo-local instructions at dev/skills/github-signal/SKILL.md to turn a GitHub bundle into a Decodex signal draft."
policy:
allow_implicit_invocation: false
diff --git a/docs/decisions/static-public-site.md b/docs/decisions/static-public-site.md
index 1c17be29..3808507e 100644
--- a/docs/decisions/static-public-site.md
+++ b/docs/decisions/static-public-site.md
@@ -17,8 +17,9 @@ Consequences:
- Public content remains diffable, reviewable, cacheable, and deployable through GitHub
Pages without a live Decodex daemon.
-- `tools/github/` remains the content-generation boundary for public signals and
- release deltas.
+- `scripts/github/` remains the content-generation script boundary for public signals
+ and release deltas, with checked-in GitHub bundles and editorial analysis drafts
+ under `artifacts/github/`.
- `apps/decodex/` can evolve the runtime without turning the public website into an
operational dependency.
- Dynamic public capabilities such as login, personalized feeds, live queries, or
diff --git a/docs/index.md b/docs/index.md
index ab50daa3..fc86a977 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -41,7 +41,7 @@ The split below is by question type, not by human-versus-agent audience.
- Need the raw machine-authored research run artifacts used by shipped research tooling
-> `docs/research/`
- Need reusable agent-facing Decodex usage instructions -> `plugins/decodex/`
-- Need the GitHub signal editorial workflow -> `plugins/decodex/skills/github-signal/`
+- Need the repo-local GitHub signal editorial workflow -> `dev/skills/github-signal/`
plus `docs/runbook/local-github-signal-workflow.md`
- Need repository execution defaults or tracker-state policy -> registered project
`WORKFLOW.md`
diff --git a/docs/reference/workspace-layout.md b/docs/reference/workspace-layout.md
index e8a9902c..02424b4a 100644
--- a/docs/reference/workspace-layout.md
+++ b/docs/reference/workspace-layout.md
@@ -18,16 +18,18 @@ should not be treated as repository source.
| --- | --- |
| `apps/decodex/` | Rust package that builds the `decodex` CLI and runtime. Runtime, orchestration, tracker integration, app-server integration, operator HTTP, and local control-plane behavior live under `apps/decodex/src/`. |
| `site/` | Astro static site for the public Decodex signal surface. It renders checked-in content and generated JSON from `site/src/content/`; it is not backed by a live Decodex daemon. |
-| `tools/github/` | Deterministic GitHub collection, normalization, render, and validation scripts for public signal content. |
-| `plugins/decodex/` | Canonical installable Decodex plugin source and reusable agent-facing skills, including manual CLI, automation, commit, land, labels, and GitHub signal drafting. |
+| `scripts/github/` | Deterministic GitHub collection, normalization, render, validation, and sync scripts for public signal content. |
+| `scripts/config/` | Repository automation scripts for config-derived artifacts. |
+| `artifacts/github/` | Checked-in GitHub change bundles and editorial analysis drafts used by the public signal pipeline. |
+| `dev/skills/` | Repository-development skill-like instructions that are not part of installable plugin distribution. |
+| `plugins/decodex/` | Canonical installable Decodex plugin source and reusable agent-facing skills, including manual CLI, automation, commit, land, and labels. |
| `docs/spec/` | Normative runtime, workflow, site, and content contracts. |
| `docs/runbook/` | Operator procedures, validation sequences, deployment steps, and content workflows. |
| `docs/reference/` | Current repository and artifact surface maps. |
| `docs/decisions/` | Durable rationale for repository-level design choices. |
| `docs/research/` | Machine-authored research run artifacts used by shipped research tooling. |
| `docs/plans/` | Historical saved plan artifacts from the static-site bootstrap. These are not primary authority. |
-| `scripts/` | Repository-level helper scripts that are not part of the Rust runtime binary. |
-| `dev/` | Local development helpers such as the operator dashboard mock server. |
+| `dev/` | Local development helpers outside `dev/skills/`, such as the operator dashboard mock server. |
| `assets/` | Shared static assets that are not owned by the Astro app's generated output. |
| `.github/` | CI, release, Pages deployment, and content-refresh workflows. |
| `Makefile.toml` | Repo-native task names and automation entrypoints. |
@@ -71,9 +73,11 @@ Those runtime and operator surfaces stay in `apps/decodex/` and `docs/spec/`.
## GitHub signal tooling
-`tools/github/` owns deterministic content tooling. It may call Codex for the editorial
-drafting step through the plugin skill at `plugins/decodex/skills/github-signal/`, but
-the scripts must keep generated artifacts explicit and checked into the repository.
+`scripts/github/` owns deterministic content scripts. It may call Codex for the
+editorial drafting step through the repo-local instructions at
+`dev/skills/github-signal/`, but that surface is not part of the installable Decodex
+plugin distribution. Generated GitHub bundles and analysis drafts live under
+`artifacts/github/` and must stay explicit and checked into the repository.
## Installable Codex surface
@@ -110,7 +114,8 @@ tracker routing, and policy.
- Runtime authority stays in `apps/decodex/src/`, the registered project contract under
`~/.codex/decodex/projects//`, and the governing specs under
`docs/spec/`.
-- Public site authority stays in `site/`, `tools/github/`, and the site/content specs.
+- Public site authority stays in `site/`, `scripts/github/`, `artifacts/github/`, and
+ the site/content specs.
- Reusable agent-facing Decodex usage instructions live under `plugins/decodex/`.
- `docs/runbook/`, `docs/reference/`, and `docs/decisions/` must not override runtime or
workflow authority.
diff --git a/docs/runbook/local-github-signal-workflow.md b/docs/runbook/local-github-signal-workflow.md
index bb678088..dd6b5fdc 100644
--- a/docs/runbook/local-github-signal-workflow.md
+++ b/docs/runbook/local-github-signal-workflow.md
@@ -25,9 +25,9 @@ Outputs:
## Workflow
-1. Build a normalized GitHub change bundle under `tools/github/bundles/`.
+1. Build a normalized GitHub change bundle under `artifacts/github/bundles/`.
2. Review the bundle and decide whether the change is signal-worthy.
-3. Run Codex analysis against the bundle with `plugins/decodex/skills/github-signal/` and save the editorial draft JSON.
+3. Run Codex analysis against the bundle with the repo-local instructions at `dev/skills/github-signal/` and save the editorial draft JSON under `artifacts/github/analysis/`.
4. Render the resulting signal entry into `site/src/content/signals/`.
5. Validate the signal entry shape and collection consistency.
6. Regenerate the release-delta artifact so the homepage compares the latest stable release to the latest prerelease using the updated signal set.
@@ -39,33 +39,33 @@ Outputs:
Build a PR-first bundle:
```bash
-python3 tools/github/build_change_bundle.py \
+python3 scripts/github/build_change_bundle.py \
--repo openai/codex \
--pr 15222 \
- --out tools/github/bundles/openai-codex-pr-15222.json
+ --out artifacts/github/bundles/openai-codex-pr-15222.json
```
Validate the bundle:
```bash
-python3 tools/github/validate_change_bundle.py \
- tools/github/bundles/openai-codex-pr-15222.json
+python3 scripts/github/validate_change_bundle.py \
+ artifacts/github/bundles/openai-codex-pr-15222.json
```
Render a final signal entry from the reviewed bundle plus the local editorial
draft:
```bash
-python3 tools/github/render_signal_entry.py \
- --bundle tools/github/bundles/openai-codex-pr-15222.json \
- --analysis tools/github/analysis/openai-codex-pr-15222.analysis.json \
+python3 scripts/github/render_signal_entry.py \
+ --bundle artifacts/github/bundles/openai-codex-pr-15222.json \
+ --analysis artifacts/github/analysis/openai-codex-pr-15222.analysis.json \
--out site/src/content/signals/openai-codex-pr-15222.json
```
Validate the published signal entries and the site collection:
```bash
-python3 tools/github/validate_signal_entry.py site/src/content/signals
+python3 scripts/github/validate_signal_entry.py site/src/content/signals
npm run build --prefix site
npm run check --prefix site
cargo make decodex-checks
@@ -74,7 +74,7 @@ cargo make decodex-checks
Build the homepage release-delta artifact:
```bash
-python3 tools/github/build_release_delta.py \
+python3 scripts/github/build_release_delta.py \
--repo openai/codex \
--signals-dir site/src/content/signals \
--out site/src/content/release-deltas/openai-codex-latest.json
@@ -82,17 +82,20 @@ python3 tools/github/build_release_delta.py \
The repository already includes a real sample for this flow:
-- bundle: `tools/github/bundles/openai-codex-pr-15222.json`
-- editorial draft: `tools/github/analysis/openai-codex-pr-15222.analysis.json`
+- bundle: `artifacts/github/bundles/openai-codex-pr-15222.json`
+- editorial draft: `artifacts/github/analysis/openai-codex-pr-15222.analysis.json`
- rendered signal: `site/src/content/signals/openai-codex-pr-15222.json`
-Repo-local skill entrypoint:
+Repo-local editorial instruction entrypoint:
-- `plugins/decodex/skills/github-signal/SKILL.md`
+- `dev/skills/github-signal/SKILL.md`
+
+This entrypoint is for Decodex repository development only. It is incomplete as a
+general user-facing skill and must not be packaged with the installable Decodex plugin.
Automated hourly sync entrypoint:
-- `tools/github/sync_latest_signals.py`
+- `scripts/github/sync_latest_signals.py`
## Editorial gate
diff --git a/scripts/README.md b/scripts/README.md
new file mode 100644
index 00000000..4faf79cc
--- /dev/null
+++ b/scripts/README.md
@@ -0,0 +1,10 @@
+# Scripts Root
+
+This directory contains executable repository automation.
+
+- `scripts/github/` owns deterministic GitHub signal, release-delta, render, sync, and
+ validation scripts.
+- `scripts/config/` owns config-derived artifact synchronization scripts.
+
+Checked-in data produced or consumed by scripts belongs outside this directory. GitHub
+signal bundles and analysis drafts live under `artifacts/github/`.
diff --git a/tools/config/sync_codex_config_schema.py b/scripts/config/sync_codex_config_schema.py
similarity index 100%
rename from tools/config/sync_codex_config_schema.py
rename to scripts/config/sync_codex_config_schema.py
diff --git a/tools/github/README.md b/scripts/github/README.md
similarity index 65%
rename from tools/github/README.md
rename to scripts/github/README.md
index c78fc3b5..a55975a7 100644
--- a/tools/github/README.md
+++ b/scripts/github/README.md
@@ -1,6 +1,6 @@
-# GitHub Tooling
+# GitHub Scripts
-This directory owns the deterministic GitHub-first Decodex pipeline.
+This directory owns deterministic GitHub-first Decodex scripts.
Current scripts:
@@ -19,17 +19,17 @@ Contract ownership:
Example flow:
```bash
-python3 tools/github/build_change_bundle.py \
+python3 scripts/github/build_change_bundle.py \
--repo openai/codex \
--pr 15222 \
- --out tools/github/bundles/openai-codex-pr-15222.json
+ --out artifacts/github/bundles/openai-codex-pr-15222.json
-python3 tools/github/render_signal_entry.py \
- --bundle tools/github/bundles/openai-codex-pr-15222.json \
- --analysis tools/github/analysis/openai-codex-pr-15222.analysis.json \
+python3 scripts/github/render_signal_entry.py \
+ --bundle artifacts/github/bundles/openai-codex-pr-15222.json \
+ --analysis artifacts/github/analysis/openai-codex-pr-15222.analysis.json \
--out site/src/content/signals/openai-codex-pr-15222.json
-python3 tools/github/validate_signal_entry.py \
+python3 scripts/github/validate_signal_entry.py \
site/src/content/signals/openai-codex-pr-15222.json
```
diff --git a/tools/github/analysis_draft.schema.json b/scripts/github/analysis_draft.schema.json
similarity index 100%
rename from tools/github/analysis_draft.schema.json
rename to scripts/github/analysis_draft.schema.json
diff --git a/tools/github/backfill_release_range.py b/scripts/github/backfill_release_range.py
similarity index 97%
rename from tools/github/backfill_release_range.py
rename to scripts/github/backfill_release_range.py
index f4f7e30a..bff7ba1f 100644
--- a/tools/github/backfill_release_range.py
+++ b/scripts/github/backfill_release_range.py
@@ -30,8 +30,8 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--stable-tag", required=True, help="Stable tag name to backfill from.")
parser.add_argument("--preview-tag", help="Preview tag name to backfill to. Defaults to the top-level prerelease.")
parser.add_argument("--signals-dir", default="site/src/content/signals")
- parser.add_argument("--bundles-dir", default="tools/github/bundles")
- parser.add_argument("--analysis-dir", default="tools/github/analysis")
+ parser.add_argument("--bundles-dir", default="artifacts/github/bundles")
+ parser.add_argument("--analysis-dir", default="artifacts/github/analysis")
parser.add_argument("--token-env", help="Environment variable containing a GitHub token.")
parser.add_argument("--codex-bin", default="codex", help="Codex executable to invoke.")
parser.add_argument("--model", help="Optional Codex model override.")
diff --git a/tools/github/build_change_bundle.py b/scripts/github/build_change_bundle.py
similarity index 100%
rename from tools/github/build_change_bundle.py
rename to scripts/github/build_change_bundle.py
diff --git a/tools/github/build_release_delta.py b/scripts/github/build_release_delta.py
similarity index 100%
rename from tools/github/build_release_delta.py
rename to scripts/github/build_release_delta.py
diff --git a/tools/github/contracts.py b/scripts/github/contracts.py
similarity index 100%
rename from tools/github/contracts.py
rename to scripts/github/contracts.py
diff --git a/tools/github/render_signal_entry.py b/scripts/github/render_signal_entry.py
similarity index 100%
rename from tools/github/render_signal_entry.py
rename to scripts/github/render_signal_entry.py
diff --git a/tools/github/run_codex_analysis.py b/scripts/github/run_codex_analysis.py
similarity index 94%
rename from tools/github/run_codex_analysis.py
rename to scripts/github/run_codex_analysis.py
index 1b49fdcc..3f5ce417 100644
--- a/tools/github/run_codex_analysis.py
+++ b/scripts/github/run_codex_analysis.py
@@ -29,10 +29,11 @@ def parse_args() -> argparse.Namespace:
def repo_root_from(bundle_path: Path) -> Path:
- root = bundle_path.resolve().parents[2]
- if not (root / "plugins" / "decodex" / "skills" / "github-signal" / "SKILL.md").exists():
- raise SystemExit(f"Unable to resolve repo root from {bundle_path}")
- return root
+ resolved = bundle_path.resolve()
+ for root in resolved.parents:
+ if (root / "dev" / "skills" / "github-signal" / "SKILL.md").exists():
+ return root
+ raise SystemExit(f"Unable to resolve repo root from {bundle_path}")
def build_prompt(bundle_path: Path, repo_root: Path) -> str:
@@ -40,7 +41,7 @@ def build_prompt(bundle_path: Path, repo_root: Path) -> str:
return "\n".join(
[
"Read and follow these repo-local instructions before drafting:",
- "- plugins/decodex/skills/github-signal/SKILL.md",
+ "- dev/skills/github-signal/SKILL.md",
"- docs/spec/github-change-bundle.md",
"- docs/spec/signal-entry.md",
"- docs/runbook/local-github-signal-workflow.md",
diff --git a/tools/github/sync_latest_signals.py b/scripts/github/sync_latest_signals.py
similarity index 97%
rename from tools/github/sync_latest_signals.py
rename to scripts/github/sync_latest_signals.py
index 4eebc6c5..e47461f1 100644
--- a/tools/github/sync_latest_signals.py
+++ b/scripts/github/sync_latest_signals.py
@@ -65,8 +65,8 @@ def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--repo", default="openai/codex", help="GitHub repository in owner/name format.")
parser.add_argument("--signals-dir", default="site/src/content/signals", help="Published signal directory.")
- parser.add_argument("--bundles-dir", default="tools/github/bundles", help="Bundle directory.")
- parser.add_argument("--analysis-dir", default="tools/github/analysis", help="Analysis draft directory.")
+ parser.add_argument("--bundles-dir", default="artifacts/github/bundles", help="Bundle directory.")
+ parser.add_argument("--analysis-dir", default="artifacts/github/analysis", help="Analysis draft directory.")
parser.add_argument(
"--release-delta-out",
default="site/src/content/release-deltas/openai-codex-latest.json",
diff --git a/tools/github/test_build_release_delta.py b/scripts/github/test_build_release_delta.py
similarity index 100%
rename from tools/github/test_build_release_delta.py
rename to scripts/github/test_build_release_delta.py
diff --git a/tools/github/validate_change_bundle.py b/scripts/github/validate_change_bundle.py
similarity index 100%
rename from tools/github/validate_change_bundle.py
rename to scripts/github/validate_change_bundle.py
diff --git a/tools/github/validate_signal_entry.py b/scripts/github/validate_signal_entry.py
similarity index 100%
rename from tools/github/validate_signal_entry.py
rename to scripts/github/validate_signal_entry.py
diff --git a/site/src/content/release-deltas/README.md b/site/src/content/release-deltas/README.md
index 49a2a295..359442d9 100644
--- a/site/src/content/release-deltas/README.md
+++ b/site/src/content/release-deltas/README.md
@@ -10,7 +10,7 @@ The current artifact is a bounded comparator payload:
Build the latest `openai/codex` artifact with:
```bash
-python3 tools/github/build_release_delta.py \
+python3 scripts/github/build_release_delta.py \
--repo openai/codex \
--signals-dir site/src/content/signals \
--out site/src/content/release-deltas/openai-codex-latest.json
diff --git a/tools/README.md b/tools/README.md
deleted file mode 100644
index 8f73c3d7..00000000
--- a/tools/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Tools Root
-
-This directory is reserved for deterministic Decodex automation.
-
-Planned ownership:
-
-- GitHub bundle collection
-- normalization and render helpers
-- signal validation scripts
-
-CI-owned deployment logic must remain separate from local AI analysis logic.