Skip to content

Leash files: a structural lane for temporary scaffolds #81

Description

@flyingrobots

Migrated from Method backlog

This issue was created from a legacy filesystem backlog card. GitHub Issues are now the live work tracker; repository docs remain Method evidence.

Source backlog: docs/method/backlog/cool-ideas/METHOD_leash-files.md
Original lane: cool-ideas
Original legend: METHOD

Original backlog card

Leash files: a structural lane for temporary scaffolds

Legend: METHOD

The problem

Cross-repo or cross-cycle work routinely produces temporary scaffolds:
client-side mirrors of unfinished engine APIs, transitional adapters,
"good for now" boundary shims. They are deliberate decisions, not
mistakes. The failure mode is not introducing them — it is forgetting
to delete them when their reason expires.

The natural pressure on a working scaffold is to accrete features,
become depended on, and resist removal. Prose-only backlog cards
("we'll remember to delete this") rely on humans being the system
that nags. Humans are goldfish with keyboards.

The 2026-05-30 jedit PR flyingrobots/echo#33 review-resolution session ended with
exactly this concern about JeditWorldlineSessionPort and friends
("Temporary things love to buy furniture. Don't let it."). The
prototype response — jedit/docs/method/backlog/asap/sessions-migration.md
— is prose-heavy and human-friendly but not machine-naggable.

The shape

Promote a new backlog lane:

docs/method/backlog/leash/<scaffold-slug>.md

Each leash file is a small structured record naming a scaffold, the
event that should free it, and the symbols whose disappearance is the
deletion proof. The lane sits alongside asap/, bad-code/,
cool-ideas/, and graveyard/; it does not replace any of them. A
leash and a prose asap/ card cross-reference each other when both
exist.

Required frontmatter

---
scaffold: JeditWorldlineSessionPort
repo: jedit
introduced_by:
    pr: 33
    merged_sha: 90245c73
    date: 2026-05-30
reason: |
    Engine-side Session/WorldlineId types do not exist yet; the client
    carries a transitional mirror so the EINT cutover can ship without
    blocking on echo cycle 0025 Phase 2.
deletion_trigger:
    repo: echo
    cycle: "0025-sessions-as-causal-contexts"
    phase: "Phase 2 GREEN"
symbols:
    - JeditWorldlineSessionPort
    - JeditTransportSeam
    - createInMemoryJeditWorldlineSessionPort
    - installed-jedit-eint-bridge
status: active
companion_cards:
    - jedit/docs/method/backlog/asap/sessions-migration.md
---

Required fields: scaffold, repo, introduced_by, reason,
deletion_trigger, symbols, status. Optional but encouraged:
companion_cards, notes body section after the frontmatter for
context.

status is one of active, triggered, deleted, escalated.

Lifecycle

  1. active — the scaffold is in production, the trigger has not
    fired. The leash exists. No action.
  2. triggered — the deletion trigger condition has been met
    (e.g. the named cycle/phase closed). Tooling moves the file into
    triggered and surfaces it on the next cycle-close summary.
  3. deleted — the named symbols are gone from the repo. Tooling
    confirms via grep and moves the leash file into
    docs/method/graveyard/ with the deletion SHA appended.
  4. escalated — the deletion trigger fired but the symbols
    still exist after a defined grace window. Tooling promotes the
    leash to asap/ and tags the next cycle.

What tooling has to do

This card lands the lane registration so existing tooling sees
leash files from day one:

  • crates/method/src/workspace.rs LANES includes "leash" so
    cargo xtask method status counts leash files alongside other
    backlog lanes.
  • crates/method/src/graph.rs GRAPH_LANES includes "leash"
    and lane_colors() gives it an amber + dark-orange palette
    ("tied, on a clock" — distinct from asap's soft yellow).
  • crates/method/tests/status_tests.rs includes
    status_counts_leash_lane_files as a regression so a future
    refactor cannot silently drop the lane.

The deeper trigger machinery is proposed as a follow-up:
xtask leash-audit runs in CI / locally and:

  • Parses every docs/method/backlog/leash/*.md frontmatter.
  • For each active leash:
    • If the deletion_trigger.cycle has closed (look at
      docs/method/retro/<cycle>/), promote to triggered.
  • For each triggered leash:
    • Greps the leash's repo for every entry in symbols. If zero
      hits, promote to deleted and move to graveyard. If any hits,
      surface as a warning.
  • For triggered leashes older than the configured grace window
    (default: 1 cycle), promote to escalated.

The audit script is dumb on purpose. The hard work is keeping the
leash records honest, not the matching.

Why this is the right size of mechanism

  • It does not introduce a new project-management tool. It is a
    backlog lane, same as every other lane.
  • It does not require humans to remember anything. The trigger
    condition is encoded; tooling notices.
  • It scales: a repo with five active leashes still produces a
    five-line audit summary.
  • It composes with asap/: prose explanations stay where prose
    explanations belong; structural records stay where structural
    records belong.
  • It composes with graveyard/: completed leashes become a
    historical record of "we said this was temporary, here is the SHA
    that proved it."

Prototype

The first concrete leash, landing alongside this card, is in the
jedit repo at:

jedit/docs/method/backlog/leash/jedit-session-port.md

It names JeditWorldlineSessionPort + JeditTransportSeam +
createInMemoryJeditWorldlineSessionPort + the installed EINT
bridge as scaffolds whose deletion is bound to Echo cycle 0025
Phase 2 GREEN.

Not in scope here

  • The xtask leash-audit implementation (the trigger / symbol /
    status transition machinery). This card ships the lane
    registration so leash files are visible to existing tooling from
    day one; the audit gets built when the second leash file shows
    up (the universal "you only need a Tool when you have two of the
    thing" rule).
  • Cross-repo automation that opens deletion PRs automatically. That
    is the natural next step but adds blast radius; ship the manual
    audit first.

Companion memory

The 2026-05-30 session captured the leash-pattern motivation as a
project memory in the agent's own store; see
project-jedit-session-port-leash in the agent's memory index. That
memory and this card are the same idea at two altitudes: the memory
keeps the agent honest in casual touches of the codebase; this card
keeps METHOD honest at the cycle/process level.

Activity

  1. coderabbitai commented on Jun 1, 2026

    @coderabbitai
    🔗 Related PRs

    flyingrobots/echo#309 - feat: add Doghouse PR flight recorder [merged]
    flyingrobots/echo#326 - Echo contract hosting roadmap [merged]
    flyingrobots/echo#382 - 0024 universal LE binary codec + 0025 sessions design (design-only) [merged]
    flyingrobots/echo#385 - docs(backlog): two follow-ups from the 2026-05-30 merge session [merged]
    flyingrobots/echo#388 - docs(method): add backlog cards and hook failure note [merged]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  2. coderabbitai commented on Jul 3, 2026

    @coderabbitai
    🔗 Related PRs

    #1 - [codex] refresh METHOD signposts and legend structure [merged]
    #5 - Shape release workflow and user migration docs [merged]
    #18 - Land 0030-0033 repo-truth and MCP debt fixes [merged]
    #20 - Add backlog notes for agent-first planning and review workflow [merged]
    #64 - Make GitHub Issues the Method work tracker [merged]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    lane:cool-ideasInteresting but not committed work.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions