Skip to content

bug: forge-coordination skill scoping restrictions expressed as parentheticals — lost under compression #48

Description

@jflowers

Summary

internal/agentkit/content/skills/forge-coordination/SKILL.md documents the full coordinator and worker protocols. Critical scoping restrictions are expressed as parenthetical asides or single words in bullet lists — exactly the content that DCP context compression drops first.

Related to unbound-force/unbound-force#346 — same class of vulnerability (prompt constraints that do not survive context compression).

Specific Fragilities

1. "(coordinator only)" parenthetical

- Emergency release: comms_release_all() (coordinator only)

The parenthetical "(coordinator only)" is the entire access-control constraint. Under compression, this becomes "use comms_release_all for emergencies" — and a worker could call it, releasing all reservations system-wide including those held by other active workers.

2. Conflict Resolution sequence flattened

If a file reservation fails:
1. Check who holds the reservation
2. Send a message via comms_send to negotiate
3. Wait for release or escalate to coordinator

This three-step escalation process compresses to "resolve conflicts." An agent might skip negotiation and go straight to escalation, or worse, call comms_release_all() (which it learned about in the same skill).

3. Duplicate constraints with different strength levels

The file reservation rule appears in multiple places:

  • Worker agent: "Only edit files you have reserved" (soft)
  • This skill: "Workers MUST reserve files before editing" (strong)
  • Forge command: "Workers reserve their own files via comms_reserve" (descriptive)

A compressor picking one of these three might choose the weakest phrasing. The strongest version ("MUST") should be the one most likely to survive.

4. "exclusive" default not stated prominently

- Use comms_reserve(paths=[...], exclusive=true) for exclusive access

This is a bullet in a list. If compressed away, a worker might call comms_reserve without exclusive=true, allowing concurrent edits to the same file.

Proposed Hardening

  • Replace parenthetical access controls with explicit section headers: "## Coordinator-Only Operations" and "## Worker-Only Operations"
  • Inline the conflict resolution steps at the point of use rather than as a separate section
  • Ensure the strongest phrasing of shared constraints is the one that appears first and most prominently
  • Make exclusive=true the documented default behavior, not an option to remember

References

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions