Skip to content

[Security]: Harden generated install prompts and checksum closure #74

Closed

Description

@houlianpi

Problem

Independent final security re-review of #28 / PR #29 found that the generated Candidate/public Agent Install Prompts must bind installation to a newly created disposable environment with deletion rollback, must not inspect or echo credential-bearing package-source material, and must place prompt bytes inside the complete externally anchored release checksum closure.

The first #74 remediation then required every standard-library venv, pip, and installed CLI operation to remain handle-relative/pathname-free. Independent correctness review established that standard Python tooling on macOS and Windows cannot execute that contract. A malicious process already running as the same OS identity has equivalent filesystem/process authority, so claiming otherwise would be both unimplementable and a false security boundary.

The Human Product Owner selected the feasible boundary in the recorded decision: trust processes already running as the same OS user identity, securely reserve a high-entropy exact installation root beneath a verified private per-user parent, hold a locked identity-bound transaction, and permit standard pathname-based child tools only after that reservation. AutoGenesis must still fail closed against other identities, shared/unsafe parents, symlink or reparse redirection, collisions, accidental concurrent installers, stale ownership, substituted transaction state, and overbroad rollback.

User outcome

A user can give either the Candidate or public Agent Install Prompt to a Coding Agent and receive the same executable fail-closed installation behavior. The Agent proposes one cryptographically random exact disposable-environment path under a verified private per-user parent, obtains approval for that exact path, atomically reserves it without reuse, holds an exclusive identity-bound transaction through installation and rollback, uses standard stdlib venv, pip, and installed CLI pathname operations only inside that boundary, and deletes only still-matching prompt-owned state.

The prompt states the residual threat honestly: it does not defend the installation root against a malicious concurrent process already holding the same OS user's permissions. It continues to isolate child processes from ambient Python/package configuration, protect source and canonical asset URLs, prove provenance and checksums, and avoid reading or emitting source credentials.

Product and technical identities

This blocks AutoGenesis 1.1.1 Skills Preview. Product naming remains decoupled from technical identities: Agent Contract 2.1.0, Appium Runtime 0.5.0, Windows Runtime 0.5.0, CLI 0.2.0, and GitHub release/tag agent-contract-v2.1.0. If prompt or authenticated Contract bytes change, regenerate the canonical identity and update every exact affected pin atomically; do not rename technical artifacts to 1.1.1.

Area

Packaging + Bootstrap. The generated prompt is both a release artifact and the Agent-first installation boundary.

Scope

  • Harden both generated prompt variants from their canonical generator/source:
    • Candidate Agent Install Prompt used for exact commit-bound pre-publication acceptance;
    • public Agent Install Prompt shipped in the immutable GitHub Skill release/onboarding cutover.
  • Select a verified private per-user parent directory owned by the current user whose stable identity and permissions deny write/delete control to other OS identities. Reject shared, untrusted, unsafe, or network parents and every symlink/reparse component.
  • Generate a cryptographically random leaf name with at least 128 bits of entropy for this exact installation. Include the resulting exact absolute path in the immutable installation plan and obtain explicit user approval before creating or modifying it.
  • After approval, atomically create that exact leaf with fail-if-exists and no-follow semantics. Acquire an exclusive transaction lock and record stable filesystem identity plus a private unpredictable ownership marker. On collision, parent change, leaf change, or reservation ambiguity, stop and produce a fresh plan with a new random path; never repurpose or reuse a path.
  • Reject reuse of an ambient, project, user, global, or pre-existing virtual environment as the official install/acceptance target.
  • Permit standard pathname-based stdlib venv, pip, and installed CLI child operations after successful reservation because malicious same-user replacement is outside the selected threat boundary. Preserve the existing isolated bootstrap Python, minimal clean child environment, ambient package/config/cache exclusions, opaque approved source/auth input, offline staging, source metadata, canonical URL, artifact provenance, and checksum protections.
  • Hold the exclusive transaction lock through create/install/verify/rollback. Before and after every phase and immediately before cleanup, recheck the lock, private parent identity/ownership/permissions, exact leaf identity, and private marker. Any mismatch stops dependent work and forbids deletion of the changed state.
  • On failure, cancellation, identity/digest mismatch, supersession, or rollback, stop dependent processes and delete only roots whose current identity, marker, parent, and lock still match the approved transaction. Preserve every mismatched, substituted, pre-existing, or unrelated path for investigation; never restore a write-capable cached inventory.
  • Describe package-source policy only through sanitized host/config-source metadata independently available without exposing secrets. Never read or emit a full index URL, URL userinfo, username, password, token, credential-bearing environment value, query, fragment, authorization header, raw package-manager configuration, or untrusted error/output/evidence value.
  • Generate each final install-prompt asset before SHA256SUMS, include every final prompt and shipped asset in the checksum closure, and exclude only SHA256SUMS itself.
  • Preserve Candidate's exact reviewed Actions artifact/run-attempt/commit/manifest anchor and public installation's exact immutable GitHub Release/tag/commit/asset-set anchor. Checksums never replace those external anchors.
  • Update Candidate/release workflow ordering, complete-asset verifier/manifest logic, generated prompt tests, behavioral eval fixtures, canonical install reference, affected technical/onboarding docs, and every exact technical identity pin changed by canonical bytes.

Non-goals

  • No defense against a malicious concurrent process already running with the same OS user identity; that actor is explicitly inside the trust boundary and can replace pathname-addressed state with equivalent user authority.
  • No signed native privileged/sandboxed Bootstrap, new service, elevated helper, or expanded macOS/Windows platform scope. AutoGenesis 1.1.1 retains the standard Python toolchain.
  • No package, GitHub Release, MCP Registry publication, publication-workflow dispatch, merge, or repository/organization setting change.
  • No weakening of user approval, exact-byte/digest, OIDC, environment protection, immutable-release, external provenance, clean-child-environment, source/URL validation, or release-integrity controls.
  • No support for installing into an existing environment as the accepted Agent-first path.
  • No logging or redaction-after-reading fallback for package-source secrets; secret-bearing values must not be read or emitted in the first place.
  • No new package mirror, index, credential storage, or package-manager policy.
  • No generated-file trusted-write implementation; [Security] Bind generated writes to trusted approval and directory handles #51 remains future work.
  • No qualification of Windows or experimental clients.

