Skip to content

W6 governance: preserve survivors and resolve layers before research - #1008

Merged
seathatflowsinourveins merged 5 commits into
mainfrom
codex/ns2604-w6-resolution-protocol-20261011
Oct 11, 2026
Merged

seathatflowsinourveins merged 5 commits into
mainfrom
codex/ns2604-w6-resolution-protocol-20261011

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

Scope

Before research dispatch, the W6 protocol consumes retained verdicts, completed sweeps and cumulative unresolved survivors, then dispatches only the delta. This PR adds the bounded AGENTS pointer and retained decision record. Terminal states are FINAL, SCHEDULED and RETIRED; SCHEDULED starts on named readiness inputs, with no run date. FINAL requires all four conditions for each winner.

The final adjudication replaces per-sentence Terminal pins with one exact native unittest equality assertion on the entire whitespace-normalized Terminal section. A separate regex rejects scheduling dates and synonyms. Selected Decision phrases retain their narrower checks; their widening coverage has not been measured.

  • Base commit: 1d1164e8c34df8250973a5c632e9747a1ef79533.
  • Lane: lane:foundation.
  • PR paths: AGENTS.md, docs/decisions/2026-10-11-layer-resolution-protocol.md, tests/test_resolution_protocol_docs.py and their existing registrations in manifests/evidence.json.
  • Last adjudication commit: b08c1e5367ee488306393271d782d4b223c9d105, one forward commit on 86b0244907c309cd0f2964c13631c4fd24c32047, without a rebase.

SOTA sources

  • Governance: retained CC-approved W6 plan snapshot, W6. The final resolution wave, SHA256 fb4a95b19a00335c5831bce913cbf177f90d5bd2c17819013b6021d2dc585e5c; terminal ruling at 06:12Z, SHA256 42e3e24ec9ee2e06288b6f6cba407b741e585ca93cef5e738f3f93535258c8de.
  • Readiness: CC ruling ruling-no-schedules-proceed-when-ready-20261011.md, heading time 17:31Z, SHA256 dd05310efdb514b2886bb55a292176352f51f7d161345d8335e33d6285d191f2.
  • Final correction: pr1008-claude-micro-86b02449.md, SHA256 6dac5c67f821ee17837c9afa5f7ee31f529b31305f3d69a07a98d0466cea761e, plus the CC's 18:06Z adjudication. The complete read and its exact mutation corpus are retained.
  • Upstream test mechanism: python/cpython v3.13.16, mirror commit cbc944f4bc59639a444dd971c737788ba2283a91, Lib/unittest/case.py:902-907 (assertEqual) and :1371 (assertNotRegex). The retained case.py bytes match the pinned local mirror. No Markdown parser or new test framework is introduced.
  • Native pipeline: validate.yml and validate_shards.py discovery at original base 8bffa2c41692ef483e91b68e3b15aeb331423d2c.

Evidence-class table

Claim Evidence class Command / retained receipt
The full Terminal section is pinned exactly after whitespace normalization local_integration Five native doc tests pass; one exact equality assertion covers the complete section. This is text consistency, not runtime enforcement
The retained CC census reproduces the old blind spots and rejects the specified mutations after correction synthetic Exact CC mutants_v2.py SHA256 de05a3a04b41c41fac339e237b32a1363ef7eba0ce7dde091d74182947137867: held head permits 26/58; corrected guard on held text rejects 58/58; final wording rejects 58/58. Valid text and whitespace reflow pass. No skipped or unexpected controls
Publication integrity passes local_integration FULL validator, evidence registry, diff check and PR-range gitleaks receipts retained

The final corpus copy changes only three condition-2 matching targets from the held wording to the mandated "Each winner has" wording; mutant replacements and the rest of the CC corpus are unchanged. The 57 in-section mutants are checked by the exact section pin; RT10, outside the section, is checked by the date-synonym regex. These results apply to this named census, not every possible documentation mutation.

Local commands run

python3 -E -s -B -m unittest tests.test_resolution_protocol_docs
Exit 0; Ran 5 tests; OK.

python3 -I cc-mutants-v2.py <held-tree> <owned-work-dir>
Exit 0; baseline reproduces 26/58 surviving mutants; controls behave as expected.

python3 -I cc-mutants-v2.py <owned-worktree-with-new-guard> <owned-work-dir>
Exit 0; all 58 mutations fail their native unittest subprocess; valid text and reflow pass.

python3 -I cc-mutants-final-wording.py <owned-worktree> <owned-work-dir>
Exit 0; all 58 mutations fail; zero skips; valid text and reflow pass.

nice -n 10 ionice -c2 -n7 python3 scripts/validate.py
Exit 0; 70 components, 11479 hashed files, 4 profiles, 239 receipts.

python3 scripts/evidence_manifest.py --check
Exit 0; 11479 files.

git diff --check
Exit 0.

gitleaks git --redact=100 --no-banner --log-opts=1d1164e8c34df8250973a5c632e9747a1ef79533..HEAD
Exit 0; 5 PR-range commits; no leaks.

Before the intentional text amendments, the final equality expectation against the held record also fails with one assertion failure; after the wording changes, the five doc tests pass. The record now describes precisely which text is protected. Condition 2 explicitly says each winner has a run pin; readiness defects are not a reason to re-research; the ruling heading time is 17:31Z.

Decision record

docs/decisions/2026-10-11-layer-resolution-protocol.md. No production function, model/research run, adoption E2E, invoke measurement or terminal-layer classification is performed. FINAL machine enforcement remains a separate follow-up. The AGENTS pointer and startup budgets are unchanged by this final adjudication.

Read attachments: existing landscape-live-foundation.w6-sources-20261011/ plus ~/.local/state/native-agent-stack/coordination/ns2604-coop/lanes/landscape-live-foundation.w6-adjudication-20261011/ and its MANIFEST.sha256. Exact held/final sources, the CC read and corpus, baseline/red/green logs and publication captures are retained. Earlier sentence-pinning receipts are historical and do not support broader protection claims at this head.

Host evidence

No host receipts are added or changed.

Follow-ups

  • P3-1 / Astra P3-1 — Run-pin receipt join: current host_e2e binds the verdict pin. Before FINAL, the enforcement follow-up must join each winner's upstream E2E receipt to its run pin; a receipt for a differing verdict pin is insufficient.
  • Decision section phrase pins / Astra P3-2 — widening coverage has not been measured. Assess it separately; this PR's exact equality protection is scoped to the Terminal section.
  • Reopening guidance / Astra P3-3 — per CC disposition of Codex thread 4242689183, update the pre-W6 docs/landscape-continuation.md:97-99 so its reopening guidance defers to W6 governance: preserve survivors and resolve layers before research #1008's protocol. This is a FOLLOW-UP, not P1, and does not reopen the final adjudication.
  • Date-vocabulary coverage — broaden the enumerated regex in a follow-up: outside the exact Terminal pin, due-date, fixed date, date target, scheduled for <date> and calendar date can still pass. The measured 58-case census remains the scope of the current protection claim.
  • Ruling-time pin — the 17:31Z heading time is present but unpinned; add the authority citation pin in a follow-up.
  • Check-list underclaim — record lines 132-133 omit the fifth doc test, which covers the authority/hash/harness references and negative attribution checks; name that existing check in a follow-up.
  • Astra P3-4 — Read-packet source delivery: the confirmation packet did not carry the cited attachments. Ensure the retained, hashed source attachments travel with future reads; the missing delivery is a follow-up, not a blocker under the CC's disposition.
  • Astra P3-5 — Pre-existing machine-name labels: handle them as a separate metadata/privacy follow-up. Record counts only; do not reproduce the labels in public text.

Checklist

  • No Actions or permissions changes.
  • No credential or new required secret is introduced or published.
  • No hosting, subscription or billing change.
  • Peer-owned files and worktrees preserved.

