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
active — the scaffold is in production, the trigger has not
fired. The leash exists. No action.
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.
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.
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.
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.mdOriginal lane:
cool-ideasOriginal legend:
METHODOriginal backlog card
Leash files: a structural lane for temporary scaffolds
Legend:
METHODThe 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
JeditWorldlineSessionPortand 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:
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/, andgraveyard/; it does not replace any of them. Aleash and a prose
asap/card cross-reference each other when bothexist.
Required frontmatter
Required fields:
scaffold,repo,introduced_by,reason,deletion_trigger,symbols,status. Optional but encouraged:companion_cards,notesbody section after the frontmatter forcontext.
statusis one ofactive,triggered,deleted,escalated.Lifecycle
active— the scaffold is in production, the trigger has notfired. The leash exists. No action.
triggered— the deletion trigger condition has been met(e.g. the named cycle/phase closed). Tooling moves the file into
triggeredand surfaces it on the next cycle-close summary.deleted— the named symbols are gone from the repo. Toolingconfirms via grep and moves the leash file into
docs/method/graveyard/with the deletion SHA appended.escalated— the deletion trigger fired but the symbolsstill 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.rsLANESincludes"leash"socargo xtask method statuscounts leash files alongside otherbacklog lanes.
crates/method/src/graph.rsGRAPH_LANESincludes"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.rsincludesstatus_counts_leash_lane_filesas a regression so a futurerefactor cannot silently drop the lane.
The deeper trigger machinery is proposed as a follow-up:
xtask leash-auditruns in CI / locally and:docs/method/backlog/leash/*.mdfrontmatter.activeleash:deletion_trigger.cyclehas closed (look atdocs/method/retro/<cycle>/), promote totriggered.triggeredleash:symbols. If zerohits, promote to
deletedand move to graveyard. If any hits,surface as a warning.
triggeredleashes 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
backlog lane, same as every other lane.
condition is encoded; tooling notices.
five-line audit summary.
asap/: prose explanations stay where proseexplanations belong; structural records stay where structural
records belong.
graveyard/: completed leashes become ahistorical 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:
It names
JeditWorldlineSessionPort+JeditTransportSeam+createInMemoryJeditWorldlineSessionPort+ the installed EINTbridge as scaffolds whose deletion is bound to Echo cycle 0025
Phase 2 GREEN.
Not in scope here
xtask leash-auditimplementation (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).
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-leashin the agent's memory index. Thatmemory 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.