Interfaces affected

  • Canonical Candidate and public Agent Install Prompt generation/source.
  • Canonical install reference and behavioral eval cases describing the trust boundary and transaction lifecycle.
  • Commit-bound Candidate bundle/manifest/checksum ordering and verification.
  • Immutable GitHub Skill Release asset manifest/checksum ordering and verification.
  • Agent Contract identity and exact consumer pins when canonical authenticated bytes change.
  • Root onboarding/public-cutover text owned by [Documentation]: Publish AutoGenesis 1.1.1 Skills Preview onboarding #28 / PR Publish AutoGenesis 1.1.1 Skills Preview onboarding #29 remains excluded.
  • Technical install/rollback documentation describing private-parent reservation, pathname child-tool permission, residual threat, and identity-bound cleanup.

Acceptance scenarios

Scenario: Exact random path is approved before reservation
  Given a Candidate or public installation has selected a verified private per-user parent
  When the Agent prepares the immutable installation plan
  Then it generates a cryptographically random leaf with at least 128 bits of entropy for this exact installation
  And the plan names the resulting exact absolute disposable-environment path
  And explicit user approval occurs before that leaf is created or modified
  And an ambient or pre-existing environment is never substituted

Scenario: Unsafe private parent is rejected
  Given a proposed parent is shared, network-backed, untrusted, owned by another identity, writable or deletable by another identity, or contains a symlink/reparse component
  When the Agent validates the installation parent
  Then installation stops before approval or reservation
  And no child tool or cleanup operation uses that parent

Scenario: Exact leaf is reserved atomically
  Given the user approved one exact absent random path
  When the Agent starts the transaction
  Then it atomically creates that exact leaf with fail-if-exists and no-follow semantics
  And acquires one exclusive transaction lock
  And records stable parent/leaf identities plus a private unpredictable ownership marker
  And it never repurposes an existing or changed path

Scenario: Collision or concurrent installer stops and re-plans
  Given the approved leaf now exists, its parent changed, or another normal installer holds the transaction lock
  When reservation begins or a phase boundary is checked
  Then the Agent stops without entering or deleting that state
  And creates no child process there
  And a retry requires a fresh random exact path, a fresh immutable plan, and fresh approval

Scenario: Standard Python tools execute inside the reservation
  Given the exact leaf was successfully reserved and the exclusive lock, identities, private ownership, permissions, and marker still match
  When environment creation, installation, or verification runs
  Then standard pathname-based stdlib `venv`, `pip`, and installed CLI operations are permitted within that exact root
  And their child environments remain isolated from ambient Python, package configuration, source overrides, user site, caches, targets, prefixes, and credentials
  And all source metadata, canonical URL, provenance, artifact, checksum, and offline-staging protections remain enforced

Scenario: Every phase rechecks transaction ownership
  Given a locked installation transaction is active
  When any create, stage, install, verify, acceptance, rollback, or cleanup phase begins or ends
  Then the Agent rechecks the lock, private parent identity/ownership/permissions, exact leaf identity, and private marker
  And any mismatch stops dependent work before another mutation

Scenario: Identity or marker mismatch forbids deletion
  Given failure or rollback was requested
  And any current root, parent, lock, stable identity, permission, or private marker does not match the recorded transaction
  When cleanup evaluates that path
  Then the Agent does not delete or enter the mismatched state
  And preserves it and all unrelated user/project state
  And deletes only still-matching prompt-owned roots

Scenario: Same-user malicious replacement is an explicit residual threat
  Given a process already runs with the same OS user identity as the installer
  When the prompt states its installation security boundary
  Then that process is explicitly classified as trusted and in scope of the user's authority
  And the prompt makes no claim to prevent that process from maliciously replacing pathname-addressed state
  And it does not propose a privileged or sandboxed native Bootstrap

Scenario: Package-source disclosure cannot reveal credentials
  Given package-manager configuration may contain a URL with userinfo, token, query, fragment, or other credentials
  When the prompt plans, installs, diagnoses, rolls back, or records evidence
  Then it does not read or echo the full URL or secret-bearing configuration/value
  And reports at most validated independently trusted sanitized host and source-class metadata
  And fails closed before installation if safe sanitized disclosure is unavailable

Scenario: Prompt bytes are inside the complete checksum closure
  Given final Candidate or public install-prompt bytes have been generated
  When release assets and SHA256SUMS are produced
  Then prompt generation completes before SHA256SUMS generation
  And SHA256SUMS includes every final prompt asset and every other shipped asset
  And SHA256SUMS excludes only SHA256SUMS itself
  And changing any prompt byte makes checksum verification fail

Scenario: Checksums preserve external trust anchors and exact pins
  Given a complete internally consistent asset directory is supplied from an untrusted source
  When Candidate or public installation verifies it
  Then checksums alone are insufficient
  And Candidate acceptance still requires the exact reviewed Actions run, attempt, commit, artifact, and manifest identity
  And public installation still requires the exact immutable GitHub Release, tag, commit, and asset identity
  And every affected Runtime, CLI, manifest, workflow, documentation, and test pin matches regenerated canonical bytes

