devrites 5.10.2 → 5.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +24 -10
- package/bin/devrites.mjs +2 -0
- package/docs/command-map.md +5 -4
- package/docs/skills.md +10 -4
- package/engine/internal/devritespaths/paths.go +2 -0
- package/engine/internal/hostpack/hostpack.go +39 -5
- package/engine/internal/hostpack/hostpack_test.go +27 -13
- package/engine/internal/install/apply.go +17 -4
- package/engine/internal/install/install.go +9 -2
- package/engine/internal/install/install_test.go +15 -2
- package/engine/internal/install/preflight.go +8 -2
- package/engine/internal/install/update.go +1 -1
- package/install.sh +4 -1
- package/pack/generated/README.md +4 -2
- package/pack/generated/devin/AGENTS.md +23 -0
- package/pack/generated/devin/agents/devrites-code-reviewer.md +145 -0
- package/pack/generated/devin/agents/devrites-devex-reviewer.md +126 -0
- package/pack/generated/devin/agents/devrites-doubt-reviewer.md +91 -0
- package/pack/generated/devin/agents/devrites-evidence-scout.md +77 -0
- package/pack/generated/devin/agents/devrites-frontend-reviewer.md +119 -0
- package/pack/generated/devin/agents/devrites-performance-reviewer.md +117 -0
- package/pack/generated/devin/agents/devrites-plan-drafter.md +102 -0
- package/pack/generated/devin/agents/devrites-plan-reviewer.md +144 -0
- package/pack/generated/devin/agents/devrites-proof-runner.md +76 -0
- package/pack/generated/devin/agents/devrites-retrospector.md +64 -0
- package/pack/generated/devin/agents/devrites-security-auditor.md +112 -0
- package/pack/generated/devin/agents/devrites-simplifier-reviewer.md +97 -0
- package/pack/generated/devin/agents/devrites-slice-wright.md +219 -0
- package/pack/generated/devin/agents/devrites-spec-reviewer.md +99 -0
- package/pack/generated/devin/agents/devrites-strategy-reviewer.md +102 -0
- package/pack/generated/devin/agents/devrites-test-analyst.md +97 -0
- package/pack/generated/devin/agents/devrites-upgrade-planner.md +91 -0
- package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +64 -0
- package/pack/generated/devin/skills/devrites-audit/SKILL.md +51 -0
- package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +77 -0
- package/pack/generated/devin/skills/devrites-browser-proof/reference/browser-performance.md +15 -0
- package/pack/generated/devin/skills/devrites-browser-proof/reference/visual-verdict.md +34 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +97 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/build-the-loop.md +58 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/hypotheses.md +17 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/instrumentation.md +21 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/regression-test.md +30 -0
- package/pack/generated/devin/skills/devrites-debug-recovery/reference/trace.md +25 -0
- package/pack/generated/devin/skills/devrites-doubt/SKILL.md +80 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +87 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/craft.md +63 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/design-references.md +116 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/fullstack.md +46 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/quality-standards.md +294 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/reuse-first.md +53 -0
- package/pack/generated/devin/skills/devrites-frontend-craft/reference/shape.md +56 -0
- package/pack/generated/devin/skills/devrites-interview/SKILL.md +103 -0
- package/pack/generated/devin/skills/devrites-lib/SKILL.md +57 -0
- package/pack/generated/devin/skills/devrites-lib/reference/candidate-integrity.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +64 -0
- package/pack/generated/devin/skills/devrites-lib/reference/orchestration-profiles.md +27 -0
- package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +73 -0
- package/pack/generated/devin/skills/devrites-lib/reference/reply-contract.md +88 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/README.md +60 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +415 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +99 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/anti-patterns.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/browser-proof-checklist.md +24 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +50 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-navigation.md +43 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +108 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/coding-style.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/context-hygiene.md +109 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +167 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +118 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/debug-recovery.md +28 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/definition-of-done.md +19 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/deprecation.md +31 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +119 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/development-workflow.md +29 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/documentation.md +43 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/edge-case-trace.md +92 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/elicitation.md +85 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/error-handling.md +47 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/git-workflow.md +49 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/hooks.md +25 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/integration-reliability.md +102 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/observability.md +88 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/one-shot-actions.md +97 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/patterns.md +68 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +51 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/principles.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/prose-style.md +123 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/release/ship-checklist.md +8 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/repository-topology.md +80 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/review-checklist.md +12 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/security-checklist.md +25 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/security.md +202 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +209 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/spec-grammar.md +197 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/test-proof-checklist.md +13 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +212 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/tooling.md +92 -0
- package/pack/generated/devin/skills/devrites-lib/reference/standards/workflow-artifacts.md +427 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/code.md +44 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/comparison.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/diagram.md +51 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/index.md +66 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/input.md +46 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/outline-template.md +106 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/plan.md +48 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/slides.md +40 -0
- package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/table.md +42 -0
- package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +267 -0
- package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +74 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/banned-phrases.md +132 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/examples.md +131 -0
- package/pack/generated/devin/skills/devrites-prose-craft/reference/structures.md +196 -0
- package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +53 -0
- package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +135 -0
- package/pack/generated/devin/skills/devrites-ux-shape/reference/brief-template.md +108 -0
- package/pack/generated/devin/skills/devrites-ux-shape/reference/visual-direction-probe.md +48 -0
- package/pack/generated/devin/skills/rite/SKILL.md +148 -0
- package/pack/generated/devin/skills/rite/reference/menu.md +48 -0
- package/pack/generated/devin/skills/rite-adopt/SKILL.md +51 -0
- package/pack/generated/devin/skills/rite-adopt/reference/adoption.md +19 -0
- package/pack/generated/devin/skills/rite-adopt/reference/anti-patterns.md +19 -0
- package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +142 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +43 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +151 -0
- package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +97 -0
- package/pack/generated/devin/skills/rite-build/SKILL.md +102 -0
- package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +148 -0
- package/pack/generated/devin/skills/rite-build/reference/anti-patterns.md +27 -0
- package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +120 -0
- package/pack/generated/devin/skills/rite-build/reference/checkpoint.md +56 -0
- package/pack/generated/devin/skills/rite-build/reference/frontend-trigger.md +39 -0
- package/pack/generated/devin/skills/rite-build/reference/one-slice-cycle.md +51 -0
- package/pack/generated/devin/skills/rite-build/reference/output.md +33 -0
- package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +214 -0
- package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +89 -0
- package/pack/generated/devin/skills/rite-build/reference/spec-drift-guard.md +84 -0
- package/pack/generated/devin/skills/rite-build/reference/tdd.md +27 -0
- package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +96 -0
- package/pack/generated/devin/skills/rite-clarify/SKILL.md +98 -0
- package/pack/generated/devin/skills/rite-clarify/reference/anti-patterns.md +24 -0
- package/pack/generated/devin/skills/rite-clarify/reference/decision-coverage.md +55 -0
- package/pack/generated/devin/skills/rite-converge/SKILL.md +144 -0
- package/pack/generated/devin/skills/rite-converge/reference/anti-patterns.md +35 -0
- package/pack/generated/devin/skills/rite-converge/reference/convergence-assessment.md +65 -0
- package/pack/generated/devin/skills/rite-customize/SKILL.md +60 -0
- package/pack/generated/devin/skills/rite-define/SKILL.md +168 -0
- package/pack/generated/devin/skills/rite-define/reference/anti-patterns.md +26 -0
- package/pack/generated/devin/skills/rite-define/reference/gates.md +159 -0
- package/pack/generated/devin/skills/rite-define/reference/plan-template.md +149 -0
- package/pack/generated/devin/skills/rite-doctor/SKILL.md +68 -0
- package/pack/generated/devin/skills/rite-dogfood/SKILL.md +55 -0
- package/pack/generated/devin/skills/rite-explain/SKILL.md +152 -0
- package/pack/generated/devin/skills/rite-explain/reference/intake.md +89 -0
- package/pack/generated/devin/skills/rite-frame/SKILL.md +114 -0
- package/pack/generated/devin/skills/rite-frame/reference/failure-modes.md +66 -0
- package/pack/generated/devin/skills/rite-handoff/SKILL.md +97 -0
- package/pack/generated/devin/skills/rite-handoff/reference/handoff-template.md +44 -0
- package/pack/generated/devin/skills/rite-learn/SKILL.md +72 -0
- package/pack/generated/devin/skills/rite-plan/SKILL.md +185 -0
- package/pack/generated/devin/skills/rite-plan/reference/anti-patterns.md +34 -0
- package/pack/generated/devin/skills/rite-plan/reference/dependency-graph.md +48 -0
- package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +105 -0
- package/pack/generated/devin/skills/rite-plan/reference/slicing.md +168 -0
- package/pack/generated/devin/skills/rite-plan/reference/task-breakdown.md +42 -0
- package/pack/generated/devin/skills/rite-polish/SKILL.md +105 -0
- package/pack/generated/devin/skills/rite-polish/reference/adr-promotion.md +11 -0
- package/pack/generated/devin/skills/rite-polish/reference/anti-ai-slop.md +187 -0
- package/pack/generated/devin/skills/rite-polish/reference/anti-patterns.md +30 -0
- package/pack/generated/devin/skills/rite-polish/reference/backend-polish.md +80 -0
- package/pack/generated/devin/skills/rite-polish/reference/browser-polish-evidence.md +33 -0
- package/pack/generated/devin/skills/rite-polish/reference/code.md +82 -0
- package/pack/generated/devin/skills/rite-polish/reference/design-memory.md +117 -0
- package/pack/generated/devin/skills/rite-polish/reference/design-system-discovery.md +8 -0
- package/pack/generated/devin/skills/rite-polish/reference/harden-checklist.md +109 -0
- package/pack/generated/devin/skills/rite-polish/reference/ledger.md +65 -0
- package/pack/generated/devin/skills/rite-polish/reference/ui.md +137 -0
- package/pack/generated/devin/skills/rite-pov/SKILL.md +57 -0
- package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +54 -0
- package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +66 -0
- package/pack/generated/devin/skills/rite-prototype/SKILL.md +104 -0
- package/pack/generated/devin/skills/rite-prove/SKILL.md +122 -0
- package/pack/generated/devin/skills/rite-prove/reference/acceptance-proof.md +88 -0
- package/pack/generated/devin/skills/rite-prove/reference/anti-patterns.md +25 -0
- package/pack/generated/devin/skills/rite-prove/reference/browser-proof.md +51 -0
- package/pack/generated/devin/skills/rite-prove/reference/failure-triage.md +43 -0
- package/pack/generated/devin/skills/rite-prove/reference/proof-ladder.md +28 -0
- package/pack/generated/devin/skills/rite-prove/reference/test-command-discovery.md +30 -0
- package/pack/generated/devin/skills/rite-quick/SKILL.md +81 -0
- package/pack/generated/devin/skills/rite-resolve/SKILL.md +98 -0
- package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +118 -0
- package/pack/generated/devin/skills/rite-review/SKILL.md +171 -0
- package/pack/generated/devin/skills/rite-review/reference/anti-patterns.md +32 -0
- package/pack/generated/devin/skills/rite-review/reference/cognitive-load.md +90 -0
- package/pack/generated/devin/skills/rite-review/reference/feature-scoped-review.md +26 -0
- package/pack/generated/devin/skills/rite-review/reference/five-axis-review.md +66 -0
- package/pack/generated/devin/skills/rite-review/reference/nielsen-heuristics.md +126 -0
- package/pack/generated/devin/skills/rite-review/reference/performance-checklist.md +80 -0
- package/pack/generated/devin/skills/rite-review/reference/performance-review.md +14 -0
- package/pack/generated/devin/skills/rite-review/reference/security-review.md +42 -0
- package/pack/generated/devin/skills/rite-seal/SKILL.md +74 -0
- package/pack/generated/devin/skills/rite-seal/reference/anti-patterns.md +29 -0
- package/pack/generated/devin/skills/rite-seal/reference/final-evidence.md +41 -0
- package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +29 -0
- package/pack/generated/devin/skills/rite-seal/reference/output.md +5 -0
- package/pack/generated/devin/skills/rite-seal/reference/phase-contract.md +47 -0
- package/pack/generated/devin/skills/rite-seal/reference/risk-and-rollback.md +56 -0
- package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +27 -0
- package/pack/generated/devin/skills/rite-ship/SKILL.md +87 -0
- package/pack/generated/devin/skills/rite-ship/reference/anti-patterns.md +28 -0
- package/pack/generated/devin/skills/rite-ship/reference/close-out.md +68 -0
- package/pack/generated/devin/skills/rite-ship/reference/git-ship.md +120 -0
- package/pack/generated/devin/skills/rite-ship/reference/rollout.md +62 -0
- package/pack/generated/devin/skills/rite-ship/reference/ship-template.md +39 -0
- package/pack/generated/devin/skills/rite-spec/SKILL.md +149 -0
- package/pack/generated/devin/skills/rite-spec/reference/acceptance-criteria.md +31 -0
- package/pack/generated/devin/skills/rite-spec/reference/ai-spec-template.md +40 -0
- package/pack/generated/devin/skills/rite-spec/reference/anti-patterns.md +27 -0
- package/pack/generated/devin/skills/rite-spec/reference/interview-patterns.md +56 -0
- package/pack/generated/devin/skills/rite-spec/reference/investigation.md +83 -0
- package/pack/generated/devin/skills/rite-spec/reference/question-protocol.md +36 -0
- package/pack/generated/devin/skills/rite-spec/reference/references-intake.md +62 -0
- package/pack/generated/devin/skills/rite-spec/reference/spec-checklists.md +89 -0
- package/pack/generated/devin/skills/rite-spec/reference/spec-template.md +154 -0
- package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +227 -0
- package/pack/generated/devin/skills/rite-status/SKILL.md +57 -0
- package/pack/generated/devin/skills/rite-temper/SKILL.md +129 -0
- package/pack/generated/devin/skills/rite-temper/reference/anti-patterns.md +30 -0
- package/pack/generated/devin/skills/rite-temper/reference/review-dimensions.md +66 -0
- package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +53 -0
- package/pack/generated/devin/skills/rite-temper/reference/significance.md +46 -0
- package/pack/generated/devin/skills/rite-temper/reference/strategy-template.md +90 -0
- package/pack/generated/devin/skills/rite-upgrade/SKILL.md +121 -0
- package/pack/generated/devin/skills/rite-vet/SKILL.md +192 -0
- package/pack/generated/devin/skills/rite-vet/reference/anti-patterns.md +43 -0
- package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +202 -0
- package/pack/generated/devin/skills/rite-vet/reference/cross-model.md +19 -0
- package/pack/generated/devin/skills/rite-vet/reference/depth.md +59 -0
- package/pack/generated/devin/skills/rite-vet/reference/eng-lenses.md +48 -0
- package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +201 -0
- package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +84 -0
- package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +69 -0
- package/package.json +4 -2
- package/scripts/build-host-artifacts.sh +48 -5
- package/scripts/devin-generate.sh +222 -0
- package/update.sh +2 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Deprecation & migration
|
|
2
|
+
|
|
3
|
+
Removing behavior is riskier than adding it because hidden consumers may depend on observable quirks as well as documented contracts (Hyrum's law). Destructive migration, public-API breakage, auth changes, and data-loss paths always use the irreversible-risk pause in [`afk-hitl.md`](afk-hitl.md).
|
|
4
|
+
|
|
5
|
+
## Prove it is unused
|
|
6
|
+
|
|
7
|
+
Find callers, subscribers, stored data, external clients, and scheduled jobs with code intelligence, then confirm runtime usage through [`observability.md`](observability.md). Static absence alone does not prove zero consumers. If zero usage cannot be proven, deprecate instead of deleting.
|
|
8
|
+
|
|
9
|
+
## Expand → migrate → contract
|
|
10
|
+
|
|
11
|
+
Use three independently shippable and reversible steps:
|
|
12
|
+
|
|
13
|
+
1. **Expand:** add the new path beside the old one.
|
|
14
|
+
2. **Migrate:** move consumers and data; observe old-path usage falling to zero.
|
|
15
|
+
3. **Contract:** remove the old path only after telemetry confirms zero use.
|
|
16
|
+
|
|
17
|
+
For data, this may mean add column → backfill → switch reads → drop the old column. Every destructive step needs a rollback.
|
|
18
|
+
|
|
19
|
+
## Deprecate before delete
|
|
20
|
+
|
|
21
|
+
- Mark the old path with its replacement and a measurable removal trigger: a date or a condition such as zero v1 traffic.
|
|
22
|
+
- Emit a usage signal so the trigger is evidence, not hope.
|
|
23
|
+
- The owner of the deprecated surface also owns migration. Provide the codemod, backfill, compatible update, documentation, and support consumers need; a deadline alone is a break with a countdown.
|
|
24
|
+
|
|
25
|
+
## Design for removal
|
|
26
|
+
|
|
27
|
+
When introducing a system, keep its exit bounded behind a flag, adapter, or small call surface. An unowned but still-used zombie must either regain an owner and green proof or follow the prove-unused and expand/contract path; do not leave it as an unmaintained dependency.
|
|
28
|
+
|
|
29
|
+
## Scope
|
|
30
|
+
|
|
31
|
+
Treat removal or migration as a feature with its own spec, slices, evidence, and risk review. Do not hide deletion inside an unrelated change.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Developer experience
|
|
2
|
+
|
|
3
|
+
When a change ships a surface another engineer has to *use* (a public API, a CLI, an SDK
|
|
4
|
+
or library, a webhook, a config/env contract, an error message, or the getting-started path
|
|
5
|
+
that introduces all of them) the developer using it is a user, and their experience is part
|
|
6
|
+
of the change. Code that compiles and passes its tests can still strand the next developer at
|
|
7
|
+
a cryptic error, a getting-started snippet that doesn't run, or an endpoint whose shape you
|
|
8
|
+
have to read the source to learn. Un-tested DX is a claim, the same way un-run code is a claim.
|
|
9
|
+
|
|
10
|
+
This rule is the developer-facing counterpart to [`performance.md`](performance.md): perf says
|
|
11
|
+
*measure the speed before you assert it*; this says *measure the experience before you assert
|
|
12
|
+
it*. It pairs with the [`devrites-api-interface`](../../../devrites-api-interface/SKILL.md)
|
|
13
|
+
skill (which shapes the contract). This rule **proves** the shape is usable.
|
|
14
|
+
|
|
15
|
+
## Scope: when this applies
|
|
16
|
+
|
|
17
|
+
Conditional, like [`performance.md`](performance.md) and [`observability.md`](observability.md).
|
|
18
|
+
It applies when the diff changes a **developer-facing surface**:
|
|
19
|
+
|
|
20
|
+
- a public/external **API** endpoint, response shape, or status-code contract;
|
|
21
|
+
- a **CLI** command, flag, output, or exit code;
|
|
22
|
+
- an **SDK / library / package** export, signature, or type;
|
|
23
|
+
- a **webhook**, event payload, or integration contract;
|
|
24
|
+
- a **config / env-var** interface a consumer must set;
|
|
25
|
+
- an **error message, exit code, or failure response** a developer reads to recover;
|
|
26
|
+
- the **getting-started path**. README, install steps, quickstart, the first-run docs.
|
|
27
|
+
|
|
28
|
+
Skip it for pure-internal refactors, private helpers, app-only UI (that's
|
|
29
|
+
[`devrites-frontend-craft`](../../../devrites-frontend-craft/SKILL.md) /
|
|
30
|
+
`devrites-frontend-reviewer`), docs-only typo fixes, and config that no external consumer
|
|
31
|
+
touches. Don't DX-review a change with no developer-facing surface: the same scope discipline
|
|
32
|
+
as the rest of the conditional rules. End-user UX is a different axis; this rule is about the
|
|
33
|
+
*developer* consuming the surface.
|
|
34
|
+
|
|
35
|
+
## The boomerang: predict at plan, measure at prove, reconcile at seal
|
|
36
|
+
|
|
37
|
+
DevRites already runs a predict-then-prove spine (the vetted `test-plan.md` coverage target at
|
|
38
|
+
`/rite-vet`, proven at `/rite-prove`, gated at `/rite-seal`). DX rides the same spine, and the
|
|
39
|
+
gap between the two ends is the signal:
|
|
40
|
+
|
|
41
|
+
1. **Predict:** at `/rite-vet`, when a developer-facing surface is in scope, score the *planned*
|
|
42
|
+
surface against the dimensions below and write a predicted scorecard to `devex.md` (the
|
|
43
|
+
estimate, e.g. "time-to-hello-world: ~3 min"). This is cheap and pre-build; it forces the
|
|
44
|
+
ergonomics question before the contract sets.
|
|
45
|
+
2. **Measure:** at `/rite-prove`, exercise the surface (run the getting-started flow,
|
|
46
|
+
call the endpoint, invoke the CLI, trigger the error) and record the *measured* scorecard with
|
|
47
|
+
evidence: real TTHW, security-redacted exact error text, and a safely captured docs screenshot.
|
|
48
|
+
3. **Reconcile (the boomerang):** at `/rite-seal`, compare predicted against measured. A material
|
|
49
|
+
gap: "the plan said 3 minutes, the getting-started flow took 8 and step 4 errored":
|
|
50
|
+
is a finding, not a rounding error. The estimate was wrong *or* the surface regressed; either
|
|
51
|
+
way the developer using it pays, and the gap is exactly what a single end-state score would hide.
|
|
52
|
+
|
|
53
|
+
The boomerang is what makes DX a measured axis rather than an opinion: the prediction is on
|
|
54
|
+
record, so the measured reality can falsify it.
|
|
55
|
+
|
|
56
|
+
## The scorecard: what to score
|
|
57
|
+
|
|
58
|
+
One entity, one name: call the metric **time-to-hello-world (TTHW)** consistently, not "onboarding
|
|
59
|
+
time" in one place and "setup time" in another. Score these dimensions; only the ones the diff
|
|
60
|
+
touches:
|
|
61
|
+
|
|
62
|
+
- **Discoverability:** can a developer find the entry point without reading the source? Is the
|
|
63
|
+
new surface named, exported, and documented where they'll look?
|
|
64
|
+
- **Time-to-hello-world (TTHW):** wall-clock from "I have the repo/package" to "I got one
|
|
65
|
+
successful call/response/render". The headline number; measure it, don't estimate it at seal.
|
|
66
|
+
- **Getting-started friction:** does the quickstart run *as written*, copy-pasted, on a clean
|
|
67
|
+
checkout? Every undocumented prerequisite, wrong command, or missing step is friction.
|
|
68
|
+
- **Error-message quality:** does a failure say *what* failed, *why*, and *how to recover*, with
|
|
69
|
+
the relevant ids (never secrets: see [`security.md`](security.md))? A bare stack trace, a
|
|
70
|
+
silent exit, or "an error occurred" is a defect on a developer-facing path.
|
|
71
|
+
- **Ergonomics & consistency:** does the surface match the project's existing conventions
|
|
72
|
+
(naming, argument order, pagination, error shape)? An inconsistent new endpoint taxes everyone
|
|
73
|
+
who learned the old ones. Sensible defaults; the common case is one call.
|
|
74
|
+
- **Docs accuracy:** examples are copy-pasteable and correct, the signature in the docs matches
|
|
75
|
+
the code, and changed behavior updated its docs in the same change ([`documentation.md`](documentation.md)).
|
|
76
|
+
|
|
77
|
+
## Measure, don't assert
|
|
78
|
+
|
|
79
|
+
The same discipline as `performance.md` "measure first" and `testing.md` "see it fail first":
|
|
80
|
+
|
|
81
|
+
- **Run it, don't read it.** A scorecard backed by "the code looks fine" is Source mode and says
|
|
82
|
+
so. The graded scorecard comes from invoking the surface (the getting-started flow on
|
|
83
|
+
a clean state, the real CLI `--help`, the real error path) and recording what happened.
|
|
84
|
+
- **Quote the artifact.** Record exact signal-bearing error text with typed security redactions
|
|
85
|
+
(not paraphrase), secret-free command shape, and measured TTHW. For docs, use the
|
|
86
|
+
[browser-proof ladder](../../../devrites-browser-proof/SKILL.md) and describe the screenshot;
|
|
87
|
+
a path alone is not proof.
|
|
88
|
+
- **No measurement → no DX claim**, and usually no finding above Suggestion. "Feels confusing" is
|
|
89
|
+
a hypothesis to test, not a verdict.
|
|
90
|
+
|
|
91
|
+
## The gate: severity by who-pays
|
|
92
|
+
|
|
93
|
+
DX findings carry the standard labels (Critical / Important / Suggestion / Nit / FYI), scaled to
|
|
94
|
+
the cost the consumer bears, not to how polished it feels:
|
|
95
|
+
|
|
96
|
+
- A **public/external contract that ships broken or wrong** (a documented command that errors, an
|
|
97
|
+
endpoint whose response contradicts its contract, a getting-started flow that can't complete) is
|
|
98
|
+
**Important**, and **Critical** when it's a frozen public surface (the principles-gated public-API
|
|
99
|
+
invariant, [`principles.md`](principles.md)) or an irreversible break.
|
|
100
|
+
- A **measured DX regression** against the predicted scorecard with no recorded reason is a
|
|
101
|
+
finding the boomerang surfaces at seal, at least **Important** when it lands on a public surface.
|
|
102
|
+
- An **unactionable error message** on a developer-facing failure path is **Important**: the
|
|
103
|
+
on-call test ([`observability.md`](observability.md)) applied to the consumer instead of the operator.
|
|
104
|
+
- Inconsistent-but-working ergonomics, a thin doc, a missable default → **Suggestion**, unless the
|
|
105
|
+
spec made it acceptance.
|
|
106
|
+
|
|
107
|
+
## The artifact: `devex.md`
|
|
108
|
+
|
|
109
|
+
When a developer-facing surface is in scope, the workspace carries `devex.md`: the **predicted**
|
|
110
|
+
scorecard (from `/rite-vet`), the **measured** scorecard with evidence (from `/rite-prove`), and
|
|
111
|
+
the **boomerang delta** (reconciled at `/rite-seal`). Absent surface → no `devex.md`, and the gate
|
|
112
|
+
passes silently: never block a change for the *absence* of a DX surface, the same no-op discipline
|
|
113
|
+
as the principles and spec-grammar gates.
|
|
114
|
+
|
|
115
|
+
## Scope discipline
|
|
116
|
+
|
|
117
|
+
Review the developer-facing surface the change *touches*. A surface the diff didn't change is not
|
|
118
|
+
this change's job; a project-wide DX audit (every endpoint, the whole CLI) is its own effort:
|
|
119
|
+
record it as a follow-up, don't smuggle it into an unrelated change.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Development workflow
|
|
2
|
+
|
|
3
|
+
Ship small, integrate often, and keep the main branch releasable. Workflow phase order comes from the engine manifest, not this standard.
|
|
4
|
+
|
|
5
|
+
## Work in small batches
|
|
6
|
+
- Break work into thin, independently shippable slices and integrate them frequently:
|
|
7
|
+
ideally merging to the main branch at least once a day.
|
|
8
|
+
|
|
9
|
+
## Short-lived branches, trunk always green
|
|
10
|
+
- Prefer short-lived branches off the main branch.
|
|
11
|
+
- The main branch is **always in a releasable state**. Validate every change through a
|
|
12
|
+
**fast, reliable CI pipeline** (tests + build) before it merges.
|
|
13
|
+
- **Trunk broken?** Revert first (default repair); fix forward only when revert is harder. Red trunk blocks all merges.
|
|
14
|
+
- Hide incomplete work behind a **feature flag / toggle** rather than a long branch, so
|
|
15
|
+
partial work can land without blocking releases or breaking the trunk.
|
|
16
|
+
|
|
17
|
+
## Feature-flag lifecycle
|
|
18
|
+
|
|
19
|
+
- Name the **removal trigger** at flag creation; delete the flag once the work ships — a
|
|
20
|
+
flag past its trigger is **flag debt**, a review finding. Prove **both states**
|
|
21
|
+
([`testing.md`](testing.md)); widen rollout only with the rollback path recorded
|
|
22
|
+
([`data-integrity.md`](data-integrity.md)).
|
|
23
|
+
|
|
24
|
+
## Review gate
|
|
25
|
+
- A human reviews every change before merge; `code-review.md` owns review scope and evidence.
|
|
26
|
+
|
|
27
|
+
## Definition of done
|
|
28
|
+
|
|
29
|
+
[`definition-of-done.md`](definition-of-done.md) owns the standing bar. Acceptance criteria prove the slice-specific behavior; the Definition of Done proves the change is shippable.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Documentation
|
|
2
|
+
|
|
3
|
+
Document intent/decisions; public inputs, outputs, errors, and gotchas; non-obvious
|
|
4
|
+
constraints; and real build/test/run commands. Update with behavior; prefer one runnable
|
|
5
|
+
example. Do not restate code or types.
|
|
6
|
+
|
|
7
|
+
## Drift check (docs describe what runs)
|
|
8
|
+
|
|
9
|
+
A documented command/example that no longer runs is a **documentation-drift finding** at
|
|
10
|
+
review/polish: run it — failure plus output is the evidence. A behavior change updates the
|
|
11
|
+
doc or records the divergence; doc and code never hold contradictory "truths".
|
|
12
|
+
|
|
13
|
+
## Record decisions
|
|
14
|
+
|
|
15
|
+
- Capture significant context, decision, consequences, accepted trade-off, change trigger,
|
|
16
|
+
and why viable alternatives lost. DevRites uses `decisions.md` for feature decisions.
|
|
17
|
+
- ADRs move `PROPOSED → ACCEPTED → SUPERSEDED / DEPRECATED`. Preserve accepted history;
|
|
18
|
+
a replacement ADR cites and supersedes the old one rather than rewriting it.
|
|
19
|
+
|
|
20
|
+
## Promote durable guidance
|
|
21
|
+
|
|
22
|
+
Promotion is maintenance of an existing authority, not a new memory system.
|
|
23
|
+
|
|
24
|
+
1. **Trigger:** the same reviewed correction appears in at least two distinct features, or
|
|
25
|
+
one explicit product/architecture decision has durable rationale. A one-off, generic,
|
|
26
|
+
stale, or merely inferred observation does not trigger promotion.
|
|
27
|
+
2. **Ground:** verify each current claim against live authoritative repository sources.
|
|
28
|
+
Report the source and currentness signal. Unverifiable means `unknown`, not false.
|
|
29
|
+
3. **Scope:** state when the guidance applies and does not apply. Reject a candidate whose
|
|
30
|
+
observable trigger cannot be named. If final code/tests/docs already recover the
|
|
31
|
+
reasoning, reject or consolidate the lesson; promote only the missing durable constraint.
|
|
32
|
+
**Failing case:** a regression test already explains input rejection, yet a second
|
|
33
|
+
generic "validate input" rule is added with no lost reasoning identified.
|
|
34
|
+
4. **Own and expose:** choose one existing canonical owner (`AGENTS.md`/`CLAUDE.md`, a scoped
|
|
35
|
+
standard, or an ADR) and name the phases, agents, or contributors that discover it and
|
|
36
|
+
how (direct read, index link, or existing on-demand route).
|
|
37
|
+
5. **Reconcile:** search current guidance for duplicates, contradictions, and supersession.
|
|
38
|
+
Update, narrow, replace, or retire contradicted guidance at its owner; do not append a
|
|
39
|
+
competing rule. Record the conflict/retirement disposition.
|
|
40
|
+
6. **Approve:** show evidence and the exact durable edit before writing; user approval is
|
|
41
|
+
required. Never create a learning ledger, index, queue, score, or parallel authority.
|
|
42
|
+
|
|
43
|
+
Long reference material stays behind its existing on-demand route.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Edge-case trace
|
|
2
|
+
|
|
3
|
+
Use this when requirements, plans, diffs, or proof change a boundary, branch,
|
|
4
|
+
validation rule, deletion contract, retryable action, or claim that a path is safe.
|
|
5
|
+
The trace finds relevant cases, records why irrelevant ones were dismissed, and prevents
|
|
6
|
+
confidence from turning an untested negative claim into a pass.
|
|
7
|
+
|
|
8
|
+
## Scope before enumeration
|
|
9
|
+
|
|
10
|
+
Name the observable surface, caller/actor, state or data it owns, external boundaries,
|
|
11
|
+
and the must-NOT outcome the author would reject even if the happy path worked. Do not
|
|
12
|
+
expand into a whole-system checklist: a class applies only when the changed surface can
|
|
13
|
+
reach it.
|
|
14
|
+
|
|
15
|
+
## Closed probe classes
|
|
16
|
+
|
|
17
|
+
Probe each relevant class once:
|
|
18
|
+
|
|
19
|
+
| Class | Questions |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| Boundary | Empty/missing, minimum/maximum, off-by-one, oversized, invalid encoding/shape. |
|
|
22
|
+
| State | Initial, repeated, stale, terminal, illegal transition, interruption and resume. |
|
|
23
|
+
| Ordering | Duplicate, out-of-order, retry, partial completion, clock/time-zone boundary. |
|
|
24
|
+
| Concurrency | Competing writer, lost update, cancellation, race, deadlock or resource exhaustion. |
|
|
25
|
+
| Authority | Unauthenticated, unauthorized, wrong tenant, forged identity, privilege increase. |
|
|
26
|
+
| Dependency | Timeout, partial/invalid response, rate limit, outage, version/config mismatch. |
|
|
27
|
+
| Persistence | Transaction split, crash, migration/backfill restart, rollback, retention/deletion. |
|
|
28
|
+
| Compatibility | Old/new reader or writer, caller not updated, feature-flag off/on, environment difference. |
|
|
29
|
+
| Wiring | Code exists but is not registered, called, awaited, persisted, emitted, or consumed with real data. |
|
|
30
|
+
| Removal | Deleted behavior, caller, data, telemetry, docs, or fallback has no surviving owner. |
|
|
31
|
+
|
|
32
|
+
Route detailed applicable cases to
|
|
33
|
+
[`repository-topology.md`](repository-topology.md),
|
|
34
|
+
[`data-integrity.md`](data-integrity.md),
|
|
35
|
+
[`integration-reliability.md`](integration-reliability.md), or
|
|
36
|
+
[`security.md`](security.md); do not repeat those standards here.
|
|
37
|
+
|
|
38
|
+
## Trace procedure
|
|
39
|
+
|
|
40
|
+
1. **Walk explicit paths.** Follow every changed condition, loop exit, error, and
|
|
41
|
+
boundary value to the nearest observable outcome.
|
|
42
|
+
2. **Walk fixed-set siblings.** A special case for one enum/status/role/mode implies
|
|
43
|
+
every untouched sibling is a path to check.
|
|
44
|
+
3. **Follow real wiring.** Verify existence, substance, registration/call path, and
|
|
45
|
+
real data flow. A complete-looking implementation can still be hollow, orphaned,
|
|
46
|
+
or a stub.
|
|
47
|
+
4. **Check negative intent.** Ask what silently permitted outcome would violate a
|
|
48
|
+
requirement, invariant, non-goal, or security boundary. Add a prohibition only
|
|
49
|
+
when bespoke intent is not already owned by a standard.
|
|
50
|
+
5. **Check removal.** Name the contract removed code carried and its surviving owner,
|
|
51
|
+
or cite the accepted decision that retires it.
|
|
52
|
+
|
|
53
|
+
## Disposition and evidence
|
|
54
|
+
|
|
55
|
+
Every applicable case receives one status:
|
|
56
|
+
|
|
57
|
+
- `covered`: mapped to a REQ/AC and positive discriminating test or observed runtime proof;
|
|
58
|
+
- `backstop`: an independent held-out, property/metamorphic, or direct behavioral check
|
|
59
|
+
names the wrong outcome it would detect — and is **exogenous**: not produced or
|
|
60
|
+
executed by the same code path it validates (a check the changed code also controls is
|
|
61
|
+
`covered` evidence, not a backstop);
|
|
62
|
+
- `dismissed`: unreachable or irrelevant with a concrete reason and supporting evidence;
|
|
63
|
+
- `unresolved`: a material case lacks a fact or proof surface and blocks the owning gate.
|
|
64
|
+
|
|
65
|
+
Judgment may dismiss a demonstrably irrelevant case; it cannot prove behavior. When a
|
|
66
|
+
case is not inferable from available evidence, say `unresolved`/`cannot_verify` rather
|
|
67
|
+
than estimating confidence upward.
|
|
68
|
+
|
|
69
|
+
## Backstop honesty (fail-closed)
|
|
70
|
+
|
|
71
|
+
A row marked `covered` or `backstop` **must** name an evidence class: test path,
|
|
72
|
+
command output, observed runtime, or an independent held-out/property check. A row
|
|
73
|
+
with disposition but **no** evidence class is **`cannot_verify`** at Prove/Seal — not
|
|
74
|
+
a pass.
|
|
75
|
+
|
|
76
|
+
**Failing case:** the happy-path suite is green, the trace lists "error path handled"
|
|
77
|
+
with no test or runtime proof → Prove blocks until the row gains a discriminating
|
|
78
|
+
surface or moves to `unresolved`.
|
|
79
|
+
|
|
80
|
+
## Outputs
|
|
81
|
+
|
|
82
|
+
Spec records relevant cases in **Edge Coverage** and bespoke negative intent in
|
|
83
|
+
**Prohibitions**. Plan/Vet maps applicable cases to a slice, recovery, and proof. Review
|
|
84
|
+
reports only reachable gaps:
|
|
85
|
+
|
|
86
|
+
```md
|
|
87
|
+
Finding: <severity> | path:line | <trigger> reaches <unhandled outcome> | <observable harm> |
|
|
88
|
+
<minimal handling>; missing proof: <test/signal>.
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Use the caller's severity scale. Do not create a separate edge score, pad rows with
|
|
92
|
+
irrelevant classes, or report a case already handled and proven.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Elicitation: a move-set for the thinking phases
|
|
2
|
+
|
|
3
|
+
The thinking phases (`/rite-temper` on the spec, `/rite-vet` on the plan) default to one shape each.
|
|
4
|
+
A pre-mortem, a plan review. That's a floor, not a ceiling. When a section needs deeper thought,
|
|
5
|
+
this is the menu you reach into: named reasoning techniques, each with the shape it produces, so
|
|
6
|
+
"make this stronger" becomes a concrete move instead of a vibe.
|
|
7
|
+
|
|
8
|
+
## How to use it (progressive: no ceremony by default)
|
|
9
|
+
1. Look at the **one section** in front of you (a requirement, a risk, an estimate, a boundary).
|
|
10
|
+
2. Read its **risk**, then pull the 3-5 techniques below whose *When to reach for it* matches.
|
|
11
|
+
3. Present them as a short numbered menu; the human picks one (or `skip`).
|
|
12
|
+
4. Run that technique on that section, apply the result, move on.
|
|
13
|
+
5. **No-yield exit:** when the technique surfaces nothing that changes the section — no
|
|
14
|
+
new requirement, mitigation, estimate change, or blocking question — record
|
|
15
|
+
`elicitation: <technique> — no yield` in the phase artifact and stop offering menus
|
|
16
|
+
for that section. **Failing case:** repeated technique menus on a settled section are
|
|
17
|
+
ceremony, not diligence; a second menu without new section input is a process defect.
|
|
18
|
+
|
|
19
|
+
Selection is by the section's risk, not taste. Reach for the row that fits:
|
|
20
|
+
|
|
21
|
+
| The section is… | Reach for |
|
|
22
|
+
|---|---|
|
|
23
|
+
| an irreversible / boundary / auth / data-model decision | Red-Team vs Blue-Team · Assumption Audit · Pre-Mortem |
|
|
24
|
+
| a vague or contested requirement | Steelman-then-Attack · Devil's Advocate · Five Whys |
|
|
25
|
+
| an estimate, sizing, or a "how long / how risky" | Delphi · Reference-Class Forecast |
|
|
26
|
+
| a design with more than one plausible shape | Tournament (A vs B) · Inversion · Analogy Mapping |
|
|
27
|
+
| a spec that feels *too* big or *too* small | Scope Extremes (MVP vs Gold-plate) · YAGNI Pass |
|
|
28
|
+
| a risk surface you suspect is under-explored | Chaos Scenarios · Edge-Case Hunt · Second-Order Effects |
|
|
29
|
+
|
|
30
|
+
## The techniques
|
|
31
|
+
|
|
32
|
+
Each entry is **name (when to reach for it) the shape it produces** (`→` reads "then").
|
|
33
|
+
|
|
34
|
+
### Sharpening a claim
|
|
35
|
+
- **Steelman-then-Attack:** a requirement or approach you're inclined to accept. Build the
|
|
36
|
+
*strongest* case for it → then attack that strongest form. Survives → keep; falls → revise.
|
|
37
|
+
- **Devil's Advocate:** consensus formed too fast. One voice argues the opposite in good faith →
|
|
38
|
+
surface the objection the room skipped.
|
|
39
|
+
- **Assumption Audit:** a plan resting on unstated beliefs. List every assumption the section
|
|
40
|
+
makes → mark each *load-bearing / verified / unverified* → the unverified load-bearing ones are
|
|
41
|
+
the work.
|
|
42
|
+
- **Five Whys:** a stated requirement whose *reason* is fuzzy. Ask "why" five times down from the
|
|
43
|
+
ask → reach the root need (often narrower or different than the surface ask).
|
|
44
|
+
|
|
45
|
+
### Stress-testing a decision
|
|
46
|
+
- **Pre-Mortem:** before committing an irreversible choice. Assume it's six months later and this
|
|
47
|
+
failed → write the failure story → each cause becomes a mitigation or a blocking question. (This
|
|
48
|
+
is `/rite-temper`'s default; the others deepen it.)
|
|
49
|
+
- **Red-Team vs Blue-Team:** a security, trust-boundary, or adversarial-input surface.
|
|
50
|
+
`defense → attack → hardening`: state the defense, attack it as a hostile party, harden the gap.
|
|
51
|
+
- **Inversion:** "how do we make X good?" stalls. Ask instead "how would we *guarantee X fails*?"
|
|
52
|
+
→ invert each failure into a requirement.
|
|
53
|
+
- **Second-Order Effects:** a change that touches shared surface. For each first-order effect ask
|
|
54
|
+
"and then what?" twice → surface the downstream consequence the diff hides.
|
|
55
|
+
|
|
56
|
+
### Sizing and estimating
|
|
57
|
+
- **Delphi:** an estimate one person is anchoring. Gather independent estimates *without* seeing
|
|
58
|
+
each other → reveal → discuss the spread → re-estimate → converge. Kills anchoring.
|
|
59
|
+
- **Reference-Class Forecast:** "this'll be quick." Find 3 past changes of the same *class* → use
|
|
60
|
+
their actual cost as the base rate, not the inside view.
|
|
61
|
+
|
|
62
|
+
### Widening the option space
|
|
63
|
+
- **Tournament (A vs B):** two plausible designs. Put them head-to-head on the *decision hinge*
|
|
64
|
+
(the one axis that differs) → pick on that axis, not on a feature checklist.
|
|
65
|
+
- **Analogy Mapping:** a novel problem. "What is this *like* that's already solved?" → borrow the
|
|
66
|
+
solved structure, note where the analogy breaks.
|
|
67
|
+
- **Scope Extremes:** a spec of uncertain size. Describe the *MVP* (smallest thing that ships
|
|
68
|
+
value) and the *gold-plated* version → the right scope is usually named by the gap between them.
|
|
69
|
+
- **YAGNI Pass:** a plan carrying "might need it later." For each speculative piece, demand a
|
|
70
|
+
*current* acceptance criterion → no criterion, cut it to a follow-up.
|
|
71
|
+
|
|
72
|
+
### Finding what's missing
|
|
73
|
+
- **Edge-Case Hunt:** a happy-path-shaped spec. Walk empty / boundary / invalid / concurrent /
|
|
74
|
+
huge-or-weird input for each element → each uncovered case is a missing criterion.
|
|
75
|
+
- **Chaos Scenarios:** a system with external dependencies. "What if the DB is down / the API
|
|
76
|
+
times out / the clock jumps / the input is hostile?" → each becomes a failure-mode requirement.
|
|
77
|
+
- **Completeness Critic:** end of a section. Ask only "what's *missing*: a modality not covered, a
|
|
78
|
+
claim not verified, a flow with no path?" → the answer is the next round of work.
|
|
79
|
+
|
|
80
|
+
## The one rule
|
|
81
|
+
Run the technique on the **section in front of you**, not the whole document: a move applied to
|
|
82
|
+
everything is a move applied to nothing. Record what it changed in the phase artifact (a new
|
|
83
|
+
requirement, a mitigation, a blocking question), not just that you ran it.
|
|
84
|
+
|
|
85
|
+
A project can append its own house techniques to this file: same entry shape — **name (when to reach for it)** → the shape it produces.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Error handling
|
|
2
|
+
|
|
3
|
+
Errors are part of the contract, not an afterthought. Make failure loud, local, and
|
|
4
|
+
recoverable.
|
|
5
|
+
|
|
6
|
+
## Fail fast
|
|
7
|
+
- Validate preconditions at the top; stop the moment state is invalid, close to the root
|
|
8
|
+
cause. Don't let bad data propagate and surface as a confusing failure three layers
|
|
9
|
+
later.
|
|
10
|
+
|
|
11
|
+
## No silent catches
|
|
12
|
+
- Never swallow an error to make a problem "go away", that hides bugs and corrupts
|
|
13
|
+
state silently.
|
|
14
|
+
- Catch the **narrowest** error you can handle, not a blanket catch-all. A
|
|
15
|
+
bare/broad catch masks unrelated failures.
|
|
16
|
+
- If you catch, either recover meaningfully, or rethrow/wrap with added context. Don't
|
|
17
|
+
log-and-continue past an error you didn't handle.
|
|
18
|
+
|
|
19
|
+
## Classify the outcome before retrying
|
|
20
|
+
|
|
21
|
+
Never retry blind — match the outcome first:
|
|
22
|
+
|
|
23
|
+
- **Rejected** (refused: validation/authz/conflict): fix input; unchanged retry fails again.
|
|
24
|
+
- **Unknown** (timed out mid-call): check state at the source before any retry.
|
|
25
|
+
- **Partial** (half-committed): [`data-integrity.md`](data-integrity.md) (see `Writes, retries, and concurrency`) — reconcile or roll back, never resume blind.
|
|
26
|
+
- **Clean failure** (not started / fully rolled back): safe to retry after fixing the cause.
|
|
27
|
+
|
|
28
|
+
**Failing case:** an **Unknown** outcome retried unchanged double-applies (duplicate charge). Idempotency: [`data-integrity.md`](data-integrity.md); outcome taxonomies: [`integration-reliability.md`](integration-reliability.md). Not provable → `cannot_verify` and stop.
|
|
29
|
+
|
|
30
|
+
## Meaningful messages
|
|
31
|
+
- Error messages state what failed, the relevant context (ids, inputs, not secrets),
|
|
32
|
+
and ideally how to recover. Cryptic messages cost hours.
|
|
33
|
+
- Distinguish *expected* failures (validation, not-found) from *unexpected* (bugs);
|
|
34
|
+
handle the first as flow, surface the second.
|
|
35
|
+
- Structured error surfaces carry one consistent envelope — **severity, stable code,
|
|
36
|
+
human message, fix** — so callers and logs can act programmatically; a bare string that
|
|
37
|
+
forces callers to parse prose is a contract gap.
|
|
38
|
+
|
|
39
|
+
## Fail closed (security-relevant paths)
|
|
40
|
+
- On error in an auth/permission/transaction path, **deny and roll back**: never
|
|
41
|
+
default to granting access or committing partial state.
|
|
42
|
+
|
|
43
|
+
## Logging
|
|
44
|
+
- Log key events (failures, access violations, validation errors) with enough context to
|
|
45
|
+
debug. Prefer structured logs (key/value or JSON).
|
|
46
|
+
- **Never log secrets, credentials, tokens, or personal data.** Show users a clear,
|
|
47
|
+
non-revealing message; keep the detail in the logs for the team.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Git workflow
|
|
2
|
+
|
|
3
|
+
History is documentation. Keep it clean, atomic, and readable.
|
|
4
|
+
|
|
5
|
+
## Conventional Commits
|
|
6
|
+
Format: `type(scope): subject`
|
|
7
|
+
- **type**: `feat fix docs style refactor perf test build ci chore revert` (lower-case).
|
|
8
|
+
- **scope**: the area changed (lower-case).
|
|
9
|
+
- **subject**: imperative mood, no leading capital, no trailing period
|
|
10
|
+
("add export endpoint", not "Added export endpoint.").
|
|
11
|
+
- Keep the header short (~50, hard cap ~72). Put the *why* in the body, wrapped, after a
|
|
12
|
+
blank line. Reference issues in the footer.
|
|
13
|
+
|
|
14
|
+
## Atomic commits
|
|
15
|
+
- One logical change per commit; it should build and pass tests on its own.
|
|
16
|
+
- Don't mix refactor + behavior change in one commit: split them so each is reviewable
|
|
17
|
+
and revertible.
|
|
18
|
+
|
|
19
|
+
## Small, focused branches/PRs
|
|
20
|
+
- One concern per branch. Short-lived; rebase/merge per the project's convention.
|
|
21
|
+
- Keep PRs small (see `code-review.md`) so they get a real review.
|
|
22
|
+
|
|
23
|
+
## Change summary: prove the scope
|
|
24
|
+
When you hand back a change, state what you deliberately left alone as well as what you touched.
|
|
25
|
+
A **"Things I didn't touch (intentionally)"** line (the adjacent smells you noticed and declined
|
|
26
|
+
to fix) proves the diff is feature-scoped ([`core.md`](core.md) rule 7) and matches
|
|
27
|
+
`touched-files.md`, rather than an unsolicited renovation the reviewer has to untangle from the
|
|
28
|
+
real change. Noticed-but-not-fixed becomes an FYI follow-up, never a silent addition to this diff.
|
|
29
|
+
|
|
30
|
+
## Merge conflict recovery
|
|
31
|
+
When git is mid-merge or mid-rebase, recover before other workflow work:
|
|
32
|
+
|
|
33
|
+
1. Inspect state: `git status --short --branch`, then note whether this is a merge or rebase.
|
|
34
|
+
2. For each conflicted file, identify **our intent** and **their intent** before editing.
|
|
35
|
+
3. Resolve each hunk by preserving both intents when possible; if intents conflict, pick one and
|
|
36
|
+
record the trade-off in the commit/PR body.
|
|
37
|
+
4. `git add` the resolved files, then run the smallest relevant checks.
|
|
38
|
+
5. Finish with `git merge --continue` or `git rebase --continue`; abort only when the chosen
|
|
39
|
+
branch direction is wrong, not because a hunk is annoying.
|
|
40
|
+
|
|
41
|
+
## Versioning & changelog
|
|
42
|
+
- Semver describes what consumers may rely on. Treat an observable breaking change as major.
|
|
43
|
+
- Derive the version from the tag; do not maintain competing manual copies.
|
|
44
|
+
- Curate changelog entries by user impact in the change that earns them; a changelog is not a git log.
|
|
45
|
+
|
|
46
|
+
## Never commit
|
|
47
|
+
- Secrets, credentials, tokens, or `.env` files. If one lands in history, rotate it and
|
|
48
|
+
scrub it: deleting the file in a later commit is not enough.
|
|
49
|
+
- Generated artifacts, dependencies, or large binaries that belong in ignore rules.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Automation hooks
|
|
2
|
+
|
|
3
|
+
Automate easy-to-forget checks at the earliest affordable stage. Keep local hooks fast
|
|
4
|
+
and scoped so developers continue to run them.
|
|
5
|
+
|
|
6
|
+
## Stage the work by cost (the 10-second rule)
|
|
7
|
+
- **pre-commit** (must finish in well under ~10s): format, lint, and secret-scan the
|
|
8
|
+
exact **staged index blobs only** via `devrites-engine secret-scan --staged`.
|
|
9
|
+
- **commit-msg**: enforce the commit convention (e.g. Conventional Commits). DevRites
|
|
10
|
+
ships a `commit-msg` hook for its own repo as the reference example.
|
|
11
|
+
- **pre-push** (seconds to a couple of minutes): broader/affected tests.
|
|
12
|
+
- **CI** (no time pressure): the full test suite, build, integration, and deeper
|
|
13
|
+
security scans. CI is the source of truth for "green", not local hooks.
|
|
14
|
+
|
|
15
|
+
## Secret scanning
|
|
16
|
+
Scan for credentials/keys/tokens before they enter history: catching a secret
|
|
17
|
+
pre-commit is cheap; rotation is not. Findings disclose metadata only; `/rite-ship`
|
|
18
|
+
owns fail-closed PR-body transport.
|
|
19
|
+
|
|
20
|
+
## Adoption & escape hatches
|
|
21
|
+
- Introduce hooks gradually (formatting → linting → security → tests) so the team
|
|
22
|
+
adopts them instead of disabling them.
|
|
23
|
+
- Bypassing a hook (`--no-verify`) is for genuine emergencies, not routine. CI must
|
|
24
|
+
re-check what a bypass skipped, so a skipped local check can't reach the trunk.
|
|
25
|
+
- Hooks are checked into the repo and shared, so the whole team gets the same gates.
|
package/pack/generated/devin/skills/devrites-lib/reference/standards/integration-reliability.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Integration reliability
|
|
2
|
+
|
|
3
|
+
Load this for third-party APIs, webhooks, queues, background jobs, caches, or
|
|
4
|
+
cross-service calls. The boundary contract includes failure, timing, duplication, and
|
|
5
|
+
recovery—not only the success payload.
|
|
6
|
+
|
|
7
|
+
## Contract the boundary
|
|
8
|
+
|
|
9
|
+
Name the provider and consumer, version, authentication, request/response or event
|
|
10
|
+
schema, optional and unknown fields, ordering guarantee, rate limit, timeout budget,
|
|
11
|
+
retry responsibility, idempotency key, and user-visible degradation. Validate an
|
|
12
|
+
external response as hostile input before trusted code consumes it.
|
|
13
|
+
|
|
14
|
+
**Uploads and paginated collections are boundary contracts, not transport details.** An
|
|
15
|
+
upload names body and expanded-size caps, chunk/resume behavior, partial-upload
|
|
16
|
+
reconciliation, and the rejection path for oversized or malformed payloads. A paginated
|
|
17
|
+
collection names cursor/offset semantics, page-size cap, the terminal “no more pages”
|
|
18
|
+
signal, and how rows written during paging surface — skipped or duplicated rows are
|
|
19
|
+
contract data, not surprises. **Failing case:** a client pages by offset while rows
|
|
20
|
+
insert ahead of it and silently misses records; a boundary contract that cannot name
|
|
21
|
+
this behavior fails Vet.
|
|
22
|
+
|
|
23
|
+
For every call or delivery, classify the observed outcome:
|
|
24
|
+
|
|
25
|
+
| Outcome | Required behavior |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| Success | Validate the complete required shape; tolerate documented additive fields. |
|
|
28
|
+
| Invalid or partial response | Reject or use an explicitly safe degraded path; never manufacture required data. |
|
|
29
|
+
| Authentication/expired credential | Stop retries that cannot succeed, surface ownership, and reveal no credential. |
|
|
30
|
+
| Rate limit/overload | Honor provider guidance when trustworthy, bound backoff, and expose delayed/degraded status. |
|
|
31
|
+
| Timeout/network partition | Treat effect as unknown unless the protocol proves otherwise; reconcile before retrying a non-idempotent action. |
|
|
32
|
+
| Provider outage/version change | Open the circuit or shed load when the project supports it; retain a bounded recovery path and compatibility signal. |
|
|
33
|
+
|
|
34
|
+
## Retry and delivery rules
|
|
35
|
+
|
|
36
|
+
- Retry only a named transient failure and only when the operation is idempotent or has
|
|
37
|
+
a durable deduplication key. Bound attempts, elapsed time, and exponential backoff;
|
|
38
|
+
add jitter when many workers could synchronize.
|
|
39
|
+
- Assign one retry owner across SDK, worker and queue, or explicitly share one
|
|
40
|
+
end-to-end attempt/deadline budget that redelivery cannot reset. Prove exhaustion
|
|
41
|
+
by counting physical downstream calls, including inner retries, and advancing a
|
|
42
|
+
controlled/injected clock to the deadline. Assert exhaustion, not wall-clock
|
|
43
|
+
duration ([testing.md](testing.md#determinism-no-flaky-tests)); elapsed-time logs
|
|
44
|
+
are observations, never timing assertions in tests.
|
|
45
|
+
**Failing case:** each of three layers permits four attempts, producing 64 calls;
|
|
46
|
+
three passing local retry tests do not prove the operation's budget. Budget
|
|
47
|
+
overrun blocks proof and Seal until retry ownership or shared accounting is fixed.
|
|
48
|
+
- A timeout is not proof the provider did nothing. Query by idempotency key/status or
|
|
49
|
+
reconcile before creating a second effect.
|
|
50
|
+
- Webhook/queue consumers acknowledge only after durable success or durable handoff.
|
|
51
|
+
Duplicate delivery, duplicate jobs, and out-of-order delivery are normal inputs:
|
|
52
|
+
deduplicate durably and reject, buffer, or reconcile stale sequence/version values by contract.
|
|
53
|
+
**Failing case:** the handler acks before the durable write; a duplicate delivery
|
|
54
|
+
creates a second effect.
|
|
55
|
+
- A poison message must not block the partition forever. Bound redelivery, retain the
|
|
56
|
+
failure reason without secrets, move to the project's quarantine/dead-letter path,
|
|
57
|
+
and define replay after correction.
|
|
58
|
+
- A queue emits observability signals — backlog depth, poison/quarantine count,
|
|
59
|
+
reconciliation lag, saturation, ownership — with [`observability.md`](observability.md)
|
|
60
|
+
as the signal-taxonomy owner. A queue backlog still needs an accepted
|
|
61
|
+
capacity/drain/recovery action; auto-scaling without downstream capacity protection
|
|
62
|
+
only moves the outage.
|
|
63
|
+
|
|
64
|
+
## Partial failure and recovery
|
|
65
|
+
|
|
66
|
+
Map each multi-step effect as `not started | committed | unknown | compensating |
|
|
67
|
+
reconciled`. If one system commits and another fails, name the durable record that
|
|
68
|
+
drives retry or compensation. Do not catch/log/continue into a false success.
|
|
69
|
+
|
|
70
|
+
For synchronous versus asynchronous design, apply [`patterns.md`](patterns.md); async
|
|
71
|
+
processing changes the contract to accepted/pending/failed/retryable; it does not make the
|
|
72
|
+
failure disappear.
|
|
73
|
+
|
|
74
|
+
## Cache and partition behavior
|
|
75
|
+
|
|
76
|
+
- Define source of truth, key scope (including tenant), invalidation trigger, TTL, and
|
|
77
|
+
acceptable staleness. Cache deletion failure and stale reads need an observed path.
|
|
78
|
+
- Never use cache presence as authorization. On partition or cache outage, choose an
|
|
79
|
+
explicit fail-open or fail-closed behavior based on the protected invariant.
|
|
80
|
+
- After reconnect, reconcile version/order rather than assuming arrival order equals
|
|
81
|
+
commit order.
|
|
82
|
+
|
|
83
|
+
## Required plan and proof
|
|
84
|
+
|
|
85
|
+
For each boundary, `plan.md` records:
|
|
86
|
+
|
|
87
|
+
| Boundary | Timeout/retry/idempotency | Duplicate/order/partial handling | Degradation/recovery | Observability | Proof |
|
|
88
|
+
| --- | --- | --- | --- | --- | --- |
|
|
89
|
+
| `<provider → consumer>` | `<budgets/key>` | `<rules>` | `<user/system path>` | `<signals/owner>` | `<test/rehearsal>` |
|
|
90
|
+
|
|
91
|
+
Proof drives success, invalid shape, partial response, auth failure, rate limit, timeout,
|
|
92
|
+
duplicate, out-of-order delivery, and outage when relevant. Deterministic cases use a
|
|
93
|
+
contract-capable fake or sandbox per [`testing.md`](testing.md) — never a mock that
|
|
94
|
+
simply returns the expected payload (that tests the stub, not the boundary) — plus at
|
|
95
|
+
least one real boundary check when authorized and safe.
|
|
96
|
+
|
|
97
|
+
## Stop conditions
|
|
98
|
+
|
|
99
|
+
Stop planning or Seal when a non-idempotent unknown outcome can be blindly retried, a
|
|
100
|
+
consumer can acknowledge before durable handling, a poison/backlog path has no owner, a
|
|
101
|
+
partial response can become success silently, or outage recovery and monitoring are
|
|
102
|
+
missing. Unavailable provider evidence is `cannot_verify`, not a pass.
|