claude-code-arcane 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +104 -55
- package/agents/career/career-strategist.md +88 -0
- package/agents/career/cv-reviewer.md +81 -0
- package/agents/career/hiring-manager.md +68 -0
- package/agents/career/mock-interviewer.md +76 -0
- package/agents/freelance/client-screener.md +84 -0
- package/agents/freelance/discovery-call.md +65 -0
- package/agents/freelance/pipeline-strategist.md +99 -0
- package/agents/freelance/proposal-reviewer.md +82 -0
- package/agents/game/ue-blueprint-specialist.md +125 -0
- package/agents/game/ue-gas-specialist.md +133 -0
- package/agents/game/ue-umg-specialist.md +131 -0
- package/dist/cli.js +57 -13
- package/docs/RELEASE-SETUP.md +1 -1
- package/docs/SKILLS-CATALOG.md +67 -4
- package/docs/USER-GUIDE.md +77 -72
- package/docs/agent-hierarchy.md +21 -1
- package/docs/presentations/build_arcane_deck.py +2 -2
- package/docs/presentations/build_arcane_deck_12.py +2 -2
- package/hooks/detect-unreal.sh +90 -0
- package/package.json +2 -2
- package/profiles/freelance.yaml +43 -0
- package/profiles/job-hunt.yaml +5 -2
- package/profiles/unreal-dev.yaml +97 -0
- package/rules/drafter-reviewer.md +16 -3
- package/rules/freelance-guardrails.md +53 -0
- package/rules/gamedev/unreal-code.md +125 -0
- package/skills/career-registry/SKILL.md +95 -0
- package/skills/career-registry/scripts/career_registry.py +488 -0
- package/skills/client-screen/SKILL.md +83 -0
- package/skills/client-screen/references/red-flags.md +95 -0
- package/skills/cover-letter/SKILL.md +4 -3
- package/skills/cv-tailor/SKILL.md +11 -2
- package/skills/freelance-deliver/SKILL.md +90 -0
- package/skills/freelance-hunt/SKILL.md +126 -0
- package/skills/freelance-hunt/references/templates/Connects.md +39 -0
- package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
- package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
- package/skills/freelance-kickoff/SKILL.md +94 -0
- package/skills/freelance-pipeline/SKILL.md +109 -0
- package/skills/freelance-pipeline/scripts/import_history.py +425 -0
- package/skills/freelance-profile/SKILL.md +93 -0
- package/skills/freelance-proposal/SKILL.md +112 -0
- package/skills/freelance-scan/SKILL.md +196 -0
- package/skills/freelance-scan/references/dedup.md +35 -0
- package/skills/freelance-scan/references/platforms.md +167 -0
- package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
- package/skills/install-mcp/SKILL.md +135 -46
- package/skills/install-mcp/references/unreal-operations.md +55 -0
- package/skills/interview-prep/SKILL.md +11 -3
- package/skills/job-aplicar/SKILL.md +5 -1
- package/skills/job-hunt/SKILL.md +17 -0
- package/skills/job-outcome/SKILL.md +15 -1
- package/skills/job-upskill/SKILL.md +10 -2
- package/skills/ue-actor-component-architecture/SKILL.md +509 -0
- package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
- package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
- package/skills/ue-ai-navigation/SKILL.md +526 -0
- package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
- package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
- package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
- package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
- package/skills/ue-animation-system/SKILL.md +521 -0
- package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
- package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
- package/skills/ue-async-threading/SKILL.md +433 -0
- package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
- package/skills/ue-async-threading/references/threading-patterns.md +345 -0
- package/skills/ue-audio-system/SKILL.md +527 -0
- package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
- package/skills/ue-blueprints/SKILL.md +134 -0
- package/skills/ue-blueprints/references/communication.md +82 -0
- package/skills/ue-character-movement/SKILL.md +475 -0
- package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
- package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
- package/skills/ue-cpp-foundations/SKILL.md +533 -0
- package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
- package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
- package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
- package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
- package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
- package/skills/ue-data-assets-tables/SKILL.md +527 -0
- package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
- package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
- package/skills/ue-editor-tools/SKILL.md +523 -0
- package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
- package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
- package/skills/ue-game-features/SKILL.md +477 -0
- package/skills/ue-game-features/references/experience-system.md +222 -0
- package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
- package/skills/ue-gameplay-abilities/SKILL.md +518 -0
- package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
- package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
- package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
- package/skills/ue-gameplay-framework/SKILL.md +466 -0
- package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
- package/skills/ue-input-system/SKILL.md +394 -0
- package/skills/ue-input-system/references/cpp-setup.md +131 -0
- package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
- package/skills/ue-input-system/references/input-action-reference.md +731 -0
- package/skills/ue-mass-entity/SKILL.md +476 -0
- package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
- package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
- package/skills/ue-materials-rendering/SKILL.md +526 -0
- package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
- package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
- package/skills/ue-module-build-system/SKILL.md +487 -0
- package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
- package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
- package/skills/ue-naming-conventions/SKILL.md +142 -0
- package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
- package/skills/ue-naming-conventions/references/content-structure.md +83 -0
- package/skills/ue-networking-replication/SKILL.md +452 -0
- package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
- package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
- package/skills/ue-niagara-effects/SKILL.md +531 -0
- package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
- package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
- package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
- package/skills/ue-packaging/SKILL.md +116 -0
- package/skills/ue-physics-collision/SKILL.md +423 -0
- package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
- package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
- package/skills/ue-procedural-generation/SKILL.md +505 -0
- package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
- package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
- package/skills/ue-project-context/SKILL.md +305 -0
- package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
- package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
- package/skills/ue-serialization-savegames/SKILL.md +524 -0
- package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
- package/skills/ue-state-trees/SKILL.md +489 -0
- package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
- package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
- package/skills/ue-testing-debugging/SKILL.md +520 -0
- package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
- package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
- package/skills/ue-ui-umg-slate/SKILL.md +431 -0
- package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
- package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
- package/skills/ue-world-level-streaming/SKILL.md +518 -0
- package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
- package/templates/gamedev/unreal-project-context.md +107 -0
|
@@ -4,7 +4,7 @@ description: "Write concise, confident cover letters and application messages ta
|
|
|
4
4
|
argument-hint: "[application-note | company + role]"
|
|
5
5
|
category: "career"
|
|
6
6
|
user-invocable: true
|
|
7
|
-
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch, Task
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Cover Letter - Mensaje de aplicación de élite
|
|
@@ -47,7 +47,8 @@ Escribís cover letters y mensajes de aplicación **concisos, seguros y custom**
|
|
|
47
47
|
2. Elegir formato según canal.
|
|
48
48
|
3. Draftear. Después **cortar sin piedad** todo lo genérico.
|
|
49
49
|
4. Generar 2 variantes de apertura si el usuario quiere elegir.
|
|
50
|
-
5.
|
|
50
|
+
5. **Review (regla drafter-reviewer, obligatorio si la carta va a una postulación concreta).** Lanzar el agente `cv-reviewer` de contexto fresco con el JD y el borrador inline; aplicar la Parte A e incorporar de la Parte B lo que corresponda. Una sola ronda. El primer renglón es lo que más gana con una lectura fresca: el que la escribió ya está convencido de su propio gancho. No aplica a mensajes cortos reutilizables de `07-Recursos/`.
|
|
51
|
+
6. Guardar en la nota de aplicación (`03-Aplicaciones/`, sección cover letter) o en `07-Recursos/` si es reutilizable.
|
|
51
52
|
|
|
52
53
|
## Idioma
|
|
53
54
|
|
|
@@ -63,4 +64,4 @@ Inglés para roles internacionales; español si la empresa es hispanohablante. E
|
|
|
63
64
|
|
|
64
65
|
## Handoff
|
|
65
66
|
|
|
66
|
-
Pedí aprobación (approval) antes de guardar la carta en la nota de aplicación o en `07-Recursos/`. Cuando la cover letter está READY, el siguiente paso es `/cold-outreach` si hay un contacto al que escribirle directo.
|
|
67
|
+
Pedí aprobación (approval) antes de guardar la carta en la nota de aplicación o en `07-Recursos/`. Cuando la cover letter está READY y pasó el review del paso 5, el siguiente paso es `/cold-outreach` si hay un contacto al que escribirle directo.
|
|
@@ -4,7 +4,7 @@ description: "Tailor a CV to a specific job description: extract ATS keywords, d
|
|
|
4
4
|
argument-hint: "[job-url | path-to-jd | application-note]"
|
|
5
5
|
category: "career"
|
|
6
6
|
user-invocable: true
|
|
7
|
-
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, WebFetch, Task
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# CV Tailor - Adaptar el CV a la oferta
|
|
@@ -46,6 +46,14 @@ Tomás un job description y el perfil base del usuario, y producís un **CV cust
|
|
|
46
46
|
- Documentar las decisiones (keywords, qué se resaltó/bajó) en las secciones del template - sirve para la entrevista y para iterar.
|
|
47
47
|
- El cuerpo del CV en sí debe quedar listo para `/cv-ats-export` (markdown limpio: `# nombre`, `## secciones`, bullets, `---`).
|
|
48
48
|
|
|
49
|
+
### 6. Review antes de exportar (regla drafter-reviewer, obligatorio)
|
|
50
|
+
|
|
51
|
+
Con el `.md` aprobado y **antes** de mandar a `/cv-ats-export`, seguir `.claude/rules/drafter-reviewer.md`: lanzar el agente `cv-reviewer` de contexto fresco con el JD y el borrador inline. Aplicar la Parte A (reemplazos exactos) e incorporar de la Parte B lo que corresponda. Una sola ronda.
|
|
52
|
+
|
|
53
|
+
Si el rol es senior o la postulación importa, lanzar además `hiring-manager` en paralelo - contesta si el CV convence a quien contrata, que es una pregunta distinta.
|
|
54
|
+
|
|
55
|
+
El que redacta no se auto-revisa: no saltear este paso porque el CV "ya quedó bien". Si el usuario decide exportar sin review, avisar que se está saltando la regla y seguir.
|
|
56
|
+
|
|
49
57
|
## Formato del CV (ATS-friendly)
|
|
50
58
|
|
|
51
59
|
- **Una columna.** Sin tablas, sin cajas de texto, sin columnas - los ATS las leen mal.
|
|
@@ -64,7 +72,8 @@ CV en **inglés** para roles internacionales/remotos globales; **español** si l
|
|
|
64
72
|
- No keyword-stuffing: cada keyword debe vivir en un bullet verdadero.
|
|
65
73
|
- Un CV custom por postulación - no pisar el perfil base ni el maestro.
|
|
66
74
|
- Después de generar el `.md`, recordar al usuario correr `/cv-ats-export` para el PDF.
|
|
75
|
+
- No exportar a PDF sin pasar por el review del paso 6.
|
|
67
76
|
|
|
68
77
|
## Handoff
|
|
69
78
|
|
|
70
|
-
Pedí aprobación (approval) antes de escribir el CV custom. Cuando el `.md` está READY, el siguiente paso es `/cv-ats-export` para generar el PDF ATS y `/cover-letter` para el mensaje.
|
|
79
|
+
Pedí aprobación (approval) antes de escribir el CV custom. Cuando el `.md` está READY, corré el review del paso 6 (`cv-reviewer`); recién con el feedback aplicado el siguiente paso es `/cv-ats-export` para generar el PDF ATS y `/cover-letter` para el mensaje.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freelance-deliver
|
|
3
|
+
description: "Track an active contract while it runs: log hours against the estimate, catch scope creep the day it happens instead of at invoice time, and draft the change order before doing the extra work. Triggers: registrar horas, el cliente me pidio algo mas, esto no estaba en el alcance, scope creep, como va el contrato, change order, cerrar el contrato."
|
|
4
|
+
argument-hint: "[log | check | change | close]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Task
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Freelance Deliver - Ejecutar sin regalar horas
|
|
11
|
+
|
|
12
|
+
El loop mientras el proyecto corre. Tres cosas: registrar horas, detectar cuando el alcance se movió, y cobrarlo antes de hacerlo.
|
|
13
|
+
|
|
14
|
+
Rutas relativas al career workspace (`--workspace`, env `CAREER_WORKSPACE`, o `./career-workspace/`).
|
|
15
|
+
|
|
16
|
+
Modo: `$ARGUMENTS`
|
|
17
|
+
|
|
18
|
+
## Por qué el momento importa
|
|
19
|
+
|
|
20
|
+
El scope creep no se detecta al facturar: **se detecta el día que pasa**, y casi siempre entra disfrazado de favor. "¿Me agregás esto rapidito?" es la frase que más plata cuesta en freelance, y funciona porque en el momento parece chico y decir no parece desproporcionado.
|
|
21
|
+
|
|
22
|
+
Un mes después son 18 horas que nadie va a pagar, y ahí ya es tarde: pedir plata por trabajo entregado suena a reclamo; pedirla antes suena a profesional.
|
|
23
|
+
|
|
24
|
+
## Modos
|
|
25
|
+
|
|
26
|
+
### `log` - registrar horas
|
|
27
|
+
|
|
28
|
+
Agregar filas a `## Horas registradas` de la nota del contrato: fecha, horas, qué se hizo, y **si es facturable o no**.
|
|
29
|
+
|
|
30
|
+
Esa última columna es la que casi nadie lleva y la que hace toda la diferencia: las reuniones, el ida y vuelta por accesos y las rondas de revisión son horas reales de tu semana. Si no se registran, tu tarifa efectiva parece mejor de lo que es y vas a seguir cotizando mal.
|
|
31
|
+
|
|
32
|
+
Después de registrar, correr `check` si el acumulado se acercó al estimado.
|
|
33
|
+
|
|
34
|
+
### `check` - cómo va
|
|
35
|
+
|
|
36
|
+
1. Sumar horas registradas y comparar contra `horas_estimadas` de la nota.
|
|
37
|
+
2. Estado de los milestones: entregados, vencidos, pendientes de aprobación del cliente.
|
|
38
|
+
3. Semáforo, y lo importante es qué hacer con cada color:
|
|
39
|
+
|
|
40
|
+
| Consumido del estimado | Qué significa |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Menos del 70% con el alcance avanzando | Va bien |
|
|
43
|
+
| 70-100% con alcance pendiente | **Avisar al cliente ahora**, no al pasarse |
|
|
44
|
+
| Arriba del 100% | Parar y ver si fue mala estimación (se absorbe y se aprende) o alcance nuevo (se cobra) |
|
|
45
|
+
|
|
46
|
+
Esa distinción es la única que importa: **subestimé** contra **me pidieron más**. La primera es tu costo; la segunda es un change order. Confundirlas te hace pagar por errores del cliente o cobrarle por los tuyos.
|
|
47
|
+
|
|
48
|
+
4. Detectar tareas hechas que no están en el alcance acordado. Si hay, ofrecer `change`.
|
|
49
|
+
|
|
50
|
+
### `change` - el change order
|
|
51
|
+
|
|
52
|
+
Cuando el cliente pide algo fuera del alcance acordado:
|
|
53
|
+
|
|
54
|
+
1. **Nombrarlo como alcance nuevo** en el momento y sin dramatizar: no es un reclamo, es cómo funciona. "Eso lo puedo hacer, está fuera del alcance de este contrato, te paso el número."
|
|
55
|
+
2. Estimar con `/estimate` y cotizar con el mismo criterio que la propuesta original: sobre el piso neto, con buffer.
|
|
56
|
+
3. Redactar el change order con `/contract-and-proposal-writer`.
|
|
57
|
+
4. Registrarlo en `## Change orders` de la nota con estado `propuesto`.
|
|
58
|
+
5. **No hacer el trabajo hasta que esté aprobado.** Es la regla 3 de `freelance-guardrails`: alcance nuevo, precio nuevo.
|
|
59
|
+
|
|
60
|
+
Si el usuario decide regalarlo (porque es chico, o por relación con el cliente), **está bien - pero se registra igual** con monto 0 y el motivo. Lo que no se registra no se puede medir, y `/freelance-pipeline` necesita saber cuánto trabajo regalado hay para decirte si es un patrón.
|
|
61
|
+
|
|
62
|
+
### `close` - cerrar el contrato
|
|
63
|
+
|
|
64
|
+
1. Completar `## Cierre`: entregado, cobrado, calificación recibida, y **qué haría distinto** (esa línea es la que sirve para cotizar el próximo).
|
|
65
|
+
2. `estado: cerrado`, y `/job-outcome` para mover la nota de la propuesta.
|
|
66
|
+
3. Comparar estimado contra real y dejarlo escrito. Es el dato más valioso del contrato entero: sin él, la próxima estimación es otra vez a ojo.
|
|
67
|
+
4. Ofrecer `/freelance-pipeline` si ya hay volumen, y `/cold-outreach` para pedir la referencia mientras el trabajo está fresco.
|
|
68
|
+
|
|
69
|
+
## Verificación rápida del estado
|
|
70
|
+
|
|
71
|
+
Para ver de una todos los contratos con horas por encima de lo estimado, sin abrirlos uno por uno:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
python .claude/skills/career-registry/scripts/career_registry.py audit
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Devuelve `contratos_con_horas_arriba_de_lo_estimado` con el exceso en horas y en porcentaje. Es la entrada natural de este skill cuando el usuario pregunta "¿cómo vengo?".
|
|
78
|
+
|
|
79
|
+
## Reglas
|
|
80
|
+
|
|
81
|
+
- **Nunca hacer trabajo fuera del alcance sin cotizarlo primero.** Si el usuario decide regalarlo, se registra con monto 0 y motivo.
|
|
82
|
+
- **Distinguir siempre subestimación de alcance nuevo.** Son dos cosas y se pagan distinto.
|
|
83
|
+
- Registrar las horas **no facturables** también: son las que explican por qué tu tarifa real es menor que la nominal.
|
|
84
|
+
- No editar el alcance acordado para que coincida con lo que se hizo. El alcance es el que se firmó; lo demás es change order.
|
|
85
|
+
- Nunca marcar un milestone como cobrado sin que el usuario lo confirme.
|
|
86
|
+
- Sin guiones largos en el texto agregado a las notas.
|
|
87
|
+
|
|
88
|
+
## Handoff
|
|
89
|
+
|
|
90
|
+
Pedí aprobación (approval) antes de escribir en la nota del contrato. Entrega COMPLETE cuando las horas están registradas y el alcance está alineado o hay un change order propuesto. Según el caso, el siguiente paso es `/contract-and-proposal-writer` (redactar el change order), `/job-outcome` (mover el estado al cerrar) o `/freelance-pipeline` (con 10+ propuestas resueltas, el diagnóstico del negocio).
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freelance-hunt
|
|
3
|
+
description: "Entry point for the freelance skillset: extends the career workspace with contracts and a Connects ledger, then routes to the right skill. Triggers: freelance, upwork, buscar proyectos como freelancer, conseguir clientes, pipeline freelance, setup freelance workspace, cuanto gano por hora."
|
|
4
|
+
argument-hint: "[setup | status | next]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Freelance Hunt - Orquestador del pipeline freelance
|
|
11
|
+
|
|
12
|
+
Sos el punto de entrada de la suite freelance. Detectás (o extendés) el career workspace, entendés en qué etapa está el usuario, y ruteás al skill correcto. No hacés todo vos - orquestás.
|
|
13
|
+
|
|
14
|
+
## Un solo workspace, no dos
|
|
15
|
+
|
|
16
|
+
El perfil **reutiliza el career workspace** de `+job-hunt` (default `./career-workspace/`, o env `CAREER_WORKSPACE`). No crea uno paralelo, y esto es deliberado: `01-Perfiles/` es la única fuente de verdad de la experiencia del usuario. Dos workspaces serían dos perfiles maestros divergiendo, que es exactamente el problema que el perfil maestro resuelve.
|
|
17
|
+
|
|
18
|
+
Lo que agrega el perfil freelance:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
career-workspace/
|
|
22
|
+
03-Aplicaciones/ ← compartida: empleos Y propuestas (discrimina `tipo:`)
|
|
23
|
+
04-Empresas/ ← compartida: empresas Y clientes
|
|
24
|
+
08-Contratos/ NUEVA: contratos activos, milestones, horas, change orders
|
|
25
|
+
07-Recursos/
|
|
26
|
+
Connects - YYYY.md NUEVO: ledger del costo de postularse (Connects en Upwork,
|
|
27
|
+
bids en otras plataformas, horas en outreach directo)
|
|
28
|
+
Templates/
|
|
29
|
+
Propuesta.md NUEVO
|
|
30
|
+
Contrato.md NUEVO
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Una propuesta **es** una aplicación: vive en `03-Aplicaciones/` con `tipo: freelance`. Un cliente **es** una empresa: vive en `04-Empresas/`. Así `/job-outcome`, `/cold-outreach` y `/master-profile` funcionan sobre las dos mitades sin cambios.
|
|
34
|
+
|
|
35
|
+
Si el usuario no tiene `+job-hunt` instalado, el modo `setup` crea el árbol completo igual: el workspace no depende del otro perfil, solo lo comparte.
|
|
36
|
+
|
|
37
|
+
## Vocabulario de estados
|
|
38
|
+
|
|
39
|
+
Frontmatter `estado` para `tipo: freelance`:
|
|
40
|
+
|
|
41
|
+
`interesado → screeneado → propuesta_enviada → en_conversacion → contrato_activo → entregado`
|
|
42
|
+
|
|
43
|
+
Cierres: `ganado_cerrado | sin_respuesta | rechazado | descartado | disputa`
|
|
44
|
+
|
|
45
|
+
`descartado` es una decisión activa y se registra igual que una propuesta enviada: los descartes son la mitad de los datos que `/freelance-pipeline` necesita (ver `freelance-guardrails`, sección Registro). Los estados los mueve `/job-outcome`; ninguna otra skill marca `propuesta_enviada`.
|
|
46
|
+
|
|
47
|
+
## Modos
|
|
48
|
+
|
|
49
|
+
### `setup` - Preparar el workspace
|
|
50
|
+
|
|
51
|
+
1. Detectar si ya existe el career workspace. Si existe, **extenderlo**; si no, crear el árbol completo (mismo que `/job-hunt setup`).
|
|
52
|
+
2. Crear `08-Contratos/` y copiar `Propuesta.md` y `Contrato.md` desde `references/templates/` a `Templates/`.
|
|
53
|
+
3. Crear el ledger `07-Recursos/Connects - <año>.md` desde `references/templates/Connects.md`.
|
|
54
|
+
4. Agregar al `00-Dashboard.md` las secciones freelance (propuestas activas, contratos en curso, Connects del mes). Si el dashboard no existe, crearlo.
|
|
55
|
+
5. Preguntar y registrar en `01-Perfiles/` los **dos números que gobiernan todo el perfil**: el piso de tarifa neto y la capacidad semanal de horas facturables. Sin el piso, `/freelance-proposal` no puede validar un bid (ver `freelance-guardrails` regla 3).
|
|
56
|
+
6. Si el usuario ya tiene cuenta en alguna plataforma, sugerir `/freelance-profile` como siguiente paso; si no, `/master-profile` primero. Si todavía no sabe qué piso poner, `/freelance-scan market` da la mediana de lo que cobran otros con su perfil.
|
|
57
|
+
|
|
58
|
+
### `status` - Dónde estoy
|
|
59
|
+
|
|
60
|
+
1. Leer `00-Dashboard.md`, escanear `03-Aplicaciones/` filtrando `tipo: freelance`, y `08-Contratos/`.
|
|
61
|
+
2. Resumir: propuestas esperando respuesta (con días transcurridos), contratos activos y su avance, Connects gastados en el mes contra resultados, horas facturables comprometidas contra capacidad.
|
|
62
|
+
3. Marcar lo que necesita acción hoy: propuestas sin respuesta hace 7+ días, milestones vencidos, contratos con horas por encima de lo estimado.
|
|
63
|
+
4. Recomendar la acción de mayor impacto.
|
|
64
|
+
|
|
65
|
+
### `next` - Qué hago ahora
|
|
66
|
+
|
|
67
|
+
Según el estado del workspace, recomendar el skill siguiente (ver routing).
|
|
68
|
+
|
|
69
|
+
## Routing
|
|
70
|
+
|
|
71
|
+
| Situación | Skill |
|
|
72
|
+
|-----------|-------|
|
|
73
|
+
| No hay workspace | `/freelance-hunt setup` |
|
|
74
|
+
| Falta perfil maestro | `/master-profile` |
|
|
75
|
+
| Perfil de plataforma flojo o vacío | `/freelance-profile` |
|
|
76
|
+
| Buscar y scorear ofertas | `/freelance-scan` |
|
|
77
|
+
| Qué cobran otros con mi perfil | `/freelance-scan market` |
|
|
78
|
+
| Evaluar riesgo de un cliente | `/client-screen` |
|
|
79
|
+
| Escribir la propuesta y el bid | `/freelance-proposal` |
|
|
80
|
+
| Contrato, SOW, NDA o change order | `/contract-and-proposal-writer` |
|
|
81
|
+
| Estimar esfuerzo de un proyecto | `/estimate` |
|
|
82
|
+
| Registrar respuesta o resultado | `/job-outcome` |
|
|
83
|
+
| ¿Ya me postulé acá? / exportar el registro a CSV | `/career-registry` |
|
|
84
|
+
| Mensaje directo a un cliente o follow-up | `/cold-outreach` |
|
|
85
|
+
| Portfolio web | `/portfolio-site` |
|
|
86
|
+
| Gané el proyecto: desarmar alcance y validar horas | `/freelance-kickoff` |
|
|
87
|
+
| Registrar horas, scope creep, change orders | `/freelance-deliver` |
|
|
88
|
+
| ROI de Connects, utilización, tarifa efectiva | `/freelance-pipeline` |
|
|
89
|
+
|
|
90
|
+
## Los 4 agentes del perfil
|
|
91
|
+
|
|
92
|
+
El perfil instala `agents/freelance/`. Existen porque hay lecturas que solo sirven con contexto fresco, y son read-only: devuelven análisis, los archivos los escribe la sesión principal.
|
|
93
|
+
|
|
94
|
+
| Agente | Contesta | Lo lanza |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `client-screener` | ¿Este cliente es un riesgo? (adversarial por diseño) | `/client-screen` |
|
|
97
|
+
| `proposal-reviewer` | ¿Vale gastar Connects en esta propuesta? | `/freelance-proposal` |
|
|
98
|
+
| `discovery-call` | ¿Aguanto la llamada, el regateo y el alcance de contrabando? | `/freelance-proposal`, `/client-screen` |
|
|
99
|
+
| `pipeline-strategist` | ¿Esto es un negocio o un pasatiempo caro? | `/freelance-pipeline` (10+ propuestas resueltas) |
|
|
100
|
+
|
|
101
|
+
`client-screener` y `proposal-reviewer` corren **en paralelo** cuando van los dos: son preguntas independientes.
|
|
102
|
+
|
|
103
|
+
## Workflow estándar para una oportunidad
|
|
104
|
+
|
|
105
|
+
1. `/freelance-scan` → ofertas scoreadas, dedup contra corridas anteriores.
|
|
106
|
+
2. `/client-screen` → riesgo del cliente. **Si el veredicto es no postularse, se registra el descarte y termina acá.** Ese es el paso que ahorra plata.
|
|
107
|
+
3. `/estimate` → esfuerzo real del alcance descrito.
|
|
108
|
+
4. `/freelance-proposal` → propuesta + bid sobre el piso + review con `proposal-reviewer`.
|
|
109
|
+
5. Enviar (**siempre manual**) → `/job-outcome` para marcar `propuesta_enviada` y registrar el gasto de Connects.
|
|
110
|
+
6. Si el cliente responde → ensayar con `discovery-call`, después la llamada real.
|
|
111
|
+
7. Si se cierra → `/contract-and-proposal-writer` para el SOW, nota en `08-Contratos/`.
|
|
112
|
+
8. **`/freelance-kickoff`** → desarmar el alcance y validar si entra en lo cotizado. Acá se descubre la brecha, no en la semana 5.
|
|
113
|
+
9. Mientras se ejecuta → `/freelance-deliver` para horas, scope creep y change orders.
|
|
114
|
+
10. Al cerrar → `/freelance-deliver close`, y cada 2 semanas o con 10+ propuestas resueltas, `/freelance-pipeline`.
|
|
115
|
+
|
|
116
|
+
## Reglas
|
|
117
|
+
|
|
118
|
+
- Regla del perfil: `freelance-guardrails`. Las cuatro no son sugerencias - los Connects son plata, el JSS es un activo, el piso no se negocia y el envío es manual.
|
|
119
|
+
- Nunca reorganizar carpetas ni renombrar notas sin preguntar - rompe `[[wikilinks]]` en silencio.
|
|
120
|
+
- Nunca commitear datos sensibles (montos, datos de clientes, mails) a un remoto sin confirmación explícita.
|
|
121
|
+
- Preservar los prefijos numéricos al crear archivos.
|
|
122
|
+
- Máximo accionable: el usuario siempre termina sabiendo qué skill correr next.
|
|
123
|
+
|
|
124
|
+
## Handoff
|
|
125
|
+
|
|
126
|
+
Pedí aprobación (approval) antes de escribir o sobrescribir archivos del workspace. Cuando el workspace queda READY, el siguiente paso es `/freelance-profile` si ya hay cuenta en una plataforma, o `/master-profile` si falta el perfil maestro.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
tipo: costo-postulaciones
|
|
3
|
+
anio: {{date:YYYY}}
|
|
4
|
+
fecha_actualizacion: {{date:YYYY-MM-DD}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ledger del costo de postularse {{date:YYYY}}
|
|
8
|
+
|
|
9
|
+
> Cada fila es plata gastada. Sin este registro, `/freelance-pipeline` no puede calcular costo de adquisición ni cuánto se fue en ofertas que nunca contrataron a nadie.
|
|
10
|
+
>
|
|
11
|
+
> La unidad depende de la plataforma: Connects en Upwork, bids en Freelancer.com, horas de escritura en outreach directo. Anotá la que uses y sé consistente.
|
|
12
|
+
|
|
13
|
+
## Registro
|
|
14
|
+
|
|
15
|
+
| Fecha | Propuesta | Costo | Unidad | Resultado | Días hasta respuesta |
|
|
16
|
+
|---|---|---|---|---|---|
|
|
17
|
+
| | [[]] | | connects | esperando | |
|
|
18
|
+
|
|
19
|
+
%% Resultado: esperando / sin_respuesta / respondio / llamada / ganado / oferta_nunca_contrato %%
|
|
20
|
+
%% "oferta_nunca_contrato" es la categoria que mas duele y la mas evitable: el cliente cerro sin contratar a nadie. Marcarla cuando se detecte. %%
|
|
21
|
+
|
|
22
|
+
## Compras de presupuesto de postulaciones
|
|
23
|
+
|
|
24
|
+
| Fecha | Cantidad | Costo | Fuente |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| | | | comprados |
|
|
27
|
+
|
|
28
|
+
%% Fuente: incluidos_plan / comprados / devueltos %%
|
|
29
|
+
|
|
30
|
+
## Resumen del año
|
|
31
|
+
|
|
32
|
+
- **Total gastado:**
|
|
33
|
+
- **Contratos ganados:**
|
|
34
|
+
- **Costo de adquisición** (total gastado / contratos ganados):
|
|
35
|
+
- **Perdido en ofertas que nunca contrataron a nadie:**
|
|
36
|
+
- **Devuelto** (Upwork reintegra Connects en algunos casos):
|
|
37
|
+
|
|
38
|
+
## Notas
|
|
39
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
tipo: contrato
|
|
3
|
+
cliente:
|
|
4
|
+
propuesta:
|
|
5
|
+
plataforma: upwork
|
|
6
|
+
estado: activo
|
|
7
|
+
modalidad_precio:
|
|
8
|
+
monto_acordado:
|
|
9
|
+
horas_estimadas:
|
|
10
|
+
horas_reales:
|
|
11
|
+
fecha_inicio: {{date:YYYY-MM-DD}}
|
|
12
|
+
fecha_cierre:
|
|
13
|
+
fecha_actualizacion: {{date:YYYY-MM-DD}}
|
|
14
|
+
calificacion_recibida:
|
|
15
|
+
---
|
|
16
|
+
%% estado: activo -> entregado -> cerrado | problemas: pausado / disputa %%
|
|
17
|
+
|
|
18
|
+
# {{title}}
|
|
19
|
+
|
|
20
|
+
## Contrato
|
|
21
|
+
- **Cliente:** [[]]
|
|
22
|
+
- **Propuesta origen:** [[]]
|
|
23
|
+
- **SOW / contrato firmado:**
|
|
24
|
+
|
|
25
|
+
## Alcance acordado
|
|
26
|
+
%% lo que entra. Todo lo que no este escrito aca es alcance nuevo y se cotiza aparte %%
|
|
27
|
+
-
|
|
28
|
+
|
|
29
|
+
## Alcance explicitamente excluido
|
|
30
|
+
%% lo que NO entra. Escribirlo ahorra la discusion de la semana 6 %%
|
|
31
|
+
-
|
|
32
|
+
|
|
33
|
+
## Criterios de aceptación
|
|
34
|
+
%% como sabemos que esta terminado. Sin esto, "terminado" lo define el cliente cuando quiera %%
|
|
35
|
+
-
|
|
36
|
+
|
|
37
|
+
## Milestones
|
|
38
|
+
| # | Entregable | Monto | Fecha objetivo | Estado |
|
|
39
|
+
|---|---|---|---|---|
|
|
40
|
+
| 1 | | | | pendiente |
|
|
41
|
+
|
|
42
|
+
## Horas registradas
|
|
43
|
+
| Fecha | Horas | Qué se hizo | Facturable |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| | | | sí |
|
|
46
|
+
|
|
47
|
+
## Change orders
|
|
48
|
+
%% alcance nuevo, precio nuevo. Cada pedido fuera del alcance acordado va aca ANTES de hacerlo %%
|
|
49
|
+
| Fecha | Qué pidió | Horas | Monto | Estado |
|
|
50
|
+
|---|---|---|---|---|
|
|
51
|
+
| | | | | propuesto |
|
|
52
|
+
|
|
53
|
+
## Cierre
|
|
54
|
+
- **Entregado:**
|
|
55
|
+
- **Cobrado:**
|
|
56
|
+
- **Calificación recibida:**
|
|
57
|
+
- **Qué haría distinto:**
|
|
58
|
+
|
|
59
|
+
## Notas
|
|
60
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
tipo: freelance
|
|
3
|
+
cliente:
|
|
4
|
+
plataforma: upwork
|
|
5
|
+
perfil:
|
|
6
|
+
estado: interesado
|
|
7
|
+
match_score:
|
|
8
|
+
riesgo_cliente:
|
|
9
|
+
connects_gastados:
|
|
10
|
+
bid:
|
|
11
|
+
modalidad_precio:
|
|
12
|
+
fecha_envio:
|
|
13
|
+
fecha_actualizacion: {{date:YYYY-MM-DD}}
|
|
14
|
+
link_oferta:
|
|
15
|
+
presupuesto_cliente:
|
|
16
|
+
prioridad: media
|
|
17
|
+
---
|
|
18
|
+
%% estado: interesado -> screeneado -> propuesta_enviada -> en_conversacion -> contrato_activo -> entregado | cierres: ganado_cerrado / sin_respuesta / rechazado / descartado / disputa (los mueve /job-outcome) %%
|
|
19
|
+
%% modalidad_precio: fijo | hora %%
|
|
20
|
+
|
|
21
|
+
# {{title}}
|
|
22
|
+
|
|
23
|
+
## Oferta y cliente
|
|
24
|
+
- **Cliente:** [[]]
|
|
25
|
+
- **Qué pide:**
|
|
26
|
+
- **Link:**
|
|
27
|
+
- **Presupuesto declarado:**
|
|
28
|
+
|
|
29
|
+
## Screen del cliente
|
|
30
|
+
%% lo llena /client-screen - si el veredicto fue no postularse, estado: descartado y el motivo en Notas %%
|
|
31
|
+
- **Nivel de riesgo:**
|
|
32
|
+
- **Payment verificado:**
|
|
33
|
+
- **Hire rate / contrataciones / total gastado:**
|
|
34
|
+
- **Promedio pagado por hora:**
|
|
35
|
+
- **Brecha presupuesto vs alcance:**
|
|
36
|
+
- **Red flags encontradas:**
|
|
37
|
+
-
|
|
38
|
+
- **Riesgo de JSS:**
|
|
39
|
+
- **Preguntas a hacer antes de comprometerse:**
|
|
40
|
+
-
|
|
41
|
+
|
|
42
|
+
## Match con mi perfil
|
|
43
|
+
- Perfil usado: [[]]
|
|
44
|
+
- Qué cubro con evidencia real:
|
|
45
|
+
-
|
|
46
|
+
- Gaps honestos:
|
|
47
|
+
-
|
|
48
|
+
|
|
49
|
+
## Cotización
|
|
50
|
+
%% lo llena /freelance-proposal - el piso es neto, el bid tiene que cubrir la comision %%
|
|
51
|
+
- **Esfuerzo estimado:**
|
|
52
|
+
- **Buffer de riesgo aplicado:**
|
|
53
|
+
- **Horas no facturables previstas:**
|
|
54
|
+
- **Piso neto del perfil:**
|
|
55
|
+
- **Bid final:**
|
|
56
|
+
- **Por qué este número:**
|
|
57
|
+
|
|
58
|
+
## Propuesta
|
|
59
|
+
%% las dos primeras lineas son lo unico que el cliente ve en la lista %%
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## Timeline / seguimiento
|
|
63
|
+
- {{date:YYYY-MM-DD}} - creada la nota
|
|
64
|
+
|
|
65
|
+
## Notas
|
|
66
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freelance-kickoff
|
|
3
|
+
description: "Turn a won contract into an executable plan: break the scope into deliverables, write the acceptance criteria, and validate honestly whether what you promised fits the hours you quoted - before week five. Then hand off to the technical skills. Triggers: gane el proyecto, arrancar el contrato, kickoff, desarmar el alcance, criterios de aceptacion, me alcanzan las horas que cotice, planificar el proyecto freelance."
|
|
4
|
+
argument-hint: "[nota de contrato | cliente]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash, Write, Edit, WebFetch, Task
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Freelance Kickoff - Del contrato al plan
|
|
11
|
+
|
|
12
|
+
Ganaste el proyecto. Ahora hay que convertir la propuesta en algo ejecutable, y sobre todo **descubrir ahora y no en la semana 5** si lo que prometiste entra en las horas que cotizaste.
|
|
13
|
+
|
|
14
|
+
Rutas relativas al career workspace (`--workspace`, env `CAREER_WORKSPACE`, o `./career-workspace/`).
|
|
15
|
+
|
|
16
|
+
Contrato o cliente: `$ARGUMENTS`
|
|
17
|
+
|
|
18
|
+
## Por qué existe este paso
|
|
19
|
+
|
|
20
|
+
El resto del perfil te ayuda a conseguir el trabajo. Este es el primero que te ayuda a **hacerlo**, y existe porque el momento de mayor riesgo del freelance no es postularse: es la brecha entre lo que la propuesta dice y lo que el trabajo realmente pide.
|
|
21
|
+
|
|
22
|
+
Esa brecha se descubre siempre. La única variable es cuándo: acá, cuando todavía se puede renegociar, o en la semana 5, cuando ya es tu problema.
|
|
23
|
+
|
|
24
|
+
## Inputs
|
|
25
|
+
|
|
26
|
+
- **La nota del contrato** (`08-Contratos/`) y la propuesta que la originó (`03-Aplicaciones/`).
|
|
27
|
+
- **El SOW o contrato firmado** si existe, y si no, avisar: sin alcance escrito no hay alcance.
|
|
28
|
+
- La nota de `/client-screen`: lo que ahí quedó marcado como alcance difuso es exactamente lo que hay que cerrar ahora.
|
|
29
|
+
- El perfil de `01-Perfiles/` para el piso de tarifa y la capacidad semanal.
|
|
30
|
+
|
|
31
|
+
## Proceso
|
|
32
|
+
|
|
33
|
+
### 1. Desarmar el alcance en entregables
|
|
34
|
+
|
|
35
|
+
Cada entregable: qué es, qué incluye, **qué no incluye**, y de qué depende. Las dependencias importan porque las del lado del cliente (accesos, contenido, decisiones, aprobaciones) son la causa número uno de proyectos que se estiran sin que sea tu culpa - y sin que te lo paguen.
|
|
36
|
+
|
|
37
|
+
Lo que la propuesta decía en una línea acá se convierte en tres o cuatro items. Si no se puede desarmar, es que el alcance no está definido, y ese es el hallazgo.
|
|
38
|
+
|
|
39
|
+
### 2. Escribir los criterios de aceptación
|
|
40
|
+
|
|
41
|
+
Por cada entregable: **cómo sabemos que está terminado**, en términos verificables.
|
|
42
|
+
|
|
43
|
+
Sin esto, "terminado" lo define el cliente cuando quiera, y siempre está un poco más lejos. Es el mecanismo más barato que existe contra el scope creep, y casi nadie lo escribe.
|
|
44
|
+
|
|
45
|
+
Si el usuario no sabe qué poner, la pregunta que lo desbloquea es: *"¿qué tendría que pasar para que el cliente lo apruebe sin pedir cambios?"*
|
|
46
|
+
|
|
47
|
+
### 3. Estimar de verdad
|
|
48
|
+
|
|
49
|
+
Usar `/estimate` por entregable. Sumar además lo que nunca entra en la estimación y siempre pasa: reuniones, rondas de revisión, ida y vuelta por accesos, setup del entorno.
|
|
50
|
+
|
|
51
|
+
### 4. La validación honesta (el paso que justifica el skill)
|
|
52
|
+
|
|
53
|
+
Comparar el total estimado contra las **horas implícitas en lo cotizado** (monto acordado dividido tu tarifa objetivo).
|
|
54
|
+
|
|
55
|
+
| Resultado | Qué hacer |
|
|
56
|
+
|---|---|
|
|
57
|
+
| Entra con margen | Seguir. Registrar el margen para no regalarlo después |
|
|
58
|
+
| Entra justo | Seguir, avisando que cualquier imprevisto sale de tu bolsillo |
|
|
59
|
+
| **No entra** | **Parar y decirlo con el número** |
|
|
60
|
+
|
|
61
|
+
Cuando no entra, las opciones reales son tres, y hay que ponerlas sobre la mesa antes de escribir una línea de código: **recortar alcance** al que cabe, **renegociar** el monto o el plazo con el desarme como evidencia, o **absorber la diferencia** como decisión consciente y registrada.
|
|
62
|
+
|
|
63
|
+
Lo que no es una opción es empezar y ver qué pasa. Eso ya sabemos cómo termina.
|
|
64
|
+
|
|
65
|
+
Nunca maquillar la estimación para que cierre. Si al desarmarlo son 90 horas y cotizaste 40, el número es 90.
|
|
66
|
+
|
|
67
|
+
### 5. Plan de ejecución
|
|
68
|
+
|
|
69
|
+
Secuenciar por dependencias, no por lo que da más ganas. Marcar el camino crítico y qué está bloqueado por el cliente. Definir milestones que coincidan con los pagos si el contrato los tiene: entregar tres cosas antes del primer cobro es financiar al cliente.
|
|
70
|
+
|
|
71
|
+
### 6. Escribir y rutear
|
|
72
|
+
|
|
73
|
+
Con approval, completar la nota de `08-Contratos/`: alcance acordado, alcance excluido, criterios de aceptación, milestones y estimación por entregable.
|
|
74
|
+
|
|
75
|
+
Después **rutear al trabajo técnico**, que ya existe en el repo:
|
|
76
|
+
|
|
77
|
+
| Si el proyecto es | Seguí con |
|
|
78
|
+
|---|---|
|
|
79
|
+
| Historias y tickets | `/create-stories`, `/create-epics` |
|
|
80
|
+
| Backend, frontend, mobile | El perfil técnico que corresponda (`+backend-ts`, `+frontend`, ...) |
|
|
81
|
+
| Algo sin especificar del lado del cliente | `/product-discovery` antes de codear |
|
|
82
|
+
| Documentar lo que ya existe | `/reverse-document` |
|
|
83
|
+
|
|
84
|
+
## Reglas
|
|
85
|
+
|
|
86
|
+
- **Sin alcance escrito no se arranca.** Si no hay SOW ni propuesta con alcance, este skill produce el alcance propuesto y pide confirmarlo con el cliente antes de ejecutar.
|
|
87
|
+
- **Nunca ajustar la estimación para que entre en lo cotizado.** El número es el número; la decisión es del usuario.
|
|
88
|
+
- **Todo lo que no está en el alcance acordado va a "alcance excluido"**, explícito. Lo que no se escribe se discute después, y se discute gratis.
|
|
89
|
+
- No inventar criterios de aceptación que el cliente no aceptó: si se proponen, se marcan como propuestos hasta que los confirme.
|
|
90
|
+
- Sin guiones largos en el texto agregado a las notas.
|
|
91
|
+
|
|
92
|
+
## Handoff
|
|
93
|
+
|
|
94
|
+
Pedí aprobación (approval) antes de escribir en la nota del contrato. Kickoff COMPLETE cuando hay entregables, criterios de aceptación, estimación y el veredicto de si entra en lo cotizado. El siguiente paso es el skill técnico que corresponda para ejecutar, y `/freelance-deliver` para el seguimiento de horas y alcance mientras el proyecto corre.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: freelance-pipeline
|
|
3
|
+
description: "Diagnose the freelance business, not one proposal: Connects ROI, proposal funnel, real effective hourly rate net of unbilled hours, utilization, client concentration and scope drift on active contracts. Triggers: como va mi pipeline freelance, cuanto gano por hora de verdad, roi de connects, por que no me responden las propuestas, utilizacion, scope creep de un contrato."
|
|
4
|
+
argument-hint: "[--desde YYYY-MM-DD]"
|
|
5
|
+
category: "career"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, WebSearch, Task
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Freelance Pipeline - Diagnóstico del negocio
|
|
11
|
+
|
|
12
|
+
Mirás el negocio entero, no la propuesta de mañana. La pregunta que contestás es si esto funciona como negocio, y si no, qué **una** cosa cambiar.
|
|
13
|
+
|
|
14
|
+
Rutas relativas al career workspace (`--workspace`, env `CAREER_WORKSPACE`, o `./career-workspace/`).
|
|
15
|
+
|
|
16
|
+
Ventana: `$ARGUMENTS` (vacío = todo el historial).
|
|
17
|
+
|
|
18
|
+
## Inputs
|
|
19
|
+
|
|
20
|
+
- `03-Aplicaciones/` con `tipo: freelance` - **todas**, incluidas las `descartado`. Los descartes dicen si tu criterio de selección funciona; sin ellos el diagnóstico está sesgado a las que sí mandaste.
|
|
21
|
+
- `08-Contratos/` - activos y cerrados: estimado contra real, milestones, horas, change orders.
|
|
22
|
+
- El ledger de Connects en `07-Recursos/` - gasto por propuesta y resultado.
|
|
23
|
+
- `01-Perfiles/` - el piso de tarifa neto y la capacidad semanal declarada.
|
|
24
|
+
|
|
25
|
+
### Los datos duros salen del export, no de la memoria
|
|
26
|
+
|
|
27
|
+
Si el usuario tiene historial en una plataforma, **no le preguntes los montos y las horas**: que baje el CSV y usamos el importador. Nadie recuerda bien cuánto facturó.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
python .claude/skills/freelance-pipeline/scripts/import_history.py inspect historial.csv
|
|
31
|
+
python .claude/skills/freelance-pipeline/scripts/import_history.py summary historial.csv
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Mismo patrón que `network_map.py` de `+job-hunt`: sin credenciales, sin tocar la cuenta. El usuario exporta, el script lee.
|
|
35
|
+
|
|
36
|
+
**Correr `inspect` primero, siempre, y mostrarle el mapeo.** El script detecta las columnas porque los exports no tienen esquema estable, y reporta `columnas_sin_mapear` y `columnas_ambiguas`. Antes de creerle a un total hay que ver qué columna se usó; si eligió mal, se corrige con `--map "Columna=campo"`.
|
|
37
|
+
|
|
38
|
+
Dos cosas que el summary te dice y hay que respetar: `tarifa_efectiva_calculable: false` significa que el export no trae horas y **la tarifa efectiva no se estima**, se pide el dato; y `muestra_suficiente: false` significa que no alcanza para hablar de tasas.
|
|
39
|
+
|
|
40
|
+
## El guard de volumen (primero, obligatorio)
|
|
41
|
+
|
|
42
|
+
Contar antes de afirmar.
|
|
43
|
+
|
|
44
|
+
- **Menos de 10 propuestas resueltas:** no hay embudo. Entregar solo lo descriptivo (cuántas, Connects gastados, tiempo de respuesta) y nombrar la hipótesis más barata de testear. **Nada de patrones.**
|
|
45
|
+
- **10 a 25:** tendencias, con la muestra a la vista en cada afirmación ("3 de 14").
|
|
46
|
+
- **25+:** tasas de conversión.
|
|
47
|
+
|
|
48
|
+
Tres propuestas sin respuesta no son un patrón. Tratarlas como tal manda al usuario a bajar la tarifa, que es el peor movimiento posible y el más difícil de revertir.
|
|
49
|
+
|
|
50
|
+
## Las cinco métricas
|
|
51
|
+
|
|
52
|
+
### 1. ROI de Connects
|
|
53
|
+
|
|
54
|
+
`Connects gastados / contratos ganados` = costo de adquisición. Y el número que más duele: **cuántos Connects se fueron en ofertas que nunca contrataron a nadie**. Esa pérdida es evitable con mejor screening, así que se reporta aparte.
|
|
55
|
+
|
|
56
|
+
### 2. Embudo
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
oferta vista → screen pasado → propuesta enviada → cliente responde → llamada → contrato
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
La etapa clave es **enviada → responde**. Cruzarla con el score cambia el diagnóstico:
|
|
63
|
+
|
|
64
|
+
| Sin respuesta + score alto | Sin respuesta + score bajo |
|
|
65
|
+
|---|---|
|
|
66
|
+
| Problema de propuesta: apertura, precio, plantilla detectable | Problema de targeting: te postulás a lo que no te corresponde |
|
|
67
|
+
| Va a `/freelance-proposal` | Va a `/freelance-scan` y `/freelance-profile` |
|
|
68
|
+
|
|
69
|
+
### 3. Tarifa efectiva real
|
|
70
|
+
|
|
71
|
+
`total cobrado / (horas facturadas + horas de propuestas + llamadas + admin)`, **neto de comisión**.
|
|
72
|
+
|
|
73
|
+
No es la tarifa del contrato y casi siempre es bastante menor. Es el número que dice si el negocio funciona. **Si quedó abajo del piso declarado, ese es el hallazgo principal** y todo lo demás es secundario.
|
|
74
|
+
|
|
75
|
+
### 4. Utilización y concentración
|
|
76
|
+
|
|
77
|
+
- Horas facturables contra capacidad declarada. Muy baja = problema de pipeline. Muy alta sostenida = riesgo de burnout y de no tener tiempo para vender, que es cómo se llega al mes siguiente sin nada.
|
|
78
|
+
- **Concentración**: porcentaje de ingresos del cliente más grande. Arriba de la mitad, no es un negocio: es un empleo sin sus protecciones y sin su estabilidad.
|
|
79
|
+
|
|
80
|
+
### 5. Scope drift en contratos activos
|
|
81
|
+
|
|
82
|
+
Contratos donde las horas reales superan lo estimado **sin change order**. Cada uno es trabajo regalado.
|
|
83
|
+
|
|
84
|
+
El patrón importa más que el caso: si pasa en casi todos, el problema está en cómo se escriben los alcances (va a `/contract-and-proposal-writer`), no en los clientes. Por cada contrato con drift, ofrecer redactar el change order - alcance nuevo, precio nuevo (regla 3 de `freelance-guardrails`).
|
|
85
|
+
|
|
86
|
+
## Proceso
|
|
87
|
+
|
|
88
|
+
1. **Recolectar y contar.** Aplicar el guard de volumen y decir en qué banda estamos.
|
|
89
|
+
2. **Calcular las cinco métricas.** Mostrarlas en el chat con la muestra explícita, antes de interpretar nada.
|
|
90
|
+
3. **Lanzar `pipeline-strategist`** (contexto fresco, read-only) si hay 10+ propuestas resueltas. Devuelve punto de fuga, hipótesis con cómo testearlas, UN cambio recomendado y qué no tocar. Con menos volumen, saltear: el agente lo va a rechazar igual.
|
|
91
|
+
4. **Reporte** en `07-Recursos/Pipeline - YYYY-MM-DD.md`, con approval del usuario sobre las métricas:
|
|
92
|
+
- Frontmatter: `tipo: pipeline`, `fecha`, `propuestas_analizadas`, `contratos_analizados`, `ventana`.
|
|
93
|
+
- Las cinco métricas con su muestra.
|
|
94
|
+
- El punto de fuga y su evidencia, con wikilinks a las notas que lo sostienen.
|
|
95
|
+
- El cambio recomendado y a qué skill se le pasa.
|
|
96
|
+
- Si existe un reporte anterior, sección "Desde el último reporte": qué se movió y qué no.
|
|
97
|
+
5. **No editar** notas de propuestas ni de contratos. Solo crear el reporte y, si el usuario lo pide, los change orders de los contratos con drift.
|
|
98
|
+
|
|
99
|
+
## Reglas
|
|
100
|
+
|
|
101
|
+
- **Datos antes que consejos.** Cada afirmación se apoya en un conteo o en una cita del feedback registrado.
|
|
102
|
+
- **UN cambio recomendado, no un plan de 8 puntos.** Si se cambian cinco cosas no se sabe cuál funcionó.
|
|
103
|
+
- **Bajar la tarifa nunca es la primera palanca.** Solo entra si la evidencia dice que el posicionamiento está mal, y con ese fundamento explícito.
|
|
104
|
+
- Nunca fabricar métricas: si falta el dato (horas no registradas, Connects sin anotar), reportar el hueco y qué habría que empezar a registrar.
|
|
105
|
+
- Sin guiones largos, con wikilinks a las notas fuente.
|
|
106
|
+
|
|
107
|
+
## Handoff
|
|
108
|
+
|
|
109
|
+
Reporte COMPLETE en `07-Recursos/`. El siguiente paso es el que salga del punto de fuga: `/freelance-proposal` (propuesta), `/freelance-scan` o `/freelance-profile` (targeting y posicionamiento), `/client-screen` (criterios de descarte), o `/contract-and-proposal-writer` (alcances y change orders).
|