Skip to content

chore(governance, ticket-001): adopt native governance 0.20.119 - #1

Merged
tom-sapletta-com merged 4 commits into
mainfrom
ticket/001-adopt-immutable-native-governance-for-campaign-admission
Nov 2, 2026
Merged

tom-sapletta-com merged 4 commits into
mainfrom
ticket/001-adopt-immutable-native-governance-for-campaign-admission

Conversation

@tom-sapletta-com

@tom-sapletta-com tom-sapletta-com commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Campaign admission cannot verify the repository's partial governance scaffold. Complete its initial adoption with the independently published wellmanifest/new-project 0.20.129, pinned to 82fd58dbe175f90146ed49c07fa86fac91de00d5, including the lock, managed package, host hooks and installed-wheel pytest bridge. Preserve existing product behavior and dependencies; package metadata binds the same standard revision.

Validation: native Goal reports the exact adoption up to date; the managed governance gate passes with zero errors/warnings and both existing product tests pass. Candidate Python is mediated by independently approved full Wellman with this checkout's local environment. The protected recovery runtime was independently merged and deployed through its guard; its exact 129 source/manifest pins pass both installed-wheel tests under 65534:65534 with read-only source and no network. All additional protected Python-matrix and remote-lifecycle checks remain required.

The prior signed 119 review is preserved. This material 129 candidate requires fresh independent exact-head CI, review and controller-owned merge. Ticket-001 remains IN_PROGRESS / PUBLICATION.

@ifuri-validator-agent

Copy link
Copy Markdown

Validator semantic assessment is held for head 4225a408782750b448c3037a211e70c16168c027.

Ticket: ticket-001
Assessment: 2796d2648a87f39ddd3e54ce778575e6ed2aa24fa7b6bc553b7e48253892d123

