diff --git a/.github/workflows/yield-lab.yml b/.github/workflows/yield-lab.yml new file mode 100644 index 00000000..5f5a0890 --- /dev/null +++ b/.github/workflows/yield-lab.yml @@ -0,0 +1,61 @@ +name: Verify Yield lab + +on: + pull_request: + paths: ["labs/22-yield/**", "go.work", ".github/workflows/yield-lab.yml"] + push: + branches: [main] + paths: ["labs/22-yield/**", "go.work", ".github/workflows/yield-lab.yml"] + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/go-setup + with: + go-version-file: labs/22-yield/yield/go.mod + cache-dependency-path: labs/22-yield/yield/go.sum + - name: Vet and test (includes subprocess e2e) + working-directory: labs/22-yield/yield + run: | + go vet ./... + go test ./... + - name: Fixture run of the reference skill + working-directory: labs/22-yield/yield + run: | + go build -o /tmp/yskill ./cmd/yskill + /tmp/yskill test examples/investigate + + # Shift-left projection gate: materialize the public surface exactly as + # operatorstack/yield would receive it and compile+test it, so a broken + # projection fails at PR time instead of downstream after merge. + projection-build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + - uses: astral-sh/setup-uv@v7 + - name: Project yield to a temp public tree + run: | + mkdir -p "$RUNNER_TEMP/yield-projected" + uv run --project labkit python -m labkit project \ + --config labs/22-yield/publish.config.json \ + --repo "$RUNNER_TEMP/yield-projected" \ + --source-commit "${{ github.sha }}" --write + - uses: ./.github/actions/go-setup + with: + go-version-file: ${{ runner.temp }}/yield-projected/go.mod + cache-dependency-path: ${{ runner.temp }}/yield-projected/go.sum + - name: Build and test the projected module + working-directory: ${{ runner.temp }}/yield-projected + env: + GOWORK: "off" + run: | + go build ./... + go test ./... diff --git a/.github/workflows/yield-publish.yml b/.github/workflows/yield-publish.yml new file mode 100644 index 00000000..77df66d2 --- /dev/null +++ b/.github/workflows/yield-publish.yml @@ -0,0 +1,44 @@ +# Generated by labkit (python -m labkit gen). Do not edit by hand. +# Edit labs//publish.config.json and regenerate; drift fails `labkit doctor`. +name: Publish Yield projection + +on: + push: + branches: [main] + paths: + - "labs/22-yield/**" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: publish-yield-projection + cancel-in-progress: false + +jobs: + dispatch: + if: github.repository == 'operatorstack/intelligence-flow' + runs-on: ubuntu-latest + steps: + - name: Create Operator Stack Publisher token + id: app-token + uses: actions/create-github-app-token@v3 + with: + client-id: ${{ vars.OPERATOR_STACK_PUBLISHER_APP_CLIENT_ID || vars.BOATSTACK_APP_CLIENT_ID }} + private-key: ${{ secrets.OPERATOR_STACK_PUBLISHER_APP_PRIVATE_KEY || secrets.BOATSTACK_APP_PRIVATE_KEY }} + owner: operatorstack + repositories: yield + permission-actions: write + permission-contents: read + + - name: Dispatch Yield sync + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + SOURCE_COMMIT: ${{ github.sha }} + shell: bash + run: >- + gh workflow run sync-upstream.yml + --repo operatorstack/yield + --ref main + -f source_commit="$SOURCE_COMMIT" diff --git a/labs/22-yield/.labkit/generated/release.yml b/labs/22-yield/.labkit/generated/release.yml new file mode 100644 index 00000000..82206964 --- /dev/null +++ b/labs/22-yield/.labkit/generated/release.yml @@ -0,0 +1,94 @@ +# Generated by labkit (python -m labkit gen). Do not edit by hand. +# Edit labs//publish.config.json and regenerate; drift fails `labkit doctor`. +# Install into operatorstack/yield at .github/workflows/release.yml (bootstrap step). +name: Release Yield + +on: + push: + branches: [main] + workflow_dispatch: + inputs: + bump: + description: Version bump for a manual release + type: choice + options: [patch, minor, major] + default: patch + +permissions: + contents: write + pull-requests: read + +concurrency: + group: release-yield + cancel-in-progress: false + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Resolve release policy + id: policy + env: + GH_TOKEN: ${{ github.token }} + MANUAL_BUMP: ${{ inputs.bump }} + shell: bash + run: | + bump="${MANUAL_BUMP:-patch}" + skip="false" + if [[ "${GITHUB_EVENT_NAME}" == "push" ]]; then + labels="$(gh api \ + -H 'Accept: application/vnd.github+json' \ + "/repos/${GITHUB_REPOSITORY}/commits/${GITHUB_SHA}/pulls" \ + --jq '.[0].labels[].name' 2>/dev/null || true)" + if grep -qx 'skip-release' <<<"$labels"; then skip="true"; fi + if grep -qx 'major' <<<"$labels"; then + bump="major" + elif grep -qx 'minor' <<<"$labels"; then + bump="minor" + fi + fi + echo "bump=$bump" >> "$GITHUB_OUTPUT" + echo "skip=$skip" >> "$GITHUB_OUTPUT" + - name: Compute version + if: steps.policy.outputs.skip != 'true' + id: version + env: + BUMP: ${{ steps.policy.outputs.bump }} + shell: bash + run: | + latest="$(git tag --list 'v[0-9]*' --sort=-v:refname | head -n 1)" + if [[ -z "$latest" ]]; then + next="v0.1.0" + else + raw="${latest#v}" + IFS=. read -r major minor patch <<<"$raw" + case "$BUMP" in + major) major=$((major + 1)); minor=0; patch=0 ;; + minor) minor=$((minor + 1)); patch=0 ;; + patch) patch=$((patch + 1)) ;; + *) echo "Invalid bump: $BUMP" >&2; exit 2 ;; + esac + next="v${major}.${minor}.${patch}" + fi + echo "version=$next" >> "$GITHUB_OUTPUT" + - name: Publish release + if: steps.policy.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + VERSION: ${{ steps.version.outputs.version }} + shell: bash + run: | + if git rev-parse --verify --quiet "refs/tags/$VERSION"; then + echo "Tag $VERSION already exists; nothing to release." + exit 0 + fi + git tag "$VERSION" "$GITHUB_SHA" + git push origin "$VERSION" + gh release create "$VERSION" \ + --repo "$GITHUB_REPOSITORY" \ + --title "$VERSION" \ + --generate-notes \ + --verify-tag diff --git a/labs/22-yield/.labkit/generated/sync-upstream.yml b/labs/22-yield/.labkit/generated/sync-upstream.yml new file mode 100644 index 00000000..1555204c --- /dev/null +++ b/labs/22-yield/.labkit/generated/sync-upstream.yml @@ -0,0 +1,134 @@ +# Generated by labkit (python -m labkit gen). Do not edit by hand. +# Edit labs//publish.config.json and regenerate; drift fails `labkit doctor`. +# Install into operatorstack/yield at .github/workflows/sync-upstream.yml (bootstrap step). +name: Sync from Intelligence Flow + +on: + schedule: + - cron: "19 */6 * * *" + workflow_dispatch: + inputs: + source_commit: + description: Exact Intelligence Flow commit to project (defaults to main) + required: false + type: string + +permissions: + contents: write + pull-requests: write + +concurrency: + group: sync-intelligence-flow + cancel-in-progress: false + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: Create Operator Stack Publisher token + id: app-token + uses: actions/create-github-app-token@v3 + with: + client-id: ${{ vars.OPERATOR_STACK_PUBLISHER_APP_CLIENT_ID || vars.BOATSTACK_APP_CLIENT_ID }} + private-key: ${{ secrets.OPERATOR_STACK_PUBLISHER_APP_PRIVATE_KEY || secrets.BOATSTACK_APP_PRIVATE_KEY }} + owner: operatorstack + repositories: | + intelligence-flow + yield + permission-contents: write + permission-pull-requests: write + - name: Check out Yield + uses: actions/checkout@v4 + with: + path: public-repo + token: ${{ steps.app-token.outputs.token }} + - name: Check out Intelligence Flow + uses: actions/checkout@v4 + with: + repository: operatorstack/intelligence-flow + ref: ${{ inputs.source_commit || 'main' }} + fetch-depth: 0 + path: intelligence-flow + token: ${{ steps.app-token.outputs.token }} + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Install labkit + shell: bash + run: python3 -m pip install --quiet ./intelligence-flow/labkit + - name: Generate projection + id: generate + shell: bash + run: | + source_commit="$(git -C intelligence-flow log -1 --format=%H -- labs/22-yield)" + current_commit="$(jq -r '.source.commit // empty' public-repo/UPSTREAM.json 2>/dev/null || echo '')" + if [[ -n "$current_commit" ]] && + ! git -C intelligence-flow merge-base --is-ancestor "$current_commit" "$source_commit"; then + echo "Ignoring stale request; Yield already records $current_commit." + echo "stale=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + python3 -m labkit project \ + --config intelligence-flow/labs/22-yield/publish.config.json \ + --repo public-repo \ + --source-commit "$source_commit" \ + --write + echo "source_commit=$source_commit" >> "$GITHUB_OUTPUT" + echo "stale=false" >> "$GITHUB_OUTPUT" + - name: Open generated pull request + if: steps.generate.outputs.stale != 'true' + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + SOURCE_COMMIT: ${{ steps.generate.outputs.source_commit }} + shell: bash + run: | + cd public-repo + if [[ -z "$(git status --porcelain)" ]]; then + echo "Yield already matches Intelligence Flow." + exit 0 + fi + git add -A + rewritten=() + while IFS= read -r note; do rewritten+=("$note"); done < <( + git diff --cached --name-only --diff-filter=MD --no-renames -- 'release-notes/*.md') + if (( ${#rewritten[@]} > 0 )); then + echo "BLOCKED: Yield release notes are append-only:" >&2 + printf ' %s\n' "${rewritten[@]}" >&2 + exit 1 + fi + added=() + while IFS= read -r note; do added+=("$note"); done < <( + git diff --cached --name-only --diff-filter=A --no-renames -- 'release-notes/*.md' | LC_ALL=C sort) + if (( ${#added[@]} == 0 )); then + echo "BLOCKED: projected changes require a release note in release-notes/." >&2 + exit 1 + fi + body_file="$(mktemp)" + { + echo "## What this sync releases"; echo + for note in "${added[@]}"; do cat "$note"; echo; done + echo "
Projection provenance"; echo + echo "Generated from \`operatorstack/intelligence-flow@$SOURCE_COMMIT\`." + echo "Review provenance, tests, and examples before merging."; echo + echo "
" + } > "$body_file" + short="${SOURCE_COMMIT:0:12}" + branch="sync/intelligence-flow-$short" + existing="$(gh pr list --head "$branch" --state open --json url --jq '.[0].url')" + git config user.name "${{ steps.app-token.outputs.app-slug }}[bot]" + git config user.email "${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com" + git switch -c "$branch" + git commit -m "Sync Yield from Intelligence Flow @ $short" + git push --force --set-upstream origin "$branch" + if [[ -z "$existing" ]]; then + pr_url="$(gh pr create --base main --head "$branch" \ + --title "Sync Yield from Intelligence Flow @ $short" \ + --body-file "$body_file")" + echo "Opened generated PR: $pr_url" + else + pr_url="$existing" + echo "Updated existing PR: $existing" + fi + gh pr merge "$pr_url" --auto --squash + echo "Native auto-merge requested; branch protection owns merge eligibility." diff --git a/labs/22-yield/.labkit/generated/verify.yml b/labs/22-yield/.labkit/generated/verify.yml new file mode 100644 index 00000000..3c037e86 --- /dev/null +++ b/labs/22-yield/.labkit/generated/verify.yml @@ -0,0 +1,56 @@ +# Generated by labkit (python -m labkit gen). Do not edit by hand. +# Edit labs//publish.config.json and regenerate; drift fails `labkit doctor`. +# Install into operatorstack/yield at .github/workflows/verify.yml (bootstrap step). +name: Verify Yield distribution + +on: + pull_request: + push: + branches: [main] + +permissions: + contents: read + +concurrency: + group: verify-yield-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache: true + - run: go test ./... + - run: go build ./... + + verify-sync-provenance: + if: >- + github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name == github.repository && + startsWith(github.head_ref, 'sync/intelligence-flow-') + needs: test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Verify generated projection provenance + env: + HEAD_BRANCH: ${{ github.head_ref }} + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + shell: bash + run: | + source_repo="$(jq -r '.source.repository' UPSTREAM.json)" + source_commit="$(jq -r '.source.commit' UPSTREAM.json)" + short="${source_commit:0:12}" + [[ "$PR_AUTHOR" == "operator-stack-publisher[bot]" ]] + [[ "$source_repo" == "operatorstack/intelligence-flow" ]] + [[ "$HEAD_BRANCH" == "sync/intelligence-flow-$short" ]] diff --git a/labs/22-yield/distribution/release-notes/2026-08-01-initial-projection.md b/labs/22-yield/distribution/release-notes/2026-08-01-initial-projection.md new file mode 100644 index 00000000..2b789e8b --- /dev/null +++ b/labs/22-yield/distribution/release-notes/2026-08-01-initial-projection.md @@ -0,0 +1,5 @@ +### Yield is now published from Intelligence Flow + +This repository is a projection of `operatorstack/intelligence-flow` at `labs/22-yield`. Do not edit files +here directly; changes land via the automated sync PR. See the lab's +`publish.config.json` for the published surface. diff --git a/labs/22-yield/public-readme/README.md b/labs/22-yield/public-readme/README.md new file mode 100644 index 00000000..5dbbcc22 --- /dev/null +++ b/labs/22-yield/public-readme/README.md @@ -0,0 +1,81 @@ +# Yield + +Programmable skills for coding agents. **Turn `SKILL.md` workflows into +resumable programs.** + +> The skill yields the next typed operation. The coding agent performs it +> and resumes the skill. + +Write control flow in Go. Yield user questions, agent tasks, and commands +to the coding agent. Resume from the result. No custom agent runtime +required — the agent only runs a CLI and follows envelopes. + +A skill keeps its thin `SKILL.md` (so it works wherever skills work today) +and moves the part prose loses under context pressure — order, branching, +retries, approval, state, completion — into a deterministic program. The +model keeps reasoning, exploration, editing, and judgment. + +## How it works + +Deterministic re-execution: on every run/resume, `yskill` re-executes the +skill program from the top, feeding recorded responses back in order. At +the first unanswered operation the SDK emits a `yield.v1` request envelope +and the process exits — no daemon. A replayed step that produces a +different operation than the journal recorded is a divergence and fails +the run loudly; it never silently forks. + +- **`yskill` (supervisor)** owns the append-only run log + (`.yield/runs/.jsonl`), sequence and digest binding, response + validation, and every refusal (stale, duplicate, wrong-run, + schema-invalid, digest-mismatch, completion-unproven). +- **The skill program** is an ordinary Go `main` using `sdk/yield`; every + side effect crosses a yielded primitive. + +Five primitives, two exits: + +| primitive | who acts | +|---|---| +| `AskUser` | the agent asks through its normal interface | +| `AgentTask` | the model reasons; the result must be schema-valid JSON | +| `RunCommand` | **yskill executes it itself** — results are observed fact, not transcription | +| `Require` | a claim bound to evidence; failure makes completion structurally unreachable | +| `Complete` / `Blocked` / `Refused` | honest terminals, always recorded | + +## Try it + +``` +go build -o yskill ./cmd/yskill +./yskill test examples/investigate # scripted fixture run to completion +./yskill run examples/investigate # prints the first operation envelope +./yskill init my-skill # scaffold, or wrap an existing prose skill +``` + +The reference skill, `examples/investigate`, encodes an investigation +discipline in code: at least three hypotheses, cheapest-to-disprove +first, at most three failed attempts, completion requires a causal chain +— or an honest `Blocked` at the frontier. + +## What it guarantees — and what it doesn't + +Guaranteed: deterministic control flow, typed requests/responses, +persistent state, replay (divergence fails loudly), stale/duplicate +rejection, evidence-bound completion. + +Not guaranteed: that the agent performed *only* the requested operation, +or that a schema-valid `agent_task` result is true — schema validity is +not truth. `RunCommand` is the exception by construction: commands are +executed by the supervisor, so exit codes and output enter the log as +observed fact. The formal analysis behind this line is in +`docs/locus-yield.md`. + +## What it is not + +Not a daemon, not a hosted runtime, not a workflow DSL, not a +marketplace, not a new agent loop, not a multi-agent orchestrator, not a +security sandbox. + +--- + +This repository is a one-directional projection of +`operatorstack/intelligence-flow` (`labs/22-yield`). Changes land via the +automated sync PR; do not edit files here directly. MIT licensed. diff --git a/labs/22-yield/publish.config.json b/labs/22-yield/publish.config.json new file mode 100644 index 00000000..66c161e1 --- /dev/null +++ b/labs/22-yield/publish.config.json @@ -0,0 +1,44 @@ +{ + "schema_version": 1, + "project": "yield", + "display_name": "Yield", + "source": { + "repo": "operatorstack/intelligence-flow", + "lab_path": "labs/22-yield" + }, + "target": { + "owner": "operatorstack", + "repo": "yield" + }, + "go_module": "github.com/operatorstack/yield", + "manifest": { + "path": "UPSTREAM.json", + "committed": false, + "style": "projection", + "generator": "operatorstack/yield:project", + "source_path": "labs/22-yield" + }, + "surface": [ + { + "kind": "tree", + "source": "yield", + "dest": ".", + "exclude_dirs": [".yield", ".git", "node_modules", "__pycache__", "dist", "build"] + }, + { + "kind": "copy", + "source": "public-readme/README.md", + "dest": "README.md" + } + ], + "release_notes": { + "dir": "distribution/release-notes", + "sync_pr": true + }, + "release": { + "bump_default": "patch" + }, + "sync": { + "auto_merge": true + } +} diff --git a/labs/22-yield/yield/LICENSE b/labs/22-yield/yield/LICENSE new file mode 100644 index 00000000..0bfd7e51 --- /dev/null +++ b/labs/22-yield/yield/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Operator Stack + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/labs/22-yield/yield/cmd/yskill/main.go b/labs/22-yield/yield/cmd/yskill/main.go index c7aca343..aac22d91 100644 --- a/labs/22-yield/yield/cmd/yskill/main.go +++ b/labs/22-yield/yield/cmd/yskill/main.go @@ -10,8 +10,8 @@ import ( "os" "path/filepath" - "yield/internal/engine" - "yield/internal/protocol" + "github.com/operatorstack/yield/internal/engine" + "github.com/operatorstack/yield/internal/protocol" ) const usage = `yskill — turn SKILL.md workflows into resumable programs @@ -274,11 +274,11 @@ func cmdInit(args []string) error { if err := writeIfAbsent("fixtures/responses.json", "{\n \"confirm-start\": {\"value\": \"yes\"}\n}\n"); err != nil { return err } - gomod := fmt.Sprintf("module %s\n\ngo 1.26.5\n\nrequire yield v0.0.0\n", name) + gomod := fmt.Sprintf("module %s\n\ngo 1.26.5\n\nrequire github.com/operatorstack/yield v0.0.0\n", name) if *sdkPath != "" { - gomod += fmt.Sprintf("\nreplace yield => %s\n", *sdkPath) + gomod += fmt.Sprintf("\nreplace github.com/operatorstack/yield => %s\n", *sdkPath) } else { - gomod += "\n// Point this at your yield checkout:\n// replace yield => ../path/to/yield\n" + gomod += "\n// Point this at your yield checkout:\n// replace github.com/operatorstack/yield => ../path/to/yield\n" } if err := writeIfAbsent("go.mod", gomod); err != nil { return err @@ -312,7 +312,7 @@ Do not skip an operation or invent its response. const mainGo = `package main import ( - "yield/sdk/yield" + "github.com/operatorstack/yield/sdk/yield" ) func main() { diff --git a/labs/22-yield/yield/docs/locus/drv-998aecbcb0b652eeb2c966a86c871c2a187729f224435ebf9fe20e9eb7be788e.json b/labs/22-yield/yield/docs/locus/drv-998aecbcb0b652eeb2c966a86c871c2a187729f224435ebf9fe20e9eb7be788e.json new file mode 100644 index 00000000..2b8e2ab9 --- /dev/null +++ b/labs/22-yield/yield/docs/locus/drv-998aecbcb0b652eeb2c966a86c871c2a187729f224435ebf9fe20e9eb7be788e.json @@ -0,0 +1,278 @@ +{ + "schema_version": 1, + "id": "drv-998aecbcb0b652eeb2c966a86c871c2a187729f224435ebf9fe20e9eb7be788e", + "goal": "Decide whether off-protocol agent action is diagnosable from Yield's observation surface: portable run-log-only vs a correlated host adapter", + "subject": "Yield V1 observation surface for off-protocol agent action", + "variants": [ + { + "id": "yield-offprotocol-portable-v1", + "role": "design-candidate", + "model_id": "yield-offprotocol-portable-v1", + "model_sha256": "71f2880721196f42c82cc152c49dff6d0fd4ac71a84586c468f66442bc305051", + "basis": { + "observed": 23, + "inferred": 0, + "assumed": 18 + } + }, + { + "id": "yield-offprotocol-correlated-v1", + "role": "design-candidate", + "model_id": "yield-offprotocol-correlated-v1", + "model_sha256": "9427e2135066d6a89999178b3c6467799153ceb155543e3d9777b39a27193c73", + "basis": { + "observed": 23, + "inferred": 0, + "assumed": 18 + } + } + ], + "runs": [ + { + "operator_id": "control.diagnosability", + "operator_version": "0.1.0", + "variant_id": "yield-offprotocol-portable-v1", + "input_sha256": "71f2880721196f42c82cc152c49dff6d0fd4ac71a84586c468f66442bc305051", + "output_sha256": "fe6352801ce59ae07cb0678642fdd58531228f7011303e454f52323a05045ede", + "verdict": { + "operator_id": "control.diagnosability", + "operator_version": "0.1.0", + "model_id": "yield-offprotocol-portable-v1", + "decision": "applicable", + "satisfied": [ + { + "id": "automaton-states", + "check": "has-facet:states", + "description": "A discrete-event facet with declared states.", + "satisfied": true + }, + { + "id": "automaton-events", + "check": "has-facet:events", + "description": "A declared event alphabet.", + "satisfied": true + }, + { + "id": "automaton-transitions", + "check": "has-facet:transitions", + "description": "Plant transitions over the declared states and events.", + "satisfied": true + }, + { + "id": "observability-partition", + "check": "all-events-marked-observability", + "description": "Every event marked observable or unobservable (the observation mask).", + "satisfied": true, + "obtainable": true + }, + { + "id": "spec-present", + "check": "has-spec-forbidden", + "description": "A specification naming the fault: forbidden states or forbidden (state, event) transitions.", + "satisfied": true, + "obtainable": true + }, + { + "id": "transition-lineage", + "check": "evidence-present:transitions", + "description": "Transitions carry evidence references into the real system.", + "satisfied": true, + "obtainable": true + } + ] + }, + "output": { + "diagnosable": false, + "indistinguishable_pairs": [ + { + "faulty": "BLOCKED", + "normal": "BLOCKED" + }, + { + "faulty": "COMPLETED", + "normal": "COMPLETED" + }, + { + "faulty": "DIVERGED", + "normal": "DIVERGED" + }, + { + "faulty": "OFF_PROTOCOL", + "normal": "PENDING_OP" + }, + { + "faulty": "PENDING_OP", + "normal": "PENDING_OP" + }, + { + "faulty": "REFUSED", + "normal": "REFUSED" + }, + { + "faulty": "REPLAYING", + "normal": "REPLAYING" + }, + { + "faulty": "RUNNING", + "normal": "RUNNING" + }, + { + "faulty": "STALE_RECEIVED", + "normal": "STALE_RECEIVED" + }, + { + "faulty": "VALIDATING", + "normal": "VALIDATING" + } + ], + "witness": [ + "start", + "yield_op" + ] + }, + "verify": { + "schema_ok": true, + "invariants": [ + { + "invariant": "pairs-empty-iff-diagnosable", + "passed": true + } + ], + "accepted": true + }, + "claim_status": "theorem-only" + }, + { + "operator_id": "control.diagnosability", + "operator_version": "0.1.0", + "variant_id": "yield-offprotocol-correlated-v1", + "input_sha256": "9427e2135066d6a89999178b3c6467799153ceb155543e3d9777b39a27193c73", + "output_sha256": "ad7a0594ab20aae277f633c2a7f11633ebdbe518cf2946a10e18f72aab298b1e", + "verdict": { + "operator_id": "control.diagnosability", + "operator_version": "0.1.0", + "model_id": "yield-offprotocol-correlated-v1", + "decision": "applicable", + "satisfied": [ + { + "id": "automaton-states", + "check": "has-facet:states", + "description": "A discrete-event facet with declared states.", + "satisfied": true + }, + { + "id": "automaton-events", + "check": "has-facet:events", + "description": "A declared event alphabet.", + "satisfied": true + }, + { + "id": "automaton-transitions", + "check": "has-facet:transitions", + "description": "Plant transitions over the declared states and events.", + "satisfied": true + }, + { + "id": "observability-partition", + "check": "all-events-marked-observability", + "description": "Every event marked observable or unobservable (the observation mask).", + "satisfied": true, + "obtainable": true + }, + { + "id": "spec-present", + "check": "has-spec-forbidden", + "description": "A specification naming the fault: forbidden states or forbidden (state, event) transitions.", + "satisfied": true, + "obtainable": true + }, + { + "id": "transition-lineage", + "check": "evidence-present:transitions", + "description": "Transitions carry evidence references into the real system.", + "satisfied": true, + "obtainable": true + } + ] + }, + "output": { + "diagnosable": true, + "indistinguishable_pairs": [] + }, + "verify": { + "schema_ok": true, + "invariants": [ + { + "invariant": "pairs-empty-iff-diagnosable", + "passed": true + } + ], + "accepted": true + }, + "claim_status": "theorem-only" + } + ], + "comparisons": [ + { + "operator_id": "control.diagnosability", + "property": "diagnosable", + "status": "decided", + "satisfying": [ + "yield-offprotocol-correlated-v1" + ], + "rejected": [ + { + "variant_id": "yield-offprotocol-portable-v1", + "counterexample": [ + { + "faulty": "BLOCKED", + "normal": "BLOCKED" + }, + { + "faulty": "COMPLETED", + "normal": "COMPLETED" + }, + { + "faulty": "DIVERGED", + "normal": "DIVERGED" + }, + { + "faulty": "OFF_PROTOCOL", + "normal": "PENDING_OP" + }, + { + "faulty": "PENDING_OP", + "normal": "PENDING_OP" + }, + { + "faulty": "REFUSED", + "normal": "REFUSED" + }, + { + "faulty": "REPLAYING", + "normal": "REPLAYING" + }, + { + "faulty": "RUNNING", + "normal": "RUNNING" + }, + { + "faulty": "STALE_RECEIVED", + "normal": "STALE_RECEIVED" + }, + { + "faulty": "VALIDATING", + "normal": "VALIDATING" + } + ] + } + ], + "undetermined": [] + } + ], + "unknowns": [ + "The runtime is not yet implemented; this model is the design intent for labs/22-yield (Go), grounded only in the design artifact.", + "agent_task response content can be fabricated while schema-valid; schema_reject only rejects shape, not truth.", + "Whether run_command is executed by yskill itself (observed fact) or by the agent (transcription) is a design decision pending in the plan." + ] +} diff --git a/labs/22-yield/yield/docs/locus/yield-diag-correlated.json b/labs/22-yield/yield/docs/locus/yield-diag-correlated.json new file mode 100644 index 00000000..ee1eb8e0 --- /dev/null +++ b/labs/22-yield/yield/docs/locus/yield-diag-correlated.json @@ -0,0 +1,344 @@ +{ + "schema_version": 1, + "id": "yield-offprotocol-correlated-v1", + "subject": "Yield off-protocol fault diagnosis, correlated mode: a host adapter surfaces agent actions as observed events correlated with the run log.", + "evidence": [ + { + "path": "private/yield-landing/index.html", + "note": "design artifact: run-log states, five primitives, stale/duplicate rejection, evidence-bound completion, replay-diverges-loudly" + } + ], + "states": [ + { + "id": "CREATED" + }, + { + "id": "RUNNING" + }, + { + "id": "PENDING_OP" + }, + { + "id": "OFF_PROTOCOL" + }, + { + "id": "STALE_RECEIVED" + }, + { + "id": "VALIDATING" + }, + { + "id": "REPLAYING" + }, + { + "id": "REQ_FAILED" + }, + { + "id": "DIVERGED" + }, + { + "id": "COMPLETED", + "marked": true + }, + { + "id": "BLOCKED", + "marked": true + }, + { + "id": "REFUSED", + "marked": true + } + ], + "events": [ + { + "id": "start", + "controllable": true, + "observable": true + }, + { + "id": "yield_op", + "controllable": true, + "observable": true + }, + { + "id": "submit_response", + "controllable": false, + "observable": true + }, + { + "id": "submit_stale", + "controllable": false, + "observable": true + }, + { + "id": "reject_stale", + "controllable": true, + "observable": true + }, + { + "id": "accept_stale", + "controllable": true, + "observable": true + }, + { + "id": "schema_reject", + "controllable": true, + "observable": true + }, + { + "id": "accept_response", + "controllable": true, + "observable": true + }, + { + "id": "replay_ok", + "controllable": false, + "observable": true + }, + { + "id": "replay_diverge", + "controllable": false, + "observable": true + }, + { + "id": "migrate_digest", + "controllable": true, + "observable": true + }, + { + "id": "require_fail", + "controllable": false, + "observable": true + }, + { + "id": "complete", + "controllable": true, + "observable": true + }, + { + "id": "complete_unproven", + "controllable": true, + "observable": true + }, + { + "id": "declare_blocked", + "controllable": true, + "observable": true + }, + { + "id": "declare_refused", + "controllable": true, + "observable": true + }, + { + "id": "archive", + "controllable": false, + "observable": true + }, + { + "id": "agent_off_protocol", + "controllable": false, + "observable": true + } + ], + "transitions": [ + { + "from": "CREATED", + "event": "start", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "yield_op", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "require_fail", + "to": "REQ_FAILED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "complete", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_refused", + "to": "REFUSED", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_response", + "to": "VALIDATING", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_stale", + "to": "STALE_RECEIVED", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "reject_stale", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "accept_stale", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "schema_reject", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "accept_response", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_ok", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_diverge", + "to": "DIVERGED", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "migrate_digest", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "complete_unproven", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "COMPLETED", + "event": "archive", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "BLOCKED", + "event": "archive", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REFUSED", + "event": "archive", + "to": "REFUSED", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "agent_off_protocol", + "to": "OFF_PROTOCOL", + "evidence": [ + 0 + ] + }, + { + "from": "OFF_PROTOCOL", + "event": "submit_response", + "to": "VALIDATING", + "evidence": [ + 0 + ] + } + ], + "spec": { + "description": "Entering OFF_PROTOCOL \u2014 the agent performed actions outside the yielded operation \u2014 is the fault under diagnosis.", + "forbidden_states": [ + "OFF_PROTOCOL" + ] + }, + "targets": { + "selector": "marked" + }, + "unknowns": [ + "The runtime is not yet implemented; this model is the design intent for labs/22-yield (Go), grounded only in the design artifact.", + "agent_task response content can be fabricated while schema-valid; schema_reject only rejects shape, not truth.", + "Whether run_command is executed by yskill itself (observed fact) or by the agent (transcription) is a design decision pending in the plan." + ] +} \ No newline at end of file diff --git a/labs/22-yield/yield/docs/locus/yield-diag-portable.json b/labs/22-yield/yield/docs/locus/yield-diag-portable.json new file mode 100644 index 00000000..b0500b17 --- /dev/null +++ b/labs/22-yield/yield/docs/locus/yield-diag-portable.json @@ -0,0 +1,344 @@ +{ + "schema_version": 1, + "id": "yield-offprotocol-portable-v1", + "subject": "Yield off-protocol fault diagnosis, portable mode: the agent acts outside the yielded operation; the run log sees only protocol events.", + "evidence": [ + { + "path": "private/yield-landing/index.html", + "note": "design artifact: run-log states, five primitives, stale/duplicate rejection, evidence-bound completion, replay-diverges-loudly" + } + ], + "states": [ + { + "id": "CREATED" + }, + { + "id": "RUNNING" + }, + { + "id": "PENDING_OP" + }, + { + "id": "OFF_PROTOCOL" + }, + { + "id": "STALE_RECEIVED" + }, + { + "id": "VALIDATING" + }, + { + "id": "REPLAYING" + }, + { + "id": "REQ_FAILED" + }, + { + "id": "DIVERGED" + }, + { + "id": "COMPLETED", + "marked": true + }, + { + "id": "BLOCKED", + "marked": true + }, + { + "id": "REFUSED", + "marked": true + } + ], + "events": [ + { + "id": "start", + "controllable": true, + "observable": true + }, + { + "id": "yield_op", + "controllable": true, + "observable": true + }, + { + "id": "submit_response", + "controllable": false, + "observable": true + }, + { + "id": "submit_stale", + "controllable": false, + "observable": true + }, + { + "id": "reject_stale", + "controllable": true, + "observable": true + }, + { + "id": "accept_stale", + "controllable": true, + "observable": true + }, + { + "id": "schema_reject", + "controllable": true, + "observable": true + }, + { + "id": "accept_response", + "controllable": true, + "observable": true + }, + { + "id": "replay_ok", + "controllable": false, + "observable": true + }, + { + "id": "replay_diverge", + "controllable": false, + "observable": true + }, + { + "id": "migrate_digest", + "controllable": true, + "observable": true + }, + { + "id": "require_fail", + "controllable": false, + "observable": true + }, + { + "id": "complete", + "controllable": true, + "observable": true + }, + { + "id": "complete_unproven", + "controllable": true, + "observable": true + }, + { + "id": "declare_blocked", + "controllable": true, + "observable": true + }, + { + "id": "declare_refused", + "controllable": true, + "observable": true + }, + { + "id": "archive", + "controllable": false, + "observable": true + }, + { + "id": "agent_off_protocol", + "controllable": false, + "observable": false + } + ], + "transitions": [ + { + "from": "CREATED", + "event": "start", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "yield_op", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "require_fail", + "to": "REQ_FAILED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "complete", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_refused", + "to": "REFUSED", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_response", + "to": "VALIDATING", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_stale", + "to": "STALE_RECEIVED", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "reject_stale", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "accept_stale", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "schema_reject", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "accept_response", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_ok", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_diverge", + "to": "DIVERGED", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "migrate_digest", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "complete_unproven", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "COMPLETED", + "event": "archive", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "BLOCKED", + "event": "archive", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REFUSED", + "event": "archive", + "to": "REFUSED", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "agent_off_protocol", + "to": "OFF_PROTOCOL", + "evidence": [ + 0 + ] + }, + { + "from": "OFF_PROTOCOL", + "event": "submit_response", + "to": "VALIDATING", + "evidence": [ + 0 + ] + } + ], + "spec": { + "description": "Entering OFF_PROTOCOL \u2014 the agent performed actions outside the yielded operation \u2014 is the fault under diagnosis.", + "forbidden_states": [ + "OFF_PROTOCOL" + ] + }, + "targets": { + "selector": "marked" + }, + "unknowns": [ + "The runtime is not yet implemented; this model is the design intent for labs/22-yield (Go), grounded only in the design artifact.", + "agent_task response content can be fabricated while schema-valid; schema_reject only rejects shape, not truth.", + "Whether run_command is executed by yskill itself (observed fact) or by the agent (transcription) is a design decision pending in the plan." + ] +} \ No newline at end of file diff --git a/labs/22-yield/yield/docs/locus/yield-protocol.json b/labs/22-yield/yield/docs/locus/yield-protocol.json new file mode 100644 index 00000000..222c5f74 --- /dev/null +++ b/labs/22-yield/yield/docs/locus/yield-protocol.json @@ -0,0 +1,327 @@ +{ + "schema_version": 1, + "id": "yield-run-lifecycle-protocol-v1", + "subject": "Yield run lifecycle (labs/22-yield design): a Go yskill runtime executes a deterministic skill program that yields typed operations to a coding agent; append-only run log, replay-based resume; evidence-bound completion.", + "evidence": [ + { + "path": "private/yield-landing/index.html", + "note": "design artifact: run-log states, five primitives, stale/duplicate rejection, evidence-bound completion, replay-diverges-loudly" + } + ], + "states": [ + { + "id": "CREATED" + }, + { + "id": "RUNNING" + }, + { + "id": "PENDING_OP" + }, + { + "id": "STALE_RECEIVED" + }, + { + "id": "VALIDATING" + }, + { + "id": "REPLAYING" + }, + { + "id": "REQ_FAILED" + }, + { + "id": "DIVERGED" + }, + { + "id": "COMPLETED", + "marked": true + }, + { + "id": "BLOCKED", + "marked": true + }, + { + "id": "REFUSED", + "marked": true + } + ], + "events": [ + { + "id": "start", + "controllable": true, + "observable": true + }, + { + "id": "yield_op", + "controllable": true, + "observable": true + }, + { + "id": "submit_response", + "controllable": false, + "observable": true + }, + { + "id": "submit_stale", + "controllable": false, + "observable": true + }, + { + "id": "reject_stale", + "controllable": true, + "observable": true + }, + { + "id": "accept_stale", + "controllable": true, + "observable": true + }, + { + "id": "schema_reject", + "controllable": true, + "observable": true + }, + { + "id": "accept_response", + "controllable": true, + "observable": true + }, + { + "id": "replay_ok", + "controllable": false, + "observable": true + }, + { + "id": "replay_diverge", + "controllable": false, + "observable": true + }, + { + "id": "migrate_digest", + "controllable": true, + "observable": true + }, + { + "id": "require_fail", + "controllable": false, + "observable": true + }, + { + "id": "complete", + "controllable": true, + "observable": true + }, + { + "id": "complete_unproven", + "controllable": true, + "observable": true + }, + { + "id": "declare_blocked", + "controllable": true, + "observable": true + }, + { + "id": "declare_refused", + "controllable": true, + "observable": true + }, + { + "id": "archive", + "controllable": false, + "observable": true + } + ], + "transitions": [ + { + "from": "CREATED", + "event": "start", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "yield_op", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "require_fail", + "to": "REQ_FAILED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "complete", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "RUNNING", + "event": "declare_refused", + "to": "REFUSED", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_response", + "to": "VALIDATING", + "evidence": [ + 0 + ] + }, + { + "from": "PENDING_OP", + "event": "submit_stale", + "to": "STALE_RECEIVED", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "reject_stale", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "STALE_RECEIVED", + "event": "accept_stale", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "schema_reject", + "to": "PENDING_OP", + "evidence": [ + 0 + ] + }, + { + "from": "VALIDATING", + "event": "accept_response", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_ok", + "to": "RUNNING", + "evidence": [ + 0 + ] + }, + { + "from": "REPLAYING", + "event": "replay_diverge", + "to": "DIVERGED", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "migrate_digest", + "to": "REPLAYING", + "evidence": [ + 0 + ] + }, + { + "from": "DIVERGED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "declare_blocked", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REQ_FAILED", + "event": "complete_unproven", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "COMPLETED", + "event": "archive", + "to": "COMPLETED", + "evidence": [ + 0 + ] + }, + { + "from": "BLOCKED", + "event": "archive", + "to": "BLOCKED", + "evidence": [ + 0 + ] + }, + { + "from": "REFUSED", + "event": "archive", + "to": "REFUSED", + "evidence": [ + 0 + ] + } + ], + "spec": { + "description": "Protocol-integrity spec: a stale/duplicate response must never be accepted into replay, and a run whose requirement failed must never complete.", + "forbidden_transitions": [ + { + "from": "STALE_RECEIVED", + "event": "accept_stale" + }, + { + "from": "REQ_FAILED", + "event": "complete_unproven" + } + ] + }, + "targets": { + "selector": "marked" + }, + "unknowns": [ + "The runtime is not yet implemented; this model is the design intent for labs/22-yield (Go), grounded only in the design artifact.", + "agent_task response content can be fabricated while schema-valid; schema_reject only rejects shape, not truth.", + "Whether run_command is executed by yskill itself (observed fact) or by the agent (transcription) is a design decision pending in the plan." + ] +} \ No newline at end of file diff --git a/labs/22-yield/yield/examples/investigate/main.go b/labs/22-yield/yield/examples/investigate/main.go index dc51f950..3abfabe0 100644 --- a/labs/22-yield/yield/examples/investigate/main.go +++ b/labs/22-yield/yield/examples/investigate/main.go @@ -9,7 +9,7 @@ import ( "encoding/json" "fmt" - "yield/sdk/yield" + "github.com/operatorstack/yield/sdk/yield" ) type hypothesis struct { diff --git a/labs/22-yield/yield/go.mod b/labs/22-yield/yield/go.mod index a045a6fb..60e26d9d 100644 --- a/labs/22-yield/yield/go.mod +++ b/labs/22-yield/yield/go.mod @@ -1,4 +1,4 @@ -module yield +module github.com/operatorstack/yield go 1.26.5 diff --git a/labs/22-yield/yield/internal/engine/engine.go b/labs/22-yield/yield/internal/engine/engine.go index 79641b61..cd41cd88 100644 --- a/labs/22-yield/yield/internal/engine/engine.go +++ b/labs/22-yield/yield/internal/engine/engine.go @@ -17,9 +17,9 @@ import ( "strings" "time" - "yield/internal/guard" - "yield/internal/protocol" - "yield/internal/runlog" + "github.com/operatorstack/yield/internal/guard" + "github.com/operatorstack/yield/internal/protocol" + "github.com/operatorstack/yield/internal/runlog" ) // Engine binds a skill directory to a runs directory. diff --git a/labs/22-yield/yield/internal/engine/engine_test.go b/labs/22-yield/yield/internal/engine/engine_test.go index 8bd09791..9df4815d 100644 --- a/labs/22-yield/yield/internal/engine/engine_test.go +++ b/labs/22-yield/yield/internal/engine/engine_test.go @@ -7,9 +7,9 @@ import ( "strings" "testing" - "yield/internal/guard" - "yield/internal/protocol" - "yield/internal/runlog" + "github.com/operatorstack/yield/internal/guard" + "github.com/operatorstack/yield/internal/protocol" + "github.com/operatorstack/yield/internal/runlog" ) // testEngine points at a testdata skill but keeps run logs in a temp dir, diff --git a/labs/22-yield/yield/internal/engine/testdata/skill-basic/main.go b/labs/22-yield/yield/internal/engine/testdata/skill-basic/main.go index 9e9dfc64..421076aa 100644 --- a/labs/22-yield/yield/internal/engine/testdata/skill-basic/main.go +++ b/labs/22-yield/yield/internal/engine/testdata/skill-basic/main.go @@ -4,7 +4,7 @@ package main import ( "encoding/json" - "yield/sdk/yield" + "github.com/operatorstack/yield/sdk/yield" ) func main() { diff --git a/labs/22-yield/yield/internal/engine/testdata/skill-envbranch/main.go b/labs/22-yield/yield/internal/engine/testdata/skill-envbranch/main.go index 51aaf689..bc6a9b72 100644 --- a/labs/22-yield/yield/internal/engine/testdata/skill-envbranch/main.go +++ b/labs/22-yield/yield/internal/engine/testdata/skill-envbranch/main.go @@ -5,7 +5,7 @@ package main import ( "os" - "yield/sdk/yield" + "github.com/operatorstack/yield/sdk/yield" ) func main() { diff --git a/labs/22-yield/yield/internal/engine/testdata/skill-reqfail/main.go b/labs/22-yield/yield/internal/engine/testdata/skill-reqfail/main.go index 6d0651d8..08dc8104 100644 --- a/labs/22-yield/yield/internal/engine/testdata/skill-reqfail/main.go +++ b/labs/22-yield/yield/internal/engine/testdata/skill-reqfail/main.go @@ -3,7 +3,7 @@ package main import ( - "yield/sdk/yield" + "github.com/operatorstack/yield/sdk/yield" ) func main() { diff --git a/labs/22-yield/yield/internal/guard/guard.go b/labs/22-yield/yield/internal/guard/guard.go index 04094a21..0cf301a3 100644 --- a/labs/22-yield/yield/internal/guard/guard.go +++ b/labs/22-yield/yield/internal/guard/guard.go @@ -7,8 +7,8 @@ package guard import ( "fmt" - "yield/internal/protocol" - "yield/internal/runlog" + "github.com/operatorstack/yield/internal/protocol" + "github.com/operatorstack/yield/internal/runlog" ) type RejectReason string diff --git a/labs/22-yield/yield/internal/guard/guard_test.go b/labs/22-yield/yield/internal/guard/guard_test.go index d8050069..15b99590 100644 --- a/labs/22-yield/yield/internal/guard/guard_test.go +++ b/labs/22-yield/yield/internal/guard/guard_test.go @@ -5,7 +5,7 @@ import ( "strings" "testing" - "yield/internal/protocol" + "github.com/operatorstack/yield/internal/protocol" ) // These tests are the discharge of the supervisory obligations from the diff --git a/labs/22-yield/yield/sdk/yield/yield.go b/labs/22-yield/yield/sdk/yield/yield.go index 2417b75f..a970517a 100644 --- a/labs/22-yield/yield/sdk/yield/yield.go +++ b/labs/22-yield/yield/sdk/yield/yield.go @@ -16,7 +16,7 @@ import ( "fmt" "os" - "yield/internal/protocol" + "github.com/operatorstack/yield/internal/protocol" ) // EnvJournal names the environment variable pointing at the journal file