Draft proposal
This skill takes an idea the developer wants to capture and turns it into a markdown file under docs/proposals/ in bewith-dev/bewith-docs. The proposal lands directly on master (or as a PR — the developer chooses) so the team can find it next time they triage.
Different from propose-team-rule. That skill is for generic team conventions / coding rules. This skill is for feature, infrastructure, process, or tooling ideas — things that get implemented as side projects.
When to invoke
Manual entry point: /propose [optional one-line description].
Auto-invoke (after explicit user approval): if a developer mentions an idea during a session that's clearly a feature/infra change rather than a team rule, you can offer to capture it:
"זה נשמע כמו רעיון שווה ליישום. רוצה שאדריקבע פרופוזל ב-bewith-docs?"
If they confirm, invoke this skill. If they say "this is just a thought, not yet" — drop it. Each proposal consumes a little triage attention later.
Proposal vs team rule vs RFC — fast triage
| Type | Use when | Where |
|---|---|---|
Team rule (/share-rule) | Generic convention, coding standard, gotcha that applies broadly | .claude/rules/team/ |
Proposal (/propose) | Feature/infra/process idea, side-project-sized (S/M effort) | docs/proposals/ |
| RFC (manual, no skill yet) | Multi-team, week-plus, contract-changing | docs/rfcs/ |
If unsure, default to proposal — it's the lightest tier and graduates naturally.
Steps
1. Confirm the idea with the developer
Restate what you're about to capture, in one or two sentences. Get explicit confirmation. Example:
"אני הולך לפתוח פרופוזל: 'BE interceptor שמתייג Datadog logs ב-
app.versionמה-X-App-Version header'. category: infrastructure, effort: S. ברירת מחדל owner: null (status: open) — אם אתה רוצה לקלום ולהוביל, תגיד לי. מאשר?"
If the developer wants to wordsmith, edit together before the file is written. Once approved:
2. Collect the four required fields
You need answers to draft a complete proposal. Ask whichever the developer didn't already provide:
- Problem — what's the pain or opportunity? Push for concreteness (a specific scenario, an incident, a metric) — reject vague "it would be nice if".
- Sketch of approach — bullet points enough to picture the work. Not a design.
- Effort —
S(under a day),M(1-3 days), orL(more than 3 days, consider RFC instead). - Owner — default is
owner: nullandstatus: open. Only setownerto the author (andstatus: claimed) if they explicitly say "I'll drive this" or "claim it". Don't assume — most proposals are surfaced for triage to pick up an owner, not pre-claimed by the author. When in doubt, ask: "Are you claiming this to drive yourself, or leaving it open for triage?"
The other frontmatter fields you fill in automatically:
id,created,authorfrom contextcategoryyou infer from the description (infrastructure/feature/process/tooling)status: open(the default) — orclaimedonly if the author explicitly claimedtriaged: null,clickup_id: null,graduated_to: null,related: [],tags: []
3. Audit existing proposals to spot clusters
Before drafting, grep the existing proposals for overlap:
grep -rn "<key-phrase>" "$BEWITH_DIR/docs/proposals/" 2>/dev/null
If a proposal on the same topic exists:
- If it's
claimed/open/triaged— surface it to the developer. They can edit it, link the two viarelated:, or decide to skip the new one. - If it's
archived— note the prior rationale to the developer. Maybe their new idea overcomes the original objection; maybe not.
Don't auto-merge. Just inform.
4. Locate the bewith-docs checkout
Follow the canonical resolution cascade in docs/methodology/session-safety.md — "Locating the bewith-docs checkout". Set BEWITH_DIR=<resolved path> and continue.
The cascade lives in one place so all state-mutating skills inherit any future change. Do not restate it here.
5. Pre-flight safety checks
# 5a. Generate the proposal slug
TODAY="$(date -u +%Y-%m-%d)"
SLUG="proposal-${TODAY}-<kebab-case-title>"
BRANCH="proposal/${SLUG}"
# 5b. Refuse if the file or branch already exists
if [ -f "$BEWITH_DIR/docs/proposals/${SLUG}.md" ]; then
echo "ERROR: $BEWITH_DIR/docs/proposals/${SLUG}.md already exists. Pick a different slug or edit the existing file." >&2
exit 1
fi
git -C "$BEWITH_DIR" fetch origin master --quiet
if git -C "$BEWITH_DIR" rev-parse --verify --quiet "refs/heads/${BRANCH}" >/dev/null; then
echo "ERROR: branch ${BRANCH} already exists locally." >&2
exit 1
fi
if git -C "$BEWITH_DIR" ls-remote --exit-code origin "${BRANCH}" >/dev/null 2>&1; then
echo "ERROR: branch ${BRANCH} already exists on remote — probably an in-flight proposal." >&2
exit 1
fi
6. Create an isolated worktree
Never operate on the developer's working tree. Concurrent sessions may be editing it.
WORKTREE="$(mktemp -d -t bewith-proposal.XXXXXXXX)"
git -C "$BEWITH_DIR" worktree add -b "${BRANCH}" "${WORKTREE}" origin/master
# Pre-commit validators import js-yaml etc.; a fresh worktree has no node_modules.
ln -s "$BEWITH_DIR/node_modules" "${WORKTREE}/node_modules"
7. Draft the proposal file
Use the template at docs/templates/proposal.md as the structural reference. Write to ${WORKTREE}/docs/proposals/${SLUG}.md with this frontmatter shape (fill in the values you collected in step 2):
---
id: <slug>
title: "<short title>"
description: "<one-sentence summary>"
status: open # default; use 'claimed' only if author explicitly claimed
author: "<git user.name or @handle>"
owner: null # default; set to author only if explicitly claimed
created: <TODAY>
triaged: null
category: <infrastructure | feature | process | tooling | other>
effort: <S | M | L>
related: []
clickup_id: null
graduated_to: null
tags: []
---
Body sections in order:
- Title (H1 — same as
title) - Badges row (one each for status, author, owner, effort)
- Problem — the pain or opportunity
- Proposal — the idea (1-2 paragraphs)
- Why now / Why us — motivation
- Sketch of approach — bullets
- Open questions — bullets
- Related — links to specs, RFCs, ClickUp tickets
- Triage notes (empty stub for now)
Match the seed example at docs/proposals/proposal-2026-05-29-be-datadog-tagging-from-app-version.md for tone and structure.
8. Append a row to the proposals index
Edit ${WORKTREE}/docs/proposals/index.md and add a row to the Active table:
| [<title>](./<slug>) | <author> | <owner or _open_> | <category> | <effort> | <status> |
Keep rows ordered by created (newest at top). Do not auto-generate the index from frontmatter — that's a future enhancement; for now the file is hand-maintained.
9. Commit, push, and (optionally) open a PR
git -C "${WORKTREE}" add docs/proposals/${SLUG}.md docs/proposals/index.md
git -C "${WORKTREE}" commit -m "$(cat <<EOF
proposal: <short title>
<one-paragraph summary — same as the description field plus a sentence
on why it's being proposed.>
Author: <author>
Owner: <owner or unassigned>
Category: <category>
Effort: <effort>
Refs: bewith-dev/bewith-docs docs/proposals/
EOF
)"
git -C "${WORKTREE}" push -u origin "${BRANCH}"
Then ask the developer:
"Open a PR for team visibility, or just merge directly to master (proposal tier is low-bar)?"
- PR:
gh pr create --repo bewith-dev/bewith-docs --base master --head ${BRANCH} --title "proposal: <title>" --body "<short body>" - Direct merge:
gh pr create ... --label "proposal" && gh pr merge --squash --auto(or fast-forward if the developer prefers).
Surface the resulting URL.
10. Clean up the worktree
git -C "$BEWITH_DIR" worktree remove "${WORKTREE}" --force
Always run this, even on failure paths (use a trap).
Failure modes — explicit list
- No bewith-docs clone → stop. Tell the developer. Do not invent fallbacks.
- Branch / file already exists → stop. Tell the developer the slug clashed; let them rename.
- gh CLI not authenticated → tell the developer to run
gh auth loginand retry. Don't push without a PR/merge follow-up. - No
git user.nameconfigured → ask the developer for their handle and pass it as--authorto the commit; don't fail silently.
What this skill does NOT do
- It does NOT create a ClickUp task. That happens during triage.
- It does NOT open Slack discussions. The PR or commit on
masteris the discoverable artifact. - It does NOT enforce any review window. Proposals are low-bar — discussion happens in PR comments if anyone wants, otherwise the proposal waits for triage.
- It does NOT validate that the idea is "worth doing". That's what triage is for.