Skip to content

Skills trial: cloudflare/security-audit-skill name-only for LLM-native automation; stale-upstream flags; sandbox-profile open gate - #448

Merged
seathatflowsinourveins merged 8 commits into
mainfrom
claude/integrity-wave-skills-catalog-20260927
Sep 28, 2026
Merged

seathatflowsinourveins merged 8 commits into
mainfrom
claude/integrity-wave-skills-catalog-20260927

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

Scope

  • Adds cloudflare/security-audit-skill as a trial skill, pinned at c1c8a8c. Its Claude listing is name-only so that LLM-native automation (workflow stages) can call it. The user rejected user invocation, so it is not user-invocable-only. name-only still leaves /security-audit in the / menu and invocable by Claude, so stage-only use is a usage policy, not an enforced setting. No agent preloads it, and Codex is disabled for the trial.
  • Flags two stale upstreams:
    • openai/skills: no commits on main since 2026-06-24.
    • praetorian-inc/noseyparker: archived 2026-04-24.
  • Opens the foundation gate claude-code-sandbox-profile. It is deferred to a later wave, but tracked.
  • Base commit: ba1700ad; main merged in at f508ffba per the docs/lanes.md hot-file protocol.
  • Lane: lane:foundation.
  • Owned paths:
    • adoption/skills/manifest.json
    • adoption/templates/claude.settings.template.json (the skillOverrides mirror)
    • adoption/manifest.json (continuation.next_action_refs)
    • catalogs/foundation/manifest.json
    • docs/decisions/2026-09-25-skills-trial-and-usage.md (2026-09-27 addendum)
    • evidence/artifacts/cloudflare-audit-skill-trial-20260927/
    • manifests/evidence.json (hot-file registration)

catalogs/foundation/manifest.json requires exactly three ranked top gaps, so the new open gap takes priority slot 2 from worker-cancellation-crash-resume (accepted_within_scope). That gap's content stays in decision native-child-interruption-recovery: its evidence_scope sentence is verbatim, and its limitations and next_gap carry the retained caveats and the reuse rule.

Nothing is installed by this PR. Once it is merged, the coordinator installs the skill following the receipt README: settings template, then the Codex disable table, then install_skills.py --only security-audit, then a read-back.

SOTA sources

Evidence-class table

Claim Evidence class Command / receipt
Pin, tree and SKILL.md hashes at c1c8a8c source_review gh api calls recorded in evidence/artifacts/cloudflare-audit-skill-trial-20260927/delta.json
Audit verdicts (Gen Pass, Socket Pass, Snyk Warn W011) source_review skills.sh pages fetched 2026-09-27 (hashes in delta.json)
Manifest and template consistency local_integration tests.test_skills_manifest 21 OK (control: fails without the template key), test_install_skills 19 OK, test_skills_status 43 OK
Open gate matches its unfinished gap local_integration scripts/validate_foundation.py passes; 2 broken throwaway variants fail with "must reference exactly the unfinished gaps"
Skill installed and discovered by the client not yet: post-merge coordinator install and read-back after merge

Local commands run

$ python3 -m unittest tests.test_skills_manifest tests.test_install_skills tests.test_skills_status
Ran 83 tests ... OK
$ python3 scripts/validate_foundation.py && python3 scripts/validate_catalogs.py
FOUNDATION catalog valid (layers 20, decisions 54); catalog structure validated
$ python3 scripts/validate.py
{status passed}

The whole-suite run fails locally because of the host's empty /tmp/.git (a known gotcha that trips tests' "outside every repository" guards). CI is the full gate.

Decision record

docs/decisions/2026-09-25-skills-trial-and-usage.md, 2026-09-27 addendum. It covers:

  • the gate results;
  • the refutation of the 2026-09-23 not_adopted proposal, with the gap restated: native reviews are diff-scoped, and we have no whole-repository audit with a coverage ledger and a three-verdict contract;
  • the M5b suitability gate;
  • the M5c bake-off, queued behind Gates A and B with a high budget per the user;
  • the trial exit and the overturn condition.

Review

  • Claude evidence-reviewer: one round, 3 major and 2 minor findings, all applied in repair commit 90a5c0e3.
  • Cross-family GPT-6 review (codex exec -s read-only -m gpt-6-astra, effort max, on 90a5c0e3, 2026-09-28): changes-needed. One P2: name-only hides only the description. Claude can still invoke the skill by name, and it stays in the / menu, so "no user trigger" and "cannot fire" overclaimed.
  • Repair round:
    • 8fce09c5 restates the wiring as a usage policy.
    • A Claude stack-verifier re-ran the probes. P2 was fixed, but it found a new claim of the same kind: that user-invocable: false would enforce stage-only use.
    • b3db21da limits the residual to the user trigger. Skills docs L799: "With user-invocable: false, you can't invoke the skill, but Claude still can." L796: disable-model-invocation: true removes the skill from Claude's context entirely.
  • Residuals:
    • Stage-only use is a usage policy that no setting enforces.
    • Removing the user trigger needs a new upstream pin plus a native probe.
    • Invocation reach is live-run-pending.

Checklist

  • No new or changed Actions.
  • No secrets printed, logged or committed. A gitleaks false positive on a public tree SHA key was fixed by renaming the key, with no allowlist and no --no-verify.
  • No paid hosting.
  • Peer-owned files and worktrees preserved.

🤖 Generated with Claude Code

Scout and others added 2 commits September 27, 2026 22:26
…ative automation, flag stale upstreams, open the sandbox-profile gate

- adoption/skills/manifest.json: trial row security-audit at
  cloudflare/security-audit-skill@c1c8a8c (tree ccbc33e, SKILL.md sha256
  5e3e96a1, 359-character description), claude_listing name-only,
  codex_enabled false, added 2026-09-27; checked_at 2026-09-27. The settings
  template mirrors it in skillOverrides.
- docs/decisions/2026-09-25-skills-trial-and-usage.md: 2026-09-27 addendum
  (audits re-observed, MIT, the 2026-09-23 not_adopted refutation with the gap
  restated from the commands reference, issue #20 as weak third-party
  evidence, LLM-native wiring, M5b gate, M5c bake-off queued behind Gates A
  and B, trial exit and overturn; openai/skills and noseyparker flags).
- catalogs/foundation/manifest.json: open gate claude-code-sandbox-profile
  (owner foundation coordinator, re-check 2026-10-11) on a new open top gap in
  the priority-2 slot of worker-cancellation-crash-resume, whose scope the
  decision native-child-interruption-recovery carries verbatim.
- evidence/artifacts/cloudflare-audit-skill-trial-20260927/: receipt at
  catalog_revision ba1700a; manifests/evidence.json re-registered.

Nothing was installed. The coordinator applies the settings template, the
Codex disable table and install_skills.py --only security-audit, in that order.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…box gate, adoption next_action_refs, recorded skill quotes

- catalogs/foundation/manifest.json: gate claude-code-sandbox-profile's
  next_action adds the deferral's credentials.files deny for the store (a
  sandbox.credentials.files entry with mode deny), a credentials arm (a
  sandboxed read of a store file fails through ~/ and through its absolute
  path, filesystem isolation on) and a separate
  sandbox.network.strictAllowlist arm; source_paths add docs/secret-storage.md
  and docs/harness-rules-convergence-20260922.md (PS-1).
- adoption/manifest.json: continuation.next_action_refs lists
  claude-code-sandbox-profile, as d17b3cf and 49c094d kept the foundation
  open gates and this list together.
- docs/decisions/2026-09-25-skills-trial-and-usage.md: the completeness
  sentence names what delta.json records; M5c adds the native
  claude plugin eval with-without candidate (non-Haiku --judge-model, resolved
  model from --json, the baseline arm must be shown to run); new M6 paragraph.
- evidence/artifacts/cloudflare-audit-skill-trial-20260927/: delta.json gains
  quoted_passages (SKILL.md L12, L21, L24, L40, L60, L82, L172, L175;
  report-schema.json verdict consts; repository quotes), the settings
  reference and sandboxing lines for sandbox.credentials and strictAllowlist,
  the plugin eval help lines, the fuller sandbox_gate measurements and
  checks.repair_round; README turns the install-order sentence into a
  conditional and records the repair-round checks.
- manifests/evidence.json: the five changed files re-registered.

Nothing was installed and no host setting changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Sep 28, 2026
Scout and others added 6 commits September 28, 2026 03:26
…rce stage-only invocation

Cross-family GPT-6 review of PR #448 (P2, changes-needed): the security-audit
addendum said the name-only skill cannot fire on an ordinary security question
and gets no user trigger, and the manifest gap said never by user invocation.
Reproduced: jq '.native_docs.skills.L811' on the receipt prints the name-only
row with Yes in the "In / menu" column, and the in-memory
skills_status.check_claude_listing probe returns state ok for name-only.

Corrected the claims, not the listing (name-only stays the user's choice):
- docs/decisions/2026-09-25-skills-trial-and-usage.md: the decision, the W011
  sentence and the name-only item now say name-only removes only the
  description from Claude's listing; Claude can still invoke the skill by name
  and a user can still type /security-audit, so stage-only use is a usage
  policy. New enforcement-residual item and overturn condition; name-only
  invocation reach joins the live-run-pending row.
- adoption/skills/manifest.json and the receipt's manifest_row: gap text to
  match.
- evidence/artifacts/cloudflare-audit-skill-trial-20260927/: the docs lines
  cited, checks.repair_round_2, the README round and reproduce lines.
- manifests/evidence.json: hash re-registration of the four files only.

Sources:
- https://code.claude.com/docs/en/skills.md fetched 2026-09-28T07:07:11Z,
  sha256 86137b6232cd54722549525729d1888717d5ee0eed6312a9a089097b2cadc181
  (same bytes as the first read): "Override skill visibility from settings"
  table L808-L813 and L817; "Control who invokes a skill" table L523/L527;
  frontmatter reference L360; "Restrict Claude's skill access" L766, L768.
- https://code.claude.com/docs/en/settings-reference.md, same fetch, sha256
  19fc12a219077c947744ba81977f1d3559d8b2ab36ac975de754aaef49e00117:
  skillOverrides L4163 and L4167-L4170.
- tools/adoption/install_skills.py classify_skill and process_skill (pinned
  SKILL.md sha256 check and rollback) for the residual: the frontmatter field
  user-invocable: false would need a new upstream pin and a native probe.

Checks: scripts/validate.py exit 1 before registration (SHA-256 and byte
mismatches on exactly the four files), exit 0 after; validate_foundation exit
0; nine test modules OK, test_install_claude_profile 58/58 with the cached
PyYAML; component_matrix and new_host_grand_list --write changed no tracked
file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The round-2 verifier found a new claim of the same kind: that the frontmatter field
user-invocable: false plus a probe would enforce stage-only use. The Claude Code skills
docs say otherwise (https://code.claude.com/docs/en/skills.md, sha256 86137b62...,
fetched 2026-09-28): L799 "With `user-invocable: false`, you can't invoke the skill, but
Claude still can", and L796 disable-model-invocation: true "removes the skill from
Claude's context entirely", which would also stop the session that drives the stages.

So the residual now covers only the user trigger, and stage-only use stays a usage
policy with or without either field. Changed: the decision addendum's Enforcement
residual item and its overturn condition, the README residual lines, the manifest gap
(mirrored in delta.json manifest_row.gap) and checks.repair_round_2.residual. Added:
docs lines L796 and L799 in native_docs.skills, and checks.repair_round_2_verification.
Re-registered the four files in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e protocol

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@seathatflowsinourveins
seathatflowsinourveins merged commit 8315274 into main Sep 28, 2026
25 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/integrity-wave-skills-catalog-20260927 branch September 28, 2026 09:07
seathatflowsinourveins added a commit that referenced this pull request Sep 28, 2026
…-28 (#457)

* Grand dashboard: integrity-wave gate rows (M2-M6) and checkpoint 2026-09-28

Adds five gate rows for accepted work merged on 2026-09-28 (#448-#452, #455):
the open sandbox-profile gate, the security-audit skill trial, the actionlint and
betterleaks successor trials, and the CodeQL quality-suite decision. Each row links
its own receipt or decision. Re-registers state.json in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Grand dashboard: correct the sandbox registration date and the betterleaks swap condition

Independent review: the open gate was registered 2026-09-27 (catalogs/foundation/manifest.json:254),
and the betterleaks swap waits on parity after triage (run-record.json plan_move), not triage alone.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 28, 2026
… take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 28, 2026
… take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 28, 2026
… take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 28, 2026
… take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins pushed a commit that referenced this pull request Sep 28, 2026
… take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Sep 28, 2026
…l manifest (#429)

* Runtime-worker skills program: project-scoped installs and a 138-skill pinned manifest

GPT-6 (astra, max) build. install_skills.py gains --project-dir and --agent
targets with the default global behaviour unchanged, project lock identity and
pinned source-tree checks, and scoped rollback. The runtime-worker manifest pins
138 skills (77 OpenHands extensions v0.25.0, all 15 superpowers lifecycle
skills, 28 existing adoption entries by reference) with a report-only freshness
checker and scheduled workflow. Not installed into any worker yet; invocation
and pruning are measured after install.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills: repair round for the independent Claude review

GPT-6 (astra, max) repair of all seven findings; the blocker (#407's scoped
global rollback) was already resolved at the rebase and is kept byte for
byte. Project rollback now removes exactly the add targets and checks the
canonical folder, project lock entry and Claude link independently,
reporting a retained copy as an error instead of widening the deletion
(skills@7407f389 src/remove.ts:209-333). A project .claude/skills/<name>
that is not a symlink to the canonical folder is local-modified unless
--force (installer.ts:254-264). Every selected source/ref is fetched before
any add; an unavailable gh is reported as unverified, not as a mismatch.
The pruning rule records Claude Code's skill-listing budget and treats
dropped descriptions as unknown. 52 tests pass; five fail-first runs are
recorded in validation.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* CI fix: cover the skills freshness workflow and classify the repair values

Found and fixed through the upstream gh-fix-ci skill (openai/skills@49f948fa)
on the GPT-6 lane, then reviewed by the coordinator:
- tests/test_workflow_security_coverage.py lists
  runtime-worker-skills-freshness.yml; the workflow itself already passes the
  hardening, pinning, permissions and zizmor checks.
- blind_checkout: the review disposition "fixed" joins the closed-vocabulary
  labels (as in #416), and the superseded rollback assertion's disposition is
  data.
- harness-defaults anti-pattern row: run acceptance with TMPDIR outside every
  repository.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test_install_skills: compare resolved paths on both sides for macOS temp dirs

On macOS the temporary directory sits under /var, a symlink to /private/var,
so local.resolve() returned the /private/var form while the expected path kept
the /var form. validate-macos failed 8 subtests of the two new project-install
tests (run 36349458060). Resolve the expected path too, as
tests/adaptive_paper_hermetic.py already does with os.path.realpath.

Reproduced on Linux with TMPDIR set to a symlinked directory: 8 failures
before, OK after; the module passes 38 tests with a plain or symlinked TMPDIR.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills repair r2: exclude main's gated security-audit, take reused gates from main

Coordinator direction on the #429 blocker (option b): runtime workers must
not bypass a gate set on main.

- Contract: every skill in adoption/skills/manifest.json is either reused
  by reuse_ref (pins equal to main's, gates not restated) or listed in
  `excluded` with an adoption_ref, a reason and an overturn condition.
  security-audit (#448, 8315274: Codex off, name-only pending the M5c
  bake-off against /security-review) is excluded, and a test fails as soon
  as main's gate on it changes. A synthetic future main skill in neither
  set fails the contract (negative control).
- Gates: install_skills.py resolves each reuse_ref when it reads a
  manifest, refuses an entry whose pin drifted or that restates
  codex_enabled/claude_listing, and takes both gates from main.
  --print-codex-config on the runtime manifest now disables the 16 reused
  skills main keeps off for Codex; before, it printed none. The README
  states that claude_listing is a Claude Code skillOverrides setting that
  the OpenHands SDK does not read (OpenHands/software-agent-sdk@fcc102a6
  skill.py:1123-1130, 182-185, 278-284, 528-538; same blob at da28c773).
- --only naming a pruned project skill fails as pruned, not unknown.
- The README documents that --check-only needs the pinned skills binary,
  and gh sign-in and network in project mode.
- Counts: 138 selected skills from 12 sources (unchanged); 28 of main's 29
  adoption skills reused; 8 exclusions (7 OpenHands, 1 adoption).
- validation.json records the round (fail-first: 9 tests, failures=7,
  errors=2; after the fix: 9 OK) and refreshes every input hash; the
  anti-pattern log gains the dropped-gates row; the 8 changed files are
  re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills: narrow the OpenHands loader claim and the security-audit overturn (R2-6)

The README said OpenHands withholds a skill from the model only through
SKILL.md disable-model-invocation, and research.md said the SDK reads only
SKILL.md frontmatter. load_user_skills also loads OpenHands' own enabled
installed skills (skill.py:936-973 at fcc102a6). Both now say the loader
reads skill directories, SKILL.md frontmatter and its installed-skill enable
state, never Claude Code settings or a skillOverrides key. The
available_skills citation moves from lines 182-185 to 183-186.

The security-audit overturn now names a promotion as codex_enabled true or
claude_listing on; any other change to main's gate still fails the
exclusion test and needs a new review. The test message says so.

validation.json records R2-6, the corrected sources, the red excerpt in log
order, refreshed input hashes and the rerun checks; the five changed files
are re-registered in manifests/evidence.json.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills records: note the rebase onto main 8d8f79c

research.md and validation.json record the second rebase, onto 8d8f79c
(#460), the merged docs/harness-defaults.md input hash and the checks rerun
on that tree. The manifests/evidence.json re-registration that was part of
this commit was dropped when the branch was rebased onto c1581fa, and is
redone at the tip.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills repair r3: containment and pin checks before add, project scope, name-keyed reuse

Two independent reviews of 8efdc35, a GPT-6 cross-family review
(codex_call.sh, gpt-6-astra max) and a headless Claude session review,
returned changes-needed with no blocker or high finding. Each code item
failed first against the unchanged code:

- GPT6-C1: refuse a project whose .agents/skills, .claude/skills or
  skills-lock.json passes through a symlink, whose selected skill paths
  resolve outside it, or that is --home, before any skills or gh call.
- CL-D1: compare every selected pinned tree with its tree_sha in the
  preflight and refuse before any add; the native in-use guard keeps a
  rolled-back copy while a detected agent such as Codex reads it.
- CL-D3: the runtime manifest carries "scope": "project" and is refused
  without --project-dir; pruned entries are never installed in either mode.
- CL-D6: reuse_ref and adoption_ref name the adoption manifest and match
  by skill name.
- CL-D7: runtime_skill_freshness.py reads the CLI version and ref from
  the manifest's cli pin.
- GPT6-C5: offline zizmor analysis of the freshness workflow, with
  floating-tag, persist-credentials and permissions controls.

Docs: the rendered OpenHands skill list omits <location>; disabled_skills
and the loading flags are its controls; third-party instruction files load
from the work directory and Git root, so the example worker projects move
outside the checkout; rollback retention is certain when Codex is detected;
skills-review-r1.json is labelled unpublished.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Runtime-worker skills repair r4: exclude verification-before-completion with main (M4, #464)

Main c0966da (#464) moved verification-before-completion from the
adoption skills to its excluded list under the skills-trial conflict
rule M4. On the rebased tree the unchanged coverage contract and
installer refused the runtime manifest's reuse_ref for it (67 tests,
6 failures, 2 errors).

- Exclude the skill in the runtime manifest with its reviewed pin, the
  M4 and AGENTS.md:16 reason, and the overturn "main re-admits it"; it
  carries no adoption_ref because main no longer lists it in skills.
- New test_verification_before_completion_stays_excluded_until_main_readmits_it
  and the revised superpowers lifecycle test failed first; a source-count
  test ties sources and the research table to the selected skills.
- Recount: 137 skills from 12 sources (superpowers 14), 27 reused
  (16 Codex-disabled on main), 9 exclusions, 15 empty cells (new
  github-ci-fix/extraction-caller gap), 1,020,955 bytes and 36,739
  description characters.
- validation.json: repair_r3.not_relayed becomes the five confirmed
  CONFIRM ids; repair_r4 records the rebase, sources, fail-first and checks.
- State Codex detection precisely ($CODEX_HOME, ~/.codex when unset, or
  /etc/codex) in research.md, the harness-defaults row and a code comment.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Rebase onto main c0966da: re-register the PR's files in manifests/evidence.json

Main's evidence.json with the 13 PR files registered at their current
sha256 and byte size (8 added, 5 updated); no other entry changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Scout <scout@local>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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