devcouncil 0.1.1 → 0.3.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.
Files changed (159) hide show
  1. package/README.md +201 -6
  2. package/package.json +9 -2
  3. package/pyproject.toml +34 -2
  4. package/src/devcouncil/app/config.py +348 -12
  5. package/src/devcouncil/app/orchestrator.py +10 -6
  6. package/src/devcouncil/app/state_machine.py +4 -0
  7. package/src/devcouncil/artifacts/graph.py +32 -5
  8. package/src/devcouncil/assets/__init__.py +1 -0
  9. package/src/devcouncil/assets/devcouncil-logo.svg +60 -0
  10. package/src/devcouncil/assets/devcouncil_logo_premium.png +0 -0
  11. package/src/devcouncil/cli/commands/agents.py +292 -0
  12. package/src/devcouncil/cli/commands/artifacts.py +6 -3
  13. package/src/devcouncil/cli/commands/check.py +220 -0
  14. package/src/devcouncil/cli/commands/config.py +43 -4
  15. package/src/devcouncil/cli/commands/cost.py +57 -0
  16. package/src/devcouncil/cli/commands/dashboard.py +6 -1
  17. package/src/devcouncil/cli/commands/design.py +186 -0
  18. package/src/devcouncil/cli/commands/doctor.py +379 -22
  19. package/src/devcouncil/cli/commands/evidence.py +48 -0
  20. package/src/devcouncil/cli/commands/go.py +532 -33
  21. package/src/devcouncil/cli/commands/handoff.py +69 -0
  22. package/src/devcouncil/cli/commands/hook.py +296 -15
  23. package/src/devcouncil/cli/commands/init.py +161 -20
  24. package/src/devcouncil/cli/commands/integrate.py +1371 -124
  25. package/src/devcouncil/cli/commands/logs.py +106 -0
  26. package/src/devcouncil/cli/commands/map.py +80 -10
  27. package/src/devcouncil/cli/commands/okf.py +245 -0
  28. package/src/devcouncil/cli/commands/plan.py +256 -55
  29. package/src/devcouncil/cli/commands/prompt.py +18 -7
  30. package/src/devcouncil/cli/commands/repair.py +50 -24
  31. package/src/devcouncil/cli/commands/report.py +8 -0
  32. package/src/devcouncil/cli/commands/reset_demo_state.py +4 -2
  33. package/src/devcouncil/cli/commands/rollback.py +27 -28
  34. package/src/devcouncil/cli/commands/run.py +195 -54
  35. package/src/devcouncil/cli/commands/runs.py +223 -0
  36. package/src/devcouncil/cli/commands/scaffold.py +32 -0
  37. package/src/devcouncil/cli/commands/semantic.py +47 -0
  38. package/src/devcouncil/cli/commands/setup.py +145 -6
  39. package/src/devcouncil/cli/commands/shell.py +73 -0
  40. package/src/devcouncil/cli/commands/skills.py +267 -0
  41. package/src/devcouncil/cli/commands/status.py +30 -15
  42. package/src/devcouncil/cli/commands/trace.py +47 -3
  43. package/src/devcouncil/cli/commands/verify.py +144 -3
  44. package/src/devcouncil/cli/commands/watch.py +32 -12
  45. package/src/devcouncil/cli/commands/watch_fs.py +40 -0
  46. package/src/devcouncil/cli/main.py +91 -7
  47. package/src/devcouncil/domain/evidence.py +29 -2
  48. package/src/devcouncil/domain/gap.py +27 -1
  49. package/src/devcouncil/domain/task.py +31 -2
  50. package/src/devcouncil/execution/checkpoints.py +256 -0
  51. package/src/devcouncil/execution/context_builder.py +1 -1
  52. package/src/devcouncil/execution/fs_watcher.py +205 -0
  53. package/src/devcouncil/execution/handoff.py +102 -0
  54. package/src/devcouncil/execution/hook_policy.py +162 -74
  55. package/src/devcouncil/execution/patch.py +65 -10
  56. package/src/devcouncil/execution/permissions.py +24 -24
  57. package/src/devcouncil/execution/policy_engine.py +350 -0
  58. package/src/devcouncil/execution/prompt_builder.py +751 -23
  59. package/src/devcouncil/execution/shell_session.py +231 -0
  60. package/src/devcouncil/execution/task_runner.py +24 -9
  61. package/src/devcouncil/executors/agent_registry.py +596 -0
  62. package/src/devcouncil/executors/coding_cli.py +791 -39
  63. package/src/devcouncil/executors/mini_swe.py +6 -0
  64. package/src/devcouncil/executors/native/agent.py +135 -19
  65. package/src/devcouncil/executors/openhands.py +6 -0
  66. package/src/devcouncil/gating/checks/clean_git.py +3 -1
  67. package/src/devcouncil/gating/checks/secret_scan_check.py +47 -21
  68. package/src/devcouncil/gating/policy.py +190 -11
  69. package/src/devcouncil/hardware.py +184 -0
  70. package/src/devcouncil/indexing/ast_matcher.py +17 -7
  71. package/src/devcouncil/indexing/lsp.py +45 -4
  72. package/src/devcouncil/indexing/repo_mapper.py +1284 -15
  73. package/src/devcouncil/indexing/semantic_index.py +221 -0
  74. package/src/devcouncil/integrations/actions.py +166 -0
  75. package/src/devcouncil/integrations/check.py +426 -0
  76. package/src/devcouncil/integrations/claude_assets.py +444 -0
  77. package/src/devcouncil/integrations/code_review_graph.py +13 -2
  78. package/src/devcouncil/integrations/github_intent.py +149 -0
  79. package/src/devcouncil/integrations/gitnexus.py +45 -2
  80. package/src/devcouncil/integrations/mcp/server.py +1944 -32
  81. package/src/devcouncil/integrations/opencode_devcouncil_plugin.mjs +24 -0
  82. package/src/devcouncil/integrations/pr_comments.py +9 -0
  83. package/src/devcouncil/knowledge/__init__.py +23 -0
  84. package/src/devcouncil/knowledge/design.py +374 -0
  85. package/src/devcouncil/knowledge/design_conformance.py +317 -0
  86. package/src/devcouncil/knowledge/fetch.py +223 -0
  87. package/src/devcouncil/knowledge/frontmatter.py +51 -0
  88. package/src/devcouncil/knowledge/okf.py +202 -0
  89. package/src/devcouncil/knowledge/skill_bridge.py +96 -0
  90. package/src/devcouncil/knowledge/sources.py +239 -0
  91. package/src/devcouncil/live/cards.py +181 -25
  92. package/src/devcouncil/live/repair_prompt.py +29 -6
  93. package/src/devcouncil/live/reviewer.py +72 -13
  94. package/src/devcouncil/live/signals.py +2 -2
  95. package/src/devcouncil/live/summary.py +18 -8
  96. package/src/devcouncil/live/transcripts.py +47 -11
  97. package/src/devcouncil/llm/cache.py +20 -8
  98. package/src/devcouncil/llm/model_defaults.yaml +44 -0
  99. package/src/devcouncil/llm/provider.py +617 -49
  100. package/src/devcouncil/llm/router.py +337 -53
  101. package/src/devcouncil/optimization/__init__.py +1 -0
  102. package/src/devcouncil/optimization/gepa_agent.py +318 -0
  103. package/src/devcouncil/optimization/skillopt.py +673 -0
  104. package/src/devcouncil/planning/arbiter_service.py +10 -2
  105. package/src/devcouncil/planning/correction_manifest.py +346 -0
  106. package/src/devcouncil/planning/critique_service.py +16 -4
  107. package/src/devcouncil/planning/plan_service.py +86 -6
  108. package/src/devcouncil/planning/prompt_enhancer_service.py +206 -1
  109. package/src/devcouncil/planning/repair_service.py +8 -2
  110. package/src/devcouncil/planning/spec_service.py +37 -3
  111. package/src/devcouncil/repo/ci_scaffold.py +165 -0
  112. package/src/devcouncil/repo/gitignore.py +123 -0
  113. package/src/devcouncil/repo/sca.py +384 -0
  114. package/src/devcouncil/reporting/json_report.py +22 -1
  115. package/src/devcouncil/reporting/markdown_report.py +29 -1
  116. package/src/devcouncil/reporting/okf_bundle_writer.py +364 -0
  117. package/src/devcouncil/reporting/okf_html.py +323 -0
  118. package/src/devcouncil/reporting/report_builder.py +18 -1
  119. package/src/devcouncil/skills/__init__.py +19 -0
  120. package/src/devcouncil/skills/library/README.md +46 -0
  121. package/src/devcouncil/skills/library/ai-training.md +50 -0
  122. package/src/devcouncil/skills/library/android.md +50 -0
  123. package/src/devcouncil/skills/library/backend.md +52 -0
  124. package/src/devcouncil/skills/library/core-engineering.md +95 -0
  125. package/src/devcouncil/skills/library/data-engineering.md +47 -0
  126. package/src/devcouncil/skills/library/desktop.md +46 -0
  127. package/src/devcouncil/skills/library/devops.md +48 -0
  128. package/src/devcouncil/skills/library/game-dev.md +46 -0
  129. package/src/devcouncil/skills/library/ios.md +48 -0
  130. package/src/devcouncil/skills/library/mobile-cross-platform.md +46 -0
  131. package/src/devcouncil/skills/library/security.md +48 -0
  132. package/src/devcouncil/skills/library/systems.md +48 -0
  133. package/src/devcouncil/skills/library/web.md +47 -0
  134. package/src/devcouncil/skills/library/windows.md +47 -0
  135. package/src/devcouncil/skills/registry.py +408 -0
  136. package/src/devcouncil/storage/db.py +140 -3
  137. package/src/devcouncil/storage/models.py +125 -0
  138. package/src/devcouncil/storage/native.py +559 -0
  139. package/src/devcouncil/storage/repositories.py +157 -78
  140. package/src/devcouncil/telemetry/cost.py +123 -17
  141. package/src/devcouncil/telemetry/logging_setup.py +244 -0
  142. package/src/devcouncil/telemetry/model_pricing.yaml +48 -0
  143. package/src/devcouncil/telemetry/pricing.py +28 -0
  144. package/src/devcouncil/telemetry/stages.py +141 -0
  145. package/src/devcouncil/telemetry/traces.py +62 -7
  146. package/src/devcouncil/telemetry/tracker.py +24 -10
  147. package/src/devcouncil/ui/dashboard.py +393 -28
  148. package/src/devcouncil/utils/redaction.py +9 -3
  149. package/src/devcouncil/utils/subprocess_env.py +69 -0
  150. package/src/devcouncil/verification/acceptance_compiler.py +253 -0
  151. package/src/devcouncil/verification/ad_hoc_check.py +135 -0
  152. package/src/devcouncil/verification/diff_coverage.py +353 -0
  153. package/src/devcouncil/verification/implementation_reviewer.py +11 -2
  154. package/src/devcouncil/verification/next_actions.py +189 -0
  155. package/src/devcouncil/verification/sandbox.py +181 -0
  156. package/src/devcouncil/verification/test_resolver.py +91 -0
  157. package/src/devcouncil/verification/verifier.py +1549 -143
  158. package/uv.lock +205 -64
  159. package/src/devcouncil/indexing/symbol_index.py +0 -0
