From 910539b8c27b1cd30bd5e5826a795d5a540c2c17 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:09:04 +0800 Subject: [PATCH 01/15] fix: dispatch Agnir bootstrap by Project truth --- plugin/skills/svif/SKILL.md | 62 ++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/plugin/skills/svif/SKILL.md b/plugin/skills/svif/SKILL.md index 45fc45b..c4bc678 100644 --- a/plugin/skills/svif/SKILL.md +++ b/plugin/skills/svif/SKILL.md @@ -9,41 +9,59 @@ Use Svif as an execution discipline for real Project work. Prefer completing con ## 1. Discover and activate the Project before acting -### Bootstrap a Project that has no continuity binding +### Bind existing continuity or bootstrap a genuinely new Project -Do not require the user to initialize Agnir separately before Svif can operate an ordinary Project. Before treating a missing Agnir Discovery Record as a discovery failure, first distinguish a genuinely uninitialized Project from a Project whose intended continuity setup is broken. +Do not require the user to initialize Agnir separately before Svif can operate an ordinary Project. Before treating a missing Agnir Discovery Record as a discovery failure, distinguish an existing valid Agnir Project, a partial/broken Agnir Project, a Project intentionally bound to another Continuity Provider, and a genuinely uninitialized Project. -Select exactly one authorized Project root, then inspect the Project-owned surfaces that can establish intent or an existing binding, including `SVIF.yaml`, `AGNIR.yaml`, root `AGENTS.md`, the README, and `.agnir/` when present. If the selected Project has no `SVIF.yaml` continuity binding, no `AGNIR.yaml`, no Agnir activation route or declared Agnir memory, and no Project instruction or durable configuration selecting another Continuity Provider, classify it as a **first-use bootstrap** rather than a discovery failure. +Select exactly one authorized Project root, then inspect Project-owned durable surfaces including `SVIF.yaml`, `AGNIR.yaml`, root `AGENTS.md`, `AGNIR.md`, the README, and `.agnir/` when present. -An explicit Principal request to install/enable Svif for the selected Project, or to invoke Svif to operate that Project after the Plugin has been enabled, authorizes the non-destructive Project files required to establish Svif's founding continuity binding unless stricter Project policy says otherwise. That bootstrap authority does not grant authority for protected external effects. +#### Existing Agnir Project: preserve the declared compatibility line + +If `AGNIR.yaml` exists or durable Project artifacts clearly establish an Agnir binding, do **not** run clean bootstrap merely because a newer Agnir release exists. + +1. Resolve and validate the Project's actual `agnir.version`, `agnir.discovery_profile`, Project identity, lineage/selector semantics when applicable, and declared memory locators before loading durable memory. +2. Dispatch according to the compatibility identifiers the Project actually declares. A valid Core/profile `0.1` Project remains `0.1`; a valid `0.2` Project remains `0.2`; a valid `1.0` Project remains `1.0`. The same rule applies to future supported `x.y` lines. Installing or discovering a newer Agnir distribution is **not** authorization to migrate or relabel compatibility. +3. If `SVIF.yaml` is absent and Svif setup is authorized, create a minimal `project-binding/0.2` binding that reuses the exact Agnir Project identity and binds `continuity.provider: "agnir"`, `compatibility` equal to the existing `agnir.version`, `profile` equal to the existing `agnir.discovery_profile`, and discovery `"AGNIR.yaml"`. +4. If `SVIF.yaml` already exists, require its Agnir compatibility/profile/identity to agree with the existing Agnir Project. A mismatch is a repair/binding case, not permission to choose whichever version is newer. +5. An operational Agnir package upgrade and a Core/profile compatibility migration are different operations. Neither is implied by installing or invoking Svif. + +Do not treat partial or contradictory Agnir/Svif artifacts as a clean first-use bootstrap. If durable surfaces show that the Project already intends to use Agnir but activation/discovery is incomplete, broken, unsupported, or inconsistent, enter repair and preserve the applicable Agnir failure class. Do not silently replace that Project with a newly initialized latest-version Project. -For the current repository/filesystem founding path, bootstrap the Project in this order: +If `SVIF.yaml` or another durable binding intentionally selects a different Continuity Provider, do not overwrite it with Agnir. Use the configured provider when supported or surface a binding/support blocker. + +#### Genuinely uninitialized Project: resolve the latest published stable Agnir + +Only when the selected Project has no `SVIF.yaml` continuity binding, no `AGNIR.yaml`, no Agnir activation route or declared Agnir memory, and no durable configuration selecting another Continuity Provider, classify it as a **first-use bootstrap**. + +An explicit Principal request to install/enable Svif for the selected Project, or to invoke Svif to operate that Project after the Plugin has been enabled, authorizes the non-destructive Project files required to establish Svif's founding continuity binding unless stricter Project policy says otherwise. That bootstrap authority does not grant authority for protected external effects. -1. Establish one stable Project identity. Reuse an existing durable Project identity when one is already authoritative. Otherwise generate a new UUID-based URN such as `urn:uuid:` and persist exactly the same identity in both the Agnir Discovery Record and the Svif Project Binding. -2. Initialize the Agnir `repository-filesystem/0.1` continuity contract inside the selected Project root using Agnir Core `0.1`: create top-level `AGNIR.yaml`; create `.agnir/state.md`, `.agnir/next-actions.md`, `.agnir/decisions.md`, and `.agnir/evidence/`; persist concise initial Project truth and at least one initialization evidence record; create or update the canonical README `## Agnir Project Instructions`; and install only the minimal Agnir locator in root `AGENTS.md`. -3. Preserve unrelated Project documentation and instructions. If `AGENTS.md` already exists, merge only the minimal locator without deleting, reordering, normalizing, summarizing, or rewriting unrelated instructions. If an equivalent locator exists, remain idempotent. If a material existing instruction conflicts with Agnir activation, surface the conflict to the Principal instead of silently overriding it. -4. Create or validate a minimal repository/filesystem `SVIF.yaml` using `project-binding/0.2`. It MUST use the same stable Project identity and bind `continuity.provider: "agnir"`, compatibility `"0.1"`, profile `"repository-filesystem/0.1"`, and discovery `"AGNIR.yaml"`. Execution and capability bindings may remain empty unless the Project intentionally persists them. -5. Run fresh activation from the selected Project root only: `Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> declared durable memory`. Validate the Agnir identity/profile/version and then validate that `SVIF.yaml` identifies the same Project and continuity binding. -6. Once bootstrap passes, continue the user's original Project task in the same operation. Do not make the user issue a separate Agnir initialization prompt and do not stop merely because the Project started without Agnir. +For a genuinely new repository/filesystem Project: -The bootstrap above is the immutable onboarding contract of the released `v0.2.0-preview.1` distribution. Migrating the Svif repository Project itself to a newer Agnir compatibility line does not retroactively rewrite that released bootstrap baseline. A future Svif distribution may deliberately move first-use bootstrap to Core/profile `0.2`, but that requires its own versioned distribution change and evidence. +1. Resolve the canonical `iorLab/agnir` **latest published stable release** at operation time. "Latest stable" means an actually published non-prerelease tag/Release with immutable source provenance; never substitute moving `main`, another branch, an RC, or an untagged commit. +2. Read that release's package/release metadata, declared Core contract, repository/filesystem profile, activation/install procedure, and schema before mutating the Project. Package SemVer and Core/profile compatibility are distinct version layers: use the Core/profile declared by the resolved stable release rather than deriving compatibility from the package tag string. +3. If the latest stable release cannot be resolved or its required installation contract cannot be obtained through available authorized tools, report a bootstrap capability blocker. **Do not fall back to Core/profile `0.1`, a cached historical baseline, model memory, or moving `main` and call that latest.** +4. Establish one stable Project identity and initialize Agnir according to that resolved release's install contract. Persist the release-declared Core/profile exactly, including logical lineage and selector/binding semantics when that compatibility line requires them. Use the release's canonical activation surface, preserve unrelated Project files/instructions, create the declared durable memory, and record immutable Agnir operational provenance when supported. +5. Create a minimal repository/filesystem `SVIF.yaml` using `project-binding/0.2`. It MUST use the same stable Project identity and bind `continuity.provider: "agnir"`, `compatibility` equal to the newly created `AGNIR.yaml -> agnir.version`, `profile` equal to `AGNIR.yaml -> agnir.discovery_profile`, and discovery `"AGNIR.yaml"`. +6. Run the fresh activation route required by the resolved Agnir release, then validate that `SVIF.yaml` identifies the same Project and exact continuity compatibility/profile. +7. Once bootstrap passes, continue the user's original Project task in the same operation. Do not make the user issue a separate Agnir initialization prompt and do not stop merely because the Project started without Agnir. -This bootstrap behavior consumes Agnir protocol/profile semantics through Svif's founding Continuity Provider integration; it MUST NOT require the Agnir Skill repository, a previous Agnir installation conversation, GitHub, or another execution surface as a runtime prerequisite. A compatible surface may delegate to an available Agnir installer, but successful first use must remain possible from the Svif Plugin procedure itself. +The released `v0.2.0-preview.1` artifact is immutable historical evidence and still contains its original Core/profile `0.1` first-use procedure. Do not move or rewrite that tag. The current unpublished `0.2.0` line deliberately supersedes that historical bootstrap rule: existing Projects preserve their declared Agnir compatibility, while genuinely new Projects resolve the latest published stable Agnir at bootstrap time. -Do not treat partial or contradictory Agnir/Svif artifacts as a clean first-use bootstrap. If any durable surface shows that the Project already intends to use Agnir but activation/discovery is incomplete or broken, enter repair and preserve the applicable Agnir failure class. If `SVIF.yaml` or another durable binding intentionally selects a different Continuity Provider, do not overwrite it with Agnir; use the configured provider when supported or surface a binding/support blocker. If the current execution surface cannot perform the required non-destructive Project writes, report that bootstrap capability blocker rather than pretending that pre-initialization was a user prerequisite. +This bootstrap behavior MUST NOT require a preinstalled Agnir Skill, a previous Agnir installation conversation, or predecessor-private memory. Resolving latest stable may read canonical Agnir release and contract artifacts through available authorized tools. If that resolution is unavailable, surface the blocker instead of inventing a version. A compatible surface may delegate installation to an available Agnir installer, but Svif remains responsible for selecting the correct existing-vs-new branch and verifying the resulting Project binding. -For an Agent-operable Agnir Project using a supported repository/filesystem profile, the durable activation route is mandatory before normal Project work: +If the current execution surface cannot perform the required non-destructive Project writes or latest-stable resolution, report that bootstrap capability blocker rather than pretending that pre-initialization was a user prerequisite. -`Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> declared durable memory` +#### Activate according to the Project's installed Agnir contract -Agnir Agent activation and Core discovery are distinct layers. When this Skill is operating an Agent-operable Project under a supported repository/filesystem profile, treat the durable `AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml` route as part of the Project activation contract, not as an optional convenience. Validate that the route is present, points to the canonical README Agnir section, and contains no unresolved material instruction conflict before treating Agent activation as healthy. The fact that the current Agent can directly open `AGNIR.yaml` MUST NOT be used to bypass a missing, stale, contradictory, or predecessor-private activation route or to claim that a fresh Agent can resume from the Project root. +For an Agent-operable Agnir Project, the durable activation route required by that Project's compatible Agnir installation is mandatory before normal Project work. Do not infer the activation route from the newest available version; follow Project-owned activation artifacts and operational provenance. -Do not validate activation by heading/link presence alone. The canonical README `## Agnir Project Instructions` section itself MUST satisfy the current profile activation contract: it must state that the Project uses Agnir for durable continuity and, before Project work, direct a fresh Agent to treat the Project root as the authorized Project Entry Point, read top-level `AGNIR.yaml`, load Current State and Next Actions, load Decisions and Evidence when relevant, prefer durable Agnir Project truth over chat/private Agent memory unless superseded by newer Principal instruction or directly observed current Project fact, and checkpoint material continuity changes at an intentional save/finish boundary. If any required instruction is missing, materially weakened, or contradicted, activation is not healthy even when `AGENTS.md` reaches the correct heading; repair that earliest activation-contract defect when authorized and rerun activation from the Project root. +Supported existing Projects may legitimately use different activation forms. Legacy Core/profile `0.1`, `0.2`, and Agnir `1.0.0` packaging may enter through `Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> declared durable memory`. Newer stable packaging may use `Project root -> AGENTS.md -> AGNIR.md -> AGNIR.yaml -> declared durable memory`, with the README heading retained only as a compatibility locator. Preserve a valid existing route unless an explicit compatible operational upgrade or repair authorizes changing it. -A non-Agent Executor or trusted adapter that is already given the applicable profile implementation may begin discovery at `AGNIR.yaml` as the profile permits. That exception does not silently convert this Agent Skill into a non-Agent activation context. If the Project is intended to be Agent-operable and its durable activation route is broken, surface the activation blocker and repair that earliest invariant when authorized; do not relabel the accidental direct readability of `AGNIR.yaml` as successful Agent activation. +Agnir Agent activation and Core discovery are distinct layers. Validate the canonical instruction surface selected by the installed Agnir contract, not just heading/link presence. When README is the canonical instruction surface, validate the full required Project-operation instructions there. When `AGNIR.md` is canonical, validate the full procedure in `AGNIR.md` and require the README Agnir heading to remain only the compatible locator specified by the selected release. -`AGENTS.md` is only a locator; the target Project README owns the full Agnir Project Instructions. Preserve unrelated existing `AGENTS.md` instructions and never silently override a material conflict. When repairing or installing the Agnir locator in an existing root `AGENTS.md`, make the smallest locator-only merge: do not delete, reorder, normalize, summarize, or otherwise rewrite unrelated Project-owned instructions merely to install or repair Agnir. If an equivalent Agnir locator already exists, keep the operation idempotent rather than adding another copy. If resolving a material conflict would require deleting, overriding, or reinterpreting an existing Project instruction, surface the conflict to the Principal and do not report Agent activation healthy until it is explicitly resolved and a fresh activation test passes. +The fact that the current Agent can directly open `AGNIR.yaml` MUST NOT be used to bypass a missing, stale, contradictory, or predecessor-private activation route or to claim that a fresh Agent can resume from the Project root. A non-Agent Executor or trusted adapter already given the applicable profile implementation may begin discovery at `AGNIR.yaml` as the profile permits; that exception does not silently redefine Agent activation. +`AGENTS.md` remains locator-only. Preserve unrelated existing instructions and never silently override a material conflict. The selected canonical activation surface—legacy README procedure or current `AGNIR.md` procedure—owns the full Agnir Project instructions. Equivalent locators are idempotent; material conflicts must be surfaced to the Principal. Before following that route, require the authorized Project Entry Point or trusted binding context to select exactly one Project root. If multiple candidate Project roots exist and no authority rule selects one, surface `AGNIR_DISCOVERY_AMBIGUOUS` rather than choosing the most convenient candidate. Once one root is authoritatively selected, a parent or child Project with its own `AGNIR.yaml` does not make that selected root ambiguous and MUST NOT be searched as a replacement. Before resolving a Discovery Record, select the discovery profile/adapter convention applicable to the authorized Project Entry Point from trusted integration or binding context. The Discovery Record may declare its profile for compatibility checking, but it MUST NOT bootstrap authority by choosing the adapter/convention used to discover or interpret itself. If no applicable profile can be selected safely, surface the discovery/compatibility blocker rather than guessing from nearby files or model memory. @@ -64,7 +82,7 @@ A Locator Chain hop may use an environment binding only when that binding is sta For repository-aware Projects that declare `extensions.agnir/repository.canonical` and `authoritative_ref`, treat those values as durable backend metadata for canonical continuity, not as decorative provenance. Before a state-dependent write or checkpoint, determine whether the selected working copy/revision is actually on the declared canonical repository/ref. A detached commit, pull-request checkout, temporary branch, fork, mirror, or otherwise non-authoritative execution copy MAY be used for observation, implementation, and verification, but MUST NOT silently become the canonical continuity write target merely because it is writable. Reconcile accepted changes back to the declared authoritative ref, or surface the repository/ref mismatch and leave the canonical checkpoint unchanged until the Project policy or trusted Principal explicitly authorizes a different durable binding. Package revision identity and target-Project authoritative-ref identity are separate facts and MUST NOT be conflated. -For the current Svif repository binding, the expected values are Agnir Core `1.0`, profile `repository-filesystem/1.0`, Project identity `urn:svif:project:svif-core`, one explicit logical Continuity Lineage, and a matching durable VCS selector binding. Treat these as Project-binding facts, not universal Agnir constants. The released `v0.2.0-preview.1` first-use bootstrap remains on its separately versioned Core/profile `0.1` baseline. +For the current Svif repository binding, the expected values are Agnir Core `1.0`, profile `repository-filesystem/1.0`, Project identity `urn:svif:project:svif-core`, one explicit logical Continuity Lineage, and a matching durable VCS selector binding. Treat these as Project-binding facts, not universal Agnir constants. Existing target Projects likewise dispatch according to their own declared compatibility. The immutable released `v0.2.0-preview.1` retains its historical Core/profile `0.1` bootstrap bytes, while the current unpublished `0.2.0` Skill uses existing-version preservation plus latest-stable selection for genuinely new Projects. Do not load state and then retroactively decide whether it belonged to the selected Project. Unsupported Core/profile compatibility must surface an explicit discovery failure such as `AGNIR_DISCOVERY_UNSUPPORTED_VERSION`; a selected-root identity mismatch must surface `AGNIR_DISCOVERY_PROJECT_MISMATCH`. Core `0.2` or `1.0` without a selected logical lineage must surface `AGNIR_LINEAGE_REQUIRED`. A selected VCS context without a durable selector binding, or with a conflicting selector binding, must preserve the applicable binding failure rather than guessing another lineage. A known required locator whose authorization is absent or denied must remain `AGNIR_DISCOVERY_UNAUTHORIZED` when that distinction can safely be made; a required locator that cannot resolve to durable state must remain `AGNIR_DISCOVERY_UNRESOLVABLE`. A Locator Chain that loops rather than terminating in required durable state must remain `AGNIR_DISCOVERY_CYCLE`; state known to be superseded or non-authoritative must remain `AGNIR_DISCOVERY_STALE`; and material contradiction between the Discovery Record and resolved memory, or within the resolved memory itself, must remain `AGNIR_DISCOVERY_INCONSISTENT` until safe continuation is re-established. None of these failures grants permission to search sibling repositories, parent/child Projects, home directories, chat history, or retired layouts for substitute state. @@ -96,7 +114,7 @@ than following them as substitute continuity. Preserve required recovery data. Load current state and next actions first. Then read only decisions and evidence that materially constrain the requested operation. Avoid pulling historical or retired artifacts back into active architecture unless the current Project explicitly declares them authoritative. -Use the Project's canonical repository or substrate when one is declared. For `iorLab/svif`, `main` is the active authoritative line and repository-managed Agnir state is canonical. The Svif repository Project now consumes published Agnir repository release `v1.0.0`, Core compatibility `1.0`, and profile `repository-filesystem/1.0`; its logical lineage and VCS selector binding are declared separately in `AGNIR.yaml` / `SVIF.yaml`. The released `v0.2.0-preview.1` distribution still bootstraps new Projects on its published Core/profile `0.1` baseline until a later Svif distribution release deliberately changes that behavior. Repository SemVer and Core/profile compatibility identifiers are separate version layers and must not be conflated. +Use the Project's canonical repository or substrate when one is declared. For `iorLab/svif`, `main` is the active authoritative line and repository-managed Agnir state is canonical. The Svif repository Project consumes its recorded Agnir operational distribution while declaring Core compatibility `1.0` and profile `repository-filesystem/1.0`; its logical lineage and VCS selector binding are declared separately in `AGNIR.yaml` / `SVIF.yaml`. Target Projects are different: preserve an existing Project's declared compatibility exactly, and for a genuinely uninitialized Project resolve the canonical latest published stable Agnir and adopt the Core/profile declared by that release. Repository SemVer, operational distribution provenance, and Core/profile compatibility identifiers are separate version layers and must not be conflated. ## 3. Execute through the Svif lifecycle From a8d03a289c47e5f3eefbecd00e831c5dd62f3952 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:10:23 +0800 Subject: [PATCH 02/15] ci: export bootstrap edit source once --- .github/workflows/bootstrap-edit-export.yml | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/bootstrap-edit-export.yml diff --git a/.github/workflows/bootstrap-edit-export.yml b/.github/workflows/bootstrap-edit-export.yml new file mode 100644 index 0000000..411031b --- /dev/null +++ b/.github/workflows/bootstrap-edit-export.yml @@ -0,0 +1,25 @@ +name: Export bootstrap edit source + +on: + push: + branches: + - fix/bootstrap-agnir-version-selection + paths: + - .github/workflows/bootstrap-edit-export.yml + +permissions: + contents: read + +jobs: + export: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + with: + ref: fix/bootstrap-agnir-version-selection + - uses: actions/upload-artifact@v4 + with: + name: svif-bootstrap-edit-source + path: . + include-hidden-files: true + retention-days: 2 From 4f0e47ca4dc02438f6c29d10f0ac01b2bcee20e3 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:18:31 +0800 Subject: [PATCH 03/15] chore: stage bootstrap version-selection patch --- .github/bootstrap-payload.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload.txt diff --git a/.github/bootstrap-payload.txt b/.github/bootstrap-payload.txt new file mode 100644 index 0000000..d590394 --- /dev/null +++ b/.github/bootstrap-payload.txt @@ -0,0 +1 @@ +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 \ No newline at end of file From de583fdf75e675a863044e1c0aeca2b7c2d85818 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:18:48 +0800 Subject: [PATCH 04/15] ci: apply verified bootstrap version-selection patch --- .github/workflows/bootstrap-apply.yml | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 .github/workflows/bootstrap-apply.yml diff --git a/.github/workflows/bootstrap-apply.yml b/.github/workflows/bootstrap-apply.yml new file mode 100644 index 0000000..ccd3a3a --- /dev/null +++ b/.github/workflows/bootstrap-apply.yml @@ -0,0 +1,55 @@ +name: Apply verified bootstrap version-selection patch + +on: + push: + branches: + - fix/bootstrap-agnir-version-selection + paths: + - ".github/workflows/bootstrap-apply.yml" + +permissions: + contents: write + +jobs: + apply: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + with: + ref: fix/bootstrap-agnir-version-selection + fetch-depth: 1 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Decode and apply reviewed patch + shell: bash + run: | + set -euo pipefail + python - <<'PY' + import base64, gzip, hashlib + from pathlib import Path + encoded = Path(".github/bootstrap-payload.txt").read_text(encoding="utf-8").strip() + patch = gzip.decompress(base64.b64decode(encoded, validate=True)) + digest = hashlib.sha256(patch).hexdigest() + print("patch_sha256=" + digest) + assert digest == "c2e75891814da41d7bd933c1fb0b9edbdb078de0526d269e62dd72e919d6c056" + Path("/tmp/bootstrap.patch").write_bytes(patch) + PY + git apply --index --binary /tmp/bootstrap.patch + git rm .github/bootstrap-payload.txt + - name: Verify full candidate + shell: bash + run: | + set -euo pipefail + git diff --check --cached + python checks/check_repository.py + python conformance/check_contracts.py + PYTHONPATH=src python -B -m unittest discover -s tests -v + - name: Publish tested candidate to branch + shell: bash + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git commit -m "fix: select Agnir bootstrap from Project truth" + git push origin HEAD:refs/heads/fix/bootstrap-agnir-version-selection From 310781a251941d933949dcdf00020f2d0e7045ff Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:20:06 +0800 Subject: [PATCH 05/15] chore: stage bootstrap patch part 0 --- .github/bootstrap-payload-0.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-0.txt diff --git a/.github/bootstrap-payload-0.txt b/.github/bootstrap-payload-0.txt new file mode 100644 index 0000000..5f1b90c --- /dev/null +++ b/.github/bootstrap-payload-0.txt @@ -0,0 +1 @@ +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 \ No newline at end of file From 353cf0c2d98cfe80289bb15422ea6a9b65f385e9 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:20:49 +0800 Subject: [PATCH 06/15] chore: stage bootstrap patch part 1 --- .github/bootstrap-payload-1.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-1.txt diff --git a/.github/bootstrap-payload-1.txt b/.github/bootstrap-payload-1.txt new file mode 100644 index 0000000..8942706 --- /dev/null +++ b/.github/bootstrap-payload-1.txt @@ -0,0 +1 @@ +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 \ No newline at end of file From b07b4c9ae7e711d222ceb90267a232f83dcb39a9 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:21:26 +0800 Subject: [PATCH 07/15] chore: stage bootstrap patch part 2 --- .github/bootstrap-payload-2.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-2.txt diff --git a/.github/bootstrap-payload-2.txt b/.github/bootstrap-payload-2.txt new file mode 100644 index 0000000..d825ef7 --- /dev/null +++ b/.github/bootstrap-payload-2.txt @@ -0,0 +1 @@ +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 \ No newline at end of file From 8955d0927155e18e728214454cca8c1dd2c00a2f Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:22:01 +0800 Subject: [PATCH 08/15] chore: stage bootstrap patch part 3 --- .github/bootstrap-payload-3.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-3.txt diff --git a/.github/bootstrap-payload-3.txt b/.github/bootstrap-payload-3.txt new file mode 100644 index 0000000..e3f2b36 --- /dev/null +++ b/.github/bootstrap-payload-3.txt @@ -0,0 +1 @@ ++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 \ No newline at end of file From 6719a03507ceda8b0ed99dbfa8bd7a357eb14b60 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:22:09 +0800 Subject: [PATCH 09/15] ci: reconstruct bootstrap patch from verified chunks --- .github/workflows/bootstrap-apply.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bootstrap-apply.yml b/.github/workflows/bootstrap-apply.yml index ccd3a3a..78dd873 100644 --- a/.github/workflows/bootstrap-apply.yml +++ b/.github/workflows/bootstrap-apply.yml @@ -28,7 +28,7 @@ jobs: python - <<'PY' import base64, gzip, hashlib from pathlib import Path - encoded = Path(".github/bootstrap-payload.txt").read_text(encoding="utf-8").strip() + encoded = "".join(Path(f".github/bootstrap-payload-{i}.txt").read_text(encoding="utf-8").strip() for i in range(4)) patch = gzip.decompress(base64.b64decode(encoded, validate=True)) digest = hashlib.sha256(patch).hexdigest() print("patch_sha256=" + digest) @@ -36,7 +36,7 @@ jobs: Path("/tmp/bootstrap.patch").write_bytes(patch) PY git apply --index --binary /tmp/bootstrap.patch - git rm .github/bootstrap-payload.txt + git rm .github/bootstrap-payload.txt .github/bootstrap-payload-0.txt .github/bootstrap-payload-1.txt .github/bootstrap-payload-2.txt .github/bootstrap-payload-3.txt - name: Verify full candidate shell: bash run: | From db2b4f220e66f965a85488a81649ec644eed9a4b Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:23:19 +0800 Subject: [PATCH 10/15] chore: restage bootstrap patch part 0a --- .github/bootstrap-payload-0a.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-0a.txt diff --git a/.github/bootstrap-payload-0a.txt b/.github/bootstrap-payload-0a.txt new file mode 100644 index 0000000..f8c12c0 --- /dev/null +++ b/.github/bootstrap-payload-0a.txt @@ -0,0 +1 @@ +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 \ No newline at end of file From b379b70a738a92c12f55e26a6118ee5a5d7c4da4 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:23:21 +0800 Subject: [PATCH 11/15] chore: restage bootstrap patch part 0b --- .github/bootstrap-payload-0b.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/bootstrap-payload-0b.txt diff --git a/.github/bootstrap-payload-0b.txt b/.github/bootstrap-payload-0b.txt new file mode 100644 index 0000000..0463abd --- /dev/null +++ b/.github/bootstrap-payload-0b.txt @@ -0,0 +1 @@ +GTJObZMUBBSA8MWW10kTf+62vQNnzdbOKFm3eQWPwWNCow3zckkGAvqCZAf+6oKA4dPrt9x04dcB/CvYxDqjFmXsCyGh5ubKy255oVi03eai41RSjcr4qxG5Ff8ShRJYlAtWbim/BEKJ8KgDpwbn5OHJtlolkOQO6EaA1B3/KiADfNW1A9JKJXRXgR/ScQAGAi9V9Ou0phgEBCigf2CXDQBAkzlpQDpUv8MMDxWhHj8uQd6ziN38B9hlHvHlnktDbcwUpwDh4BDEMUmBJo7GbTZRIIFC5wZsFF3d9ltuQdGRt9Up+HAegjcAqgIOWlOF2SJo7Wd9FKcgPQO77Ra0MEVWjwa2QxaQgJLCGlDmnw54eWo/G60+4NpUAYzdsOcCrQJlL88szC7NzM7NzSzOVmbt+UazXJ6rNCvzy/XKgtNcml1cXFyoSVsThLfQu0GdBIBuu84VUA6LNGaN/gxK9KMK+q7dqopTK3Z3AdngyS5okv/iAeXhogsNr0fugN1/raGegaSDZA/UIN7L08CgCAMNEh8IgQ24dPriCeQC0gARMGCgKzxBArJRASggxFglpmERbfCUO9Z5EKnXSm3bubjJlHnWJxWsOLuwUJyFqayNS0A3wCrnFhZmludnl5YXKzXetYQy8xe/B4xLCeGGGKjlA9xxGHxQ7t46e/Hc2r9Vv3XxqbU8ftGhGeAXGhYPG1kdoQytqVYouNfcHijCbo34C0yImhFiFKAqYLANYFEKih1c4ZPo+l4nZEA2gelto23h4Kg5cmgAy0RslYqVoC2p9ePQQDnAkTqB0wNmnSdIK18MDdtzicE2I1azWEjROse06PhdkKxIPchuSflot4H4AhcUHlivfwUgADpPn7QMwvwzjuN2Q+16ydZoBWoDq6ubPo8oiZi0YfJUxhfkJqbnIrGTRwJtzaZoiuzCEirPaCUHzQ/gP73xSpQQlNLqEbskywg0F//QZFxKYnGamGoS5wPG2vPwoCTLKVqX4O0mMrqz6yzjj0Xyfkc4R9AqJFyUM60SosCjmsxzJhfow/b5Nc0GCCoj+ABOp43cbT8A6SvwhJ0aUQK7jBTZPwHipiUJWlV0WlDeOYnUpTjFTk6tMZpUmFvQqjhs5GiUaJWREtcEXMh8ismhjrvF8EaQWoED5wRoEyCVPUHOTnSuAqb4HYQAujRKl9bOr53ZXKteWjtzbv3C2uYmCP/ailXv0dTqxEARD1HqntVGD+wIhXwvT4NKD3NJylvpUAPg2R65KAQeCVkFaGODat1RhhJ6p+ElPH/SPuaX8stWbm6Z1Q+APXA1VEmRXQjoEloVrQs+HYicGawKBCVbqaZaaODLNrrJvw3mYJomqXVNEFa1cn1mqb5YX3DtmbpTabquu7DcXG4uzi/V3WW7CWS+3JhZWARERUBsCL5FGuX0tB5KndL0dJ4FK+oTiLVnz6+jvw/wBj4B+fjkxmVgb8GV0O+W6Inp6bhTnLgxuaS0ogVok+Iol6CSHFZzEFAO9WqTgYIIRwVLAR3nzQIiVh6lcQmghgYE2Mt2F0wlSc8k3eRk8FyasztPhEoWqIxGPHN2U0Uk2Izu9whsyMjgs4Ak/DpzGEQmpsCGUvfl2Qpz1ddOMuGZTpWI6DL7GmBwlP1px0Zo97Zcwx0iRSGeJ4qsq5249IuYtass1MaIsyBudcUFZPFrgLZlQJtxWG0BoNz2cbSS3fC7IbmStaei3iOvNvy/TrykjwZcJwRJEoDIRLUioNHPI/M72/L7jSbCB+DU8kjgYGQpQHZGgqtonUELgXhtSFr0FiwLmUcJpClo1miwslHR6Lfbu8TigCMTYtitQhNlPYk38nv4jT4786yLXeE0FuYwCA93S9q6uAblbABQAWvtossszf4j/Tpi+MlPhMU3O7ewWJ+bKxaXmuX5xkIj1eJT70RMPfUpctnZGeSy8F9yPZIypv13QjC5KiJYQJO+AVY/bLDjiL0KrxTCg9QO08iaSjgPQS8kLg+w3mCUi/kQ0S/ktRiBusDBPVZIULvoCTiDQQa88rI0HWEBdAa4TnwZ1HXh4+czVFYXBRN7fhAUunI5+uinCiyXyBgBocKSlFm0UG1sxktWf9CrOkr1IeE0VdBKD46rTBx6hMycItur5PYqNHoItkwzVeDalLJXDUlgWKyrkQWDpuB3XO2YdFo+61JtUAymcpFdU3TC4NmZLmdiBFfhrDBAIfyj5OeV \ No newline at end of file From dc0be8ced06d5dbf72414d35279829633c541230 Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:23:33 +0800 Subject: [PATCH 12/15] ci: use checksum-safe bootstrap patch chunks --- .github/workflows/bootstrap-apply.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bootstrap-apply.yml b/.github/workflows/bootstrap-apply.yml index 78dd873..49f91d2 100644 --- a/.github/workflows/bootstrap-apply.yml +++ b/.github/workflows/bootstrap-apply.yml @@ -28,7 +28,7 @@ jobs: python - <<'PY' import base64, gzip, hashlib from pathlib import Path - encoded = "".join(Path(f".github/bootstrap-payload-{i}.txt").read_text(encoding="utf-8").strip() for i in range(4)) + encoded = "".join(Path(name).read_text(encoding="utf-8").strip() for name in (".github/bootstrap-payload-0a.txt", ".github/bootstrap-payload-0b.txt", ".github/bootstrap-payload-1.txt", ".github/bootstrap-payload-2.txt", ".github/bootstrap-payload-3.txt")) patch = gzip.decompress(base64.b64decode(encoded, validate=True)) digest = hashlib.sha256(patch).hexdigest() print("patch_sha256=" + digest) @@ -36,7 +36,7 @@ jobs: Path("/tmp/bootstrap.patch").write_bytes(patch) PY git apply --index --binary /tmp/bootstrap.patch - git rm .github/bootstrap-payload.txt .github/bootstrap-payload-0.txt .github/bootstrap-payload-1.txt .github/bootstrap-payload-2.txt .github/bootstrap-payload-3.txt + git rm .github/bootstrap-payload.txt .github/bootstrap-payload-0.txt .github/bootstrap-payload-0a.txt .github/bootstrap-payload-0b.txt .github/bootstrap-payload-1.txt .github/bootstrap-payload-2.txt .github/bootstrap-payload-3.txt - name: Verify full candidate shell: bash run: | From cb9b2bf7bd29434e9036de60a725c2232668c7f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 20 Sep 2026 15:23:44 +0000 Subject: [PATCH 13/15] fix: select Agnir bootstrap from Project truth --- .agnir/decisions.md | 11 +++ .../2026-09-20-bootstrap-version-selection.md | 11 +++ .agnir/next-actions.md | 14 +--- .agnir/state.md | 15 ++-- .github/bootstrap-payload-0.txt | 1 - .github/bootstrap-payload-0a.txt | 1 - .github/bootstrap-payload-0b.txt | 1 - .github/bootstrap-payload-1.txt | 1 - .github/bootstrap-payload-2.txt | 1 - .github/bootstrap-payload-3.txt | 1 - .github/bootstrap-payload.txt | 1 - ARCHITECTURE.md | 2 +- README.md | 11 +-- README.zh-CN.md | 11 +-- REPOSITORY_TREE.md | 1 + conformance/RELEASE_READINESS.md | 2 +- plugin/README.md | 6 +- plugin/skills/svif/SKILL.md | 6 +- tests/test_agnir_stable_migration.py | 14 ++-- tests/test_plugin_agnir_discovery.py | 54 ++++++------ tests/test_plugin_first_use_bootstrap.py | 83 +++++++++++-------- tests/test_plugin_installation_docs.py | 13 +-- 22 files changed, 146 insertions(+), 115 deletions(-) create mode 100644 .agnir/evidence/2026-09-20-bootstrap-version-selection.md delete mode 100644 .github/bootstrap-payload-0.txt delete mode 100644 .github/bootstrap-payload-0a.txt delete mode 100644 .github/bootstrap-payload-0b.txt delete mode 100644 .github/bootstrap-payload-1.txt delete mode 100644 .github/bootstrap-payload-2.txt delete mode 100644 .github/bootstrap-payload-3.txt delete mode 100644 .github/bootstrap-payload.txt diff --git a/.agnir/decisions.md b/.agnir/decisions.md index 5a134ff..5d04c04 100644 --- a/.agnir/decisions.md +++ b/.agnir/decisions.md @@ -227,3 +227,14 @@ - Existing Project identity, lineage, selector, compatibility and released Preview tags remain unchanged. The unpublished 0.2.0 candidate may change; older exact package/ZIP receipts stay historical and cannot certify the new bytes. + + +## 2026-09-20 — First-use Agnir version selection follows Project truth + +- Svif MUST distinguish an existing Agnir Project from a genuinely uninitialized Project before first-use bootstrap. +- If a Project already declares a valid Agnir Core/profile compatibility line, Svif preserves and dispatches that exact line. A `0.1`, `0.2`, `1.0`, or future supported `x.y` Project is not migrated merely because a newer Agnir distribution exists. +- If Svif binding is added to an existing Agnir Project, its continuity compatibility/profile MUST match the existing `AGNIR.yaml`; mismatch is a repair case. +- A genuinely uninitialized Project resolves the canonical `iorLab/agnir` latest **published non-prerelease stable** at operation time and initializes using the Core/profile and activation contract declared by that release. +- "Latest stable" MUST NOT mean moving `main`, an RC, an untagged revision, stale model memory, or fallback to Svif Preview's historical Core/profile `0.1` bootstrap. If stable resolution is unavailable, bootstrap stops with a capability blocker. +- Agnir package SemVer / operational provenance and Project Core/profile compatibility are separate version layers. A newer distribution may operate a supported older Project without silently relabeling it. +- The immutable Svif `v0.2.0-preview.1` artifact retains its historical `0.1` bootstrap bytes; this decision changes the current unpublished `0.2.0` line and future distributions only. diff --git a/.agnir/evidence/2026-09-20-bootstrap-version-selection.md b/.agnir/evidence/2026-09-20-bootstrap-version-selection.md new file mode 100644 index 0000000..7dc62d8 --- /dev/null +++ b/.agnir/evidence/2026-09-20-bootstrap-version-selection.md @@ -0,0 +1,11 @@ +# Svif first-use Agnir version-selection repair — 2026-09-20 + +Status: implementation candidate on `fix/bootstrap-agnir-version-selection`; OpenAI Platform publication remains paused. + +Principal correction: Svif must not pin all new/current Projects to Agnir Core/profile `0.1`. Existing Project truth wins. A valid existing Agnir Project keeps the Core/profile it declares; adding Svif creates/validates a matching continuity binding and does not authorize compatibility migration. Partial or contradictory Agnir artifacts remain repair cases. + +Only a genuinely uninitialized Project resolves the canonical latest published stable Agnir at operation time. Stable means a published non-prerelease tag/Release, never moving `main`, RC, untagged source, stale model memory, or fallback to the old Svif Preview baseline. Package SemVer and Core/profile compatibility remain separate. + +Current external observation on 2026-09-20: `iorLab/agnir` latest published stable is repository release `v1.0.2` at revision `b5626394ec40a5cb7a28c01892acde07cc0adc8e`; that release still declares Core `1.0` and `repository-filesystem/1.0`. This receipt is evidence of today's resolved stable, not a hard-coded future bootstrap constant. Future first-use operations must resolve latest stable again. + +The immutable Svif `v0.2.0-preview.1` release is not modified. It remains historical evidence with its original `0.1` bootstrap behavior. The current unpublished `0.2.0` Skill is the first Svif line to supersede that rule. diff --git a/.agnir/next-actions.md b/.agnir/next-actions.md index 3329e25..aef6cc8 100644 --- a/.agnir/next-actions.md +++ b/.agnir/next-actions.md @@ -7,15 +7,7 @@ and native install/discovery now have passing evidence; do not repeat the old cl that the four audit findings are unrepaired or that publisher prerequisites are the P0. Full current-version Skill effectiveness and whole-release sign-off remain open. -1. **Complete same-candidate authenticated native behavior.** Use the repaired Plugin - tree `7cc90517013306181a4df2238f849b85cf716665` from a fixed reviewed checkout. - `checks/check_local_install.py --output ` verifies real install, - enabled state, every installed file and native Skill discovery. That no-auth layer - passed on Linux/macOS with Codex 0.155.1 in PR run `35509417968`. - Use the operator's authorized Codex login in the isolated CODEX_HOME, then run the - same harness with `--exercise`. It performs an ordinary Project task/checkpoint, - fresh process + new conversation recovery without an old transcript, and unchanged - reuse of an existing Project. Do not copy, request or commit secret token values. +1. **Accept the new bootstrap-version-selection Plugin subject before authenticated behavior.** The current Skill now preserves an existing Project's declared Agnir Core/profile and resolves latest published stable Agnir only for a genuinely uninitialized Project. This changes Plugin bytes, so tree `7cc90517013306181a4df2238f849b85cf716665` / run `35509417968` remains historical for the prior candidate. Run full CI and `checks/check_local_install.py --output ` on the exact new candidate; require installed+enabled status, exact installed bytes and native Skill discovery on supported hosts before using `--exercise`. Then use the operator's authorized Codex login in the isolated CODEX_HOME and perform ordinary-Project bootstrap/task/checkpoint, fresh process + new conversation recovery, and unchanged existing-Project reuse. Do not copy, request or commit secret token values. 2. **Exercise all same-candidate negative host scenarios.** Follow `conformance/RELEASE_READINESS.md`: broken discovery, other Continuity Provider, identity/version mismatch, failing required checks, absent authority, missing @@ -47,9 +39,7 @@ proof of the changed Skill. No new version tag or public release is authorized h - Keep `v0.2.0-preview.1` immutable at `2b07b6b5ea0bc8feee59f9f647be9af3069d056e`. Preserve its **immutable candidate**, real **Codex CLI** and **ChatGPT desktop/Codex** historical acceptance evidence; it cannot certify the changed current candidate. -- Preserve Project identity, Core/profile 1.0 self-host, 0.1/0.2/1.0 adapter support, - current 0.1 first-use bootstrap, logical lineage, VCS selector and durable locators. - Installing new code is not authorization to silently migrate an existing Project. +- Preserve Project identity, Core/profile 1.0 self-host, 0.1/0.2/1.0 adapter support, logical lineage, VCS selector and durable locators. Existing target Projects preserve their own declared Agnir compatibility; only genuinely uninitialized Projects resolve latest published stable. Installing new code is not authorization to silently migrate an existing Project. - Preserve accepted Agnir promotion/adoption, canonical brand and bilingual entry semantics. - Live Cloudflare delivery stays disabled. All committed regression/CI fixtures are dummy, credential-free and non-production. Optional future integrations stay separately scoped. diff --git a/.agnir/state.md b/.agnir/state.md index 1356b33..7f24d5d 100644 --- a/.agnir/state.md +++ b/.agnir/state.md @@ -10,9 +10,11 @@ The Principal requested release-standard functional repair and local effectivene OpenAI Platform submission/Publish remains paused until an explicit new instruction. **The four reproduced runtime blockers are repaired and cross-platform regression -checks pass. Native Codex installation, enablement, exact installed bytes and Skill -discovery pass on Linux and macOS. Full model-driven effectiveness and whole-product -release acceptance remain open; installation alone does not close them.** +checks pass. A new first-use version-selection repair is now under validation: existing +Agnir Projects preserve their declared Core/profile, while genuinely uninitialized +Projects resolve the canonical latest published stable Agnir. Because this changes Skill +bytes, the prior native install/discovery receipt remains historical for the preceding +candidate and must be rerun for the new candidate before model-driven release acceptance.** ## Verified repair subject @@ -21,7 +23,7 @@ release acceptance remain open; installation alone does not close them.** `fe7788bd53d3a240f663860133b741799d0470e3`. - Reviewed repair source: `225e535e32a18bf8db2bfc7d76efe6bed9378e97`, tree `12542123c9ab47e5e938f8db8fd8a7d36f28a513`, PR #11. -- Exact repaired Plugin tree: `7cc90517013306181a4df2238f849b85cf716665`. +- Prior repaired Plugin tree `7cc90517013306181a4df2238f849b85cf716665` passed native install/discovery and remains historical evidence. The bootstrap-version-selection change creates a new Plugin subject that requires its own exact tree and native receipt before acceptance. - Local full suite: 128 tests pass on Linux/Python 3.13.5; repository integrity and portable contracts pass. Tests execute real code, including process termination. - PR candidate run `35509417968`: all eight jobs pass, including runtime on Linux @@ -51,7 +53,7 @@ Orchestrator + Continuity Provider + Execution Surface + Capability Provider rem first-class components. `conformance/RELEASE_READINESS.md` maps requirements to evidence. Implementation, failures/repairs and exact CI/native receipts: -`.agnir/evidence/2026-09-20-runtime-readiness-repair.md`. +`.agnir/evidence/2026-09-20-runtime-readiness-repair.md`. Bootstrap version-selection rationale and current latest-stable observation are recorded in `.agnir/evidence/2026-09-20-bootstrap-version-selection.md`. ## Preserved continuity, release and product boundaries @@ -59,8 +61,7 @@ Implementation, failures/repairs and exact CI/native receipts: - Lineage `urn:svif:lineage:authoritative`; distinct VCS selector `refs/heads/main`. - Memory locators remain `.agnir/state.md`, `.agnir/next-actions.md`, `.agnir/decisions.md`, `.agnir/evidence/`; applied Agnir remains v1.0.0 at `6d16dcfd17b8e9f22fd25804e22b9f8a516d06c3`. -- Adapter support remains 0.1/0.2/1.0. Skill founding bootstrap remains 0.1; no implicit - migration or Agnir operational upgrade is performed by this repair. +- Adapter support remains 0.1/0.2/1.0. Existing target Projects preserve the exact Agnir Core/profile they declare; invoking/installing Svif does not authorize migration. A genuinely uninitialized target resolves the latest published stable Agnir at bootstrap time and adopts that release's declared Core/profile. Svif's own self-host binding remains 1.0 and is not upgraded by this change. - Released **Plugin MVP** / Preview `v0.2.0-preview.1` remains immutable at `2b07b6b5ea0bc8feee59f9f647be9af3069d056e`, tag object `2535cb89426c2d38c2e061948e81954a7c7c26d7`. Its historical real-client evidence is preserved, not generalized to the repaired Skill. diff --git a/.github/bootstrap-payload-0.txt b/.github/bootstrap-payload-0.txt deleted file mode 100644 index 5f1b90c..0000000 --- a/.github/bootstrap-payload-0.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload-0a.txt b/.github/bootstrap-payload-0a.txt deleted file mode 100644 index f8c12c0..0000000 --- a/.github/bootstrap-payload-0a.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload-0b.txt b/.github/bootstrap-payload-0b.txt deleted file mode 100644 index 0463abd..0000000 --- a/.github/bootstrap-payload-0b.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload-1.txt b/.github/bootstrap-payload-1.txt deleted file mode 100644 index 8942706..0000000 --- a/.github/bootstrap-payload-1.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload-2.txt b/.github/bootstrap-payload-2.txt deleted file mode 100644 index d825ef7..0000000 --- a/.github/bootstrap-payload-2.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload-3.txt b/.github/bootstrap-payload-3.txt deleted file mode 100644 index e3f2b36..0000000 --- a/.github/bootstrap-payload-3.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.github/bootstrap-payload.txt b/.github/bootstrap-payload.txt deleted file mode 100644 index d590394..0000000 --- a/.github/bootstrap-payload.txt +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index ca33c05..a0e1701 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -106,7 +106,7 @@ plugin/ - `plugin/plugin.json` is the portable Plugin manifest. - `plugin/skills/svif/SKILL.md` is the first installable workflow component. -- The Plugin guides compatible execution surfaces through Agnir discovery, Svif lifecycle execution, provenance/authority guards, independent observation, and durable checkpointing. +- The Plugin guides compatible execution surfaces through Agnir discovery, Svif lifecycle execution, provenance/authority guards, independent observation, and durable checkpointing. On first use it preserves an existing Project's declared Agnir compatibility line; only a genuinely uninitialized Project resolves the canonical latest published stable Agnir and adopts the Core/profile declared by that release. - The Plugin is a distribution layer and does not reimplement `src/svif/runtime.py`. A Skill-only Plugin is a valid and useful first product increment. An optional `mcp.json` will be added when the concrete remote Svif MCP/App surface is ready; MCP completion is not a prerequisite for testing and iterating the Plugin workflow itself. diff --git a/README.md b/README.md index bdb5c2a..79ac4f1 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,14 @@ If an activation locator, identity, required memory locator, or compatibility ch ## What Svif Adds to a Project -On first use of Svif in a genuinely uninitialized repository/filesystem Project, the shared Skill establishes the founding Agnir continuity plus a matching Svif Project Binding. **Svif does not take over existing Project files.** Existing `AGENTS.md` and `README.md` receive only the activation/instruction entry they need, while unrelated content is preserved. +On first use, Svif first checks whether the Project already has Agnir. If it does, Svif preserves that Project's declared Agnir Core/profile compatibility exactly and creates/validates the Svif binding against the same line; installing Svif is not permission to migrate Agnir. Only a genuinely uninitialized repository/filesystem Project resolves the canonical **latest published stable Agnir** and initializes using the Core/profile and activation contract declared by that stable release. **Svif does not take over existing Project files.** Existing activation/documentation surfaces receive only the entry required by the selected Agnir contract, while unrelated content is preserved. ```text Project/ -├── AGENTS.md # [EDIT: add entry only] add Agnir activation locator; preserve existing instructions -├── README.md # [EDIT: add entry only] add ## Agnir Project Instructions; preserve existing content -├── AGNIR.yaml # [ADD] founding Agnir discovery anchor +├── AGENTS.md # [EDIT: add entry only] add selected Agnir activation locator; preserve existing instructions +├── AGNIR.md # [ADD when selected release requires it] canonical Project instructions for current stable packaging +├── README.md # [EDIT: add entry only] add selected release compatibility/instruction entry; preserve existing content +├── AGNIR.yaml # [ADD] founding Agnir discovery anchor using selected stable Core/profile ├── .agnir/ # [ADD] Project-owned durable continuity │ ├── state.md # [ADD] current durable Project truth │ ├── next-actions.md # [ADD] outstanding ordered work for the next Executor @@ -73,7 +74,7 @@ Project/ └── SVIF.yaml # [ADD] Svif Project Binding: continuity, execution, capability and profile bindings ``` -If compatible Agnir/Svif artifacts already exist, the Skill validates and reuses them rather than recreating them. Partial or contradictory artifacts are a repair case, not clean initialization. A Project intentionally bound to another Continuity Provider is not silently overwritten with Agnir. +If compatible Agnir/Svif artifacts already exist, the Skill validates and reuses their exact declared compatibility rather than recreating or upgrading them. Partial or contradictory artifacts are a repair case, not clean initialization. A Project intentionally bound to another Continuity Provider is not silently overwritten with Agnir. Agnir package release version and Core/profile compatibility are separate: a newer distribution may operate a supported older Project without relabeling it. These are founding `repository-filesystem` onboarding artifacts, not universal Svif kernel requirements. Svif coordinates replaceable providers and execution surfaces; it does not make Git, GitHub, Agnir, ChatGPT, or Cloudflare permanent kernel dependencies. diff --git a/README.zh-CN.md b/README.zh-CN.md index a08f0db..860c89b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -58,13 +58,14 @@ Install and enable Svif for this Project: https://github.com/iorLab/svif ## Svif 会给 Project 增加什么 -当 Svif 在一个真正未初始化的 repository/filesystem Project 中首次使用时,共享 Skill 会建立 founding Agnir continuity,并加入与之匹配的 Svif Project Binding。**Svif 不会接管已有 Project 文件。** 对已有的 `AGENTS.md` 和 `README.md`,只添加激活 / 指令入口,并保留原有无关内容。 +首次使用时,Svif 会先判断 Project 是否已经使用 Agnir。若已经存在 Agnir,就原样保留该 Project 声明的 Agnir Core/profile compatibility,并让 Svif binding 与这一条兼容线保持一致;安装 Svif 不等于获得迁移 Agnir 的授权。只有真正没有 Agnir / 其他 continuity binding 的 repository/filesystem Project,才解析 canonical **最新已发布 stable Agnir**,并按该 stable release 声明的 Core/profile 与 activation contract 初始化。**Svif 不会接管已有 Project 文件。** 已有 activation / 文档表面只增加所选 Agnir contract 需要的入口,并保留无关内容。 ```text Project/ -├── AGENTS.md # [编辑:仅添加入口] 加入 Agnir activation locator;保留原有 instructions -├── README.md # [编辑:仅添加入口] 加入 ## Agnir Project Instructions;保留原有内容 -├── AGNIR.yaml # [新增] founding Agnir discovery anchor +├── AGENTS.md # [编辑:仅添加入口] 加入所选 Agnir contract 的 activation locator;保留原有 instructions +├── AGNIR.md # [所选 release 要求时新增] 当前 stable packaging 的 canonical Agnir Project instructions +├── README.md # [编辑:仅添加入口] 加入所选 release 的兼容 / 指令入口;保留原有内容 +├── AGNIR.yaml # [新增] founding Agnir discovery anchor;使用所选 stable Core/profile ├── .agnir/ # [新增] Project 自己拥有的 durable continuity │ ├── state.md # [新增] 当前仍然成立的 durable Project truth │ ├── next-actions.md # [新增] 下一位 Executor 应继续推进的有序工作 @@ -73,7 +74,7 @@ Project/ └── SVIF.yaml # [新增] Svif Project Binding:continuity、execution、capability 与 profile bindings ``` -如果兼容的 Agnir / Svif artifacts 已经存在,Skill 会校验并复用,而不是重新创建。部分存在或互相矛盾的 artifacts 属于 repair case,不按 clean initialization 处理。已经明确绑定其他 Continuity Provider 的 Project 不会被静默改写成 Agnir。 +如果兼容的 Agnir / Svif artifacts 已经存在,Skill 会校验并复用其原本声明的 compatibility,而不是重新创建或顺手升级。部分存在或互相矛盾的 artifacts 属于 repair case,不按 clean initialization 处理。已经明确绑定其他 Continuity Provider 的 Project 不会被静默改写成 Agnir。Agnir package release version 与 Core/profile compatibility 是不同层级:新版 distribution 可以继续支持旧 Project,但不能因此静默改写 Project 的兼容性声明。 这些是 founding `repository-filesystem` onboarding artifacts,不是 Svif kernel 的普遍强制文件。Svif 协调的是可替换 provider 与 execution surface;Git、GitHub、Agnir、ChatGPT 或 Cloudflare 都不是永久 kernel dependency。 diff --git a/REPOSITORY_TREE.md b/REPOSITORY_TREE.md index fff2da4..5c2169d 100644 --- a/REPOSITORY_TREE.md +++ b/REPOSITORY_TREE.md @@ -44,6 +44,7 @@ svif/ # Svif 产品主仓库 │ ├── 2026-09-18-public-submission-candidate-audit.md # Svif 0.2.0 public-submission candidate 版本边界、package tree、OpenAI packaging 审计与 CI 证据 │ ├── 2026-09-18-skills-only-submission-archive.md # exact Plugin tree 的 deterministic ZIP、archive guards、CI 与外部 submission evidence 边界 │ ├── 2026-09-20-runtime-readiness-repair.md # 可信策略/事务恢复修复、回归与原生验收层次证据 +│ ├── 2026-09-20-bootstrap-version-selection.md # 现有 Agnir 版本保留 / 全新 Project latest-stable bootstrap 语义与验证证据 │ └── checkpoint-2026-08-28-validation-2.md # Validation 2 的持久 checkpoint 记录 │ ├── .github/ # GitHub 托管侧自动化配置 diff --git a/conformance/RELEASE_READINESS.md b/conformance/RELEASE_READINESS.md index 1c2dc8a..723f5ab 100644 --- a/conformance/RELEASE_READINESS.md +++ b/conformance/RELEASE_READINESS.md @@ -29,7 +29,7 @@ Evidence in `.agnir/` records the actually observed candidate, host and results. | Uncertain effect is not blindly repeated | durable effect intent + session/receipt replay checks; release-safety tests | Restart blocks; independent matching reconciliation completes without another deployment. Global cross-target exactly-once is not claimed. | | Portable distribution and exact package bytes | package/component tests; builder + negative archive tests | Invalid output paths, links, limits and I/O failure do not corrupt source or prior ZIP. Source/installed file identities must match. | | Native install + enabled + Skill discovery | `checks/check_local_install.py`; real Codex CLI/app-server | Requires actual native `plugin add`, `plugin list`, `skills/list` and installed-file hash equality. Unit mocks do not count. | -| Ordinary Project first-use, actual work, checkpoint and fresh-context resume | installed `plugin/skills/svif/SKILL.md`; native `--exercise` | Requires model authentication in isolated home and independent result-file checks. Not proven by a Skill-text assertion. | +| Ordinary Project first-use, actual work, checkpoint and fresh-context resume | installed `plugin/skills/svif/SKILL.md`; native `--exercise` | Existing Agnir Projects must preserve their declared compatibility; genuinely new Projects must resolve the latest published stable Agnir and use that release's declared Core/profile. Requires model authentication in isolated home and independent result-file checks. Not proven by a Skill-text assertion. | | Existing Project idempotency and instruction preservation | installed Skill; native `--exercise` | Separate fresh thread preserves identity, original instructions and unchanged completed memory. | | Broken discovery, another provider and failure-path host behavior | negative scenarios below | Must be observed with the same installed candidate; kernel unit tests are not a substitute for Skill adherence. | diff --git a/plugin/README.md b/plugin/README.md index 4436914..e81e0f9 100644 --- a/plugin/README.md +++ b/plugin/README.md @@ -46,7 +46,9 @@ That is **package/conformance/distribution validation**, not proof that a partic The bundled `svif` Skill guides a compatible execution surface to: -- for an Agent-operable Agnir Project using `repository-filesystem/0.1`, require the durable activation route `Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> durable memory` before normal Project work; +- preserve an existing Agnir Project's declared Core/profile compatibility and bind Svif to that exact line instead of silently migrating it; +- for a genuinely uninitialized Project, resolve the canonical latest published stable Agnir, use the Core/profile declared by that release, and never substitute moving `main`, an RC, or the historical 0.1 bootstrap baseline; +- require the version-appropriate durable activation route before normal Project work: current stable packaging uses `Project root -> AGENTS.md -> AGNIR.md -> AGNIR.yaml -> durable memory`, while supported legacy Projects may retain `Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> durable memory`; - validate Agnir Core/profile compatibility and selected-Project identity before loading durable memory; - surface unsupported-version, Project-mismatch, authorization, locator, cycle, stale, and inconsistency failures instead of silently falling back to unrelated state; - load current state and next actions first, then only relevant decisions/evidence; @@ -101,7 +103,7 @@ OpenAI currently asks for five positive and three negative review cases. These c **Positive cases** -1. **Resume a valid Agnir Project.** Prompt: continue the Project and implement the next concrete action. Expected: follow `AGENTS.md -> README Agnir Project Instructions -> AGNIR.yaml`, validate compatibility/identity, load Current State + Next Actions, perform the concrete work, verify it, and checkpoint durable state. +1. **Resume a valid Agnir Project.** Prompt: continue the Project and implement the next concrete action. Expected: follow the Project's installed version-appropriate Agnir activation route (`AGENTS.md -> AGNIR.md -> AGNIR.yaml` for current stable packaging, or the compatible legacy README route when the Project already declares it), validate compatibility/identity, load Current State + Next Actions, perform the concrete work, verify it, and checkpoint durable state. 2. **Checkpoint a non-effectful repository change.** Expected: run DISCOVER -> PLAN -> CHANGE -> VERIFY -> CHECKPOINT without inventing DELIVER/OBSERVE evidence. 3. **Repair a missing Agnir locator without destroying existing instructions.** Expected: preserve unrelated `AGENTS.md` content, add only the minimal locator when authorized, rerun activation, and remain idempotent on a second pass. 4. **Resume after a prior checkpoint.** Expected: a fresh execution context reconstructs required Project truth from Project-owned durable surfaces rather than conversation memory. diff --git a/plugin/skills/svif/SKILL.md b/plugin/skills/svif/SKILL.md index c4bc678..d1d964d 100644 --- a/plugin/skills/svif/SKILL.md +++ b/plugin/skills/svif/SKILL.md @@ -57,11 +57,13 @@ For an Agent-operable Agnir Project, the durable activation route required by th Supported existing Projects may legitimately use different activation forms. Legacy Core/profile `0.1`, `0.2`, and Agnir `1.0.0` packaging may enter through `Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> declared durable memory`. Newer stable packaging may use `Project root -> AGENTS.md -> AGNIR.md -> AGNIR.yaml -> declared durable memory`, with the README heading retained only as a compatibility locator. Preserve a valid existing route unless an explicit compatible operational upgrade or repair authorizes changing it. -Agnir Agent activation and Core discovery are distinct layers. Validate the canonical instruction surface selected by the installed Agnir contract, not just heading/link presence. When README is the canonical instruction surface, validate the full required Project-operation instructions there. When `AGNIR.md` is canonical, validate the full procedure in `AGNIR.md` and require the README Agnir heading to remain only the compatible locator specified by the selected release. +Agnir Agent activation and Core discovery are distinct layers. **Do not validate activation by heading/link presence alone.** Validate the canonical instruction surface selected by the installed Agnir contract. When README is the canonical instruction surface, the canonical README `## Agnir Project Instructions` section itself MUST satisfy that installed activation contract. When `AGNIR.md` is canonical, validate the same required operational semantics in `AGNIR.md` and require the README Agnir heading to remain only the compatible locator specified by the selected release. + +Whichever canonical instruction surface applies, it must state that the Project uses Agnir for durable continuity and direct a fresh Agent to treat the Project root as the authorized Project Entry Point, read top-level `AGNIR.yaml`, validate compatibility and Project identity before state loading, load Current State and Next Actions, load Decisions and Evidence when relevant, prefer durable Agnir Project truth over chat/private Agent memory unless superseded by a newer Principal instruction or directly observed current Project fact, and checkpoint material continuity changes at an intentional save/finish boundary. If any required instruction is missing, materially weakened, or contradicted, activation is not healthy even when `AGENTS.md` reaches the expected locator; repair the earliest defect when authorized and rerun activation from the Project root. The fact that the current Agent can directly open `AGNIR.yaml` MUST NOT be used to bypass a missing, stale, contradictory, or predecessor-private activation route or to claim that a fresh Agent can resume from the Project root. A non-Agent Executor or trusted adapter already given the applicable profile implementation may begin discovery at `AGNIR.yaml` as the profile permits; that exception does not silently redefine Agent activation. -`AGENTS.md` remains locator-only. Preserve unrelated existing instructions and never silently override a material conflict. The selected canonical activation surface—legacy README procedure or current `AGNIR.md` procedure—owns the full Agnir Project instructions. Equivalent locators are idempotent; material conflicts must be surfaced to the Principal. +`AGENTS.md` remains locator-only. When installing or repairing its Agnir locator, make the smallest locator-only merge: do not delete, reorder, normalize, summarize, or otherwise rewrite unrelated Project-owned instructions merely to install or repair Agnir. If an equivalent Agnir locator already exists, keep the operation idempotent rather than adding another copy. If resolving a material conflict would require deleting, overriding, or reinterpreting an existing Project instruction, surface the conflict to the Principal and do not report Agent activation healthy until it is explicitly resolved and a fresh activation test passes. The selected canonical activation surface—legacy README procedure or current `AGNIR.md` procedure—owns the full Agnir Project instructions. Before following that route, require the authorized Project Entry Point or trusted binding context to select exactly one Project root. If multiple candidate Project roots exist and no authority rule selects one, surface `AGNIR_DISCOVERY_AMBIGUOUS` rather than choosing the most convenient candidate. Once one root is authoritatively selected, a parent or child Project with its own `AGNIR.yaml` does not make that selected root ambiguous and MUST NOT be searched as a replacement. Before resolving a Discovery Record, select the discovery profile/adapter convention applicable to the authorized Project Entry Point from trusted integration or binding context. The Discovery Record may declare its profile for compatibility checking, but it MUST NOT bootstrap authority by choosing the adapter/convention used to discover or interpret itself. If no applicable profile can be selected safely, surface the discovery/compatibility blocker rather than guessing from nearby files or model memory. diff --git a/tests/test_agnir_stable_migration.py b/tests/test_agnir_stable_migration.py index 1a162b5..535ad82 100644 --- a/tests/test_agnir_stable_migration.py +++ b/tests/test_agnir_stable_migration.py @@ -59,7 +59,7 @@ def test_migration_preserves_project_identity_and_memory_locators(self) -> None: ): self.assertIn(marker, agnir) - def test_skill_distinguishes_current_self_host_from_released_preview_bootstrap(self) -> None: + def test_skill_distinguishes_self_host_existing_projects_and_fresh_bootstrap(self) -> None: text = SKILL.read_text(encoding="utf-8") for marker in ( @@ -67,14 +67,16 @@ def test_skill_distinguishes_current_self_host_from_released_preview_bootstrap(s "profile `repository-filesystem/1.0`", "one explicit logical Continuity Lineage", "matching durable VCS selector binding", - "The released `v0.2.0-preview.1` first-use bootstrap remains", - "Core/profile `0.1` baseline", - "published Agnir repository release `v1.0.0`", + "Existing target Projects likewise dispatch according to their own declared compatibility", + "immutable released `v0.2.0-preview.1` retains its historical Core/profile `0.1` bootstrap bytes", + "current unpublished `0.2.0` Skill uses existing-version preservation plus latest-stable selection", ): self.assertIn(marker, text) - self.assertIn("Initialize the Agnir `repository-filesystem/0.1` continuity contract", text) - self.assertIn('compatibility `"0.1"`', text) + self.assertNotIn("Initialize the Agnir `repository-filesystem/0.1` continuity contract", text) + self.assertIn("A valid Core/profile `0.1` Project remains `0.1`", text) + self.assertIn("a valid `0.2` Project remains `0.2`", text) + self.assertIn("a valid `1.0` Project remains `1.0`", text) self.assertIn("Core `0.2` or `1.0`, require a non-empty logical `continuity.lineage`", text) self.assertIn("AGNIR_LINEAGE_REQUIRED", text) diff --git a/tests/test_plugin_agnir_discovery.py b/tests/test_plugin_agnir_discovery.py index e4bcf81..2c25dc7 100644 --- a/tests/test_plugin_agnir_discovery.py +++ b/tests/test_plugin_agnir_discovery.py @@ -17,37 +17,32 @@ def _quoted_scalar(text: str, key: str) -> str: class PluginAgnirDiscoveryTests(unittest.TestCase): - def test_skill_requires_durable_agent_activation_route_before_discovery(self) -> None: + def test_skill_requires_version_appropriate_durable_agent_activation_before_discovery(self) -> None: text = SKILL.read_text(encoding="utf-8") - mandatory = text.index("the durable activation route is mandatory before normal Project work") + mandatory = text.index("the durable activation route required by that Project's compatible Agnir installation is mandatory") activation = text.index("Agnir Agent activation and Core discovery are distinct layers") - route = text.index("durable `AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml` route") - contract = text.index("Do not validate activation by heading/link presence alone") + legacy = text.index("AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml") + current = text.index("AGENTS.md -> AGNIR.md -> AGNIR.yaml") direct = text.index("current Agent can directly open `AGNIR.yaml`") - non_agent = text.index("A non-Agent Executor or trusted adapter") - root_selection = text.index("select exactly one Project root") + root_selection = text.index("select exactly one Project root", direct) self.assertLess(mandatory, activation) - self.assertLess(activation, route) - self.assertLess(route, direct) - self.assertLess(direct, contract) - self.assertLess(contract, non_agent) - self.assertLess(non_agent, root_selection) - self.assertNotIn("when those surfaces exist", text) + self.assertLess(mandatory, legacy) + self.assertLess(mandatory, current) + self.assertLess(activation, direct) + self.assertLess(direct, root_selection) for marker in ( - "part of the Project activation contract, not as an optional convenience", - "points to the canonical README Agnir section", - "unresolved material instruction conflict", + "Do not infer the activation route from the newest available version", + "Preserve a valid existing route unless an explicit compatible operational upgrade or repair authorizes changing it", + "selected canonical activation surface", "MUST NOT be used to bypass a missing, stale, contradictory, or predecessor-private activation route", "fresh Agent can resume from the Project root", - "does not silently convert this Agent Skill into a non-Agent activation context", - "surface the activation blocker", - "accidental direct readability of `AGNIR.yaml`", ): self.assertIn(marker, text) - def test_skill_validates_canonical_readme_activation_contract_not_only_locator_shape(self) -> None: + + def test_skill_validates_selected_canonical_activation_contract_not_only_locator_shape(self) -> None: text = SKILL.read_text(encoding="utf-8") contract = text.index("Do not validate activation by heading/link presence alone") @@ -55,7 +50,8 @@ def test_skill_validates_canonical_readme_activation_contract_not_only_locator_s self.assertLess(contract, non_agent) for marker in ( - "canonical README `## Agnir Project Instructions` section itself MUST satisfy the current profile activation contract", + "canonical README `## Agnir Project Instructions` section itself MUST satisfy", + "When `AGNIR.md` is canonical", "Project uses Agnir for durable continuity", "Project root as the authorized Project Entry Point", "read top-level `AGNIR.yaml`", @@ -66,15 +62,16 @@ def test_skill_validates_canonical_readme_activation_contract_not_only_locator_s "directly observed current Project fact", "checkpoint material continuity changes at an intentional save/finish boundary", "missing, materially weakened, or contradicted", - "activation is not healthy even when `AGENTS.md` reaches the correct heading", + "activation is not healthy even when `AGENTS.md` reaches the expected locator", "rerun activation from the Project root", ): self.assertIn(marker, text) + def test_skill_repairs_existing_agents_locator_without_rewriting_project_instructions(self) -> None: text = SKILL.read_text(encoding="utf-8") - locator = text.index("`AGENTS.md` is only a locator") + locator = text.index("`AGENTS.md` remains locator-only") merge = text.index("make the smallest locator-only merge") idempotent = text.index("If an equivalent Agnir locator already exists") conflict = text.index("If resolving a material conflict would require deleting, overriding, or reinterpreting") @@ -287,7 +284,7 @@ def test_skill_surfaces_all_named_agnir_discovery_failures_without_fallback_sear self.assertIn("repair the earliest violated discovery invariant", text) self.assertIn("original authorized Project Entry Point", text) - def test_current_project_binding_can_migrate_without_rewriting_released_bootstrap_baseline(self) -> None: + def test_current_project_binding_and_target_bootstrap_versions_are_separate(self) -> None: skill = SKILL.read_text(encoding="utf-8") agnir = (ROOT / "AGNIR.yaml").read_text(encoding="utf-8") svif = (ROOT / "SVIF.yaml").read_text(encoding="utf-8") @@ -310,15 +307,16 @@ def test_current_project_binding_can_migrate_without_rewriting_released_bootstra ): self.assertIn(marker, svif) - # The released Skills-only distribution still bootstraps new Projects on - # its published Agnir 0.1 baseline until a later distribution release says otherwise. for marker in ( - "Agnir Core `0.1`", - "repository-filesystem/0.1", - 'compatibility `"0.1"`', + "A valid Core/profile `0.1` Project remains `0.1`", + "a valid `0.2` Project remains `0.2`", + "a valid `1.0` Project remains `1.0`", + "Genuinely uninitialized Project: resolve the latest published stable Agnir", + "immutable released `v0.2.0-preview.1` retains its historical Core/profile `0.1` bootstrap bytes", ): self.assertIn(marker, skill) + def test_discovery_guard_test_is_registered_in_project_binding(self) -> None: svif = (ROOT / "SVIF.yaml").read_text(encoding="utf-8") self.assertIn( diff --git a/tests/test_plugin_first_use_bootstrap.py b/tests/test_plugin_first_use_bootstrap.py index b84a93a..59b2b23 100644 --- a/tests/test_plugin_first_use_bootstrap.py +++ b/tests/test_plugin_first_use_bootstrap.py @@ -9,65 +9,82 @@ class PluginFirstUseBootstrapTests(unittest.TestCase): - def test_uninitialized_project_bootstraps_before_not_found(self) -> None: + def test_existing_agnir_project_preserves_declared_compatibility(self) -> None: + text = SKILL.read_text(encoding="utf-8") + + for marker in ( + "Existing Agnir Project: preserve the declared compatibility line", + "Dispatch according to the compatibility identifiers the Project actually declares", + "A valid Core/profile `0.1` Project remains `0.1`", + "a valid `0.2` Project remains `0.2`", + "a valid `1.0` Project remains `1.0`", + "authorization to migrate or relabel compatibility", + "`compatibility` equal to the existing `agnir.version`", + "`profile` equal to the existing `agnir.discovery_profile`", + "An operational Agnir package upgrade and a Core/profile compatibility migration are different operations", + ): + self.assertIn(marker, text) + + def test_genuinely_new_project_resolves_latest_published_stable(self) -> None: text = SKILL.read_text(encoding="utf-8") - bootstrap = text.index("### Bootstrap a Project that has no continuity binding") first_use = text.index("classify it as a **first-use bootstrap**") no_separate_prompt = text.index("Do not make the user issue a separate Agnir initialization prompt") not_found = text.index("surface `AGNIR_DISCOVERY_NOT_FOUND`") - - self.assertLess(bootstrap, first_use) self.assertLess(first_use, no_separate_prompt) self.assertLess(no_separate_prompt, not_found) for marker in ( - "Do not require the user to initialize Agnir separately", - "no `SVIF.yaml` continuity binding", - "no `AGNIR.yaml`", - "no Project instruction or durable configuration selecting another Continuity Provider", - "first-use bootstrap", - "same stable Project identity", - "Agnir Core `0.1`", - "repository-filesystem/0.1", - "create top-level `AGNIR.yaml`", - "`.agnir/state.md`", - "`.agnir/next-actions.md`", - "`.agnir/decisions.md`", - "`.agnir/evidence/`", - "minimal Agnir locator", - "minimal repository/filesystem `SVIF.yaml`", - "project-binding/0.2", - 'continuity.provider: "agnir"', - 'compatibility `"0.1"`', - 'discovery `"AGNIR.yaml"`', + "latest published stable release", + "published non-prerelease tag/Release", + "never substitute moving `main`", + "Package SemVer and Core/profile compatibility are distinct version layers", + "use the Core/profile declared by the resolved stable release", + "Do not fall back to Core/profile `0.1`", + "record immutable Agnir operational provenance", + "`compatibility` equal to the newly created `AGNIR.yaml -> agnir.version`", + "`profile` equal to `AGNIR.yaml -> agnir.discovery_profile`", "continue the user's original Project task in the same operation", ): self.assertIn(marker, text) - def test_bootstrap_does_not_overwrite_existing_or_conflicting_continuity(self) -> None: + def test_existing_broken_or_other_provider_is_not_clean_bootstrap(self) -> None: text = SKILL.read_text(encoding="utf-8") - for marker in ( - "Preserve unrelated Project documentation and instructions", - "merge only the minimal locator", - "If a material existing instruction conflicts with Agnir activation", - "surface the conflict to the Principal", - "Do not treat partial or contradictory Agnir/Svif artifacts as a clean first-use bootstrap", + "partial or contradictory Agnir/Svif artifacts", "enter repair and preserve the applicable Agnir failure class", + "Do not silently replace that Project", "intentionally selects a different Continuity Provider", "do not overwrite it with Agnir", + "A mismatch is a repair/binding case", ): self.assertIn(marker, text) - def test_bootstrap_is_self_contained_and_does_not_create_external_effect_authority(self) -> None: + def test_activation_dispatch_preserves_installed_contract(self) -> None: text = SKILL.read_text(encoding="utf-8") + for marker in ( + "Activate according to the Project's installed Agnir contract", + "Do not infer the activation route from the newest available version", + "AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml", + "AGENTS.md -> AGNIR.md -> AGNIR.yaml", + "Preserve a valid existing route unless an explicit compatible operational upgrade or repair authorizes changing it", + "`AGENTS.md` remains locator-only", + ): + self.assertIn(marker, text) + def test_preview_history_does_not_pin_current_bootstrap(self) -> None: + text = SKILL.read_text(encoding="utf-8") + self.assertIn("released `v0.2.0-preview.1` artifact is immutable historical evidence", text) + self.assertIn("current unpublished `0.2.0` line deliberately supersedes that historical bootstrap rule", text) + self.assertNotIn("Initialize the Agnir `repository-filesystem/0.1` continuity contract", text) + + def test_bootstrap_does_not_create_external_effect_authority_or_require_prior_install(self) -> None: + text = SKILL.read_text(encoding="utf-8") for marker in ( "does not grant authority for protected external effects", - "MUST NOT require the Agnir Skill repository", + "MUST NOT require a preinstalled Agnir Skill", "previous Agnir installation conversation", - "successful first use must remain possible from the Svif Plugin procedure itself", + "If that resolution is unavailable, surface the blocker instead of inventing a version", "bootstrap capability blocker", ): self.assertIn(marker, text) diff --git a/tests/test_plugin_installation_docs.py b/tests/test_plugin_installation_docs.py index b84cde5..a8924f9 100644 --- a/tests/test_plugin_installation_docs.py +++ b/tests/test_plugin_installation_docs.py @@ -69,19 +69,20 @@ def test_public_listing_and_review_materials_are_documented(self) -> None: ): self.assertIn(marker, text) - def test_plugin_readme_and_skill_keep_agent_activation_mandatory(self) -> None: + def test_plugin_readme_and_skill_keep_version_appropriate_agent_activation_mandatory(self) -> None: readme = PLUGIN_README.read_text(encoding="utf-8") skill = SKILL.read_text(encoding="utf-8") for marker in ( - "Agent-operable Agnir Project", - "repository-filesystem/0.1", - "Project root -> AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml -> durable memory", - "before normal Project work", + "preserve an existing Agnir Project's declared Core/profile compatibility", + "latest published stable Agnir", + "version-appropriate durable activation route", + "AGENTS.md -> AGNIR.md -> AGNIR.yaml", + "AGENTS.md -> README.md / Agnir Project Instructions -> AGNIR.yaml", ): self.assertIn(marker, readme) - self.assertIn("the durable activation route is mandatory before normal Project work", skill) + self.assertIn("the durable activation route required by that Project's compatible Agnir installation is mandatory", skill) self.assertIn("current Agent can directly open `AGNIR.yaml`", skill) def test_repository_preview_uses_short_intent_and_immutable_release_ref(self) -> None: From 0fbd3336f3118074428e68485d1fe31ed4f690cc Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:24:07 +0800 Subject: [PATCH 14/15] chore: retire bootstrap apply helper --- .github/workflows/bootstrap-apply.yml | 55 --------------------------- 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/bootstrap-apply.yml diff --git a/.github/workflows/bootstrap-apply.yml b/.github/workflows/bootstrap-apply.yml deleted file mode 100644 index 49f91d2..0000000 --- a/.github/workflows/bootstrap-apply.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Apply verified bootstrap version-selection patch - -on: - push: - branches: - - fix/bootstrap-agnir-version-selection - paths: - - ".github/workflows/bootstrap-apply.yml" - -permissions: - contents: write - -jobs: - apply: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - ref: fix/bootstrap-agnir-version-selection - fetch-depth: 1 - - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - name: Decode and apply reviewed patch - shell: bash - run: | - set -euo pipefail - python - <<'PY' - import base64, gzip, hashlib - from pathlib import Path - encoded = "".join(Path(name).read_text(encoding="utf-8").strip() for name in (".github/bootstrap-payload-0a.txt", ".github/bootstrap-payload-0b.txt", ".github/bootstrap-payload-1.txt", ".github/bootstrap-payload-2.txt", ".github/bootstrap-payload-3.txt")) - patch = gzip.decompress(base64.b64decode(encoded, validate=True)) - digest = hashlib.sha256(patch).hexdigest() - print("patch_sha256=" + digest) - assert digest == "c2e75891814da41d7bd933c1fb0b9edbdb078de0526d269e62dd72e919d6c056" - Path("/tmp/bootstrap.patch").write_bytes(patch) - PY - git apply --index --binary /tmp/bootstrap.patch - git rm .github/bootstrap-payload.txt .github/bootstrap-payload-0.txt .github/bootstrap-payload-0a.txt .github/bootstrap-payload-0b.txt .github/bootstrap-payload-1.txt .github/bootstrap-payload-2.txt .github/bootstrap-payload-3.txt - - name: Verify full candidate - shell: bash - run: | - set -euo pipefail - git diff --check --cached - python checks/check_repository.py - python conformance/check_contracts.py - PYTHONPATH=src python -B -m unittest discover -s tests -v - - name: Publish tested candidate to branch - shell: bash - run: | - set -euo pipefail - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git commit -m "fix: select Agnir bootstrap from Project truth" - git push origin HEAD:refs/heads/fix/bootstrap-agnir-version-selection From b97f70e5e4388b4bc666899638354dc4d60a017d Mon Sep 17 00:00:00 2001 From: mattamior Date: Sun, 20 Sep 2026 23:24:08 +0800 Subject: [PATCH 15/15] chore: retire bootstrap export helper --- .github/workflows/bootstrap-edit-export.yml | 25 --------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/workflows/bootstrap-edit-export.yml diff --git a/.github/workflows/bootstrap-edit-export.yml b/.github/workflows/bootstrap-edit-export.yml deleted file mode 100644 index 411031b..0000000 --- a/.github/workflows/bootstrap-edit-export.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Export bootstrap edit source - -on: - push: - branches: - - fix/bootstrap-agnir-version-selection - paths: - - .github/workflows/bootstrap-edit-export.yml - -permissions: - contents: read - -jobs: - export: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - ref: fix/bootstrap-agnir-version-selection - - uses: actions/upload-artifact@v4 - with: - name: svif-bootstrap-edit-source - path: . - include-hidden-files: true - retention-days: 2