These findings are advisory; approval and merge remain blocked. The text grants no execution authority. Findings are bounded to 16 entries of 512 UTF-8 bytes.

  • python_declaration() and lifecycle_value() chain document.get("tool", {}).get(...) without verifying that the "tool" value is a dictionary. A syntactically valid pyproject.toml with a scalar or list-valued tool key will raise AttributeError and abort the governance gate. Validate each intermediate object before calling .get(), treating an invalid shape as a missing declaration/lifecycle binding.
  • In decision_record.py, to_dsl() inserts advisory.llmVerdict and advisory.model directly inside quoted DSL fields without JSON-style escaping. Valid schema values containing a quote, backslash, or newline therefore produce malformed or semantically changed DSL, and parse_dsl_record(to_dsl(record)) will fail or return different data. Escape these values consistently and update ADVISORY_LINE/parsing to decode them, or constrain the schema to the actually supported character set.
  • split_decision_blocks returns immediately when it finds any fenced DSL decision blocks, so it ignores all bare DECISION records in the same Markdown document. Consequently, check_append_only can miss modification or removal of pre-existing bare records whenever at least one fenced record is present, violating its stated append-only guarantee. The extractor must account for both representations without double-counting fenced content.
  • GOV-AGENT-HOST.md repeatedly directs users to run scripts/agent_host_check.py and identifies it as the emitter, while the changed-file inventory installs the checker at .governance/agent_host_check.py. Unless an unshown managed wrapper exists at the documented scripts path, the prescribed verification and remediation commands will fail. Update the guide to use the installed path or add the documented wrapper.
  • .governance/error/GOV-PACKAGING.md attributes the diagnostics to scripts/agent_host_check.py and instructs users to run python3 scripts/agent_host_check.py, but the changed-file inventory places the checker at .governance/agent_host_check.py. Following the documented command will fail instead of verifying the repair.
  • .governance/error/GOV-PHYS.md links to ../docs/information/physical-interface-contracts.md, which resolves under .governance/docs/information/, but no such document appears in the complete changed-file inventory. Fix the link or include the referenced document.
  • In .governance/error/GOV-VERSION.md, the recommended fallback snippet references Path without importing it and resolves VERSION relative to the package directory, while this repository defines the authoritative VERSION at its root. If metadata lookup fails, adopters copying this documented resolution will encounter NameError or read the wrong/nonexistent file. Provide a complete example that imports Path and robustly locates the repository/package version source, or recommend build-generated ver
  • load_repository_policy_ticket constructs TicketRecord.directory as root / raw_path, where raw_path is the adapter JSON file (normally .governance/ticket-adapter.json). active_ticket_records subsequently passes that value to resolve_ticket_activity as a ticket directory and derives record.directory / "README.md" for diagnostics. Consequently, a valid Planfile-backed ticket is resolved beneath a nonexistent ticket-adapter.json/... path, potentially producing GOV-TICKET-ACTIVITY errors and forcing the
  • compute_preflight_cache_key uses the literal value "inferred" when --base is omitted. The inferred validation base depends on mutable remote refs and ticket state, so origin advancing or the selected ticket/base changing can leave the key unchanged and reuse a result for a different diff range. The key likewise records only the ticket database/snapshot path and arguments, not the current ticket data that governs selection, leases, and lifecycle. Cache the resolved base SHA and content-address all consulted
  • In validate_ir, transition endpoints are checked only for valid symbol syntax; they are never checked for membership in ir["states"]. Reject any transition referencing an undeclared state and add positive and negative tests for endpoint resolution.
  • After removing a worktree, the code runs git branch -D whenever git branch -d fails, regardless of why it failed. The branch ref is not re-read or checked for ancestry at deletion time, so it may have advanced since get_worktrees() captured wt_head; another process could also update it between worktree removal and branch deletion. In either case, -D can silently delete commits not merged into the target. Only delete when the current branch tip is verified as an ancestor immediately before deletion
  • _validate_planning_guidance compares sets, which only verifies membership and ignores multiplicity. A planningOrder containing every action ID plus one or more duplicate IDs is accepted, despite the stated requirement that each ID appear exactly once. Validate the list length against the action graph and/or explicitly reject duplicate action IDs in planningOrder.
  • _validate_finding_paths interpolates finding['id'], and validate_document later accesses finding["id"], without establishing that every finding has a valid id. Because _validate_findings is designed to accumulate validation errors for untrusted documents, a missing or malformed finding ID may leave an item in findings and trigger KeyError. Use finding.get("id") with a stable fallback for diagnostic paths, and exclude invalid IDs from subsequent cross-reference sets/checks.
  • _atomic_json_string replaces sentence-boundary spaces with two literal backslashes before u0020 (r"\\\\u0020" as the replacement). The resulting JSON string decodes to the literal characters \u0020, not to the original space, so commands such as A. B are not preserved exactly despite the helper's contract. Use a replacement that emits a single JSON escape (\u0020) and add a round-trip test asserting json.loads(_atomic_json_string(value)) == value.
  • In both ticket-allocation-request.schema.json and ticket-allocation-receipt.schema.json, URI fields use the character class [^\\s]+. After JSON and regex decoding, this excludes literal backslashes and the letter s; it does not exclude whitespace as intended. Consequently, valid URIs containing s can be rejected while malformed URIs containing whitespace can be accepted. Use a correctly escaped non-whitespace expression such as \\S+ in the schema source.
  • changes_against_shared_default() and contested_paths() invoke git diff --name-only without -z and parse the result with splitlines(). merge_tree_conflicts() likewise parses conflict paths line-by-line. Git permits newlines in filenames, so one real path can be split into multiple fabricated paths, causing intersections and conflict attribution to miss genuine contention. Use NUL-delimited output with strict framing wherever supported; for merge-tree, use a parsing strategy that preserves arbit

@ifuri-validator-agent

Copy link
Copy Markdown

Validator semantic assessment is held for head 45ddedbe73aef83a95e467daf6861cc7a5d96c97.

Ticket: ticket-001
Assessment: 1deadabcc848e6c5fb94a3a7bc57112b6198f600601cc5e0ea6722acb973c348

