Skip to content

Scan the pull request description for home paths and credentials - #991

Open
seathatflowsinourveins wants to merge 10 commits into
mainfrom
claude/api-actions-pr-body-privacy-20261010
Open

seathatflowsinourveins wants to merge 10 commits into
mainfrom
claude/api-actions-pr-body-privacy-20261010

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes: the required sota-sources job also scans the pull request description for an absolute home path or a credential-shaped string, and fails closed naming only the rule id. It detects a repeat of the command center's privacy correction Blind lanes round 2: sanitized export, receipt aliases, two-family adjudication #145 (home paths had reached eleven places in public PR bodies and comments, all masked since) and keeps such a pull request from landing. It does not prevent the leak: GitHub publishes a description before any check runs, and the gate reads only the current description, not titles, comments or the edit history.
  • Base commit: 83cec12ee. Rebased from c4f499073 onto 0f1537841, and with the terminal commit onto 83cec12ee, each time for a manifest-only conflict (without manifests/evidence.json every commit's patch-id is identical; e15d1259 is now 260803e1, so the delta then called terminal is 260803e1..30f2e005; 4360b9e2 and d9eb2691 follow it).
  • Lane: lane:foundation.
  • Owned paths touched: .github/workflows/pr-metadata.yml and .github/workflows/sota-sources-gate.yml (the same job, byte for byte), scripts/validate.py (the private-key, graph-id, home-path and bearer rules), tests/test_sota_sources_gate.py, tests/test_validate.py, tests/fixtures/cmark-gfm-rendered-rules-587a12bb.json, docs/decisions/2026-09-25-top-rule-sota-sources.md, manifests/evidence.json.

How:

  • The rules are the home-path and credential rules of scripts/validate.py's PRIVATE_CONTENT, written in JavaScript in the job's github-script: personal home path, Windows user path, encoded home path, and the Hugging Face, GitHub, Tavily, API-secret, private-key and bearer-credential rules, plus a gate-only macOS home rule in any case.
  • No host name is needed. ~/ paths, <user> where GitHub shows it (escaped as \<user> or in a code span; GitHub hides a bare tag, so a forward-slash profile with one is refused) and the documented example home pass. A WSL home through its Windows UNC path (\\wsl$\, \\wsl\, \\wsl.localhost\, also as a device path \\?\UNC\... or \\.\UNC\..., in either slash, and JSON-escaped) is a home path in both scans.
  • Validate's two session-identifier rules are left out on purpose: a description may cite a session or request id.
  • The body is the current one, from the REST "Get a pull request" endpoint, as the job already reads it. It is judged before it is read (type, encoding, control characters other than tabs and line breaks, and a bound of 262,144 code points), and the rules see it as written and through the compositions of four decoders: percent escapes, JSON escapes, HTML character references, and the text GitHub displays, by a port of cmark-gfm's inline parser at 587a12bb (since d9eb2691); each chain is read as written and with every Cc, Cf, Zl, Zp and Default_Ignorable_Code_Point character but tab, LF and CR removed and NFKC applied.
  • The failure message names rule ids only, never the matched text, and a missing SOTA section and a private body are reported together.

Review rounds:

  • The co-op's GPT read at 07595323 (three P2s) was fixed in de4eed8f: body guards, decoded forms, Python's Unicode classes spelled out.
  • Codex's GitHub review of de4eed8f (four P1s, three P2s) is answered in fc60da90:
    • Correction: GitHub does not refuse a description over 65,536 characters. Probes of this description through the REST update, each restored at once, show that it keeps at most 262,144 UTF-8 bytes; over that it answers 200 but stores nothing. Organic-invocation E2E v1.1: protocol, pilot spec and the promptfoo-driven harness (run of record smoke-20261006c) #786 has 75,726 characters. The bound is now the gate's own, 262,144 code points, which no stored description reaches. (d81969dd had claimed a 1,048,577-character body was stored, from that 200 answer; a GET read-back corrected it.)
    • The decoders compose, so text written with several escapes at once is judged as it reads.
    • The private-key rule takes gitleaks's header form in both scans, catching PKCS Install native token-saving tools and publish portable lifetime evidence #8 ENCRYPTED and OpenPGP key blocks.
    • The gate didn't read the graph-id form inside an http(s) URL, so a repository named like one could be cited (removed in 6a06673d: the gate reads it everywhere, as validate.py does). The graph-id name is bounded to 256 characters in both scans: a quadratic run of 21 to 93 s now takes 0.05 to 0.1 s.
    • The macOS rule takes any number of leading slashes.
    • A test fails when validate.py gains a rule the gate does not carry.
    • The publication-order finding is answered in the record without a code change: the gate is the backstop, and prevention is scanning the text before gh pr create or gh pr edit.
  • Codex's GitHub review of d81969dd (one P1, one P2): T8, a value split by an HTML comment, which GitHub hides, passed; fixed in 6a06673d (the projection). T9, an invalid character reference such as &#x110000; inside a path, is decoded to nothing, so contrived text is refused though GitHub shows U+FFFD there: a fail-safe false positive, kept, in Follow-ups.
  • Codex's GitHub review of fc60da90 (two P2s): T10, a graph cache path carried in an http(s) URL was exempt; fixed in 4e5ef13d (the exemption then covered code hosts only) and moot since 6a06673d removes it. T11, an unresolved reference link such as [<part>][missing] is collapsed, so contrived text is refused though GitHub shows it literally: fail-safe, kept, in Follow-ups.
  • The co-op's GPT read at fc60da90 (two P2s) is answered in 4e5ef13d:
    • The graph-id URL exemption covered any http(s) URL, so a graph id behind a loopback or localhost URL passed. The exemption then covered only the path of a public code host's URL: an allowlist of seven hosts, lower case, stopping at : @ ? #. Loopback, localhost, private-address and unlisted hosts stay caught. (752d9618 narrows it to a repository name.)
    • Link labels admitted [, so 262,144 unmatched [ gave no verdict within 125 s. Labels now hold no bracket, as in CommonMark. That body takes 0.16 s, and 21 adversarial shapes at the bound took at most 0.26 s each; that set missed an unclosed link of whitespace (below).
    • The new tests fail on the rebased previous head (18 failures, 1 error), and 12 of 13 weakened copies fail them. The survivor is equivalent and is explained in the record.
  • The co-op's GPT read at 4e5ef13d (fix3): ACK, no blocker.
  • The command center's Claude read at 4e5ef13d (CHANGES_REQUESTED; its adjudication ruled B3 and B4 privacy P1s) is answered in one commit, 752d9618:
    • B3: the code-host exemption reached 256 characters past the host, across Markdown and prose delimiters and an inner scheme, so a graph id behind https://github.com/ inside a local URL or its query, as a link destination, after a comma or deeper in the path passed both copies. It now covers only a repository name, the segment right after one owner segment of a listed host's URL, and that URL must start its token. The read's 5 bodies, a pipe, a table cell, a semicolon and a comma now fail both copies, as in validate.py; a linked or autolinked repository named like a graph id still passed (until 6a06673d removed the exemption).
    • B4: \\wsl.localhost\<distro>\home\<name>, \\wsl$\..., \\wsl\... and the JSON-escaped form are now personal home path in validate.py and both copies, cited to Microsoft's "Working across file systems" and the WSL release notes. The 19 tracked lines that write the form, all masked, stay clean.
    • B1: the body guard admits tabs and line breaks, a line break being a paragraph separator (Unicode Bidi_Class B: LF, CR, U+001C to U+001E, U+0085), so Verify the code citations in a PR's SOTA sources (W1b phase A, report-only) #1003's mirror test passes again (the 4 subtests that kept the required validate red). Every other C0 and C1 control is still refused; a test runs all 65 in both copies.
    • B2: the link decoder's parentheses are read as runs that cannot overlap, so [a]( followed by spaces, line feeds or tabs up to the 262,144-code-point bound gets a verdict at once; at 4e5ef13d, 65,536 spaces gave none within 130 s. 35 adversarial shapes at the bound took at most 0.25 s each in my run; the command center's micro measured 0.26 to 0.28 s at a load of about 26, so 6a06673d restates the bound as measured.
    • F1 and F2: the hashed-file count and the Blind lanes round 2: sanitized export, receipt aliases, two-family adjudication #145 wording above are corrected.
    • The new tests fail at 4e5ef13d (34 failures, 1 error), and 13 of 13 weakened copies fail them.
  • The command center's Claude micro at 752d9618 (CHANGES_REQUESTED; the adjudication ruled M1, M2 and Codex's T8 privacy P1s, and the class recurring, rule 4) is answered in 6a06673d, fix round 2 of 2, and a comment-only second commit, e15d1259 (the M3 path in the job's comment made the OpenHands push gate count the mirror's reads and turned the required validate red; the command center's go):
    • M1 and T8: the rules also read a projection of the body: HTML comments removed as CommonMark 0.31.2 reads them (one linear scan), and the 234 Cc, Cf, Zl and Zp characters but tab, LF and CR removed (Unicode 17.0, Node 24.21's; the same set in Python 3.13.16's 15.1). The decoders compose over it as over the body, and each decoder's output there is projected again. A value split by an admitted line break (U+001C to U+001E, U+0085), a zero-width, soft-hyphen or bidi character, or a comment is caught in both copies: 187 split bodies, where 752d9618 let 143 through. Clean bodies with these characters still pass.
    • M2: the code-host exemption is removed. A code-host URL glued inside another URL after (, ', ", [, < or > still exempted a graph id; now the gate reads the graph-id form as validate.py does, and a repository named like one is refused by both.
    • The rarer UNC forms: device paths (\\?\UNC\, \\.\UNC\), either slash, a distribution name with a space or up to 255 characters, and <distro>\mnt\<drive>\Users\<name>, in all three copies (.NET's file path formats). The B4 citation now names WSL/filesystems.md:34 only.
    • The two link shapes 752d9618 stopped decoding (a title on the next line, a title holding an unmatched parenthesis) are decoded again by a second, linear link pattern.
    • M3: the mirror is tools/sota-sources/verify_sources.py, and it counts the four admitted line breaks as section content; the record names the path, and since e15d1259 the job's comment names the mirror without it.
    • Timing, restated as measured: on Node 24.21, 52 adversarial shapes at the bound each get a verdict within 0.46 s on this 64-CPU host at a load of about 25 (four runs, worst 0.39, 0.43, 0.41 and 0.46 s).
    • The new tests fail at 752d9618 (183 failures), and 12 of 12 weakened copies fail them. Codex's threads T1 to T11 are answered and resolved.
  • The co-op's GPT read over 752d9618..e15d1259 (fix5): ACK, no blocker; its 7 P3s are in Follow-ups.
  • The command center's Claude micro at e15d1259 (CHANGES_REQUESTED; three new privacy P1s, the class's third recurrence, rule 4) is answered in one commit, 30f2e005 (called terminal then; 4360b9e2 and d9eb2691 follow it). Each enumeration is replaced by the set a specification defines, in both copies:
    • N1: raw HTML other than a comment (an unknown tag, <font>, <input>, CDATA, a processing instruction) split a value, and GitHub drops it. The projection removes every raw-HTML construct of the GFM grammar (github/cmark-gfm@587a12bb test/spec.txt:9360-9431), from the body as written, a backslash-escaped < being text, by one linear scan. A construct standing alone between separators, such as a <user> placeholder in a path, is kept, since removing it would join the separators around it.
    • N2: named references outside the 16-name map (&shy;, &zwj;, &UnderBar;, &dollar;) split or completed a value. Names are decoded from the HTML5 table as cmark-gfm pins it (src/entities.inc, 2,125 names), limited mechanically to the 297 whose text after the character projection is ASCII or nothing; a test regenerates that subset from a pinned fixture of the table.
    • N3: invisible characters outside Cc, Cf, Zl and Zp (variation selectors, CGJ, Hangul fillers, Mongolian free variation selectors, tag characters) split a value. The projection also removes every Default_Ignorable_Code_Point (UCD 17.0.0, 4,174 code points; Node 24.21's \p{Default_Ignorable_Code_Point} matches the same set).
    • Width forms: the projection applies NFKC, so a fullwidth solidus or fullwidth and mathematical letters read as ASCII.
    • S1: this description's stale sentences are corrected (the round-2 commit, the M3 comment, the obfuscation follow-up, the code-host exemption, the commands' head).
    • What the gate guarantees (since d9eb2691): a value spelled with its own characters is refused when it shows whole in the body as written, in the text the pinned renderer's inline parser displays for it (block structure approximated as the record states), or in their decodings. (This said "whatever is inserted between them" until d9eb2691; the GPT read and the micro at 4360b9e2 disproved it.) What it does not: a look-alike that substitutes a character (a division slash, a Cyrillic letter, another UTS Attach native command returns and usable dashboard evidence #39 confusable); a skeleton projection is a P2 follow-up.
    • Timing: on Node 24.21, 67 adversarial shapes at the bound each get a verdict within 0.47 s on this 64-CPU host at a load of about 18 (four runs, worst 0.46, 0.46, 0.45 and 0.47 s).
    • The new tests fail at e15d1259 (51 failures, 2 errors), and 11 of 11 weakened copies fail them.
  • The co-op's GPT read at 30f2e005 (fix6, CHANGES_REQUESTED: one new P1 the terminal commit introduced, six P3s) is answered in one commit, 4360b9e2, as the command center's addendum 01 at e15d1259 accepted:
    • The placeholder exception shielded a comment between whitespace, so x Bearer <!--x--> and a 40-character token was refused at 260803e1 and accepted at 30f2e005, while GitHub hides the comment and shows the token whole; a tag, a processing instruction or CDATA in that place passed at both heads.
    • Two projections now: the credential rules read the body with every raw-HTML construct removed, wherever it stands; the home-path rules keep only a tag that stands alone between separators (the placeholder form). Every comment, processing instruction, declaration and CDATA section is removed from both.
    • Regressions in both copies: each construct between Bearer and its token and at the start of every ported token's value (ghp_, github_pat_, sk-ant-, hf_, tvly-), and a comment, processing instruction, declaration or CDATA between the separators of a Windows profile. They fail at 30f2e005 (12 failures) and pass at 4360b9e2; the placeholder controls pass on both; 3 of 3 weakened copies fail them. AKIA and xox prefixes have no ported rule here (the stated scope), so they are not among them.
    • Timing: on Node 24.21, 70 adversarial shapes at the bound each get a verdict within 0.83 s on this 64-CPU host at a load of about 15 (four runs, worst 0.67, 0.83, 0.63 and 0.65 s).
  • The GPT read at 4360b9e2 (fix7, CHANGES_REQUESTED: Codex's five open threads, each a P1) and the command center's Claude micro at 4360b9e2 (CHANGES_REQUESTED: four new shape families and the guarantee) are answered in one commit, d9eb2691, under the command center's process for this class (the verdict files are the input). Each was a shape the hand-written Markdown decoder did not model, so the fix matches the text the pinned renderer shows instead of adding to the list:
    • The job's Markdown decoder is a port of github/cmark-gfm@587a12bb's inline parser for the text it displays (src/inlines.c: escapes, code spans, references, autolinks, raw HTML, links and images, emphasis with the flanking rules and the rule of three; extensions/strikethrough.c), with the block structure approximated (fenced code, container markers, table cells, emphasis matched by paragraph and by line).
    • Threads 4246122618 (a nested link destination: parentheses nest up to 32 deep, src/inlines.c:1074-1077), 4246122624 (a defined shortcut reference: the reference map, :1209, :1224) and 4246122650 (nested emphasis); the micro's 2a (escaped or emphasized underscores in a token), 2b (emphasis around _ or a separator), 2c (a tag before a forward-slash profile name: GitHub hides the tag, so the placeholder exception is gone) and 2d (all 2,125 named references now; the "no other name" premise was false).
    • Threads 4246122631 and 4246122640, in scripts/validate.py and both copies: an account name of any word characters (Unicode letters and digits too), and a bearer value in RFC 6750 2.1's b64token alphabet with = padding (rfc6750.txt:252-254). Over every tracked file the widened rules add no match.
    • The adjudicated T9 and T11 are settled by the port: an invalid numeric reference reads as U+FFFD, and an undefined reference stays as written.
    • Evidence: the built renderer passes its own specification harness (670 of 670); the port's text equals the renderer's on all 242 single-paragraph examples; over 76,360 generated bodies, 0 values the renderer shows are missed; a 3,732-body fixture of the renderer's verdicts is checked in both copies, and regenerated where gcc and the mirror are present.
    • The new tests fail at 4360b9e2 (35 failures) and pass at d9eb2691; 14 of 14 weakened copies fail them (one more, taking one emphasis delimiter at a time, shows the same text and is not counted).
    • Timing: on Node 24.21 the 70 adversarial shapes of the earlier rounds each get a verdict within 0.69 s at the bound (two runs, worst 0.65 and 0.69 s), against 0.77 s at 4360b9e2 run back to back, on a 64-CPU host at a load of about 16.
    • The micro's P3s: xox is in Follow-ups; the timing ratio is the measured one; the evidence table's timing row is this head's; the control that pinned the double-slash gap is gone (the gap stays a follow-up); the superseded weakened-copies run is noted beside the later one.
    • Codex's five threads are answered and resolved.

Follow-ups (not in this change):

  • From the GPT read and the micro at 4360b9e2:
    • A renderer replacement (rendering in the job through GitHub's own Markdown API, or a maintained library) is the research-queue comparison the read names for the secrets-credentials layer.
    • Block structure is approximated: a footnote reference is shown as written, an HTML block or indented code is read as inline text, and GitHub's own additions beyond cmark-gfm (mentions, emoji, its sanitizer's allowlist) are not modeled.
    • Retained captures for the cited public sources, and the two live locators (blueprints/runtime-workers/openhands/resolver.py:456, blueprints/native-skill-practice/p1/README.md:14), as before; 18 existing hostname lines in manifests/evidence.json, none in the patch.
  • From the co-op's GPT read at 30f2e005 (fix6):
    • T9 and T11, fail-safe false refusals as adjudicated, are settled in d9eb2691 (above).
    • Retained captures for the cited public sources, an ECMA-262 locator for String.prototype.normalize (NFKC), and a link-definition locator.
    • Two live locators still point before their targets: blueprints/runtime-workers/openhands/resolver.py:456 and blueprints/native-skill-practice/p1/README.md:14.
    • 18 existing hostname lines in manifests/evidence.json, none in the patch.
    • The adjacent limits stay explicit: publication before the check, retrieval and retry, the outgoing guard's order, and a tag standing alone between separators shown as escaped text by GitHub (C:\Users\<x>\alice is accepted: GitHub shows the escaped <x>, so the name is behind visible markup; a forward-slash profile behind a hidden tag is refused since d9eb2691).
  • Main's stale final-stack source hash, which the read found on the merged base (rated P2, base only): Regenerate the final-stack manifest after #1018 changed one of its sources #1025 regenerated catalogs/landscape/final-stack.json after Move the claude-native-practice skill row to the commit that holds #1001, #1005 and #986 #1018, so it is fixed on main; recheck with python3 scripts/final_stack.py --check at the landing rebase.
  • Two live line locators the diff moved: blueprints/runtime-workers/openhands/resolver.py:456 and blueprints/native-skill-practice/p1/README.md:14.
  • Correction provenance: retained, pinned captures for the handwritten Markdown approximation, the URL exemption, the 256-character bound and the POSIX leading-slash rule; and the CommonMark qualification for bracket-free labels.
  • The intentional decoding boundary (no fixed point), kept explicit in the record and in future test corpora.
  • Machine-name references in the unchanged portions of manifests/evidence.json.
  • Look-alikes (P2, the command center's ruling at e15d1259): a division slash, a fraction slash, a set minus, Cyrillic letters in home, Users, a graph id or ghp_, and other UTS Attach native command returns and usable dashboard evidence #39 confusables substitute a character rather than insert one, so the projection does not read them; a skeleton projection from the UTS Attach native command returns and usable dashboard evidence #39 confusables data would.
  • Raw HTML inside a code span or code block was removed by the projection too, though GitHub shows it as text (settled in d9eb2691: the port shows it as text in a code span or fenced code, as GitHub does).
  • From the co-op's GPT read over 752d9618..e15d1259 (fix5, ACK):
    • T9 and T11 stay fail-safe false positives (rated P3; settled in d9eb2691).
    • Retained, hashed captures for the cited public documents (CommonMark 0.31.2, the Unicode 17.0 data files, dotnet/docs, MicrosoftDocs/wsl), pinned mirrors, and a link-definition locator for the titled link pattern; the older provenance gaps (the handwritten Markdown approximation, the 256-character bound, the POSIX leading-slash rule).
    • Two live locators still point before their targets: blueprints/runtime-workers/openhands/resolver.py:456 and blueprints/native-skill-practice/p1/README.md:14.
    • 18 existing machine-name lines in manifests/evidence.json, none in the patch.
    • The adjacent boundaries (publication before the check, the outgoing guard's order, Verify the code citations in a PR's SOTA sources (W1b phase A, report-only) #1003's section-comment regex) stay explicit; a maintained renderer goes through the research queue.
    • The read's merge overlay lost executable bits for main's new landing scripts; rerun those tests in a mode-preserving merge.
  • From Codex's reviews and the command center's micro at 752d9618:
    • T9: an invalid numeric character reference decoded to nothing, so /ho&#x110000;me/<name>/x was refused though GitHub shows U+FFFD; T11: an unresolved reference link was collapsed, so <home>/x was refused. Both failed safe on contrived text; settled in d9eb2691.
    • A value split across a line break or by a carriage return is not joined, and two layers of one encoding are not decoded.
    • #1003's section regex removes comments with <!--[\s\S]*?-->, which rescans from every unclosed <!--: 65,536 characters of them in the section take 0.49 s (7.8 s at the bound) on Node 24.21. Verify the code citations in a PR's SOTA sources (W1b phase A, report-only) #1003's mirror test pins that regex, so a linear form belongs with that test.
    • The 13 modules run below are named there; the micro found 12 that name PRIVATE_CONTENT (1,222 tests).
  • From the command center's Claude read at 4e5ef13d:
    • Home-path forms that pass both scans: \home\<name>\ without a UNC prefix, \Users\<name>\ without a drive, \\host\c$\Users\<name>\, ~<name>/, /home//<name>/, and a Windows profile name that starts with a non-ASCII letter (caught since d9eb2691).
    • Double percent-encoding passes (the documented boundary: decoders run once). A zero-width space or a soft hyphen inside home is caught since 6a06673d, and a fullwidth solidus since 30f2e005 (NFKC); look-alikes are above.
    • A token glued after _ (KEY_sk-ant-...) has no word boundary in either scan, and gitleaks misses it too.
    • Credentials outside the ported set (AWS AKIA, Slack xox, a generic api_key): GitHub's partner secret scanning covers public pull request descriptions; running pinned gitleaks over the body is a research-queue candidate.
    • Titles, comments and the edit history are not scanned. After a body is fixed, the leaked revision stays public; the failure message could tell the author so.
    • The MDN capture digests in the record (cd0a2f97..., cf1a8e20...) no longer reproduce: retain the captures or cite the mdn/content commit.
    • The hand-written link decoder had two backtracking defects; it is replaced by the port in d9eb2691, and a maintained renderer stays in the research queue.

SOTA sources

Evidence-class table

Claim Evidence class Command / receipt
GitHub's REST update stores a pull request description of up to 262,144 UTF-8 bytes, and over that answers 200 but keeps nothing (create not probed) native_proven nine gh api -X PATCH probes on this PR, checked by GET read-back and the edit history, each restored and read back equal; receipt kept by the api-actions lane
Both copies fail a body carrying a home path, an encoded path, a token or a private-key header in any decoded form or composition, naming only the rule ids; ~/, <user> and example pass synthetic GatePrivacyTests, which runs the job's script in node with the github-script calling convention
Each JavaScript rule gives the same verdict as its Python original synthetic test_each_rule_agrees_with_scripts_validate, test_each_rule_agrees_with_python_on_every_code_point
A body at the bound gets a verdict in bounded time synthetic test_a_body_at_the_bound_is_scanned_in_bounded_time (24 bodies at 262,144 code points, including unclosed links, comments and markup of each kind, references and width forms); and test_a_body_built_against_the_renderer_is_scanned_in_bounded_time (29 renderer-stress bodies at the bound); Timing: on Node 24.21 the 70 adversarial shapes of the earlier rounds each get a verdict within 0.69 s at the bound (two runs, worst 0.65 and 0.69 s), against 0.77 s at 4360b9e2 run back to back, on a 64-CPU host at a load of about 16
The new tests fail on the job at de4eed8f, and each of 11 weakened copies fails them synthetic FAILED (failures=22); 11 of 11 mutants fail
The new gate gives the same outcome as the previous gate on every open PR description local_integration 88 live bodies at 2026-10-11T13:56Z against de4eed8f; 86 at 20:17Z against fc60da90; rule ids only
The command center's read at 4e5ef13d is answered: B3's bodies, the WSL UNC forms, the guard's line breaks and an unclosed link synthetic the new tests fail at 4e5ef13d (34 failures, 1 error) and pass at 752d9618; 13 of 13 weakened copies fail them
The UNC rule leaves the repository's masked WSL paths clean local_integration test_the_tracked_masked_wsl_homes_stay_clean (19 lines in 11 files); python3 scripts/validate.py passes on the tree
The new gate gives the same outcome as 4e5ef13d's on live descriptions local_integration 76 open and the latest 400 in any state, at 2026-10-12T04:24Z; no rule named on any; rule ids only
The micro at 752d9618 is answered: split values, glued code-host URLs, comment splits, the rarer UNC forms and two link shapes synthetic the new tests fail at 752d9618 (183 failures) and pass at 6a06673d; 12 of 12 weakened copies fail them
The micro at e15d1259 is answered: raw HTML of every kind, the HTML5 named references, default-ignorables and width forms synthetic the new tests fail at e15d1259 (51 failures, 2 errors) and pass at 30f2e005; 11 of 11 weakened copies fail them; the entity subset is regenerated from the pinned table by a test
The reads at 4360b9e2 are answered: Codex's five threads and the micro's 2a to 2d synthetic the new tests fail at 4360b9e2 (35 failures) and pass at d9eb2691; 14 of 14 weakened copies fail them (one more, taking one emphasis delimiter at a time, shows the same text and is not counted)
Both copies refuse every body whose text the pinned renderer shows with a value synthetic GateRendererParityTests: a 3,732-body fixture of github/cmark-gfm@587a12bb's verdicts, regenerated from a gcc build of the mirror where present; the spec harness passes 670 of 670
This gate and 4360b9e2's name no rule on live descriptions local_integration 68 open and the latest 400 in any state, at 2026-10-12T13:59Z; rule ids only
The terminal gate gives the same outcome as e15d1259's on live descriptions local_integration 75 open and the latest 400 in any state, at 2026-10-12T08:21Z; no rule named on any; rule ids only
The round-2 gate gives the same outcome as 752d9618's on live descriptions local_integration 76 open and the latest 400 in any state, at 2026-10-12T05:31Z; no rule named on any; rule ids only

Local commands run

# at d9eb2691 (on main 83cec12ee; it merges cleanly with main 9cfe3a964)
$ python3 -m unittest <the 27 modules that name PRIVATE_CONTENT, the gate or pr-metadata, the WSL recipe, the manifest and the push gate>
Ran 2179 tests, OK (skipped=6)
$ python3 -m unittest tests.test_sota_sources_gate tests.test_validate   # the new test files on 4360b9e2's code
FAILED (35 failures)
$ python3 scripts/validate.py
exit 0 (11758 hashed files); evidence_manifest.py --check: exit 0
$ actionlint .github/workflows/pr-metadata.yml .github/workflows/sota-sources-gate.yml
exit 0
$ zizmor --offline .github/workflows/pr-metadata.yml .github/workflows/sota-sources-gate.yml
No findings to report (6 suppressed)
$ gitleaks git --log-opts="4360b9e2..HEAD"
no leaks found
# at 4360b9e2
$ python3 -m unittest tests.test_sota_sources_gate tests.test_verify_sources tests.test_validate tests.test_workflow_hardening tests.test_workflow_security_coverage tests.test_workflow_policy tests.test_evidence_manifest tests.test_wsl_new_distro_recipe tests.test_runtime_worker_openhands_push_gate
Ran 555 tests, OK (skipped=1)
$ python3 -m unittest tests.test_sota_sources_gate tests.test_verify_sources   # the new test file on 30f2e005's job
FAILED (12 failures)
$ python3 -m unittest tests.test_validate tests.test_native_token_ci tests.test_host_receipts tests.test_hardware_profile tests.test_jev_p1_casepack tests.test_landscape_sweep_harness tests.test_memory_lifecycle_v2 tests.test_runtime_worker_openhands tests.test_runtime_worker_openhands_resolver tests.test_sdk_usage_scope tests.test_sota_convergence tests.test_sota_sources_gate tests.test_evidence_manifest
Ran 1234 tests, OK (skipped=4) (at the commit before the rebase)
$ python3 -m unittest tests.test_sota_sources_gate tests.test_verify_sources   # the new test file on e15d1259's job
FAILED (51 failures, 2 errors)
$ python3 scripts/validate.py
exit 0 (11757 hashed files); evidence_manifest.py --check: exit 0
$ actionlint .github/workflows/pr-metadata.yml .github/workflows/sota-sources-gate.yml
exit 0
$ zizmor --offline .github/workflows/pr-metadata.yml .github/workflows/sota-sources-gate.yml
No findings to report (6 suppressed)
$ gitleaks git --log-opts="$(git merge-base origin/main HEAD)..HEAD"
no leaks found
$ git merge-tree --write-tree origin/main HEAD   # main bb945f1cf
exit 0
# At 4e5ef13d the earlier body and the lane's record said 11422 hashed files; the read measured 11,658 there.

Decision record

docs/decisions/2026-09-25-top-rule-sota-sources.md, "PR-body privacy scan (2026-10-10)", "After the first review", "After Codex's review (2026-10-11)", "After the second GPT read (2026-10-11)" "After the command center's Claude read of 4e5ef13d (2026-10-12)", "After the command center's Claude micro of 752d9618 (2026-10-12, fix round 2)" "After the command center's Claude micro of e15d1259 (2026-10-12, the terminal commit)", with its addendum 01 and addendum 02 (d9eb2691).

🤖 Generated with Claude Code

@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 10, 2026
@socket-security

socket-security Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Dependency limit exceeded — report not shown.

This pull request scan exceeded the 10,000-dependency limit applied to this scan, so the results are incomplete and may be inaccurate. To avoid reporting false positives, Socket has not posted a report.

Upgrade your plan to raise the dependency limit and get complete reports, or view the partial scan in the dashboard.

Socket is always free for open source. If this is a non-commercial open source project, contact us to request a free Team account.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-12T08:42:52.737372Z 30f2e00 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: de4eed8ffc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread tests/test_sota_sources_gate.py Resolved
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d81969ddcd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/api-actions-pr-body-privacy-20261010 branch from d81969d to fc60da9 Compare October 11, 2026 14:21
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc60da90a1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
The command center's correction #145 found the host account name, inside
absolute home paths, in eleven public PR bodies and comments. The required
sota-sources job (both byte-identical copies) now also checks the current PR
body against scripts/validate.py's home-path and credential rules, written in
JavaScript, and fails closed naming only the rule ids. ~/, <user> and the
example home pass. A test runs every rule against its Python original on a
shared corpus; the new tests fail on the job before this change.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…efuse odd bodies

The co-op's GPT read at 0759532 found three gaps, closed in both copies of
the sota-sources job:

- The body is refused before it is read when it is not text, is longer than
  65,536 characters (the API's own "maximum is 65536 characters"), holds a
  lone surrogate, or holds a control character other than tab, LF or CR; the
  failure names one fixed rule id.
- The rules also run over the body's percent, JSON and HTML decodings and its
  rendered Markdown text, each decoded once. The rendered form drops only
  GitHub's inline HTML elements and paired emphasis, so a <name> placeholder
  or a Users/*/ glob stays as written. A gate-only macos-user-path rule
  catches /users/<name> in any other case.
- The rules spell out Python's str-pattern classes (Unicode \w, \s,
  boundaries, $, and re.IGNORECASE's extra letters) under the u flag, without
  the i flag. A new test compares each rule with scripts/validate.py over
  156,277 code points in 69 templates.

Every open pull request's live description gets the same outcome as before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex's GitHub review of de4eed8 (4 P1, 3 P2), in both copies of the job:

- Correction: GitHub stores descriptions over 65,536 characters (its REST
  update keeps up to 262,144 UTF-8 bytes; #786 has 75,726). The bound
  is the gate's own, 262,144 code points.
- The four decoders compose: every order of every subset, each at most
  once along a chain (65 forms).
- validate.py and the gate take gitleaks's private-key header form, so
  PKCS #8 ENCRYPTED and OpenPGP key blocks are caught.
- The gate does not read the graph-id form inside an http(s) URL; the
  graph-id name runs at most 256 characters to -code- in both scans
  (a quadratic 21-93 s run is now 0.05-0.1 s).
- macos-user-path takes any number of leading slashes.
- A test fails when validate.py gains a rule the gate does not carry.
- Publication order is answered in the record: the gate is the
  backstop; prevention is scanning before gh pr create or edit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…bels

The co-op's GPT read of fc60da9 (2 P2), in both copies of the job:

- The graph-id URL exemption covered any http(s) URL, so a graph id
  behind a loopback or localhost URL passed. It now covers only the path
  of a public code host's URL (an allowlist, lower case, up to four
  subdomain labels, stopping at : @ ? #), so loopback, localhost,
  private-address and unlisted hosts stay caught.
- Link and reference labels admitted '[', so 262,144 unmatched '['
  gave no verdict within 125 s. Labels now hold no bracket (CommonMark);
  that body takes 0.16 s, and 21 adversarial shapes at the bound at most
  0.26 s.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…k decoder

The command center's Claude read at 4e5ef13 (B3 and B4 ruled privacy P1s):
- B3: the graph-id exemption covers only a repository name, the segment after
  one owner segment of a listed code host's URL that starts its token.
- B4: personal home path, in validate.py and both copies, reads
  \\wsl$\, \\wsl\ and \\wsl.localhost\<distro>\home\<name>, JSON-escaped too
  (MicrosoftDocs/WSL@a1473a69 filesystems.md:22, :34; release-notes.md:24,
  :76, :145).
- B1: the body guard admits tabs and line breaks (Bidi_Class B), so #1003's
  mirror test passes again.
- B2: the link decoder's parentheses are runs that cannot overlap; 35
  adversarial shapes at the bound take at most 0.25 s each.

The new tests fail on 4e5ef13 (34 failures, 1 error); 13 of 13 weakened
copies fail them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…e code-host exemption

The command center's fix-round-2 ruling on its micro at 752d961 (M1, M2
and Codex's T8 privacy P1s; the class recurring, rule 4):
- M1, T8: the rules also read a projection of the body, HTML comments
  removed (CommonMark 0.31.2 spec.txt:8986) and the 234 Cc, Cf, Zl and Zp
  characters but tab, LF and CR removed (Unicode 17.0, Node 24.21's); the
  decoders compose over it too, each output projected again.
- M2: the code-host URL exemption is removed in both copies.
- UNC: device paths (\\?\UNC\, \\.\UNC\), either slash, longer and spaced
  distribution names, and <distro>\mnt\<drive>\Users\<name>, in all three
  copies (dotnet/docs@8a189e07 file-path-formats.md:94-95, :155, :206).
- Links: a title on the next line, or holding an unmatched parenthesis,
  is decoded again by a second linear pattern.
- M3 and the :34 citation corrected; timing restated as measured.

The new tests fail at 752d961 (183 failures); 12 of 12 weakened copies
fail them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
6a06673's comment named tools/sota-sources/verify_sources.py inside the
job's script, so the OpenHands push gate's derivation (push_gate.py
derive_ci_protected, names_in_text over run and script text) took the
mirror as a CI-named file, and its 15 reads broke the advisory baseline
test in validate-shard-2. The comment now names the mirror without a
path; the record keeps the path.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…default-ignorables, NFKC

The command center's terminal adjudication at e15d125 (N1-N3 privacy P1s,
the class's third recurrence, rule 4), in both copies:
- N1: the projection removes every raw-HTML construct of the GFM grammar
  (github/cmark-gfm@587a12bb test/spec.txt:9360-9431) from the body as
  written, a backslash-escaped '<' being text, by one linear scan; a
  construct standing alone between separators (a <user> placeholder) stays.
- N2: named references come from the HTML5 table cmark-gfm pins
  (src/entities.inc), limited to the 297 names whose projected text is ASCII
  or nothing; a test regenerates the subset from the pinned fixture.
- N3: every Default_Ignorable_Code_Point is removed (UCD 17.0.0).
- Width forms: NFKC.
- S1: the description's stale sentences are corrected.

The gate now guarantees that no value spelled with its own characters is
published, whatever is inserted between them; look-alikes are a P2
follow-up. The new tests fail at e15d125 (51 failures, 2 errors); 11 of
11 weakened copies fail them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/api-actions-pr-body-privacy-20261010 branch from e15d125 to 30f2e00 Compare October 12, 2026 08:28
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 30f2e00590

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
Comment thread .github/workflows/sota-sources-gate.yml Resolved
…for home paths only

The command center's addendum 01 at e15d125, from the GPT read at
30f2e00: the standalone-construct exception shielded a comment between
whitespace, so "Bearer <!--x-->" before a 40-character token passed while
GitHub shows the token whole. Two projections now: the credential rules
read the body with every raw-HTML construct removed; the home-path rules
keep only a tag standing alone between separators (the placeholder form),
and every comment, processing instruction, declaration and CDATA section
is removed from both.

The new tests fail at 30f2e00 (12 failures) and pass here; 3 of 3
weakened copies fail them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

The GPT read and the command center's Claude micro at 4360b9e:
- Codex's threads 4246122618, 4246122624 and 4246122650, and the
  micro's 2a to 2d: a nested link destination, a defined shortcut
  reference, nested emphasis, escaped or emphasized underscores in a
  token, emphasis around a separator, a tag before a forward-slash
  profile name and a reference outside the 297-name subset each showed
  a value whole on GitHub and passed both copies. The job's Markdown
  decoder is now a port of github/cmark-gfm@587a12bb's inline parser
  for the text it displays (src/inlines.c, extensions/strikethrough.c),
  with all 2,125 named references and the block structure approximated;
  the markup projection and its placeholder exception are gone.
- Threads 4246122631 and 4246122640, in scripts/validate.py and both
  copies: an account name is any run of word characters, and a bearer
  value takes RFC 6750 2.1's b64token alphabet with '=' padding.
- The guarantee, the entity premise and the emphasis wording are
  corrected in the record.

A 3,732-body fixture holds the pinned renderer's verdicts; a test
rebuilds the renderer from the mirror where gcc is present. The new
tests fail on 4360b9e (35 failures) and pass here.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 15, 2026
…oice, PR descriptions read back after publishing (#1169)

* Gap ledger: name native idle compaction, record enableArtifact false, read PR descriptions back

From the practice gap ledger of 2026-10-15 (rows C3-0006, A3-0031 and B2-0004,
each ruled ADOPT and confirmed by the co-op's Codex re-check or by the command
center's adjudication):

- context-compaction (C3-0006): compacting before an idle gap is native since
  2.1.299. Idle compaction compacts an interactive terminal conversation on the
  one-hour cache TTL with 200,000 or more tokens about 54 minutes after its last
  request, before the cache expires (CHANGELOG.md:97-98 at
  anthropics/claude-code@94506ff;
  settings-reference.md:2964-2983 at 2.1.300). The notes name it and keep it
  on, and the slot's mapping of the compact-before-an-idle-gap practice names
  it. The idleCompaction disposition stays declined (no override); its stale
  rollout reason now cites the 2.1.300 docs and the command center's ruling of
  2026-10-14 (leave it unset; false only for one session).
- settings-permissions (A3-0031, ledger slot new): enableArtifact false, read
  from NativeStack2604's user settings by an exact-key grep, is recorded as a
  host choice in a new claude:setting:enableArtifact disposition row (enabled,
  scope NativeStack2604, carrier host user settings). The template is
  unchanged: re-applying it keeps keys it does not mention
  (tools/adoption/apply_claude_settings.py:323-329).
- pr-review-pre-cue (B2-0004, ledger slot new): a PR description goes out from
  a temporary file with --body-file and is read back with gh pr view --json
  body before the PR is reported or cued. Measured 2026-10-11 on #991: updates
  over 262,144 UTF-8 bytes got HTTP 200 and GitHub kept the old description.
  The catalog-freshness propose step already wrote its description to a
  runner temp file and passed --body-file; it now reads the published
  description back and stops before reporting the PR when the two differ.
  #727's stored description is byte-identical to what the step writes for its
  lane (read 2026-10-15), and gh passes the file's bytes unchanged
  (cli/cli v2.102.0 create.go:336-341, edit.go:176-181).

Tests: tests/test_native_practice_ledger_rows_tokeff_new.py, 6 tests, 5 failed
on the base (the page render pin passed); in
tests/test_catalog_freshness_propose.py two tests drive the step's shell with a
synthetic gh that keeps or drops the description, and both failed on the base
in all 5 subtests. Native-practice modules: 106 OK (3 skipped). The 55
modules that read the changed files: 2,665 tests, 2,606 passed, 30 skipped;
the 29 others (25 tests.test_claude_usage_metrics errors, prometheus_client not
installed on this host; 4 tests.test_upstream_surface_watch CachedArtifactTests
failures, this host's cached upstream artifacts) fail the same way on the base.
validate rc 0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Gap ledger tokeff-new fold: read-back failure stops the step, idleCompaction default-on, three neighbour rows

The command center's FULL read of #1169 at bf06685 passed with no P1. It ruled ONE fold, to be re-read as a delta.

- P2-1: tests/test_catalog_freshness_propose.py:1057's synthetic gh can now fail the read-back with no output, or return
  a different description. Two tests assert that the step exits 1 without reporting the PR, on the create and update
  paths. The propose step in .github/workflows/catalog-freshness.yml now stops on a failed read-back with its own
  message; before this commit it already exited 1 there, but silently.
- P2-2: catalogs/foundation/upstream-surface-dispositions.json:3714 moves claude:setting:idleCompaction from declined to
  default-on. The host leaves the native default alone (docs/decisions/2026-10-06-harness-context-budget-refresh.md:25),
  and the dispositions rules (:13-14) call that default-on. The pin at
  tests/test_native_practice_ledger_rows_tokeff_new.py:53 follows.
- P3: new rows for three keys:
  - claude:setting:disableArtifact, not-applicable (a deprecated alias of enableArtifact; settings-reference.md:5354-5360);
  - claude:env:DISABLE_AUTO_COMPACT, default-on (env-vars.md:450);
  - claude:env:CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS, default-on (env-vars.md:323).

Fail-first, with this commit's tests on git archive exports:
- At base 9cf1225, both read-back cases report the PR (exit 0).
- At bf06685, the failed read-back exits without its message.
- The new disposition test fails at bf06685 (declined), and the new rows' test errors there (no rows).
After: the two modules, tests.test_catalog_freshness_propose (91 tests) and tests.test_workflow_hardening (118) pass.
zizmor --offline reports no findings (3 suppressed), and validate rc is 0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant