tracker
Lectura rápida del estado de cada candidatura. Útil como chequeo diario o al preparar la revisión semanal. La interfaz completa manejada por teclado vive en el dashboard TUI en Go; este modo es el resumen en el chat.
Qué hace
El modo tracker lee tu tracker, data/applications.md, y muestra cada candidatura con su estado actual en una sola respuesta. Después viene un bloque de estadísticas: el total, el recuento por estado, la puntuación media, cuántas filas tienen un PDF adaptado y un informe y, cuando ya hayas enviado alguna candidatura, la rapidez con la que tus candidaturas avanzan de una etapa a otra.
Cuándo usarlo
Usa tracker para un chequeo de estado diario de quince segundos. Usa el dashboard TUI en Go cuando necesites profundizar.
Ejemplo
`/career-ops tracker` — output is a structured status summary in the chat.Cómo es una ejecución
Una ejecución de tracker imprime la tabla completa de candidaturas más un bloque de estadísticas en una sola respuesta, de modo que puedes leer toda la búsqueda de un vistazo. Cada fila es una candidatura con su empresa, puesto, puntuación, estado actual, y si se han generado el PDF adaptado y el informe de evaluación.
# | Date | Company | Role | Score | Status | PDF | Report
1 | 2026-06-14 | Anthropic | AI Engineer | 4.5/5 | Interview | yes | yes
2 | 2026-06-18 | Vercel | Applied AI Eng | 4.2/5 | Applied | yes | yes
3 | 2026-06-21 | Figma | Product Eng, AI | 3.9/5 | Evaluated | yes | yes
Total: 3 Applied: 1 Interview: 1 Evaluated: 1
Average score: 4.2/5 PDF generated: 100% Report generated: 100%Una candidatura avanza por un conjunto fijo de estados: Evaluated (informe escrito, decisión pendiente), Applied (la has enviado), Responded (la empresa respondió pero aún sin entrevista), Assessment (hay en curso una prueba en línea o una preselección asíncrona), Interview (un proceso activo), y después un estado terminal: Offer, Rejected, Discarded, SKIP para los puestos que no encajan, o Hired cuando aceptas una oferta. Para registrar un cambio de estado, pídelo en el chat o ejecuta tú mismo node set-status.mjs --report <report#> <state>, y añade --on YYYY-MM-DD si ocurrió en una fecha anterior. Una fila sin informe se selecciona, en cambio, por su empresa, node set-status.mjs "<company>" <state>, con --role si varias filas comparten la empresa. El comando rechaza los estados desconocidos, bloquea el tracker mientras escribe y registra la transición en data/status-log.tsv, el registro que leen las estadísticas de funnel-velocity, así que úsalo en lugar de editar la fila a mano.
Para corregir una nota en lugar de añadir otra, pasa la nota antigua con --replace-note y el texto nuevo con --note. Sin esa opción, --note solo añade al final, lo que deja contradicciones como not applied; applied en la fila. La coincidencia se busca sobre una nota completa entre separadores ; , y si ninguno de los dos textos está en la celda Notes, no se escribe nada:
node set-status.mjs --row 12 Applied --replace-note "not applied" --note "applied via referral"Hay tres flags más pensadas sobre todo para el dashboard TUI en Go, que ahora registra sus cambios de estado a través de set-status.mjs. --report-link N selecciona la fila cuya celda Report contiene exactamente un enlace al informe N, y rechaza las celdas mal formadas en lugar de adivinar. --repair-status-log y --repair-followup se aplican cuando un cambio a Applied se vuelve a ejecutar sobre una fila que ya está en Applied: añaden la entrada del registro o el recordatorio de seguimiento que el primer intento no llegó a escribir, y no añaden nada si ya están.
Reparar enlaces rotos a informes
node verify-pipeline.mjs reporta Report not found cuando la celda Report de una fila enlaza un archivo que ya no existe. npm run fix-report-links repara esas filas cambiando solo esa celda por la marca habitual de "sin informe" del tracker. No regenera el informe que falta. Previsualiza primero:
npm run fix-report-links -- --dry-run # list the affected rows, write nothing
npm run fix-report-links # apply; the tracker is backed up to .bak firstTodas las demás celdas, el orden de las filas y los finales de línea se quedan como estaban. Una celda Report que contenga cualquier cosa distinta de exactamente un enlace se lista para que la revises a mano y se deja sin cambios. Ejecutarlo dos veces no cambia nada la segunda vez.
Comprobar si las vacantes siguen abiertas
Las vacantes se cierran mientras sus filas siguen en Evaluated o Applied. node check-liveness.mjs --tracker comprueba la vacante de cada fila en Evaluated y Applied; --status= elige otros estados. Toma cada vacante de la celda URL de la fila o de la línea **URL:** de su informe, y lista por número las filas que no tienen ninguna de las dos.
Para quitar las filas en Evaluated cuya vacante ya cerró, previsualiza primero:
node check-liveness.mjs --tracker --discard-expired # dry run: lists the rows it would move
node check-liveness.mjs --tracker --discard-expired --apply # moves themSolo una vacante que se considera expired mueve su fila, de Evaluated a Discarded, con la nota posting closed YYYY-MM-DD. Una fila con un veredicto incierto se queda como está, igual que todas las filas en Applied.
Cómo leer las cifras acumuladas
Para las cifras acumuladas — el funnel completo, los totales del scanner, la cobertura de portales y el cumplimiento de los seguimientos — el modo ejecuta node stats.mjs --summary y presenta su salida tal cual. Ese comando lee tus archivos locales y cuesta cero tokens, así que los números nunca se recalculan a mano ni se estiman de memoria. Usa el resumen en el chat de arriba para una lectura diaria rápida, y el comando de estadísticas cuando quieras los totales acumulados de toda la búsqueda.
Exportar una copia reparada
Con cientos de filas, una tabla markdown acumula daños: marcadores de mojibake, una puntuación varada en la columna de estado, ids duplicados, barras verticales sueltas. node tracker.mjs sync los detecta y los repara en su índice SQLite, data/applications.db, sin tocar el markdown. tracker.mjs necesita Node 22.13 o posterior (23.4 o posterior en Node 23) para ese índice; el tracker en markdown sigue funcionando sin él. node tracker.mjs export es la forma de adoptar esa copia reparada de tu propio tracker:
node tracker.mjs export # rebuilt table on stdout
node tracker.mjs export --out repaired.md # write to a file; an existing one is backed up to repaired.md.bak first
node tracker.mjs export --out repaired.md --force # write even when something would be lostexport nunca toca data/applications.md a menos que lo pases como --out.
Conserva la estructura que leyó, no solo los valores: tu fila de encabezado, las columnas que career-ops no mapea (Location, Via, URL o las tuyas), el título, cualquier texto antes y después de la tabla, y los finales de línea CRLF o LF. Las columnas extra vuelven en su propia posición, aunque query no puede filtrar por ellas.
Todo lo que no puede reproducir se nombra en stderr. Si esa lista no está vacía, --out sobre un archivo existente se niega a escribir (código de salida 1, no se escribe nada) hasta que vuelvas a ejecutarlo con --force; si está vacía, --out hace una copia de seguridad del archivo existente y lo sobrescribe. Lo que se reporta:
| Qué se reporta | Por qué no se puede reconstruir |
|---|---|
| Una celda fuera de las columnas que declara el encabezado | El encabezado no tiene ninguna columna donde ponerla |
| Una línea entre la primera y la última fila de la tabla, como un título o el encabezado de una segunda tabla | Una única tabla reconstruida no tiene dónde ponerla |
Una fila que pertenece a una tabla posterior, como una sección ## Archive | Se indexó con el encabezado de la primera tabla, así que volver a emitirla movería datos archivados a la tabla activa |
Una celda cuyo valor tuvo que reescribirse para sobrevivir como celda (una | suelta vuelve como │) | El propio valor cambió |
Que no se reporten pérdidas no significa que la salida sea idéntica byte a byte. export emite las reparaciones que hizo sync, y algunas son silenciosas: aplicado es un alias reconocido de Applied en templates/states.yml, así que sync --check no reporta ninguna corrupción y la exportación dice Applied de todos modos. Las celdas alineadas en columnas también vuelven con un solo espacio. Antes de adoptar una exportación, compárala con el archivo que va a sustituir:
node tracker.mjs export | diff data/applications.md -La referencia completa del comando, incluidos sync, query y history, está en la guía de scripts del repositorio principal.
Cosas a tener en cuenta
El estado vive en la columna Status del tracker (data/applications.md), no en el archivo del informe. Cambiarlo a mano se salta data/status-log.tsv: funnel-velocity sí ve el nuevo estado, pero no cuándo ocurrió, así que el cambio falta en los tiempos por etapa, y una fila que acaba en Rejected pierde las etapas por las que pasó. Usa set-status.mjs, el chat o el selector de estado del dashboard TUI en Go, que ejecuta el mismo comando.
Relacionados
project
Los builders acumulan ideas más rápido de lo que pueden lanzarlas. El modo project puntúa una idea de proyecto de portfolio frente a tus roles objetivo, tu portfolio existente y la inversión de tiempo necesaria, y hace visible si merece la pena construirla.
patterns
Lee todas las candidaturas de tu tracker, con su resultado, y saca a la luz patrones: formas de JD que puntúan alto pero nunca convierten, desajustes de arquetipo, problemas de banda salarial. El resultado es una señal de calibración para tu filtro de targeting.