Files
RedBear-OS/local/docs/ECOSYSTEM-ADAPTION-POLICY.md
T
vasilito 041bdb9e72 local/docs/ECOSYSTEM-ADAPTION-POLICY.md: refresh version table
Per fork-upstream-map.toml + ground-truth section A:
  syscall       -> upstream 0.9.0     (was claimed 0.7.5)
  libredox      -> upstream 0.1.18    (was claimed 0.1.13)
  redoxfs       -> upstream 0.9.1
  redox-scheme  -> upstream 0.11.2    (was claimed 0.11.0)
  relibc        -> upstream 0.2.5
  kernel        -> upstream 0.6.0
  bootloader    -> upstream 1.0.0
  installer     -> upstream 0.2.42
  userutils     -> upstream 0.1.0

Updated lines 14-42 with current upstream versions. Line 32 claim about "no upstream consumer has migrated to 0.8.x" updated to reflect syscall fork is now on upstream 0.9.0.

(NO AI attribution)
2026-07-13 19:40:42 +03:00

145 lines
4.9 KiB
Markdown

# Red Bear OS: Ecosystem Adaption Policy
**Rule (per user directive):** Red Bear OS internal projects MUST always update,
adapt, and go inline with Redox ecosystem changes. Red Bear adapts to Redox,
not the other way around.
## How Ecosystem Pinning Works
The Redox crate ecosystem has version coupling: `libredox`, `redox-scheme`,
`redox_syscall` MUST be on a consistent version set across all crates in a
build. Mixing old and new versions causes `call_ro`/`call_wo` and
`syscall::Error` vs `libredox::error::Error` type errors.
### Canonical Versions (as of build session 2026-06-26)
| Crate | Version | Why this version |
|-------|---------|------------------|
| `libredox` | `=0.1.18` | Current upstream version in fork-upstream-map.toml |
| `redox-scheme` | `=0.11.2` | Current upstream version in fork-upstream-map.toml |
| `redox_syscall` | `=0.9.0` | Current upstream version in fork-upstream-map.toml |
**Note on version selection rationale (per "latest versions only" rule):**
Redox ecosystem is mid-migration (2026-05-27 → 2026-06-01 transition). The
transition broke compatibility for upstream consumers. Per research:
- `redox-scheme 0.11.1` (2026-05-27) bumped `redox_syscall ^0.7.3 → ^0.8.0`
AND `libredox ^0.1.12 → ^0.1.17`
- `redoxfs master` (2026-06-24) still uses `redox-scheme 0.11.0` (NOT 0.11.1)
with `redox_syscall 0.7.5` and `libredox 0.1.13`
- `redox_installer master` (2026-05-27) still uses `redox_syscall 0.7`
and `redoxfs 0.9`
- Red Bear syscall fork is currently aligned with upstream `0.9.0` (the first jump past `0.7.x`)
So the current **mutually-aligned** ecosystem is `redox-scheme 0.11.2` on `redox_syscall 0.9.0`. When upstream `redoxfs` and the rest of the fork map move together, keep this table aligned to the values in `local/fork-upstream-map.toml`:
| Crate | New Version |
|-------|-------------|
| `libredox` | `=0.1.18` |
| `redox-scheme` | `=0.11.2` |
| `redox_syscall` | `=0.9.0` |
Use the current map values to keep the ecosystem aligned.
## How to Pin Ecosystem Versions in a Red Bear Recipe
### For Red Bear local recipes (in `local/recipes/`):
**Single-package files** (no `[workspace]`):
```toml
[dependencies]
# These are pinned to latest ecosystem versions.
libredox = "=0.1.18"
redox-scheme = "=0.11.2"
redox_syscall = "=0.9.0"
```
**Workspace roots** (`[workspace]` section):
```toml
[workspace.dependencies]
# Red Bear OS must adapt to upstream Redox ecosystem changes.
# These pins force unified versions across the workspace.
libredox = "=0.1.18"
redox-scheme = "=0.11.2"
redox_syscall = "=0.9.0"
```
Then in member crates:
```toml
[dependencies]
libredox = { workspace = true }
redox-scheme = { workspace = true }
redox_syscall = { workspace = true }
```
### For upstream Redox recipes (kernel, base, relibc, etc.):
Upstream recipes cannot be modified directly. Use the patch system in
`local/patches/<component>/` to bump the ecosystem pins in their
`Cargo.lock` (and Cargo.toml where needed).
Reference patch: `local/patches/base/P9-redox-scheme-latest-deps.patch`.
## Anti-Patterns (Do Not Do)
### ❌ `[patch.crates-io]` with `version = "..."` syntax
```toml
[patch.crates-io]
libredox = { version = "0.1.17" } # WRONG!
```
This is INVALID. Cargo treats `version = "X.Y.Z"` as a patch pointing to the
same source (crates.io), which conflicts with itself. You get the error:
```
error: patch for `libredox` points to the same source, but patches must
point to different sources
```
Use `[workspace.dependencies]` with `=X.Y.Z` for version-only enforcement
instead.
### ❌ `[patch.crates-io]` with `git = ...` for ecosystem crates
```toml
[patch.crates-io]
redox-scheme = { git = "https://..." } # WRONG!
```
Use crates.io directly. Only `ring` (a Redox fork that doesn't exist on
crates.io) should use `git = ...`.
### ❌ Loose version specifiers
```toml
[dependencies]
libredox = "0.1" # WRONG! Allows any 0.1.x
redox-scheme = "^0.11" # WRONG! Allows any 0.11.x
```
Use `=X.Y.Z` to force EXACT versions. This is critical for ecosystem consistency.
## Maintenance Scripts
Three helper scripts in `/tmp/` (during build session, can be moved to
`local/scripts/`):
- `apply_ecosystem_pins.py` — Adds `[patch.crates-io]` (initial step, now superseded)
- `fix_workspace_pins.py` — Detects and fixes `[patch.crates-io]` version-only bugs
- `fix_all_pins_v2.py` — Comprehensive fix: moves version-only patches to
`[workspace.dependencies]`, updates existing entries to `=X.Y.Z`, removes
empty `[patch.crates-io]` blocks
- `dedupe_deps.py` — Removes duplicate ecosystem crate entries in
`[dependencies]`/`[workspace.dependencies]`
## When to Re-pin
Re-check the canonical versions whenever:
- Redox releases a new `libredox`/`redox-scheme`/`redox_syscall` on crates.io
- A Redox upstream recipe bumps its ecosystem pins
- A new Red Bear local recipe is added that needs ecosystem crates
- Build fails with `call_ro`/`call_wo` or `syscall::Error` mismatch errors