docs(agents): bring agent-facing docs in line with the R44 fix
Six docs lagged after the post-merge R44 fix added withCapture + reported-flag.ts. They mentioned withSpan only and described the capture story as if it were inline in use-case / controller bodies. This commit aligns them with what shipped. CLAUDE.md (Key Conventions): - "Spans applied at DI bind time" → "Spans + capture composed at DI bind time" with the withSpan(withCapture(factory)) sandwich and the outermost-span ordering note. - "Capture at throw sites only" expanded to mention the __sentryReported flag, the three flag-checking sites (withCapture, SentryLogger, RecordingLogger), and where the helper lives. AGENTS.md (Instrumentation conventions): - Use case + controller wrapping example shows the full sandwich. - Capture-rules table now explicitly says "via withCapture" for use cases and controllers, and "flag set, withCapture bails" for the bubbled cases. packages/core-shared/AGENTS.md: - "with-span.ts" entry split into a paired with-span + with-capture block, including the actual sandwich code. - New entry for reported-flag.ts explaining the helper and why RecordingLogger inlines the check (boundary rule). - Barrel re-export list updated. docs/architecture/vertical-feature-spec.md (§16): - The bind-production line now describes the withSpan(withCapture(...)) sandwich, the outermost-span rationale, and the bubbled-error bail. docs/architecture/dependency-flow.md (TRACER/LOGGER subsection): - bindAll diagram updated: real repo line annotates inline calls; use case + controller lines show withSpan(withCapture(...)). docs/guides/tdd-workflow.md (Asserting spans and captures): - Direct-injection example shows the binder sandwich. - Capture-assertion example explains the flag-bail behaviour and links to the new tests/r44-no-double-capture.test.ts e2e example. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
24
AGENTS.md
24
AGENTS.md
@@ -385,28 +385,38 @@ return this.tracer.startSpan(
|
||||
);
|
||||
```
|
||||
|
||||
**Use case + controller spans (applied at DI bind time):**
|
||||
**Use case + controller spans + capture (applied at DI bind time):**
|
||||
|
||||
```ts
|
||||
const wrappedUC = withSpan(
|
||||
tracer,
|
||||
{ name: "blog.getArticles", op: "use-case" },
|
||||
getArticlesUseCase(repo),
|
||||
withCapture(
|
||||
logger,
|
||||
{ feature: "blog", layer: "use-case", name: "blog.getArticles" },
|
||||
getArticlesUseCase(repo),
|
||||
),
|
||||
);
|
||||
const wrappedCtrl = withSpan(
|
||||
tracer,
|
||||
{ name: "blog.getArticles", op: "controller" },
|
||||
getArticlesController(wrappedUC),
|
||||
withCapture(
|
||||
logger,
|
||||
{ feature: "blog", layer: "controller", name: "blog.getArticles" },
|
||||
getArticlesController(wrappedUC),
|
||||
),
|
||||
);
|
||||
```
|
||||
|
||||
**Capture rules:**
|
||||
`withSpan` is outermost; `withCapture` is between span and factory so the error is captured before the span closes with error status. Bodies stay vendor-clean — neither use cases nor controllers call `tracer` / `logger` inline.
|
||||
|
||||
**Capture rules** (each error captured exactly once via the `__sentryReported` flag from `core-shared/instrumentation/reported-flag.ts`):
|
||||
|
||||
| Layer | Captures | Doesn't capture |
|
||||
|---|---|---|
|
||||
| Repository | Infra/Payload errors that originate here | Bubbled errors |
|
||||
| Use case | Business-rule violations originated in this body | Errors from repos (already captured) |
|
||||
| Controller | `InputParseError` from safeParse failure | Anything else |
|
||||
| Repository | Infra/Payload errors that originate here (inline in catch) | Bubbled errors |
|
||||
| Use case | Business-rule violations + output-schema failures originated in this body (via `withCapture`) | Errors from repos — flag set, `withCapture` bails |
|
||||
| Controller | `InputParseError` from `safeParse` failure (via `withCapture`) | Errors from use cases — flag set, `withCapture` bails |
|
||||
| `defineErrorMiddleware` | Nothing — maps domain → TRPCError only | — |
|
||||
|
||||
**Boundary rule (eslint-enforced, R40):**
|
||||
|
||||
Reference in New Issue
Block a user