@saulwade/swl-ses 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +196 -196
- package/README.md +579 -579
- package/agentes/_propose-step.md +90 -0
- package/agentes/implementador-swl.md +2 -0
- package/agentes/orquestador-swl.md +2 -0
- package/agentes/perfilador-usuario-swl.md +14 -1
- package/bin/swl-ses.js +1 -1
- package/comandos/swl/aprobar-plan.md +3 -2
- package/comandos/swl/briefing.md +122 -0
- package/comandos/swl/compactar.md +29 -2
- package/comandos/swl/discutir-fase.md +8 -5
- package/comandos/swl/ejecutar-fase.md +6 -0
- package/comandos/swl/planear-fase.md +5 -3
- package/comandos/swl/release.md +46 -0
- package/comandos/swl/status.md +69 -0
- package/comandos/swl/verificar.md +3 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +6 -4
- package/habilidades/ejecutar-fase/SKILL.md +541 -518
- package/habilidades/planear-fase/SKILL.md +3 -2
- package/habilidades/tdd-workflow/SKILL.md +715 -713
- package/habilidades/validacion-ci-sistema/SKILL.md +17 -1
- package/hooks/calidad-pre-commit.js +5 -1
- package/hooks/check-update.js +39 -1
- package/hooks/lib/autonomia.js +208 -0
- package/hooks/lib/briefing.js +474 -0
- package/hooks/lib/propose-step.js +357 -0
- package/hooks/session-briefing.js +98 -0
- package/hooks/telemetria-skill-routing.js +100 -0
- package/instintos/autonomia.yaml +27 -0
- package/llms.txt +4 -4
- package/manifiestos/hooks-config.json +18 -0
- package/manifiestos/modulos.json +25 -3
- package/manifiestos/skills-lock.json +14 -14
- package/package.json +93 -93
- package/plugin.json +371 -371
- package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
- package/reglas/consultar-vault-primero.md +195 -0
- package/reglas/debatir-antes-de-aceptar.md +158 -0
- package/reglas/git-coauthor.md +100 -0
- package/reglas/monitor-ci.md +309 -0
- package/reglas/registro-componentes-nuevos.md +38 -10
- package/reglas/sesiones-paralelas.md +180 -0
- package/reglas/usar-code-review-graph.md +155 -0
- package/reglas/verificar-citas-normativas.md +548 -0
- package/scripts/instalador.js +52 -6
- package/scripts/lib/ci-reader.js +193 -0
- package/scripts/lib/detectar-host-swl.js +175 -0
- package/scripts/lib/evidencia-release.js +322 -0
- package/scripts/lib/gate-hooks-requires.js +249 -0
- package/scripts/lib/gate-licencias.js +212 -0
- package/scripts/lib/git-metricas.js +257 -0
- package/scripts/lib/metricas-dora.js +204 -0
- package/scripts/tui/ejecutores.js +1 -1
- package/scripts/validar-manifest.js +92 -1
- package/scripts/verificar-evolucion.js +54 -4
- package/scripts/verificar-release.js +102 -0
- package/scripts/verificar-trazabilidad.js +11 -5
- package/reglas/arquitectura.evolved.json +0 -7
- package/reglas/seguridad.evolved.json +0 -7
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Regla: Analizar la estructura de directorios antes de escribir documentación o MDs
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA y aplica cada vez que Claude va a **crear un
|
|
4
|
+
directorio nuevo** o **escribir un archivo de documentación** (`.md`, `.json`
|
|
5
|
+
de reporte, informe, ADR, plan, análisis, output de auditoría/diseño/research)
|
|
6
|
+
en cualquier proyecto del usuario.
|
|
7
|
+
|
|
8
|
+
Cierra un patrón conductual recurrente: el agente escribe un documento en un
|
|
9
|
+
directorio nuevo elegido ad-hoc — en idioma o nombre distinto al que el
|
|
10
|
+
proyecto ya usa para ese dominio — y produce **directorios paralelos
|
|
11
|
+
divergentes** que fragmentan la memoria institucional.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Principio
|
|
16
|
+
|
|
17
|
+
> Antes de crear un directorio nuevo o escribir un MD/reporte, **analiza
|
|
18
|
+
> primero la estructura de directorios existente** (`Glob`/`ls`) para
|
|
19
|
+
> descubrir la convención que el proyecto YA usa para ese dominio, y
|
|
20
|
+
> **reúsala**. NUNCA crees un directorio paralelo para un dominio que ya
|
|
21
|
+
> tiene uno. Solo cuando no exista precedente, crea uno nuevo siguiendo la
|
|
22
|
+
> convención dominante del proyecto; como desempate del **nombre**, prefiere
|
|
23
|
+
> español de México — salvo que exista un path canónico establecido (aunque
|
|
24
|
+
> sea en inglés), en cuyo caso ese path gana.
|
|
25
|
+
|
|
26
|
+
El costo de un `ls` antes de escribir es de 1 segundo. El costo de un
|
|
27
|
+
directorio paralelo es: referencias colgadas, búsquedas que fallan, memoria
|
|
28
|
+
institucional partida, y una sesión futura de depuración/unificación.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Cuándo aplicar
|
|
33
|
+
|
|
34
|
+
OBLIGATORIO antes de:
|
|
35
|
+
|
|
36
|
+
- Escribir un reporte de auditoría, verificación, nemesis, revisión, análisis.
|
|
37
|
+
- Escribir un documento de diseño/UX (propuesta, tokens, discovery, UI-SPEC).
|
|
38
|
+
- Crear un ADR, plan, spec, runbook, research output.
|
|
39
|
+
- Crear cualquier directorio nuevo bajo `.planning/`, `docs/`, o equivalente.
|
|
40
|
+
- Persistir cualquier `.md`/`.json` que sea memoria del proyecto (no código).
|
|
41
|
+
|
|
42
|
+
NO aplica cuando:
|
|
43
|
+
|
|
44
|
+
- El comando/agente/herramienta **fija un path canónico de output** — en ese
|
|
45
|
+
caso úsalo tal cual, no lo cuestiones (ej: un agente que pinea
|
|
46
|
+
`.planning/audit/findings/iter-N/`).
|
|
47
|
+
- El archivo es código fuente (sigue las convenciones del lenguaje/framework).
|
|
48
|
+
- El usuario indicó explícitamente la ruta exacta donde escribir.
|
|
49
|
+
- Es un archivo efímero de scratch que se borrará en el mismo turno.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Cómo aplicar — protocolo de 4 pasos
|
|
54
|
+
|
|
55
|
+
### Paso 1 — Listar la estructura existente
|
|
56
|
+
|
|
57
|
+
Antes de elegir dónde escribir:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
ls .planning/ # o el directorio raíz de docs del proyecto
|
|
61
|
+
ls docs/
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
O con Glob: `**/{audit,auditoria,diseno*,ux,design,research,specs}/`.
|
|
65
|
+
|
|
66
|
+
### Paso 2 — Buscar si el dominio ya tiene directorio (incluye variantes es/en)
|
|
67
|
+
|
|
68
|
+
Pregúntate: ¿ya existe un directorio para este tipo de artefacto? Busca
|
|
69
|
+
**variantes en ambos idiomas** y sinónimos:
|
|
70
|
+
|
|
71
|
+
| Dominio | Variantes a buscar antes de crear |
|
|
72
|
+
|---|---|
|
|
73
|
+
| Auditoría | `audit/`, `auditoria/`, `auditorias/`, `findings/` |
|
|
74
|
+
| Diseño/UX | `diseno/`, `diseno-visual/`, `ux/`, `ui/`, `design/` |
|
|
75
|
+
| Investigación | `research/`, `investigacion/`, `knowledge/` |
|
|
76
|
+
| Decisiones | `adrs/`, `adr/`, `decisiones/` |
|
|
77
|
+
| Sesiones | `sessions/`, `sesiones/` |
|
|
78
|
+
| Deuda | `DEUDAS.md`, `DEUDA-TECNICA.md`, `deuda/`, `debt/` |
|
|
79
|
+
|
|
80
|
+
### Paso 3 — Decidir el destino
|
|
81
|
+
|
|
82
|
+
- **Si ya existe un directorio para el dominio** → escribe ahí. Punto. Aunque
|
|
83
|
+
el nombre existente esté en el "idioma equivocado", reusarlo es superior a
|
|
84
|
+
crear un paralelo. La consistencia gana sobre la preferencia de idioma.
|
|
85
|
+
- **Si existe un path canónico de la herramienta** (swl-ses pinea
|
|
86
|
+
`.planning/audit/`, `knowledge/outputs/`, `sessions/`, etc.) → ese path es
|
|
87
|
+
la fuente de verdad. NO lo dupliques en español.
|
|
88
|
+
- **Si NO existe precedente** → crea uno nuevo siguiendo la convención
|
|
89
|
+
dominante del proyecto (mira cómo están nombrados los directorios hermanos).
|
|
90
|
+
|
|
91
|
+
### Paso 4 — Desempate del nombre (solo para directorios genuinamente nuevos)
|
|
92
|
+
|
|
93
|
+
Cuando creas un nombre nuevo sin precedente ni path canónico:
|
|
94
|
+
|
|
95
|
+
- Prefiere **español de México** (consistente con
|
|
96
|
+
`~/.claude/rules/brevedad-output.md § Idioma obligatorio`): `diseno/`,
|
|
97
|
+
`investigacion/`, `auditoria/` antes que `design/`, `research/`, `audit/`.
|
|
98
|
+
- **PERO**: si el proyecto ya tiene una convención de idioma dominante para
|
|
99
|
+
sus directorios (ej: swl-ses usa mayormente inglés: `audit/`, `knowledge/`,
|
|
100
|
+
`sessions/`, `research/`), respeta ESA convención sobre la preferencia
|
|
101
|
+
general — la coherencia intra-proyecto manda.
|
|
102
|
+
- Identificadores técnicos (nombres que un comando/script consume como string)
|
|
103
|
+
siguen la convención del consumidor, no la preferencia de idioma.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## La tensión es/en — cómo resolverla (no es "español siempre")
|
|
108
|
+
|
|
109
|
+
"Preferir español" es un **desempate**, no un mandato absoluto. La jerarquía
|
|
110
|
+
de decisión, de mayor a menor prioridad:
|
|
111
|
+
|
|
112
|
+
1. **Path canónico fijado por la herramienta** (gana siempre, aunque sea inglés).
|
|
113
|
+
2. **Directorio existente para el dominio** (reusar, aunque el idioma "no cuadre").
|
|
114
|
+
3. **Convención de idioma dominante del proyecto** (si el proyecto es es → es;
|
|
115
|
+
si es en → en).
|
|
116
|
+
4. **Preferencia general español de México** (solo cuando 1-3 no aplican).
|
|
117
|
+
|
|
118
|
+
Renombrar un path canónico inglés establecido a español **viola** esta regla:
|
|
119
|
+
reintroduce divergencia en vez de eliminarla. El objetivo es UNA convención por
|
|
120
|
+
proyecto, no "todo en español".
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Eje técnico-runtime vs vocabulario-de-dominio (refina la jerarquía)
|
|
126
|
+
|
|
127
|
+
La jerarquía de arriba decide entre español e inglés *cuando todo el árbol usa
|
|
128
|
+
un solo idioma*. Pero muchos proyectos adoptan una convención **mixta por
|
|
129
|
+
categoría**: "identificadores técnicos en inglés, vocabulario de cara al usuario
|
|
130
|
+
en el idioma del proyecto" (caso swl-ses). Ahí, **clasifica el directorio ANTES**
|
|
131
|
+
de aplicar la jerarquía:
|
|
132
|
+
|
|
133
|
+
- **Path runtime/técnico → inglés.** Telemetría, estado interno, caches, logs
|
|
134
|
+
archivados, outputs de tooling, índices. No los lee el usuario final; los
|
|
135
|
+
consume el código como string. Ej. en swl-ses: `.planning/evolution/`,
|
|
136
|
+
`.planning/auto-evolution/`, `.planning/user-profile/`, `.planning/archive/`,
|
|
137
|
+
`.planning/traces/`, `.planning/sessions/`, `.planning/audit/`.
|
|
138
|
+
- **Vocabulario de dominio de cara al usuario → idioma del proyecto.** Artefactos
|
|
139
|
+
acoplados a comandos/UX cuyo nombre el usuario lee y escribe. Ej. en swl-ses:
|
|
140
|
+
`.planning/fases/` permanece **español** porque su comando es `/swl:planear-fase`
|
|
141
|
+
(español, intocable). Cambiar el dir sin cambiar el comando crea una
|
|
142
|
+
inconsistencia comando↔directorio *peor* que la divergencia que se quería evitar.
|
|
143
|
+
|
|
144
|
+
**Regla de coherencia comando↔directorio:** el nombre del data dir debe espejar
|
|
145
|
+
el idioma del comando que escribe en él. NUNCA partir un par comando↔directorio
|
|
146
|
+
en dos idiomas.
|
|
147
|
+
|
|
148
|
+
**Consolidar islas runtime SÍ es válido (no viola "no renombrar paths
|
|
149
|
+
establecidos"):** si un proyecto con convención técnico-inglés tiene islas
|
|
150
|
+
runtime en español (`evolucion/`, `archivo/`), alinearlas a inglés *reduce*
|
|
151
|
+
divergencia — es lo opuesto a "renombrar `audit/` a español". La prohibición de
|
|
152
|
+
renombrar aplica a mover *desde* la convención establecida, no *hacia* ella. Las
|
|
153
|
+
islas runtime alineadas requieren shim de migración (renombrar el dir físico en
|
|
154
|
+
proyectos que ya tienen datos) — ver `scripts/instalador.js § 6c-bis` en swl-ses.
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Anti-patrones explícitos
|
|
160
|
+
|
|
161
|
+
- **Crear `ux/` cuando ya existe `diseno-visual/`** (o viceversa) sin haber
|
|
162
|
+
hecho `ls .planning/` primero. Caso real: SIGM acumuló ambos por sesiones
|
|
163
|
+
distintas que no verificaron el precedente.
|
|
164
|
+
- **Crear `auditoria/` (es) cuando la herramienta pinea `audit/` (en)** como
|
|
165
|
+
path canónico. Caso real: `/swl:verificar` y el consolidado de `/swl:nemesis`
|
|
166
|
+
escribieron en `auditoria/` mientras los reportes por-router iban a
|
|
167
|
+
`audit/findings/` — misma corrida, dos directorios.
|
|
168
|
+
- **Renombrar `audit/`, `knowledge/`, `sessions/` a español** "porque la
|
|
169
|
+
preferencia es español". Eso rompe paths canónicos y reintroduce divergencia.
|
|
170
|
+
- **Escribir un reporte en un directorio top-level nuevo** sin revisar los
|
|
171
|
+
directorios hermanos existentes.
|
|
172
|
+
- **Asumir que no hay precedente sin buscar variantes es/en** del nombre del
|
|
173
|
+
dominio.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Excepciones legítimas
|
|
178
|
+
|
|
179
|
+
NO aplicar (o aplicar con criterio reducido) cuando:
|
|
180
|
+
|
|
181
|
+
1. El comando/agente **pinea el path** — úsalo, no analices.
|
|
182
|
+
2. El usuario dictó la ruta exacta.
|
|
183
|
+
3. Es un archivo de scratch efímero del mismo turno.
|
|
184
|
+
4. Es el **primer** documento del proyecto (no hay estructura que analizar
|
|
185
|
+
todavía) — ahí creas la convención; hazlo deliberadamente y en español si
|
|
186
|
+
no hay restricción técnica.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Checklist antes de escribir un MD/reporte o crear un directorio
|
|
191
|
+
|
|
192
|
+
- [ ] Ejecuté `ls`/`Glob` sobre el directorio raíz de docs (`.planning/`, `docs/`).
|
|
193
|
+
- [ ] Busqué variantes es/en del nombre del dominio (audit/auditoria,
|
|
194
|
+
diseno/ux/design, research/investigacion).
|
|
195
|
+
- [ ] Si existe directorio para el dominio → escribo ahí (no creo paralelo).
|
|
196
|
+
- [ ] Si la herramienta pinea path canónico → uso ese (aunque sea inglés).
|
|
197
|
+
- [ ] Si creo uno nuevo → sigue la convención de idioma dominante del proyecto;
|
|
198
|
+
español como desempate solo sin precedente ni path canónico.
|
|
199
|
+
- [ ] No reintroduje divergencia renombrando un path canónico establecido.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Origen de esta regla
|
|
204
|
+
|
|
205
|
+
Sesión 2026-05-31, proyecto SIGM. Al depurar `.planning/` se detectaron **dos
|
|
206
|
+
pares de directorios divergentes** creados por sesiones distintas para el mismo
|
|
207
|
+
dominio, en idiomas distintos:
|
|
208
|
+
|
|
209
|
+
- `.planning/audit/` (en, canónico swl-ses) vs `.planning/auditoria/` (es,
|
|
210
|
+
ad-hoc). La misma corrida de `/swl:nemesis` quedó partida entre ambos; 8
|
|
211
|
+
documentos con referencias colgadas tras la consolidación.
|
|
212
|
+
- `.planning/ux/` (en, 2026-05-30) vs `.planning/diseno-visual/` (es,
|
|
213
|
+
2026-05-11). La sesión 05-30 creó `ux/` sin verificar que `diseno-visual/`
|
|
214
|
+
ya existía.
|
|
215
|
+
|
|
216
|
+
Causa raíz dual: (a) **conductual** — el agente no analiza la estructura
|
|
217
|
+
existente antes de escribir (esta regla); (b) **de herramienta** — varios
|
|
218
|
+
comandos/agentes de swl-ses no fijan path canónico de output (ticket
|
|
219
|
+
`DT-PLANNING-OUTPUT-PATHS` en swl-ses). Esta regla ataca el lado conductual y
|
|
220
|
+
aplica a todo proyecto del usuario, use o no swl-ses.
|
|
221
|
+
|
|
222
|
+
Relación con otras reglas:
|
|
223
|
+
- `~/.claude/rules/brevedad-output.md § Idioma obligatorio` — la preferencia
|
|
224
|
+
español que esta regla usa como desempate.
|
|
225
|
+
- `~/.claude/rules/memoria-consolidada.md § no-duplicación` — un dato vive en
|
|
226
|
+
un solo canal; esta regla extiende el principio a directorios.
|
|
227
|
+
- `~/.claude/rules/sin-duplicacion-reglas-globales.md` — analogía: no duplicar
|
|
228
|
+
contenido que ya vive en su lugar canónico.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Regla: Consultar el vault Obsidian antes de leer múltiples archivos
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA y aplica cuando Claude necesita contexto de dominio
|
|
4
|
+
(arquitectura, decisiones, patrones, lecciones, vocabulario del proyecto) antes
|
|
5
|
+
de implementar, debugear, planificar o responder preguntas no triviales.
|
|
6
|
+
|
|
7
|
+
El vault Obsidian del usuario es **fuente de verdad curada**: contiene resúmenes,
|
|
8
|
+
ADRs, notas de decisiones, índices de proyectos, lecciones aprendidas. Está
|
|
9
|
+
indexado y consultable vía MCP server `obsidian`. Leer ahí primero es más
|
|
10
|
+
eficiente en tokens que leer múltiples archivos del codebase.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Principio
|
|
15
|
+
|
|
16
|
+
> Antes de leer **3 o más archivos completos** del codebase para construir
|
|
17
|
+
> contexto general (arquitectura, decisiones previas, convenciones del proyecto,
|
|
18
|
+
> patrones), **consulta el vault Obsidian primero** con `obsidian_simple_search`
|
|
19
|
+
> o `obsidian_complex_search`. Lee únicamente las notas relevantes. Solo cae
|
|
20
|
+
> al codebase para los detalles concretos que el vault no cubra.
|
|
21
|
+
|
|
22
|
+
Esto reduce el contexto consumido y aprovecha el conocimiento que el usuario ya
|
|
23
|
+
sintetizó manualmente.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Cuándo aplicar
|
|
28
|
+
|
|
29
|
+
OBLIGATORIO consultar el vault antes de:
|
|
30
|
+
|
|
31
|
+
- Empezar una sesión nueva en un proyecto donde el usuario menciona terminología
|
|
32
|
+
específica (nombres de sistemas, ADRs, conceptos del dominio)
|
|
33
|
+
- **Tomar una decisión de diseño, arquitectura o scope** — en CUALQUIER
|
|
34
|
+
proyecto, no solo en uno desconocido. El usuario tiene decisiones ya tomadas
|
|
35
|
+
que se repiten y no quiere reabrirlas
|
|
36
|
+
- Buscar el "por qué" detrás de una elección arquitectónica
|
|
37
|
+
- Resolver un bug donde la causa puede estar documentada en lecciones aprendidas
|
|
38
|
+
- Investigar si un patrón ya fue evaluado y descartado
|
|
39
|
+
- Responder "¿qué dice tu sistema sobre X?" o "¿cómo manejamos Y?"
|
|
40
|
+
- **Antes de proponer una solución que parece "obvia"** — si suena obvia, alta
|
|
41
|
+
probabilidad de que el usuario ya pasó por ahí y haya una decisión documentada
|
|
42
|
+
|
|
43
|
+
NO aplicar cuando:
|
|
44
|
+
|
|
45
|
+
- La tarea es claramente local a 1-2 archivos del codebase (fix puntual, rename)
|
|
46
|
+
- El usuario pidió explícitamente leer un archivo específico
|
|
47
|
+
- Es una operación de comando puro (git, npm install, builds)
|
|
48
|
+
- El proyecto no es del usuario (repos de terceros, código de exploración)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Tipos de conocimiento valioso que el vault repite
|
|
53
|
+
|
|
54
|
+
El vault no es archivo histórico — es **memoria operacional activa**. Los
|
|
55
|
+
siguientes tipos de contenido se repiten a través de proyectos y sesiones:
|
|
56
|
+
|
|
57
|
+
| Tipo | Por qué consultarlo | Ejemplo de query |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| **ADRs vigentes y propuestos** | Decisiones de arquitectura que el usuario YA tomó y no quiere debatir otra vez | `obsidian_simple_search` con nombre del componente o tecnología |
|
|
60
|
+
| **Patrones validados** | Soluciones que el usuario aprobó en sesiones previas para problemas equivalentes | búsqueda por keyword del problema |
|
|
61
|
+
| **Anti-patrones documentados** | Caminos que el usuario YA rechazó — proponerlos otra vez es regresión | búsqueda por síntoma del bug o patrón |
|
|
62
|
+
| **Vocabulario y convenciones del dominio** | Términos específicos del proyecto (OIC, VBO, papel de trabajo) que tienen significado preciso | nombre del término |
|
|
63
|
+
| **Lecciones de incidentes** | Bugs ya investigados con causa raíz documentada | búsqueda por mensaje de error o síntoma |
|
|
64
|
+
| **Diferencias entre proyectos del usuario** | SIGAF vs SIGM vs swl-ses tienen convenciones distintas — el vault las separa | path filtering por carpeta del proyecto |
|
|
65
|
+
| **Roadmap y prioridades** | Lo que el usuario quiere para próximos sprints vs lo que está cerrado | búsqueda por nombre de feature |
|
|
66
|
+
|
|
67
|
+
**Regla práctica**: si la decisión que vas a tomar es del tipo "el usuario
|
|
68
|
+
probablemente ya pensó en esto", consulta antes. La probabilidad de que
|
|
69
|
+
exista nota relevante en el vault es alta.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Cómo consultar
|
|
74
|
+
|
|
75
|
+
### Tools disponibles del MCP `obsidian`
|
|
76
|
+
|
|
77
|
+
| Tool | Cuándo usar |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `obsidian_simple_search` | Búsqueda full-text por keywords. Primer paso siempre. |
|
|
80
|
+
| `obsidian_complex_search` | Filtros estructurados (frontmatter, tags, paths). Cuando simple_search devuelve demasiado. |
|
|
81
|
+
| `obsidian_list_files_in_vault` | Inventario completo del vault. Solo en sesión inicial de un proyecto. |
|
|
82
|
+
| `obsidian_list_files_in_dir` | Listar notas de una carpeta específica. |
|
|
83
|
+
| `obsidian_get_file_contents` | Leer una nota completa identificada por path relativo al vault. |
|
|
84
|
+
| `obsidian_recent_changes` | Notas modificadas recientemente. Útil para retomar trabajo reciente. |
|
|
85
|
+
| `obsidian_periodic_notes` | Daily/weekly notes si el usuario las usa. |
|
|
86
|
+
|
|
87
|
+
### Workflow estándar
|
|
88
|
+
|
|
89
|
+
1. **Search**: `obsidian_simple_search` con 2-4 keywords del dominio del problema.
|
|
90
|
+
2. **Triage**: revisar paths de las notas devueltas. Identificar las 1-3 más
|
|
91
|
+
relevantes por nombre de archivo y context score.
|
|
92
|
+
3. **Read targeted**: `obsidian_get_file_contents` solo de esas 1-3 notas.
|
|
93
|
+
4. **Fallback al codebase**: si el vault no tiene info suficiente, ahí sí leer
|
|
94
|
+
archivos del codebase — pero con foco específico, no exploración amplia.
|
|
95
|
+
|
|
96
|
+
### Anti-patrones
|
|
97
|
+
|
|
98
|
+
- ❌ Leer 5+ archivos del codebase para entender la arquitectura sin haber
|
|
99
|
+
consultado el vault primero.
|
|
100
|
+
- ❌ Llamar `obsidian_list_files_in_vault` y leer todo — el vault puede tener
|
|
101
|
+
cientos de notas. Usar search siempre antes que list.
|
|
102
|
+
- ❌ Ignorar el vault porque "el codebase es fuente de verdad" — el codebase
|
|
103
|
+
es la fuente de verdad del CÓDIGO; el vault es la fuente de verdad de las
|
|
104
|
+
DECISIONES y el CONTEXTO.
|
|
105
|
+
- ❌ Re-leer la misma nota del vault en turnos sucesivos del mismo proyecto —
|
|
106
|
+
el contenido ya está en contexto, citarlo directamente.
|
|
107
|
+
- ❌ **Re-abrir una decisión ya documentada en el vault** porque "no la
|
|
108
|
+
recuerdo en este turno". Si la decisión está en una nota del usuario,
|
|
109
|
+
consultarla en lugar de re-debatir el tradeoff desde cero. El usuario
|
|
110
|
+
ya pagó el costo de decidir — no obligarlo a re-pagar.
|
|
111
|
+
- ❌ **Proponer una solución sin verificar si el vault tiene una nota
|
|
112
|
+
contraria**. Si el usuario propuso X hace 2 meses y lo rechazó por razón
|
|
113
|
+
Y documentada en el vault, proponer X otra vez es regresión silenciosa.
|
|
114
|
+
- ❌ **Asumir que "es un proyecto nuevo, no hay nada en el vault"** sin
|
|
115
|
+
buscar. El vault tiene notas transversales (decisiones arquitectónicas
|
|
116
|
+
del usuario, convenciones de naming, stack preferido) que aplican
|
|
117
|
+
cross-proyecto.
|
|
118
|
+
- ❌ **Defaultear a Bash+filesystem cuando los tools `mcp__obsidian__*`
|
|
119
|
+
aparecen como deferred ("schemas not loaded")**. Tools deferred ≠ tools
|
|
120
|
+
ausentes — el MCP server está corriendo, solo falta cargar schemas vía
|
|
121
|
+
`ToolSearch(query="select:mcp__obsidian__obsidian_simple_search", ...)`.
|
|
122
|
+
Si Bash+cp+heredoc parece "más fácil", es inercia del workaround antiguo.
|
|
123
|
+
La ruta MCP es **siempre superior** para escritura al vault: patches
|
|
124
|
+
dirigidos por sección con `obsidian_patch_content` (target_type heading),
|
|
125
|
+
sin staging intermedio, sin tocar `proteccion-rutas.js`, auditable
|
|
126
|
+
nativamente por el plugin Local REST API.
|
|
127
|
+
- ❌ **Tras un bloqueo de hook hacia el vault, recurrir al workaround
|
|
128
|
+
conocido sin reconsiderar el canal nuevo**. El MCP `obsidian` opera vía
|
|
129
|
+
HTTPS al puerto 27124 — NO pasa por el hook `proteccion-rutas.js`
|
|
130
|
+
(es protocolo MCP, no operación de filesystem). Cuando un destino esté
|
|
131
|
+
fuera del CWD, evaluar primero `mcp__obsidian__*` antes de defaultear
|
|
132
|
+
a Bash + cp.
|
|
133
|
+
|
|
134
|
+
### Workflow forzoso para escritura al vault
|
|
135
|
+
|
|
136
|
+
Si la operación es **escribir** al vault (no solo leer):
|
|
137
|
+
|
|
138
|
+
1. Verificar si los tools `mcp__obsidian__obsidian_patch_content` y
|
|
139
|
+
`mcp__obsidian__obsidian_append_content` están cargados.
|
|
140
|
+
2. Si aparecen como deferred → invocar `ToolSearch` con
|
|
141
|
+
`select:<tool-name>` para cargar el schema.
|
|
142
|
+
3. Solo si el MCP no responde tras 5s o no está registrado → caer al
|
|
143
|
+
filesystem como fallback con disclaimer al usuario ("MCP no disponible,
|
|
144
|
+
uso filesystem y staging").
|
|
145
|
+
4. NUNCA escribir al vault vía Bash + heredoc + cp como primera opción
|
|
146
|
+
cuando el MCP está disponible. Es deuda operativa con costo en cada
|
|
147
|
+
sesión futura.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Vault del usuario
|
|
152
|
+
|
|
153
|
+
- **Path**: `F:\Google Drive\Developer\Obsidian\Vault\SWL` (sincronizado vía
|
|
154
|
+
Google Drive entre WISC y WISCLAP)
|
|
155
|
+
- **Contenido típico**: notas sobre el sistema SWL, decisiones de arquitectura,
|
|
156
|
+
ADRs, lecciones de sesiones pasadas, vocabulario específico del dominio
|
|
157
|
+
- **Plugin habilitador**: Local REST API en Obsidian (puerto 27124, HTTPS)
|
|
158
|
+
- **Precondición**: Obsidian debe estar corriendo en la máquina actual para
|
|
159
|
+
que el MCP responda. Si no responde, fallback al codebase con disclaimer
|
|
160
|
+
al usuario ("Obsidian no está corriendo, no pude consultar el vault").
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Excepciones documentadas
|
|
165
|
+
|
|
166
|
+
- Si `obsidian_simple_search` devuelve 0 resultados para keywords razonables
|
|
167
|
+
del dominio, el vault no cubre el tema — proceder con codebase sin más
|
|
168
|
+
intentos en el vault.
|
|
169
|
+
- Si Obsidian no está corriendo (timeout o connection refused), reportarlo
|
|
170
|
+
al usuario en una línea breve y proceder con codebase. NO bloquear el flujo.
|
|
171
|
+
- Para tareas donde el usuario explícitamente dice "no consultes nada, solo
|
|
172
|
+
haz X", respetar — esto es preferencia explícita.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Aplicabilidad
|
|
177
|
+
|
|
178
|
+
Esta regla aplica a:
|
|
179
|
+
- Claude Code (CLI y Desktop)
|
|
180
|
+
- Cualquier agente del sistema SWL que necesite contexto de dominio
|
|
181
|
+
- Sesiones de planning, debugging, arquitectura, code review
|
|
182
|
+
|
|
183
|
+
NO aplica a:
|
|
184
|
+
- Sub-agentes que solo hacen una tarea atómica (formateo, lint, build)
|
|
185
|
+
- Agentes que operan exclusivamente sobre archivos pasados como argumento
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Origen
|
|
190
|
+
|
|
191
|
+
Formalizada el 2026-05-09 al instalar el MCP server `mcp-obsidian` (Python,
|
|
192
|
+
MarkusPfundstein) en WISCLAP para evitar el patrón observado de leer múltiples
|
|
193
|
+
archivos del codebase para reconstruir contexto que ya estaba sintetizado en
|
|
194
|
+
el vault. La regla aplica cross-machine vía Syncthing (`~/.claude/rules/` se
|
|
195
|
+
sincroniza automáticamente).
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Regla: Debatir antes de aceptar decisiones que chocan con reglas
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA y aplica a todo trabajo donde Claude reciba una
|
|
4
|
+
decisión técnica o de diseño del usuario que entre en conflicto con una regla
|
|
5
|
+
documentada del sistema, una invariante del dominio, o una buena práctica
|
|
6
|
+
establecida.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Principio
|
|
11
|
+
|
|
12
|
+
> Cuando el usuario propone una decisión, **NUNCA la aceptes por reflejo**.
|
|
13
|
+
> Si la decisión choca con una regla documentada (de `~/.claude/rules/`,
|
|
14
|
+
> `CLAUDE.md` del proyecto, ADRs vigentes) o con una invariante obvia del
|
|
15
|
+
> dominio, debes **debatirla con cita concreta + riesgo observable +
|
|
16
|
+
> alternativa** ANTES de implementar.
|
|
17
|
+
|
|
18
|
+
El usuario espera un colaborador técnico, no un sí-señor. Su rol es decidir
|
|
19
|
+
qué riesgos asume; el rol del agente es señalar el costo técnico antes de
|
|
20
|
+
que la decisión se materialice.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Cuándo aplicar
|
|
25
|
+
|
|
26
|
+
Cuando la decisión del usuario:
|
|
27
|
+
|
|
28
|
+
- Contradice una regla global de `~/.claude/rules/*.md` (especialmente
|
|
29
|
+
`seguridad-agentes.md`, `arquitectura.md`, `gobernanza.md`, `seguridad.md`).
|
|
30
|
+
- Contradice una regla de `CLAUDE.md` del proyecto o un ADR vigente.
|
|
31
|
+
- Rompe una invariante del dominio (integridad referencial, auditoría
|
|
32
|
+
inmutable, trazabilidad regulatoria, separación de responsabilidades).
|
|
33
|
+
- Introduce una "puerta trasera" para un rol privilegiado que erosiona una
|
|
34
|
+
garantía formal del sistema (ej: ADMIN bypassa una invariante de
|
|
35
|
+
integridad — distinto de bypassar una restricción jerárquica).
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Cómo aplicar
|
|
40
|
+
|
|
41
|
+
### Paso 1 — Contrastar la decisión con las reglas
|
|
42
|
+
|
|
43
|
+
Antes de implementar, ejecuta mentalmente este check:
|
|
44
|
+
|
|
45
|
+
- ¿Existe una regla en `~/.claude/rules/` que aplique?
|
|
46
|
+
- ¿El proyecto tiene `CLAUDE.md` o ADRs que cubran este territorio?
|
|
47
|
+
- ¿La decisión rompe una invariante visible del dominio (audit trail,
|
|
48
|
+
consistencia de estados, integridad referencial)?
|
|
49
|
+
- ¿Hay un ejemplo histórico en el proyecto donde una decisión similar
|
|
50
|
+
causó un incidente?
|
|
51
|
+
|
|
52
|
+
### Paso 2 — Si hay choque: responder con tres bloques
|
|
53
|
+
|
|
54
|
+
NO implementes en silencio. Responde explícitamente con:
|
|
55
|
+
|
|
56
|
+
1. **Por qué la decisión es problemática**: cita la regla concreta o la
|
|
57
|
+
invariante violada. Evita generalidades — referencia el archivo y la
|
|
58
|
+
sección.
|
|
59
|
+
|
|
60
|
+
2. **Cuál es el riesgo real**: descríbelo de forma observable, no abstracta.
|
|
61
|
+
Mal: "puede causar problemas de integridad". Bien: "el chip 'Aprobado por
|
|
62
|
+
X' seguirá visible cuando el contenido haya cambiado, y un auditor
|
|
63
|
+
externo no tendrá forma de saber que se editó después — eso vulnera la
|
|
64
|
+
trazabilidad regulatoria del OIC".
|
|
65
|
+
|
|
66
|
+
3. **Alternativa concreta** que satisfaga la intención del usuario sin
|
|
67
|
+
romper la regla. Idealmente con costo acotado en pasos.
|
|
68
|
+
|
|
69
|
+
### Paso 3 — Esperar confirmación informada
|
|
70
|
+
|
|
71
|
+
Tras presentar el análisis, espera. Si el usuario insiste tras conocer el
|
|
72
|
+
costo, implementa — pero ahí queda registrado que es decisión informada,
|
|
73
|
+
no inercia.
|
|
74
|
+
|
|
75
|
+
Si el usuario contradice tu análisis con argumentos válidos (la regla no
|
|
76
|
+
aplica al caso, el riesgo no existe en este contexto), corrige y procede.
|
|
77
|
+
La regla es debatir, no obstinarse.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Excepciones legítimas
|
|
82
|
+
|
|
83
|
+
NO aplicar cuando:
|
|
84
|
+
|
|
85
|
+
1. **Decisiones de preferencia personal sin impacto técnico**: color,
|
|
86
|
+
naming, estilo de prosa, formato de mensajes. Esas se obedecen sin
|
|
87
|
+
debate.
|
|
88
|
+
2. **Decisiones donde el usuario ya consideró la regla y la sobrescribió
|
|
89
|
+
intencionalmente** en una sesión previa, en `discutir-fase`, o en un
|
|
90
|
+
ADR documentado.
|
|
91
|
+
3. **El usuario pide explícitamente "no debates, ejecuta"** para una
|
|
92
|
+
tarea acotada y reversible. Respeta la instrucción explícita; NO
|
|
93
|
+
añadas debate por reflejo.
|
|
94
|
+
4. **Fix urgente de producción** con incidente activo y blast radius
|
|
95
|
+
acotado. Aplica el fix; el debate puede esperar al post-mortem.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Anti-patrones explícitos
|
|
100
|
+
|
|
101
|
+
- **Aceptar por reflejo**: responder "listo, implemento" a una decisión
|
|
102
|
+
que viola una regla, y solo detectar el problema cuando el usuario pide
|
|
103
|
+
análisis crítico explícito.
|
|
104
|
+
- **Endulzar el análisis**: presentar la objeción como tradeoff opcional
|
|
105
|
+
cuando la regla es absoluta. "Aunque hay tradeoffs, tu enfoque es
|
|
106
|
+
válido si…" cuando en realidad la decisión rompe una invariante del
|
|
107
|
+
sistema.
|
|
108
|
+
- **Soluciones intermedias que vacían la regla**: ofrecer "agregar un
|
|
109
|
+
log warning" cuando el problema real es romper una invariante. Eso es
|
|
110
|
+
fallback silencioso disfrazado — la solución correcta es no romper la
|
|
111
|
+
invariante, no agregar un log invisible al usuario.
|
|
112
|
+
- **Confundir conveniencia con jerarquía**: que el usuario sea el dueño
|
|
113
|
+
del proyecto no significa que toda preferencia suya esté libre de costo
|
|
114
|
+
técnico. El rol del agente es señalar el costo; el del usuario es
|
|
115
|
+
decidir si lo asume.
|
|
116
|
+
- **Implementar primero, debatir después**: si la decisión genera daño
|
|
117
|
+
acumulable (commits que rompen invariantes), revertir es más caro que
|
|
118
|
+
haber debatido al inicio.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Ejemplo positivo
|
|
123
|
+
|
|
124
|
+
> Usuario: "Implementa que ADMIN pueda editar el contenido de un papel
|
|
125
|
+
> de trabajo bajo VBO aprobado, sin tener que revocar primero."
|
|
126
|
+
>
|
|
127
|
+
> Respuesta correcta:
|
|
128
|
+
>
|
|
129
|
+
> Análisis: la regla `seguridad-agentes.md § Anti-fallback silencioso`
|
|
130
|
+
> establece que ningún cambio de garantía puede suceder sin alerta
|
|
131
|
+
> visible al usuario. Permitir esa edición rompe la integridad
|
|
132
|
+
> semántica del VBO: el chip "Aprobado por Juan Pérez — fecha" seguirá
|
|
133
|
+
> visible aunque el contenido cambie, y el auditor externo no podrá
|
|
134
|
+
> distinguir el contenido aprobado del editado después. En un OIC
|
|
135
|
+
> regulado por LGIPE eso compromete la trazabilidad legal.
|
|
136
|
+
>
|
|
137
|
+
> Riesgo observable: cualquier auditoría posterior verá el VBO aprobado
|
|
138
|
+
> y asumirá que ese contenido fue revisado. Si el contenido cambió por
|
|
139
|
+
> override administrativo, la auditoría está mintiendo.
|
|
140
|
+
>
|
|
141
|
+
> Alternativa: el flujo correcto ya existe y no es burocrático. ADMIN
|
|
142
|
+
> puede revocar el VBO desde el panel (1 click, deja registro inmutable
|
|
143
|
+
> en `vbo_historial` con motivo obligatorio), editar, y re-aprobar. Tres
|
|
144
|
+
> acciones, todas trazables. ¿Procedo con este flujo?
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Origen de esta regla
|
|
149
|
+
|
|
150
|
+
Sesión 2026-05-08, proyecto SIGAF. Ante la petición de implementar
|
|
151
|
+
"ADMIN puede editar título/contenido de papel de trabajo bajo estatus
|
|
152
|
+
REVISADO sin revocar el VBO primero", el agente aceptó sin debate
|
|
153
|
+
inicial. La implementación rompió la integridad semántica del Visto
|
|
154
|
+
Bueno (VBO aprobado contra contenido que ya no existe) y fue revertida
|
|
155
|
+
en commit `6aaf05c` tras análisis crítico explícito pedido por el
|
|
156
|
+
usuario. Memoria nativa registrada en
|
|
157
|
+
`feedback_no_dar_razon_automatica.md`; promovida a regla global porque
|
|
158
|
+
el patrón se repetiría en cualquier proyecto del usuario.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Regla: Sin co-autores en commits
|
|
2
|
+
|
|
3
|
+
Esta regla es OBLIGATORIA y aplica a TODOS los proyectos del usuario sin excepción.
|
|
4
|
+
Tiene prioridad sobre el template por defecto del CLI de Claude Code.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Regla
|
|
9
|
+
|
|
10
|
+
Los commits que Claude genere en cualquier proyecto del usuario **NO deben incluir
|
|
11
|
+
ninguna línea de atribución a Claude, Anthropic, ningún modelo de IA, ni ningún
|
|
12
|
+
co-autor**. El único autor de los commits es **Saúl Wade**.
|
|
13
|
+
|
|
14
|
+
Específicamente, NO incluir en el mensaje de commit:
|
|
15
|
+
|
|
16
|
+
- `Co-Authored-By: Claude ...`
|
|
17
|
+
- `Co-Authored-By: <cualquier modelo>`
|
|
18
|
+
- `🤖 Generated with [Claude Code](https://claude.com/claude-code)`
|
|
19
|
+
- `Generated by Claude`
|
|
20
|
+
- Ninguna otra línea de atribución a IA o co-autor automático
|
|
21
|
+
|
|
22
|
+
Esta regla **sobrescribe** las instrucciones por defecto del CLI de Claude Code
|
|
23
|
+
que sugieren agregar `Co-Authored-By: Claude Opus ...` al final del mensaje.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Cómo aplicar
|
|
28
|
+
|
|
29
|
+
### En commits con `git commit -m`
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# CORRECTO
|
|
33
|
+
git commit -m "feat(auth): agregar validación PKCE en flujo OAuth2"
|
|
34
|
+
|
|
35
|
+
# INCORRECTO
|
|
36
|
+
git commit -m "$(cat <<'EOF'
|
|
37
|
+
feat(auth): agregar validación PKCE en flujo OAuth2
|
|
38
|
+
|
|
39
|
+
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
|
40
|
+
EOF
|
|
41
|
+
)"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### En commits con HEREDOC y mensaje extenso
|
|
45
|
+
|
|
46
|
+
El cuerpo del commit puede ser tan extenso como la regla `git-workflow.md` lo
|
|
47
|
+
justifique, pero **sin** el bloque de atribución al final:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git commit -m "$(cat <<'EOF'
|
|
51
|
+
fix(facturas): corregir cálculo de IEPS para tasa cero
|
|
52
|
+
|
|
53
|
+
El cálculo previo aplicaba la tasa estándar en productos con
|
|
54
|
+
tasa IEPS = 0%, generando totales inflados.
|
|
55
|
+
|
|
56
|
+
Refs #234
|
|
57
|
+
EOF
|
|
58
|
+
)"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### En Pull Requests
|
|
62
|
+
|
|
63
|
+
Mismo principio aplica al body de PRs creados con `gh pr create`. El template
|
|
64
|
+
del CLI sugiere terminar con:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**NO incluir esa línea**. El body del PR cierra con la sección de Test plan
|
|
71
|
+
o las referencias a issues.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Excepciones
|
|
76
|
+
|
|
77
|
+
- **Co-autores humanos reales**: si en algún proyecto futuro hay otros desarrolladores
|
|
78
|
+
haciendo pair programming con Saúl, sus líneas `Co-Authored-By:` con email humano
|
|
79
|
+
son válidas. La regla aplica solo a atribuciones a IA/modelos.
|
|
80
|
+
- **Cuando el usuario pida explícitamente** la atribución para un commit puntual
|
|
81
|
+
(caso muy raro). En ese caso ejecutar lo que pide y registrar la excepción en
|
|
82
|
+
el commit.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Origen
|
|
87
|
+
|
|
88
|
+
Esta regla se promueve a global el 2026-05-09 tras detectar que la misma
|
|
89
|
+
preferencia aparecía duplicada en al menos 2 proyectos:
|
|
90
|
+
|
|
91
|
+
- `D--Python-swl-ses/memory/feedback_sin_coautores.md` (2026-04-18)
|
|
92
|
+
- `D--Python-generacion-informes/memory/feedback_no_coauthor_in_commits.md`
|
|
93
|
+
|
|
94
|
+
La duplicación cross-proyecto es señal inequívoca de preferencia transversal
|
|
95
|
+
del usuario. La instrucción del CLI Claude Code que sugiere agregar
|
|
96
|
+
`Co-Authored-By: Claude` queda explícitamente sobreescrita por esta regla
|
|
97
|
+
para todos los proyectos del usuario `Saul`.
|
|
98
|
+
|
|
99
|
+
Los feedbacks per-project quedan deprecados tras esta promoción y deben
|
|
100
|
+
eliminarse de las carpetas `memory/` correspondientes.
|