MUSE-BRIDGE-WORKFLOW.md markdown
244 lines 13.7 KB
Raw
sha256:f88ec0083b3bcac6a4b7b99c8cc196194ef376aab2c4f2f63e8dfe26256ac6b7 docs: reconcile v1 prerelease publication and operating guides Human 7 days ago

Controlled Muse → GitHub mirror

The kit's repaired Muse source was accepted in staging, mirrored to GitHub and accepted through PR #86 before rc.1 publication. The publication record binds the exact source, mirror and accepted Git tree; public evidence links the three retained hosted runs and release. This is bounded prerelease evidence, not stable or complete-product readiness.

The optional runtime is a pinned Overseer recovery build of Muse rc5, not an upstream release; retain its exact contract. Git-only remains permanent. Muse adoption and every source/mirror publication are explicit choices. This runbook does not authorize a new remote write.

mirror reconcile prepares a reviewed two-parent initial commit when a legacy mirror already exists. Ordinary prepare still refuses an existing remote branch on first preparation. A later docs source/PR is a new candidate with new identities; never relabel it as rc.1 or export it onto an existing development tree.

The current workflow replaces the old deploy script's implicit export/push. The script and its template now delegate to the repository-bound ok mirror command. There is no default source, target, remote, watch mode, automatic hook or push.

Reviewed input

Use an initialized Muse-authoritative source checkout, with main materialized at the approved revision and a separate, absent physical target path outside the source, its shared Muse store, and the kit installation. Its parent must exist. R2 creates a dedicated bare Git repository. It never exports onto a development worktree, clones a remote, adopts an existing Git directory, or removes foreign content. Even an existing empty directory is refused. Subsequent operations may reuse only that exact owned target and source/destination pair.

Save reviewed JSON under .overseer/local/approved-mirror.json. Required schema:

{
  "schema": 1,
  "source": {
    "repo_id": "sha256:<64 lowercase hex digits>",
    "branch": "main",
    "revision": "sha256:<approved immutable revision>",
    "hub_url": "https://staging.musehub.ai/OWNER/REPOSITORY"
  },
  "destination": {
    "url": "https://github.com/OWNER/REPOSITORY.git",
    "repository": "OWNER/REPOSITORY",
    "branch": "muse-mirror",
    "base": "main",
    "expected_head": "absent"
  },
  "target": "/physical/isolated/mirror.git",
  "expected_target": "absent",
  "executables": ["path/to/approved-executable"]
}

For this kit's rc5 source preparation, explicitly stage new dot-directory files such as .github/workflows/supported-v1.yml: recursive muse code add . can omit them. Compare the actual native snapshot and mirror against the reviewed source manifest. A successful command alone does not prove dotfile inclusion.

The executable list must be sorted, unique, and contain exactly the projected executable paths. The source logical ID must match the existing R1 binding. The checkout UUID/root, kit runtime and separate Muse runtime are also checked. The plan's raw SHA-256 is a required command argument; an edited plan needs fresh review and a new digest. Source main and the full immutable revision must agree. A supplied approved revision is not a live observation of Hub acceptance.

Ordinary first preparation requires both heads to be absent. For a later revision, set expected_target to the current verified local mirror commit and expected_head to the reviewed destination branch head (40 lowercase hex digits). Keep the same plan and digest when retrying incomplete delivery. Changing the destination pair or migrating an old mirror requires explicit reconciliation. Unowned targets are always refused, including historical extra files/local bindings.

Explicit local legacy reconciliation