The CC's last-commit adjudication governed this head. Claude returned PASS_WITH_P3 and Astra returned ACK over a0641a04..b08c1e5367ee488306393271d782d4b223c9d105, with the follow-ups recorded above. GitHub reports #1008 merged at 2026-10-11T21:34:23Z; #1007 follows this landing. The withdrawn 86b0244 GPT micro is not treated as an ACK. Only a reproduced P1 reopens this final adjudication after this commit.

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

Copy link
Copy Markdown
Owner 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-11T18:25:23.367567Z b08c1e5 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: 95b2770778

ℹ️ 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 docs/decisions/2026-10-11-layer-resolution-protocol.md
@seathatflowsinourveins
seathatflowsinourveins force-pushed the codex/ns2604-w6-resolution-protocol-20261011 branch from 95b2770 to bac4e6a Compare October 11, 2026 09:47
@seathatflowsinourveins seathatflowsinourveins changed the title W6 governance: resolve layers before future research sessions W6 governance: preserve survivors and resolve layers before research Oct 11, 2026
@seathatflowsinourveins

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: bac4e6a0f1

ℹ️ 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".

@seathatflowsinourveins

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

Reviewed commit: a0641a04cc

ℹ️ 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".

@seathatflowsinourveins
seathatflowsinourveins marked this pull request as ready for review October 11, 2026 17:45
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins

Copy link
Copy Markdown
Owner 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: b08c1e5367

ℹ️ 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 docs/decisions/2026-10-11-layer-resolution-protocol.md
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins
seathatflowsinourveins merged commit 569bbc5 into main Oct 11, 2026
37 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the codex/ns2604-w6-resolution-protocol-20261011 branch October 11, 2026 21:34
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 11, 2026
…R rows, keep unmeasured skill defects unknown

The final commit of #1012's last wave. It folds Astra's first read of
a737ef9 (CHANGES_REQUESTED: one P1 and two P2s) into the wording commit
the final Claude delta asked for.

- P1: the shared email mask now takes the whole local part RFC 5322
  section 3.4.1 allows: a quoted string such as "reviewer"@example.org,
  whose quotes may be percent- or entity-encoded, or a run of atext from
  its first letter or digit, including ! ' { } = ? and &. The slash is
  left out, so a URL path such as /@handle is not read as an address.
  CPython's address parser accepts both forms (Lib/email/_parseaddr.py
  getaddrspec, lines 365-379, and getquote, line 463, at the v3.13.16
  mirror cbc944f4).
  - The mask reads the whole text with each token decoded, so a local part
    split across tokens by a quote, space or apostrophe is found whole.
  - It masks exactly where decoding changed nothing, and omits whole any
    decoded token the address touches.
  - It is anchored at the at sign, and a backslash in a quoted local part
    always opens a quoted pair, so its cost is linear. text() on a
    16,000-character run takes 0.003 s, where a737ef9 took 2.5 s under
    load. This also resolves the 50977b0 micro's (a)5.
  - A full live build takes 43.2 s, against 41.3 s at a737ef9 from the
    same state. On 283,448 unique strings from the live inputs, catalogs,
    manifests and repository Markdown, its output equals a737ef9's.
  - The pages and token-tools-now.json share the mask. The systemd unit
    exemptions and the public-string controls are unchanged.
- P2: an in_review row that is not an object is rejected with a stated
  gap naming the count. PR waves reads partial, "No pull requests in
  review." is kept for a valid empty list, and the count strip counts the
  accepted rows only.
- P2: the number of pinned skills with no 7-day call counts only the
  skills with a measured 7-day column. With none measured it is null in
  the receipt and UNKNOWN in the summary and strip. With some measured,
  the strip reads "N of M measured", and the receipt adds measured_skills
  and pinned_skills.
- From the final Claude delta: the sanitizer docstring and the README say
  a dotted template-unit instance still masks
  (openvpn-client@site.conf.service becomes "[email omitted].service"),
  and a test pins it.
- #1008 merged at 2026-10-11T21:34:23Z (569bbc5) without final-stack.json,
  so the page's pending label, from one constant, the README and the two
  pinning assertions read "pending #1007 (#1008 landed 2026-10-11
  21:34:23Z)".

The regressions use Astra's probe inputs. They check the decoded page,
receipt and token report for unique planted local-part and domain text,
so they need no address grammar of their own. The 9 new or changed tests
fail at a737ef9 (119 failures, counting subtests), and Astra's own three
probes fail there and pass here. A guard test runs JSON-escaped shell text
before an at sign in a child process with a timeout. It fails on the first
draft of the quoted-local pattern, whose backslash had two parses (one live
build spent 90 s there), and passes here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 12, 2026
…tration landscape on the command-center page

The owner asked for the whole ecosystem on one page, so the command center
grows from six sections to nine, still from existing producers only:

- Orchestration: the CC's recorded orchestration-frameworks resolution and
  the same slot in cc-native-practice slots-final.json, the landing queue,
  the co-op's GPT read queue (read-queue-now.json) and the Adoption
  snapshot's orchestration tool calls by role.
- Resolution landscape: each matrix winner's component, pin, evidence class,
  lifecycle stages and platforms, with the W6 final columns (verdict, run
  pin, upstream E2E at the pin, invoke evidence) as recorded or "not
  recorded". Each winner's repository is matched to cc-now.json
  mirrors.pins by the version its tag names or a commit prefix, and a
  winner without a mirror says so. Terminal states come only from
  final-stack.json and read "pending #1008/#1007" until it exists. The
  committed north-star readiness layers follow with the same columns; the
  CC's program, mirrors, rulings and ten-layer plan render as given.
- SOTA skill invoke rates: one row per skill pinned in
  adoption/skills/manifest.json (source@ref, linked only for https, and
  path), joined with the 7-day counts per client from skill_usage.py and
  child-usage.mjs, or from #970's skill-invoke-rate-daily/1 projection when
  it is current. Zero calls flag "wiring defect"; a pinned skill with no
  install record is "not installed" (unknown while /skill-doctor is
  unmeasured); a called skill the manifest does not pin is "unpinned". The
  practice-slot table marks the orchestration-frameworks row. An unmeasured
  value never reads as zero.
- Tokens saved: tools/local-pages/token_tools_now.py runs each token tool's
  own report command (rtk gain, headroom agent-savings and output-savings,
  context-mode doctor) and records its exit code, run time, version and
  own estimate in token-tools-now.json. The page shows each beside its
  command, labels the token-window counters as client counters, and never
  sums across tools, evidence classes or windows.
- Research queue: research-queue.tsv rows and research-state.json's resume
  order.

