Skip to content

039: realize amend-factory-mcp-conformance-auth-profile tasks § 2 (hosted authorization block, offline checks, contract-v4.1) - #1289

Merged
brettheap merged 16 commits into
mainfrom
039-factory-mcp-auth-profile
Oct 11, 2026
Merged

brettheap merged 16 commits into
mainfrom
039-factory-mcp-auth-profile

Conversation

@brettheap

@brettheap brettheap commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Lane: openxfactory-5 (openXfactory-5)

DRAFT: realization of amend-factory-mcp-conformance-auth-profile, tasks § 2 (Speckit feature 039)

This pull request realizes the ratified change's tasks § 2 as Speckit feature
specs/039-factory-mcp-auth-profile.
It covers the hosted authorization block on a deployed factory MCP service and
the validator's offline checks of it. It also carries the narrowed Unavailable
dependency
reading (M5), the per-domain error vocabularies and the contract
cut contract-v4.1.

The realization word is given (task 3.2). Brett Heap, 2026-10-10
(23:2xZ), chose the option labelled "Land when green, waive Codex
(Recommended)"
. That option merges main into the branch, re-cuts
forward-only if main moved the release files, and lands by merge commit once
the pull request is green with Copilot clean at the final head. Codex is
waived. The lane's coordinator lands the pull request and publishes the
contract-v4.1 tag after the merge. This pull request edits no file under
openspec/changes/. Ticking the packet's task boxes and archiving the change
are landing bookkeeping, done after the landing.

Authority, verbatim

Traceability

