os: Subnet and MacAddress (step 1 of #129, OS slice 5) #528

Closed
opened 2026-10-27 03:15:26 +00:00 by orion · 10 comments
Collaborator

Goal

Step 1 of the epic #129 (slice 5 of docs/design/OS.md section 10): the two address values that std/ip does not have yet, Subnet and MacAddress, as pure values with parsing and text form. NetworkInterface (step 2 of #129) needs both: InterfaceAddress.subnet() and hardwareAddress.

Specification

  • Design record: OS.md section 5.5 (Network) ("The address values") and the slice 5 row of section 10. docs/ROADMAP.md lists std/os "the rest of their slices" (#126 to #131).
  • What changed since OS.md was written. The design proposed a new pure std/network for the five address values. URI.md section 8a decided otherwise and it is built: the pure package is std/ip (Ipv4Address, Ipv6Address, IpAddress, SocketAddress, AddressError), and std/network is the socket package that re-exports it. Three of the five values therefore exist, with their parsers, RFC 5952 display and tests; their shape as built (octets(): List<Int>, segments(): List<Int>) stands, not the Array<UInt8, 4> of the sketch.
  • Decided by the loop, see the comment on #129: Subnet goes into std/ip (it is an IP value); MacAddress is a link-layer address and std/ip holds "nothing that is not IP" (URI.md 8a), so it goes into std/os in a module of its own, not into network.trb, so that parsing a MAC does not need the std/os/network sandbox grant (OS.md section 8, which reveals where the machine is).

Acceptance criteria

  1. Subnet in std/ip (exported from std/ip/src/lib.trb, re-exported by std/network like the other names): fields address: IpAddress and prefixLength: Int, with Show, Equals, Hash, TryFrom<String, AddressError>, static fn of(address, prefixLength): Result<Subnet, AddressError>, fn contains(address: IpAddress): Bool.
  2. A Subnet is always a network: the host bits of address are zero. tryFrom and of refuse a prefix outside 0..32 (version 4) or 0..128 (version 6), a missing /, a prefix that is empty, signed, has a leading zero or a non-digit, an address with host bits set (192.168.1.23/24) and a zone; show() is the address in its own text form, /, the prefix (10.0.0.0/8, fe80::/64), and tryFrom(show()) gives the value back.
  3. contains: first and last address of a /24, one address either side, /0 holds every address of its own version and none of the other, /32 and /128 hold exactly one address, a version 4 address is never in a version 6 subnet (an IPv4-mapped address is not matched against a version 4 subnet either).
  4. MacAddress in a new module of std/os (std/os/src/macaddress.trb or the closest name the file-naming convention of that directory allows), exported from std/os/src/lib.trb: with Show, Equals, Hash, TryFrom<String, AddressError>, octets(): List<Int> (six, most significant first), static fn of(octets: List<Int>): Result<MacAddress, AddressError>. tryFrom reads six two-digit hexadecimal groups with one consistent separator, : or - (Windows writes 3C-22-FB-0A-1B-9E), either case; it refuses five or seven groups, one-digit or three-digit groups, mixed separators and a stray character. show() is lower case with colons (3c:22:fb:0a:1b:9e). The type reads nothing from the machine (no native, no capability).
  5. The IPv6 parser is audited against the spellings OS.md slice 5 calls its risk. std/ip/tests/addresses.test.trb gets a test for each of these that it lacks: ::, ::1, 1::, :: at the start, the middle and the end, upper-case and four-digit segments, an embedded dotted IPv4 tail, :: standing for exactly one zero segment (RFC 5952 section 4.2.2: shown as 0, not ::), two runs of equal length (the first collapses), 1:0:0:2:0:0:0:3, and the refusals (two ::, nine segments, a five-digit segment, a zone).
  6. Tests: Subnet in std/ip/tests/ (criteria 2 and 3), MacAddress in std/os/tests/ (criterion 4), both run on every machine.
  7. Docs: docs/standard-library/ip.md documents Subnet, docs/standard-library/os.md documents MacAddress, docs check is clean and skills/ is regenerated. OS.md is corrected in the same PR: section 3 (module tree and the "who owns what" row: the address values are std/ip's, std/network is the socket package, MacAddress is a module of std/os) and section 5.5 (the shapes as built, the sketch's Array<UInt8, 4> replaced), and the slice 5 row says Step 1 done (date) with the step list of #129, like slice 3.
  8. sh tools/gates.sh a is green in the forge CI of the PR.

Not in this step

  • The closed list of URI.md section 9 (a string literal adapting to IpAddress, Subnet, ...) is a compiler change; OS.md only calls these types "candidates". It is not added here; if the owner wants it, it is its own issue.
  • NetworkInterface, InterfaceAddress and the natives: steps 2 and 3 of #129.

Seed impact

No. Two additive types in packages the compiler does not look up by string; no syntax change, no native, no driver flag.

Size

One PR, two Conventional Commits:

  1. feat(ip): Subnet and an audit of the IPv6 parser tests (criteria 1 to 3, 5, the ip.md part of 7)
  2. feat(os): MacAddress and the corrected address records (criterion 4, the os.md part of 7, the OS.md corrections)

Pure TorbScript and docs, no runtime C.

## Goal Step 1 of the epic #129 (slice 5 of `docs/design/OS.md` section 10): the two address values that `std/ip` does not have yet, `Subnet` and `MacAddress`, as pure values with parsing and text form. `NetworkInterface` (step 2 of #129) needs both: `InterfaceAddress.subnet()` and `hardwareAddress`. ## Specification - Design record: [OS.md section 5.5 (Network)](https://git.torb.dev/torbscript/language/src/branch/main/docs/design/OS.md#55-network) ("The address values") and the slice 5 row of section 10. [docs/ROADMAP.md](https://git.torb.dev/torbscript/language/src/branch/main/docs/ROADMAP.md) lists `std/os` "the rest of their slices" (#126 to #131). - **What changed since OS.md was written.** The design proposed a new pure `std/network` for the five address values. URI.md section 8a decided otherwise and it is built: the pure package is `std/ip` (`Ipv4Address`, `Ipv6Address`, `IpAddress`, `SocketAddress`, `AddressError`), and `std/network` is the socket package that re-exports it. Three of the five values therefore exist, with their parsers, RFC 5952 display and tests; their shape as built (`octets(): List<Int>`, `segments(): List<Int>`) stands, not the `Array<UInt8, 4>` of the sketch. - Decided by the loop, see the comment on #129: `Subnet` goes into `std/ip` (it is an IP value); `MacAddress` is a link-layer address and `std/ip` holds "nothing that is not IP" (URI.md 8a), so it goes into `std/os` in a module of its own, not into `network.trb`, so that parsing a MAC does not need the `std/os/network` sandbox grant (OS.md section 8, which reveals where the machine is). ## Acceptance criteria 1. `Subnet` in `std/ip` (exported from `std/ip/src/lib.trb`, re-exported by `std/network` like the other names): fields `address: IpAddress` and `prefixLength: Int`, `with Show, Equals, Hash, TryFrom<String, AddressError>`, `static fn of(address, prefixLength): Result<Subnet, AddressError>`, `fn contains(address: IpAddress): Bool`. 2. A `Subnet` is always a network: the host bits of `address` are zero. `tryFrom` and `of` refuse a prefix outside `0..32` (version 4) or `0..128` (version 6), a missing `/`, a prefix that is empty, signed, has a leading zero or a non-digit, an address with host bits set (`192.168.1.23/24`) and a zone; `show()` is the address in its own text form, `/`, the prefix (`10.0.0.0/8`, `fe80::/64`), and `tryFrom(show())` gives the value back. 3. `contains`: first and last address of a `/24`, one address either side, `/0` holds every address of its own version and none of the other, `/32` and `/128` hold exactly one address, a version 4 address is never in a version 6 subnet (an IPv4-mapped address is not matched against a version 4 subnet either). 4. `MacAddress` in a new module of `std/os` (`std/os/src/macaddress.trb` or the closest name the file-naming convention of that directory allows), exported from `std/os/src/lib.trb`: `with Show, Equals, Hash, TryFrom<String, AddressError>`, `octets(): List<Int>` (six, most significant first), `static fn of(octets: List<Int>): Result<MacAddress, AddressError>`. `tryFrom` reads six two-digit hexadecimal groups with one consistent separator, `:` or `-` (Windows writes `3C-22-FB-0A-1B-9E`), either case; it refuses five or seven groups, one-digit or three-digit groups, mixed separators and a stray character. `show()` is lower case with colons (`3c:22:fb:0a:1b:9e`). The type reads nothing from the machine (no native, no capability). 5. The IPv6 parser is audited against the spellings OS.md slice 5 calls its risk. `std/ip/tests/addresses.test.trb` gets a test for each of these that it lacks: `::`, `::1`, `1::`, `::` at the start, the middle and the end, upper-case and four-digit segments, an embedded dotted IPv4 tail, `::` standing for exactly one zero segment (RFC 5952 section 4.2.2: shown as `0`, not `::`), two runs of equal length (the first collapses), `1:0:0:2:0:0:0:3`, and the refusals (two `::`, nine segments, a five-digit segment, a zone). 6. Tests: `Subnet` in `std/ip/tests/` (criteria 2 and 3), `MacAddress` in `std/os/tests/` (criterion 4), both run on every machine. 7. Docs: `docs/standard-library/ip.md` documents `Subnet`, `docs/standard-library/os.md` documents `MacAddress`, `docs check` is clean and `skills/` is regenerated. OS.md is corrected in the same PR: section 3 (module tree and the "who owns what" row: the address values are `std/ip`'s, `std/network` is the socket package, `MacAddress` is a module of `std/os`) and section 5.5 (the shapes as built, the sketch's `Array<UInt8, 4>` replaced), and the slice 5 row says **Step 1 done (date)** with the step list of #129, like slice 3. 8. `sh tools/gates.sh a` is green in the forge CI of the PR. ## Not in this step - The closed list of URI.md section 9 (a string literal adapting to `IpAddress`, `Subnet`, ...) is a compiler change; OS.md only calls these types "candidates". It is not added here; if the owner wants it, it is its own issue. - `NetworkInterface`, `InterfaceAddress` and the natives: steps 2 and 3 of #129. ## Seed impact No. Two additive types in packages the compiler does not look up by string; no syntax change, no native, no driver flag. ## Size One PR, two Conventional Commits: 1. `feat(ip): Subnet and an audit of the IPv6 parser tests` (criteria 1 to 3, 5, the `ip.md` part of 7) 2. `feat(os): MacAddress and the corrected address records` (criterion 4, the `os.md` part of 7, the OS.md corrections) Pure TorbScript and docs, no runtime C.
Author
Collaborator

[loop:torbscript] claim implement (continue from the last checkpoint) by session:loop-torbscript-20261027 until 2026-10-27T09:30Z

[loop:torbscript] claim implement (continue from the last checkpoint) by session:loop-torbscript-20261027 until 2026-10-27T09:30Z
Author
Collaborator

[loop:torbscript] implement: checkpoint, next: continue implement (worker 1 ended at context limit; roughly 100k tokens used)

Branch loop/528-subnet-mac (pushed, no PR yet), commit 8e909e5f. The container has no torb binary, so nothing is compiled or formatted yet: everything below is verified by CI only.

Done

  • Subnet in std/ip/src/address.trb, exported from std/ip/src/lib.trb and re-exported by std/network/src/lib.trb.
  • Decided by the loop: Subnet is a capsule (data-or-capsule.md: private addressValue and prefixLengthValue, accessors address() and prefixLength(), ways in Subnet.of and tryFrom), not the public fields of the OS.md sketch. With public fields Subnet(address, 99) would build a value that is not a network and breaks criterion 2 ("always a network") and contains. Step 2 of #129 only needs subnet(), address() and prefixLength(). The deviation goes into the PR body and OS.md section 5.5.
  • contains and the host-bit check work on groups (octets of 8 bits, segments of 16 bits) with small shifts only, so there is no 64-bit mask overflow.

Next (in this order)

  1. std/ip/tests/addresses.test.trb: Subnet tests (criteria 2 and 3) and the IPv6 audit tests of criterion 5 (the existing file already covers ::1 ... partly; add what is missing: ::, 1::, :: at start, middle and end, upper case, four-digit segments, dotted tail, :: for exactly one zero segment shown as 0, two equal runs, refusals).
  2. std/os/src/macaddress.trb (capsule private value: Int with 48 bits, octets(), of(List<Int>) refusing a count other than six and an octet outside 0..255, tryFrom with one consistent : or -, two hex digits per group, show() lower case with colons; use AddressError from "std/ip", copy the small hexadecimalDigit helper), public use MacAddress from "./macaddress" in std/os/src/lib.trb, tests in std/os/tests/macaddress.test.trb.
  3. Docs: docs/standard-library/ip.md (Subnet in keywords, import line, torb:declaration block and prose; the declaration block must match torb docs declarations --check) and os.md (MacAddress); OS.md sections 3, 5.5 and the slice 5 row ("Step 1 done (2026-10-27)"); skills/torbscript-networking/references/standard-library/ip.md and the matching os page under skills/torbscript-standard-library regenerated (no local torb: edit the copies like the docs and let docs skill --check in CI show any diff).
  4. Two Conventional Commits as in the issue (squash the wip commit), torb format --check layout by hand (120 columns, command calls), push, open the PR Closes #528, ci-wait.sh, fix reds.
[loop:torbscript] implement: checkpoint, next: continue implement (worker 1 ended at context limit; roughly 100k tokens used) Branch `loop/528-subnet-mac` (pushed, no PR yet), commit 8e909e5f. The container has no `torb` binary, so nothing is compiled or formatted yet: everything below is verified by CI only. **Done** - `Subnet` in `std/ip/src/address.trb`, exported from `std/ip/src/lib.trb` and re-exported by `std/network/src/lib.trb`. - Decided by the loop: `Subnet` is a capsule (`data-or-capsule.md`: private `addressValue` and `prefixLengthValue`, accessors `address()` and `prefixLength()`, ways in `Subnet.of` and `tryFrom`), not the public fields of the OS.md sketch. With public fields `Subnet(address, 99)` would build a value that is not a network and breaks criterion 2 ("always a network") and `contains`. Step 2 of #129 only needs `subnet()`, `address()` and `prefixLength()`. The deviation goes into the PR body and OS.md section 5.5. - `contains` and the host-bit check work on groups (octets of 8 bits, segments of 16 bits) with small shifts only, so there is no 64-bit mask overflow. **Next (in this order)** 1. `std/ip/tests/addresses.test.trb`: Subnet tests (criteria 2 and 3) and the IPv6 audit tests of criterion 5 (the existing file already covers `::1` ... partly; add what is missing: `::`, `1::`, `::` at start, middle and end, upper case, four-digit segments, dotted tail, `::` for exactly one zero segment shown as `0`, two equal runs, refusals). 2. `std/os/src/macaddress.trb` (capsule `private value: Int` with 48 bits, `octets()`, `of(List<Int>)` refusing a count other than six and an octet outside 0..255, `tryFrom` with one consistent `:` or `-`, two hex digits per group, `show()` lower case with colons; `use AddressError from "std/ip"`, copy the small `hexadecimalDigit` helper), `public use MacAddress from "./macaddress"` in `std/os/src/lib.trb`, tests in `std/os/tests/macaddress.test.trb`. 3. Docs: `docs/standard-library/ip.md` (Subnet in keywords, import line, `torb:declaration` block and prose; the declaration block must match `torb docs declarations --check`) and `os.md` (MacAddress); OS.md sections 3, 5.5 and the slice 5 row ("Step 1 done (2026-10-27)"); `skills/torbscript-networking/references/standard-library/ip.md` and the matching os page under `skills/torbscript-standard-library` regenerated (no local `torb`: edit the copies like the docs and let `docs skill --check` in CI show any diff). 4. Two Conventional Commits as in the issue (squash the wip commit), `torb format --check` layout by hand (120 columns, command calls), push, open the PR `Closes #528`, `ci-wait.sh`, fix reds.
Author
Collaborator

[loop:torbscript] release implement: the continuation worker after the checkpoint above died on an account usage limit before its first step (no new commit; branch loop/528-subnet-mac at 8e909e5f unchanged). The next tick respawns on the next usable profile from the checkpoint above. next: implement (continue)

[loop:torbscript] release implement: the continuation worker after the checkpoint above died on an account usage limit before its first step (no new commit; branch loop/528-subnet-mac at 8e909e5f unchanged). The next tick respawns on the next usable profile from the checkpoint above. next: implement (continue)
Author
Collaborator

[loop:torbscript] claim implement (continuation 1, respawn pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027 until 2026-10-27T09:45Z

[loop:torbscript] claim implement (continuation 1, respawn pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027 until 2026-10-27T09:45Z
Author
Collaborator

[loop:torbscript] implement: checkpoint (continuation 1), next: continue implement (context guard)

Branch loop/528-subnet-mac pushed (HEAD is the commit "wip(os): shorten a doc line", main has not moved, no rebase needed), worktree code/wt/torbscript-language-528-subnet-mac (ws wt new torbscript/language 528 subnet-mac --branch loop/528-subnet-mac). No PR yet. No torb binary in the container, so nothing is compiled or formatted: CI only. Push needs git -c http.extraHeader="Authorization: token $(cat ~/.secrets/torbdev-token)" push origin loop/528-subnet-mac.

Done since the last checkpoint (4 wip commits on top of 142293fd)

  • std/ip/tests/subnets.test.trb (new): reading/showing, refusals, of, contains incl. /0, /32, /128, mid-octet prefixes, mapped addresses (criteria 2, 3, 6).
  • std/ip/tests/addresses.test.trb: group "IPv6 spellings" with the audit of criterion 5 (:: positions, case and four-digit segments, dotted tail, one-zero :: shown as 0, equal runs, refusals) and a segmentsVersion6 helper.
  • std/os/src/macaddress.trb (capsule, of, octets, show, tryFrom, copied hexadecimalDigit), public use MacAddress from "./macaddress" plus a doc bullet in std/os/src/lib.trb, std/os/tests/macaddress.test.trb (criteria 4, 6).

Next, in this order

  1. Check how the capability of a std/os module is derived (std/os/entropy is "a capability of its own"; my grep for os/entropy outside docs/.trb found nothing in the compiler, so look in compiler/ for entropy capability tables and in tools/): MacAddress must not make an importer touch the os capability if the mapping is per module; the issue wants "no capability". If a table exists, add std/os/macaddress as capability-free, else say so in the docs.
  2. Docs: docs/standard-library/ip.md (Subnet: keywords, import line, torb:declaration block that matches torb docs declarations --check, prose) and os.md (MacAddress; keep the import line style of Entropy); OS.md sections 3, 5.5 (shapes as built, Subnet is a capsule with accessors, Array<UInt8, 4> sketch replaced) and the slice 5 row "Step 1 done (2026-10-27)"; hand-copy the same changes into skills/torbscript-networking/references/standard-library/ip.md and the os page under skills/torbscript-standard-library (no local torb; docs skill --check in CI shows diffs).
  3. Squash the 4 wip commits into the two Conventional Commits of the issue (1: feat(ip): Subnet and an audit of the IPv6 parser tests, 2: feat(os): MacAddress and the corrected address records), git push --force-with-lease to the loop branch, open the PR Closes #528 (deviation note: capsule instead of public fields), ci-wait.sh, fix reds (expect formatter diffs, e.g. multi-line lists, and possibly parts[8..] in IPv6 show() for a trailing zero run, covered by the new test 1:2:3:4:5:0:0:0).
[loop:torbscript] implement: checkpoint (continuation 1), next: continue implement (context guard) Branch `loop/528-subnet-mac` pushed (HEAD is the commit "wip(os): shorten a doc line", main has not moved, no rebase needed), worktree `code/wt/torbscript-language-528-subnet-mac` (`ws wt new torbscript/language 528 subnet-mac --branch loop/528-subnet-mac`). No PR yet. No `torb` binary in the container, so nothing is compiled or formatted: CI only. Push needs `git -c http.extraHeader="Authorization: token $(cat ~/.secrets/torbdev-token)" push origin loop/528-subnet-mac`. **Done since the last checkpoint** (4 wip commits on top of 142293fd) - `std/ip/tests/subnets.test.trb` (new): reading/showing, refusals, `of`, `contains` incl. /0, /32, /128, mid-octet prefixes, mapped addresses (criteria 2, 3, 6). - `std/ip/tests/addresses.test.trb`: group "IPv6 spellings" with the audit of criterion 5 (`::` positions, case and four-digit segments, dotted tail, one-zero `::` shown as `0`, equal runs, refusals) and a `segmentsVersion6` helper. - `std/os/src/macaddress.trb` (capsule, `of`, `octets`, `show`, `tryFrom`, copied `hexadecimalDigit`), `public use MacAddress from "./macaddress"` plus a doc bullet in `std/os/src/lib.trb`, `std/os/tests/macaddress.test.trb` (criteria 4, 6). **Next, in this order** 1. Check how the capability of a `std/os` module is derived (`std/os/entropy` is "a capability of its own"; my grep for `os/entropy` outside docs/.trb found nothing in the compiler, so look in `compiler/` for `entropy` capability tables and in `tools/`): `MacAddress` must not make an importer touch the `os` capability if the mapping is per module; the issue wants "no capability". If a table exists, add `std/os/macaddress` as capability-free, else say so in the docs. 2. Docs: `docs/standard-library/ip.md` (Subnet: keywords, import line, `torb:declaration` block that matches `torb docs declarations --check`, prose) and `os.md` (MacAddress; keep the import line style of `Entropy`); OS.md sections 3, 5.5 (shapes as built, Subnet is a capsule with accessors, `Array<UInt8, 4>` sketch replaced) and the slice 5 row "Step 1 done (2026-10-27)"; hand-copy the same changes into `skills/torbscript-networking/references/standard-library/ip.md` and the os page under `skills/torbscript-standard-library` (no local `torb`; `docs skill --check` in CI shows diffs). 3. Squash the 4 wip commits into the two Conventional Commits of the issue (1: `feat(ip): Subnet and an audit of the IPv6 parser tests`, 2: `feat(os): MacAddress and the corrected address records`), `git push --force-with-lease` to the loop branch, open the PR `Closes #528` (deviation note: capsule instead of public fields), `ci-wait.sh`, fix reds (expect formatter diffs, e.g. multi-line lists, and possibly `parts[8..]` in IPv6 `show()` for a trailing zero run, covered by the new test `1:2:3:4:5:0:0:0`).
Author
Collaborator

[loop:torbscript] claim implement (continuation 2 of 3, pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027 until 2026-10-27T09:45Z

[loop:torbscript] claim implement (continuation 2 of 3, pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027 until 2026-10-27T09:45Z
Author
Collaborator

[loop:torbscript] implement: checkpoint (continuation 2), next: continue implement (context guard; PR open, forge CI running)

PR #530 (Closes #528), branch loop/528-subnet-mac, two Conventional Commits (0147b733 feat(ip), 3a03f5ec feat(os)), rebased on main (no drift), worktree code/wt/torbscript-language-528-subnet-mac. No torb in the container: nothing compiled or formatted, the forge CI is the first run.

Done in this continuation

  • Capability: std/os/macaddress would have reached "the operating system" through capabilityOf("std/os"); added the arm ("std/os", "MacAddress") => None in compiler/src/package/archive.trb (capabilityOfImport) and a test in compiler/tests/capability.test.trb.
  • Docs: ip.md (Subnet: keywords, import, declaration block, prose, checked example), os.md (MacAddress), OS.md sections 3 and 5.5 and the slice 5 row ("Step 1 done (2026-10-27)"), summaries in the index files and the skill copies (skills/ edited by hand with the link rewrites of the generator).
  • Squashed the wip commits into the two commits, force-with-lease pushed, PR opened.

Next

  1. bash /opt/openclaw/skills/dev-workflow/scripts/ci-wait.sh -C <worktree> --timeout 3300 (a waiter was started in the previous worker; it may have ended), fix every red on the same branch. Expect: torb format --check diffs (120 columns, command-call style), docs check/docs declarations --check on the Subnet and MacAddress blocks (member order or private handling), docs skill --check diffs of the hand-edited skills/ copies (regenerate by copying the CI diff), and possibly a compile error in the unverified .trb (subnets.test.trb, macaddress.trb, IPv6 show() with a trailing zero run).
  2. When tier A is green: result comment [loop:torbscript] implement: PR open, tier A green, next: review (merge gate argus) with token usage; release the claim.
[loop:torbscript] implement: checkpoint (continuation 2), next: continue implement (context guard; PR open, forge CI running) PR https://git.torb.dev/torbscript/language/pulls/530 (`Closes #528`), branch `loop/528-subnet-mac`, two Conventional Commits (0147b733 `feat(ip)`, 3a03f5ec `feat(os)`), rebased on main (no drift), worktree `code/wt/torbscript-language-528-subnet-mac`. No `torb` in the container: nothing compiled or formatted, the forge CI is the first run. **Done in this continuation** - Capability: `std/os/macaddress` would have reached "the operating system" through `capabilityOf("std/os")`; added the arm `("std/os", "MacAddress") => None` in `compiler/src/package/archive.trb` (`capabilityOfImport`) and a test in `compiler/tests/capability.test.trb`. - Docs: `ip.md` (Subnet: keywords, import, declaration block, prose, checked example), `os.md` (MacAddress), OS.md sections 3 and 5.5 and the slice 5 row ("Step 1 done (2026-10-27)"), summaries in the index files and the skill copies (`skills/` edited by hand with the link rewrites of the generator). - Squashed the wip commits into the two commits, force-with-lease pushed, PR opened. **Next** 1. `bash /opt/openclaw/skills/dev-workflow/scripts/ci-wait.sh -C <worktree> --timeout 3300` (a waiter was started in the previous worker; it may have ended), fix every red on the same branch. Expect: `torb format --check` diffs (120 columns, command-call style), `docs check`/`docs declarations --check` on the `Subnet` and `MacAddress` blocks (member order or `private` handling), `docs skill --check` diffs of the hand-edited `skills/` copies (regenerate by copying the CI diff), and possibly a compile error in the unverified `.trb` (`subnets.test.trb`, `macaddress.trb`, IPv6 `show()` with a trailing zero run). 2. When tier A is green: result comment `[loop:torbscript] implement: PR open, tier A green, next: review (merge gate argus)` with token usage; release the claim.
Author
Collaborator

[loop:torbscript] release implement (continuation 2 of 3 collected), next: CI on PR #530 (head 3a03f5ec, all checks pending at collect time). Green tier A: hand over to review. Red: one fix worker (continuation 3, last allowed) briefed from issuecomment-7330. No worker slot free right now (2 running), so the next tick picks this up by CI state. Worker tokens: ~97k prompt/cache.

[loop:torbscript] release implement (continuation 2 of 3 collected), next: CI on PR #530 (head 3a03f5ec, all checks pending at collect time). Green tier A: hand over to review. Red: one fix worker (continuation 3, last allowed) briefed from issuecomment-7330. No worker slot free right now (2 running), so the next tick picks this up by CI state. Worker tokens: ~97k prompt/cache.
Author
Collaborator

[loop:torbscript] claim implement (fix round, red tier A on PR #530 head 3a03f5ec, pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027-0718 until 2026-10-27T13:24Z

[loop:torbscript] claim implement (fix round, red tier A on PR #530 head 3a03f5ec, pinned on anthropic:notahumanmate) by session:loop-torbscript-20261027-0718 until 2026-10-27T13:24Z
Author
Collaborator

[loop:torbscript] release implement: the fix worker timed out while waiting for CI; PR #530 head 00052388 carries its push, forge CI is queued. next: waiting (CI on PR #530); red tier A gets a further fix worker (the issue's continuation cap is spent, so the fix round continues from the PR state)

[loop:torbscript] release implement: the fix worker timed out while waiting for CI; PR #530 head 00052388 carries its push, forge CI is queued. next: waiting (CI on PR #530); red tier A gets a further fix worker (the issue's continuation cap is spent, so the fix round continues from the PR state)
argus closed this issue 2026-10-27 14:19:46 +00:00
Sign in to join this conversation.
No labels
loop
ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
torbscript/language#528
No description provided.