@openrig/cli 0.5.6 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/README.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/loading-addressable-markdown/SKILL.md +34 -0
- package/daemon/assets/plugins/openrig-core/skills/loading-addressable-markdown/scripts/resolve-markdown.mjs +170 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +1 -4
- package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -3
- package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +4 -9
- package/daemon/assets/vm-preview-fixtures/workflows/sample-basic-loop.yaml +3 -3
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/SKILL.md +120 -0
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +10 -0
- package/daemon/context-packs/skills/claude-compaction-restore/SKILL.md +166 -0
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +18 -0
- package/daemon/context-packs/skills/claude-compaction-restore/scripts/precompact-hook.mjs +174 -0
- package/daemon/context-packs/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs +487 -0
- package/daemon/context-packs/skills/claude-compaction-restore/templates/compact-instruction.md +1 -0
- package/daemon/context-packs/skills/claude-compaction-restore/templates/post-compact-restore-instruction.md +1 -0
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +1 -4
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/SKILL.md +43 -0
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +10 -0
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +318 -0
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +10 -0
- package/daemon/context-packs/skills/loading-addressable-markdown/SKILL.md +34 -0
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +12 -0
- package/daemon/context-packs/skills/loading-addressable-markdown/scripts/resolve-markdown.mjs +170 -0
- package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +94 -0
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +10 -0
- package/daemon/context-packs/skills/openrig-operating-model/SKILL.md +397 -0
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +30 -0
- package/daemon/context-packs/skills/openrig-operating-model/scripts/compose.py +572 -0
- package/daemon/context-packs/skills/openrig-operating-model/scripts/scaffold.sh +34 -0
- package/daemon/context-packs/skills/openrig-operating-model/scripts/trace-due.sh +32 -0
- package/daemon/context-packs/skills/openrig-operating-model/scripts/trace-stamp.sh +5 -0
- package/daemon/context-packs/skills/openrig-operating-model/scripts/trunk-diff.sh +18 -0
- package/daemon/context-packs/skills/openrig-operating-model/templates/LEARNED.md +40 -0
- package/daemon/context-packs/skills/openrig-operating-model/templates/NOTES.md +9 -0
- package/daemon/context-packs/skills/openrig-operating-model/templates/PLAYBOOK.md +5 -0
- package/daemon/context-packs/skills/openrig-operating-model/templates/SOP.md +24 -0
- package/daemon/context-packs/skills/openrig-operating-model/templates/SPEC.md +54 -0
- package/daemon/context-packs/skills/openrig-user/SKILL.md +1374 -0
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +10 -0
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/CHANGELOG.md +64 -0
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/SKILL.md +250 -0
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +12 -0
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/SKILL.md +21 -15
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +3 -3
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/SKILL.md +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/SKILL.md +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/queue-handoff/SKILL.md +192 -0
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +10 -0
- package/daemon/context-packs/skills/refocusing/SKILL.md +31 -0
- package/daemon/context-packs/skills/refocusing/manifest.yaml +14 -0
- package/daemon/context-packs/skills/refocusing/references/refocus.md +22 -0
- package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +264 -0
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/CHANGELOG.md +48 -0
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/SKILL.md +231 -0
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +12 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/SKILL.md +151 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +16 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/references/apprentice-evidence-toolkit.md +32 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/references/apprentice-successor-seat-cutover.md +256 -0
- package/daemon/context-packs/skills/seat-continuity-and-handover/references/orchestrator-role.md +40 -0
- package/daemon/context-packs/skills/session-compaction-and-restore/SKILL.md +163 -0
- package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +10 -0
- package/daemon/context-packs/skills/software-for-agents/SKILL.md +187 -0
- package/daemon/context-packs/skills/software-for-agents/manifest.yaml +10 -0
- package/daemon/context-packs/world-example/manifest.yaml +1 -1
- package/daemon/context-packs/world-public/manifest.yaml +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/builtins/workflow-specs/basic-loop.yaml +3 -3
- package/daemon/dist/builtins/workflow-specs/conveyor.yaml +1 -1
- package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +1 -1
- package/daemon/dist/db/all-migrations.d.ts +1 -1
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +4 -2
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/077_node_session_source.d.ts +4 -0
- package/daemon/dist/db/migrations/077_node_session_source.d.ts.map +1 -0
- package/daemon/dist/db/migrations/077_node_session_source.js +6 -0
- package/daemon/dist/db/migrations/077_node_session_source.js.map +1 -0
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.js +5 -6
- package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/daemon/dist/domain/context-packs/profile-composer.d.ts +1 -1
- package/daemon/dist/domain/context-packs/profile-composer.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/profile-composer.js +2 -2
- package/daemon/dist/domain/context-packs/profile-composer.js.map +1 -1
- package/daemon/dist/domain/context-packs/profile-source-resolver.d.ts +3 -1
- package/daemon/dist/domain/context-packs/profile-source-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/profile-source-resolver.js +3 -2
- package/daemon/dist/domain/context-packs/profile-source-resolver.js.map +1 -1
- package/daemon/dist/domain/rig-lifecycle-service.d.ts +24 -4
- package/daemon/dist/domain/rig-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-lifecycle-service.js +116 -6
- package/daemon/dist/domain/rig-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +2 -1
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +7 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +2 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +2 -0
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +2 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +37 -2
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/routes/context-packs.d.ts.map +1 -1
- package/daemon/dist/routes/context-packs.js +146 -6
- package/daemon/dist/routes/context-packs.js.map +1 -1
- package/daemon/dist/routes/rigs.js +7 -3
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/sessions.js +7 -3
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +3 -1
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +1 -1
- package/daemon/docs/reference/mission-install.md +23 -2
- package/daemon/docs/reference/product-journey-sdlc.md +305 -0
- package/daemon/docs/reference/sdlc-conventions.md +9 -2
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
- package/daemon/specs/agents/apps/vault-specialist/guidance/role.md +0 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/builder/guidance/role.md +0 -1
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/lead/guidance/role.md +0 -3
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/planner/guidance/role.md +0 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +3 -4
- package/daemon/specs/agents/design/product-designer/guidance/role.md +0 -3
- package/daemon/specs/agents/development/implementer/agent.yaml +3 -4
- package/daemon/specs/agents/development/implementer/guidance/role.md +0 -3
- package/daemon/specs/agents/development/qa/agent.yaml +4 -4
- package/daemon/specs/agents/development/qa/guidance/role.md +1 -4
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -1
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +3 -4
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +0 -4
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +3 -4
- package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +0 -3
- package/daemon/specs/agents/shared/agent.yaml +2 -10
- package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +1 -4
- package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +21 -15
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +1 -1
- package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +1 -1
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/agent.yaml +1 -1
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +2 -3
- package/dist/build-info.js +3 -3
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +38 -3
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +37 -0
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/create.d.ts +4 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +84 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/grow.d.ts +4 -0
- package/dist/commands/grow.d.ts.map +1 -0
- package/dist/commands/grow.js +182 -0
- package/dist/commands/grow.js.map +1 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +9 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/rig.d.ts.map +1 -1
- package/dist/commands/rig.js +48 -1
- package/dist/commands/rig.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +21 -2
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/shrink.d.ts.map +1 -1
- package/dist/commands/shrink.js +6 -1
- package/dist/commands/shrink.js.map +1 -1
- package/dist/commands/topology-default-agent.d.ts +4 -0
- package/dist/commands/topology-default-agent.d.ts.map +1 -0
- package/dist/commands/topology-default-agent.js +13 -0
- package/dist/commands/topology-default-agent.js.map +1 -0
- package/dist/commands/walk.d.ts.map +1 -1
- package/dist/commands/walk.js +3 -0
- package/dist/commands/walk.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/work-install.d.ts +39 -0
- package/dist/lib/work-install.d.ts.map +1 -0
- package/dist/lib/work-install.js +278 -0
- package/dist/lib/work-install.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
- package/node_modules/@openrig/daemon/dist/builtins/workflow-specs/basic-loop.yaml +3 -3
- package/node_modules/@openrig/daemon/dist/builtins/workflow-specs/conveyor.yaml +1 -1
- package/node_modules/@openrig/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js +4 -2
- package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/db/migrations/077_node_session_source.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/077_node_session_source.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/077_node_session_source.js +6 -0
- package/node_modules/@openrig/daemon/dist/db/migrations/077_node_session_source.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js +5 -6
- package/node_modules/@openrig/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.js +2 -2
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-composer.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-source-resolver.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-source-resolver.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-source-resolver.js +3 -2
- package/node_modules/@openrig/daemon/dist/domain/context-packs/profile-source-resolver.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.d.ts +24 -4
- package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.js +116 -6
- package/node_modules/@openrig/daemon/dist/domain/rig-lifecycle-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts +2 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js +7 -0
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-exporter.js +2 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +2 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts +2 -0
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +37 -2
- package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/context-packs.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/context-packs.js +146 -6
- package/node_modules/@openrig/daemon/dist/routes/context-packs.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/rigs.js +7 -3
- package/node_modules/@openrig/daemon/dist/routes/rigs.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/sessions.js +7 -3
- package/node_modules/@openrig/daemon/dist/routes/sessions.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.js +3 -1
- package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +1 -1
- package/package.json +1 -1
- package/daemon/context-packs/skills/process/brainstorming/OPENRIG.md +0 -48
- package/daemon/context-packs/skills/process/brainstorming/SKILL.md +0 -107
- package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +0 -12
- package/daemon/context-packs/skills/process/executing-plans/OPENRIG.md +0 -56
- package/daemon/context-packs/skills/process/executing-plans/SKILL.md +0 -94
- package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +0 -12
- package/daemon/context-packs/skills/process/using-superpowers/OPENRIG.md +0 -48
- package/daemon/context-packs/skills/process/using-superpowers/SKILL.md +0 -106
- package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +0 -12
- package/daemon/context-packs/skills/process/writing-plans/OPENRIG.md +0 -52
- package/daemon/context-packs/skills/process/writing-plans/SKILL.md +0 -126
- package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +0 -12
- package/daemon/specs/agents/shared/skills/process/brainstorming/OPENRIG.md +0 -48
- package/daemon/specs/agents/shared/skills/process/brainstorming/SKILL.md +0 -107
- package/daemon/specs/agents/shared/skills/process/executing-plans/OPENRIG.md +0 -56
- package/daemon/specs/agents/shared/skills/process/executing-plans/SKILL.md +0 -94
- package/daemon/specs/agents/shared/skills/process/using-superpowers/OPENRIG.md +0 -48
- package/daemon/specs/agents/shared/skills/process/using-superpowers/SKILL.md +0 -106
- package/daemon/specs/agents/shared/skills/process/writing-plans/OPENRIG.md +0 -52
- package/daemon/specs/agents/shared/skills/process/writing-plans/SKILL.md +0 -126
|
@@ -4,7 +4,7 @@ Canonical OpenRig skills and hooks for cross-runtime agent topology coordination
|
|
|
4
4
|
|
|
5
5
|
## What this plugin ships
|
|
6
6
|
|
|
7
|
-
**Skills (
|
|
7
|
+
**Skills (17):** canonical OpenRig operating knowledge, including the public `refocusing` skill and
|
|
8
8
|
its path-only topology/work trace.
|
|
9
9
|
|
|
10
10
|
**Hooks:** activity tracking, compaction continuity, and the default-on refocus channel. Refocus is
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: loading-addressable-markdown
|
|
3
|
+
description: Use when a mission, slice, dashboard, or task references Markdown as path#h2-slug or path#h2-slug/h3-slug outside the OpenRig context-pack library.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Loading Addressable Markdown
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Load exactly one addressed Markdown section from any filesystem tree. The resolver mirrors OpenRig's shipped H2/H3 grammar without requiring the file to live in the context library.
|
|
11
|
+
|
|
12
|
+
## Use
|
|
13
|
+
|
|
14
|
+
Run the bundled script. Relative file references resolve from `--root`; without it they resolve from the current directory.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
node ~/.agents/skills/loading-addressable-markdown/scripts/resolve-markdown.mjs \
|
|
18
|
+
--root /path/to/mission \
|
|
19
|
+
'slices/09-source-cleanup/SPEC.md#proposal'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The accepted forms are:
|
|
23
|
+
|
|
24
|
+
- `file.md` — whole file
|
|
25
|
+
- `file.md#h2-slug` — full H2 span, including child sections
|
|
26
|
+
- `file.md#h2-slug/h3-slug` — full H3 span
|
|
27
|
+
|
|
28
|
+
Slugs are lowercase; Markdown emphasis/code markers are removed; each other non-alphanumeric run becomes `-`. Duplicate or missing paths fail loudly. Headings inside fenced code blocks are ignored.
|
|
29
|
+
|
|
30
|
+
## Common mistakes
|
|
31
|
+
|
|
32
|
+
- Do not use `rig context get` for an arbitrary filesystem path; that command resolves context-library refs.
|
|
33
|
+
- Do not hand-slice headings with `sed` or line numbers; the bundled resolver owns span and fence behavior.
|
|
34
|
+
- Quote addresses in shell commands.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import { realpathSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const MIN_LEVEL = 2;
|
|
9
|
+
const MAX_LEVEL = 3;
|
|
10
|
+
|
|
11
|
+
export class AddressResolutionError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "AddressResolutionError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function slugifyHeader(title) {
|
|
19
|
+
return title
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[`*_~]/g, "")
|
|
22
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
23
|
+
.replace(/^-+|-+$/g, "");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function parseAddress(address) {
|
|
27
|
+
const hashCount = (address.match(/#/g) ?? []).length;
|
|
28
|
+
if (hashCount > 1) {
|
|
29
|
+
throw new AddressResolutionError(`address '${address}' must contain at most one '#' separator`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const [ref, headerPart] = hashCount === 1 ? address.split("#") : [address, undefined];
|
|
33
|
+
if (!ref) throw new AddressResolutionError(`address '${address}' has no file before '#'`);
|
|
34
|
+
if (headerPart === undefined) return { ref, headerPath: [] };
|
|
35
|
+
|
|
36
|
+
const headerPath = headerPart.split("/");
|
|
37
|
+
if (headerPath.some((segment) => segment.length === 0)) {
|
|
38
|
+
throw new AddressResolutionError(`address '${address}' has an empty header segment`);
|
|
39
|
+
}
|
|
40
|
+
if (headerPath.length > MAX_LEVEL - MIN_LEVEL + 1) {
|
|
41
|
+
throw new AddressResolutionError(`address '${address}' is too deep; addresses target H2 and H3 only`);
|
|
42
|
+
}
|
|
43
|
+
return { ref, headerPath };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function scanHeaders(lines) {
|
|
47
|
+
const hits = [];
|
|
48
|
+
let fence = null;
|
|
49
|
+
|
|
50
|
+
for (let lineNumber = 0; lineNumber < lines.length; lineNumber++) {
|
|
51
|
+
const line = lines[lineNumber];
|
|
52
|
+
const fenceMatch = line.match(/^\s{0,3}(`{3,}|~{3,})/);
|
|
53
|
+
if (fenceMatch) {
|
|
54
|
+
const marker = fenceMatch[1][0];
|
|
55
|
+
const length = fenceMatch[1].length;
|
|
56
|
+
if (!fence) fence = { marker, length };
|
|
57
|
+
else if (fence.marker === marker && length >= fence.length) fence = null;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (fence) continue;
|
|
61
|
+
|
|
62
|
+
const heading = line.match(/^(#{1,6})\s+(.*\S)\s*$/);
|
|
63
|
+
if (heading) hits.push({ level: heading[1].length, title: heading[2], line: lineNumber });
|
|
64
|
+
}
|
|
65
|
+
return hits;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function parseMarkdownSections(text) {
|
|
69
|
+
const lines = text.split("\n");
|
|
70
|
+
const headers = scanHeaders(lines);
|
|
71
|
+
const sections = [];
|
|
72
|
+
let currentH2 = null;
|
|
73
|
+
|
|
74
|
+
for (let index = 0; index < headers.length; index++) {
|
|
75
|
+
const heading = headers[index];
|
|
76
|
+
if (heading.level < MIN_LEVEL || heading.level > MAX_LEVEL) {
|
|
77
|
+
if (heading.level < MIN_LEVEL) currentH2 = null;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const slug = slugifyHeader(heading.title);
|
|
82
|
+
if (heading.level === 2) currentH2 = slug;
|
|
83
|
+
const headerPath = heading.level === 2
|
|
84
|
+
? [slug]
|
|
85
|
+
: currentH2 !== null
|
|
86
|
+
? [currentH2, slug]
|
|
87
|
+
: [slug];
|
|
88
|
+
const fullEnd = headers.slice(index + 1).find((next) => next.level <= heading.level)?.line ?? lines.length;
|
|
89
|
+
const ownEnd = headers[index + 1]?.line ?? lines.length;
|
|
90
|
+
|
|
91
|
+
sections.push({
|
|
92
|
+
level: heading.level,
|
|
93
|
+
title: heading.title,
|
|
94
|
+
headerPath,
|
|
95
|
+
headerLine: heading.line,
|
|
96
|
+
text: lines.slice(heading.line, fullEnd).join("\n"),
|
|
97
|
+
ownText: lines.slice(heading.line, ownEnd).join("\n"),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return sections;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function resolveAddress(text, headerPath) {
|
|
104
|
+
if (headerPath.length === 0) {
|
|
105
|
+
throw new AddressResolutionError("a bare file resolves without section lookup");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const sections = parseMarkdownSections(text);
|
|
109
|
+
const wanted = headerPath.join("/");
|
|
110
|
+
const hits = sections.filter((section) => section.headerPath.join("/") === wanted);
|
|
111
|
+
if (hits.length > 1) {
|
|
112
|
+
throw new AddressResolutionError(
|
|
113
|
+
`address '#${wanted}' is AMBIGUOUS: ${hits.length} sections match at lines ${hits.map((hit) => hit.headerLine + 1).join(", ")}`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
if (hits.length === 1) return hits[0];
|
|
117
|
+
|
|
118
|
+
const parentPath = headerPath.slice(0, -1).join("/");
|
|
119
|
+
const candidates = sections
|
|
120
|
+
.filter((section) => section.headerPath.slice(0, -1).join("/") === parentPath)
|
|
121
|
+
.map((section) => section.headerPath.join("/"));
|
|
122
|
+
throw new AddressResolutionError(
|
|
123
|
+
`address '#${wanted}' matches no header. ` +
|
|
124
|
+
(candidates.length > 0
|
|
125
|
+
? `Addressable sections under '${parentPath || "(top)"}': ${candidates.join(", ")}.`
|
|
126
|
+
: `Addressable sections: ${sections.map((section) => section.headerPath.join("/")).join(", ") || "(none)"}.`),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function usage() {
|
|
131
|
+
return "Usage: resolve-markdown.mjs [--root DIR] FILE[#h2-slug[/h3-slug]]\n";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function main(argv) {
|
|
135
|
+
let root = process.cwd();
|
|
136
|
+
const args = [...argv];
|
|
137
|
+
|
|
138
|
+
if (args[0] === "--help" || args[0] === "-h") {
|
|
139
|
+
process.stdout.write(usage());
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (args[0] === "--root") {
|
|
143
|
+
if (!args[1]) throw new AddressResolutionError("--root needs a directory");
|
|
144
|
+
root = path.resolve(args[1]);
|
|
145
|
+
args.splice(0, 2);
|
|
146
|
+
}
|
|
147
|
+
if (args.length !== 1) throw new AddressResolutionError(usage().trim());
|
|
148
|
+
|
|
149
|
+
const { ref, headerPath } = parseAddress(args[0]);
|
|
150
|
+
const filePath = path.isAbsolute(ref) ? ref : path.resolve(root, ref);
|
|
151
|
+
const text = await readFile(filePath, "utf8");
|
|
152
|
+
process.stdout.write(headerPath.length === 0 ? text : resolveAddress(text, headerPath).text);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function isMainModule() {
|
|
156
|
+
const entry = process.argv[1];
|
|
157
|
+
if (!entry) return false;
|
|
158
|
+
try {
|
|
159
|
+
return realpathSync(entry) === realpathSync(fileURLToPath(import.meta.url));
|
|
160
|
+
} catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (isMainModule()) {
|
|
166
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
167
|
+
process.stderr.write(`${error.name ?? "Error"}: ${error.message}\n`);
|
|
168
|
+
process.exitCode = 1;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
@@ -54,6 +54,7 @@ These are auto-delivered to every rig; their name+description are already in you
|
|
|
54
54
|
- **applying-a-permission-policy** — a rig or seat has a permission policy attached, or you're setting one up: translate it into the live harness configuration.
|
|
55
55
|
- **claude-compaction-restore** — you just compacted (Claude). Restore from durable evidence before resuming real work.
|
|
56
56
|
- **delegating-work** — deciding who should do a task: you, a spawned subagent, or a durable peer seat that already holds the context.
|
|
57
|
+
- **loading-addressable-markdown** — a task names Markdown as `path#h2-slug` or `path#h2-slug/h3-slug` outside the context-pack library.
|
|
57
58
|
- **session-compaction-and-restore** — preparing for, or recovering from, compaction (any runtime). The write- and read-side protocol.
|
|
58
59
|
- **queue-handoff** — you're passing durable work to another seat or ending your turn. The queue is the work ledger, not chat.
|
|
59
60
|
- **refocusing** — a long-running seat may have lost the product outcome, crossed a major boundary, or compacted and needs a fresh path-based trace.
|
|
@@ -105,10 +106,6 @@ General engineering skills OpenRig ships as vendored copies. Open when the task
|
|
|
105
106
|
- **test-driven-development** — implementing a feature or bugfix: write the failing test first.
|
|
106
107
|
- **verification-before-completion** — about to claim done / passing / fixed: run the check and read the output first.
|
|
107
108
|
- **systematic-debugging** — debugging: find the root cause before the fix.
|
|
108
|
-
- **writing-plans** — writing an implementation plan.
|
|
109
|
-
- **executing-plans** — working through a written plan.
|
|
110
|
-
- **brainstorming** — divergent ideation before converging.
|
|
111
|
-
- **using-superpowers** — discovering and using the vendored "superpowers" skill set.
|
|
112
109
|
- **agent-browser** — driving a browser (screenshot / screencast) from an agent.
|
|
113
110
|
- **frontend-design** — designing frontend / UI.
|
|
114
111
|
- **dogfood** — web-QA / dogfooding a shipped UI.
|
|
@@ -107,9 +107,9 @@ tenure:
|
|
|
107
107
|
- **tombstone** — one line: what this tenure did, written by the retiring agent itself
|
|
108
108
|
|
|
109
109
|
**Why it works (zero search infrastructure):** any timestamped record — a git commit, a
|
|
110
|
-
qitem, a
|
|
111
|
-
generation + session token → wake that tenure. One row per handover, append-only.
|
|
112
|
-
|
|
110
|
+
qitem, a NOTES.md line, a stream item — joins to the seat's ledger by interval match →
|
|
111
|
+
generation + session token → wake that tenure. One row per handover, append-only. The
|
|
112
|
+
ledger is the tenure record; work-tree notes remain lived context, not identity state.
|
|
113
113
|
|
|
114
114
|
**Crash-ended tenures** get their row appended **post-hoc** by the crash-cart / restore path,
|
|
115
115
|
flagged **honest-approximate** (the boot-captured session id is what makes this recoverable).
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: software-for-agents
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
(skills, instructions, bootstrap files, schemas, conventions), and most "bugs" are coherence gaps in
|
|
9
|
-
that layer, not broken functions. Read this to form the correct mental model so your fixes land at the
|
|
10
|
-
precise spot that stops the footgun for every future rig — not just patch a symptom. It also covers why STUDIO APPS skip the mockup phase — for an agent-built app the build is as fast as the mockup, so the PRD is the fleshed intent (velocity as method, not a quality waiver). NOTE: the
|
|
11
|
-
bug-tolerance in this model is SCOPED to agent-managed software; the OpenRig core and rigs.to stay
|
|
12
|
-
rock-solid — see the scope block up top before you apply anything here.
|
|
4
|
+
Use when building, modifying, or diagnosing an OpenRig or studio-box system; when surprising behavior
|
|
5
|
+
looks like a code bug but may come from Markdown, YAML, JSON, bootstrap files, schemas, skills, or
|
|
6
|
+
conventions; or when deciding whether an agent-built studio app needs a separate mockup phase. NOT for
|
|
7
|
+
treating defects in OpenRig core or rigs.to as tolerable control-plane drift.
|
|
13
8
|
metadata:
|
|
14
9
|
openrig:
|
|
15
10
|
stage: factory-approved
|
|
@@ -18,16 +18,16 @@ workflow:
|
|
|
18
18
|
skill_refs: [openrig-user, backlog-capture]
|
|
19
19
|
preferred_targets: [intake-lead@conveyor]
|
|
20
20
|
planner:
|
|
21
|
-
skill_refs: [openrig-user,
|
|
21
|
+
skill_refs: [openrig-user, verification-before-completion]
|
|
22
22
|
preferred_targets: [plan-planner@conveyor]
|
|
23
23
|
builder:
|
|
24
|
-
skill_refs: [openrig-user
|
|
24
|
+
skill_refs: [openrig-user]
|
|
25
25
|
preferred_targets: [build-builder@conveyor]
|
|
26
26
|
reviewer:
|
|
27
27
|
skill_refs: [openrig-user, review-team]
|
|
28
28
|
preferred_targets: [review-reviewer@conveyor]
|
|
29
29
|
closer:
|
|
30
|
-
skill_refs: [openrig-user
|
|
30
|
+
skill_refs: [openrig-user]
|
|
31
31
|
preferred_targets: [intake-lead@conveyor]
|
|
32
32
|
steps:
|
|
33
33
|
- id: intake
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Public capability and source-map width for the default onboarding walk.
|
|
2
2
|
name: onboarding-width
|
|
3
|
-
version: "0.5.
|
|
3
|
+
version: "0.5.7"
|
|
4
4
|
# OPR.0.5.6.10 — affordances knowledge (what this system can do) is world
|
|
5
5
|
# content under the coining-session definitions.
|
|
6
6
|
taxonomy: world
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: applying-a-permission-policy
|
|
3
|
+
description: "Use when a permission policy is attached to a rig/seat (rig.yaml permission_policy:), or a user asks you to apply one, and you must translate that harness-neutral policy into the target harness's LIVE permission config — Claude settings.json / Codex config.toml / Pi run flags. Agent-driven and interactive: you read the policy, ground yourself in YOUR harness version, show the diff, and ask before writing. NOT for defining policies (that's the policy spec) and NOT a set-and-forget updater."
|
|
4
|
+
metadata:
|
|
5
|
+
openrig:
|
|
6
|
+
stage: established # config cells VM-verified + cold-transfer PASSING (rerun #2) + built-in SPEC FILES landed → skill translates FROM the spec (POINT-not-COPY). The two established criteria met 2026-08-04. Reviewed at push.
|
|
7
|
+
tested_against: # VERSION STAMP — the whole point; re-verify at every harness bump
|
|
8
|
+
claude_code: "2.1.220 — VM-CONFIRMED 2026-08-03 (all cells)"
|
|
9
|
+
codex: "0.120.0 — VM-CONFIRMED 2026-08-03 (sandbox_mode/approval_policy; on-failure deprecated-but-accepted)"
|
|
10
|
+
pi: "0.83.0 — VM-CONFIRMED 2026-08-03: --approve/--no-approve govern PROJECT-RESOURCE TRUST, NOT tool permissions; Pi has NO permission surface (see Pi leg)"
|
|
11
|
+
verification_status: "Live-verified 2026-08-03/04. Claude 2.1.220 + Codex 0.120.0 config cells CONFIRMED live. Pi 0.83.0 divergence folded (flags = project-resource trust, not a permission gate). Cold-transfer rerun #1 blocked on the force_push/push_to_remote prefix collision → added the PREFIX-COLLISION rule. Cold-transfer rerun #2: TRANSFERS — all 5 gate checks pass (collision resolved deterministically without asking; single ordinary write confirmation; defaultMode floor written; Codex workspace-write/on-request; Pi compute-nothing). Blocking collision/floor defect CLOSED → gate cleared, 4.8-shippable (provisional-with-passing-cold-transfer). Non-blocking seam closed: the built-in SPEC FILES landed (arch-accepted, source:builtin) → skill translates FROM the spec, interim in-skill pinned summary retired (POINT-not-COPY). stage:ESTABLISHED 2026-08-04 — both criteria met."
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Applying a permission policy
|
|
15
|
+
|
|
16
|
+
## Translation is best-effort — read this first
|
|
17
|
+
This skill provides the policy schema and OpenRig's best current understanding of how to translate it to each harness. That guidance is **best-effort and version-stamped**: harness permission surfaces change frequently across versions, so a mapping that is correct today can drift on a later release. When you apply a config-surface policy:
|
|
18
|
+
- **Verify against the current docs for your installed harness version.** Treat this skill's tables as version-stamped starting points (see `tested_against`), not settled truth.
|
|
19
|
+
- **Prefer testing in a protected or disposable environment first.** An incorrect write can lock a seat out or over-permit it, so confirm the format before applying it to a live seat.
|
|
20
|
+
- **Hand-editing via the harness's own settings tools is always a valid path.** If a translation is uncertain, setting the policy directly — or asking the user to — is a legitimate outcome, not a failure.
|
|
21
|
+
|
|
22
|
+
The reliable, deterministic parts are the **blunt instruments**: the YOLO full-bypass flag and the floor (Claude `acceptEdits` / Codex `workspace-write`), which ride the stable launch-flag surface. **Fine-grained config-rule translation — the allow/ask/deny prefix rules and the Codex posture — is the best-effort part** and carries no guarantee of exact fidelity. If a translation looks wrong, fall back to a blunt instrument or a direct hand-edit.
|
|
23
|
+
|
|
24
|
+
## ⚠ Read this preamble first — why this is a SKILL, not a script (do not "improve" it into a deterministic updater)
|
|
25
|
+
Harness permission formats are a **moving target**. The exact fact this skill is stamped against — Claude Code 2.1.220 permission rules are **prefix-only** (no flag-precise Bash match) — is *version-specific*; the rule grammar can change on the next point release. A hardcoded/deterministic updater would foot-gun the instant it does, and a wrong permission write can **lock a seat out or silently over-permit it**. So the maintained artifact is this caveated, version-stamped skill that an agent reads and applies **interactively, grounding in the live format** — never a code path that writes blindly. If you are tempted to replace this with a deterministic projector: that temptation is the bug this preamble exists to stop.
|
|
26
|
+
|
|
27
|
+
## When to reach for this
|
|
28
|
+
- A rig/seat has a policy attached (`rig.yaml … permission_policy: <file>`), and you're at **setup/preflight** — apply it (**mandatory for autonomous seats**, see the freeze warning).
|
|
29
|
+
- A user asks "apply the Standard/Open/Locked/Operator policy here" or "set up permissions like <host>".
|
|
30
|
+
- NOT for authoring policies (that's the policy spec) and NOT for daemon-level enforcement (OpenRig is agnostic — it injects nothing).
|
|
31
|
+
|
|
32
|
+
## What you're translating (the boundary)
|
|
33
|
+
INPUT = a **harness-neutral policy spec** (arch's schema): `default_posture`, `floor`, `allow`/`ask`/`deny` as **semantic actions** (`push_to_remote`, `delete_files`, …), `destructive_class`, `source: builtin|custom`. You TRANSLATE that intent → the harness's live config. You never invent policy; you never pre-bake harness config into the spec.
|
|
34
|
+
|
|
35
|
+
## The apply flow (interactive — the interactive-ask IS the product)
|
|
36
|
+
1. **Read the policy spec** + its `source:` marker (built-in read-only from the package = copy-to-customize before editing; custom = user space).
|
|
37
|
+
2. **PREFLIGHT (mandatory) — ground yourself in THIS environment:**
|
|
38
|
+
- **daemon-HOME must equal seat-HOME**, or a user-level Claude write never reaches the seat (assessment iv). Check; if they differ, **stop and ask** — do not write into the wrong HOME.
|
|
39
|
+
- Read the harness's **actual current config file** + confirm its schema against your installed version (`claude --version`, the live settings.json shape, codex/pi versions). If the format differs from this skill's `tested_against`, trust the LIVE format and flag the drift.
|
|
40
|
+
3. **Derive the per-harness config** from the semantic actions (see the three legs below). Compute the Codex posture-collapse + Pi bit.
|
|
41
|
+
4. **Show the concrete DIFF before writing** (old → new, per file). Never a blind write.
|
|
42
|
+
5. **Resolve best-effort actions by the built-in's rule FIRST, then ask only on genuine ambiguity.** Best-effort destructive actions (`force_push`, `delete_files`, `delete_everything`, `read_secrets`) default to **`ask`** (never a `deny` that can't be enforced) — apply that default rather than stopping to question-back. Surface a question only when the policy is genuinely ambiguous or the seat is interactive. **For a same-prefix collision (`push_to_remote` vs `force_push`, both `Bash(git push:*)`), NEVER ask — apply the deterministic PREFIX-COLLISION rule in the Claude leg.** (Live cold-transfers caught fresh agents *question-backing* — first on the `force_push` default, then on the prefix collision — instead of applying the fixed rule; both freeze an autonomous seat.) On a Claude-only fleet, if the policy denies `network_egress`, **say so explicitly**: it is NOT enforceable — Claude has no network gate, a `Bash(curl:*)`/`Bash(wget:*)` deny is best-effort, and `python`/`node` fetch bypasses it (live-verified: `urllib` reached HTTPS 200 under a curl/wget deny). Route real egress-gating to the Codex sandbox, or record it as advisory on Claude.
|
|
43
|
+
6. **Back up the current config**, then write. Prefer the **user-level** file (`~/.claude/settings.json`) for durable policy — it's the clobber-resistant tier (deny wins across the union). **ALWAYS include `defaultMode: "acceptEdits"` in the Claude settings.json you write** — the floor key must be PRESENT in the file, or the config policy strips the floor. (This is the exact gap a live cold-transfer test FAILED on: the fresh agent wrote allow/deny lists but omitted `defaultMode`, leaving the seat below the floor.)
|
|
44
|
+
7. **Verify** the write landed and the seat can see it (re-read; confirm `defaultMode: "acceptEdits"` is present; for an autonomous seat, confirm no `ask` will freeze it).
|
|
45
|
+
|
|
46
|
+
## Two surfaces — and this skill writes only ONE of them
|
|
47
|
+
Permissions live on two surfaces with opposite stability — which is the whole reason for the agent-driven split:
|
|
48
|
+
- **LAUNCH-FLAG surface — STABLE (>1yr) → OpenRig sets it DETERMINISTICALLY, NOT this skill.** The flags OpenRig passes at boot: Claude `--permission-mode` / `--dangerously-skip-permissions`; Codex sandbox/bypass flags; Pi `--approve`/`--no-approve`. **Two things live here, both OpenRig-owned: the FLOOR (minimum, by default) and YOLO (full bypass, opt-in).**
|
|
49
|
+
- **CONFIG-FILE surface — CHAOTIC → NEVER deterministic → THIS SKILL'S DOMAIN.** Claude `settings.json` allow/ask/deny + defaultMode; Codex `config.toml` approval rules. This is where the Locked / Standard / Open policies get applied — agent-driven, version-stamped, caveated. (Pi has **no permission surface at all** — its `--approve`/`--no-approve` flags govern project-resource trust, not tool permissions (VM-confirmed Pi 0.83.0); a permission policy does not translate to Pi. See the Pi leg.)
|
|
50
|
+
|
|
51
|
+
**THE FLOOR (launch-flag, OpenRig-set — this skill KNOWS it, never WRITES it):** Claude `--permission-mode acceptEdits` (keep it); **Codex workspace-only** (stop forcing `danger-full-access` — ≈ Codex's own default ≈ setting-nothing = agnostic); Pi `--no-approve` (a project-resource-trust floor — Pi has no permission gate; see the Pi leg). **One consistent unconditional minimum** (no by-context switching — that mode idea is parked 5.0). A chosen config-file policy layers ON TOP of the floor.
|
|
52
|
+
|
|
53
|
+
**YOLO MODE (launch-flag, OpenRig-set, opt-in — for people done with permissions):** OpenRig boots every seat with the full-bypass flag (Claude `--dangerously-skip-permissions`; Codex full-bypass). **When YOLO is on, CONFIG-FILE POLICY IS MOOT** — this skill does NOT apply a config policy (or explicitly notes it's overridden by the flag); don't fight the bypass. YOLO is OpenRig's deterministic job, not this skill's. (**Operator = YOLO mode** — subsumed.)
|
|
54
|
+
|
|
55
|
+
## The three harness legs (skill-owned mapping knowledge, version-stamped + caveated)
|
|
56
|
+
|
|
57
|
+
### Claude — `~/.claude/settings.json` (user-level, clobber-resistant)
|
|
58
|
+
- **Action → prefix map** (VM-CONFIRMED @ Claude 2.1.220, 2026-08-03 — every row exercised through real Claude tool calls). `fidelity`: `clean` = the prefix honors intent; `best_effort` = prefix-only can't fully enforce → prefer `ask`, never a `deny` that lies.
|
|
59
|
+
|
|
60
|
+
| Semantic action | `permissions.*` prefix rule(s) | fidelity |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| push_to_remote | `Bash(git push:*)` | clean |
|
|
63
|
+
| force_push | ask the flag-first forms `Bash(git push --force:*)` `Bash(git push -f:*)` `Bash(git push --force-with-lease:*)`; base `Bash(git push:*)` follows push_to_remote (see the collision rule) | **best_effort** — catches flag-FIRST force; flag-LAST (`git push origin main --force`) leaks |
|
|
64
|
+
| create_pr | `Bash(gh pr create:*)` | clean |
|
|
65
|
+
| publish_package | `Bash(npm publish:*)` `Bash(pnpm publish:*)` `Bash(yarn publish:*)` `Bash(cargo publish:*)` | clean (multi-pattern) |
|
|
66
|
+
| merge_or_release | `Bash(git merge:*)` `Bash(git tag:*)` `Bash(gh release:*)` | best_effort — protected-branch semantics not expressible |
|
|
67
|
+
| delete_files | `Bash(rm:*)` | **best_effort** — target-first leak (`rm <t> -rf` slips); scope not boundable → default `ask` |
|
|
68
|
+
| delete_everything | `Bash(rm -rf:*)` `Bash(rm -fr:*)` | **best_effort** — same leak → default to `ask`, never a silent deny |
|
|
69
|
+
| reset_or_discard_vcs | `Bash(git reset:*)` `Bash(git clean:*)` `Bash(git checkout:*)` `Bash(git branch -D:*)` | best_effort |
|
|
70
|
+
| drop_persistent_store | `Bash(dropdb:*)` `Bash(docker volume rm:*)` (+ project-specific) | best_effort (open-ended) → `ask` |
|
|
71
|
+
| rig_up / rig_down | `Bash(rig up:*)` / `Bash(rig down:*)` | clean — ⚠ an `ask` here FREEZES an autonomous seat |
|
|
72
|
+
| mutate_topology | `Bash(rig add:*)` `Bash(rig remove:*)` `Bash(rig rename:*)` | clean |
|
|
73
|
+
| run_toolchain | `Bash(npm:*)` `Bash(npx:*)` `Bash(pnpm:*)` `Bash(yarn:*)` `Bash(node:*)` `Bash(tsc:*)` `Bash(vitest:*)` `Bash(jest:*)` | clean (the known set) |
|
|
74
|
+
| run_arbitrary_shell | `Bash(*)` — this IS the `default_posture` knob | clean |
|
|
75
|
+
| network_egress | `Bash(curl:*)` `Bash(wget:*)` (partial) | **best_effort** — Claude has NO native network gate; real floor = Codex sandbox (route it there) |
|
|
76
|
+
| read_secrets | `Read(./.env)` `Read(~/.ssh/**)` `Read(**/*secret*)` (path-scoped) | **best_effort** — path-based, not secret-aware |
|
|
77
|
+
| install_dependencies | `Bash(npm install:*)` `Bash(pip install:*)` `Bash(brew install:*)` | clean |
|
|
78
|
+
- **PREFIX-ONLY caveat** — cannot flag-precisely gate (`force_push` vs `push_to_remote` both match `Bash(git push:*)`); **target-first leak** (`rm <target> -rf` slips a `Bash(rm -rf*)` deny). Actions marked `best_effort` in the taxonomy (`force_push`, `delete_files`, `read_secrets`) → surface the caveat and prefer `ask` over a `deny` you can't enforce (a `deny` that leaks lies).
|
|
79
|
+
- **PREFIX-COLLISION resolution (deterministic — resolve it, NEVER ask).** When two actions collapse to the SAME base prefix with different dispositions — the canonical case is `push_to_remote`=allow + `force_push`=ask, both basing to `Bash(git push:*)` — you cannot put that base prefix in both `allow` and `ask`. Resolve without a question-back:
|
|
80
|
+
- **Push allowed + force asked (Standard / Open):** put the base `Bash(git push:*)` per push's disposition (`allow`), AND add the flag-first force forms to `ask` (`Bash(git push --force:*)`, `Bash(git push -f:*)`, `Bash(git push --force-with-lease:*)`). RECORD in your diff that this is best-effort — flag-LAST force (`git push origin main --force`) leaks past the flag-first ask rules and runs under the allow. Don't block on it.
|
|
81
|
+
- **Push denied (Locked):** `Bash(git push:*)` in `deny` already covers force — no conflict.
|
|
82
|
+
This is a FIXED rule, not a user decision — apply it and note the leak. (A live cold-transfer FAILED because a fresh agent *blocked asking* "how to resolve the force_push/push_to_remote collision" instead of applying this default.)
|
|
83
|
+
- **`defaultMode: "acceptEdits"` is the FLOOR and MUST be written into every Claude settings.json you produce.** It is not a knob you tune, but it IS a key you must always include — a config policy that omits it strips the floor (the cold-transfer failure). Live-confirmed schema: `{"permissions":{"allow":[],"ask":[],"deny":[],"defaultMode":"acceptEdits"}}`.
|
|
84
|
+
|
|
85
|
+
### Codex — `~/.codex/config.toml` (via the existing X10 `codex_config_fragment` splice path — reuse, don't invent)
|
|
86
|
+
- Codex is **per-posture, not per-action**: the whole action set **collapses** to the nearest `{sandbox_mode, approval_policy}` pair. **Built-in → posture** (VM-CONFIRMED @ Codex 0.120.0, 2026-08-03 — each posture applied to a real seat: read-only blocked writes+egress, workspace-write allowed writes/blocked egress, danger-full-access allowed both):
|
|
87
|
+
|
|
88
|
+
| Built-in | `sandbox_mode` | `approval_policy` | Collapse note (surface this to the user) |
|
|
89
|
+
|---|---|---|---|
|
|
90
|
+
| Locked | `read-only` | `on-request` | read-only blocks all writes + egress, prompts on escalation — OVER-restricts `edit_files` vs the Claude floor |
|
|
91
|
+
| Standard ⭐ | `workspace-write` | `on-request` | workspace writes allowed, egress blocked by sandbox, prompt on escalation — UNDER-gates `create_pr` (no per-action ask; folds into the prompt) |
|
|
92
|
+
| Open | `danger-full-access` | `on-failure` | everything allowed, prompt only on failure — OVER-permits the `destructive_class` vs the Claude ask-gates |
|
|
93
|
+
| YOLO | *(flag-surface — full-bypass launch flag, NOT config.toml)* | — | not a config write; the rip-out adapter owns it |
|
|
94
|
+
|
|
95
|
+
Valid values (VM-confirmed @ Codex 0.120.0): `sandbox_mode` ∈ {read-only, workspace-write, danger-full-access}; `approval_policy` ∈ {on-request, on-failure, never, untrusted, granular} (`granular` observed live at 0.120.0). ⚠ `on-failure` (used by Open) is marked **deprecated** in 0.120.0 help but still accepted — revisit if a future Codex drops it.
|
|
96
|
+
- Surface the collapse: "Codex can't gate per-action; this policy becomes sandbox=X approval=Y, which over-permits Z / under-permits W."
|
|
97
|
+
|
|
98
|
+
### Pi — NO permission surface at all (VM-confirmed Pi 0.83.0 — the earlier "approval bit" reading was WRONG)
|
|
99
|
+
- **Pi has no tool-permission gate — neither a config store NOR a permission-posture flag.** Live verification confirmed: Pi 0.83.0's `--approve`/`-a` and `--no-approve`/`-na` govern **project-resource trust** (whether project extensions/resources appear in RPC `get_commands`), **NOT** tool-call approval. There is no sandbox or permission mechanism to map a policy onto.
|
|
100
|
+
- So a permission policy **does not translate to Pi**. Do NOT say `--approve` = "auto-approve all", or that a posture "collapses to a Pi approval bit" — that was an earlier misread, corrected here. This skill computes **nothing** for Pi.
|
|
101
|
+
- Whatever the OpenRig adapter sets (`--no-approve` by default) is a project-resource-trust floor, not a permission posture — not this skill's to derive.
|
|
102
|
+
- Behavior to know (resource-trust, NOT permission-gating): under default ask / `--no-approve`, a project resource is silently **absent** from RPC `get_commands`; it appears under `--approve`. Never mistake that for permission enforcement.
|
|
103
|
+
- **Say this to the user for a Pi seat:** "Pi has no permission-policy surface today — the policy applies to Claude/Codex; Pi runs under its project-resource-trust flag unchanged."
|
|
104
|
+
|
|
105
|
+
## ⚠ The two warnings that save real fleets
|
|
106
|
+
- **`ask` FREEZES an autonomous/headless Claude seat** — it hangs on the first non-edit op. So for autonomous fleets apply **Open/YOLO** (or a policy with no asks) **at setup** — the floor only covers edits; bash still asks without an applied policy. Never leave an autonomous seat on a policy with live `ask` gates. (Pi has no permission ask at all — see the Pi leg; Codex prompts per its posture, not per-action.)
|
|
107
|
+
- **daemon-HOME ≠ seat-HOME** silently voids user-level writes — always the preflight check above.
|
|
108
|
+
|
|
109
|
+
## The built-ins — DEFINED by the shipped policy spec files (translate FROM the spec; POINT, don't COPY)
|
|
110
|
+
The four built-in policies ship as read-only spec files (`source: builtin`, `policy_schema_version: 1`) — they are the AUTHORITATIVE definitions. **Do NOT restate their action-sets here.** An earlier in-skill copy drifted (it under-asked `publish_package`/`merge_or_release`, which the spec ASKs) — the exact reason POINT-don't-COPY is the rule. Read the attached/selected spec and translate its semantic-action sets (`default_posture` / `allow` / `ask` / `deny` / `destructive_class`) per the three legs above.
|
|
111
|
+
- **Locked / Standard ⭐ / Open** — `surface: config`. Translate to the Claude / Codex config surface. **Standard ⭐** is the recommended default: routine dev incl. push allowed, the outward/release/history-rewriting acts (`create_pr`, `publish_package`, `merge_or_release`, `force_push`) ASK, destructive_class ASKs. Standard has live `ask` gates → not for a headless-autonomous Claude seat (use Open or YOLO). Locked = deny-default whitelist; Open = allow-default, destructive_class asks only.
|
|
112
|
+
- **YOLO** — `surface: flag`, `launch_posture: full_bypass`. This skill does **NOT** translate it — it points at OpenRig's deterministic flag-surface opt-in (the rip-out YOLO setting). When YOLO is on, any config-surface policy is MOOT (the bypass overrides it). (Subsumes the former "Operator".)
|
|
113
|
+
|
|
114
|
+
Built-ins ship read-only in the package (canonical names); copy-to-customize into user space (custom, user-named); the `source:` frontmatter marker travels on copy. Onboarding presents these as a required MENU (explain each + ask which; no-choice = the floor).
|
|
115
|
+
|
|
116
|
+
## Boundary (keeps this the only maintained piece)
|
|
117
|
+
This skill TRANSLATES + APPLIES only. It does **not** define policies (the policy spec does) and does **not** enforce at the daemon (OpenRig is agnostic). Spec = *what* (neutral intent); this skill = *how, on this harness version* (the caveated, version-stamped translation).
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
*Stage: ESTABLISHED (2026-08-04) — both criteria met: (1) cold-transfer PASSING (rerun #2, all 5 gate checks TRANSFER); (2) the built-in policy SPEC FILES landed (`source: builtin`, arch-accepted) as the authoritative source — the skill now translates FROM the spec and the interim in-skill pinned summary is retired (POINT-not-COPY). Config cells VM-CONFIRMED (Claude 2.1.220 / Codex 0.120.0); Pi has no permission surface (compute-nothing). Reviewed at push. feedback.md maintained.*
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# GENERATED by scripts/generate-context-packs.mjs — DO NOT EDIT.
|
|
2
|
+
# Package-time projection of a canonical skill; regenerated every build.
|
|
3
|
+
name: "applying-a-permission-policy"
|
|
4
|
+
version: "0.5.7"
|
|
5
|
+
taxonomy: "skills"
|
|
6
|
+
purpose: "Use when a permission policy is attached to a rig/seat (rig.yaml permission_policy:), or a user asks you to apply one, and you must translate that harness-neutral policy into the target harness's LIVE permission config — Claude settings.json / Codex config.toml / Pi run flags. Agent-driven and interactive: you read the policy, ground yourself in YOUR harness version, show the diff, and ask before writing. NOT for defining policies (that's the policy spec) and NOT a set-and-forget updater."
|
|
7
|
+
files:
|
|
8
|
+
- path: "SKILL.md"
|
|
9
|
+
role: "instruction"
|
|
10
|
+
summary: "Use when a permission policy is attached to a rig/seat (rig.yaml permission_policy:), or a user asks you to apply one, and you must translate that harness-neutral policy into the target harness's LIVE permission config — Claude settings.json / Codex config.toml / Pi run flags. Agent-driven and interactive: you read the policy, ground yourself in YOUR harness version, show the diff, and ask before writing. NOT for defining policies (that's the policy spec) and NOT a set-and-forget updater."
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claude-compaction-restore
|
|
3
|
+
description: Use when a Claude Code session has just compacted, is about to compact, reached context limit, resumed after /compact, or needs to rebuild its working mental model from Claude JSONL transcripts and touched files.
|
|
4
|
+
metadata:
|
|
5
|
+
openrig:
|
|
6
|
+
stage: factory-approved
|
|
7
|
+
sibling_skills:
|
|
8
|
+
- mental-model-ha
|
|
9
|
+
- scope-recovery
|
|
10
|
+
- session-compaction-and-restore
|
|
11
|
+
- agent-startup-and-context-ingestion
|
|
12
|
+
- agent-starters
|
|
13
|
+
- composable-priming-packs
|
|
14
|
+
- session-source-fork
|
|
15
|
+
- seat-continuity-and-handover
|
|
16
|
+
- claude-compact-in-place
|
|
17
|
+
- pre-maintenance-agent-preservation
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Claude Compaction Restore
|
|
21
|
+
|
|
22
|
+
Use this skill to preserve continuity before Claude Code compacts and to
|
|
23
|
+
restore continuity after compaction. Do the work described here; do not merely
|
|
24
|
+
explain the protocol.
|
|
25
|
+
|
|
26
|
+
## If You Are About To Compact
|
|
27
|
+
|
|
28
|
+
Prepare durable continuity before the context boundary.
|
|
29
|
+
|
|
30
|
+
1. Identify the active task, queue item, mission/slice, branch or commit, and
|
|
31
|
+
current working directory.
|
|
32
|
+
2. Record the current state: decisions made, files changed, commands/tests run,
|
|
33
|
+
evidence produced, blockers, caveats, and the next concrete step.
|
|
34
|
+
3. Create or update a durable mental-model restore map. This map is the main
|
|
35
|
+
artifact future-you will use to rebuild context after compaction.
|
|
36
|
+
4. In the restore map, write an ASCII file/folder tree of every path that
|
|
37
|
+
mattered to your working mental model during this session. Include:
|
|
38
|
+
- the active queue item or mission packet;
|
|
39
|
+
- mission notes, progress, decisions, and evidence files;
|
|
40
|
+
- Claude memory/project notes you used or wrote, especially when the memory
|
|
41
|
+
folder is shared by many agents;
|
|
42
|
+
- files with active edits or recently inspected source;
|
|
43
|
+
- root instructions such as `AGENTS.md`, `CLAUDE.md`, or `README.md`;
|
|
44
|
+
- as-built docs, codemaps, conventions, skills, and product docs needed
|
|
45
|
+
before code/review work;
|
|
46
|
+
- source files, tests, scripts, UI evidence, screenshots, logs, or reports
|
|
47
|
+
that shaped your current state.
|
|
48
|
+
5. For every file or folder in the tree, add a short note explaining why it
|
|
49
|
+
matters and whether it is required reading after compaction.
|
|
50
|
+
6. Write any important glue context that is not already on disk into the
|
|
51
|
+
handoff/restore map. This includes assumptions, partial conclusions, failed
|
|
52
|
+
paths, and why the listed files fit together.
|
|
53
|
+
7. In the compaction summary, include the restore map path and the top required
|
|
54
|
+
reading paths from that map.
|
|
55
|
+
|
|
56
|
+
## If You Just Compacted
|
|
57
|
+
|
|
58
|
+
Treat your memory as unreliable until you restore from durable evidence.
|
|
59
|
+
Restoration is your current task. Do not wait for a future user request or a
|
|
60
|
+
new task assignment before reading the required files.
|
|
61
|
+
|
|
62
|
+
1. Read any restore prompt, marker path, packet path, transcript path, restore
|
|
63
|
+
map, or extra instruction file named by the operator or OpenRig.
|
|
64
|
+
2. Run the restore script from this skill:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
node ~/.claude/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs --out /tmp/claude-compaction-restore
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If the prompt names a specific Claude JSONL transcript, pass it explicitly:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
node ~/.claude/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs /path/to/session.jsonl --out /tmp/claude-compaction-restore
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
3. Read the generated `restore-instructions.md`.
|
|
77
|
+
4. Read the generated `touched-files.md`.
|
|
78
|
+
5. Find and read the mental-model restore map if one exists. Treat it as the
|
|
79
|
+
highest-value guide to which memory files, mission files, source files, and
|
|
80
|
+
docs mattered before compaction.
|
|
81
|
+
6. Identify the important files for the active task. The touched-file list is
|
|
82
|
+
a triage aid, not a complete inventory.
|
|
83
|
+
7. Read every important file in full. Prioritize the restore map, Claude memory
|
|
84
|
+
files named in the map, Markdown state/planning files, queue/mission packets,
|
|
85
|
+
source files with active edits, root instruction files, and as-built or
|
|
86
|
+
codemap docs.
|
|
87
|
+
8. After the required reads are complete, state:
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
restored from packet at <path>; resumed at step <X>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Include the main files you read in full when you make that statement.
|
|
94
|
+
|
|
95
|
+
9. **REFOCUS BEFORE YOU RESUME — the restore returns your TASK, not your BEARINGS.** Everything
|
|
96
|
+
above rebuilds *what you were doing*. None of it rebuilds *what the work is for* or *how this
|
|
97
|
+
rig operates* — those live in the chains, and nothing in steps 1–8 walks them. Invoke the
|
|
98
|
+
`refocus` skill and do its reads before your next substantive move.
|
|
99
|
+
|
|
100
|
+
**Measured 2026-08-13, and this step exists because of it:** a seat completed this protocol
|
|
101
|
+
faithfully — packet built, narrative read tail-first, read-depth audit reported honestly — and
|
|
102
|
+
resumed with a perfect picture of its atom and *zero* work-tree context. It had never opened
|
|
103
|
+
the mission or project nodes, and could only paraphrase the release's intent second-hand from
|
|
104
|
+
a peer's message. It then produced a technically-correct trace concluding *"I hold nothing"*
|
|
105
|
+
while holding 18 pending rows. **A restore that returns you to your task without your bearings
|
|
106
|
+
is how a confidently-wrong agent gets back to work.**
|
|
107
|
+
|
|
108
|
+
**On the marker and the packet's size (measured across restores, 2026-08):** two realities the restore
|
|
109
|
+
must handle honestly —
|
|
110
|
+
|
|
111
|
+
- **The per-seat marker (`restore-pending/<session>.json`) is frequently absent** — in five observed
|
|
112
|
+
restores it was never present. Treat the JSONL rebuild via `restore-from-jsonl.mjs` as the **primary**
|
|
113
|
+
path, not a fallback: run it regardless of whether a marker exists. (When product-infra reliably writes
|
|
114
|
+
the marker for tmux-launched seats, it becomes a fast-path upgrade — not a prerequisite that keeps failing.)
|
|
115
|
+
- **The generated transcript can be very large** (measured at ~346k tokens in one restore). Do **not**
|
|
116
|
+
read it front-to-back or claim to. `restore-instructions.md` declares its token cost up front; default
|
|
117
|
+
to the **most recent ~50k tokens of unique narrative first** (recency is what a restore needs — the
|
|
118
|
+
thread that produced the current frontier, not the boot handshake), and go earlier only if a specific
|
|
119
|
+
question requires it. A restore must leave room for the work it was restored to do.
|
|
120
|
+
|
|
121
|
+
## Required Read-Depth Audit
|
|
122
|
+
|
|
123
|
+
After the first restore pass, audit yourself before continuing.
|
|
124
|
+
|
|
125
|
+
1. List every file, packet, marker, restore map, instruction file, and source
|
|
126
|
+
document you were asked to read during restore.
|
|
127
|
+
2. Mark each item as `FULL`, `PARTIAL`, or `NOT_READ`.
|
|
128
|
+
3. You will be given a task where all of these files are required reading in
|
|
129
|
+
order to understand the task.
|
|
130
|
+
4. Read `PARTIAL`/`NOT_READ` items in full — but **to a declared budget with a stopping rule**, not
|
|
131
|
+
unbounded. Prioritize by relevance to the active task; for a large transcript read the most recent
|
|
132
|
+
unique narrative first (see *If You Just Compacted*), not front-to-back.
|
|
133
|
+
5. **Stop** when either every task-relevant item is `FULL`, or you reach the budget — *a restore that
|
|
134
|
+
cannot leave room for the work it was restored to do is not a successful restore.* "Read everything,
|
|
135
|
+
never conserve" has no termination condition; that open-endedness is the bug, not the goal.
|
|
136
|
+
6. Report the final read-depth table **honestly** (`FULL`/`PARTIAL`/`NOT_READ`, each with a reason)
|
|
137
|
+
before task work. **An honest `PARTIAL` with its reason is a correct outcome, not a failure** — do
|
|
138
|
+
not claim a completion you did not reach.
|
|
139
|
+
|
|
140
|
+
## Guardrails
|
|
141
|
+
|
|
142
|
+
- Compaction is survival, not housekeeping — never compact to free space, "lean" a seat, or capture/prepare an agent starter (the `rig agent-image` library). It is lossy (a compacted Claude is confident-but-hollow); compact only when a seat is genuinely near its context limit, with a before/after plan. A starter's value is being *functional*, not small — see the `agent-starters` skill.
|
|
143
|
+
- Do not silently launch fresh after compaction.
|
|
144
|
+
- Do not continue from memory when restore evidence exists.
|
|
145
|
+
- Do not defer required restore reading until a later user task. The restore is
|
|
146
|
+
the current task.
|
|
147
|
+
- Do not skip root instructions, as-built docs, or codemaps before product
|
|
148
|
+
code/review work.
|
|
149
|
+
- Do not treat the generated touched-file list as exhaustive.
|
|
150
|
+
- Do not mark a file `FULL` unless you actually read the full file content
|
|
151
|
+
after compaction.
|
|
152
|
+
- Do not resume task work until the restore sentinel and read-depth audit are
|
|
153
|
+
complete.
|
|
154
|
+
|
|
155
|
+
## Failure Modes To Avoid
|
|
156
|
+
|
|
157
|
+
1. **Confidently-wrong restoration**: claiming restoration after reading only
|
|
158
|
+
the touched-file list or summary.
|
|
159
|
+
2. **Partial restore**: reading the first few files, then continuing before the
|
|
160
|
+
full reading list is complete.
|
|
161
|
+
3. **Skipping project instructions**: missing `AGENTS.md`, `CLAUDE.md`,
|
|
162
|
+
`README.md`, as-built docs, or codemaps that govern the task.
|
|
163
|
+
4. **Treating the packet as exhaustive**: ignoring mission or workspace files
|
|
164
|
+
that are important but were not discovered by the script.
|
|
165
|
+
5. **Waiting for the next task**: treating restore reading as conditional on a
|
|
166
|
+
future user assignment instead of completing it immediately.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# GENERATED by scripts/generate-context-packs.mjs — DO NOT EDIT.
|
|
2
|
+
# Package-time projection of a canonical skill; regenerated every build.
|
|
3
|
+
name: "claude-compaction-restore"
|
|
4
|
+
version: "0.5.7"
|
|
5
|
+
taxonomy: "skills"
|
|
6
|
+
purpose: "Use when a Claude Code session has just compacted, is about to compact, reached context limit, resumed after /compact, or needs to rebuild its working mental model from Claude JSONL transcripts and touched files."
|
|
7
|
+
files:
|
|
8
|
+
- path: "SKILL.md"
|
|
9
|
+
role: "instruction"
|
|
10
|
+
summary: "Use when a Claude Code session has just compacted, is about to compact, reached context limit, resumed after /compact, or needs to rebuild its working mental model from Claude JSONL transcripts and touched files."
|
|
11
|
+
- path: "scripts/precompact-hook.mjs"
|
|
12
|
+
role: "reference"
|
|
13
|
+
- path: "scripts/restore-from-jsonl.mjs"
|
|
14
|
+
role: "reference"
|
|
15
|
+
- path: "templates/compact-instruction.md"
|
|
16
|
+
role: "reference"
|
|
17
|
+
- path: "templates/post-compact-restore-instruction.md"
|
|
18
|
+
role: "reference"
|