| { | ||
| "slug": "oxide", | ||
| "name": "Oxide", | ||
| "kind": "org", | ||
| "aliases": ["oxide computer", "oxide computer company", "oxidecomputer", "oxide.computer"], | ||
| "consentTier": "self-published", | ||
| "updated": "2026-07-11", | ||
| "homepage": "https://oxide.computer", | ||
| "summary": "RFD-driven written decisions, Rust-heavy hardware/software co-design, rigor with urgency, radical transparency", | ||
| "sources": [ | ||
| { "url": "https://rfd.shared.oxide.computer/rfd/0001", "fetched": "2026-07-11", "tier": "self-published", "note": "the RFD process itself: states, scope, written determinations" }, | ||
| { "url": "https://rfd.shared.oxide.computer/rfd/0005", "fetched": "2026-07-11", "tier": "self-published", "note": "named engineering phases scoping through production" }, | ||
| { "url": "https://rfd.shared.oxide.computer/rfd/0107", "fetched": "2026-07-11", "tier": "self-published", "note": "control-plane workflows as observable, recoverable sagas" }, | ||
| { "url": "https://rfd.shared.oxide.computer/rfd/0113", "fetched": "2026-07-11", "tier": "self-published", "note": "decision values: responsibility, rigor, urgency, courage, versatility, teamwork, thriftiness" }, | ||
| { "url": "https://oxide.computer/blog/a-tool-for-discussion", "fetched": "2026-07-11", "tier": "self-published", "note": "RFDs as collaboration medium; discussion in GitHub PRs" }, | ||
| { "url": "https://oxide.computer/blog/engineering-culture", "fetched": "2026-07-11", "tier": "self-published", "note": "recorded meetings, no perf reviews, no metrics, Demo Friday, remote-first" }, | ||
| { "url": "https://oxide.computer/blog/the-cloud-computer", "fetched": "2026-07-11", "tier": "self-published", "note": "hardware/software co-design; open-source firmware and root of trust" }, | ||
| { "url": "https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams", "fetched": "2026-07-11", "tier": "self-published", "note": "distributed hardware work via prototyping tooling; directed autonomy" }, | ||
| { "url": "https://oxide.computer/blog/compensation-as-a-reflection-of-values", "fetched": "2026-07-11", "tier": "self-published", "note": "canonical uniform-salary post" }, | ||
| { "url": "https://oxide.computer/blog/oxides-compensation-model-how-is-it-going", "fetched": "2026-07-11", "tier": "self-published", "note": "comp model retrospective; sales exception" }, | ||
| { "url": "https://oxide.computer/blog/iddqd-unsafe", "fetched": "2026-07-11", "tier": "self-published", "note": "unsafe-Rust rigor; frontier models used to probe correctness" }, | ||
| { "url": "https://github.com/oxidecomputer/omicron/pull/10628", "fetched": "2026-07-11", "tier": "self-published", "note": "CLAUDE.md + AGENTS.md convention; nested code-local agent docs; cargo/clippy/rustfmt/nextest loop" }, | ||
| { "url": "https://github.com/oxidecomputer/buildomat", "fetched": "2026-07-11", "tier": "self-published", "note": "first-party CI/job orchestrator, MPL-2.0" }, | ||
| { "url": "https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/", "fetched": "2026-07-11", "tier": "stated", "note": "Cantrill on toolmaking as core engineering work" }, | ||
| { "url": "https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age", "fetched": "2026-07-11", "tier": "self-published", "note": "their own podcast on LLM-era rigor" }, | ||
| { "url": "https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris", "fetched": "2026-07-11", "tier": "self-published", "note": "LLM-assisted code restoration in practice" }, | ||
| { "url": "https://steveklabnik.com/writing/memory-safety-is-a-red-herring/", "fetched": "2026-07-11", "tier": "stated", "note": "employee first-person on Rust rationale" } | ||
| ] | ||
| } |
| # Oxide — dev culture profile | ||
| Profiled: 2026-07-11 · Consent tier: **self-published** (public RFDs, first-party blog, | ||
| open repos) · Kind: org | ||
| ## Identity | ||
| Oxide Computer Company builds rack-scale computers with hardware/software co-designed from | ||
| scratch — server sled, root of trust, hypervisor, control plane, console — nearly all of it | ||
| open source [[cloud computer]](https://oxide.computer/blog/the-cloud-computer). Remote-first, | ||
| famously transparent (uniform compensation, public decision records), and the practice is | ||
| unusually legible from outside: the decision process itself is published | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). | ||
| ## Core principle | ||
| Write it down. "We capture the written expression of an idea in a Request for Discussion | ||
| (RFD)" — options considered, reasoning, data, and the final determination all get recorded, | ||
| and the process covers architecture, APIs, company process, and testing design alike | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Writing is the collaboration medium, | ||
| not a bureaucratic artifact [[a tool for discussion]](https://oxide.computer/blog/a-tool-for-discussion). | ||
| ## Workflow shape | ||
| Decisions move through explicit RFD states — prediscussion → ideation → discussion → | ||
| published → committed/abandoned — with discussion happening in GitHub PRs | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named | ||
| phases: scoping → exploration → prototyping → determination → development → validation → | ||
| stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values | ||
| are explicit and include both rigor *and* urgency — analysis is not allowed to become | ||
| avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113). | ||
| Day to day: remote-first with recorded meetings, no formalized performance review, no | ||
| engineering metrics, and a weekly Demo Friday — show working things continuously | ||
| [[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams | ||
| work distributed by investing in prototyping tooling; teams "don't need approval or | ||
| sign-off, we just go do what's right" | ||
| [[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams). | ||
| Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI | ||
| runs on buildomat, their first-party job orchestrator — when the tool you need doesn't | ||
| exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| [[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane | ||
| operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts | ||
| [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both | ||
| CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested, | ||
| generated, code-local agent instructions over one giant top-level file | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628). | ||
| ## Stack | ||
| Rust nearly everywhere it pays rent: Omicron (control plane) is a very large Cargo | ||
| workspace, Hubris (embedded OS), and unsafe Rust handled with published rigor | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) | ||
| [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/). First-party | ||
| toolchain: buildomat for CI/jobs, driven from Rust xtasks | ||
| [[buildomat]](https://github.com/oxidecomputer/buildomat). Open source with a permissive | ||
| lean (MPL-2.0 common), including firmware and root of trust | ||
| [[cloud computer]](https://oxide.computer/blog/the-cloud-computer). | ||
| ## Principles (cited) | ||
| 1. Write decisions down — options, reasoning, and determination, in a versioned record [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001) | ||
| 2. Rigor *with* urgency — thoroughness that ships beats analysis that stalls [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113) | ||
| 3. Name the phase you're in (scoping → … → production) and act accordingly [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005) | ||
| 4. Toolmaking is core engineering work — build the missing tool (buildomat) instead of tolerating friction [[sharpening the axe]](https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/) [[buildomat]](https://github.com/oxidecomputer/buildomat) | ||
| 5. Rust where correctness pays rent, all the way down to firmware [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/) | ||
| 6. Transparency as default — uniform pay, public RFDs, recorded meetings [[compensation]](https://oxide.computer/blog/compensation-as-a-reflection-of-values) [[engineering culture]](https://oxide.computer/blog/engineering-culture) | ||
| 7. Model long-running operations as observable, recoverable workflows — never fire-and-forget [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107) | ||
| 8. Demo working things continuously; trust demos over status reports [[engineering culture]](https://oxide.computer/blog/engineering-culture) | ||
| 9. Keep agent instructions local to the code they govern, and cover every harness in use [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| ## Tensions | ||
| - AI posture is deliberately mixed: public emphasis on engineering rigor in the LLM age | ||
| [[rigor episode]](https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age) | ||
| coexists with real frontier-model use — LLM-assisted code restoration | ||
| [[BattleTris]](https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris) | ||
| and model-probed unsafe-Rust validation [[iddqd]](https://oxide.computer/blog/iddqd-unsafe). | ||
| Mimic the rigor, not a blanket pro/anti-AI stance. | ||
| - "Uniform compensation" now carries a sales exception — the principle holds, the absolutism | ||
| doesn't [[comp update]](https://oxide.computer/blog/oxides-compensation-model-how-is-it-going). | ||
| - Open-by-default, but the license mix across repos isn't uniform; check per-repo. | ||
| - Agent-config artifacts (CLAUDE.md/AGENTS.md) are strong in Omicron but unevenly distributed | ||
| across the org's repos — the pattern is emerging, not finished | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628). |
| --- | ||
| name: oxide-developer | ||
| description: >- | ||
| Reviews diffs and plans against Oxide's engineering principles. Use for code | ||
| review or pairing in Oxide's voice. | ||
| --- | ||
| # Oxide-developer | ||
| Critique diffs and plans against the principles in [../SKILL.md](../SKILL.md) — read it | ||
| first, every time. | ||
| ## How to review | ||
| - Check the diff/plan against each numbered principle in ../SKILL.md's Principles section. | ||
| - When flagging an issue, cite the principle number it violates or should apply, e.g. | ||
| "Principle 3: this change skips the simplify step." | ||
| - Respect the Tensions section in ../SKILL.md — don't overclaim beyond what it admits. | ||
| - Never invent claims about Oxide beyond what's cited in ../SKILL.md and its | ||
| references/. If you're unsure whether something reflects Oxide's practice, say so | ||
| instead of asserting it. | ||
| ## Output | ||
| Give concrete, principle-tied feedback — not vibes. If nothing violates a principle, say | ||
| so plainly rather than manufacturing a critique. |
| # Sources — Oxide | ||
| Consent tier: self-published · profiled 2026-07-11. | ||
| - https://rfd.shared.oxide.computer/rfd/0001 — fetched 2026-07-11 · tier: self-published, the RFD process itself: states, scope, written determinations | ||
| - https://rfd.shared.oxide.computer/rfd/0005 — fetched 2026-07-11 · tier: self-published, named engineering phases scoping through production | ||
| - https://rfd.shared.oxide.computer/rfd/0107 — fetched 2026-07-11 · tier: self-published, control-plane workflows as observable, recoverable sagas | ||
| - https://rfd.shared.oxide.computer/rfd/0113 — fetched 2026-07-11 · tier: self-published, decision values: responsibility, rigor, urgency, courage, versatility, teamwork, thriftiness | ||
| - https://oxide.computer/blog/a-tool-for-discussion — fetched 2026-07-11 · tier: self-published, RFDs as collaboration medium; discussion in GitHub PRs | ||
| - https://oxide.computer/blog/engineering-culture — fetched 2026-07-11 · tier: self-published, recorded meetings, no perf reviews, no metrics, Demo Friday, remote-first | ||
| - https://oxide.computer/blog/the-cloud-computer — fetched 2026-07-11 · tier: self-published, hardware/software co-design; open-source firmware and root of trust | ||
| - https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams — fetched 2026-07-11 · tier: self-published, distributed hardware work via prototyping tooling; directed autonomy | ||
| - https://oxide.computer/blog/compensation-as-a-reflection-of-values — fetched 2026-07-11 · tier: self-published, canonical uniform-salary post | ||
| - https://oxide.computer/blog/oxides-compensation-model-how-is-it-going — fetched 2026-07-11 · tier: self-published, comp model retrospective; sales exception | ||
| - https://oxide.computer/blog/iddqd-unsafe — fetched 2026-07-11 · tier: self-published, unsafe-Rust rigor; frontier models used to probe correctness | ||
| - https://github.com/oxidecomputer/omicron/pull/10628 — fetched 2026-07-11 · tier: self-published, CLAUDE.md + AGENTS.md convention; nested code-local agent docs; cargo/clippy/rustfmt/nextest loop | ||
| - https://github.com/oxidecomputer/buildomat — fetched 2026-07-11 · tier: self-published, first-party CI/job orchestrator, MPL-2.0 | ||
| - https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/ — fetched 2026-07-11 · tier: stated, Cantrill on toolmaking as core engineering work | ||
| - https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age — fetched 2026-07-11 · tier: self-published, their own podcast on LLM-era rigor | ||
| - https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris — fetched 2026-07-11 · tier: self-published, LLM-assisted code restoration in practice | ||
| - https://steveklabnik.com/writing/memory-safety-is-a-red-herring/ — fetched 2026-07-11 · tier: stated, employee first-person on Rust rationale |
| # Stack — Oxide | ||
| > Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [sources.md](sources.md). | ||
| Rust nearly everywhere it pays rent: Omicron (control plane) is a very large Cargo | ||
| workspace, Hubris (embedded OS), and unsafe Rust handled with published rigor | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) | ||
| [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/). First-party | ||
| toolchain: buildomat for CI/jobs, driven from Rust xtasks | ||
| [[buildomat]](https://github.com/oxidecomputer/buildomat). Open source with a permissive | ||
| lean (MPL-2.0 common), including firmware and root of trust | ||
| [[cloud computer]](https://oxide.computer/blog/the-cloud-computer). |
| # Workflow — Oxide | ||
| > Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [sources.md](sources.md). | ||
| Decisions move through explicit RFD states — prediscussion → ideation → discussion → | ||
| published → committed/abandoned — with discussion happening in GitHub PRs | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named | ||
| phases: scoping → exploration → prototyping → determination → development → validation → | ||
| stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values | ||
| are explicit and include both rigor *and* urgency — analysis is not allowed to become | ||
| avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113). | ||
| Day to day: remote-first with recorded meetings, no formalized performance review, no | ||
| engineering metrics, and a weekly Demo Friday — show working things continuously | ||
| [[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams | ||
| work distributed by investing in prototyping tooling; teams "don't need approval or | ||
| sign-off, we just go do what's right" | ||
| [[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams). | ||
| Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI | ||
| runs on buildomat, their first-party job orchestrator — when the tool you need doesn't | ||
| exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| [[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane | ||
| operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts | ||
| [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both | ||
| CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested, | ||
| generated, code-local agent instructions over one giant top-level file | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628). |
| --- | ||
| name: develop-like-oxide | ||
| description: >- | ||
| Develop the way Oxide (the company) does: RFD-driven written decisions, Rust-heavy hardware/software co-design, rigor with urgency, radical transparency. Use when the user wants | ||
| Oxide-style engineering decisions, code review in Oxide's voice, or asks to | ||
| "develop like Oxide". Profiled 2026-07-11 from public sources. | ||
| license: MIT | ||
| metadata: | ||
| author: marcusrbrown | ||
| generator: dev-like | ||
| profiled: "2026-07-11" | ||
| consent-tier: "self-published" | ||
| source: https://github.com/marcusrbrown/dev-like/tree/main/registry/oxide | ||
| --- | ||
| # Develop like Oxide | ||
| > Profiled as of 2026-07-11 · consent tier: self-published · full bibliography in [references/sources.md](references/sources.md). Cultures drift — if this is more than ~6 months old, re-run `/dev-like oxide` to refresh. | ||
| ## Core principle | ||
| Write it down. "We capture the written expression of an idea in a Request for Discussion | ||
| (RFD)" — options considered, reasoning, data, and the final determination all get recorded, | ||
| and the process covers architecture, APIs, company process, and testing design alike | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Writing is the collaboration medium, | ||
| not a bureaucratic artifact [[a tool for discussion]](https://oxide.computer/blog/a-tool-for-discussion). | ||
| ## Principles | ||
| 1. Write decisions down — options, reasoning, and determination, in a versioned record [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001) | ||
| 2. Rigor *with* urgency — thoroughness that ships beats analysis that stalls [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113) | ||
| 3. Name the phase you're in (scoping → … → production) and act accordingly [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005) | ||
| 4. Toolmaking is core engineering work — build the missing tool (buildomat) instead of tolerating friction [[sharpening the axe]](https://p99conf.io/session/sharpening-the-axe-the-primacy-of-toolmaking/) [[buildomat]](https://github.com/oxidecomputer/buildomat) | ||
| 5. Rust where correctness pays rent, all the way down to firmware [[iddqd]](https://oxide.computer/blog/iddqd-unsafe) [[Klabnik]](https://steveklabnik.com/writing/memory-safety-is-a-red-herring/) | ||
| 6. Transparency as default — uniform pay, public RFDs, recorded meetings [[compensation]](https://oxide.computer/blog/compensation-as-a-reflection-of-values) [[engineering culture]](https://oxide.computer/blog/engineering-culture) | ||
| 7. Model long-running operations as observable, recoverable workflows — never fire-and-forget [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107) | ||
| 8. Demo working things continuously; trust demos over status reports [[engineering culture]](https://oxide.computer/blog/engineering-culture) | ||
| 9. Keep agent instructions local to the code they govern, and cover every harness in use [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| ## Workflow | ||
| Decisions move through explicit RFD states — prediscussion → ideation → discussion → | ||
| published → committed/abandoned — with discussion happening in GitHub PRs | ||
| [[RFD 1]](https://rfd.shared.oxide.computer/rfd/0001). Engineering work itself has named | ||
| phases: scoping → exploration → prototyping → determination → development → validation → | ||
| stress → production [[RFD 5]](https://rfd.shared.oxide.computer/rfd/0005). Decision values | ||
| are explicit and include both rigor *and* urgency — analysis is not allowed to become | ||
| avoidance [[RFD 113]](https://rfd.shared.oxide.computer/rfd/0113). | ||
| Day to day: remote-first with recorded meetings, no formalized performance review, no | ||
| engineering metrics, and a weekly Demo Friday — show working things continuously | ||
| [[engineering culture]](https://oxide.computer/blog/engineering-culture). Hardware teams | ||
| work distributed by investing in prototyping tooling; teams "don't need approval or | ||
| sign-off, we just go do what's right" | ||
| [[remote hardware]](https://oxide.computer/blog/building-big-systems-with-remote-hardware-teams). | ||
| Baseline hygiene is non-negotiable: cargo check, clippy, rustfmt, nextest in the loop; CI | ||
| runs on buildomat, their first-party job orchestrator — when the tool you need doesn't | ||
| exist, you build it [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628) | ||
| [[buildomat]](https://github.com/oxidecomputer/buildomat). Long-running control-plane | ||
| operations are modeled as observable, recoverable sagas rather than fire-and-forget scripts | ||
| [[RFD 107]](https://rfd.shared.oxide.computer/rfd/0107). Agent-era note: repos carry both | ||
| CLAUDE.md and AGENTS.md ("that covers all agent harnesses in wide use"), with nested, | ||
| generated, code-local agent instructions over one giant top-level file | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628). | ||
| See [references/stack.md](references/stack.md) for the stack and [references/workflow.md](references/workflow.md) for workflow detail. | ||
| ## Tensions | ||
| - AI posture is deliberately mixed: public emphasis on engineering rigor in the LLM age | ||
| [[rigor episode]](https://oxide-and-friends.transistor.fm/episodes/engineering-rigor-in-the-llm-age) | ||
| coexists with real frontier-model use — LLM-assisted code restoration | ||
| [[BattleTris]](https://oxide-and-friends.transistor.fm/episodes/this-old-repo-llms-and-the-restoration-of-battletris) | ||
| and model-probed unsafe-Rust validation [[iddqd]](https://oxide.computer/blog/iddqd-unsafe). | ||
| Mimic the rigor, not a blanket pro/anti-AI stance. | ||
| - "Uniform compensation" now carries a sales exception — the principle holds, the absolutism | ||
| doesn't [[comp update]](https://oxide.computer/blog/oxides-compensation-model-how-is-it-going). | ||
| - Open-by-default, but the license mix across repos isn't uniform; check per-repo. | ||
| - Agent-config artifacts (CLAUDE.md/AGENTS.md) are strong in Omicron but unevenly distributed | ||
| across the org's repos — the pattern is emerging, not finished | ||
| [[omicron PR 10628]](https://github.com/oxidecomputer/omicron/pull/10628). | ||
| Want a reviewer/pair persona in Oxide's voice? See [agents/oxide-developer.md](agents/oxide-developer.md). |
| #!/usr/bin/env node | ||
| // Provenance link-rot checker: every URL cited in registry/ must still resolve. | ||
| // Zero deps by design — mirrors validate.mjs conventions (plain node, exported fns for tests). | ||
| import { readFile, readdir, stat, writeFile } from 'node:fs/promises'; | ||
| import { join, dirname } from 'node:path'; | ||
| import { fileURLToPath } from 'node:url'; | ||
| const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..'); | ||
| const CONCURRENCY = 4; | ||
| const STAGGER_MS = 250; | ||
| const TIMEOUT_MS = 15_000; | ||
| const MD_LINK_RE = /\]\((https:\/\/[^)\s]+)\)/g; | ||
| // Collect every URL cited from a registry entry.json/profile.md pair, tagged with citing file. | ||
| async function collectUrls() { | ||
| const regDir = join(ROOT, 'registry'); | ||
| const found = new Map(); // url -> Set of citing file paths (relative to ROOT) | ||
| const add = (url, file) => { | ||
| if (!found.has(url)) found.set(url, new Set()); | ||
| found.get(url).add(file); | ||
| }; | ||
| for (const name of await readdir(regDir)) { | ||
| const dir = join(regDir, name); | ||
| if (!(await stat(dir)).isDirectory() || name === 'schema') continue; | ||
| const entryPath = join(dir, 'entry.json'); | ||
| const entryRel = `registry/${name}/entry.json`; | ||
| const entryText = await readFile(entryPath, 'utf8').catch(() => null); | ||
| if (entryText) { | ||
| const entry = JSON.parse(entryText); | ||
| if (entry.homepage) add(entry.homepage, entryRel); | ||
| for (const s of entry.sources ?? []) { | ||
| if (s.url) add(s.url, entryRel); | ||
| } | ||
| } | ||
| const profilePath = join(dir, 'profile.md'); | ||
| const profileRel = `registry/${name}/profile.md`; | ||
| const profileText = await readFile(profilePath, 'utf8').catch(() => null); | ||
| if (profileText) { | ||
| for (const m of profileText.matchAll(MD_LINK_RE)) { | ||
| add(m[1], profileRel); | ||
| } | ||
| } | ||
| } | ||
| return found; | ||
| } | ||
| // Classify a check outcome into ok | warn | fail. | ||
| // Pass either an HTTP status or an Error (network/timeout). | ||
| export function classify(statusOrError) { | ||
| if (statusOrError instanceof Error) return 'fail'; | ||
| const status = statusOrError; | ||
| if (status >= 200 && status < 400) return 'ok'; | ||
| if (status === 403 || status === 429) return 'warn'; | ||
| return 'fail'; // 404/410/5xx/other 4xx | ||
| } | ||
| async function checkUrl(url) { | ||
| const attempt = async (method) => | ||
| fetch(url, { method, redirect: 'follow', signal: AbortSignal.timeout(TIMEOUT_MS) }); | ||
| try { | ||
| let res = await attempt('HEAD'); | ||
| if (res.status === 405 || res.status === 403) { | ||
| res = await attempt('GET'); | ||
| } | ||
| return { url, status: res.status, classification: classify(res.status) }; | ||
| } catch (err) { | ||
| return { url, error: err.message, classification: classify(err) }; | ||
| } | ||
| } | ||
| // Run checks with bounded concurrency and a stagger between dispatches. | ||
| async function checkAll(urls) { | ||
| const results = []; | ||
| let i = 0; | ||
| let inFlight = 0; | ||
| let resolveDone; | ||
| const done = new Promise((r) => { resolveDone = r; }); | ||
| function launchNext() { | ||
| if (i >= urls.length) { | ||
| if (inFlight === 0) resolveDone(); | ||
| return; | ||
| } | ||
| const url = urls[i++]; | ||
| inFlight++; | ||
| checkUrl(url).then((r) => { | ||
| results.push(r); | ||
| inFlight--; | ||
| if (i < urls.length) setTimeout(launchNext, STAGGER_MS); | ||
| else if (inFlight === 0) resolveDone(); | ||
| }); | ||
| } | ||
| for (let c = 0; c < Math.min(CONCURRENCY, urls.length); c++) { | ||
| launchNext(); | ||
| } | ||
| if (urls.length === 0) resolveDone(); | ||
| await done; | ||
| return results; | ||
| } | ||
| export async function run({ json = false } = {}) { | ||
| const urlMap = await collectUrls(); | ||
| const urls = [...urlMap.keys()]; | ||
| const results = await checkAll(urls); | ||
| results.sort((a, b) => a.url.localeCompare(b.url)); | ||
| const counts = { ok: 0, warn: 0, fail: 0 }; | ||
| const failures = []; | ||
| const warnings = []; | ||
| for (const r of results) { | ||
| counts[r.classification]++; | ||
| const citedBy = [...urlMap.get(r.url)].sort(); | ||
| if (r.classification === 'fail') failures.push({ ...r, citedBy }); | ||
| if (r.classification === 'warn') warnings.push({ ...r, citedBy }); | ||
| } | ||
| if (json) { | ||
| console.log(JSON.stringify({ counts, results: results.map((r) => ({ ...r, citedBy: [...urlMap.get(r.url)].sort() })) }, null, 2)); | ||
| } else { | ||
| for (const r of results) { | ||
| if (r.classification === 'ok') { | ||
| console.log(` ok ${r.url} (${r.status})`); | ||
| } else if (r.classification === 'warn') { | ||
| console.warn(`WARN ${r.url} (${r.status ?? r.error}) — cited by: ${[...urlMap.get(r.url)].sort().join(', ')}`); | ||
| } else { | ||
| console.error(`FAIL ${r.url} (${r.status ?? r.error}) — cited by: ${[...urlMap.get(r.url)].sort().join(', ')}`); | ||
| } | ||
| } | ||
| console.log(`\n${counts.ok} ok, ${counts.warn} warn, ${counts.fail} fail (of ${urls.length} unique URLs)`); | ||
| } | ||
| if (failures.length) { | ||
| const lines = [`# Link rot detected — ${failures.length} failure(s)`, '']; | ||
| for (const f of failures) { | ||
| lines.push(`- ${f.url} (${f.status ?? f.error})`); | ||
| for (const c of f.citedBy) lines.push(` - cited by \`${c}\``); | ||
| } | ||
| await writeFile(join(ROOT, 'link-failures.md'), lines.join('\n') + '\n', 'utf8'); | ||
| } | ||
| return failures.length === 0; | ||
| } | ||
| export { collectUrls }; | ||
| if (process.argv[1] === fileURLToPath(import.meta.url)) { | ||
| const json = process.argv.includes('--json'); | ||
| run({ json }).then((passed) => { process.exitCode = passed ? 0 : 1; }); | ||
| } |
+2
-1
| { | ||
| "name": "dev-like", | ||
| "version": "0.2.0", | ||
| "version": "0.3.0", | ||
| "description": "Profile a shop's engineering culture from public sources and install develop-like-<target> agent skills. /dev-like Every", | ||
@@ -38,2 +38,3 @@ "keywords": [ | ||
| "validate": "node scripts/validate.mjs", | ||
| "eval:paired": "node evals/paired/run.mjs", | ||
| "test": "node --test tests/*.test.mjs", | ||
@@ -40,0 +41,0 @@ "prepublishOnly": "bun run validate && bun run test", |
@@ -12,2 +12,9 @@ { | ||
| }, | ||
| "oxide": { | ||
| "name": "Oxide", | ||
| "kind": "org", | ||
| "aliases": ["oxide computer", "oxide computer company", "oxidecomputer", "oxide.computer"], | ||
| "consentTier": "self-published", | ||
| "updated": "2026-07-11" | ||
| }, | ||
| "theo": { | ||
@@ -14,0 +21,0 @@ "name": "Theo Browne", |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
88422
47.08%35
29.63%800
27.39%5
25%