The #1012 Claude read's fixes are folded in. B1: the email mask moves into
the shared sanitizer and matches after its per-token decoding (CPython
html.unescape and urllib.parse.unquote, cited at v3.13.16), so &commat;, an
encoded dot (%2E or &#46;), %2540 and a semicolon-less &#64 are omitted on
every page; the old page-local mask left all five readable. B2: each
section's label follows what it renders, and every partial section names
its reason. B3: each section and the count strip render in their own guard,
so a scalar codex_top_lanes_M or an integer above 1e308 degrades only its
own section. The receipt lists only the not-wired inputs the page rendered.

source_policy.json gains a command_center role map with sixteen exact repo
and state paths, read through CommandCenterReads, which extends the
Architecture reader (bounded, no-follow, protected names, no user root).
Reports past their limit read "stale" with their age; times recorded as a
time of day stay as recorded.

tools/skill-usage/render_units.py renders reviewed user units that keep the
three skill reports current: hourly, the host report (91 s measured,
including the $0 zero-turn claude -p /skill-doctor, with --claude-timeout
120 because the 30 s default expired once under load) and the Claude lanes
sweep (198 s and a 1.9 GB peak, projected from 181 MB to 26 KB by
systemd/claude-lanes.jq); daily, the Codex lanes report, which had not
finished after 25 minutes, so its completion time is unmeasured. Each step
renames a finished report into place.

The evidence manifest records the new hashes of source_policy.json and the
skill-usage README. Tests cover each section, unknown versus zero,
staleness, hostile types and strings, privacy (eight email forms, decoded
twice) and the exact grants; 33 fail-before mutations of this change each
fail them. The unit tests round-trip each ExecStart through systemd quoting
and pass systemd-analyze verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 12, 2026
…R rows, keep unmeasured skill defects unknown

The final commit of #1012's last wave. It folds Astra's first read of
a737ef9 (CHANGES_REQUESTED: one P1 and two P2s) into the wording commit
the final Claude delta asked for.

- P1: the shared email mask now takes the whole local part RFC 5322
  section 3.4.1 allows: a quoted string such as "reviewer"@example.org,
  whose quotes may be percent- or entity-encoded, or a run of atext from
  its first letter or digit, including ! ' { } = ? and &. The slash is
  left out, so a URL path such as /@handle is not read as an address.
  CPython's address parser accepts both forms (Lib/email/_parseaddr.py
  getaddrspec, lines 365-379, and getquote, line 463, at the v3.13.16
  mirror cbc944f4).
  - The mask reads the whole text with each token decoded, so a local part
    split across tokens by a quote, space or apostrophe is found whole.
  - It masks exactly where decoding changed nothing, and omits whole any
    decoded token the address touches.
  - It is anchored at the at sign, and a backslash in a quoted local part
    always opens a quoted pair, so its cost is linear. text() on a
    16,000-character run takes 0.003 s, where a737ef9 took 2.5 s under
    load. This also resolves the 50977b0 micro's (a)5.
  - A full live build takes 43.2 s, against 41.3 s at a737ef9 from the
    same state. On 283,448 unique strings from the live inputs, catalogs,
    manifests and repository Markdown, its output equals a737ef9's.
  - The pages and token-tools-now.json share the mask. The systemd unit
    exemptions and the public-string controls are unchanged.
- P2: an in_review row that is not an object is rejected with a stated
  gap naming the count. PR waves reads partial, "No pull requests in
  review." is kept for a valid empty list, and the count strip counts the
  accepted rows only.
- P2: the number of pinned skills with no 7-day call counts only the
  skills with a measured 7-day column. With none measured it is null in
  the receipt and UNKNOWN in the summary and strip. With some measured,
  the strip reads "N of M measured", and the receipt adds measured_skills
  and pinned_skills.
- From the final Claude delta: the sanitizer docstring and the README say
  a dotted template-unit instance still masks
  (openvpn-client@site.conf.service becomes "[email omitted].service"),
  and a test pins it.
- #1008 merged at 2026-10-11T21:34:23Z (569bbc5) without final-stack.json,
  so the page's pending label, from one constant, the README and the two
  pinning assertions read "pending #1007 (#1008 landed 2026-10-11
  21:34:23Z)".

The regressions use Astra's probe inputs. They check the decoded page,
receipt and token report for unique planted local-part and domain text,
so they need no address grammar of their own. The 9 new or changed tests
fail at a737ef9 (119 failures, counting subtests), and Astra's own three
probes fail there and pass here. A guard test runs JSON-escaped shell text
before an at sign in a child process with a timeout. It fails on the first
draft of the quoted-local pattern, whose backslash had two parses (one live
build spent 90 s there), and passes here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 12, 2026
… to the native profile

