Repository navigation
feat(riviere-extract-conventions): add default extraction config with decorator detection rules - #60
Conversation
📝 WalkthroughWalkthroughAdds a default extraction configuration with docs, utilities, and tests for riviere-extract-conventions, and updates Claude agent task/PR workflows and commands to fetch inline issue data and expand autonomous lifecycle steps. (50 words) Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related issues
Possibly related PRs
Poem
Pre-merge checks and finishing touches✅ Passed checks (2 passed)
✨ Finishing touches
Comment |
Deploying living-architecture with
|
| Latest commit: |
daa3734
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://87f56552.living-architecture.pages.dev |
| Branch Preview URL: | https://issue-37-m2-d2-2-create-defa.living-architecture.pages.dev |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Fix all issues with AI Agents
In @docs/workflow/task-workflow.md:
- Line 9: Fix the typo in the docs line that reads "*CRUCIAL*: Do not stop to
ask the user for permissiom to do steps you are empowered to do autonomously." —
replace "permissiom" with "permission" so the sentence reads "*CRUCIAL*: Do not
stop to ask the user for permission to do steps you are empowered to do
autonomously." Ensure only that single word is corrected and run a quick
spellcheck for similar typos in nearby sentences.
In @packages/riviere-extract-config/CLAUDE.md:
- Around line 13-54: Reword the sentence starting with "The extractor will find
the decorated classes (implementation detail), but the config describes what the
user wants extracted (methods)." to a more standard, grammatical phrasing—e.g.
make it active and clearer like "The extractor will locate the decorated classes
as an implementation detail, while the config specifies the components the user
wants extracted (methods)." Update that sentence in CLAUDE.md to improve
readability and flow.
In @packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts:
- Around line 7-22: Add a happy-path unit test for getFirstModule that builds a
valid config object with a non-empty modules array, (optionally) spy on
validation.isValidExtractionConfig to return true, call
getFirstModule(validConfig) and assert it returns the first module object
(strict equality or deep equality) so the successful return path is covered.
In @packages/riviere-extract-conventions/src/default-config-fixtures.ts:
- Around line 8-12: The code uses the CommonJS __dirname inside
loadDefaultConfig, which breaks in ESM; replace __dirname with an ESM-safe
dirname computed from import.meta.url (e.g., const __dirname = fileURLToPath(new
URL('.', import.meta.url)) using fileURLToPath from 'url') and then build
configPath with join(__dirname, 'default-extraction.config.json') before calling
readFileSync/JSON.parse in loadDefaultConfig.
In @packages/riviere-extract-conventions/src/default-config.spec.ts:
- Around line 73-79: The test in default-config.spec.ts currently uses
expect.arrayContaining which allows extra keys; update the assertion around
loadDefaultConfig() / getFirstModule(config) so it verifies an exact match to
the six required component types (api, useCase, domainOp, event, eventHandler,
ui) — either assert the keys equal the expected array (order-insensitive by
sorting) or keep arrayContaining and also assert Object.keys(module).length ===
requiredKeys.length to ensure no extras.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (11)
.claude/agents/code-review.md.claude/commands/complete-task.mddocs/workflow/task-workflow.mdpackages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-extraction.config.jsonpackages/riviere-extract-conventions/tsconfig.lib.json
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx}: Always followdocs/conventions/software-design.mdwhen writing, editing, refactoring, or reviewing code
Look for standard implementation patterns defined indocs/conventions/standard-patterns.md
Avoid anti-patterns documented in@docs/conventions/anti-patterns.md
Use domain terminology fromdocs/architecture/domain-terminology/contextive/definitions.glossary.ymland do not invent new terms or use technical jargon when domain terminology exists
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
packages/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Shared libraries in
packages/directory must be publishable to npm and must follow the monorepo naming convention with@living-architecture/namespace
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
**/*.{ts,tsx,jsx,js}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx,jsx,js}: All code must followdocs/conventions/codebase-structure.md
Do not log sensitive data (passwords, tokens, PII)
Validate and sanitize all external input
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
**/*.{ts,tsx,jsx,js,css,scss}
📄 CodeRabbit inference engine (CLAUDE.md)
All UI and UX design must conform to global brand guidelines in
/docs/brand/(logo, colors, typography, icons)
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
**/*.{ts,tsx,jsx,js,json,yaml,yml,env,config.js}
📄 CodeRabbit inference engine (CLAUDE.md)
Never commit secrets, API keys, or credentials; use environment variables for sensitive configuration
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.jsonpackages/riviere-extract-conventions/src/default-extraction.config.json
packages/riviere-extract-conventions/**/*.{ts,tsx}
📄 CodeRabbit inference engine (packages/riviere-extract-conventions/CLAUDE.md)
packages/riviere-extract-conventions/**/*.{ts,tsx}: Use@DomainOpContainer,@APIContainer, or@EventHandlerContainerdecorators at class level to mark container classes where all public methods inherit the component type
Use@UseCase,@Event, or@UIdecorators to mark classes that are themselves components
Use@DomainOp,@APIEndpoint, or@EventHandlerdecorators at method level to mark individual methods as components
Use@Custom(type)decorator to mark components with custom types, and@Ignoreto exclude components from analysis
Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
🧠 Learnings (46)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Use decorators to enable deterministic architectural extraction via riviere-extract-ts and ESLint enforcement of component coverage
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `Custom(type)` decorator to mark components with custom types, and `Ignore` to exclude components from analysis
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOpContainer`, `APIContainer`, or `EventHandlerContainer` decorators at class level to mark container classes where all public methods inherit the component type
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `UseCase`, `Event`, or `UI` decorators to mark classes that are themselves components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOp`, `APIEndpoint`, or `EventHandler` decorators at method level to mark individual methods as components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: When modifying CLI commands in the riviere-cli tool, update the corresponding workflow prompts in docs/workflow/ directory (step-1 through step-6) to keep the extraction workflow in sync
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `Custom(type)` decorator to mark components with custom types, and `Ignore` to exclude components from analysis
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/tsconfig.lib.jsonpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.jsonpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Create `<module>-fixtures.ts` files alongside `<module>.spec.ts` to reduce duplication when multiple tests share similar setup data
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/tsconfig.lib.jsonpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-06T08:13:40.961Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-config/CLAUDE.md:0-0
Timestamp: 2026-01-06T08:13:40.961Z
Learning: Extraction config modules must declare all six component types (api, useCase, domainOp, event, eventHandler, ui) or mark unused ones with `notUsed: true`
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Use decorators to enable deterministic architectural extraction via riviere-extract-ts and ESLint enforcement of component coverage
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Use fixture builder functions like `buildArgs(options = {})` to provide default test data with the ability to override specific values
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.ts
📚 Learning: 2026-01-06T08:13:40.961Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-config/CLAUDE.md:0-0
Timestamp: 2026-01-06T08:13:40.961Z
Learning: Fail fast on invalid extraction config - All validation must happen at config load time, not during extraction
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Applied to files:
packages/riviere-extract-conventions/package.json
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Applies to packages/living-architecture/riviere-builder/**/*.{ts,tsx} : `riviere-builder` Node.js builder must depend only on `riviere-query` package
Applied to files:
packages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Applies to packages/living-architecture/riviere-cli/**/*.{ts,tsx} : `riviere-cli` CLI tool must depend only on `riviere-builder` package and provide a binary named 'riviere'
Applied to files:
packages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Applied to files:
packages/riviere-extract-conventions/package.json
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Applied to files:
packages/riviere-extract-conventions/package.json
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to packages/living-architecture/riviere-query/**/*.{ts,tsx} : Browser-safe query library `riviere-query` must have no Node.js dependencies
Applied to files:
packages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src
Applied to files:
packages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]
Applied to files:
packages/riviere-extract-conventions/package.jsonpackages/riviere-extract-conventions/src/default-config.spec.ts.claude/agents/code-review.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test violated domain constraints: uniqueness violations, missing relationships, ordering violations, range breaches, state inconsistencies, format mismatches, and temporal ordering
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts.claude/agents/code-review.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `UseCase`, `Event`, or `UI` decorators to mark classes that are themselves components
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Use Arrange-Act-Assert structure for tests: set up test data, execute behavior, then verify outcomes
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOp`, `APIEndpoint`, or `EventHandler` decorators at method level to mark individual methods as components
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for collections: empty collection, single element, duplicates, nested structures, circular references, large collections, sparse arrays, and mixed types
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-06T08:11:11.843Z
Learnt from: NTCoding
Repo: NTCoding/living-architecture PR: 53
File: packages/riviere-extract-config/vitest.config.mts:20-20
Timestamp: 2026-01-06T08:11:11.843Z
Learning: In packages/riviere-extract-config/vitest.config.mts, the explicit tuple type assertion for the reporter configuration (`as ['text', ['lcov', { projectRoot: string }]]`) is necessary because vitest's CoverageReporter type requires the exact tuple shape; neither inference nor 'as const' produces a compatible type.
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOpContainer`, `APIContainer`, or `EventHandlerContainer` decorators at class level to mark container classes where all public methods inherit the component type
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.tspackages/riviere-extract-conventions/CLAUDE.mdpackages/riviere-extract-conventions/src/default-extraction.config.json
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: After addressing code review issues, complete the task by following docs/workflow/task-workflow.md → Completing Tasks.
Applied to files:
.claude/commands/complete-task.mddocs/workflow/task-workflow.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.{ts,tsx} : Always follow `docs/conventions/software-design.md` when writing, editing, refactoring, or reviewing code
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.{ts,tsx} : Avoid anti-patterns documented in `docs/conventions/anti-patterns.md`
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Do not modify root configuration files (eslint.config.mjs, tsconfig.base.json, nx.json, vite.config, vitest.config.mts) without explicit approval; provide suggested changes to the user
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.test.{ts,tsx} : Maintain 100% test coverage (mandatory and enforced)
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.test.{ts,tsx} : Follow `docs/conventions/testing.md` for all tests
Applied to files:
.claude/agents/code-review.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Applies to **/*.{ts,tsx,jsx,js} : All code must follow `docs/conventions/codebase-structure.md`
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.test.{ts,tsx,js,jsx} : Test files must not contain code comments. Comments in tests are banned. Hard fail, not optional.
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Check all production code files against software-design and standard-patterns conventions.
Applied to files:
.claude/agents/code-review.md
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Whenever working on any task, follow docs/workflow/task-workflow.md from start to finish. Do not make any changes or commit any code without following these steps exactly
Applied to files:
docs/workflow/task-workflow.md
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Read `docs/project/project-overview.md` and check `docs/project/PRD/active/*.md` for the current PRD before starting work
Applied to files:
docs/workflow/task-workflow.md
📚 Learning: 2026-01-02T11:58:27.001Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: When modifying CLI commands in the riviere-cli tool, update the corresponding workflow prompts in docs/workflow/ directory (step-1 through step-6) to keep the extraction workflow in sync
Applied to files:
docs/workflow/task-workflow.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Update CLAUDE.md 'Current packages' section when adding new packages
Applied to files:
packages/riviere-extract-conventions/CLAUDE.md
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.{ts,tsx} : Look for standard implementation patterns defined in `docs/conventions/standard-patterns.md`
Applied to files:
packages/riviere-extract-conventions/CLAUDE.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.test.ts : Shared test fixtures used across multiple test files may be grouped in files like test-fixtures.ts
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for null and undefined: null input, undefined input, missing optional properties, and explicit undefined vs missing keys
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Assert specific values, not types. Use `expect(result).toEqual(['First.', ' Second.'])` instead of `expect(result).toBeDefined()`. Specific assertions catch specific bugs
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/@(tsconfig.json|tsconfig.lib.json|tsconfig.spec.json) : Each app and package requires a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, and tsconfig.spec.json with proper references and extends setup
Applied to files:
packages/riviere-extract-conventions/tsconfig.lib.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Applied to files:
packages/riviere-extract-conventions/tsconfig.lib.jsonpackages/riviere-extract-conventions/src/default-extraction.config.json
🧬 Code graph analysis (3)
packages/riviere-extract-conventions/src/default-config-fixtures.ts (1)
packages/riviere-extract-config/src/types.ts (1)
ExtractionConfig(58-61)
packages/riviere-extract-conventions/src/default-config.spec.ts (2)
packages/riviere-extract-config/src/types.ts (3)
DetectionRule(41-44)InClassWithPredicate(22-22)HasDecoratorPredicate(5-10)packages/riviere-extract-conventions/src/default-config-fixtures.ts (2)
loadDefaultConfig(8-12)getFirstModule(14-27)
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts (1)
packages/riviere-extract-conventions/src/default-config-fixtures.ts (1)
getFirstModule(14-27)
🪛 LanguageTool
packages/riviere-extract-config/CLAUDE.md
[style] ~54-~54: The double modal “wants extracted” is nonstandard (only accepted in certain dialects). Consider “to be extracted”.
Context: ...he config describes what the user wants extracted (methods). ## Principles 1. **Schema ...
(NEEDS_FIXED)
docs/workflow/task-workflow.md
[grammar] ~9-~9: Ensure spelling is correct
Context: ...UCIAL*: Do not stop to ask the user for permissiom to do steps you are empowered to do aut...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: main
🔇 Additional comments (11)
packages/riviere-extract-config/CLAUDE.md (1)
62-62: LGTM! Principle effectively captures the key semantic distinction.The new principle reinforces the documentation above and provides a clear guideline for config authors.
.claude/agents/code-review.md (1)
8-8: LGTM! Scope appropriately broadened for comprehensive reviews.The updated scope now captures all uncommitted changes (staged, unstaged, and untracked), ensuring nothing slips through code review. The explicit documentation of what constitutes each category improves clarity.
Also applies to: 16-25
.claude/commands/complete-task.md (1)
61-61: LGTM! Inline task definition improves workflow reliability.The updated approach fetches issue details directly via GitHub CLI and embeds them in the task prompt, eliminating external lookups during task checking. The structured format with
<task-details>tags provides clear context.Also applies to: 66-74
packages/riviere-extract-conventions/tsconfig.lib.json (1)
26-30: TypeScript project reference correctly added.The reference to
riviere-extract-configaligns with the workspace dependency declared inpackage.jsonand follows standard monorepo conventions.packages/riviere-extract-conventions/CLAUDE.md (1)
36-86: Documentation accurately reflects the default extraction config implementation.The actual config file at
packages/riviere-extract-conventions/src/default-extraction.config.jsonconfirms all documented behavior:
- All 6 component types are declared (api, useCase, domainOp, event, eventHandler, ui)
- Container decorators (@APIContainer, @DomainOpContainer, @EventHandlerContainer) correctly use the
inClassWithpattern to find methods- Single-method decorators (@usecase, @ui) and class decorators (@event) correctly find classes
- All decorators are sourced from
@living-architecture/riviere-extract-conventions- Path pattern
**/*.tsis correctly specifiedThe documentation is comprehensive and accurate.
packages/riviere-extract-conventions/package.json (1)
19-19: LGTM!The package export configuration correctly exposes the default config, includes it in published files, and properly declares the workspace dependency using the established monorepo conventions.
Also applies to: 23-23, 26-28
packages/riviere-extract-conventions/src/default-extraction.config.json (1)
1-68: LGTM!The default extraction config correctly defines all six required component types using appropriate decorator patterns. Container types (API, DomainOp, EventHandler) properly use
inClassWithto find methods in decorated classes, while single-method types (UseCase, UI) and class-as-component (Event) correctly use direct class decorators.Based on learnings, this aligns with the decorator-based extraction conventions.
packages/riviere-extract-conventions/src/default-config-fixtures.ts (1)
14-27: LGTM!The
getFirstModulevalidation logic correctly implements fail-fast validation at config load time with specific error messages, as per the extraction config guidelines.Based on learnings, all validation happens at config load time, not during extraction.
packages/riviere-extract-conventions/src/default-config.spec.ts (3)
81-113: LGTM! Excellent use of parameterized testing.The parameterized test effectively validates that container types (api, domainOp, eventHandler) find methods while single-method types (useCase, ui) and the class-as-component type (event) find classes. This aligns perfectly with the decorator conventions documented in the coding guidelines.
115-140: LGTM! Container decorator validation is thorough.The test correctly verifies that container component types use the
inClassWithpattern with their respective decorators (APIContainer, DomainOpContainer, EventHandlerContainer) and validates the source package. This matches the learnings about container decorators.
142-167: LGTM! Direct decorator validation is complete.The test properly validates that single-method and class-as-component types use direct decorators (UseCase, Event, UI) with correct source package attribution. This aligns with the decorator conventions in the coding guidelines.
- Expand task structure from 8 to 10 sections - Add Edge Case Scenarios section (separate from acceptance criteria) - Add Traceability section linking to PRD/requirements/success criteria - Add Implementation Guidelines with architectural context - Add Embedded Reasoning (why/what/how) - Add Testing Strategy (unit/integration/edge/performance) - Add Validation Gate to push back when PRD lacks detail - Reference testing.md for edge case checklists - Update task template with condition → behavior format for edge cases 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI Agents
In @.claude/commands/create-tasks.md:
- Line 170: Replace the phrase "specific details" with "details" in the sentence
"**CRITICAL:** If you cannot complete ALL 10 sections with specific details,
STOP." — update it to "**CRITICAL:** If you cannot complete ALL 10 sections with
details, STOP." so the wording is simpler and avoids redundancy while preserving
the original meaning.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (6)
.claude/commands/create-tasks.mddocs/workflow/task-workflow.mdpackages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.ts
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx}: Always followdocs/conventions/software-design.mdwhen writing, editing, refactoring, or reviewing code
Look for standard implementation patterns defined indocs/conventions/standard-patterns.md
Avoid anti-patterns documented in@docs/conventions/anti-patterns.md
Use domain terminology fromdocs/architecture/domain-terminology/contextive/definitions.glossary.ymland do not invent new terms or use technical jargon when domain terminology exists
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
packages/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Shared libraries in
packages/directory must be publishable to npm and must follow the monorepo naming convention with@living-architecture/namespace
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
**/*.{ts,tsx,jsx,js}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx,jsx,js}: All code must followdocs/conventions/codebase-structure.md
Do not log sensitive data (passwords, tokens, PII)
Validate and sanitize all external input
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
**/*.{ts,tsx,jsx,js,css,scss}
📄 CodeRabbit inference engine (CLAUDE.md)
All UI and UX design must conform to global brand guidelines in
/docs/brand/(logo, colors, typography, icons)
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
**/*.{ts,tsx,jsx,js,json,yaml,yml,env,config.js}
📄 CodeRabbit inference engine (CLAUDE.md)
Never commit secrets, API keys, or credentials; use environment variables for sensitive configuration
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
packages/riviere-extract-conventions/**/*.{ts,tsx}
📄 CodeRabbit inference engine (packages/riviere-extract-conventions/CLAUDE.md)
packages/riviere-extract-conventions/**/*.{ts,tsx}: Use@DomainOpContainer,@APIContainer, or@EventHandlerContainerdecorators at class level to mark container classes where all public methods inherit the component type
Use@UseCase,@Event, or@UIdecorators to mark classes that are themselves components
Use@DomainOp,@APIEndpoint, or@EventHandlerdecorators at method level to mark individual methods as components
Use@Custom(type)decorator to mark components with custom types, and@Ignoreto exclude components from analysis
Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
🧠 Learnings (38)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Use decorators to enable deterministic architectural extraction via riviere-extract-ts and ESLint enforcement of component coverage
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `Custom(type)` decorator to mark components with custom types, and `Ignore` to exclude components from analysis
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOpContainer`, `APIContainer`, or `EventHandlerContainer` decorators at class level to mark container classes where all public methods inherit the component type
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `UseCase`, `Event`, or `UI` decorators to mark classes that are themselves components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOp`, `APIEndpoint`, or `EventHandler` decorators at method level to mark individual methods as components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: When modifying CLI commands in the riviere-cli tool, update the corresponding workflow prompts in docs/workflow/ directory (step-1 through step-6) to keep the extraction workflow in sync
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Whenever working on any task, follow docs/workflow/task-workflow.md from start to finish. Do not make any changes or commit any code without following these steps exactly
Applied to files:
docs/workflow/task-workflow.md.claude/commands/create-tasks.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: After addressing code review issues, complete the task by following docs/workflow/task-workflow.md → Completing Tasks.
Applied to files:
docs/workflow/task-workflow.md.claude/commands/create-tasks.md
📚 Learning: 2026-01-06T21:33:47.543Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.543Z
Learning: Read `docs/project/project-overview.md` and check `docs/project/PRD/active/*.md` for the current PRD before starting work
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for collections: empty collection, single element, duplicates, nested structures, circular references, large collections, sparse arrays, and mixed types
Applied to files:
.claude/commands/create-tasks.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for null and undefined: null input, undefined input, missing optional properties, and explicit undefined vs missing keys
Applied to files:
.claude/commands/create-tasks.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for numbers: zero, negative numbers, very large/small numbers, decimal precision, NaN, Infinity, and boundary values (off-by-one)
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test domain-specific edge cases: email formats, URLs with protocols/ports, international phone formats, addresses with Unicode, currency rounding, and percentage boundaries
Applied to files:
.claude/commands/create-tasks.mdpackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for dates and times: leap years, daylight saving transitions, timezone boundaries, midnight, end of day, year boundaries, invalid dates, and Unix epoch edge cases
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for strings: empty string, whitespace only, very long strings, Unicode (emojis, RTL text), special characters, SQL/HTML injection patterns, and leading/trailing whitespace
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: When discovering a bug, explore related scenarios: test same function with similar inputs, test same pattern in different locations, check for same developer assumptions elsewhere, and test similar data types
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test violated domain constraints: uniqueness violations, missing relationships, ordering violations, range breaches, state inconsistencies, format mismatches, and temporal ordering
Applied to files:
.claude/commands/create-tasks.mdpackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test names describe outcomes, not actions. Use pattern '[outcome] when [condition]' (e.g., 'returns empty array when input is null', not 'test null input')
Applied to files:
.claude/commands/create-tasks.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Applied to files:
packages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T08:13:40.961Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-config/CLAUDE.md:0-0
Timestamp: 2026-01-06T08:13:40.961Z
Learning: Extraction config modules must declare all six component types (api, useCase, domainOp, event, eventHandler, ui) or mark unused ones with `notUsed: true`
Applied to files:
packages/riviere-extract-config/CLAUDE.mdpackages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Create `<module>-fixtures.ts` files alongside `<module>.spec.ts` to reduce duplication when multiple tests share similar setup data
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `Custom(type)` decorator to mark components with custom types, and `Ignore` to exclude components from analysis
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Ensure decorators are pure markers with no runtime behavior, using only ECMAScript Stage 3 decorators (TypeScript 5.0+) and not legacy experimentalDecorators
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Use fixture builder functions like `buildArgs(options = {})` to provide default test data with the ability to override specific values
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.test.ts : Shared test fixtures used across multiple test files may be grouped in files like test-fixtures.ts
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.tspackages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to packages/living-architecture/riviere-query/**/*.{ts,tsx} : Browser-safe query library `riviere-query` must have no Node.js dependencies
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.ts
📚 Learning: 2026-01-06T08:13:40.961Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-config/CLAUDE.md:0-0
Timestamp: 2026-01-06T08:13:40.961Z
Learning: Fail fast on invalid extraction config - All validation must happen at config load time, not during extraction
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T08:11:11.843Z
Learnt from: NTCoding
Repo: NTCoding/living-architecture PR: 53
File: packages/riviere-extract-config/vitest.config.mts:20-20
Timestamp: 2026-01-06T08:11:11.843Z
Learning: In packages/riviere-extract-config/vitest.config.mts, the explicit tuple type assertion for the reporter configuration (`as ['text', ['lcov', { projectRoot: string }]]`) is necessary because vitest's CoverageReporter type requires the exact tuple shape; neither inference nor 'as const' produces a compatible type.
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.test.{ts,tsx} : Follow `docs/conventions/testing.md` for all tests
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-06T21:33:47.542Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:47.542Z
Learning: Applies to **/*.test.{ts,tsx} : Maintain 100% test coverage (mandatory and enforced)
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Avoid implementation coupling in tests. Test behavior (e.g., 'expect(result.user.name).toBe("Alice")') instead of implementation details (e.g., mock call assertions with SQL queries)
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Use Arrange-Act-Assert structure for tests: set up test data, execute behavior, then verify outcomes
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Assert specific values, not types. Use `expect(result).toEqual(['First.', ' Second.'])` instead of `expect(result).toBeDefined()`. Specific assertions catch specific bugs
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Each test verifies one behavior. If you need 'and' in your test name, split it into separate tests
Applied to files:
packages/riviere-extract-conventions/src/default-config-fixtures.spec.tspackages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Use decorators to enable deterministic architectural extraction via riviere-extract-ts and ESLint enforcement of component coverage
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `UseCase`, `Event`, or `UI` decorators to mark classes that are themselves components
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOpContainer`, `APIContainer`, or `EventHandlerContainer` decorators at class level to mark container classes where all public methods inherit the component type
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-06T21:33:54.508Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-extract-conventions/CLAUDE.md:0-0
Timestamp: 2026-01-06T21:33:54.508Z
Learning: Applies to packages/riviere-extract-conventions/**/*.{ts,tsx} : Use `DomainOp`, `APIEndpoint`, or `EventHandler` decorators at method level to mark individual methods as components
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Assertions must match test titles. If the test claims to verify 'different IDs', assert on the actual ID values—not just count or existence
Applied to files:
packages/riviere-extract-conventions/src/default-config.spec.ts
🧬 Code graph analysis (2)
packages/riviere-extract-conventions/src/default-config-fixtures.ts (1)
packages/riviere-extract-config/src/types.ts (1)
ExtractionConfig(58-61)
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts (1)
packages/riviere-extract-conventions/src/default-config-fixtures.ts (1)
getFirstModule(19-32)
🪛 LanguageTool
.claude/commands/create-tasks.md
[style] ~170-~170: This phrase is redundant. Consider writing “details”.
Context: ...ou cannot complete ALL 10 sections with specific details, STOP. Do NOT create the task. Instead...
(SPECIFIC_DETAILS)
packages/riviere-extract-config/CLAUDE.md
[style] ~54-~54: The double modal “wants extracted” is nonstandard (only accepted in certain dialects). Consider “to be extracted”.
Context: ...specifies the components the user wants extracted (methods). ## Principles 1. **Schema ...
(NEEDS_FIXED)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: main
- GitHub Check: Cloudflare Pages
🔇 Additional comments (12)
docs/workflow/task-workflow.md (3)
7-7: Goal statement clarified.The updated language defines the end condition explicitly: work autonomously until the PR is mergeable or you encounter a blocker. Clear and actionable.
13-13: New definition clarifies autonomous operation semantics.The inline definition aligns with the CRUCIAL note and makes the permission column of the lifecycle table self-explanatory.
18-18: Script exists and documentation is correct.The
./scripts/list-tasks.shscript is present in the repository at the documented path, and the table row accurately reflects its purpose and permission level. The associated usage guidance at line 32 is clear and consistent with the overall workflow design..claude/commands/create-tasks.md (1)
1-241: Excellent structure for enforcing task rigor and completeness.The document comprehensively redesigns task creation to mandate 10 sections, explicit edge case discovery, and a blocking validation gate for incomplete information. Key strengths:
- Clear structure: Hierarchical organization flows logically from overview → pre-validation → template → validation gate → workflow.
- Explicit file paths: Line 24 enforces specific file path references; all sections properly reference
docs/conventions/testing.md,docs/architecture/, and PRD locations.- Edge case rigor: New "Edge Case Discovery Process" (lines 40–56) with heuristics table and direct reference to testing checklists aligns with coding learnings.
- Strong validation gate: Lines 168–196 create a hard stop for incomplete sections, preventing mid-implementation discovery.
- Implementation workflow: 10 steps properly sequenced from context reading through task creation, with step 8 enforcing the validation gate.
- Alignment with learnings: References to
docs/workflow/task-workflow.md,docs/conventions/testing.md, and PRD-driven structure match established patterns.No critical issues. The document successfully elevates task creation discipline and architectural context embedding.
packages/riviere-extract-conventions/src/default-config-fixtures.spec.ts (1)
7-46: Excellent test coverage with happy path and edge cases.The test suite now comprehensively covers all paths:
- Happy path with valid config and multiple modules
- Invalid config rejection
- Edge case where validation passes but modules array is empty
The tests follow AAA structure, assert specific values, and properly mock dependencies. Based on learnings, this aligns with testing conventions.
packages/riviere-extract-conventions/src/default-config-fixtures.ts (2)
1-17: ESM compatibility correctly implemented.The code now properly handles ESM modules by using
dirname(fileURLToPath(import.meta.url))instead of the CommonJS__dirname. TheloadDefaultConfigfunction cleanly reads and parses the JSON configuration.
19-32: Robust validation with clear error messages.The function properly validates the config using
isValidExtractionConfig, then defensively checks for the first module's existence. Error messages clearly explain what failed and why, which aids debugging.packages/riviere-extract-conventions/src/default-config.spec.ts (5)
14-31: Well-designed type guards for safe assertions.The helper functions (
hasProperty,isDetectionRule,isInClassWithPredicate,isHasDecoratorPredicate) provide type-safe checks that enable TypeScript to narrow types in the assertion helpers. This prevents runtime type errors and makes the test code more maintainable.
33-62: Clear assertion helpers with descriptive error messages.The
assertContainerDecoratorandassertDirectDecoratorfunctions encapsulate common validation logic and throw descriptive errors when type guards fail. This makes test failures easier to diagnose and reduces code duplication across tests.
73-81: Effective validation of component type completeness.The test uses
arrayContainingfor flexibility while also assertinglength === 7to ensure no extra keys. This accounts for the 6 required component types plus the 'path' key, striking a good balance between strictness and maintainability.
83-115: Excellent use of parameterized tests.The parameterized approach efficiently tests all six component types'
findtargets (methods vs classes) without duplication, following testing best practices for reduced maintenance burden.
117-169: Comprehensive decorator pattern validation.The tests systematically verify both container decorators (APIContainer, DomainOpContainer, EventHandlerContainer) and direct decorators (UseCase, Event, UI), ensuring the default config correctly implements the decorator-based extraction strategy. Based on learnings, this aligns with the decorator conventions for riviere-extract-conventions.



Summary
Test plan
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Tests
✏️ Tip: You can customize this high-level summary in your review settings.