This bounded operation supports related Git histories whose approved heads have identical trees, as observed for this kit. It does not merge old content. Obtain a complete SHA-1 v2 Git bundle from a separate inspection repository, containing exactly refs/heads/muse-mirror and refs/heads/main (or the plan's named branches). Only those approved histories may be included; prerequisites, extra refs/objects, unrelated heads, different base trees and unsafe bundle paths are refused. Creating a bundle from retained local objects is offline; any new remote fetch needs its own authority. The physical bundle must be a singly linked, non-executable regular file, at most 128 MiB compressed; Git subprocesses have a 30-second deadline.

Keep the ordinary plan fields. Set expected_target to absent and destination expected_head to the approved legacy mirror SHA, and add:

{
  "reconciliation": {
    "bundle": "/physical/reviewed-history.bundle",
    "bundle_sha256": "<raw SHA-256 of the complete bundle>",
    "mirror_head": "<40-character approved legacy mirror SHA>",
    "base_head": "<40-character approved GitHub base SHA>",
    "delta": {
      "example/removed-local-file": {
        "before": "<raw SHA-256 of old bytes>",
        "after": null,
        "mode_before": "100644",
        "mode_after": null
      }
    }
  }
}

delta must enumerate every changed path, with raw before/after SHA-256 and 100644/100755 modes; absence is JSON null. The engine computes and compares the complete delta against the source projection. Missing or unexplained deletions, mode changes and extra dispositions fail. The plan's raw digest covers all of it.

Run mirror reconcile with the usual --plan-file and --expect-plan arguments. The engine validates and unpacks the bundle into a temporary bare repository using strict Git object checking, verifies reachability and the exact disposition, then installs its owned target at the absent physical path. It imports no configuration, hooks, remotes, alternates, working files or foreign refs. The initial source-exact commit has the legacy mirror as first parent and GitHub base as second parent. Both histories become ancestors without force or an automatic content merge.

Retry reconcile with the same plan; verify remains read-only. Interrupted import does not install a partial target. Interrupted ref/record writes use the normal verified retry path. The ownership marker and correspondence record retain the entire reconciliation binding. Later exports keep that reconciliation block unchanged, advance the ordinary expected heads/source revision, and use prepare; their sole parent is the verified prior mirror commit. The stored origin delta describes the initial reconciliation, not a later source change. An old record without the new tree/parent fields must first run prepare with its exact original plan to refresh correspondence before advancing; verify does not write records.

Delivery rechecks both named GitHub heads, including on retries and before PR work. The initial base must match reconciliation.base_head. A later reviewed source plan may add destination.expected_base with the exact newly approved base SHA; otherwise the original base remains required. This explicit observation pin is covered by the new plan digest and does not change the immutable origin binding. A moved base still refuses until that new plan is reviewed; no automatic rebinding or extra parent is introduced.

Prepare and verify locally

From the initialized source checkout, with the actual approved digest:

./.overseer/bin/ok mirror prepare \
  --plan-file .overseer/local/approved-mirror.json --expect-plan PLAN_SHA256
./.overseer/bin/ok mirror verify \
  --plan-file .overseer/local/approved-mirror.json --expect-plan PLAN_SHA256

./scripts/muse-bridge-deploy.sh prepare ... is an equivalent bound wrapper when that script is installed. Old positional commit-message invocation fails. verify is read-only, performs the real checks, and requires an already prepared commit; it is not the native exporter's unchecked dry-run.

Preparation reads pinned Muse objects through the R1 read-only APIs and validates all blobs, including excluded blobs. It does not invoke native git-export: that version mutates source bridge files, runs bridge hooks, can skip missing objects, and infers modes from shebangs. Git plumbing writes the exact projected tree with no checkout, index, filters or inherited hooks. Each committed blob, mode and path is compared with the approved source before the target ref is updated.

Projection excludes R1 config/launcher/local backups and inputs, canonical NEXT, checkout-local .cursor/, all Git/Muse administration, .env and .env.*, and the old local bridge sentinel. Actual excluded snapshot paths appear in the report; ignore rules alone are not evidence. Templates and living summaries remain. An old snapshot may contain local bindings; projection omits them without changing Muse history. Normal adoption still refuses tracked local bindings under R1.

Supported files are regular, singly linked files. Working bytes must match the snapshot, the shared stage must be empty, and source revision/config are rechecked. Untracked source files are never copied. Source executable bits must agree with the explicit list; Git modes are normalized to 100644/100755. Read/write permission differences such as Muse's generated 0600 become 100644. Symlinks, hardlinks and special permission bits are refused. A shebang is not mode authority. Empty-directory metadata is reported and omitted because Git does not represent it. The local projection limit is 32 MiB of blob bytes, with a 48 MiB helper-output cap and 30-second helper deadline. These are explicit bounds, not full filesystem or arbitrary Muse-domain fidelity.

Source bridge-hook configuration causes refusal and is preserved. Targets must have the exact engine-created Git config and no hooks or foreign entries. Global and environment Git configuration is isolated, and hooks are disabled on every Git command. Nothing installs or activates editor/Muse/Git hooks.

Separately authorized delivery and retry

Only after approving actual payload and named destinations, invoke mirror deliver with the same plan arguments and an explicit physical --gh /path/to/gh executable. No delivery was run against a real remote during R2. Preparation and verification never contact remotes. Ordinary local status/next remain offline.

Git reads and pushes receive an ephemeral credential helper restricted to the exact approved GitHub HTTPS repository path. The helper invokes that physical gh auth token --hostname github.com, keeps the returned token in memory, and answers only Git's matching credential request. Store/erase are no-ops. Helpers are reset per command, HTTP redirects are disabled, and other Git transport protocols are refused. No credential enters a URL, persistent target config, record or report. Fixture tokens validate this wiring. The repaired rc.1 delivery also authenticated successfully, as recorded in the publication closeout; that result does not grant permission for another delivery.

Delivery observes the exact public staging repository's JSON /refs response and requires its code-domain repository ID and main revision to match approval. It refuses unknown, moved or unpublished sources, redirects, unsupported hosts and malformed responses. Authenticated/private MuseHub and production trust are outside this adapter; there is no login, fingerprint reset or host fallback. The public staging read protocol and later authorized source/mirror delivery were verified on 2026-10-09. Native push/readback details remain operator-recorded evidence; public release/CI links have the narrower scope described in the evidence index.

It compares the explicit Git URL/branch head independently of whether export made a new commit, rechecks source/target/remote immediately before writing, uses a normal non-force push of the exact commit to the distribution branch, and reads back the head. A lost push response is resolved by readback. A stale remote stops for reconciliation; there is no force push or direct main publication. Git's push negotiation protects the ref update; these checks are not a cross-service atomic transaction and cannot freeze MuseHub/GitHub while an operation runs.

PR list/create/readback always specify the GitHub repository, head/base branches and target cwd. The PR must be open, from that repository, and at the exact mirror commit. Only an exact empty PR-list response authorizes creation; malformed observations and invalid URLs refuse before any create attempt. Failure remains visible and retryable. Authentication/network/PR failures never erase a successful export or verified push. Retry first observes current state, skips only verified completed stages, and retries missing push/PR work.

Reports separate export, authority, push, and pr, with source checkout UUID, physical roots, revisions, destination repository/branches, observed remote head, and PR URL when verified. An ok preparation result means local preparation only; its push/PR remain not_attempted and Hub remains unchecked offline.

One ordinary source-directory lock and target-parent lock serialize operators. A single .overseer/local/git-bridge.json correspondence record binds this source to one target/pair. Commit trailers bind source revision and exact plan digest. No-change retry retains the Git SHA and record bytes. An interrupted record write can recover from a verified commit with the exact parent/tree/trailers. A new source revision with the same projection gets a correspondence commit with no file delta. Interrupted preparation can leave unreachable local objects, but never publishes an unchecked tree; ordinary rerun can finish. There is no new ledger or daemon.

The validation record distinguishes retained local fixture results from later source/CI/publication evidence.

File History 1 commit
sha256:f88ec0083b3bcac6a4b7b99c8cc196194ef376aab2c4f2f63e8dfe26256ac6b7 docs: reconcile v1 prerelease publication and operating guides Human 7 days ago