Feedback (reverse cascade)
Overview
Capture a finding from any downstream stage into a structured .forge/feedback/<timestamp>-<source>.md entry that targets one upstream artifact. The entry stays as status: PENDING until the upstream skill re-runs and addresses it. forge-sync flags the target artifact as FEEDBACK_PENDING until the entry is resolved.
This is the only sanctioned reverse-cascade primitive. The forward chain (prd → arch → tasks → code) flows one direction; backward propagation happens through these entries, not by directly editing upstream artifacts mid-stream.
When to Use
- During
/build you discover the relevant contract is missing an operation or has the wrong shape
- During
/review you find an architectural flaw that wasn't visible at design time
- During
/secure or /scale you produce a recommendation that implies architecture changes (add a WAF, change a data store, add a gateway)
- During an incident you discover an error path the error-handling spec didn't cover
- After a sprint, you realize ≥3 tasks split mid-flight — the plan needs an update before the next sprint
When NOT to Use
- The fix is fully contained inside the current stage (don't escalate every implementation detail)
- You have permission to edit the upstream artifact directly and want to do so — then just edit it;
forge-sync will flag downstream as STALE
- The finding is a question, not a recommended change — discuss with the user first; file the entry once a recommendation crystallizes
- The target artifact doesn't exist (
.forge/security.md not yet generated) — run the source skill instead
Common Rationalizations
| Thought |
Reality |
| "I'll just edit the contract inline" |
Then the chain has no record of WHY it changed. Future readers see a contract that contradicts the PRD with no explanation. |
| "Filing a feedback entry is overhead — I'll fix it later" |
"Later" means the finding is forgotten by the time the upstream skill re-runs. The entry is the memory. |
| "The upstream skill will figure it out when it re-runs" |
The upstream skill regenerates from its inputs, not from the downstream's discovery. Without a feedback entry, the regenerated artifact has the same flaw. |
| "This is too small for a feedback entry" |
Three small findings ignored = one big surprise at /ship. |
| "I'll just tell the user verbally" |
Verbal findings evaporate. The entry survives session boundaries. |
Red Flags
- Editing
.forge/contracts/<X>.md directly during /build instead of filing a feedback entry
- A sprint ends with no
.forge/feedback/ entries despite ≥3 tasks having notes populated
forge-sync reports FEEDBACK_PENDING on artifacts that are about to be re-generated, but the regenerating skill doesn't read .forge/feedback/
- A
.forge/feedback/*.md file exists with status: PENDING for more than two sprints — either resolve it or mark it DEFERRED with a reason
Core Process
Step 1: Identify source, target, and finding
- Source stage: which skill or activity discovered the issue (
build, review, secure, scale, incident, manual)
- Source context: task ID, commit, PR, incident ID, or "manual" if ad-hoc
- Target artifact: which
.forge/ file needs revision. Must exist on disk. If multiple files need revision, file separate entries.
- Finding: what was discovered (1-3 sentences, specific)
- Recommended change: what should change in the target artifact (specific enough that re-running the source skill can apply it)
Step 2: Decide severity
Choose one:
- NEEDS_REVIEW — finding requires a human decision; auto-cascade not safe (e.g., "add WAF" — the human decides whether to absorb the change in architecture or defer)
- FEEDBACK_PENDING — recommended change is mechanical; the upstream skill can apply it on re-run (e.g., "add
refund endpoint to PaymentService contract")
Both states block /ship. Only NEEDS_REVIEW blocks /build if it touches the in-flight task's contract.
Step 3: Write the entry
Path: .forge/feedback/<ISO8601-UTC-with-dashes>-<source>.md — e.g., .forge/feedback/2026-05-14T103000Z-build.md.
<!-- forge:meta
generated_by: feedback
generated_at: 2026-05-14T10:30:00Z
depends_on: [.forge/contracts/payment-service.md]
generated_from:
.forge/contracts/payment-service.md: <target's content_hash AT filing time>
content_hash: <first 8 chars of sha256 over this entry's body>
-->
# Feedback: <short title>
- **Source stage:** build (incremental-implementation, task T-042)
- **Source context:** commit pending; branch task/T-042-refund-flow
- **Target artifact:** .forge/contracts/payment-service.md
- **Severity:** FEEDBACK_PENDING
- **Status:** PENDING
- **Filed at:** 2026-05-14T10:30:00Z
- **Resolved at:** —
## Finding
While implementing the refund flow, the PaymentService contract has no `refund(transactionId, amount)` operation. The PRD's "User can refund failed transactions within 30 days" story can't be satisfied without it.
## Recommended change
Add to `Provides` in `.forge/contracts/payment-service.md`:
refund(input: RefundInput): RefundOutput | RefundError
with:
- `RefundInput = { transactionId: string, amount?: number, idempotencyKey: string }`
- `RefundOutput = { refundId, refundedAt, amount }`
- `RefundError` cases: `TransactionNotFound`, `RefundWindowExpired`, `AlreadyRefunded`, `PartialRefundNotAllowed`
Idempotency-Key required per `api-design.md` mutation policy.
## Cascade
- Re-run `/architect` (or edit the contract directly) to address this entry.
- After contract update, re-run `/plan` if the refund story needs new tasks beyond T-042.
- `forge-sync` will mark this entry `RESOLVED` once the target artifact's `generated_at` advances past this entry's `generated_at` AND the recommended operation appears in the target.
depends_on is the target_artifact (single-element list) — that's what forge-sync reads to identify what's being annotated.
Step 4: Confirm with user
Print the entry path and a one-line summary:
Filed .forge/feedback/2026-05-14T103000Z-build.md — target .forge/contracts/payment-service.md, severity FEEDBACK_PENDING. Run /sync to see chain impact.
Do not modify the target artifact in this skill. The skill is write-only into .forge/feedback/.
Step 5: Tracking resolution
The feedback skill itself does not resolve entries. Resolution happens when the targeted upstream skill re-runs:
- The upstream skill (e.g.,
architecture-and-contracts) reads all .forge/feedback/*.md entries where target_artifact matches an output it owns AND status: PENDING.
- It addresses each in its regeneration.
- After writing, it updates each addressed entry:
status: RESOLVED, resolved_at: <now UTC>, resolved_by: <commit or "manual">.
forge-sync confirms the resolution by checking that the target artifact's content reflects the recommended change.
Entries can also be marked DEFERRED (with a reason in the body) when the team decides not to act — the entry stays in the directory as historical record.
Verification
1---2name: feedback3description: Use when implementation, review, security, scalability, or incident work reveals that an upstream .forge/ artifact is wrong, when a contract is missing an operation, when an ADR is being contradicted by a current need, when security recommends architecture changes, or when the user says "we discovered the spec is wrong".4---56# Feedback (reverse cascade)78## Overview910Capture a finding from any downstream stage into a structured `.forge/feedback/<timestamp>-<source>.md` entry that targets one upstream artifact. The entry stays as `status: PENDING` until the upstream skill re-runs and addresses it. `forge-sync` flags the target artifact as **FEEDBACK_PENDING** until the entry is resolved.1112This is the only sanctioned reverse-cascade primitive. The forward chain (`prd → arch → tasks → code`) flows one direction; backward propagation happens through these entries, not by directly editing upstream artifacts mid-stream.1314## When to Use1516- During `/build` you discover the relevant contract is missing an operation or has the wrong shape17- During `/review` you find an architectural flaw that wasn't visible at design time18- During `/secure` or `/scale` you produce a recommendation that implies architecture changes (add a WAF, change a data store, add a gateway)19- During an incident you discover an error path the error-handling spec didn't cover20- After a sprint, you realize ≥3 tasks split mid-flight — the plan needs an update before the next sprint2122## When NOT to Use2324- The fix is fully contained inside the current stage (don't escalate every implementation detail)25- You have permission to edit the upstream artifact directly and want to do so — then just edit it; `forge-sync` will flag downstream as STALE26- The finding is a question, not a recommended change — discuss with the user first; file the entry once a recommendation crystallizes27- The target artifact doesn't exist (`.forge/security.md` not yet generated) — run the source skill instead2829## Common Rationalizations3031| Thought | Reality |32|---------|---------|33| "I'll just edit the contract inline" | Then the chain has no record of WHY it changed. Future readers see a contract that contradicts the PRD with no explanation. |34| "Filing a feedback entry is overhead — I'll fix it later" | "Later" means the finding is forgotten by the time the upstream skill re-runs. The entry is the memory. |35| "The upstream skill will figure it out when it re-runs" | The upstream skill regenerates from its inputs, not from the downstream's discovery. Without a feedback entry, the regenerated artifact has the same flaw. |36| "This is too small for a feedback entry" | Three small findings ignored = one big surprise at /ship. |37| "I'll just tell the user verbally" | Verbal findings evaporate. The entry survives session boundaries. |3839## Red Flags4041- Editing `.forge/contracts/<X>.md` directly during `/build` instead of filing a feedback entry42- A sprint ends with no `.forge/feedback/` entries despite ≥3 tasks having `notes` populated43- `forge-sync` reports `FEEDBACK_PENDING` on artifacts that are about to be re-generated, but the regenerating skill doesn't read `.forge/feedback/`44- A `.forge/feedback/*.md` file exists with `status: PENDING` for more than two sprints — either resolve it or mark it `DEFERRED` with a reason4546## Core Process4748### Step 1: Identify source, target, and finding4950- **Source stage:** which skill or activity discovered the issue (`build`, `review`, `secure`, `scale`, `incident`, `manual`)51- **Source context:** task ID, commit, PR, incident ID, or "manual" if ad-hoc52- **Target artifact:** which `.forge/` file needs revision. Must exist on disk. If multiple files need revision, file separate entries.53- **Finding:** what was discovered (1-3 sentences, specific)54- **Recommended change:** what should change in the target artifact (specific enough that re-running the source skill can apply it)5556### Step 2: Decide severity5758Choose one:59- **NEEDS_REVIEW** — finding requires a human decision; auto-cascade not safe (e.g., "add WAF" — the human decides whether to absorb the change in architecture or defer)60- **FEEDBACK_PENDING** — recommended change is mechanical; the upstream skill can apply it on re-run (e.g., "add `refund` endpoint to PaymentService contract")6162Both states block `/ship`. Only `NEEDS_REVIEW` blocks `/build` if it touches the in-flight task's contract.6364### Step 3: Write the entry6566Path: `.forge/feedback/<ISO8601-UTC-with-dashes>-<source>.md` — e.g., `.forge/feedback/2026-05-14T103000Z-build.md`.6768```markdown69<!-- forge:meta70generated_by: feedback71generated_at: 2026-05-14T10:30:00Z72depends_on: [.forge/contracts/payment-service.md]73generated_from:74 .forge/contracts/payment-service.md: <target's content_hash AT filing time>75content_hash: <first 8 chars of sha256 over this entry's body>76-->7778# Feedback: <short title>7980- **Source stage:** build (incremental-implementation, task T-042)81- **Source context:** commit pending; branch task/T-042-refund-flow82- **Target artifact:** .forge/contracts/payment-service.md83- **Severity:** FEEDBACK_PENDING84- **Status:** PENDING85- **Filed at:** 2026-05-14T10:30:00Z86- **Resolved at:** —8788## Finding8990While implementing the refund flow, the PaymentService contract has no `refund(transactionId, amount)` operation. The PRD's "User can refund failed transactions within 30 days" story can't be satisfied without it.9192## Recommended change9394Add to `Provides` in `.forge/contracts/payment-service.md`:9596 refund(input: RefundInput): RefundOutput | RefundError9798with:99- `RefundInput = { transactionId: string, amount?: number, idempotencyKey: string }`100- `RefundOutput = { refundId, refundedAt, amount }`101- `RefundError` cases: `TransactionNotFound`, `RefundWindowExpired`, `AlreadyRefunded`, `PartialRefundNotAllowed`102103Idempotency-Key required per `api-design.md` mutation policy.104105## Cascade106107- Re-run `/architect` (or edit the contract directly) to address this entry.108- After contract update, re-run `/plan` if the refund story needs new tasks beyond T-042.109- `forge-sync` will mark this entry `RESOLVED` once the target artifact's `generated_at` advances past this entry's `generated_at` AND the recommended operation appears in the target.110```111112`depends_on` is the target_artifact (single-element list) — that's what `forge-sync` reads to identify what's being annotated.113114### Step 4: Confirm with user115116Print the entry path and a one-line summary:117118> Filed `.forge/feedback/2026-05-14T103000Z-build.md` — target `.forge/contracts/payment-service.md`, severity FEEDBACK_PENDING. Run `/sync` to see chain impact.119120Do not modify the target artifact in this skill. The skill is write-only into `.forge/feedback/`.121122### Step 5: Tracking resolution123124The feedback skill itself does not resolve entries. Resolution happens when the targeted upstream skill re-runs:1251261. The upstream skill (e.g., `architecture-and-contracts`) reads all `.forge/feedback/*.md` entries where `target_artifact` matches an output it owns AND `status: PENDING`.1272. It addresses each in its regeneration.1283. After writing, it updates each addressed entry: `status: RESOLVED`, `resolved_at: <now UTC>`, `resolved_by: <commit or "manual">`.1294. `forge-sync` confirms the resolution by checking that the target artifact's content reflects the recommended change.130131Entries can also be marked `DEFERRED` (with a reason in the body) when the team decides not to act — the entry stays in the directory as historical record.132133## Verification134135- [ ] `.forge/feedback/<timestamp>-<source>.md` written136- [ ] Filename timestamp is UTC with Z; format `YYYY-MM-DDTHHMMSSZ-<source>.md`137- [ ] `forge:meta` header has `depends_on: [<single target artifact path>]`138- [ ] Severity is one of `FEEDBACK_PENDING` or `NEEDS_REVIEW`139- [ ] Status is `PENDING` at filing time140- [ ] Recommended change is specific (operation name, type names, error cases — not "make it better")141- [ ] Cascade section names which upstream skill should re-run142- [ ] No upstream artifact was directly edited by this skill