Fixes the two upheld Codex threads on #997 at 03fc660 (4245318057, 4245318059). The third,
4245318064 (P1, layer-resolution record), is not accepted: the layer-resolution protocol (#1008)
governs layer adoption and verdict decisions, and this change adds no layer verdict. It corrects a
host-state claim under AGENTS.md "Corrections", which the pinned sources already cited (ai-memory
v2.6.3 = 385b81ea, Codex rust-v0.162.1 = 092d3acd) and the fail-before tests below satisfy.

1. The installer lead (4245318057). The retained 2026-09-21 record,
   evidence/artifacts/memory-landscape-20260921/native-commands.json:295-393 at 03fc660, shows the
   three installers run with --capture-assistant, exit 0 each, so the lead was true but undated; what
   it contradicted was correction #149's undated "The earlier hook applications ran without the
   flag". The lead now opens "At the 2026-09-21 qualification", cites that record and says it is not
   the hook state now. Correction #149 says the qualification's installers carried the flag, so the
   flag was lost before the 2026-10-11 measurement (the loss path is host history not reconstructed
   here), and names the two later flagless applications, the #144 repair and the 2.6.3 re-stage of
   2026-10-10. "Not in force" is dated 2026-10-11.
2. The second Codex profile (4245318059). hook-trust.json at 03fc660 lists seven hook commands for
   the native profile (:35-77) and seven for the Desktop profile (:279-321), 14 in all, so the CC's
   0 of 7 is one profile's. Correction #149 and the qualification prose after it now bound the count
   and the Codex conclusions (trust pending, capture off) to the native profile and say the Desktop
   profile was not measured.

tests/test_memory_landscape_capture_doc.py has 16 tests (10 kept, 6 new). On the 03fc660 doc text
the module gives 11 OK and 5 failures, 0 errors; on this text 16 OK. The new tests read the
artifacts: the line ranges the doc cites, the flag and exit code of the three installer records, and
seven commands per profile. manifests/evidence.json: hashes of the doc and the test re-registered
only.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 12, 2026
…rrection #149) (#997)

docs: ai-memory --capture-assistant was not in force on this host (correction #149)

* docs: ai-memory --capture-assistant was not in force on this host (correction #149)

The maintenance doc said the allowlist installers carried --capture-assistant. 0 of 9 Claude and
0 of 7 Codex hook commands did: ai-memory bakes the flag only into the Stop command and only
preserves an opt-in already present (install_hooks.rs:689-701, 1104-1109 @ 89bd8ded;
render_shared.rs:1425-1427), so applications without the flag never added it. Claude was
re-staged with it on 2026-10-11; Codex waits for a trust refresh (trusted_hash changes).

Also: the HookArgs v2.6.3 range in the doc-contract test becomes :2961-2970, test 1 checks every
--check-capture block, a new test fails on the previous text, and the read kit's "repositories
commit the marker" comment is listed as a host note against .gitignore:73.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* test: name the missing correction heading instead of raising ValueError

section_from() used str.index, so a document lacking the #149 heading (the 16f0a1f text) gave
3 test errors instead of contract failures. It now raises AssertionError naming the heading, and the
first #149 test no longer asserts on the whole document before extracting the section: the module
gives 6 OK on the head text and 4 assertion failures, 0 errors, on the 16f0a1f text.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* docs: reconcile correction #149 with the dated qualification prose and pin it to the installed releases

Fixes the four Codex review threads on #997 (each verified valid at 805aca0):

1. Contradiction. The two paragraphs after the correction said, in the present tense, that both
   clients' assistant Stop excerpts are opted in and that Codex trust ended in a captured outcome.
   They now open "At the 2026-09-21 qualification" (git blame 54896e7 and every artifact under
   evidence/artifacts/memory-landscape-20260921 carry that date) and point at correction #149. A
   new test reads that prose, which correction_149_section stops before.
2. Unverified host state. The 0 of 9 and 0 of 7 counts, the earlier hook applications, the Claude
   re-stage and the pending Codex trust are labelled CC host measurements, cited to correction #149
   in command-center/lessons-20261005/cc-corrections-20261005.md and "not re-read by this change".
3. Pin. The host runs ai-memory 2.6.3 (385b81ea). install_hooks.rs:689-701, :1104-1109 and :1142
   and render_shared.rs:1425-1427 are byte-identical at the same lines in v2.6.3 and v2.6.0
   (89bd8ded), so both pins are cited and the test requires the v2.6.3 pin beside each cite.
4. Trust hash. Re-rendering changes the computed current hash; the stored trusted_hash is
   unchanged, the mismatch marks the hook modified, and the /hooks review writes the reviewed hash
   into trusted_hash (docs/decisions/2026-10-04-codex-rtk-hook-qualified.md Decision 1 at
   rust-v0.159.3; re-read at rust-v0.162.1 = 092d3acd, the installed codex-cli: discovery.rs:796-813
   and :715-721, hooks_rpc.rs:58-92). The test rejects "re-rendering changes ... trusted_hash".

tests/test_memory_landscape_capture_doc.py now has 10 tests: on the 805aca0 doc text the module
gives 6 OK and 4 assertion failures, 0 errors (one per thread); on this text 10 OK.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* docs: cite correction #149's ledger by its true locator, coordination/lessons-20261005/...

The #149 correction named the CC's ledger as command-center/lessons-20261005/cc-corrections-20261005.md, the
form the brief prescribed. The CC recorded that as its correction #180: the ledger sits at
coordination/lessons-20261005/cc-corrections-20261005.md (state-root relative), a sibling of command-center/,
not under it. The doc keeps "(host state, not in this repository)"; the test now pins the true locator and
rejects the old form. Found by looking up the file name under the host state root; the CC confirmed it in #180.

Fail-before: with the new pin the module gives 9 OK and 1 assertion failure, 0 errors, on the 8b8c8f5 doc
text; 10 OK after. validate.py and evidence_manifest.py --check pass.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* docs: date the installer lead and bound correction #149's Codex count to the native profile

Fixes the two upheld Codex threads on #997 at 03fc660 (4245318057, 4245318059). The third,
4245318064 (P1, layer-resolution record), is not accepted: the layer-resolution protocol (#1008)
governs layer adoption and verdict decisions, and this change adds no layer verdict. It corrects a
host-state claim under AGENTS.md "Corrections", which the pinned sources already cited (ai-memory
v2.6.3 = 385b81ea, Codex rust-v0.162.1 = 092d3acd) and the fail-before tests below satisfy.

1. The installer lead (4245318057). The retained 2026-09-21 record,
   evidence/artifacts/memory-landscape-20260921/native-commands.json:295-393 at 03fc660, shows the
   three installers run with --capture-assistant, exit 0 each, so the lead was true but undated; what
   it contradicted was correction #149's undated "The earlier hook applications ran without the
   flag". The lead now opens "At the 2026-09-21 qualification", cites that record and says it is not
   the hook state now. Correction #149 says the qualification's installers carried the flag, so the
   flag was lost before the 2026-10-11 measurement (the loss path is host history not reconstructed
   here), and names the two later flagless applications, the #144 repair and the 2.6.3 re-stage of
   2026-10-10. "Not in force" is dated 2026-10-11.
2. The second Codex profile (4245318059). hook-trust.json at 03fc660 lists seven hook commands for
   the native profile (:35-77) and seven for the Desktop profile (:279-321), 14 in all, so the CC's
   0 of 7 is one profile's. Correction #149 and the qualification prose after it now bound the count
   and the Codex conclusions (trust pending, capture off) to the native profile and say the Desktop
   profile was not measured.

tests/test_memory_landscape_capture_doc.py has 16 tests (10 kept, 6 new). On the 03fc660 doc text
the module gives 11 OK and 5 failures, 0 errors; on this text 16 OK. The new tests read the
artifacts: the line ranges the doc cites, the flag and exit code of the three installer records, and
seven commands per profile. manifests/evidence.json: hashes of the doc and the test re-registered
only.

Co-Authored-By: Claude Sonnet 5.5 <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