@@ -1,10 +1,12 @@
1
+ from pathlib import Path
2
+
1
3
  from devcouncil.artifacts.graph import ArtifactGraph
2
4
  from devcouncil.reporting.markdown_report import MarkdownReportGenerator
3
5
  from devcouncil.reporting.json_report import JsonReportGenerator
4
6
 
5
7
  class ReportBuilder:
6
8
  """Builds reports in various formats from the artifact graph."""
7
-
9
+
8
10
  @staticmethod
9
11
  def build_markdown(graph: ArtifactGraph, live_review: dict | None = None) -> str:
10
12
  return MarkdownReportGenerator.generate(graph, live_review=live_review)
@@ -12,3 +14,18 @@ class ReportBuilder:
12
14
  @staticmethod
13
15
  def build_json(graph: ArtifactGraph, live_review: dict | None = None) -> str:
14
16
  return JsonReportGenerator.generate(graph, live_review=live_review)
17
+
18
+ @staticmethod
19
+ def build_okf_bundle(
20
+ graph: ArtifactGraph,
21
+ output_dir: Path,
22
+ repo_map=None,
23
+ project_name: str = "DevCouncil Project",
24
+ timestamp: str = "",
25
+ ) -> list[Path]:
26
+ """Export the artifact graph as an Open Knowledge Format bundle on disk."""
27
+ from devcouncil.reporting.okf_bundle_writer import OKFBundleWriter
28
+
29
+ return OKFBundleWriter.generate(
30
+ graph, output_dir, repo_map=repo_map, project_name=project_name, timestamp=timestamp
31
+ )
@@ -0,0 +1,19 @@
1
+ """DevCouncil skills library."""
2
+
3
+ from devcouncil.skills.registry import (
4
+ Skill,
5
+ get_skill,
6
+ load_skills,
7
+ render_preamble,
8
+ scaffold_skills,
9
+ select_skills,
10
+ )
11
+
12
+ __all__ = [
13
+ "Skill",
14
+ "get_skill",
15
+ "load_skills",
16
+ "render_preamble",
17
+ "scaffold_skills",
18
+ "select_skills",
19
+ ]
@@ -0,0 +1,46 @@
1
+ # DevCouncil skills library
2
+
3
+ Each `*.md` file here (except this README) is a **skill**: reusable guidance that
4
+ DevCouncil selects for a goal/repo, embeds into `dev prompt` output, and scaffolds
5
+ into a target repo's `.claude/skills/<name>/SKILL.md`.
6
+
7
+ A skill is a markdown file with YAML frontmatter:
8
+
9
+ ```markdown
10
+ ---
11
+ name: my-domain # required — unique slug; files without a name are ignored
12
+ title: My Domain Intake # optional human title
13
+ description: One-line directive shown in `dev skills` and embedded into prompts.
14
+ always: false # true = always selected (only core-engineering uses this)
15
+ triggers: # how this skill is auto-selected (omit for always-on)
16
+ keywords: [foo, bar] # matched against the goal text (case-insensitive substring)
17
+ globs: ["*.foo", "build.bar"] # matched against repo file basenames
18
+ ---
19
+
20
+ # Body
21
+
22
+ The full guidance the agent reads. For domain skills, write a "senior-dev intake":
23
+ what current versions, deprecations, recommended libraries, official guidelines, and
24
+ CLI/build tools to confirm *before* writing code.
25
+ ```
26
+
27
+ ## Adding a skill
28
+
29
+ 1. Create `<name>.md` with the frontmatter above.
30
+ 2. Choose triggers: `keywords` (goal text) and/or `globs` (repo files). Both are ORed.
31
+ 3. Verify: `dev skills` lists it; `dev skills show <name>` prints it.
32
+
33
+ Selection is keyword-based inside `dev prompt` (fast, no repo walk) and
34
+ keyword-plus-file-based for `dev skills` / `dev skills scaffold` / init scaffolding.
35
+ Keep `description` actionable — it is what the agent sees inline in the task prompt.
36
+
37
+ ## Repo-local skills
38
+
39
+ You don't have to edit this packaged library to add a skill. Drop your own
40
+ `SKILL.md` (same frontmatter) into a project's **`.claude/skills/<name>/SKILL.md`**
41
+ (or `.devcouncil/skills/*.md`) and DevCouncil discovers it automatically — it shows
42
+ up in `dev skills` (source `repo`), participates in selection, and is folded into the
43
+ codebase-aware prompt enhancer and the task prompts. A repo-local skill **overrides a
44
+ packaged skill with the same name**, so a team can keep its own house rules for
45
+ `android`/`web`/etc. Give it `triggers` (or `always: true`) if you want it
46
+ auto-selected; without triggers it stays available but dormant.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: ai-training
3
+ title: AI / ML Model Training Intake
4
+ description: Before writing model-training code, retrieve current framework versions, hardware/driver constraints, deprecations, dataset/eval practices, and the right tooling — like a senior ML engineer.
5
+ triggers:
6
+ keywords: [train, training, model, pytorch, torch, tensorflow, keras, jax, huggingface, transformers, finetune, "fine-tune", dataset, llm, ml, cuda, embedding]
7
+ globs: ["*.ipynb", "train.py", "trainer.py", "requirements.txt", "environment.yml", "pyproject.toml", "accelerate*.yaml", "deepspeed*.json"]
8
+ ---
9
+
10
+ # AI / ML Model Training Intake
11
+
12
+ Do this **before** writing or changing model-training code. Frameworks, hardware
13
+ drivers, and recommended recipes change frequently, and silent version mismatches
14
+ waste expensive compute. Confirm against the framework docs and the project's
15
+ environment files.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Framework & environment** — read `requirements.txt` / `environment.yml` /
20
+ `pyproject.toml`: the framework (PyTorch, TensorFlow/Keras, JAX, Hugging Face
21
+ `transformers`/`accelerate`/`peft`), its version, Python version, and the
22
+ CUDA/cuDNN/ROCm requirement. Match the existing stack.
23
+ 2. **Hardware & precision** — available accelerators (GPU/TPU), memory budget, and
24
+ the precision strategy (fp32/fp16/bf16, mixed precision, quantization). Confirm the
25
+ training approach fits the hardware (single-GPU vs distributed: DDP/FSDP/DeepSpeed).
26
+ 3. **Deprecations & API shifts** — note moved/renamed APIs (e.g. `transformers`
27
+ trainer/argument changes, optimizer/scheduler APIs, dataset loaders) and avoid
28
+ patterns deprecated in the installed version.
29
+ 4. **Recommended practices** — reproducibility (seed, deterministic flags, pinned
30
+ versions), data pipeline (streaming vs in-memory, tokenization), checkpointing and
31
+ resume, and evaluation (held-out split, the metric that actually matters, no leakage
32
+ between train/val/test).
33
+ 5. **Cost & safety** — estimate compute/time before launching long runs; log metrics
34
+ (Weights & Biases / TensorBoard) and checkpoint so a crash isn't a total loss.
35
+
36
+ ## Tools
37
+
38
+ - `python`/`accelerate launch`/`torchrun` for training entry points.
39
+ - Experiment tracking (W&B, MLflow, TensorBoard) and `nvidia-smi` for GPU monitoring.
40
+ - `datasets`/`dvc` for data, and a pinned environment (`uv`/`conda`/`pip-tools`).
41
+
42
+ ## What to record before coding
43
+
44
+ - Framework + version, Python + CUDA versions, and the hardware/precision plan.
45
+ - Deprecated APIs to avoid and their current replacements.
46
+ - How the run is validated: the eval split, the metric, the checkpoint cadence, and a
47
+ short smoke run (a few steps) before the full training job.
48
+
49
+ Start with a tiny smoke run to validate the pipeline end-to-end before committing to a
50
+ long, expensive training run.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: android
3
+ title: Android App Development Intake
4
+ description: Before writing Android code, retrieve current SDK/AGP/Kotlin/Compose versions, platform behavior changes, deprecations, recommended Jetpack libraries, and the right CLI/build tools — like a senior Android engineer briefing themselves.
5
+ triggers:
6
+ keywords: [android, kotlin, jetpack, compose, gradle, agp, apk, aab, espresso, room, hilt]
7
+ globs: ["build.gradle", "build.gradle.kts", "settings.gradle", "settings.gradle.kts", "AndroidManifest.xml", "*.kt", "gradle/libs.versions.toml"]
8
+ ---
9
+
10
+ # Android App Development Intake
11
+
12
+ Do this **before** writing or changing Android code. Don't rely on training data —
13
+ Android moves fast and the answer that was right a year ago is often deprecated.
14
+ Confirm against `developer.android.com`, the AGP/Kotlin/Compose release notes, and
15
+ the project's own version catalog.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Toolchain versions in use** — read `gradle/libs.versions.toml`, `build.gradle[.kts]`,
20
+ and `gradle-wrapper.properties`: `compileSdk` / `targetSdk` / `minSdk`, Android
21
+ Gradle Plugin (AGP), Kotlin, Gradle, Jetpack Compose / Compose Compiler, and core
22
+ Jetpack libraries.
23
+ 2. **Latest platform & API level** — current stable Android release, its behavior
24
+ changes, and the newest `targetSdk` Google Play will require. Note anything that
25
+ affects this task.
26
+ 3. **Deprecations & removals** — APIs deprecated or removed between the project's
27
+ `targetSdk` and current (e.g. background-execution limits, storage/scoped-storage
28
+ changes, notification/permission model, `AsyncTask`, `onBackPressed`, implicit
29
+ intents). List the ones this change touches and their replacements.
30
+ 4. **Recommended libraries** — prefer current Jetpack: Compose (+ adaptive layouts),
31
+ Navigation, Room, WorkManager, Hilt, DataStore (not SharedPreferences for new code),
32
+ Lifecycle/ViewModel. Confirm the recommended artifact and version.
33
+ 5. **Guidelines** — Material 3, adaptive/large-screen & foldable support, edge-to-edge,
34
+ the runtime permission model, and predictive back.
35
+
36
+ ## Build & CLI tools
37
+
38
+ - `gradlew`/`gradlew.bat` for builds; `adb` for device/log work; `R8` for shrink/obfuscate.
39
+ - The `android` command-line tool and `sdkmanager`/`avdmanager` for SDK and emulator setup.
40
+ - Android Studio for profiling (Perfetto traces) and Compose preview.
41
+
42
+ ## What to record before coding
43
+
44
+ - Effective `minSdk`/`targetSdk` and the version catalog entries you will use.
45
+ - Deprecated APIs to avoid and their modern replacements, with migration steps.
46
+ - The build/test commands you will run (`gradlew :app:assembleDebug`, `:app:testDebugUnitTest`,
47
+ connected/instrumented tests) so the change is verifiable.
48
+
49
+ If the project mixes Views and Compose, match the file you're editing; don't migrate
50
+ unrelated screens as a side effect (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: backend
3
+ title: Backend / API / Services Intake
4
+ description: Before writing server-side code, retrieve current framework and runtime versions, security and auth guidance, database/migration tooling, and the right CLI/build/test commands — like a senior backend engineer briefing themselves on the stack.
5
+ triggers:
6
+ keywords: [backend, server, api, rest, grpc, graphql, microservice, fastapi, django, flask, starlette, express, nestjs, rails, spring, laravel, gin, fiber, echo, axum, actix, sqlalchemy, alembic, prisma, postgres, postgresql, mysql, sqlite, redis, mongodb, celery, rabbitmq, kafka, docker, kubernetes, migration, webhook, jwt, oauth]
7
+ globs: ["manage.py", "wsgi.py", "asgi.py", "alembic.ini", "Dockerfile", "docker-compose.yml", "docker-compose.yaml", "go.mod", "Cargo.toml", "*.proto", "Gemfile", "Procfile", "main.go", "openapi.yaml", "openapi.json"]
8
+ ---
9
+
10
+ # Backend / API / Services Intake
11
+
12
+ Do this **before** writing or changing server-side code. Don't rely on training data —
13
+ frameworks, runtimes, and security guidance change, and a pattern that was fine a year
14
+ ago may now be deprecated or insecure. Confirm against the framework's current docs and
15
+ release notes, and against the project's own dependency manifests.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Runtime & framework versions in use** — read the dependency manifest
20
+ (`pyproject.toml`/`requirements.txt`, `package.json`, `go.mod`, `Cargo.toml`, `Gemfile`,
21
+ `pom.xml`) and any lockfile: language runtime version, web framework (FastAPI/Django/
22
+ Flask/Express/NestJS/Gin/Axum/Spring/Rails), and ORM/data layer. Match what's already there.
23
+ 2. **Current stable versions & deprecations** — the framework's latest stable release and
24
+ anything deprecated/removed between the project's version and current (routing, lifecycle
25
+ hooks, settings, async APIs). List the ones this change touches and their replacements.
26
+ 3. **Data & migrations** — how schema changes are managed (Alembic, Django migrations,
27
+ Prisma Migrate, golang-migrate). Never hand-edit schema without a migration; generate one
28
+ and confirm it runs forward and back.
29
+ 4. **Security & correctness** — input validation, authn/authz on every new endpoint, secrets
30
+ from config/env (never hard-coded), parameterized queries (no string-built SQL), safe
31
+ defaults for CORS/headers, and rate limits where relevant. Check the framework's current
32
+ security guidance for the version in use.
33
+ 5. **Contracts** — if there's an API schema (OpenAPI, `.proto`, GraphQL SDL), update it with
34
+ the change and keep it the source of truth; note backward-compatibility for existing clients.
35
+
36
+ ## Build & CLI tools
37
+
38
+ - Run/serve and migrate via the project's tooling: `uvicorn`/`gunicorn`, `python manage.py`,
39
+ `npm run`/`pnpm`, `go run`/`go build`, `cargo run`/`cargo build`, `rails`, `./gradlew`.
40
+ - Tests: `pytest`, `go test ./...`, `cargo test`, `npm test`, `python manage.py test` — prefer
41
+ the command the repo already uses so the change is verifiable.
42
+ - Containers: `docker build` / `docker compose up` when the service is containerized.
43
+
44
+ ## What to record before coding
45
+
46
+ - The runtime/framework versions and the exact dependencies you will use.
47
+ - Deprecated APIs to avoid and their modern replacements, with migration steps.
48
+ - Any new migration to generate, and the auth/validation each new endpoint enforces.
49
+ - The build/test commands you will run so the change is provably correct.
50
+
51
+ Don't broaden the change beyond the task — no incidental framework upgrades or schema
52
+ churn on unrelated tables (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: core-engineering
3
+ title: Core Engineering Discipline
4
+ description: Always-on coding discipline for AI agents — think before coding, keep it simple, edit surgically, drive to a verifiable goal, and communicate like a senior engineer.
5
+ always: true
6
+ source: Merged from Andrej Karpathy's LLM coding guidelines and the Claude Fable 5 behavioral framework, distilled for DevCouncil-orchestrated coding work.
7
+ ---
8
+
9
+ # Core Engineering Discipline
10
+
11
+ This is the baseline contract for any change you make in this repository. It is
12
+ always in effect. The four principles come from Andrej Karpathy's observations
13
+ about how LLMs write code; the communication and honesty rules come from the
14
+ Claude Fable 5 framework. Together they describe how a senior engineer works.
15
+
16
+ ## 1. Think before coding
17
+
18
+ Most bad LLM changes come from a wrong assumption made silently. Before writing
19
+ code:
20
+
21
+ - State the assumptions your solution depends on. If any are uncertain, surface
22
+ them instead of guessing.
23
+ - Read the surrounding code first. Match its existing patterns, naming, and
24
+ conventions rather than importing your own.
25
+ - If the request is ambiguous or has real tradeoffs, name them and recommend one
26
+ path — don't quietly pick one and hide the choice.
27
+ - Verify facts against the current codebase and current documentation, not from
28
+ memory. Library APIs, framework defaults, and best practices change; confirm
29
+ before relying on them. (For platform-specific work, the matching domain skill
30
+ tells you exactly what to confirm.)
31
+
32
+ ## 2. Simplicity first
33
+
34
+ Write the minimal code that solves the stated problem.
35
+
36
+ - No speculative features, options, or abstractions for requirements that don't
37
+ exist yet. Do the simplest thing that works well.
38
+ - Don't add error handling, fallbacks, or validation for situations that cannot
39
+ occur. Trust internal code and framework guarantees; validate only at real
40
+ boundaries (user input, external APIs).
41
+ - Prefer a direct implementation over a clever or layered one. If you introduce
42
+ an abstraction, be able to justify why the direct version was insufficient.
43
+ - No feature flags or backwards-compatibility shims when you can just change the
44
+ code.
45
+
46
+ ## 3. Surgical changes
47
+
48
+ Change only what the task requires.
49
+
50
+ - Touch the smallest set of lines that accomplishes the goal. Leave unrelated
51
+ code alone, even if you would have written it differently.
52
+ - Do not reformat, rename, or refactor code orthogonal to the task. Those are
53
+ separate changes with their own review.
54
+ - Preserve the existing style of each file you edit. Your diff should read like
55
+ the person who wrote the file made it.
56
+ - A bug fix does not need surrounding cleanup. A one-line change should produce a
57
+ one-line diff.
58
+
59
+ ## 4. Goal-driven execution
60
+
61
+ Define what "done and correct" means before you start, then prove it.
62
+
63
+ - Write down the verifiable success criteria. In DevCouncil terms, these are the
64
+ acceptance checks and the tests that must pass.
65
+ - Prefer a tests-first loop: establish how you will check the work, make the
66
+ change, then run the check and iterate until it passes.
67
+ - Verify against evidence, not vibes. Run the tests, read the output, and only
68
+ then claim success.
69
+
70
+ ## Communication & honesty (how you report the work)
71
+
72
+ - **Lead with the outcome.** Your first sentence should answer "what happened" or
73
+ "what did you find." Supporting detail comes after.
74
+ - **Be clear over terse.** Use plain, complete sentences. Avoid arrow-chains
75
+ (`A → B → fails`), stacked jargon, and invented shorthand. If you must choose
76
+ between short and clear, choose clear.
77
+ - **Don't over-format.** Use prose by default; reach for lists or tables only
78
+ when they genuinely aid scanning. Skip decorative bolding and meta-commentary.
79
+ - **Own mistakes plainly,** without excessive apology, and correct course.
80
+ - **Ground every progress claim in evidence** from this session. If tests fail,
81
+ say so with the output. If a step was skipped, say that. If something is done
82
+ and verified, state it plainly without hedging. Never report success you have
83
+ not observed.
84
+ - **Respect scope.** When the user is describing a problem, asking a question, or
85
+ thinking out loud, the deliverable is your assessment — report it and stop;
86
+ don't apply a fix until asked. For reversible actions clearly implied by the
87
+ request, proceed; for destructive or out-of-scope actions, confirm first.
88
+
89
+ ## Before you reach for more capability
90
+
91
+ Check whether a relevant skill, helper, or existing convention already covers
92
+ the task before writing new code or pulling in a new dependency. Use the matching
93
+ domain skill (Android, iOS, Windows, web, AI training, …) to load current,
94
+ platform-specific guidance the way a senior engineer would brief themselves
95
+ before starting.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: data-engineering
3
+ title: Data Engineering / Pipelines / Warehouses Intake
4
+ description: Before changing data pipelines, transformations, or warehouse models, retrieve current engine/tool versions, schema and partitioning conventions, idempotency and backfill guidance, and the right run/test CLI commands — like a senior data engineer briefing themselves.
5
+ triggers:
6
+ keywords: [etl, elt, "data pipeline", "data engineering", airflow, dagster, prefect, dbt, spark, pyspark, flink, beam, snowflake, bigquery, redshift, databricks, "data warehouse", "data lake", lakehouse, iceberg, "delta lake", parquet, partition, backfill, ingestion]
7
+ globs: ["dbt_project.yml", "profiles.yml", "airflow.cfg", "dagster.yaml", "*.dbt", "dbt_packages", "great_expectations.yml", "*.avsc"]
8
+ ---
9
+
10
+ # Data Engineering / Pipelines / Warehouses Intake
11
+
12
+ Do this **before** changing pipelines, transformations, or warehouse models. Don't rely on
13
+ training data — engines, SQL dialects, and orchestration APIs change, and a careless change
14
+ can silently corrupt data or break downstream consumers. Confirm against the engine/tool's
15
+ current docs and the project's own conventions.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Engine & tool versions in use** — read the manifests (`dbt_project.yml`, `requirements`,
20
+ cluster/runtime config): orchestrator (Airflow/Dagster/Prefect), transform tool (dbt/Spark),
21
+ warehouse/engine (Snowflake/BigQuery/Redshift/Databricks) and its SQL dialect. Match them.
22
+ 2. **Schema, contracts & lineage** — the tables/models this touches, their schema, primary/unique
23
+ keys, and the downstream consumers (BI, models, other DAGs). A column rename or type change is
24
+ a breaking contract — coordinate it and update the dependents.
25
+ 3. **Idempotency & partitioning** — pipelines must be safe to re-run: idempotent writes
26
+ (MERGE/upsert, partition overwrite), correct partition/cluster keys, and no duplicate or
27
+ out-of-order side effects. Confirm how backfills are run and bounded.
28
+ 4. **Data quality** — null/uniqueness/referential tests, row-count and freshness checks, and
29
+ what happens on failure (block vs warn). Add or update tests for the change.
30
+ 5. **Cost & scale** — scan/partition pruning, avoid full-table rewrites, and watch warehouse
31
+ compute/credits for big backfills.
32
+
33
+ ## Build & CLI tools
34
+
35
+ - `dbt run`/`dbt test`/`dbt build` (with `--select` to scope), `airflow dags test`/`tasks test`,
36
+ `dagster job execute`, `spark-submit`/`pyspark`. Prefer the project's wrapper/Makefile.
37
+ - Validate transforms on a dev schema/sample before touching production datasets.
38
+
39
+ ## What to record before coding
40
+
41
+ - The engine/dialect and the exact models/DAGs you will change.
42
+ - Schema/contract changes and the downstream consumers to coordinate with.
43
+ - The idempotency/partition strategy and how a backfill will be scoped and rolled back.
44
+ - The `dbt test`/DAG-test/data-quality commands that prove the change is correct.
45
+
46
+ Don't broaden the change beyond the task — no incidental model refactors or schema churn on
47
+ unrelated tables (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: desktop
3
+ title: Cross-Platform Desktop (Electron / Tauri / Qt) Intake
4
+ description: Before changing desktop-app code, retrieve current framework versions, the process/IPC and security model, packaging/auto-update guidance, and the right build/run CLI commands across OSes — like a senior desktop engineer briefing themselves.
5
+ triggers:
6
+ keywords: [electron, tauri, qt, qml, gtk, wxwidgets, "desktop app", "system tray", ipc, "main process", "renderer process", webview, "auto-update", "code signing", notarization]
7
+ globs: ["tauri.conf.json", "*.qml", "*.pro", "CMakeLists.txt.user", "electron-builder.yml", "electron-builder.json", "forge.config.js", "*.desktop"]
8
+ ---
9
+
10
+ # Cross-Platform Desktop (Electron / Tauri / Qt) Intake
11
+
12
+ Do this **before** writing or changing desktop-app code. Don't rely on training data — these
13
+ frameworks change their process and security models, and a desktop app must build, sign, and
14
+ behave correctly across Windows, macOS, and Linux. Confirm against the framework's current docs
15
+ and the project's own pinned versions.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Framework & version in use** — Electron (version, `package.json`), Tauri (`tauri.conf.json`,
20
+ Rust + WebView2/WKWebView), or Qt (version, Widgets vs QML). Match what's there.
21
+ 2. **Process & IPC model** — main/renderer (Electron) or core/WebView (Tauri) boundaries, and the
22
+ IPC surface. Keep the boundary explicit; validate everything crossing it.
23
+ 3. **Security** — Electron: `contextIsolation` on, `nodeIntegration` off, a `contextBridge`
24
+ preload, and a strict CSP; Tauri: the allowlist/capabilities scoped to the minimum. Never
25
+ expose Node/shell/filesystem broadly to the renderer; treat loaded web content as untrusted.
26
+ 4. **Platform integration** — file dialogs, tray, notifications, menus, deep links, and
27
+ permissions differ per OS. Implement and test the ones this change touches on each target.
28
+ 5. **Packaging & updates** — code signing (Windows Authenticode, macOS notarization), the
29
+ installer format, and the auto-update channel. A change can silently break signing or updates.
30
+
31
+ ## Build & CLI tools
32
+
33
+ - Electron: `npm`/`pnpm` scripts, `electron .`, `electron-builder`/`electron-forge make`, Spectron/
34
+ Playwright for e2e.
35
+ - Tauri: `cargo tauri dev`/`cargo tauri build`, plus the frontend's own build.
36
+ - Qt: `qmake`/`cmake` + `make`/`ninja`, `windeployqt`/`macdeployqt`, `ctest`.
37
+
38
+ ## What to record before coding
39
+
40
+ - The framework + version and the OS targets you must support.
41
+ - The IPC surface touched and the security settings (isolation/allowlist/CSP) that must hold.
42
+ - The platform-integration features changed and how they're tested per OS.
43
+ - The build/sign/package commands and tests that prove the change works and still ships.
44
+
45
+ Don't broaden the change beyond the task — no incidental framework upgrades or weakening the
46
+ security model for convenience (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: devops
3
+ title: DevOps / Infrastructure-as-Code / CI-CD Intake
4
+ description: Before changing infrastructure, pipelines, or deployment config, retrieve current provider/tool versions, security and least-privilege guidance, state/secret handling, and the right plan/apply CLI commands — like a senior platform engineer briefing themselves.
5
+ triggers:
6
+ keywords: [devops, terraform, opentofu, kubernetes, helm, kustomize, ansible, pulumi, cloudformation, bicep, gitops, argocd, infrastructure, "infrastructure as code", iac, provisioning, deployment, "ci/cd", cicd, jenkins, "github actions", iam, "least privilege"]
7
+ globs: ["*.tf", "*.tfvars", "Chart.yaml", "kustomization.yaml", "kustomization.yml", "Jenkinsfile", "*.bicep", "playbook.yml", "ansible.cfg", "skaffold.yaml", "argocd*.yaml", "*.hcl"]
8
+ ---
9
+
10
+ # DevOps / Infrastructure-as-Code / CI-CD Intake
11
+
12
+ Do this **before** changing infrastructure, pipelines, or deployment config. Don't rely
13
+ on training data — providers, modules, and runner images change fast, and an insecure or
14
+ deprecated default can be costly. Confirm against the provider/tool's current docs and the
15
+ project's own pinned versions and state.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Tool & provider versions in use** — read the version pins (`required_version`,
20
+ `required_providers`, `Chart.yaml`/`appVersion`, action `uses: @vX`, runner image,
21
+ k8s API versions) and any lockfile (`.terraform.lock.hcl`). Match what's already there.
22
+ 2. **State & backends** — where state lives (remote backend, workspace, locking). Never run
23
+ a destructive `apply`/`destroy` blindly; read the plan first and understand what changes.
24
+ 3. **Deprecations & breaking changes** — between the pinned versions and current (provider
25
+ resource renames, removed k8s APIs, deprecated action inputs, runner image changes). List
26
+ the ones this change touches and their replacements.
27
+ 4. **Security & least privilege** — IAM/roles scoped to the minimum needed, no wildcard
28
+ permissions, secrets from a vault/secret store (never committed), network/ingress locked
29
+ down, and encrypted state/storage. Check the provider's current security guidance.
30
+ 5. **Blast radius** — what this change can take down (shared modules, prod vs staging
31
+ workspace, a pipeline that gates deploys). Prefer a dry run / plan and a staged rollout.
32
+
33
+ ## Build & CLI tools
34
+
35
+ - `terraform`/`tofu plan|apply`, `kubectl`/`helm`/`kustomize`, `ansible-playbook --check`,
36
+ `pulumi preview`, `aws`/`gcloud`/`az` CLIs — use the project's wrapper/Makefile if present.
37
+ - Validate before applying: `terraform validate`/`fmt`, `helm lint`/`template`, `kubeval`,
38
+ `actionlint`, and a CI dry run.
39
+
40
+ ## What to record before coding
41
+
42
+ - The pinned versions and provider/module sources you will use.
43
+ - Deprecated resources/APIs to avoid and their replacements, with migration steps.
44
+ - The plan/preview output and the blast radius, plus how you'll roll back.
45
+ - The validate/plan commands that prove the change is safe before apply.
46
+
47
+ Don't broaden the change beyond the task — no incidental provider upgrades or touching
48
+ unrelated modules/environments (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: game-dev
3
+ title: Game Development (Unity / Unreal / Godot) Intake
4
+ description: Before changing game code, retrieve current engine versions, the frame-loop and performance budget, asset/scene conventions, and the right build/play CLI commands — like a senior game engineer briefing themselves on the engine and project.
5
+ triggers:
6
+ keywords: [unity, unreal, "unreal engine", godot, gameplay, gamedev, "game engine", "game loop", shader, hlsl, glsl, ecs, dots, "frame rate", physics, collider, gdscript]
7
+ globs: ["*.unity", "*.uproject", "*.uplugin", "project.godot", "*.gd", "*.tscn", "*.tres", "Assets", "ProjectSettings"]
8
+ ---
9
+
10
+ # Game Development (Unity / Unreal / Godot) Intake
11
+
12
+ Do this **before** writing or changing game code. Don't rely on training data — engine APIs
13
+ and recommended patterns change between major versions, and gameplay code runs every frame so
14
+ small mistakes show up as stutter or crashes. Confirm against the engine's current docs and the
15
+ project's own version and conventions.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Engine & version in use** — Unity (`ProjectSettings/ProjectVersion.txt`, render pipeline
20
+ URP/HDRP/Built-in, input system), Unreal (`.uproject` engine association, Blueprint vs C++),
21
+ or Godot (`project.godot`, Godot 3 vs 4, GDScript vs C#/GDExtension). Match it exactly.
22
+ 2. **The frame loop & budget** — what runs per-frame (`Update`/`Tick`/`_process`) vs fixed-step
23
+ physics (`FixedUpdate`/`_physics_process`). Keep per-frame work cheap; respect the target
24
+ frame rate and platform budget (mobile/console/VR are tighter).
25
+ 3. **Allocations & GC** — avoid per-frame allocations (no `new`/LINQ in `Update`, pool objects);
26
+ GC spikes cause hitches. In Unreal, mind UObject lifetime/GC and `TWeakObjectPtr`.
27
+ 4. **Scenes, prefabs & assets** — follow the project's scene/prefab/asset layout; serialized
28
+ fields and `.meta`/GUID references are easy to break. Don't reformat scene/asset files by hand.
29
+ 5. **Determinism & netcode** — if gameplay is networked or replay-based, keep simulation
30
+ deterministic and authority/replication correct.
31
+
32
+ ## Build & CLI tools
33
+
34
+ - Unity: batch mode `Unity -batchmode -runTests`/`-buildTarget`, the Test Runner, the Profiler.
35
+ - Unreal: `UnrealBuildTool`/`RunUAT BuildCookRun`, Automation tests, Unreal Insights.
36
+ - Godot: `godot --headless --export-release`, `godot --headless --run-tests` / GUT.
37
+
38
+ ## What to record before coding
39
+
40
+ - The engine + version, render pipeline / scripting backend, and target platform budget.
41
+ - The per-frame vs fixed-step work the change adds, and how you keep it allocation-light.
42
+ - The scenes/prefabs/assets touched and any serialized references at risk.
43
+ - The build/play/test commands (and a profiler check) that prove performance and correctness.
44
+
45
+ Don't broaden the change beyond the task — no incidental engine upgrades or scene-wide edits
46
+ (see the surgical-changes rule in core-engineering).
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: ios
3
+ title: iOS / Apple Platform Development Intake
4
+ description: Before writing iOS/macOS code, retrieve current Swift/SwiftUI/Xcode versions, deployment targets, deprecations, recommended frameworks, and the right CLI/build tools — like a senior Apple-platform engineer.
5
+ triggers:
6
+ keywords: [ios, ipados, macos, swift, swiftui, uikit, xcode, cocoapods, spm, swiftpm, combine]
7
+ globs: ["*.swift", "*.xcodeproj", "*.xcworkspace", "Podfile", "Package.swift", "*.entitlements", "Info.plist"]
8
+ ---
9
+
10
+ # iOS / Apple Platform Development Intake
11
+
12
+ Do this **before** writing or changing Swift/iOS code. Confirm against
13
+ `developer.apple.com`, the Xcode/Swift release notes, and the project's own settings —
14
+ Apple deprecates APIs aggressively and gates features on OS version.
15
+
16
+ ## Establish current state first
17
+
18
+ 1. **Toolchain & targets** — read the Xcode project / `Package.swift` / `Podfile`:
19
+ Swift language version, Xcode version, iOS/macOS **deployment target**, and the
20
+ dependency manager (Swift Package Manager vs CocoaPods — prefer SPM for new work).
21
+ 2. **Latest OS & SDK** — the current iOS/macOS release, its SDK, and notable
22
+ behavior/privacy changes (App Tracking Transparency, privacy manifests, required
23
+ reason APIs). Note what gates this task.
24
+ 3. **Deprecations & availability** — APIs deprecated or unavailable below the
25
+ deployment target. Use `@available` / `if #available` correctly rather than
26
+ assuming an API exists. Common shifts: UIKit → SwiftUI patterns, `NSUserActivity`,
27
+ completion handlers → `async/await`, Combine → Swift Concurrency / Observation.
28
+ 4. **Recommended frameworks** — SwiftUI (+ Observation `@Observable`), Swift
29
+ Concurrency (`async/await`, actors), SwiftData vs Core Data, the current navigation
30
+ API. Confirm the recommended approach for the deployment target.
31
+ 5. **Guidelines** — Human Interface Guidelines, accessibility (Dynamic Type,
32
+ VoiceOver), and App Store / privacy requirements relevant to the change.
33
+
34
+ ## Build & CLI tools
35
+
36
+ - `xcodebuild` for builds/tests/archives; `xcrun simctl` for simulators.
37
+ - `swift build` / `swift test` for SwiftPM targets; `swiftformat`/`swiftlint` if configured.
38
+ - Instruments for profiling.
39
+
40
+ ## What to record before coding
41
+
42
+ - Swift version, deployment target, and dependency-manager choice.
43
+ - Deprecated/unavailable APIs to avoid and their `@available`-guarded replacements.
44
+ - The build/test commands you will run (`xcodebuild test -scheme … -destination …`,
45
+ or `swift test`) so the change is verifiable.
46
+
47
+ Match the paradigm of the file you're editing (UIKit vs SwiftUI); don't rewrite
48
+ unrelated screens as a side effect.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: mobile-cross-platform
3
+ title: Cross-Platform Mobile (Flutter / React Native) Intake
4
+ description: Before changing Flutter or React Native code, retrieve current SDK/framework versions, platform-channel and native-module guidance, deprecations, and the right build/run CLI commands for both iOS and Android — like a senior cross-platform mobile engineer briefing themselves.
5
+ triggers:
6
+ keywords: [flutter, dart, "react native", "react-native", expo, "cross-platform mobile", cupertino]
7
+ globs: ["pubspec.yaml", "pubspec.lock", "*.dart", "metro.config.js", "app.config.js", "app.config.ts", "react-native.config.js", "expo.json"]
8
+ ---
9
+
10
+ # Cross-Platform Mobile (Flutter / React Native) Intake
11
+
12
+ Do this **before** writing or changing Flutter/React Native code. Don't rely on training
13
+ data — these frameworks and their native toolchains move quickly, and a change that builds
14
+ on one platform can break the other. Confirm against the framework's current docs and the
15
+ project's own pinned versions.
16
+
17
+ ## Establish current state first
18
+
19
+ 1. **Framework & SDK versions in use** — Flutter/Dart SDK from `pubspec.yaml` and
20
+ `.fvm`/`flutter --version`; React Native / Expo from `package.json` and the RN/Expo release
21
+ notes. Note the JS engine (Hermes) and architecture (new arch / Fabric / TurboModules).
22
+ 2. **Both native platforms** — iOS (CocoaPods/SPM, min iOS, Xcode) and Android (Gradle/AGP,
23
+ min/target SDK). A dependency or native change must build and run on **both**.
24
+ 3. **Deprecations & breaking changes** — between the pinned versions and current (Flutter API
25
+ removals, RN bridge → JSI/TurboModules, deprecated Expo modules). List what this change touches.
26
+ 4. **State & navigation** — match the project's existing approach (Riverpod/Bloc/Provider for
27
+ Flutter; Redux/Zustand/Context + React Navigation/Expo Router for RN); don't introduce a new one.
28
+ 5. **Native interop** — if the change needs platform code, use the current channel/module API
29
+ (Flutter platform channels / Pigeon; RN TurboModules/native modules) and implement both sides.
30
+
31
+ ## Build & CLI tools
32
+
33
+ - Flutter: `flutter pub get`, `flutter run`, `flutter build apk|ios`, `flutter test`,
34
+ `flutter analyze`, `dart format`.
35
+ - React Native / Expo: `npm`/`yarn`/`pnpm`, `npx react-native run-android|run-ios`,
36
+ `pod install` (iOS), `npx expo start`, `eas build`, `npm test`.
37
+
38
+ ## What to record before coding
39
+
40
+ - The framework/SDK versions and the iOS/Android minimums you must support.
41
+ - Deprecated APIs to avoid and their modern replacements, with migration steps.
42
+ - The state/navigation libraries already in use, and any native-module work needed on both sides.
43
+ - The build/test/analyze commands you will run on both platforms to prove the change works.
44
+
45
+ If the project mixes platform-specific code, match the file you're editing; don't migrate
46
+ unrelated screens as a side effect (see the surgical-changes rule in core-engineering).