Change task What Commit
2.1 Speckit feature: spec, clarify (no question: the packet decides every one), plan, research R-1 to R-17, data model, interface, quickstart, 8 checklists at maximum coverage, tasks, analyze (1 CRITICAL, 3 MEDIUM fixed), and one README Documentation-index bullet a8e91bf8
2.2 Tests only, red first, including the two existing tests the ratified Compatibility section reverses bd76faf4
2.2 Red-first and M5-mutant runs recorded (verification.md §§ 3-4) 5ffbd7b2
2.3 Schema: the closed auth block on the deployed branch, and the auth concern; the synthetic deployed example bcdf2235
2.4 Validator: hosted_auth_missing, invalid_issuer, auth_rs256_missing, auth_algorithm_forbidden, auth_algorithm_unadmitted, auth_audience_unbound, auth_metadata_path_mismatch, auth_resource_query, unsupported_auth 3245c0c3
2.5 Runbook docs/factory-mcp-conformance.md 3335da43
2.1-2.5 Implementation record (verification.md § 5), T002-T024 ticked 31d5c50a
2.6 The contract-v4.1 cut, one commit: manifest row with the schema's sha256, contract_bundle_version, CHANGELOG.md entry, contracts/releases/contract-v4.1.digests.yaml, schema title, runbook release paragraph, two index rows, release-boundary advance 38c78817
Merge of main at 9a272c6d (#1284), never a rebase 24699ca5
2.6 Forward-only re-cut after #1284 moved two inventory members: inventory rebuilt by the tool, changelog re-attributed by inventory diff; same number 6300772b
2.7 Verification record §§ 6-10; T025-T027 ticked cc9e1441
Landing round: merge of main at 841e86f0 (#1290, #1287, #1288), never a rebase. No release file moved, so no re-cut 07623c7a
Landing round: merge of main at 33d2a56a (#1294), never a rebase. No release file moved, so no re-cut cb9b27f3
2.7 Verification record § 11, the landing round (answers Copilot's thread at cb9b27f3) 76944137
Landing round: merge of main at 978e9cbc (#1295, #1296), never a rebase. No release file moved, so no re-cut 0d375083
2.7 § 11 extended with the 0d375083 merge and the head that lands aed40d2d

The requirement-to-test witness map is in tasks.md § Witness map, and the
realization decisions the packet delegates are in research.md.

Red first (task 2.2)

  • The tests came first. They were committed alone at bd76faf4, before
    any schema or validator byte moved. Run there, against main's validator:
    93 failed, 97 passed, 176 subtests.
    • 16 test methods are red, each for the missing behavior.
    • 6 characterization tests are green on main and stay green: undeployed
      service with a block, stdio, the two M5 classification tests, and the two
      per-domain vocabulary tests.
  • M5's mutant (design D8). In a copy of main with check_mapping's
    classification comparison removed, the two classification tests FAILED
    (failures=4)
    . Against main's own validator they are OK.
  • At the head: tests/factory-mcp/ passes, 108 tests and 300 subtests
    (main: 88 tests, 203 subtests).

Gates at the landing head aed40d2d (landing round)

The head is aed40d2d, which is 0d375083 plus the verification record's
§ 11. main was merged in three times, never by rebase:

None of those six pull requests touches a release file:

So no re-cut was needed. At every head, rebuilding the inventory with
validate-contract-release.py build --tag contract-v4.1 gives bytes identical
to the committed contracts/releases/contract-v4.1.digests.yaml (342
entries). The number is still free: no contract-v4.1 tag exists, and #630's
latest comment is this lane's row-4 claim.

The gates ran in a full clone with the submodules initialized as CI does,
including #1290's scoped nested openXwallet chain. They were run again at
aed40d2d, which adds only the record: every gate was 0, and doc-health gave
the cb9b27f3 set.

Gate 0d375083 cb9b27f3 07623c7a
Pinned OpenSpec --all --strict (and --no-cache) 0 0 0
openXwallet pin (nested parity openXwallet/openWallet, openWallet/code), openXdox, openDox, openRepoShape pins 0 0 0
clearing dispatch, former-id arrival, factory identity, signed execution chain, openXwallet, wallet YAML syntax 0 0 0
proposal support, sequenced-after (and --ledger-diff), code surface, target release 0 0 0
manifest digests 0 (185 verify) 0 (185 verify) 0 (185 verify)
validate-contract-release.py verify-commit --commit HEAD PASS PASS (contract-v4.1 inventory) PASS
validate-release-tag-gate.py . on a recreated merge tree (main + --no-ff head) 1609bed1 (978e9cbc + 0d375083): no error, no warning; TAG OWED notice 2a38806b (33d2a56a + cb9b27f3): no error, no warning; TAG OWED: contract-v4.1 notice e2ca4121 (841e86f0 + 07623c7a): the same
doc-health --single-repo 0: the cb9b27f3 set 0 (31 critical, 22 error, 86 warning, 17 info): 07623c7a's findings plus 17 staged topic untouched 30 days warnings. Those are clock-driven: the 17 staging topics were last touched on 2026-09-11 and crossed the 30-day mark, and the merge touches no ideation/ file 0 (31 critical, 22 error, 69 warning, 17 info), identical to cc9e1441's apart from the clock
tests/factory-mcp/ 108 passed, 300 subtests 108 passed, 300 subtests 108 passed, 300 subtests
Full suite (pytest tests/ -q -m "not postgres") CI's required pytest-suite, on this pull request at the landing head CI's pytest-suite (run 38100661463): 10195 passed, 6 skipped, 338 deselected, 724 subtests, 0 failures run alone under setsid: 1 failed, 9556 passed, 7 skipped, 338 deselected, 703 subtests; the one failure is the environmental test_tag_hygiene_pinned_targets.py test that main fails identically in the same clone kind (note below)

Gates at the verification head (task 2.7)

Branch 6300772b (the tree the verification ran on; cc9e1441 adds only the
record) and main 9a272c6d were run in the same clone kind, under an
environment built from the CI lock with --require-hashes. Full detail is in
verification.md § 7.

Gate Branch main
Pinned OpenSpec --all --strict (and --no-cache) 0 0
openXwallet / openXdox / openDox pins, openRepoShape pin 0 0
clearing dispatch, former-id arrival, factory identity, signed execution chain, openXwallet, wallet YAML syntax 0 0
proposal support, sequenced-after (and --ledger-diff), code surface, target release 0 0
manifest digests 0 (185) 0 (184)
validate-contract-release.py verify-commit --commit HEAD PASS 1: seven contract-v4.0 members main moved without a cut, which this cut closes
validate-release-tag-gate.py . on the emulated PR merge tree (main + --no-ff head) no error, no warning; TAG OWED: contract-v4.1 notice 0
doc-health --single-repo 0; main's 7 release-inventory-drift findings gone, none added 0
Full suite (pytest tests/ -q -m "not postgres") under setsid 1 failed, 9546 passed, 7 skipped, 701 subtests 1 failed, 9526 passed, 7 skipped, 604 subtests
tests/doc-health under Python 3.14 1 failed, 2156 passed 1 failed, 2156 passed
git diff --check, closing-keyword scan, public-repository scan clean

Two notes on the table:

  • The one suite failure is the same test on both sides, and it is
    environmental.
    It is
    tests/doc-health/test_tag_hygiene_pinned_targets.py::test_a_lexically_malformed_value_builds_no_path_and_reads_nothing.
    The test asserts that no read-surface argument contains the substring one,
    and the local checkout's path contains it. The 7 skips are identical on both
    sides. The 20 extra passes are this feature's factory MCP tests.
  • Where the release tag gate runs matters. Run on the bare branch tip, it
    counts the branch's own commits after the cut as landings. CI runs it on the
    pull request's merge ref, which the emulated merge tree reproduces.

Out-of-tree engineering check (SC-008)

The check ran only with the validator's --snapshot option, outside this
tree, over the engineering domain's three published schemas (tool request,
tool result, domain error) at 33b916c1. Their digests equal the 2026-09-07
baseline's. Results on the branch's validator:

Declaration Result
not deployed valid, as before
deployed, no block hosted_auth_missing
deployed, EdDSA-only block auth_rs256_missing
deployed, RS256 and EdDSA block valid with gaps

No byte, path or name from that repository is in this one.

Release

contract-v4.1 is ADDITIVE: the factory MCP declaration is registered for the
first time, and the clearing family joins the inventory at its floor. Against
contract-v4.0, the inventory goes from 283 to 342 entries: 59 added, 0
removed, 8 digests moved, each attributed in the changelog. No tag is
published.
Under the versioning policy's Bundle Realization Order step 5,
the annotated tag follows the landing.

Reviews

  • Copilot. At cc9e1441 it left review 5475611951 with 0 open findings
    and no thread. At 07623c7a it left review 5481323568, also with 0 open findings and no
    thread. At cb9b27f3 it left review 5481439513 with one thread on the
    verification record: change task 2.7 asks for the full suite at the head that
    lands. That is fixed by § 11 (76944137, extended in aed40d2d), and the
    thread is answered and resolved. Copilot is requested again, explicitly, at
    aed40d2d.
  • Codex. Waived by the landing word. The trigger was posted once, at
    cc9e1441 (comment 6089641602). The connector answered with its
    usage-limit notice (comment 6089643359), so no Codex review exists. No
    second trigger is posted.

🤖 Generated with Claude Code

brettheap and others added 11 commits October 9, 2026 17:31
…change task 2.1)

Specify, clarify (no question: the ratified packet decides every material
question; accepted by the lane's coordinator), plan, seven requirements-quality
checklists at maximum coverage, tasks and analyze round 1 for the realization
of the ratified change amend-factory-mcp-conformance-auth-profile (#1274,
landed 93d13d6). The spec indexes the ratified delta's 19 scenarios and adds
only the realization decisions the packet delegates (research R-1 to R-17).
Analyze D1 (constitution IV) adds one README Documentation-index bullet.

No schema, validator, example or test byte moves in this commit.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tests only: no schema, example or validator byte moves. Run against main's
validator and schema at this commit, every new refusal fails (main refuses
any block as schema_oneOf at /service and the auth concern as schema_enum,
and the deployed example does not exist yet). The characterization tests
pass on main: a not-deployed service carrying auth (schema_oneOf at
/service), a block-free stdio declaration, the two M5 classification tests
and the two per-domain vocabulary tests.

Two existing tests are amended because the ratified change reverses their
premise (design Compatibility: "A deployed declaration without the block,
which is valid today, becomes invalid (hosted_auth_missing)"):
test_resource_identity_without_optional_format_checker and
test_resource_uri_is_https_without_fragment_or_userinfo now give the
deployed service a valid issuer-assigned block (research R-15).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…task 2.2)

verification.md sections 3 and 4: the test commit run against main's
validator and schema (every new refusal red, the six characterization tests
green), and the two classification tests red against a mutant of main's
validator with check_mapping's comparison removed, green against main's own
(design D8).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (change task 2.3)

contracts/factory-mcp/declaration.schema.json: an optional, closed auth object
in the deployed branch of service (issuer, algorithms, audience {binding,
value}, metadata_path, evidence_ids, gap_ids; design D1, research R-1, R-4,
R-12), and the auth key in the evidence and gap concern vocabularies
(design D5). No format keyword on the new strings: their rules are semantic
checks (research R-4). schema_version stays 1 (OQ-5).

contracts/factory-mcp/examples/declaration-deployed.example.json: the
not-deployed example made deployed, with a gap-supported block over reserved
.test names only (research R-16).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sk 2.4)

scripts/validate-factory-mcp.py: check_service, called where check_catalog
already checked the service, reports for a deployed service
invalid_resource_uri (unchanged), auth_resource_query (a ? before any #,
research R-5) and hosted_auth_missing; check_auth reports invalid_issuer,
auth_rs256_missing, auth_algorithm_forbidden, auth_algorithm_unadmitted,
auth_audience_unbound, auth_metadata_path_mismatch (RFC 9728 3.1, skipped
while the URI is invalid, research R-6) and unsupported_auth, at the
locations design D7 gives. The tools' citation loop is shared as cite(), so
the block's ids resolve exactly as a tool's (missing_support_reference,
duplicate_support_reference at /service/auth/...; design D5).

tests/factory-mcp: 108 passed, 300 subtests passed (venv from CI's lock).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs/factory-mcp-conformance.md: the amending change in its Governed by line;
the deployed example's command and expected result; a Hosted authorization
block section (shape, the stdio rule, issuer, algorithms, audience, metadata
path, support, and the code table of design D7); the narrowed reading of
Unavailable dependency (an error-inventory code is an execution failure, a
result status a completed evaluation); the per-domain error-vocabulary
statement; the engineering and operations domains' positions; and links to
feature 039's records. The release paragraph moves at the cut (task 2.6).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
verification.md section 5: tests/factory-mcp after each implementation commit
(108 passed, 300 subtests at the validator and runbook commits), the
starting-point probes re-run, and the check that no touched file is a member
of the contract-v4.0 release inventory. The cut, the gates and the full suite
follow the version claim on #630 row 4.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he first time with its authorization block; the clearing family joins the inventory at its floor (change task 2.6)

The candidate commit of contract-v4.1, claimed as row 4 on #630 (comment
6086467830), for amend-factory-mcp-conformance-auth-profile task 2.6
(Speckit 039). One atomic commit:

- contracts/manifest.yaml: contract_bundle_version contract-v4.1, and the
  factory-mcp-declaration row (schema_version 1, per-file sha256 5e3cf502...),
  a registered row and not a release-inventory member;
- contracts/factory-mcp/declaration.schema.json: the title no longer says
  "Unreleased" (the row's digest is of these bytes);
- contracts/releases/contract-v4.1.digests.yaml: built by
  scripts/validate-contract-release.py build from these bytes. Against
  contract-v4.0: 283 -> 342 entries, 59 added (the clearing family at
  CLEARING_RELEASE_FLOOR (4, 1), byte-unchanged since contract-v4.0), 0
  removed, 8 digests moved, each attributed in the changelog;
- contracts/CHANGELOG.md: the contract-v4.1 entry;
- contracts/README.md: two native-index rows for the declaration and its
  validator;
- tests/intent-compliance/test_release_boundary.py: FEATURE_SUCCESSOR_13
  in both match arms and the measured boundary paragraph (zero intent paths
  moved since contract-v4.0); the inventory was built after this edit;
- docs/factory-mcp-conformance.md: the unreleased wording moves to
  contract-v4.1.

No tag is published: the annotated tag follows the landing, on its own word.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes #1284 (035 PR-1, council-convening foundation). One conflict, in
contracts/README.md: both sides appended native-index rows after the
chain-anchoring rows; both kept, main's council-convening rows first.
contracts/manifest.yaml auto-merged: 185 per-file digests verify.
#1284 moved two release-inventory members (contracts/manifest.yaml and
contracts/README.md), so the forward-only re-cut of contract-v4.1 follows
in the next commit.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
) (change task 2.6)

#1284 landed on main after the first candidate (38c7881, cut from
93d13d6) and moved two release-inventory members, contracts/manifest.yaml
(the signed-execution-chain-digest-construction row's sha256, 0dfc2e8e ->
ef157d88: two digest subjects added) and contracts/README.md (the
council-convening native-index rows). Main was merged in (24699ca, never a
rebase); this commit rebuilds contracts/releases/contract-v4.1.digests.yaml
with scripts/validate-contract-release.py build from the merged bytes and
re-attributes the contract-v4.1 CHANGELOG entry by inventory diff and by a
manifest row diff against the contract-v4.0 tag:

- inventory vs contract-v4.0: 283 -> 342, 59 added (clearing family at its
  floor, byte-unchanged), 0 removed, 8 digests moved, each attributed;
- manifest rows vs contract-v4.0: 202 -> 204 (factory-mcp-declaration, this
  cut; openxwallet-pin, #1026), one changed (digest-construction, #1284);
- the number stays contract-v4.1 (claimed on #630, 6086467830).

No tag is published.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on the branch and main, the full suite and the out-of-tree check; tick T025 to T027 (change task 2.7)

- Section 6: the contract-v4.1 number and its #630 row-4 claim; the first
  candidate 38c7881 and its checks; the forward-only re-cut 6300772
  after #1284 merged into main as 9a272c6 (inventory rebuilt by the tool,
  re-attributed by inventory diff); release-tag-gate on emulated merge
  trees; no tag published.
- Section 7: every gate CI runs, at 6300772 and at main 9a272c6, in the
  same clone kind. Two non-zero rows explained: release-tag-gate on the bare
  branch tip (CI judges the merge tree, which passes) and verify-commit on
  main (seven members main moved since contract-v4.0, which the cut
  closes). doc-health: the branch drops main's seven release-inventory
  drift findings and adds none.
- Section 8: tests/factory-mcp 108 passed, 300 subtests; the full suite
  1 failed / 9546 passed vs main 1 failed / 9526 passed, the same
  environmental failure and the same 7 skips, the +20 all factory-mcp;
  doc-health-py314's command under Python 3.14, equal on both sides.
- Section 9: the out-of-tree engineering check by --snapshot only, with
  the expected hosted_auth_missing and auth_rs256_missing signals; no
  codex bytes, paths or names in this tree.
- Section 10: git diff --check, the closing-keyword scan and the
  public-repository scan, all clean.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brettheap
brettheap requested a balanced review from Copilot October 9, 2026 21:34
@brettheap

Copy link
Copy Markdown
Contributor 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, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Copilot AI 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.

🔵 Needs a closer look

The security-sensitive authorization contract and atomic bundle release require final human validation of semantics and release provenance.

0 open findings

What changed in this PR

Implements feature 039’s hosted Factory MCP authorization profile and cuts the additive contract-v4.1 release.

Changes:

  • Adds the closed authorization schema, offline validation rules, diagnostics, and synthetic deployed example.
  • Adds comprehensive conformance tests and Speckit implementation records.
  • Registers the contract and updates release inventory, changelog, and documentation.
File Description
README.md Indexes feature 039.
contracts/​CHANGELOG.md Records the v4.1 release.
contracts/​README.md Indexes the schema and validator.
contracts/​factory-mcp/​declaration.schema.json Defines the authorization block.
contracts/​factory-mcp/​examples/​declaration-deployed.example.json Adds a deployed example.
contracts/​manifest.yaml Registers v4.1 and the schema.
contracts/​releases/​contract-v4.1.digests.yaml Pins the release inventory.
docs/​factory-mcp-conformance.md Documents authorization behavior.
scripts/​validate-factory-mcp.py Implements offline authorization checks.
specs/​039-factory-mcp-auth-profile/​spec.md Defines feature requirements.
specs/​039-factory-mcp-auth-profile/​plan.md Records implementation planning.
specs/​039-factory-mcp-auth-profile/​research.md Records design decisions.
specs/​039-factory-mcp-auth-profile/​data-model.md Documents the data model.
specs/​039-factory-mcp-auth-profile/​contracts/​interface.md Documents interface changes.
specs/​039-factory-mcp-auth-profile/​quickstart.md Provides validation commands.
specs/​039-factory-mcp-auth-profile/​tasks.md Tracks implementation tasks.
specs/​039-factory-mcp-auth-profile/​verification.md Records test and gate evidence.
specs/​039-factory-mcp-auth-profile/​checklists/​acceptance.md Captures acceptance checks.
specs/​039-factory-mcp-auth-profile/​checklists/​compatibility.md Captures compatibility checks.
specs/​039-factory-mcp-auth-profile/​checklists/​contract.md Captures contract checks.
specs/​039-factory-mcp-auth-profile/​checklists/​diagnostics.md Captures diagnostic checks.
specs/​039-factory-mcp-auth-profile/​checklists/​governance.md Captures governance checks.
specs/​039-factory-mcp-auth-profile/​checklists/​outcomes.md Captures outcome checks.
specs/​039-factory-mcp-auth-profile/​checklists/​requirements.md Captures specification checks.
specs/​039-factory-mcp-auth-profile/​checklists/​security.md Captures security checks.
tests/​factory-mcp/​test_factory_mcp_conformance.py Tests authorization behavior.
tests/​intent-compliance/​test_release_boundary.py Advances the release boundary.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Takes #1290, #1287 and #1288 for the landing round. None of them touches
the release surface: contracts/manifest.yaml, contracts/releases/,
contracts/CHANGELOG.md and contracts/README.md are unchanged, and no
contract-v4.1 inventory member moved. The three manifest rows whose files
moved (openspec-cli-pin, openxwallet-pin, domain-factory-conformance-validator)
carry no per-file sha256.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

The contract release affects 27 files and required CI checks, including the full pytest suite, are still running.

0 open findings

🧠 Review effort: Balanced

Takes #1294 so the landing merge CI validates is the tree that lands.
#1294 touches no release file: contracts/manifest.yaml, contracts/releases/,
contracts/CHANGELOG.md and contracts/README.md are unchanged, no
contract-v4.1 inventory member moved, and no submodule gitlink moved.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🟡 Changes recommended

The committed verification record does not cover the current landing head as required by ratified task 2.7.

1 open finding

🧠 Review effort: Balanced

Comment thread specs/039-factory-mcp-auth-profile/verification.md
brettheap and others added 3 commits October 11, 2026 01:32
…landing heads (change task 2.7)

Answers Copilot's review thread on the verification record at cb9b27f:
change task 2.7 asks for every gate and the full suite at the head that
lands, and sections 6 to 10 stopped at the verification head 6300772.

Section 11 records the landing round on the realization word ("Land when
green, waive Codex (Recommended)"): the two merges of main (07623c7 at
841e86f, cb9b27f at 33d2a56), why no re-cut (no release file or
inventory member moved; the inventory rebuild is byte-identical at both
heads), every gate at both heads, the local full suite at 07623c7, CI's
pytest-suite at cb9b27f (run 38100661463: 10195 passed, 0 failures), and
what the head that lands adds (this record only, re-checked by CI's
required checks before landing).

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes #1295 and #1296, which landed after the 33d2a56 merge, so the landing
merge CI validates is the tree that lands. Neither touches a release file:
contracts/manifest.yaml, contracts/releases/, contracts/CHANGELOG.md and
contracts/README.md are unchanged, no contract-v4.1 inventory member moved,
and no submodule gitlink moved.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the head that lands (change task 2.7)

main moved to 978e9cb (#1295, #1296) after the section was written, and
0d37508 merged it in. Section 11 now lists all three merges, adds the
0d37508 column (every gate 0, inventory rebuild byte-identical,
verify-commit PASS, release-tag-gate on the recreated merge tree 1609bed1
with no error and no warning, doc-health the cb9b27f set, tests/factory-mcp
108 passed), and states the head that lands (0d37508 plus the record)
and how CI judges a later merge of main before landing.

Lane: openxfactory-5 (openXfactory-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI 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.

🔵 Needs a closer look

The security contract and coordinated release cut merit final human validation despite no specific defect found.

0 open findings

1 resolved since last review

🧠 Review effort: Balanced

@sonarqubecloud

Copy link
Copy Markdown

@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

LANDING — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-11T02:17:26Z, PR #1289 into opensoft/openxFactory main

@brettheap
brettheap marked this pull request as ready for review October 11, 2026 02:17
@brettheap
brettheap merged commit b27ae7a into main Oct 11, 2026
16 checks passed
@sourcery-ai

sourcery-ai Bot commented Oct 11, 2026

Copy link
Copy Markdown

Sorry @brettheap, your pull request is larger than the review limit of 150,000 diff characters

@brettheap

Copy link
Copy Markdown
Contributor Author

Lane: openxfactory-5 (openXfactory-5)

LANDED — lane openXfactory-5, session bbe4d255-02db-4578-840b-09924442e544@Eagle, 2026-10-11T02:17:46Z, PR #1289 into opensoft/openxFactory main → merge b27ae7a; 039: realize amend-factory-mcp-conformance-auth-profile tasks § 2 (hosted authorization block, offline checks, contract-v4.1)

brettheap added a commit that referenced this pull request Oct 11, 2026
…into the Phase 5 binding branch

PR-2 and PR-3 have landed. This merge takes main's code and corpus as
landed, and Phase 5's own files:

- resolution.py: the order keeps A4 after step 5, then PR-2's
  `declared = _council_and_class(...)`;
- the README keeps PR-3's snapshot row and Phase 5's corpus and binding
  rows; the two test files keep both sides; evidence.md is main's,
  followed by § Phase 5;
- every vector under vectors/assignment and vectors/resolution that main
  carries is main's, byte for byte. The retry vectors are PR-3's builder
  output, and Phase 2's admission vectors are PR-2's. Phase 5's binding
  is NOT yet on them: the next commits re-author Phase 2's through
  scratch author_admission_vectors.py and regenerate the retry vectors
  from the builder (`tests/council_convening/assignment_vectors.py`),
  never by hand. At this commit the self-test reports those vectors as
  identity-map-missing, as expected;
- openXwallet moves to main's pin 815b86cef (#1290).

Lane: codexfactory-2 (codeXfactory-2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brettheap added a commit that referenced this pull request Oct 11, 2026
…ration

PR-2 (#1294, 33d2a56) and PR-3 (#1296, 978e9cb) landed; their branches
are deleted, so main is the source for Phases 2 and 3 from here on. Main
also brings #1287, #1288, #1295 and #1289.

Resolution:
- resolution.py: the admission order keeps Phase 5's A4
  (`_workflow_revision`) and Phase 2's final step 9, which reads the
  `declared` projection entry `_council_and_class` returns.
- The invocation-directory check takes main's separator-terminated prefix
  (the PR-1 follow-up) and keeps the mode name, so `select` says so.
- The family README gains Phase 3's snapshot and assignment row beside
  Phase 5's binding row; the corpus contract's `issued` row carries both
  Phase 4's `public_key` amendment and Phase 3's live-snapshot soundness
  note.
- evidence.md: Phase 3's final records go at the end of § Phase 3, before
  § Phase 4 (as merged from 03cb77e) and § Phase 6.
- Tests: Phase 3's final assignment-area docstring (snapshot half shared,
  retry vectors the consumer's) inside Phase 6's all-areas test; Phase 3's
  pre-review `check` tests kept beside Phase 4's and Phase 5's.
- refusal_code is unchanged: 92 codes, one copy each of binding_unresolved
  and broker_capability_insufficient, at Phase 4's position.
- The conformance index is regenerated: 641 vectors.

Lane: codexfactory-2 (codeXfactory-2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants