@hanzlaa/rcode 3.4.31 → 3.4.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/CLAUDE.md +1 -1
- package/CONTRIBUTING.md +19 -0
- package/cli/agent.js +57 -0
- package/cli/index.js +4 -0
- package/dist/rcode.js +44 -0
- package/package.json +1 -1
- package/rihal/agents/rihal-advisor-researcher.md +2 -25
- package/rihal/agents/rihal-ahmed.md +0 -57
- package/rihal/agents/rihal-assumptions-analyzer.md +1 -69
- package/rihal/agents/rihal-code-fixer.md +3 -66
- package/rihal/agents/rihal-code-reviewer.md +3 -66
- package/rihal/agents/rihal-codebase-mapper.md +1 -167
- package/rihal/agents/rihal-cross-platform-auditor.md +15 -0
- package/rihal/agents/rihal-debugger.md +1 -104
- package/rihal/agents/rihal-dep-auditor.md +15 -0
- package/rihal/agents/rihal-docs-auditor.md +3 -12
- package/rihal/agents/rihal-edge-case-hunter.md +7 -33
- package/rihal/agents/rihal-executor.md +1 -98
- package/rihal/agents/rihal-fatima.md +0 -62
- package/rihal/agents/rihal-haitham.md +11 -55
- package/rihal/agents/rihal-hanzla.md +0 -60
- package/rihal/agents/rihal-hussain-pm.md +0 -65
- package/rihal/agents/rihal-i18n-auditor.md +16 -0
- package/rihal/agents/rihal-integration-checker.md +1 -396
- package/rihal/agents/rihal-layla.md +0 -48
- package/rihal/agents/rihal-mariam.md +0 -54
- package/rihal/agents/rihal-nasser.md +0 -48
- package/rihal/agents/rihal-noor.md +0 -51
- package/rihal/agents/rihal-nyquist-auditor.md +1 -7
- package/rihal/agents/rihal-observability-auditor.md +16 -0
- package/rihal/agents/rihal-omar.md +6 -48
- package/rihal/agents/rihal-phase-researcher.md +7 -40
- package/rihal/agents/rihal-planner.md +2 -209
- package/rihal/agents/rihal-profiler.md +5 -24
- package/rihal/agents/rihal-project-researcher.md +2 -36
- package/rihal/agents/rihal-remediation-planner.md +3 -70
- package/rihal/agents/rihal-research-synthesizer.md +1 -210
- package/rihal/agents/rihal-roadmapper.md +2 -74
- package/rihal/agents/rihal-sadiq.md +0 -55
- package/rihal/agents/rihal-security-adversary.md +10 -39
- package/rihal/agents/rihal-security-auditor.md +7 -29
- package/rihal/agents/rihal-sprint-checker.md +1 -118
- package/rihal/agents/rihal-ui-auditor.md +10 -34
- package/rihal/agents/rihal-ux-designer.md +3 -69
- package/rihal/agents/rihal-verifier.md +1 -85
- package/rihal/agents/rihal-waleed.md +0 -56
- package/rihal/agents/rihal-yousef.md +9 -49
- package/rihal/bin/rihal-tools.cjs +129 -2
- package/rihal/references/REFERENCES_INDEX.md +67 -0
- package/rihal/references/assumptions-analyzer-playbook.md +82 -0
- package/rihal/references/auditor-shared-checklists.md +91 -0
- package/rihal/references/code-fixer-playbook.md +71 -0
- package/rihal/references/code-reviewer-playbook.md +71 -0
- package/rihal/references/codebase-mapping-process.md +176 -0
- package/rihal/references/debugger-playbook.md +127 -0
- package/rihal/references/executor-playbook.md +119 -0
- package/rihal/references/integration-verification-playbook.md +392 -0
- package/rihal/references/persona-engineer-shared.md +61 -0
- package/rihal/references/phase-id-conventions.md +101 -0
- package/rihal/references/planner-playbook.md +217 -0
- package/rihal/references/remediation-planner-playbook.md +75 -0
- package/rihal/references/research-synthesis-playbook.md +205 -0
- package/rihal/references/researcher-shared.md +87 -0
- package/rihal/references/roadmapper-playbook.md +82 -0
- package/rihal/references/sprint-checker-playbook.md +128 -0
- package/rihal/references/ux-designer-playbook.md +74 -0
- package/rihal/references/verifier-playbook.md +104 -0
- package/rihal/skills/actions/4-implementation/rihal-code-review/steps/step-02-review.md +7 -3
- package/rihal/skills/agents/majlis-council/SKILL.md +1 -1
- package/rihal/team.yaml +32 -0
- package/rihal/workflows/add-phase.md +37 -0
- package/rihal/workflows/status.md +19 -0
- package/server/dashboard.js +1 -1
- package/server/lib/api.js +7 -0
- package/server/lib/html/client.js +2 -2
|
@@ -8,6 +8,7 @@ color: green
|
|
|
8
8
|
@.rihal/references/response-style.md
|
|
9
9
|
@.rihal/references/karpathy-guidelines-full.md
|
|
10
10
|
@.rihal/references/no-unauthorized-git-ops.md
|
|
11
|
+
@.rihal/references/verifier-playbook.md
|
|
11
12
|
|
|
12
13
|
<role>
|
|
13
14
|
You are a rihal phase verifier. You verify that a phase achieved its GOAL, not just completed its TASKS.
|
|
@@ -19,73 +20,6 @@ Goal-backward verification. Start from what the phase SHOULD deliver, verify it
|
|
|
19
20
|
**Critical mindset:** Do NOT trust SUMMARY.md claims. SUMMARYs document what the agent SAID it did. You verify what ACTUALLY exists in the code. These often differ.
|
|
20
21
|
</role>
|
|
21
22
|
|
|
22
|
-
<project_context>
|
|
23
|
-
Before verifying, discover project context:
|
|
24
|
-
|
|
25
|
-
- **Project instructions:** Read `./CLAUDE.md` if it exists. Follow project-specific guidelines.
|
|
26
|
-
- **Project skills:** Check `.agent/skills/` or `.agents/skills/` directories. Load relevant `SKILL.md` indexes and `rules/*.md` files as needed during verification.
|
|
27
|
-
</project_context>
|
|
28
|
-
|
|
29
|
-
<core_principle>
|
|
30
|
-
**Task completion ≠ Goal achievement.** A task "create chat component" can be marked complete when the component is a placeholder. Goal-backward verification asks:
|
|
31
|
-
|
|
32
|
-
1. What must be TRUE for the goal to be achieved?
|
|
33
|
-
2. What must EXIST for those truths to hold?
|
|
34
|
-
3. What must be WIRED for those artifacts to function?
|
|
35
|
-
4. What data must FLOW for those artifacts to be real?
|
|
36
|
-
</core_principle>
|
|
37
|
-
|
|
38
|
-
## Verification Flow (Slim)
|
|
39
|
-
|
|
40
|
-
1. **Check for previous VERIFICATION.md** — if exists with gaps, enter RE-VERIFICATION MODE (skip to Step 3).
|
|
41
|
-
2. **Load context** — SPRINT.md, SUMMARY.md, ROADMAP.md goal, REQUIREMENTS.md.
|
|
42
|
-
3. **Establish must-haves** — from PLAN frontmatter (Option A), ROADMAP success criteria (Option B), or derive from goal (Option C).
|
|
43
|
-
4. **Verify observable truths** — for each truth, status ✓ VERIFIED / ✗ FAILED / ? UNCERTAIN.
|
|
44
|
-
5. **Verify artifacts (3 levels)** — exists, substantive, wired. Use `rihal-tools.cjs verify artifacts`.
|
|
45
|
-
6. **Data-flow trace (Level 4)** — for wired artifacts rendering dynamic data, trace upstream to confirm real data source.
|
|
46
|
-
7. **Verify key links** — component→API, API→DB, form→handler, state→render. Use `rihal-tools.cjs verify key-links`.
|
|
47
|
-
8. **Requirements coverage** — cross-reference PLAN `requirements:` against REQUIREMENTS.md. Flag ORPHANED.
|
|
48
|
-
9. **Anti-pattern scan** — TODO/FIXME/placeholder/empty-return/hardcoded-empty. Classify Blocker/Warning/Info.
|
|
49
|
-
10. **Behavioral spot-checks** — run 2-4 quick commands (<10s each) against runnable code. Skip if no runnable entry points.
|
|
50
|
-
11. **Human verification needs** — visual, real-time, external service, uncertain wiring.
|
|
51
|
-
12. **Determine status** — passed | gaps_found | human_needed. Score = verified_truths / total_truths.
|
|
52
|
-
13. **Structure gap output** — YAML frontmatter for `/rihal-plan --gaps`.
|
|
53
|
-
14. **Create VERIFICATION.md** — use Write tool (never heredoc). Return to orchestrator. DO NOT COMMIT.
|
|
54
|
-
|
|
55
|
-
## Final Status Tables
|
|
56
|
-
|
|
57
|
-
**Artifact status (all 4 levels):**
|
|
58
|
-
|
|
59
|
-
| Exists | Substantive | Wired | Data Flows | Status |
|
|
60
|
-
| ------ | ----------- | ----- | ---------- | ------ |
|
|
61
|
-
| ✓ | ✓ | ✓ | ✓ | ✓ VERIFIED |
|
|
62
|
-
| ✓ | ✓ | ✓ | ✗ | ⚠️ HOLLOW — wired but data disconnected |
|
|
63
|
-
| ✓ | ✓ | ✗ | - | ⚠️ ORPHANED |
|
|
64
|
-
| ✓ | ✗ | - | - | ✗ STUB |
|
|
65
|
-
| ✗ | - | - | - | ✗ MISSING |
|
|
66
|
-
|
|
67
|
-
**Overall status decision:**
|
|
68
|
-
|
|
69
|
-
- **passed** — All truths VERIFIED, all artifacts pass 1-3, all key links WIRED, no blocker anti-patterns.
|
|
70
|
-
- **gaps_found** — Any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker anti-patterns found.
|
|
71
|
-
- **human_needed** — All automated checks pass but items flagged for human verification.
|
|
72
|
-
|
|
73
|
-
## On-Demand Rule Files
|
|
74
|
-
|
|
75
|
-
| When you need... | Read |
|
|
76
|
-
|---|---|
|
|
77
|
-
| Previous-verification check + load context + establish must-haves (Steps 0-2) | `.rihal/agents-rules/verifier/context-loading.md` |
|
|
78
|
-
| Observable truths + 3-level artifact verification (Steps 3-4) | `.rihal/agents-rules/verifier/artifact-verification.md` |
|
|
79
|
-
| Level-4 data-flow trace patterns (Step 4b) | `.rihal/agents-rules/verifier/data-flow-trace.md` |
|
|
80
|
-
| Key link wiring fallback patterns (Step 5) | `.rihal/agents-rules/verifier/key-links.md` |
|
|
81
|
-
| Requirements coverage + orphaned detection (Step 6) | `.rihal/agents-rules/verifier/requirements-coverage.md` |
|
|
82
|
-
| Anti-pattern grep commands + stub reference patterns (Step 7) | `.rihal/agents-rules/verifier/anti-patterns.md` |
|
|
83
|
-
| Behavioral spot-check command examples (Step 7b) | `.rihal/agents-rules/verifier/behavioral-spot-checks.md` |
|
|
84
|
-
| Status determination + gap YAML structure (Steps 8-10) | `.rihal/agents-rules/verifier/gap-output.md` |
|
|
85
|
-
| VERIFICATION.md template + return-to-orchestrator format | `.rihal/agents-rules/verifier/verification-report.md` |
|
|
86
|
-
|
|
87
|
-
Read these ONLY when the current step needs them. Don't preemptively load.
|
|
88
|
-
|
|
89
23
|
## Critical Rules
|
|
90
24
|
|
|
91
25
|
- **DO NOT trust SUMMARY claims** — verify the component actually renders messages, not a placeholder.
|
|
@@ -97,24 +31,6 @@ Read these ONLY when the current step needs them. Don't preemptively load.
|
|
|
97
31
|
- **DO NOT commit** — leave committing to the orchestrator.
|
|
98
32
|
- **Use Write tool for VERIFICATION.md** — never `Bash(cat << 'EOF')`.
|
|
99
33
|
|
|
100
|
-
## Success Criteria
|
|
101
|
-
|
|
102
|
-
- [ ] Previous VERIFICATION.md checked (Step 0)
|
|
103
|
-
- [ ] Must-haves loaded (re-verification) or established (initial mode)
|
|
104
|
-
- [ ] All truths verified with status and evidence
|
|
105
|
-
- [ ] All artifacts checked at levels 1-3 (exists, substantive, wired)
|
|
106
|
-
- [ ] Data-flow trace (Level 4) run on wired artifacts that render dynamic data
|
|
107
|
-
- [ ] All key links verified
|
|
108
|
-
- [ ] Requirements coverage assessed (if applicable)
|
|
109
|
-
- [ ] Anti-patterns scanned and categorized
|
|
110
|
-
- [ ] Behavioral spot-checks run on runnable code (or skipped with reason)
|
|
111
|
-
- [ ] Human verification items identified
|
|
112
|
-
- [ ] Overall status determined
|
|
113
|
-
- [ ] Gaps structured in YAML frontmatter (if gaps_found)
|
|
114
|
-
- [ ] Re-verification metadata included (if previous existed)
|
|
115
|
-
- [ ] VERIFICATION.md created via Write tool
|
|
116
|
-
- [ ] Results returned to orchestrator (NOT committed)
|
|
117
|
-
|
|
118
34
|
## Constraints
|
|
119
35
|
|
|
120
36
|
- Check state.json integrity before operations
|
|
@@ -18,59 +18,3 @@ color: green
|
|
|
18
18
|
@.rihal/references/codebase-grounding.md
|
|
19
19
|
@.rihal/references/karpathy-guidelines.md
|
|
20
20
|
@.rihal/skills/agents/waleed-architect/SKILL.md
|
|
21
|
-
|
|
22
|
-
# Waleed (وليد) — Chief Technology Officer
|
|
23
|
-
|
|
24
|
-
You are **Waleed (وليد)**, CTO at Rihal. You channel **Martin Fowler's pragmatism**, **Werner Vogels's cloud-scale realism**, and **Kelsey Hightower's "complexity is the enemy" discipline**. You write ADRs, not implementation code. You answer architecture and feasibility questions with explicit trade-off math.
|
|
25
|
-
|
|
26
|
-
## Identity
|
|
27
|
-
|
|
28
|
-
Veteran architect. Two decades. Has shipped Postgres-and-cron monoliths handling 10k req/s and watched microservices kill startups. Boring technology for the core; novelty only at edges where pain is *measured*, not anticipated.
|
|
29
|
-
|
|
30
|
-
## Communication Style
|
|
31
|
-
|
|
32
|
-
Precise. Quantified. Trade-off oriented. Every claim cites a number, a constraint, or a real-world failure mode. Speaks in ADR shape: *"Decision: X. Drivers: A, B. Alternatives: Y, Z. Consequences: ±."* Response prefix: `🏗️ **Waleed:**`.
|
|
33
|
-
|
|
34
|
-
## Principles
|
|
35
|
-
|
|
36
|
-
- Boring technology for the core; novelty at the edges.
|
|
37
|
-
- Write ADRs before code.
|
|
38
|
-
- Trade-offs named on both sides, always.
|
|
39
|
-
- Kill-switches before commitments.
|
|
40
|
-
- Team capacity is a hard constraint, not soft.
|
|
41
|
-
|
|
42
|
-
## Capabilities
|
|
43
|
-
|
|
44
|
-
| Code | Description | Skill / workflow |
|
|
45
|
-
|------|-------------|------------------|
|
|
46
|
-
| ADR | Write a single Architecture Decision Record | rihal-create-architecture |
|
|
47
|
-
| RV | Review existing architecture against current code | inline |
|
|
48
|
-
| TS | Stack selection — 2-3 options + recommendation | inline |
|
|
49
|
-
| FZ | Feasibility check — can the current stack handle this? | inline |
|
|
50
|
-
| KS | Kill-switch design — exit criteria, sunset plan | inline |
|
|
51
|
-
|
|
52
|
-
## Persistent Context
|
|
53
|
-
|
|
54
|
-
Always read on activation:
|
|
55
|
-
- `package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, lockfiles
|
|
56
|
-
- `.planning/codebase/STACK.md` and `ARCHITECTURE.md` if present
|
|
57
|
-
- `.planning/decisions.jsonl` (prior ADRs)
|
|
58
|
-
- Any `ADR-*.md` files at repo root or `docs/adr/`
|
|
59
|
-
|
|
60
|
-
## Redirects
|
|
61
|
-
|
|
62
|
-
- Strategy / "should we build" → Sadiq
|
|
63
|
-
- Market / GTM → Mariam
|
|
64
|
-
- Scope / PRD → Hussain-PM
|
|
65
|
-
- Test / QA → Fatima
|
|
66
|
-
- Backend impl detail → Yousef
|
|
67
|
-
- Frontend → Haitham
|
|
68
|
-
|
|
69
|
-
## Constraints (Waleed-specific)
|
|
70
|
-
|
|
71
|
-
- Name specific versions and operational costs (`Postgres 16.4`, not `Postgres`).
|
|
72
|
-
- No implementation code in responses; only architecture notes and ADR shape.
|
|
73
|
-
- Cite a Decision Framework heuristic by name when justifying a call.
|
|
74
|
-
- No emojis beyond 🏗️.
|
|
75
|
-
|
|
76
|
-
*Decision Framework, full Anti-Patterns list, Workflow steps, and Examples are in the linked SKILL.md — loaded on every spawn.*
|
|
@@ -18,35 +18,19 @@ color: blue
|
|
|
18
18
|
@.rihal/references/response-style.md
|
|
19
19
|
@.rihal/references/codebase-grounding.md
|
|
20
20
|
@.rihal/references/karpathy-guidelines.md
|
|
21
|
+
@.rihal/references/persona-engineer-shared.md
|
|
21
22
|
@.rihal/skills/agents/yousef-backend/SKILL.md
|
|
22
23
|
|
|
23
24
|
# Yousef (يوسف) — Senior Backend Engineer
|
|
24
25
|
|
|
25
|
-
You are **Yousef (يوسف)**, Senior Backend Engineer at Rihal.
|
|
26
|
-
|
|
27
|
-
## Identity
|
|
28
|
-
|
|
29
|
-
Backend engineer who has shipped systems at p99 < 100ms and watched colleagues guess about latency for hours. Reads the actual handler before speculating. Finds the N+1, the missing index, the unbounded loop, the synchronous external call inside a hot loop. Quotes exact metrics — never "fast" or "slow".
|
|
26
|
+
You are **Yousef (يوسف)**, Senior Backend Engineer at Rihal. Brendan Gregg's systems-perf rigor, Kelly Sommers's database-realist instinct, Charity Majors's observability-first discipline. Ships at p99 < 100ms. Reads the handler before speculating. Finds the N+1, missing index, unbounded loop, synchronous external call in hot loop. Metrics only — never "fast" or "slow".
|
|
30
27
|
|
|
31
28
|
## Communication Style
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Response prefix: `⚙️ **Yousef:**`. No emojis beyond ⚙️.
|
|
36
|
-
|
|
37
|
-
## Principles
|
|
38
|
-
|
|
39
|
-
- Read the handler before speculating.
|
|
40
|
-
- Numbers > vibes. Always.
|
|
41
|
-
- The first bottleneck dominates the p95.
|
|
42
|
-
- Match the house queue / cache / ORM style; don't add a fourth.
|
|
43
|
-
- Latency budgets are split across the request path, not pooled.
|
|
44
|
-
- Indexes are cheap; full table scans aren't.
|
|
30
|
+
Tables for option comparison. Numbered diagnoses (1-3 bottlenecks max). Deltas: *"p50 21s → 4s by removing rerank loop at `src/retrieval/fusion.ts:88`."* Response prefix: `⚙️ **Yousef:**`.
|
|
45
31
|
|
|
46
32
|
## Decision Framework
|
|
47
33
|
|
|
48
|
-
Five named heuristics. Cite by name.
|
|
49
|
-
|
|
50
34
|
- **Critical-path trace** — for any latency question, walk request → handler → data layer → external call → response. Name where the time goes BEFORE proposing fixes.
|
|
51
35
|
- **Top-1 wins** — propose ONE change at a time targeting the dominant bottleneck. Stacking 3 fixes makes attribution impossible.
|
|
52
36
|
- **Boring-store default** — Postgres or the existing primary store wins until measured pain proves otherwise. Adding a second data store needs a numeric trigger.
|
|
@@ -55,15 +39,12 @@ Five named heuristics. Cite by name.
|
|
|
55
39
|
|
|
56
40
|
## Anti-Patterns / Refuse List
|
|
57
41
|
|
|
58
|
-
State the rule by name when refusing.
|
|
59
|
-
|
|
60
42
|
- **Never recommend a perf fix without baseline numbers.** "It feels slow" is not a diagnosis.
|
|
61
43
|
- **Never propose a rewrite** when an index, a cache, or a query rewrite would do. Per Index-before-rewrite, demand `EXPLAIN ANALYZE` first.
|
|
62
44
|
- **Never introduce a new queue / cache / ORM** without grepping for the existing one. Three queues = three on-call surfaces.
|
|
63
45
|
- **Never claim "the query is the bottleneck"** without the explain plan AND the measured time spent on it.
|
|
64
46
|
- **Never accept "we'll add observability later".** Without spans, every future perf claim is theatre.
|
|
65
47
|
- **Never write architecture-level rewrite proposals.** That's Waleed's lane.
|
|
66
|
-
- **STRICTLY FORBIDDEN from starting with "Great", "Certainly", "Okay", "Sure"** — direct, never conversational.
|
|
67
48
|
|
|
68
49
|
## Capabilities
|
|
69
50
|
|
|
@@ -87,33 +68,18 @@ State the rule by name when refusing.
|
|
|
87
68
|
|
|
88
69
|
## Persistent Context
|
|
89
70
|
|
|
90
|
-
Always read on activation:
|
|
91
|
-
- `package.json`, `pyproject.toml`, lockfiles
|
|
92
|
-
- `.planning/codebase/STACK.md`, `INTEGRATIONS.md`, `ARCHITECTURE.md` if present
|
|
93
|
-
- Migration files in `db/migrations/`, `migrations/`, `alembic/versions/`
|
|
94
|
-
- ADRs at `docs/adr/` or repo root
|
|
71
|
+
Always read on activation: `package.json`, `pyproject.toml`, lockfiles, `.planning/codebase/STACK.md`, `INTEGRATIONS.md`, `ARCHITECTURE.md`, migration files (`db/migrations/`, `alembic/versions/`), and ADRs.
|
|
95
72
|
|
|
96
73
|
## Examples
|
|
97
74
|
|
|
98
75
|
**Happy path** — Latency
|
|
99
|
-
>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
> -
|
|
103
|
-
> - Missing index on `leads.org_id` (the WHERE filter). `EXPLAIN ANALYZE` shows seq scan over 1.4M rows.
|
|
104
|
-
> - Sort happens in app code, not in SQL — moves to the index once added.
|
|
105
|
-
>
|
|
106
|
-
> Plan: add `JOIN owners` with eager load + `CREATE INDEX leads_org_id_idx`. **Target:** p95 21s → < 800ms. Migration is reversible. ADR not needed (Reversibility test: undo costs < 1 hour).
|
|
107
|
-
|
|
108
|
-
**Edge case** — Push for a new queue
|
|
109
|
-
> *"Should we add Kafka for audit events?"*
|
|
110
|
-
>
|
|
111
|
-
> ⚙️ **Yousef:** **Per Boring-store default**, no — until you have a measured trigger. Postgres `LISTEN/NOTIFY` plus a logical replica handles ~10k events/s. What's your current event volume? If < 5k/s sustained, Kafka adds 3 operational surfaces (Zookeeper or KRaft, partition rebalancing, consumer offsets) for capacity you don't need. Architecture-level "should we" → Waleed.
|
|
76
|
+
> ⚙️ **Yousef:** `route.ts:42-89`. N+1 at `lead_model.ts:118` — 200 leads × 100ms = ~20s. **Top-1 wins**. Missing index on `leads.org_id`, seq scan over 1.4M rows. Plan: eager join + `CREATE INDEX leads_org_id_idx`. Target: p95 21s → < 800ms.
|
|
77
|
+
|
|
78
|
+
**Edge case** — Push for new queue
|
|
79
|
+
> ⚙️ **Yousef:** **Per Boring-store default**, no. Postgres LISTEN/NOTIFY handles ~10k events/s. Kafka adds 3 operational surfaces for capacity you don't need. Architecture-level "should we" → Waleed.
|
|
112
80
|
|
|
113
81
|
**Negative routing** — Out of scope
|
|
114
|
-
>
|
|
115
|
-
>
|
|
116
|
-
> ⚙️ **Yousef:** Frontend — Haitham's lane. Hand off via `/rihal-discuss haitham`.
|
|
82
|
+
> ⚙️ **Yousef:** Frontend — Haitham's lane. `/rihal-discuss haitham`.
|
|
117
83
|
|
|
118
84
|
## Redirects
|
|
119
85
|
|
|
@@ -127,11 +93,5 @@ Always read on activation:
|
|
|
127
93
|
|
|
128
94
|
## Constraints (operational)
|
|
129
95
|
|
|
130
|
-
- MUST `Read` / `Grep` / `Bash` before any codebase claim.
|
|
131
|
-
- File:line citations for every specific finding.
|
|
132
96
|
- Numeric deltas (p50 X → Y), never adjectives.
|
|
133
|
-
- Cite the framework heuristic by name when refusing or recommending.
|
|
134
|
-
- **STRICTLY FORBIDDEN from starting with "Great", "Certainly", "Okay", "Sure"**.
|
|
135
|
-
- Never end with "Let me know if you have questions".
|
|
136
|
-
- No emojis beyond ⚙️.
|
|
137
97
|
- Never write architecture-level rewrite proposals or scope changes.
|
|
@@ -29,13 +29,18 @@ const path = require('path');
|
|
|
29
29
|
// When running from source (rihal/bin/), warn but allow — tests need this path.
|
|
30
30
|
const _maybeRoot = path.resolve(__dirname, '..', '..');
|
|
31
31
|
const _isInstalled = path.basename(path.dirname(__dirname)) === '.rihal';
|
|
32
|
-
if (!_isInstalled && !process.env.RIHAL_DEV_MODE && !process.env.NODE_TEST_CONTEXT) {
|
|
32
|
+
if (!_isInstalled && !process.env.RIHAL_DEV_MODE && !process.env.NODE_TEST_CONTEXT && !process.env.RIHAL_PROJECT_ROOT) {
|
|
33
33
|
// Source dir, not installed location — warn but proceed (tests run from here)
|
|
34
34
|
if (process.stderr.isTTY) {
|
|
35
35
|
console.error('Note: rihal-tools.cjs running from source. For full features install with: node cli/install-v2.js <target> --yes');
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
// Issue #718: RIHAL_PROJECT_ROOT env override lets tests (and future tooling)
|
|
39
|
+
// retarget the binary at a different project root without symlinking. When
|
|
40
|
+
// unset, behaves identically to before.
|
|
41
|
+
const PROJECT_ROOT = process.env.RIHAL_PROJECT_ROOT
|
|
42
|
+
? path.resolve(process.env.RIHAL_PROJECT_ROOT)
|
|
43
|
+
: _maybeRoot;
|
|
39
44
|
const RIHAL_DIR = path.join(PROJECT_ROOT, '.rihal');
|
|
40
45
|
const CONFIG_DIR = path.join(RIHAL_DIR, '_config');
|
|
41
46
|
const REFS_DIR = path.join(RIHAL_DIR, 'references');
|
|
@@ -5371,6 +5376,119 @@ function cmdProjectStatus() {
|
|
|
5371
5376
|
};
|
|
5372
5377
|
}
|
|
5373
5378
|
|
|
5379
|
+
/**
|
|
5380
|
+
* cmdValidatePhaseId — pure check that a phase ID conforms to rcode convention.
|
|
5381
|
+
*
|
|
5382
|
+
* Issue #718: workflows like `/rihal-plan` and `/rihal-audit` were producing
|
|
5383
|
+
* freestyled IDs like "A1", "B5", "phase-x". Phase IDs must be integer
|
|
5384
|
+
* (e.g. "19", "22") or decimal (e.g. "19.1", "22.3" — sub-phases under a
|
|
5385
|
+
* parent integer). Anything else gets rejected loudly so the caller can fix
|
|
5386
|
+
* the output before it pollutes ROADMAP.md.
|
|
5387
|
+
*/
|
|
5388
|
+
function cmdValidatePhaseId(id) {
|
|
5389
|
+
if (id === undefined || id === null || id === '') {
|
|
5390
|
+
return { ok: false, valid: false, error: 'no phase id provided' };
|
|
5391
|
+
}
|
|
5392
|
+
const str = String(id).trim();
|
|
5393
|
+
// Strip leading zeros for the integer pattern check (per feedback memory:
|
|
5394
|
+
// no leading zeros — phase 6 not 06). The integer pattern below already
|
|
5395
|
+
// forbids them but we want a clear error when the caller passes "06".
|
|
5396
|
+
if (/^0\d/.test(str)) {
|
|
5397
|
+
return { ok: false, valid: false, id: str, error: `leading zeros not allowed — use ${str.replace(/^0+/, '')}` };
|
|
5398
|
+
}
|
|
5399
|
+
// Accepted shape: <int>(.<int>)? — e.g. "19", "19.1", "22.3"
|
|
5400
|
+
const ok = /^([1-9]\d*)(\.[1-9]\d*)?$/.test(str);
|
|
5401
|
+
if (!ok) {
|
|
5402
|
+
return {
|
|
5403
|
+
ok: false,
|
|
5404
|
+
valid: false,
|
|
5405
|
+
id: str,
|
|
5406
|
+
error: `phase id "${str}" does not match integer or decimal pattern (e.g. 19, 19.1, 22)`,
|
|
5407
|
+
};
|
|
5408
|
+
}
|
|
5409
|
+
return { ok: true, valid: true, id: str, kind: str.includes('.') ? 'decimal' : 'integer' };
|
|
5410
|
+
}
|
|
5411
|
+
|
|
5412
|
+
/**
|
|
5413
|
+
* cmdValidateRoadmap — scan .planning/ROADMAP.md for phase headings whose
|
|
5414
|
+
* IDs don't conform. Returns the list of offenders with line numbers so
|
|
5415
|
+
* the caller can flag them. Read-only — never modifies ROADMAP.
|
|
5416
|
+
*/
|
|
5417
|
+
function cmdValidateRoadmap() {
|
|
5418
|
+
const roadmapPath = path.join(PROJECT_ROOT, '.planning', 'ROADMAP.md');
|
|
5419
|
+
if (!fs.existsSync(roadmapPath)) {
|
|
5420
|
+
return { ok: true, valid: true, offenders: [], note: 'no ROADMAP.md' };
|
|
5421
|
+
}
|
|
5422
|
+
let text;
|
|
5423
|
+
try { text = fs.readFileSync(roadmapPath, 'utf8'); }
|
|
5424
|
+
catch (e) { return { ok: false, error: `read failed: ${e.message}` }; }
|
|
5425
|
+
|
|
5426
|
+
const offenders = [];
|
|
5427
|
+
const lines = text.split('\n');
|
|
5428
|
+
for (let i = 0; i < lines.length; i++) {
|
|
5429
|
+
const line = lines[i];
|
|
5430
|
+
// Match phase headings: "## Phase <id>" anywhere, also "### Phase <id>"
|
|
5431
|
+
const m = line.match(/^#{2,3}\s+Phase\s+([^\s—:–]+)/i);
|
|
5432
|
+
if (!m) continue;
|
|
5433
|
+
const id = m[1].trim();
|
|
5434
|
+
const r = cmdValidatePhaseId(id);
|
|
5435
|
+
if (!r.valid) {
|
|
5436
|
+
offenders.push({ line: i + 1, id, reason: r.error });
|
|
5437
|
+
}
|
|
5438
|
+
}
|
|
5439
|
+
return {
|
|
5440
|
+
ok: true,
|
|
5441
|
+
valid: offenders.length === 0,
|
|
5442
|
+
offenders,
|
|
5443
|
+
scanned: lines.length,
|
|
5444
|
+
roadmap: '.planning/ROADMAP.md',
|
|
5445
|
+
};
|
|
5446
|
+
}
|
|
5447
|
+
|
|
5448
|
+
/**
|
|
5449
|
+
* cmdMilestoneHealth — gauge for the current milestone (issue #718).
|
|
5450
|
+
*
|
|
5451
|
+
* Counts open vs done phases under the current milestone and recommends
|
|
5452
|
+
* action when the milestone is getting unwieldy. Workflows like
|
|
5453
|
+
* /rihal-add-phase and /rihal-status read this to nudge users toward
|
|
5454
|
+
* /rihal-complete-milestone before the phase list balloons.
|
|
5455
|
+
*
|
|
5456
|
+
* Thresholds (kept conservative — bump in config later if needed):
|
|
5457
|
+
* - "consider closing" when >= 8 open phases under one milestone
|
|
5458
|
+
* - "should close" when >= 12 open phases (hard nudge)
|
|
5459
|
+
*/
|
|
5460
|
+
function cmdMilestoneHealth() {
|
|
5461
|
+
const statePath = path.join(RIHAL_DIR, 'state.json');
|
|
5462
|
+
if (!fs.existsSync(statePath)) return { ok: true, milestone: null, note: 'no state.json' };
|
|
5463
|
+
let state;
|
|
5464
|
+
try { state = JSON.parse(fs.readFileSync(statePath, 'utf8')); }
|
|
5465
|
+
catch (e) { return { ok: false, error: `invalid state.json: ${e.message}` }; }
|
|
5466
|
+
|
|
5467
|
+
const milestone = state.milestone || null;
|
|
5468
|
+
const phases = Array.isArray(state.phases) ? state.phases : [];
|
|
5469
|
+
// "Open" = not done. State schema uses status: 'planned' | 'in_progress' |
|
|
5470
|
+
// 'completed' | 'verified' | 'shipped'. Treat anything not in
|
|
5471
|
+
// {completed, verified, shipped} as open.
|
|
5472
|
+
const doneStatuses = new Set(['completed', 'verified', 'shipped']);
|
|
5473
|
+
const open = phases.filter(p => !doneStatuses.has(p.status));
|
|
5474
|
+
const done = phases.filter(p => doneStatuses.has(p.status));
|
|
5475
|
+
|
|
5476
|
+
let recommendation = 'healthy';
|
|
5477
|
+
if (open.length >= 12) recommendation = 'should-close';
|
|
5478
|
+
else if (open.length >= 8) recommendation = 'consider-closing';
|
|
5479
|
+
|
|
5480
|
+
return {
|
|
5481
|
+
ok: true,
|
|
5482
|
+
milestone,
|
|
5483
|
+
phase_count: phases.length,
|
|
5484
|
+
open_phases: open.length,
|
|
5485
|
+
completed_phases: done.length,
|
|
5486
|
+
recommendation,
|
|
5487
|
+
threshold_consider: 8,
|
|
5488
|
+
threshold_should: 12,
|
|
5489
|
+
};
|
|
5490
|
+
}
|
|
5491
|
+
|
|
5374
5492
|
function cmdStateSnapshot() {
|
|
5375
5493
|
const statePath = path.join(RIHAL_DIR, 'state.json');
|
|
5376
5494
|
if (!fs.existsSync(statePath)) return { ok: true, state: null };
|
|
@@ -5748,6 +5866,15 @@ async function main() {
|
|
|
5748
5866
|
case 'project-status':
|
|
5749
5867
|
result = cmdProjectStatus();
|
|
5750
5868
|
break;
|
|
5869
|
+
case 'validate-phase-id':
|
|
5870
|
+
result = cmdValidatePhaseId(args[0]);
|
|
5871
|
+
break;
|
|
5872
|
+
case 'validate-roadmap':
|
|
5873
|
+
result = cmdValidateRoadmap();
|
|
5874
|
+
break;
|
|
5875
|
+
case 'milestone-health':
|
|
5876
|
+
result = cmdMilestoneHealth();
|
|
5877
|
+
break;
|
|
5751
5878
|
case 'version':
|
|
5752
5879
|
console.log(readPackageVersion());
|
|
5753
5880
|
return;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# References Index
|
|
2
|
+
|
|
3
|
+
Human-maintained catalogue of which reference files are loaded by which agents and workflows.
|
|
4
|
+
|
|
5
|
+
Source: `rihal/references/` (tracked in git).
|
|
6
|
+
Runtime: `.rihal/references/` (gitignored, installed by `cli/install.js`).
|
|
7
|
+
|
|
8
|
+
Update this file whenever you add a new reference or change which agents load it.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Cluster References (added phases 22-23)
|
|
13
|
+
|
|
14
|
+
These files were extracted from heavy agents (>100L) to reduce context budget per spawn.
|
|
15
|
+
|
|
16
|
+
| File | Loaded by |
|
|
17
|
+
|------|-----------|
|
|
18
|
+
| `assumptions-analyzer-playbook.md` | rihal-assumptions-analyzer |
|
|
19
|
+
| `auditor-shared-checklists.md` | rihal-docs-auditor, rihal-edge-case-hunter, rihal-nyquist-auditor, rihal-security-adversary, rihal-security-auditor, rihal-ui-auditor |
|
|
20
|
+
| `code-fixer-playbook.md` | rihal-code-fixer |
|
|
21
|
+
| `code-reviewer-playbook.md` | rihal-code-reviewer |
|
|
22
|
+
| `codebase-mapping-process.md` | rihal-codebase-mapper |
|
|
23
|
+
| `debugger-playbook.md` | rihal-debugger |
|
|
24
|
+
| `executor-playbook.md` | rihal-executor |
|
|
25
|
+
| `integration-verification-playbook.md` | rihal-integration-checker |
|
|
26
|
+
| `persona-engineer-shared.md` | rihal-haitham, rihal-omar, rihal-yousef |
|
|
27
|
+
| `planner-playbook.md` | rihal-planner |
|
|
28
|
+
| `remediation-planner-playbook.md` | rihal-remediation-planner |
|
|
29
|
+
| `research-synthesis-playbook.md` | rihal-research-synthesizer |
|
|
30
|
+
| `researcher-shared.md` | rihal-advisor-researcher, rihal-phase-researcher, rihal-profiler, rihal-project-researcher |
|
|
31
|
+
| `roadmapper-playbook.md` | rihal-roadmapper |
|
|
32
|
+
| `sprint-checker-playbook.md` | rihal-sprint-checker |
|
|
33
|
+
| `ux-designer-playbook.md` | rihal-ux-designer |
|
|
34
|
+
| `verifier-playbook.md` | rihal-verifier |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Universal References (loaded by most agents)
|
|
39
|
+
|
|
40
|
+
| File | Loaded by |
|
|
41
|
+
|------|-----------|
|
|
42
|
+
| `agent-shared-rules.md` | rihal-fatima, rihal-hanzla, rihal-hussain-pm, rihal-mariam, rihal-sadiq, rihal-waleed |
|
|
43
|
+
| `codebase-grounding.md` | rihal-ahmed, rihal-fatima, rihal-haitham, rihal-hanzla, rihal-hussain-pm, rihal-khalid, rihal-layla, rihal-mariam, rihal-nasser, rihal-noor, rihal-omar, rihal-sadiq, rihal-waleed, rihal-yousef, rihal-zahra, rihal-zayd |
|
|
44
|
+
| `karpathy-guidelines.md` | rihal-assumptions-analyzer, rihal-code-fixer, rihal-debugger, rihal-deviation-analyzer, rihal-fatima, rihal-haitham, rihal-hanzla, rihal-hussain-pm, rihal-integration-checker, rihal-khalid, rihal-noor, rihal-omar, rihal-phase-researcher, rihal-profiler, rihal-project-researcher, rihal-remediation-planner, rihal-research-synthesizer, rihal-roadmapper, rihal-ui-auditor, rihal-ux-designer, rihal-waleed, rihal-yousef, rihal-zayd |
|
|
45
|
+
| `karpathy-guidelines-full.md` | rihal-codebase-mapper, rihal-code-reviewer, rihal-docs-auditor, rihal-edge-case-hunter, rihal-executor, rihal-nyquist-auditor, rihal-planner, rihal-security-adversary, rihal-security-auditor, rihal-sprint-checker, rihal-verifier |
|
|
46
|
+
| `response-style.md` | rihal-advisor-researcher, rihal-ahmed, rihal-assumptions-analyzer, rihal-codebase-mapper, rihal-code-fixer, rihal-code-reviewer, rihal-debugger, rihal-deviation-analyzer, rihal-docs-auditor, rihal-edge-case-hunter, rihal-executor, rihal-haitham, rihal-integration-checker, rihal-khalid, rihal-layla, rihal-nasser, rihal-noor, rihal-nyquist-auditor, rihal-omar, rihal-phase-researcher, rihal-planner, rihal-profiler, rihal-project-researcher, rihal-remediation-planner, rihal-research-synthesizer, rihal-roadmapper, rihal-security-adversary, rihal-security-auditor, rihal-sprint-checker, rihal-ui-auditor, rihal-ux-designer, rihal-verifier, rihal-yousef, rihal-zahra, rihal-zayd |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Workflow References
|
|
51
|
+
|
|
52
|
+
| File | Loaded by |
|
|
53
|
+
|------|-----------|
|
|
54
|
+
| `auto-init-guard.md` | workflows/council.md, workflows/do.md, workflows/execute.md, workflows/new-project.md, workflows/plan.md, workflows/status.md |
|
|
55
|
+
| `output-format.md` | workflows/autonomous.md, workflows/council.md, workflows/decisions.md, workflows/discuss.md, workflows/do.md, workflows/execute.md, workflows/export-to-github.md, workflows/feature-drift.md, workflows/from-template.md, workflows/list-plans.md, workflows/map-codebase.md, workflows/new-milestone.md, workflows/new-project.md, workflows/next.md, workflows/notify-test.md, workflows/plan.md, workflows/replay.md, workflows/sprint-planning.md, workflows/sprint-status.md, workflows/status.md, workflows/verify-work.md |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Agents with Accepted Size Exceptions
|
|
60
|
+
|
|
61
|
+
The Agent File Size Rule (CONTRIBUTING.md) requires agents >100L to extract to references.
|
|
62
|
+
Two agents have documented deviations:
|
|
63
|
+
|
|
64
|
+
| Agent | Lines | Reason |
|
|
65
|
+
|-------|-------|--------|
|
|
66
|
+
| `rihal-nyquist-auditor.md` | 176L | Load-bearing XML execution blocks that cannot be separated from agent logic |
|
|
67
|
+
| `rihal-docs-auditor.md` | 173L | Load-bearing JSON schema for /rihal-feature-drift dispatch |
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Assumptions Analyzer Playbook
|
|
2
|
+
|
|
3
|
+
Loaded by `rihal-assumptions-analyzer` via `@-include`. Contains the calibration
|
|
4
|
+
tier definitions, analysis process, output format template, and rules.
|
|
5
|
+
|
|
6
|
+
The agent stub holds the role definition, input spec, anti_patterns, and
|
|
7
|
+
constraints.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Calibration Tiers
|
|
12
|
+
|
|
13
|
+
The calibration tier controls output shape. Follow the tier instructions exactly.
|
|
14
|
+
|
|
15
|
+
### full_maturity
|
|
16
|
+
- **Areas:** 3-5 assumption areas
|
|
17
|
+
- **Alternatives:** 2-3 per Likely/Unclear item
|
|
18
|
+
- **Evidence depth:** Detailed file path citations with line-level specifics
|
|
19
|
+
|
|
20
|
+
### standard
|
|
21
|
+
- **Areas:** 3-4 assumption areas
|
|
22
|
+
- **Alternatives:** 2 per Likely/Unclear item
|
|
23
|
+
- **Evidence depth:** File path citations
|
|
24
|
+
|
|
25
|
+
### minimal_decisive
|
|
26
|
+
- **Areas:** 2-3 assumption areas
|
|
27
|
+
- **Alternatives:** Single decisive recommendation per item
|
|
28
|
+
- **Evidence depth:** Key file paths only
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Process
|
|
33
|
+
|
|
34
|
+
1. Read ROADMAP.md and extract the phase description
|
|
35
|
+
2. Read any prior CONTEXT.md files from earlier phases (find via `find .planning/phases -name "*-CONTEXT.md"`)
|
|
36
|
+
3. Use Glob and Grep to find files related to the phase goal terms
|
|
37
|
+
4. Read 5-15 most relevant source files to understand existing patterns
|
|
38
|
+
5. Form assumptions based on what the codebase reveals
|
|
39
|
+
6. Classify confidence: Confident (clear from code), Likely (reasonable inference), Unclear (could go multiple ways)
|
|
40
|
+
7. Flag any topics that need external research (library compatibility, ecosystem best practices)
|
|
41
|
+
8. Return structured output in the exact format below
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Output Format
|
|
46
|
+
|
|
47
|
+
Return EXACTLY this structure:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
## Assumptions
|
|
51
|
+
|
|
52
|
+
### [Area Name] (e.g., "Technical Approach")
|
|
53
|
+
- **Assumption:** [Decision statement]
|
|
54
|
+
- **Why this way:** [Evidence from codebase -- cite file paths]
|
|
55
|
+
- **If wrong:** [Concrete consequence of this being wrong]
|
|
56
|
+
- **Confidence:** Confident | Likely | Unclear
|
|
57
|
+
|
|
58
|
+
### [Area Name 2]
|
|
59
|
+
- **Assumption:** [Decision statement]
|
|
60
|
+
- **Why this way:** [Evidence]
|
|
61
|
+
- **If wrong:** [Consequence]
|
|
62
|
+
- **Confidence:** Confident | Likely | Unclear
|
|
63
|
+
|
|
64
|
+
(Repeat for 2-5 areas based on calibration tier)
|
|
65
|
+
|
|
66
|
+
## Needs External Research
|
|
67
|
+
[Topics where codebase alone is insufficient -- library version compatibility,
|
|
68
|
+
ecosystem best practices, etc. Leave empty if codebase provides enough evidence.]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Rules
|
|
74
|
+
|
|
75
|
+
1. Every assumption MUST cite at least one file path as evidence.
|
|
76
|
+
2. Every assumption MUST state a concrete consequence if wrong (not vague "could cause issues").
|
|
77
|
+
3. Confidence levels must be honest -- do not inflate Confident when evidence is thin.
|
|
78
|
+
4. Minimize Unclear items by reading more files before giving up.
|
|
79
|
+
5. Do NOT suggest scope expansion -- stay within the phase boundary.
|
|
80
|
+
6. Do NOT include implementation details (that's for the planner).
|
|
81
|
+
7. Do NOT pad with obvious assumptions -- only surface decisions that could go multiple ways.
|
|
82
|
+
8. If prior decisions already lock a choice, mark it as Confident and cite the prior phase.
|