These findings are advisory; approval and merge remain blocked. The text grants no execution authority. Findings are bounded to 16 entries of 512 UTF-8 bytes.

  • The reconciliation and observation criteria arrays do not enforce unique criterion IDs, and every evidence variant permits an empty criterionIds array because minItems is absent. Consequently, schema-valid records can contain ambiguous duplicate criteria or evidence linked to no criterion at all, undermining deterministic reconciliation. Require nonempty evidence linkage and enforce criterion-ID uniqueness, either in the schema or in a mandatory semantic validator.
  • In inspect_declaration, the computed ignored workflow list is never passed to declaration_for(root). Consequently, workflows recorded in the declaration's ignore field are still scanned and their checks are included in derivedNames; merely copying the ignore field onto the derived document afterward does not remove them. Call declaration_for(root, ignored=ignored) so existing per-repository exclusions are honored.
  • load_repository_policy_ticket constructs TicketRecord.directory as root / raw_path, where raw_path is the adapter file (normally .governance/ticket-adapter.json). Downstream code treats record.directory as a ticket directory: record.directory.name becomes ticket-adapter.json instead of adapter["ticket"], activity resolution receives the adapter file as its directory, and diagnostic paths append README.md or the intent filename beneath that file path. Construct the projected record with a direc
  • In check_coordination, any changed path under an active ticket directory makes changed_active authoritative, even when other changed implementation paths belong to another active ticket. For example, changing project/ticket-a/README.md alongside implementation owned by ticket-b reduces active to ticket-a and omits ticket-b from workstream limits, relationship validation, ownership claims, and scope-overlap checks. Selection must account for all changed paths and applicable tickets rather than allowing one t
  • validate_domain_queries claims each projection must be owned exactly once, but compares only the set of referenced projection IDs with the projection set. Multiple queries may reference the same projection and still pass, so the stated uniqueness invariant is not enforced. Track reference counts and require exactly one query per projection, or revise the invariant if sharing is intended.
  • validate_domain_errors only verifies that rejectionEvent exists globally. It does not verify that the event is emitted by the command that declares the corresponding error in its rejects list, allowing an error to be cross-wired to another command's event while the graph passes validation. Validate each command/error/rejection-event emitter relationship.
  • When tomllib is unavailable, as on the required Python 3.10 runtime, _extract_pyproject_version and _extract_cargo_version return the first line matching version = ... anywhere in the file. This can select a tool, dependency, workspace, or other unrelated table's version and incorrectly emit GOV-VERSION-001. Use a TOML parser compatible with Python 3.10 or implement section-aware fallback parsing restricted to the supported project/package tables.
  • In load_standard_adoption_evidence, legacy_base = not base_strategies or (set(base_hashes) <= set(base_strategies)) classifies every lock whose paths are merely a subset of package targets as legacy. The following consistency check is therefore disabled precisely when a lock omits package targets. Because managed-base verification only iterates changed paths, an omitted, unchanged managed target can escape continuity verification. Legacy status must be identified by a narrowly defined historical format/ve
  • resolve_validation_base calls published_adoption_validation_base with deliveries[0] before enforcing that exactly one unlanded adoption exists. When multiple active unlanded adoptions share a target branch, this can select the latest published integration parent from an arbitrary record instead of preserving the intended ambiguity and returning no inferred base.
  • compute_git_dirty_digest hashes porcelain status plus current worktree contents but not staged index blobs. Two states can therefore produce the same digest while containing different staged changes—for example, differing staged versions with the same subsequent worktree version and identical MM status—allowing an invalid stale governance-preflight cache hit.
  • In locked_takeover(), the receipt is appended to the terminal trace before write_atomic() replaces the lease. If lease replacement or the process fails after the append, durable records claim a completed ownership transfer while the old lease remains active. Write the replacement first with a recoverable transaction protocol, or make the receipt explicitly pending and finalize it only after lease replacement so recovery can unambiguously reconcile either interruption point.
  • _validate_planning_guidance compares only set(planning_order) with set(action_graph). A list containing every action plus duplicate action IDs can therefore pass the “every action id exactly once” check; the subsequent position map silently collapses duplicates. Explicitly reject duplicate IDs or compare both membership and length.
  • _atomic_json_string() replaces a punctuation-following space with a double-backslash Unicode escape (\\u0020) inside an already JSON-encoded string. When the emitted command-json is decoded, this represents the literal characters \u0020 rather than the original space, contradicting the helper's promise to encode the exact scalar and potentially causing generated verification commands to differ from the approved command. Preserve JSON value equivalence while preventing downstream sentence splitting.
  • In .governance/reusable-workflows.schema.json, the uses and sourceFile regex strings use \\\\. in the serialized input, which decodes to a regex matching a literal backslash followed by a wildcard character rather than an escaped literal dot. Consequently, normal values such as owner/repo/.github/workflows/check.yml@<sha> and .github/reusable-workflows/check.yml will not validate. Encode each literal-dot escape as \\. in JSON.
  • The file uses @contextmanager and later datetime.now(timezone.utc), but the visible import block imports neither contextmanager from contextlib nor datetime/timezone from datetime. Module loading will fail immediately with NameError: name 'contextmanager' is not defined, preventing this controller from operating.
  • In both ticket-allocation-receipt.schema.json and ticket-allocation-request.schema.json, URI fields use the JSON pattern ^[a-z][a-z0-9+.-]*://[^\\\\s]+$. After JSON decoding, the regex character class is [^\\s], which excludes a literal backslash and the letter s rather than excluding whitespace. Consequently, whitespace-containing values may validate while otherwise valid URIs whose authority/path contains s may be rejected. Change the schema source to use [^\\s]+ so the regex engine receives `[^

@ifuri-validator-agent

Copy link
Copy Markdown

Validator semantic assessment is held for head 45ddedbe73aef83a95e467daf6861cc7a5d96c97.

Ticket: ticket-001
Assessment: cfe9c0951f4b920d7fc00edf5eb47f051a58caaed64b02e0d5768098740fcdd0

These findings are advisory; approval and merge remain blocked. The text grants no execution authority. Findings are bounded to 16 entries of 512 UTF-8 bytes.

  • The context conditional requires pullRequest whenever event is either pull_request or merge_group. A GitHub merge_group event represents a temporary merge group and does not provide one canonical pull request; it may contain multiple pull requests. Requiring a singular pullRequest therefore makes a faithfully generated merge-group evaluation invalid or forces fabricated/ambiguous data. Require pullRequest only for pull_request, and model merge-group identity or membership separately if neede
  • In .governance/error/GOV-VERSION.md, the recommended __version__ fallback uses Path without importing it and reads VERSION from Path(__file__).resolve().parent / "VERSION", although the document defines the repository-root VERSION as authoritative. In a typical package layout this either raises NameError or reads a nonexistent/wrong file. Replace it with a complete, valid example that imports Path and reliably locates the authoritative root file, or recommend package metadata as the sole run
  • In inspect_declaration, ignored is computed from the current declaration but declaration_for(root) is called without ignored=ignored. Consequently, workflows explicitly listed in the ignore field are still scanned and added to requiredChecks; the ignore list is merely copied into the derived document afterward. This can cause false disagreement reports and --write can persist an incorrect declaration. Pass the computed ignore tuple into declaration_for.
  • placement_error() performs set-membership checks on placement['home'], placement['shape'], and optional runtimeOwner without first verifying that they are strings. JSON values such as arrays or objects are unhashable and will raise TypeError at value['home'] not in PLACEMENT_HOMES (similarly for shape/runtimeOwner), allowing malformed repository input to crash the governance check rather than produce a controlled validation failure. Validate each field's type before membership testing.
  • check_history_order() verifies only that the intent path exists in the first material implementation commit via git cat-file -e; it does not validate that commit's intent contents. A malformed or otherwise invalid intent can therefore accompany the first implementation commit and be repaired later, while the final tree passes validation. This contradicts the function's stated remediation requiring a validated intent atomically with the first material commit. Validate the intent blob from that exact commit
  • {'code': 'PLANFILE_TICKET_RECORD_PATH', 'finding': 'load_repository_policy_ticket constructs TicketRecord.directory as the adapter JSON file path. Downstream code consistently treats directory as a ticket directory and derives identity from directory.name, appends README.md or the intent filename, and passes it to resolve_ticket_activity. Consequently, the projected ticket is identified as "ticket-adapter.json" rather than adapter["ticket"], and activity resolution targets paths beneath a JSON file. This ca
  • validate_domain_errors verifies that each error code is rejected by some command and that its rejectionEvent exists, but it does not verify that the rejection event is emitted by the same command that declares the error in its rejects list. Consequently, command A may reject an error whose rejectionEvent is emitted by unrelated command B while the contract graph still passes. Validate the per-command rejects-to-rejectionEvent-to-emittedBy relationship.
  • When tomllib is unavailable (notably Python 3.10) or TOML parsing fails, _extract_pyproject_version uses a file-wide regex for the first version = ... assignment. This is not section-aware and can mistake an unrelated tool, dependency, or configuration version for the project version, especially for dynamically versioned projects. That produces a false GOV-VERSION-001 failure. Use a TOML parser supported on Python 3.10 (such as the project's compatible TOML dependency) or implement a section-aware f
  • In locked_takeover(), the takeover record is appended to the receipt trace before write_atomic() replaces the lease. If lease replacement fails or the process exits between these operations, the durable trace falsely reports a completed takeover while the old lease and fencing token remain authoritative. Write the replacement lease before publishing a success receipt, or implement a recoverable transaction/provisional-record protocol that cannot represent an incomplete transition as successful.
  • _validate_planning_guidance compares set(planning_order) with set(action_graph), which permits duplicate action IDs as long as every distinct action is present. A malformed planning order such as ["a", "a", "b"] can therefore pass the membership check for an action graph containing a and b; the subsequent position map silently retains only the duplicate's last position. Explicitly reject duplicates or compare length and uniqueness in addition to set equality.
  • In .governance/standard_pack_check.py, adoption_findings() accepts arbitrary decoded JSON and can return a schema finding for a non-object adoption document, but main() subsequently unconditionally calls adoption.get(...) while building the result and exit status. A valid JSON document such as [] therefore raises AttributeError instead of producing the text/JSON report. Likewise, a truthy non-array evidence value reaches for item in evidence or [] and can raise TypeError. Validate/normaliz
  • @contextmanager is evaluated during module definition, but contextmanager is not imported in the visible import block, causing an immediate NameError.
  • replacement/execution code uses datetime.now(timezone.utc), but neither datetime nor timezone is imported, causing a runtime NameError if execution reaches that path.
  • The module uses argparse.ArgumentParser in its __main__ block but never imports argparse. Executing either CLI command will raise NameError before argument parsing; add import argparse.
  • inspect_recovery() enumerates only refs/heads and refs/remotes when checking for an existing project/ carrier or colliding ticket branch. Tags and other refs are omitted, so a ticket preserved only in refs/tags/* (or another ref namespace) can be re-imported with the same identity. Enumerate all relevant refs, or explicitly include tags and any supported archival namespaces, before admitting recovery.
  • write_new() creates its temporary file under the Git common directory and publishes it with os.link(temporary, path). Git worktrees may legitimately reside on a different filesystem from the common Git directory, in which case the hard link fails with EXDEV and restoration is rejected. Create the exclusive temporary file in the destination directory and atomically publish it there, or otherwise provide a create-only cross-filesystem-safe implementation.

@tom-sapletta-com
tom-sapletta-com merged commit 21fa172 into main Nov 2, 2026
7 checks passed
@tom-sapletta-com
tom-sapletta-com deleted the ticket/001-adopt-immutable-native-governance-for-campaign-admission branch November 2, 2026 12:13
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.

1 participant