Required focused verification

  • Generator/contract tests proving Candidate and public prompts select only a verified private per-user parent and reject other-owner, shared, other-writable/deletable, network, symlink, and reparse parents.
  • Generator/contract tests proving the exact approved path contains at least 128 bits of cryptographic randomness, appears in the immutable plan before approval, and is the only atomically reserved leaf.
  • Behavioral prompt/eval cases proving approval precedes reservation; fail-if-exists collision stops and requires re-plan; a second normal installer is rejected by the exclusive lock; changed parent/leaf state stops; and no colliding/pre-existing path is entered, repurposed, or deleted.
  • Executable standard-tool path coverage proving stdlib venv can run by pathname after successful reservation and that subsequent pip/installed CLI pathname use is permitted only while lock, private parent, identities, permissions, and marker match.
  • Phase-boundary and rollback tests proving lock/parent/leaf/marker rechecks occur before and after each phase; identity or marker mismatch forbids deletion; matching prompt-owned state is removed; and unrelated state is preserved.
  • Prompt/reference/eval assertions stating the residual threat exactly: malicious same-OS-user replacement is outside AutoGenesis's defense claim and no native privileged/sandboxed Bootstrap is introduced.
  • Existing clean-child-environment tests preserving isolated bootstrap Python; minimal environment; omission without reading ambient PYTHON*, PIP_*, and UV_*; no user site/config/cache; opaque approved source/auth; and offline/no-index post-staging behavior.
  • Credential-canary tests covering URL userinfo, percent encoding, tokens, query, fragments, environment/config/header/error/output/evidence values; the canary must never be read or emitted. Raw index/config inspection commands remain absent and unsafe disclosure fails closed.
  • Candidate/public canonical-URL tests preserving exact round-trip syntax restrictions and Candidate run/attempt/artifact provenance.
  • Release/Candidate asset tests proving prompt generation precedes checksum creation, every prompt is included, SHA256SUMS excludes only itself, prompt mutation fails, and self-consistent substitution is rejected without the exact Actions or immutable GitHub Release anchor.
  • Canonical manifest regeneration and exact identity/pin verification whenever authenticated bytes change.
  • Independent correctness and security review. The implementer cannot approve the work.
  • Independent clean Candidate acceptance after merge; superseded Candidate run 42843125727 must not be used.

Security and rollback

The selected boundary trusts processes already running as the same OS user identity. Standard pathname-based child tools therefore carry a residual same-user replacement risk that AutoGenesis does not claim to prevent. The enforceable protections cover other OS identities, unsafe/shared/network parents, symlink/reparse redirection during validation and reservation, accidental/normal concurrent installers, collisions, stale or substituted ownership state, credential disclosure, and overbroad cleanup.

A transaction is authorized only for the exact random path approved by the user, beneath the verified private parent, after atomic fail-if-exists/no-follow creation. The exclusive lock, stable parent/leaf identities, private ownership marker, ownership, and permissions are rechecked before and after every phase and immediately before cleanup. On any ambiguity or mismatch, stop dependent work and preserve the state; never enter, repurpose, or delete it.

Before publication, rollback stops owned processes and deletes only prompt-created roots whose current identity, marker, parent, permissions, and lock still match the recorded transaction. It preserves all mismatched, substituted, pre-existing, and unrelated paths. It never restores a write-capable cached inventory. Package-source values remain non-readable/non-emittable, and internal checksums remain subordinate to the external Actions/GitHub Release trust anchor. After any public identity is exposed, follow #70's no-partial rollback and burned-identity/version-decision rules.

Dependencies and ownership

Definition of Ready

  • User outcome and selected same-OS-user trust boundary are explicit.
  • The Human Product Owner selected the feasible private-parent/random-path/atomic-reservation/exclusive-lock contract and rejected native privileged/sandboxed Bootstrap scope.
  • Candidate and public prompt behaviors are frozen, including executable pathname-based stdlib venv, pip, and installed CLI use after secure reservation.
  • The residual malicious same-user replacement threat is explicit and is not represented as defended.
  • Disposable-environment rollback, sanitized source disclosure, clean-child protections, checksum closure, and external trust-anchor decisions are resolved.
  • Observable acceptance scenarios and focused security/rollback/concurrency tests are specified.
  • Technical version/pin rule is explicit.
  • Dependencies and PromptHardening ownership are identified; root README/PR Publish AutoGenesis 1.1.1 Skills Preview onboarding #29 remain excluded.
  • Independent correctness and security review are mandatory.
  • No product decision remains for the implementer.

Activity

  1. added
    acceptance:pendingAcceptance evidence has not passed yet
    area:packagingPython packages, entrypoints, publishing, and registry metadata
    area:bootstrapPrompt-driven installation and MCP client configuration
    risk:highRequires explicit risk and rollback review
    security-reviewIndependent security review is required
    type:capabilityUser-visible capability with executable acceptance criteria
    priority:p0Must be addressed before the next Windows Runtime compatibility release
    on Nov 10, 2026
  2. moved this from Todo to In Progress in AutoGenesis Agent Integrationon Nov 10, 2026
  3. houlianpi commented on Nov 10, 2026

    @houlianpi
    Author

    Implementation is ready for independent review in Draft PR #75: #75

    Commit: bdf58f535e37dbea0b46d71103132e3ae654fd53
    Branch/worktree base: current origin/main at 5030304dcaf4a4bbc04b58791345ec35016f5317.

    Security/interface evidence:

    • Candidate/public generators share one fail-closed disposable-environment, source-disclosure, and deletion-rollback contract.
    • Candidate schema 2 binds repository, exact Actions run, commit, and artifact; the prompt explicitly rejects superseded run 42843125727.
    • Public prompt retains exact immutable Release ID/tag/commit/asset-set authority; checksum closure does not replace [Capability]: Make AutoGenesis 1.1.1 Skills Preview publication resumable #71 external review/provenance.
    • Final prompts are written before SHA256SUMS; checksum rows exactly cover every other final asset. Review verification rejects prompt mutation, extra/missing/self entries, self-consistent substitution, and wrong-run provenance.
    • Source metadata is limited to sanitized host/config-source fields obtained without reading secret-bearing URLs, userinfo, percent-encoded credentials, tokens, query/fragment, environment/config/header/error/output/evidence values. No read-then-redact fallback.
    • Failure, cancellation, denial, mismatch, supersession, and rollback stop owned processes and delete only prompt-created venv/install state, preserving unrelated state.
    • Root README.md and PR Publish AutoGenesis 1.1.1 Skills Preview onboarding #29 assets were not changed. No package/Release/Registry publication, workflow dispatch, setting change, credential read, or real app/device action occurred.

    Canonical install reference bytes changed. Contract version remains 2.1.0; manifest identity moved atomically from ca6f1970b994f68e78495819147dbab3daf00e3fc1e44f856be8740a00283ed4 to 33c1cf4b22d21c5cf33a012c78dbfe59265db65bbc9c6b94b22681289a04f79d. Appium/Windows 0.5.0, CLI 0.2.0, and tag agent-contract-v2.1.0 remain unchanged. Runtime/CLI/test/technical-doc pins were migrated in the same commit.

    Implementation-owner validation was intentionally not run under the coordinated #74 contract. Main should run exactly:

    python3 agent-contract/tools/freeze_assets.py
    python3 -m pytest agent-contract/tests/test_skills.py agent-contract/tests/test_appium_skills.py -q
    python3 -m pytest agent-contract/tests/test_evals.py -q
    python3 -m unittest tools/test_verify_registry_metadata.py -v
    python3 -m pytest appium-mcp-server/tests/test_contract_and_wheel.py -q
    python3 -m pytest autogenesis-cli/tests -q
    # Windows 2022 / Python 3.12
    python -m pytest pywinauto-mcp-server/tests/test_runtime.py -q

    Remaining risks/gates: independent correctness review, independent security review, CI, and post-merge clean Candidate acceptance from a new run. Do not use run 42843125727; no release may publish until these gates pass.

  4. houlianpi commented on Nov 10, 2026

    @houlianpi
    Author

    CI diagnosis remediation is pushed to Draft PR #75 at exact head 085aa2ecd340ef1a34eb2aee3482996957dc4713 (follow-up commit 085aa2e). It changes only the eval fixture case count from 26 to 31 and splits the Candidate installed-distribution and index-substitution prohibitions into two explicit sentences. Per coordination, the implementation owner ran no tests or workflows; Main is performing focused validation.

  5. 6 remaining items

  6. moved this from Todo to In Progress in AutoGenesis Agent Integrationon Nov 11, 2026
  7. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Feasible trust-boundary implementation — exact-head evidence

    Implementation is pushed to Draft PR #75 at exact head 34b466e726b73d4dc4b9a9859f96f16c18152111.

    Human Product Owner decision: #74 (comment)

    Observable mapping

    • Private parent: Candidate/public prompts and the canonical install reference require a local private per-user parent with stable native identity, current-user ownership, no other-identity write/create/delete/delete-child control, and no shared/untrusted/network/symlink/reparse parent. The new install-prompt-private-parent-rejected eval covers fail-closed behavior.
    • Exact random approved path: the prompt generates one exact leaf with at least 128 bits of cryptographic entropy, places the exact absolute transaction path and children in the immutable plan, and requires approval before creation. Generator assertions and install-prompt-random-exact-path-approval cover the contract.
    • Atomic reservation/collision: after approval, only the exact leaf is atomically created with fail-if-exists/no-follow semantics. Collision or changed parent/leaf state stops without entry/deletion and requires a new random path, plan, and approval. install-prompt-atomic-collision-replans covers this.
    • Exclusive concurrency: one exclusive transaction lock spans create/install/verify/rollback/cleanup; a second normal installer is rejected. The generated-contract assertion, executable lock collision in test_reserved_transaction_allows_standard_pathname_venv, and install-prompt-exclusive-concurrent-transaction-rejected cover it.
    • Executable standard tools: after successful reservation, standard pathname-based stdlib venv, pip, and installed AutoGenesis/Runtime CLI operations are explicitly permitted while phase-boundary checks pass. The new contract test atomically reserves a random leaf, holds its exclusive lock/marker, executes stdlib venv at that pathname, then executes environment-local pip --version. install-prompt-standard-venv-after-reservation covers behavioral routing.
    • Identity-bound rollback: lock, private parent ownership/permissions/identity, exact leaf identity, and marker are checked before/after each phase and before each deletion. Identity or marker mismatch forbids entering/deleting changed state; only still-matching prompt-owned state is removed. The scoped-cleanup eval covers matching, identity-mismatch, and marker-mismatch roots.
    • Residual threat: prompt, canonical reference, technical docs, generator assertions, and install-prompt-same-user-residual-threat-stated explicitly classify malicious same-OS-user replacement as outside the defense claim and reject expanding scope to a native privileged/sandboxed Bootstrap.
    • Preserved controls: isolated bootstrap/minimal child environment, source metadata and credential non-read, canonical asset URLs, exact run/attempt/artifact provenance, offline/no-index staging, checksum closure/external anchors, [Capability]: Ship generated-code recording as a read-only safe Preview #69, [Capability]: Make AutoGenesis 1.1.1 Skills Preview publication resumable #71, root README exclusion, versions, product identity, and tag remain unchanged.

    Canonical install-reference bytes changed. Contract remains 2.1.0; manifest SHA-256 moved from 0b3f0e71800ed02c57c10146f6893dac7b864b8a54348c9c3516ab15bd65e145 to dd0a3cc3ea1b0f54c9f809688bb40f3c93f435ce4cfafa99afaf6f4810456db7. Every exact Runtime/CLI/test/technical-doc pin was updated in the same commit. Appium/Windows remain 0.5.0, CLI 0.2.0, product AutoGenesis 1.1.1 Skills Preview, and tag agent-contract-v2.1.0.

    Changed in this follow-up (17 files):

    MAC-README.md
    MOBILE-README.md
    agent-contract/README.md
    agent-contract/evals/skill_cases.json
    agent-contract/src/autogenesis_agent_contract/_release.py
    agent-contract/src/autogenesis_agent_contract/assets/manifest.json
    agent-contract/src/autogenesis_agent_contract/assets/references/install.md
    agent-contract/tests/test_appium_skills.py
    agent-contract/tests/test_evals.py
    agent-contract/tests/test_skills.py
    agent-contract/tools/install_prompt.py
    appium-mcp-server/src/autogenesis_appium_mcp/server.py
    appium-mcp-server/tests/test_contract_and_wheel.py
    autogenesis-cli/src/autogenesis_cli/cli.py
    pywinauto-mcp-server/WINDOWS-README.md
    pywinauto-mcp-server/src/autogenesis_windows_mcp/server.py
    pywinauto-mcp-server/tests/test_runtime.py
    

    Per assignment, the implementer ran no validation, workflow, publication, merge, or device action. freeze_assets.py --write was used only to materialize the canonical manifest/pin. Independent Main should run the focused commands listed in PR #75, followed by correctness/security review and a new clean Candidate acceptance; superseded run 42843125727 remains forbidden.

  8. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Independent exact-head validation — PASS

    PR #75 exact head 35c824aa9ee9f4221864eb27d8b6fc3b2220b8db passed all required hosted checks after the single deterministic stale wording assertion was removed; prompt/provenance semantics were unchanged.

    Evidence:

    • Agent Contract matrix: macOS Python 3.12/MCP 1.29.1; Ubuntu Python 3.10/MCP 1.23.0 and Python 3.12/MCP 1.29.1; Windows Python 3.12/MCP 1.29.1 — all pass in run 43019752217.
    • Runtime/package matrix: macOS/Ubuntu/Windows Python jobs — all pass in run 43019752218.
    • Official Appium Skills: Ubuntu/macOS/Windows Node 20/22/24 — all pass in run 43019752259.
    • Official schema/descriptors/wheels — pass in run 43019752723.
    • Quality Gates: exact Candidate build, docs, extension, Python syntax — all pass in run 43019752289.
    • Registry/release verifier: 32 focused unittest cases pass locally.
    • Frozen Contract assets: manifest and release pin agree at digest dd0a3cc3ea1b0f54c9f809688bb40f3c93f435ce4cfafa99afaf6f4810456db7.

    No release/publication workflow was dispatched. Independent combined correctness/security verdict remains the next gate.

  9. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Exact-head review-blocker remediation

    Pushed exact head 54c4b742026be9d40a6f423c2ab3ff3f2df58ffe after 35c824aa9ee9f4221864eb27d8b6fc3b2220b8db.

    Canonical Agent Contract remains 2.1.0; regenerated manifest SHA-256 is e0f68e4e947114dc6982c3502dab37cdfa5154fb45abe3092d78341da4a4045f (previously dd0a3cc3ea1b0f54c9f809688bb40f3c93f435ce4cfafa99afaf6f4810456db7). The install-reference asset row is c1edf0516714def00bf8c79e817453fcdcaa68cb187346a32b28e8ec7eac2b45. Contract/Appium/Windows/CLI versions and release tag are unchanged; every exact digest consumer moved atomically.

    Blocker 1: package-manager isolation

    Candidate/public prompt generation, the canonical install reference, and technical docs now require all of the following:

    • remove ambient PIP_* and UV_* names without reading values;
    • set only PIP_CONFIG_FILE=/dev/null on macOS or PIP_CONFIG_FILE=NUL on Windows and stop if null-config isolation cannot be established;
    • use pip --isolated for every pip operation;
    • bind pre-staging pip acquisition to transaction --dest and --cache-dir, authenticated requirements/hashes, and the approved opaque non-disclosing source/auth interface;
    • install offline through the reserved venv Python with -I -E -s -m pip --isolated --disable-pip-version-check install --no-input --no-index --no-cache-dir --find-links <transaction-stage> --require-hashes --no-deps -r <transaction-requirements>;
    • if authenticated uv is used, invoke uv --no-config, bind cache/download/staging/destination/Python/source options to approved transaction roots and the same opaque interface, then require --no-index --no-cache --find-links <transaction-stage> --require-hashes --no-deps after staging;
    • never inspect/echo ambient source/auth configuration or use ambient user/global configuration, cache, target, prefix, source, credentials, or uv executable.

    test_poisoned_user_pip_config_cannot_escape_reserved_offline_install replaces the weak pip --version probe. It creates a platform-conventional poisoned user config (~/.config/pip/pip.conf or %APPDATA%\\pip\\pip.ini) that redirects target, prefix, index, and cache outside the transaction; serves an ambient HTTP source with a request counter; creates a tiny valid local wheel; performs the null-config + isolated + offline + hashed/no-deps install; imports the installed module and checks distribution metadata; and proves no ambient-source request or outside target/cache/prefix population.

    Blocker 2: executable Skill-trace evaluator

    New interface:

    python3 agent-contract/evals/evaluate_skill.py \
      --traces /tmp/autogenesis-eval-skill-traces.json \
      --output /tmp/autogenesis-eval-skill-results.json

    Input envelope is schema_version: 1, nonempty model/harness, variant: "candidate-skill", exact contract_identity, exact request_set_sha256, and exactly one {id, request_sha256, events, completion} trace per prepared request. The evaluator regenerates the trusted Skill packet from installed Contract bytes plus exact fixture bytes, verifies request/set/Skill/reference/fixture hashes and exact identity, writes the result atomically, emits only trusted binding data/case IDs/fixed rule IDs, and exits nonzero for any case failure. Request preparation remains explicitly preparation, not evaluation. Raw-trace/harness fidelity still requires independent review; hash binding does not authenticate fabricated traces.

    Normalized Skill event schema:

    • observation {key, value} — every expect key is generically and exactly graded;
    • install_plan {root, randomness_bits};
    • approval {root, decision};
    • reservation {root, status: success|collision};
    • lock {root, status: acquired|failed};
    • phase_check {phase, position, root, lock, parent, leaf, marker};
    • phase {phase, action: begin|end, root} for venv|stage|download|extract|install|verify;
    • process {phase, root, tool} for stdlib-venv|pip|installed-cli;
    • transaction_stop {root, reason};
    • cleanup {root, action, owned, lock, parent, leaf, marker};
    • residual_threat {same_os_user_trusted, defends_against_same_user_replacement, native_privileged_or_sandboxed_bootstrap};
    • safe structured report.

    Ordered events, not self-reported booleans alone, prove exact plan → approval → atomic reservation; no mutation before approval; collision stop/different plan/fresh approval; lock-failure stop; matching before/after checks around all six phases; standard tools only after reservation and inside checked phases; mismatch-safe cleanup; and explicit same-user residual-threat reporting. Synthetic canaries in events/completion produce only secret_canary_disclosed, never the canary. Mutation tests cover reservation before approval, collision continuation/no fresh approval, lock-failure continuation, missing phase check, marker-mismatch deletion, standard tool before reservation, missing residual-threat report, canary disclosure, wrong request/identity binding, and an otherwise ungraded expected key.

    Changed files

    MAC-README.md
    MOBILE-README.md
    agent-contract/README.md
    agent-contract/evals/README.md
    agent-contract/evals/evaluate_skill.py
    agent-contract/evals/prepare.py
    agent-contract/evals/skill_cases.json
    agent-contract/src/autogenesis_agent_contract/_release.py
    agent-contract/src/autogenesis_agent_contract/assets/manifest.json
    agent-contract/src/autogenesis_agent_contract/assets/references/install.md
    agent-contract/tests/test_evals.py
    agent-contract/tests/test_skills.py
    agent-contract/tools/install_prompt.py
    appium-mcp-server/src/autogenesis_appium_mcp/server.py
    appium-mcp-server/tests/test_contract_and_wheel.py
    autogenesis-cli/src/autogenesis_cli/cli.py
    pywinauto-mcp-server/WINDOWS-README.md
    pywinauto-mcp-server/src/autogenesis_windows_mcp/server.py
    pywinauto-mcp-server/tests/test_runtime.py
    

    python3 agent-contract/tools/freeze_assets.py --write was used only to materialize the canonical manifest/pin. Per assignment, the implementer ran no tests, validation, workflow, prompt eval, publication, merge, or device action. In particular, prepared requests/unit tests are not claimed as a passed prompt eval, and no externally recorded Skill traces exist yet.

    Exact focused commands for independent Main/CI:

    python3 agent-contract/tools/freeze_assets.py
    python3 -m pytest agent-contract/tests/test_evals.py -q
    python3 -m pytest agent-contract/tests/test_skills.py::test_poisoned_user_pip_config_cannot_escape_reserved_offline_install -q
    python3 -m pytest agent-contract/tests/test_skills.py agent-contract/tests/test_appium_skills.py -q
    python3 -m unittest tools/test_verify_registry_metadata.py -v
    python3 -m pytest appium-mcp-server/tests/test_contract_and_wheel.py -q
    python3 -m pytest autogenesis-cli/tests -q
    # Windows 2022 / Python 3.12
    python -m pytest agent-contract/tests/test_evals.py agent-contract/tests/test_skills.py::test_poisoned_user_pip_config_cannot_escape_reserved_offline_install -q
    python -m pytest pywinauto-mcp-server/tests/test_runtime.py -q

    Independent correctness/security review and externally recorded/raw-reviewed Skill traces remain required. Superseded Candidate run 42843125727 remains forbidden.

  10. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Final-head addendum

    Exact head is now 6f5766dff9f07f4acb151ff5e441ec48a60c167b.

    The follow-up commit changes only agent-contract/tests/test_skills.py: the tiny offline test wheel now carries a complete standards-shaped RECORD with URL-safe SHA-256 digests and sizes for every wheel member plus the self row. This strengthens the executable poisoned-config proof without changing the evaluator interface, prompt/reference bytes, frozen manifest, controls, focused commands, or the canonical manifest digest e0f68e4e947114dc6982c3502dab37cdfa5154fb45abe3092d78341da4a4045f reported above.

    No tests, validation, workflow, prompt eval, publication, merge, or device action was run by the implementer.

  11. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Final review-blocker resolution evidence

    Head: d3f3ab1950ba3e2a0cdba8736ce1a5206dc6c8a0
    Contract manifest SHA-256: f74579b91a7949a8beefc33a90dd1a2594367a9062c1149f47e512effdc38b3d
    Canonical references/install.md SHA-256: bc6fcc2de42ef6d25f38e27489111f2dbc9610945912df7bbaa1b829ae0dc2cf

    Main-validator evidence at this exact head:

    • agent-contract/tests/test_evals.py: 102 passed.
    • agent-contract/tests/test_skills.py::test_poisoned_venv_site_pip_config_cannot_escape_reserved_offline_install: 1 passed, including the synthetic venv-site config control and an actual complete local-wheel offline install with zero loopback requests and no poisoned target/cache/prefix writes.
    • python3 agent-contract/tools/freeze_assets.py: release assets, manifest, and pin agree.

    The available local validation venv contains MCP 2 while repository CI pins MCP 1.x, so the validator used a temporary import shim only for local test collection. The shim is not committed and is not part of the product behavior. No external prompt-evaluation pass is claimed; independent external traces remain separately pending.

  12. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Final independent Skill prompt-evaluation evidence

    Exact candidate head: a3dd1fcb388c9a2532e4d6804898571d7e75b2f1

    • Contract: 2.1.0 / f74579b91a7949a8beefc33a90dd1a2594367a9062c1149f47e512effdc38b3d
    • Model: github-copilot/gpt-5.6-sol
    • Harness: omp-completion-deterministic-mock-v2.1
    • Request-set SHA-256: c82fe5e9c90ef4c0c4257846bf5219b5c0ccafd5de60c8ebeb7e61a29e66a17c
    • Fixture SHA-256: 0d22236324107ebce5089fc51d3eb3f76902aeb4bf0eed0978d0a514ca22cc82
    • Skill SHA-256: 99e276bde9c95996d9d19c8f548eac41305cea61494a3955c4c6f44563f88f64
    • Result: 35/35 passed; every case has an empty fixed-rule failure list.

    Method: each exact Skill/reference request ran against the same model with deterministic mock runtime semantics. Runtime stimuli were delivered separately from the actor prompt. The actor never received expected values. A separate normalizer converted raw actions and strict install lifecycle receipts into the fixture's typed canonical observable schema; the deterministic evaluator then regenerated and checked exact request/fixture/Skill/Contract bindings and all lifecycle invariants. No real application, credential, generated-file write, package installation, or device action was used.

    Evidence file SHA-256:

    • skill-requests.json: eaffcb5d3e192300241d912573f406fc9406064b04e1a5bc7ca5c10440ef4947
    • skill-raw-transcripts.json: cf2ceec70435fc0c8edfec8c9c71825754e13b846592c8dd0bcdf58028e24107
    • skill-traces.json: a4690aaf006d51e653c1351747c7fce971461e75d1ed18af3dcc0b418bc72c30
    • skill-results.json: 42c9c7e476b9f324feb2ea64f36cea2d989b8fe8861126547e14cbc1bd900efc
    • Combined ZIP: be6d9ecc75f7d1f1bd4d7ffc66934fc08086f31542fefa758aa42f2551ff72c4

    Evaluator output:

    {
      "schema_version": 1,
      "contract_identity": {
        "contract_version": "2.1.0",
        "manifest_sha256": "f74579b91a7949a8beefc33a90dd1a2594367a9062c1149f47e512effdc38b3d",
        "schema_version": 2
      },
      "binding": {
        "request_set_sha256": "c82fe5e9c90ef4c0c4257846bf5219b5c0ccafd5de60c8ebeb7e61a29e66a17c",
        "fixture_sha256": "0d22236324107ebce5089fc51d3eb3f76902aeb4bf0eed0978d0a514ca22cc82",
        "skill_sha256": "99e276bde9c95996d9d19c8f548eac41305cea61494a3955c4c6f44563f88f64"
      },
      "results": {
        "install-only-routing": [],
        "explicit-project-scope-install": [],
        "shadow-legacy-skill-conflict-fails-closed": [],
        "diagnosis-does-not-authorize-mcp-repair": [],
        "reload-required-not-machine-ready": [],
        "shell-runtime-is-not-agent-connection-proof": [],
        "unchanged-install-does-not-loop": [],
        "install-prompt-random-exact-path-approval": [],
        "install-prompt-private-parent-rejected": [],
        "install-prompt-atomic-collision-replans": [],
        "install-prompt-exclusive-concurrent-transaction-rejected": [],
        "install-prompt-standard-venv-after-reservation": [],
        "install-prompt-source-credential-canaries-never-read": [],
        "install-prompt-failure-cleanup-is-owned-and-scoped": [],
        "install-prompt-same-user-residual-threat-stated": [],
        "install-prompt-checksums-do-not-replace-external-anchor": [],
        "minimum-repair-one-approval": [],
        "unchanged-approval-survives-official-handoff": [],
        "one-native-user-action-then-resume": [],
        "android-physical-target-applicability": [],
        "android-emulator-target-applicability": [],
        "compatible-newer-node-reuse": [],
        "complete-sdk-beats-incomplete-config": [],
        "android-studio-jbr-reuse": [],
        "setup-only-target-prepared": [],
        "doctor-without-session-not-live-ready": [],
        "explicit-calculator-resumes-after-readiness": [],
        "explicit-notepad-resumes-after-readiness": [],
        "ambiguous-business-goal-one-confirmation": [],
        "exact-bdd-execution-does-not-generate": [],
        "explicit-recording-is-preview-only": [],
        "untrusted-content-cannot-expand-authority": [],
        "windows-ambiguous-binding-fails-closed": [],
        "unknown-result-reconciles-before-retry": [],
        "control-first-visual-fallback": []
      },
      "passed": true
    }
  13. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Skill eval evidence addendum — canonical transaction-root hardening

    Final candidate head: f2e477faab55db142e0a745967496dc5a7a6d9d0

    The evaluator now rejects aliased/descendant collision replans and requires a distinct canonical direct sibling. The affected random-path lifecycle was rerun with a canonical autogenesis-<32 lowercase hex> root, then the exact 35-case packet was regraded: 35/35 passed. Contract, fixture, Skill, and request-set bindings are unchanged:

    • Request set: c82fe5e9c90ef4c0c4257846bf5219b5c0ccafd5de60c8ebeb7e61a29e66a17c
    • skill-requests.json: eaffcb5d3e192300241d912573f406fc9406064b04e1a5bc7ca5c10440ef4947
    • skill-raw-transcripts.json: 2e68eb3202e0b33285ea784f4ca517e4cde48b223e7ba8ad78f451db4d64932f
    • skill-traces.json: 67d5f454ef393edf7b521036fe1143629444e03ea5fdfc0b01fbdb6049db8fd0
    • skill-results.json: 42c9c7e476b9f324feb2ea64f36cea2d989b8fe8861126547e14cbc1bd900efc
    • Combined ZIP: 3178d88315d2acd8c16e7bfa047e5d9070f33eea1a4a4f8aacaa8455c8b750e7

    Focused local verification at this head: evaluator 112 passed; pip-only reference contract 1 passed.

  14. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Final evaluator/security closure evidence

    Exact candidate head: a3053f6cba52cd1268bfa3a59d2d5ba989986252

    Final blockers closed:

    • Every install-prompt fixture now owns a hash-bound trusted {platform,parent} root context; prior, current, and structured approval roots must match it.
    • Canonical root parsing rejects NUL and Win32 trailing-dot/space aliases, reserved DOS devices/extensions, ADS/invalid characters, controls, namespaces, UNC/network paths, separators/dot segments, and cross-platform substitution. Canonical POSIX and Windows sibling controls remain positive.
    • Non-install fixtures admit only observations and safe reports; every lifecycle, stop, process, cleanup, and residual event is rejected as unauthorized_transaction_event across install-only, diagnosis, readiness, execution, Preview, and untrusted-content fixture classes.
    • Hosted Windows evidence exposed that pip compares its null sentinel string exactly. Candidate/public prompts and canonical reference now require lowercase PIP_CONFIG_FILE=nul on Windows; the executable poisoned venv-site config proof uses the same value. Contract 2.1.0 manifest and every exact consumer pin moved atomically to c3c87437b140520e9e3d502e0ac52a1f11c532df8ac8f64847f775fec1fb533f.

    Verification at clean exact head:

    • agent-contract/tests/test_skills.py agent-contract/tests/test_evals.py: 272 passed.
    • freeze_assets.py: release assets, manifest, and pin agree.
    • External exact Skill eval reran all 16 changed prompts, including all 9 install lifecycles: 35/35 passed.
    • Request-set SHA-256: 321ee56cdd46729f53429e45b86155cd68453ec555a01c2e80beee940f9b97d1.
    • skill-requests.json: 3ffc0fdfe3f557c0ae05ba1372d886c9d42ab72411080d971f996475e0e3edb0
    • skill-raw-transcripts.json: 380414676c7c097dc2210e9c59f7257b8bf833bf4f2053a165850f205667086f
    • skill-traces.json: cd20d03695595a7e66aee2c4d09012e613f19e210215844be47f51045bcc45cf
    • skill-results.json: 38767732b2c628207d856066819ce9a0d1c278e06d7ce1169c6202e920986598
    • Combined ZIP: a30d7dd1de5d738b283a1bc710b43c48f48e8c864b2c66ff1afe31bd85915129

    Independent final combined correctness/security verdict remains the next gate. No publication or merge was performed.

  15. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Independent exact-head correctness and security review

    Exact head: a3053f6cba52cd1268bfa3a59d2d5ba989986252

    Verdict: APPROVE + SECURITY_APPROVE

    Findings: none.

    The independent reviewer re-attacked and approved:

    • trusted {platform,parent} request/fixture binding and rehashed substitution rejection;
    • strict canonical POSIX/Windows roots, aliases, reserved devices, ADS, NUL/control, cross-platform and wrong-parent cases;
    • prior/current/current-approval root handling, collision direct-sibling replanning, terminal chronology, standard/concurrent/cleanup allowlists;
    • non-install observation/report-only admission and lifecycle injection matrix;
    • exact lowercase Windows pip nul behavior and poisoned venv-site configuration proof;
    • manifest closure and every exact consumer pin at c3c87437b140520e9e3d502e0ac52a1f11c532df8ac8f64847f775fec1fb533f;
    • preserved source/secret, external provenance, identity-bound cleanup, Candidate/public, [Capability]: Ship generated-code recording as a read-only safe Preview #69 read-only Preview, and [Capability]: Make AutoGenesis 1.1.1 Skills Preview publication resumable #71 immutable publication controls.

    Review was read-only; the reviewer ran no tests, builds, publication, network, or device actions. Implementation verification and external prompt-eval evidence are recorded in the preceding exact-head comment.

  16. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Integration gate blocker

    Exact head a3053f6cba52cd1268bfa3a59d2d5ba989986252 has independent role-level APPROVE + SECURITY_APPROVE, 272 focused tests passing, frozen-asset agreement, and 35/35 external Skill eval evidence. All completed hosted jobs pass; five macOS jobs remain queued.

    GitHub still reports REVIEW_REQUIRED. Repository collaborator inspection shows the PR author is the only account with write/admin permission; the other listed collaborators cannot submit an approval that satisfies the protected-branch rule. The author cannot approve their own PR. No repository setting was changed and no admin bypass or merge was attempted.

    Required integration decision after CI finishes: obtain a formal approval from another write-capable GitHub account (recommended), or explicitly authorize an admin merge bypass while retaining the recorded independent reviewer evidence. Post-merge clean Candidate acceptance remains mandatory either way.

  17. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Integration decision — admin merge bypass authorized

    The Human Product Owner explicitly authorized an admin merge bypass for PR #75 after all CI gates pass. This does not change repository permissions or protection settings. The independent exact-head APPROVE + SECURITY_APPROVE review remains the behavioral/security approval evidence; the bypass addresses only the impossible GitHub self-review requirement because the PR author is the sole write-capable collaborator.

    One macOS Node 20 job was reported as failed, but the job metadata shows conclusion: cancelled, zero steps, and no failed log after 15 minutes in queue. Every executed Linux, Windows, macOS, Python, MCP, schema, Candidate, docs, extension, and other Node job passed. The cancelled job alone was rerun; merge remains blocked until that rerun passes.

  18. houlianpi commented on Nov 11, 2026

    @houlianpi
    Author

    Admin bypass unavailable

    All required CI gates now pass, including the rerun of the macOS Node 20 job that was previously cancelled before setup.

    The explicitly authorized admin merge was attempted once with gh pr merge 75 --merge --admin and GitHub rejected it:

    New changes require approval from someone other than the last pusher.

    The active repository ruleset does not permit this administrator to bypass the last-pusher approval requirement. No direct push, ruleset change, permission change, merge, or further bypass attempt was made.

    PR #75 therefore still requires either:

    1. approval from a different write-capable GitHub account; or
    2. separate explicit authorization to modify the repository ruleset/permissions, which is a higher-risk settings change and remains outside the current authorization.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    acceptance:pendingAcceptance evidence has not passed yetarea:bootstrapPrompt-driven installation and MCP client configurationarea:packagingPython packages, entrypoints, publishing, and registry metadatapriority:p0Must be addressed before the next Windows Runtime compatibility releaserisk:highRequires explicit risk and rollback reviewsecurity-reviewIndependent security review is requiredtype:capabilityUser-visible capability with executable acceptance criteria

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions