chore: avance acumulado de sesiones previas (reorg dev/issues + ajustes)
Reorganizacion de dev/issues en subcarpetas (completed/, cpp/, gamedev/, kanban/, trading/, imagegen/, matrix/) y cambios acumulados en cmd/fn/pyrunner, .claude/commands y settings. Trabajo de otro LLM/sesion, commiteado a peticion del usuario para desbloquear el working tree. Excluido logs/ardour_mcp_server.log (ruido).
This commit is contained in:
@@ -31,12 +31,13 @@ Diferencia con `dev/flows/`:
|
|||||||
|
|
||||||
**Fase 1 (manual via Claude):**
|
**Fase 1 (manual via Claude):**
|
||||||
|
|
||||||
El agente lee `dev/issues/*.md`, parsea frontmatter YAML con `yaml.safe_load`, aplica el filtro, imprime tabla.
|
El agente lee `dev/issues/**/*.md` (recursivo: incluye subcarpetas por dominio como `dev/issues/kanban/`, `dev/issues/cpp/`, ... excluyendo `completed/`), parsea frontmatter YAML con `yaml.safe_load`, aplica el filtro, imprime tabla.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import yaml, pathlib, re
|
import yaml, pathlib, re
|
||||||
issues = []
|
issues = []
|
||||||
for f in pathlib.Path("dev/issues").glob("*.md"):
|
for f in pathlib.Path("dev/issues").glob("**/*.md"):
|
||||||
|
if f.parent.name == "completed": continue
|
||||||
if f.name in {"README.md", "template.md"}: continue
|
if f.name in {"README.md", "template.md"}: continue
|
||||||
txt = f.read_text()
|
txt = f.read_text()
|
||||||
m = re.match(r"^---\n(.*?)\n---", txt, re.S)
|
m = re.match(r"^---\n(.*?)\n---", txt, re.S)
|
||||||
|
|||||||
@@ -9,7 +9,9 @@
|
|||||||
"enabledMcpjsonServers": [
|
"enabledMcpjsonServers": [
|
||||||
"registry",
|
"registry",
|
||||||
"jupyter",
|
"jupyter",
|
||||||
"orchestrator"
|
"orchestrator",
|
||||||
|
"godot",
|
||||||
|
"ardour"
|
||||||
],
|
],
|
||||||
"hooks": {
|
"hooks": {
|
||||||
"PreToolUse": [
|
"PreToolUse": [
|
||||||
|
|||||||
+47
-31
@@ -18,6 +18,7 @@ type pyParam struct {
|
|||||||
Default string // empty if required
|
Default string // empty if required
|
||||||
IsKwargs bool // **kwargs
|
IsKwargs bool // **kwargs
|
||||||
IsRegistry bool // type is a registry type (needs factory)
|
IsRegistry bool // type is a registry type (needs factory)
|
||||||
|
KwOnly bool // declared after a bare "*" or "*args" — must be passed by keyword
|
||||||
}
|
}
|
||||||
|
|
||||||
// pyFactory links a registry type to the function that creates it.
|
// pyFactory links a registry type to the function that creates it.
|
||||||
@@ -45,12 +46,21 @@ func parsePySignature(sig string) []pyParam {
|
|||||||
// Split by comma, respecting nested brackets
|
// Split by comma, respecting nested brackets
|
||||||
parts := splitParams(raw)
|
parts := splitParams(raw)
|
||||||
var params []pyParam
|
var params []pyParam
|
||||||
|
kwOnly := false
|
||||||
for _, part := range parts {
|
for _, part := range parts {
|
||||||
part = strings.TrimSpace(part)
|
part = strings.TrimSpace(part)
|
||||||
if part == "" || part == "self" || part == "cls" {
|
if part == "" || part == "self" || part == "cls" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// A bare "*" (PEP 3102) or "*args" var-positional marks the start of
|
||||||
|
// keyword-only params. Neither maps cleanly to positional CLI args, so
|
||||||
|
// skip the marker itself and flag every following param as keyword-only.
|
||||||
|
if part == "*" || (strings.HasPrefix(part, "*") && !strings.HasPrefix(part, "**")) {
|
||||||
|
kwOnly = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
p := parseSingleParam(part)
|
p := parseSingleParam(part)
|
||||||
|
p.KwOnly = kwOnly
|
||||||
params = append(params, p)
|
params = append(params, p)
|
||||||
}
|
}
|
||||||
return params
|
return params
|
||||||
@@ -189,11 +199,19 @@ func generatePyRunner(fn *registry.Function, db *registry.DB, registryRoot strin
|
|||||||
// Classify params
|
// Classify params
|
||||||
var factoryImports []string // import lines for factories
|
var factoryImports []string // import lines for factories
|
||||||
var factorySetup []string // code to create factory objects
|
var factorySetup []string // code to create factory objects
|
||||||
var argLines []string // code to parse CLI args
|
var bodyLines []string // code that fills _call_args / _call_kwargs
|
||||||
var callArgs []string // arguments to pass to the function
|
|
||||||
|
|
||||||
cliArgIdx := 0
|
cliArgIdx := 0
|
||||||
|
|
||||||
|
// emitCall appends one param to _call_args (positional) or _call_kwargs
|
||||||
|
// (keyword-only). indent prefixes the line (for params read inside an `if`).
|
||||||
|
emitCall := func(p pyParam, indent string) string {
|
||||||
|
if p.KwOnly {
|
||||||
|
return fmt.Sprintf("%s_call_kwargs[%q] = %s", indent, p.Name, p.Name)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s_call_args.append(%s)", indent, p.Name)
|
||||||
|
}
|
||||||
|
|
||||||
for _, p := range params {
|
for _, p := range params {
|
||||||
if p.IsKwargs {
|
if p.IsKwargs {
|
||||||
// Skip **kwargs for now — can't auto-resolve from CLI
|
// Skip **kwargs for now — can't auto-resolve from CLI
|
||||||
@@ -235,27 +253,35 @@ func generatePyRunner(fn *registry.Function, db *registry.DB, registryRoot strin
|
|||||||
fmt.Sprintf("%s = %s(%s)", p.Name, factory.FuncName,
|
fmt.Sprintf("%s = %s(%s)", p.Name, factory.FuncName,
|
||||||
strings.Join(factoryArgs, ", ")))
|
strings.Join(factoryArgs, ", ")))
|
||||||
|
|
||||||
callArgs = append(callArgs, p.Name)
|
// Factory objects are always present (required).
|
||||||
|
bodyLines = append(bodyLines, emitCall(p, ""))
|
||||||
} else {
|
} else {
|
||||||
// Primitive type — from CLI args
|
// Primitive type — from CLI args.
|
||||||
if p.Default != "" {
|
if p.Default != "" {
|
||||||
// Optional param with default
|
// Optional: only pass when the CLI arg is present. When absent we
|
||||||
argLines = append(argLines,
|
// DON'T replicate the signature default (it may reference a module
|
||||||
fmt.Sprintf("%s = _args[%d] if len(_args) > %d else %s",
|
// constant that doesn't exist in this runner) — we simply omit the
|
||||||
p.Name, cliArgIdx, cliArgIdx, convertDefault(p.Type, p.Default)))
|
// argument so the function applies its own native default.
|
||||||
argLines = append(argLines,
|
bodyLines = append(bodyLines,
|
||||||
convertArg(p.Name, p.Type, true))
|
fmt.Sprintf("if len(_args) > %d:", cliArgIdx))
|
||||||
|
bodyLines = append(bodyLines,
|
||||||
|
fmt.Sprintf(" %s = _args[%d]", p.Name, cliArgIdx))
|
||||||
|
if conv := convertArg(p.Name, p.Type, true); conv != "" {
|
||||||
|
bodyLines = append(bodyLines, " "+conv)
|
||||||
|
}
|
||||||
|
bodyLines = append(bodyLines, emitCall(p, " "))
|
||||||
} else {
|
} else {
|
||||||
// Required param
|
// Required param.
|
||||||
argLines = append(argLines,
|
bodyLines = append(bodyLines,
|
||||||
fmt.Sprintf("if len(_args) <= %d: sys.exit('error: missing required arg: %s (%s)')",
|
fmt.Sprintf("if len(_args) <= %d: sys.exit('error: missing required arg: %s (%s)')",
|
||||||
cliArgIdx, p.Name, p.Type))
|
cliArgIdx, p.Name, p.Type))
|
||||||
argLines = append(argLines,
|
bodyLines = append(bodyLines,
|
||||||
fmt.Sprintf("%s = _args[%d]", p.Name, cliArgIdx))
|
fmt.Sprintf("%s = _args[%d]", p.Name, cliArgIdx))
|
||||||
argLines = append(argLines,
|
if conv := convertArg(p.Name, p.Type, false); conv != "" {
|
||||||
convertArg(p.Name, p.Type, false))
|
bodyLines = append(bodyLines, conv)
|
||||||
|
}
|
||||||
|
bodyLines = append(bodyLines, emitCall(p, ""))
|
||||||
}
|
}
|
||||||
callArgs = append(callArgs, p.Name)
|
|
||||||
cliArgIdx++
|
cliArgIdx++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,18 +315,18 @@ func generatePyRunner(fn *registry.Function, db *registry.DB, registryRoot strin
|
|||||||
sb.WriteString("\n")
|
sb.WriteString("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arg parsing
|
// Arg parsing — build the positional/keyword argument collections.
|
||||||
if len(argLines) > 0 {
|
|
||||||
sb.WriteString("# --- parse CLI args ---\n")
|
sb.WriteString("# --- parse CLI args ---\n")
|
||||||
for _, line := range argLines {
|
sb.WriteString("_call_args = []\n")
|
||||||
|
sb.WriteString("_call_kwargs = {}\n")
|
||||||
|
for _, line := range bodyLines {
|
||||||
sb.WriteString(line + "\n")
|
sb.WriteString(line + "\n")
|
||||||
}
|
}
|
||||||
sb.WriteString("\n")
|
sb.WriteString("\n")
|
||||||
}
|
|
||||||
|
|
||||||
// Call
|
// Call
|
||||||
sb.WriteString("# --- execute ---\n")
|
sb.WriteString("# --- execute ---\n")
|
||||||
sb.WriteString(fmt.Sprintf("_result = %s(%s)\n", fn.Name, strings.Join(callArgs, ", ")))
|
sb.WriteString(fmt.Sprintf("_result = %s(*_call_args, **_call_kwargs)\n", fn.Name))
|
||||||
sb.WriteString("\n")
|
sb.WriteString("\n")
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
@@ -365,16 +391,6 @@ func convertArg(name, typ string, _ bool) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertDefault ensures the default value is valid Python for the given type.
|
|
||||||
func convertDefault(_, def string) string {
|
|
||||||
// Most defaults from the signature are already valid Python
|
|
||||||
// Just handle the None case for Optional types
|
|
||||||
if def == "None" || def == "" {
|
|
||||||
return "None"
|
|
||||||
}
|
|
||||||
return def
|
|
||||||
}
|
|
||||||
|
|
||||||
// pythonList creates a Python list literal from strings: ["a", "b", "c"]
|
// pythonList creates a Python list literal from strings: ["a", "b", "c"]
|
||||||
func pythonList(items []string) string {
|
func pythonList(items []string) string {
|
||||||
quoted := make([]string, len(items))
|
quoted := make([]string, len(items))
|
||||||
|
|||||||
@@ -0,0 +1,141 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"fn-registry/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Signature with a bare "*" (PEP 3102) separating positional from keyword-only
|
||||||
|
// params. This is the shape that used to make fn run emit "* = _args[3]".
|
||||||
|
const kwOnlySig = "def add_event_dav(summary: str, start: str, end: str = '', *, location: str = '', all_day: bool = False) -> dict"
|
||||||
|
|
||||||
|
func TestParsePySignatureBareStarKeywordOnly(t *testing.T) {
|
||||||
|
params := parsePySignature(kwOnlySig)
|
||||||
|
|
||||||
|
// The bare "*" marker must never surface as a real parameter.
|
||||||
|
for _, p := range params {
|
||||||
|
if p.Name == "*" {
|
||||||
|
t.Fatalf("bare '*' leaked as a param: %+v", params)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
want := map[string]bool{ // name -> expected KwOnly
|
||||||
|
"summary": false,
|
||||||
|
"start": false,
|
||||||
|
"end": false,
|
||||||
|
"location": true,
|
||||||
|
"all_day": true,
|
||||||
|
}
|
||||||
|
if len(params) != len(want) {
|
||||||
|
t.Fatalf("got %d params, want %d: %+v", len(params), len(want), params)
|
||||||
|
}
|
||||||
|
for _, p := range params {
|
||||||
|
kw, ok := want[p.Name]
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("unexpected param %q", p.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if p.KwOnly != kw {
|
||||||
|
t.Errorf("param %q KwOnly=%v, want %v", p.Name, p.KwOnly, kw)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGeneratePyRunnerKeywordOnlyValid(t *testing.T) {
|
||||||
|
fn := ®istry.Function{
|
||||||
|
Name: "add_event_dav",
|
||||||
|
Lang: "py",
|
||||||
|
FilePath: "python/functions/pipelines/add_event_dav.py",
|
||||||
|
Signature: kwOnlySig,
|
||||||
|
}
|
||||||
|
|
||||||
|
// All params are primitive, so no factory lookup happens and db is unused.
|
||||||
|
script, err := generatePyRunner(fn, nil, "")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("generatePyRunner: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(script, "* = _args") {
|
||||||
|
t.Fatalf("runner emitted invalid syntax '* = _args':\n%s", script)
|
||||||
|
}
|
||||||
|
|
||||||
|
// The signature default DEFAULT_BASE_URL (a module constant) must NOT be
|
||||||
|
// replicated into the runner — that NameErrors at runtime.
|
||||||
|
if strings.Contains(script, "DEFAULT_BASE_URL") {
|
||||||
|
t.Errorf("runner replicated non-literal default DEFAULT_BASE_URL:\n%s", script)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Required positionals are appended; keyword-only optionals go to kwargs.
|
||||||
|
for _, want := range []string{
|
||||||
|
"_call_args.append(summary)",
|
||||||
|
"_call_args.append(start)",
|
||||||
|
`_call_kwargs["location"] = location`,
|
||||||
|
`_call_kwargs["all_day"] = all_day`,
|
||||||
|
"_result = add_event_dav(*_call_args, **_call_kwargs)",
|
||||||
|
} {
|
||||||
|
if !strings.Contains(script, want) {
|
||||||
|
t.Errorf("missing %q in generated runner:\n%s", want, script)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The generated runner must itself be valid Python (compile, don't run).
|
||||||
|
mustCompilePython(t, script)
|
||||||
|
}
|
||||||
|
|
||||||
|
// mustCompilePython checks the script parses as valid Python via py_compile.
|
||||||
|
func mustCompilePython(t *testing.T, script string) {
|
||||||
|
t.Helper()
|
||||||
|
f, err := os.CreateTemp(t.TempDir(), "runner_*.py")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("temp file: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := f.WriteString(script); err != nil {
|
||||||
|
t.Fatalf("write: %v", err)
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
py := pythonBinForTest()
|
||||||
|
out, err := exec.Command(py, "-m", "py_compile", f.Name()).CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("generated runner is not valid Python (%s): %v\n%s", py, err, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// pythonBinForTest prefers the project venv, falling back to python3 on PATH.
|
||||||
|
func pythonBinForTest() string {
|
||||||
|
for _, c := range []string{"../../python/.venv/bin/python3", "python3"} {
|
||||||
|
if c == "python3" {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
if _, err := os.Stat(c); err == nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "python3"
|
||||||
|
}
|
||||||
|
|
||||||
|
// A "*args" var-positional marker must behave like the bare "*": skipped, and
|
||||||
|
// everything after it treated as keyword-only.
|
||||||
|
func TestParsePySignatureVarargsKeywordOnly(t *testing.T) {
|
||||||
|
sig := "def f(a: str, *args, b: int = 0) -> dict"
|
||||||
|
params := parsePySignature(sig)
|
||||||
|
|
||||||
|
for _, p := range params {
|
||||||
|
if strings.HasPrefix(p.Name, "*") {
|
||||||
|
t.Fatalf("'*args' marker leaked as a param: %+v", params)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(params) != 2 {
|
||||||
|
t.Fatalf("got %d params, want 2: %+v", len(params), params)
|
||||||
|
}
|
||||||
|
got := map[string]bool{}
|
||||||
|
for _, p := range params {
|
||||||
|
got[p.Name] = p.KwOnly
|
||||||
|
}
|
||||||
|
if got["a"] != false || got["b"] != true {
|
||||||
|
t.Errorf("KwOnly mismatch: a=%v (want false), b=%v (want true)", got["a"], got["b"])
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0051 — Funciones pendientes del pipeline de extraccion (NER+RE+OpenIE)
|
# 0051 — Funciones pendientes del pipeline de extraccion (NER+RE+OpenIE)
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0054 — deploy_server: refactor registry-first (SSH/systemd/rsync/health/docker-compose)
|
# 0054 — deploy_server: refactor registry-first (SSH/systemd/rsync/health/docker-compose)
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0055 — docker_tui: refactor para usar funciones docker_* del registry
|
# 0055 — docker_tui: refactor para usar funciones docker_* del registry
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0056 — audit_uses_functions: detectar imports Python anidados (`from pkg.subpkg import X`)
|
# 0056 — audit_uses_functions: detectar imports Python anidados (`from pkg.subpkg import X`)
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0057 — audit_uses_functions: mejorar deteccion de simbolos Go con abreviaturas
|
# 0057 — audit_uses_functions: mejorar deteccion de simbolos Go con abreviaturas
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0060 — `fn doctor secrets`: scan de secrets en TODOS los repos
|
# 0060 — `fn doctor secrets`: scan de secrets en TODOS los repos
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0061 — Integrar `notify_telegram` en deploy_server + bucle reactivo
|
# 0061 — Integrar `notify_telegram` en deploy_server + bucle reactivo
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ domain:
|
|||||||
- registry-quality
|
- registry-quality
|
||||||
scope: registry-only
|
scope: registry-only
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0071f"]
|
||||||
- "0071f"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ domain:
|
|||||||
- registry-quality
|
- registry-quality
|
||||||
scope: registry-only
|
scope: registry-only
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0071f"]
|
||||||
- "0071f"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
## Contexto
|
## Contexto
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
## Contexto
|
## Contexto
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
## Sintoma
|
## Sintoma
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
## Sintoma
|
## Sintoma
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0100 — Migrar frontmatter inline a YAML canonico en dev/issues/
|
# 0100 — Migrar frontmatter inline a YAML canonico en dev/issues/
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ related:
|
|||||||
- "0103"
|
- "0103"
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: [slash-command, dispatch, type-aware]
|
tags: [slash-command, dispatch, type-aware, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0104 — `/fix-issue` type-aware dispatch
|
# 0104 — `/fix-issue` type-aware dispatch
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ related:
|
|||||||
- "0107"
|
- "0107"
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: [modules, versioning, codegen, fail-loud]
|
tags: [modules, versioning, codegen, fail-loud, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0107e — Version pinning + codegen fail-loud
|
# 0107e — Version pinning + codegen fail-loud
|
||||||
|
|||||||
@@ -15,12 +15,7 @@ related:
|
|||||||
- "0109"
|
- "0109"
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags:
|
tags: [ausente-ready, skill-tree, cpp, imgui, dashboard, gamification]
|
||||||
- skill-tree
|
|
||||||
- cpp
|
|
||||||
- imgui
|
|
||||||
- dashboard
|
|
||||||
- gamification
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0109k — Dashboard panel
|
# 0109k — Dashboard panel
|
||||||
|
|||||||
@@ -16,13 +16,7 @@ related:
|
|||||||
- "0106"
|
- "0106"
|
||||||
created: 2026-05-18
|
created: 2026-05-18
|
||||||
updated: 2026-05-18
|
updated: 2026-05-18
|
||||||
tags:
|
tags: [ausente-ready, service, go, http, issues, flows, api]
|
||||||
- service
|
|
||||||
- go
|
|
||||||
- http
|
|
||||||
- issues
|
|
||||||
- flows
|
|
||||||
- api
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0109m — issues_api service
|
# 0109m — issues_api service
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ related:
|
|||||||
- "0068"
|
- "0068"
|
||||||
created: 2026-05-18
|
created: 2026-05-18
|
||||||
updated: 2026-05-19
|
updated: 2026-05-19
|
||||||
tags: [e2e_checks, recopilador, batch, coverage, epic]
|
tags: [e2e_checks, recopilador, batch, coverage, epic, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# Sub-issues
|
# Sub-issues
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ related:
|
|||||||
- "0068"
|
- "0068"
|
||||||
created: 2026-05-19
|
created: 2026-05-19
|
||||||
updated: 2026-05-19
|
updated: 2026-05-19
|
||||||
tags: [e2e_checks, recopilador, batch, design]
|
tags: [e2e_checks, recopilador, batch, design, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0121a — Design-e2e batch
|
# 0121a — Design-e2e batch
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ domain:
|
|||||||
- registry-quality
|
- registry-quality
|
||||||
scope: registry
|
scope: registry
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0121a"]
|
||||||
- "0121a"
|
|
||||||
- "0121b"
|
|
||||||
blocks:
|
blocks:
|
||||||
- "0122"
|
- "0122"
|
||||||
related:
|
related:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ related:
|
|||||||
- "0086"
|
- "0086"
|
||||||
created: 2026-05-18
|
created: 2026-05-18
|
||||||
updated: 2026-05-18
|
updated: 2026-05-18
|
||||||
tags: [revisor, mejorador, proposals, auto-apply, autonomous]
|
tags: [revisor, mejorador, proposals, auto-apply, autonomous, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0122 — fn-revisor + ampliar filtro auto-aplicable del orquestador
|
# 0122 — fn-revisor + ampliar filtro auto-aplicable del orquestador
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ related:
|
|||||||
- "0121a"
|
- "0121a"
|
||||||
created: 2026-05-19
|
created: 2026-05-19
|
||||||
updated: 2026-05-19
|
updated: 2026-05-19
|
||||||
tags: [dag_engine, cleanup, technical-debt]
|
tags: [dag_engine, cleanup, technical-debt, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0124 — dag_engine cleanup
|
# 0124 — dag_engine cleanup
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ related:
|
|||||||
- "0121a"
|
- "0121a"
|
||||||
created: 2026-05-19
|
created: 2026-05-19
|
||||||
updated: 2026-05-19
|
updated: 2026-05-19
|
||||||
tags: [deploy_server, cli, idempotency]
|
tags: [deploy_server, cli, idempotency, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0125 — deploy_server `--db` flag
|
# 0125 — deploy_server `--db` flag
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0128"
|
id: "0128"
|
||||||
title: "kanban: adjuntar archivos (drag&drop desc/chat + tab Archivos)"
|
title: "kanban: adjuntar archivos (drag&drop desc/chat + tab Archivos)"
|
||||||
status: in_progress
|
status: in-progress
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- apps-tools
|
- apps-tools
|
||||||
|
|||||||
@@ -13,12 +13,7 @@ blocks:
|
|||||||
- 0130b
|
- 0130b
|
||||||
related:
|
related:
|
||||||
- "0130"
|
- "0130"
|
||||||
tags:
|
tags: [registry, go, parser, frontmatter, fsnotify, ausente-ready]
|
||||||
- registry
|
|
||||||
- go
|
|
||||||
- parser
|
|
||||||
- frontmatter
|
|
||||||
- fsnotify
|
|
||||||
flow: "0130"
|
flow: "0130"
|
||||||
created: "2026-05-22"
|
created: "2026-05-22"
|
||||||
updated: "2026-05-22"
|
updated: "2026-05-22"
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ domain:
|
|||||||
- dev-ux
|
- dev-ux
|
||||||
scope: app-scoped
|
scope: app-scoped
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0130a"]
|
||||||
- "0130a"
|
|
||||||
blocks:
|
blocks:
|
||||||
- "0130c"
|
- "0130c"
|
||||||
related:
|
related:
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
---
|
---
|
||||||
id: "0134"
|
id: "0134"
|
||||||
title: "Mesh protocol spec: capability manifests, ed25519 envelopes, enrollment, audit chain"
|
title: "Mesh protocol spec: capability manifests, ed25519 envelopes, enrollment, audit chain"
|
||||||
status: pending
|
status: pendiente
|
||||||
type: spec
|
type: spec
|
||||||
domain:
|
domain:
|
||||||
- infra
|
- infra
|
||||||
- cybersecurity
|
- cybersecurity
|
||||||
- protocols
|
- protocols
|
||||||
scope: cross-app
|
scope: cross-app
|
||||||
priority: high
|
priority: alta
|
||||||
depends: []
|
depends: []
|
||||||
blocks:
|
blocks:
|
||||||
- "0135"
|
- "0135"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0144"
|
id: "0144"
|
||||||
title: "Agent LLM per machine (user + sudo) con tool registry y mesh dispatch"
|
title: "Agent LLM per machine (user + sudo) con tool registry y mesh dispatch"
|
||||||
status: pending
|
status: pendiente
|
||||||
type: spec
|
type: spec
|
||||||
domain:
|
domain:
|
||||||
- agents
|
- agents
|
||||||
@@ -9,7 +9,7 @@ domain:
|
|||||||
- infra
|
- infra
|
||||||
- cybersecurity
|
- cybersecurity
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: high
|
priority: alta
|
||||||
depends:
|
depends:
|
||||||
- "0134"
|
- "0134"
|
||||||
- "0140"
|
- "0140"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0146"
|
id: "0146"
|
||||||
title: "add-pc one-shot: añade PC al mesh + agente LLM en <2min desde movil"
|
title: "add-pc one-shot: añade PC al mesh + agente LLM en <2min desde movil"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0009"]
|
related_flows: ["0009"]
|
||||||
related_issues: ["0134", "0144", "0145"]
|
related_issues: ["0134", "0144", "0145"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0147"
|
id: "0147"
|
||||||
title: "matrix-client-pc scaffold: Wails + React+Mantine + login MAS"
|
title: "matrix-client-pc scaffold: Wails + React+Mantine + login MAS"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0148", "0162"]
|
related_issues: ["0148", "0162"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0148"
|
id: "0148"
|
||||||
title: "matrix-client-pc rooms list + timeline con sync incremental"
|
title: "matrix-client-pc rooms list + timeline con sync incremental"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0147", "0149"]
|
related_issues: ["0147", "0149"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0149"
|
id: "0149"
|
||||||
title: "matrix-client-pc composer: markdown, reply, edit, reactions, media"
|
title: "matrix-client-pc composer: markdown, reply, edit, reactions, media"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0148", "0150"]
|
related_issues: ["0148", "0150"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0150"
|
id: "0150"
|
||||||
title: "matrix-client-pc E2EE: cross-signing, SAS verification, recovery"
|
title: "matrix-client-pc E2EE: cross-signing, SAS verification, recovery"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: critical
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0149", "0151"]
|
related_issues: ["0149", "0151"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0151"
|
id: "0151"
|
||||||
title: "matrix-client-pc calls LiveKit: 1:1 + grupales, mic/cam/screen"
|
title: "matrix-client-pc calls LiveKit: 1:1 + grupales, mic/cam/screen"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0150", "0152"]
|
related_issues: ["0150", "0152"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0152"
|
id: "0152"
|
||||||
title: "matrix-client-pc mini-webapps embebidas: Matrix Widget API v2"
|
title: "matrix-client-pc mini-webapps embebidas: Matrix Widget API v2"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010"]
|
related_flows: ["0010"]
|
||||||
related_issues: ["0151", "0153"]
|
related_issues: ["0151", "0153"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0154"
|
id: "0154"
|
||||||
title: "matrix-client-android scaffold: Kotlin + Compose + login MAS"
|
title: "matrix-client-android scaffold: Kotlin + Compose + login MAS"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0155", "0162"]
|
related_issues: ["0155", "0162"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0155"
|
id: "0155"
|
||||||
title: "matrix-client-android rooms list + timeline Compose"
|
title: "matrix-client-android rooms list + timeline Compose"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0154", "0156"]
|
related_issues: ["0154", "0156"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0156"
|
id: "0156"
|
||||||
title: "matrix-client-android composer: markdown, replies, edits, reactions, media"
|
title: "matrix-client-android composer: markdown, replies, edits, reactions, media"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0155", "0157"]
|
related_issues: ["0155", "0157"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0157"
|
id: "0157"
|
||||||
title: "matrix-client-android E2EE rust-sdk: cross-signing, SAS, recovery"
|
title: "matrix-client-android E2EE rust-sdk: cross-signing, SAS, recovery"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: critical
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0156", "0158"]
|
related_issues: ["0156", "0158"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0158"
|
id: "0158"
|
||||||
title: "matrix-client-android calls LiveKit nativo: mic/cam/screen + PiP"
|
title: "matrix-client-android calls LiveKit nativo: mic/cam/screen + PiP"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0157", "0159", "0161"]
|
related_issues: ["0157", "0159", "0161"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0159"
|
id: "0159"
|
||||||
title: "matrix-client-android push FCM via sygnal + Firebase setup"
|
title: "matrix-client-android push FCM via sygnal + Firebase setup"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0158", "0160"]
|
related_issues: ["0158", "0160"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0160"
|
id: "0160"
|
||||||
title: "matrix-client-android mini-webapps: WebView + Widget API v2 bridge"
|
title: "matrix-client-android mini-webapps: WebView + Widget API v2 bridge"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: medium
|
priority: media
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0159", "0161"]
|
related_issues: ["0159", "0161"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0161"
|
id: "0161"
|
||||||
title: "matrix-client-android foreground service: calls + lifecycle + lockscreen"
|
title: "matrix-client-android foreground service: calls + lifecycle + lockscreen"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: high
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0011"]
|
related_flows: ["0011"]
|
||||||
related_issues: ["0158", "0160"]
|
related_issues: ["0158", "0160"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0162"
|
id: "0162"
|
||||||
title: "Matrix: migrar Synapse a MAS como unico auth provider (MSC3861)"
|
title: "Matrix: migrar Synapse a MAS como unico auth provider (MSC3861)"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: critical
|
priority: alta
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010", "0011"]
|
related_flows: ["0010", "0011"]
|
||||||
related_issues: ["0147", "0154", "0163"]
|
related_issues: ["0147", "0154", "0163"]
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
id: "0163"
|
id: "0163"
|
||||||
title: "Matrix admin panel propio: users, rooms, devices, sessions (sustituye synapse-admin)"
|
title: "Matrix admin panel propio: users, rooms, devices, sessions (sustituye synapse-admin)"
|
||||||
status: pending
|
status: pendiente
|
||||||
priority: medium
|
priority: media
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010", "0011"]
|
related_flows: ["0010", "0011"]
|
||||||
related_issues: ["0162", "0147"]
|
related_issues: ["0162", "0147"]
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
id: "0179"
|
||||||
|
title: "dev_console: escaneo recursivo de dev/issues/ (subcarpetas por dominio)"
|
||||||
|
status: in-progress
|
||||||
|
type: bugfix
|
||||||
|
domain:
|
||||||
|
- meta
|
||||||
|
scope: app-scoped
|
||||||
|
priority: media
|
||||||
|
depends: []
|
||||||
|
blocks: []
|
||||||
|
related: []
|
||||||
|
created: 2026-06-30
|
||||||
|
updated: 2026-06-30
|
||||||
|
tags: [ausente-ready]
|
||||||
|
---
|
||||||
|
# 0179 — dev_console: escaneo recursivo de dev/issues/
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Los issues activos se reorganizaron en subcarpetas por dominio dentro de `dev/issues/` (`kanban/`, `trading/`, `gamedev/`, `cpp/`, `matrix/`, `imagegen/`) para descongestionar el listado plano. El skill `/issue` ya se actualizó a glob recursivo (`dev/issues/**/*.md`, excluyendo `completed/`). Falta alinear el binario `dev_console`, que carga los issues con `LoadAllIssues(root)` / `LoadOpenIssues(root)` en `apps/dev_console/` y hoy no recorre subcarpetas — por lo que no ve los 49 issues movidos.
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Que `dev_console issue list/board/work` y los flujos que dependen de `LoadAllIssues`/`LoadOpenIssues` recorran `dev/issues/` de forma recursiva, excluyendo `dev/issues/completed/`, manteniendo el resto del comportamiento idéntico.
|
||||||
|
|
||||||
|
## Tareas
|
||||||
|
|
||||||
|
- [ ] Localizar la implementación de `LoadAllIssues` / `LoadOpenIssues` en `apps/dev_console/` (probable `parser.go` o equivalente).
|
||||||
|
- [ ] Cambiar el escaneo a `filepath.WalkDir` (o glob recursivo) bajo `dev/issues/`, saltando el directorio `completed/`.
|
||||||
|
- [ ] Mantener el orden de salida estable (ordenar por `id`).
|
||||||
|
- [ ] Recompilar el binario en el sub-repo de `dev_console` siguiendo TBD (`issue/0179-...`).
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
| Escenario | Tipo | Comando / evidencia | Resultado esperado |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Golden: lista incluye subcarpetas | e2e | `./apps/dev_console/dev_console issue list` | Aparecen issues de `cpp/`, `kanban/`, `trading/`, etc. (>= 49 que antes faltaban) |
|
||||||
|
| Edge: excluye completed/ | e2e | `dev_console issue list` | Ningún issue con `status: completado` de `completed/` aparece en el listado activo |
|
||||||
|
| Edge: conteo total coincide con /issue | e2e | comparar conteo con el glob recursivo de `/issue` | Mismo total de activos |
|
||||||
|
| Error: dev/issues vacío o ausente | unit | run en dir sin `dev/issues/` | Error claro, no panic |
|
||||||
|
|
||||||
|
## Notas
|
||||||
|
|
||||||
|
Hermano del cambio ya hecho en `.claude/commands/issue.md` (glob `**/*.md`). Hasta cerrar este issue, usar `/issue` (no `dev_console`) para vistas completas del backlog.
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
id: "0180"
|
||||||
|
title: "Modo ausente sobre la cola de issues: parametrizar /ausente + DAG dag_engine + validación"
|
||||||
|
status: pendiente
|
||||||
|
type: infra
|
||||||
|
domain:
|
||||||
|
- meta
|
||||||
|
scope: multi-app
|
||||||
|
priority: alta
|
||||||
|
depends: ["0179"]
|
||||||
|
blocks: []
|
||||||
|
related: []
|
||||||
|
created: 2026-06-30
|
||||||
|
updated: 2026-06-30
|
||||||
|
tags: []
|
||||||
|
---
|
||||||
|
# 0180 — Modo ausente sobre la cola de issues (parametrizar /ausente + DAG + validación)
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Modelo de colaboración acordado (ver memoria `modelo-colaboracion-ausente`): durante la jornada de oficina (L–J 10–14 / 15–19, V 10–16) y la noche (01–09), Claude trabaja en `/ausente` la cola de issues `ausente-ready` (39 issues hoy), sin supervisión. La curación del backlog ya está hecha (triage, taxonomía, deps de series formalizadas, tag `ausente-ready`).
|
||||||
|
|
||||||
|
Faltan 3 piezas para automatizarlo de forma segura.
|
||||||
|
|
||||||
|
## Problemas a resolver
|
||||||
|
|
||||||
|
1. **`/ausente` está acoplado al roadmap ComfyUI.** El skill (`.claude/commands/ausente.md`) hardcodea su backlog a funciones ComfyUI (secciones "Configuración" y "Backlog del roadmap ComfyUI"). Hay que **parametrizar la fuente de tareas** para que pueda tomar la cola de issues: la siguiente tarea = primer issue de `/issue list -t ausente-ready` cuyas `depends` estén todas en `completed/`, re-cruzando deps en cada ciclo (un issue se libera cuando su dep se cierra).
|
||||||
|
2. **Lanzamiento headless desde dag_engine.** `dag_engine` ejecuta steps (command/script/function), no abre una sesión Claude interactiva. Hay que resolver cómo un step arranca una sesión `role=orchestrator` en modo `/ausente` (candidatos: `launch_claude_agent_kitty_bash_infra` con DISPLAY, o `spawn_fleet_agent_bash_infra` si hay sesión tmux fleet) con el prompt autónomo + presupuesto.
|
||||||
|
3. **Presupuesto conservador aplicado.** Tope: 1–2 ejecutores concurrentes, solo issues S/M, ~1M tokens por franja, parada al llegar. Materializar el tope de tokens (hoy `orchestration.md` solo fija fan-out=6).
|
||||||
|
|
||||||
|
## Schedule objetivo (cuando se active)
|
||||||
|
|
||||||
|
- Inicio de franjas de oficina: `0 10 * * 1-5` (10:00 L–V) y `0 15 * * 1-4` (15:00 L–J, tras comida).
|
||||||
|
- Nocturno: `0 1 * * *` (01:00 diario).
|
||||||
|
- El modo, una vez lanzado, itera con `ScheduleWakeup` hasta que el humano vuelve (para al recibir prompt humano).
|
||||||
|
|
||||||
|
Borrador del DAG: `apps/dag_engine/dags/ausente-issues-queue.yaml` (creado como DRAFT sin schedule activo).
|
||||||
|
|
||||||
|
## Definition of Done
|
||||||
|
|
||||||
|
| Escenario | Tipo | Comando / evidencia | Resultado esperado |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Golden: corrida manual | e2e | lanzar `/ausente` con backlog=issues sobre 1 issue S de la cola | Coge el issue, lo implementa en worktree/sub-repo aislado, cierra DoD verde (golden+edge+error), push, bitácora actualizada |
|
||||||
|
| Edge: dep no satisfecha | e2e | cola con un issue cuya `depends` sigue activa | NO lo coge; pasa al siguiente arrancable |
|
||||||
|
| Edge: flota llena | e2e | 2 ejecutores activos (tope conservador) | Encola el resto, no lanza el 3.º |
|
||||||
|
| Error: presupuesto agotado | e2e | tope de tokens alcanzado | Para limpio, deja bitácora con lo pendiente, no deja agentes huérfanos |
|
||||||
|
| Vida útil | observabilidad | tras activar cron, 1 semana | Issues cerrados/semana > 0, 0 merges rotos a master, bitácora legible |
|
||||||
|
|
||||||
|
## Plan
|
||||||
|
|
||||||
|
1. Cerrar `0179` (dev_console recursivo) — dependencia.
|
||||||
|
2. Parametrizar `/ausente` (fuente de backlog = issues ausente-ready | roadmap; pasar la fuente al invocar).
|
||||||
|
3. Resolver el step de lanzamiento headless + presupuesto de tokens.
|
||||||
|
4. **Validación manual** (golden + edges) antes de activar el cron.
|
||||||
|
5. Activar schedule en el DAG + `systemctl --user restart dag_engine.service` con `--scheduler`.
|
||||||
|
|
||||||
|
## Notas
|
||||||
|
|
||||||
|
Este issue NO es `ausente-ready` a propósito: requiere decisiones de diseño humanas (mecanismo de lanzamiento, forma del presupuesto) y toca el propio sistema que orquesta el modo ausente. Se hace JUNTOS, no desatendido.
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0059"
|
id: "0059"
|
||||||
title: "Resolver doble tracking de `apps/*/app.md` (fn_registry + sub-repo)"
|
title: "Resolver doble tracking de `apps/*/app.md` (fn_registry + sub-repo)"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: infra
|
type: infra
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "55"
|
id: "55"
|
||||||
title: "Roadmap de prereqs — issues de osint_graph que odr_console necesita antes/durante MVP"
|
title: "Roadmap de prereqs — issues de osint_graph que odr_console necesita antes/durante MVP"
|
||||||
status: pendiente
|
status: deferred
|
||||||
type: epic
|
type: epic
|
||||||
domain:
|
domain:
|
||||||
- osint
|
- osint
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0087"
|
id: "0087"
|
||||||
title: "Capability Discovery Acceleration"
|
title: "Capability Discovery Acceleration"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- meta
|
- meta
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0096"
|
id: "0096"
|
||||||
title: "Estandarizar ubicacion de apps: fuera de carpetas por lenguaje"
|
title: "Estandarizar ubicacion de apps: fuera de carpetas por lenguaje"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- apps-infra
|
- apps-infra
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0101"
|
id: "0101"
|
||||||
title: "dev_console Go binario: /issue /flow /work unificados"
|
title: "dev_console Go binario: /issue /flow /work unificados"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: app
|
type: app
|
||||||
domain:
|
domain:
|
||||||
- meta
|
- meta
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0103"
|
id: "0103"
|
||||||
title: "Taxonomia + slash commands /issue /flow /work"
|
title: "Taxonomia + slash commands /issue /flow /work"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- meta
|
- meta
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0105"
|
id: "0105"
|
||||||
title: "Estandarizar bloque service: en app.md + indexer + fn doctor services-spec"
|
title: "Estandarizar bloque service: en app.md + indexer + fn doctor services-spec"
|
||||||
status: in-progress
|
status: completado
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- meta
|
- meta
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0109g"
|
id: "0109g"
|
||||||
title: "skill_tree: panel terminal embebida (claude TUI dentro de la app)"
|
title: "skill_tree: panel terminal embebida (claude TUI dentro de la app)"
|
||||||
status: pendiente
|
status: deferred
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- meta
|
- meta
|
||||||
@@ -19,7 +19,7 @@ related:
|
|||||||
- "0102"
|
- "0102"
|
||||||
created: 2026-05-18
|
created: 2026-05-18
|
||||||
updated: 2026-05-18
|
updated: 2026-05-18
|
||||||
tags: [dod, evidence, frontmatter, taxonomy, validator]
|
tags: [dod, evidence, frontmatter, taxonomy, validator, ausente-ready]
|
||||||
flow: "0008"
|
flow: "0008"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ blocks:
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-22
|
created: 2026-05-22
|
||||||
updated: 2026-05-22
|
updated: 2026-05-22
|
||||||
tags: [agents_and_robots, http, sse, apikey, traefik, systemd]
|
tags: [agents_and_robots, http, sse, apikey, traefik, systemd, ausente-ready]
|
||||||
dod_evidence_schema:
|
dod_evidence_schema:
|
||||||
- id: build_ok
|
- id: build_ok
|
||||||
kind: cmd
|
kind: cmd
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0153"
|
id: "0153"
|
||||||
title: "matrix-client-pc agent integration: paneles para rooms operados por agentes"
|
title: "matrix-client-pc agent integration: paneles para rooms operados por agentes"
|
||||||
status: pending
|
status: deferred
|
||||||
priority: medium
|
priority: medium
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0010", "0009"]
|
related_flows: ["0010", "0009"]
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0164"
|
id: "0164"
|
||||||
title: "Bots agents_and_robots: cryptohelper.Init() cuelga al habilitar encryption=true"
|
title: "Bots agents_and_robots: cryptohelper.Init() cuelga al habilitar encryption=true"
|
||||||
status: pending
|
status: deferred
|
||||||
priority: high
|
priority: high
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
related_flows: ["0009"]
|
related_flows: ["0009"]
|
||||||
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: ["0167", "0168"]
|
related: ["0167", "0168"]
|
||||||
created: 2026-05-24
|
created: 2026-05-24
|
||||||
updated: 2026-05-24
|
updated: 2026-05-24
|
||||||
tags: [matrix, livekit, webrtc, turn, nat]
|
tags: [matrix, livekit, webrtc, turn, nat, ausente-ready]
|
||||||
---
|
---
|
||||||
# 0166 — Desplegar TURN para LiveKit (coturn o integrado)
|
# 0166 — Desplegar TURN para LiveKit (coturn o integrado)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0171"
|
id: "0171"
|
||||||
title: "Manifest de sub-repos por project + re-clonado y auditoría de cobertura en Gitea"
|
title: "Manifest de sub-repos por project + re-clonado y auditoría de cobertura en Gitea"
|
||||||
status: pendiente
|
status: completado
|
||||||
type: enhancement
|
type: enhancement
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0173"
|
id: "0173"
|
||||||
title: "EDA: bugs críticos de correctitud estadística (outlier_pct ×100, distribution_type por-skew)"
|
title: "EDA: bugs críticos de correctitud estadística (outlier_pct ×100, distribution_type por-skew)"
|
||||||
status: resuelto
|
status: completado
|
||||||
type: bugfix
|
type: bugfix
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0174"
|
id: "0174"
|
||||||
title: "EDA series temporales: período estacional roto + correlación de niveles + to_returns ciego"
|
title: "EDA series temporales: período estacional roto + correlación de niveles + to_returns ciego"
|
||||||
status: resuelto
|
status: completado
|
||||||
type: bugfix
|
type: bugfix
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0175"
|
id: "0175"
|
||||||
title: "EDA relational: precisión de FK inference (falsos positivos) + filtrar VIEWs + test ATTACH"
|
title: "EDA relational: precisión de FK inference (falsos positivos) + filtrar VIEWs + test ATTACH"
|
||||||
status: resuelto
|
status: completado
|
||||||
type: bugfix
|
type: bugfix
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0176"
|
id: "0176"
|
||||||
title: "EDA render: models/series/caveats en markdown+PDF + PDF para profile_database"
|
title: "EDA render: models/series/caveats en markdown+PDF + PDF para profile_database"
|
||||||
status: resuelto
|
status: completado
|
||||||
type: feature
|
type: feature
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
id: "0177"
|
id: "0177"
|
||||||
title: "EDA tipos: id secuencial fuera de correlación/PCA + η² espurio por cardinalidad + re-expresión no-continuas"
|
title: "EDA tipos: id secuencial fuera de correlación/PCA + η² espurio por cardinalidad + re-expresión no-continuas"
|
||||||
status: resuelto
|
status: completado
|
||||||
type: bugfix
|
type: bugfix
|
||||||
domain:
|
domain:
|
||||||
- registry-quality
|
- registry-quality
|
||||||
+1
-1
@@ -12,7 +12,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-17
|
created: 2026-05-17
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
# 0033 — C++ http_inspector + websocket_client
|
# 0033 — C++ http_inspector + websocket_client
|
||||||
|
|
||||||
+1
-4
@@ -13,10 +13,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags:
|
tags: [ausente-ready, gamedev, cpp, wasm]
|
||||||
- gamedev
|
|
||||||
- cpp
|
|
||||||
- wasm
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Objetivo
|
## Objetivo
|
||||||
+1
-1
@@ -13,7 +13,7 @@ blocks: []
|
|||||||
related: []
|
related: []
|
||||||
created: 2026-05-13
|
created: 2026-05-13
|
||||||
updated: 2026-05-17
|
updated: 2026-05-17
|
||||||
tags: []
|
tags: [ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
## Objetivo
|
## Objetivo
|
||||||
+1
-1
@@ -15,7 +15,7 @@ related:
|
|||||||
- "0106"
|
- "0106"
|
||||||
created: 2026-05-18
|
created: 2026-05-18
|
||||||
updated: 2026-05-18
|
updated: 2026-05-18
|
||||||
tags: [http, cpp, registry-gap, curl, helper]
|
tags: [http, cpp, registry-gap, curl, helper, ausente-ready]
|
||||||
---
|
---
|
||||||
|
|
||||||
# 0110 — Helper HTTP cliente C++ en el registry
|
# 0110 — Helper HTTP cliente C++ en el registry
|
||||||
+1
-2
@@ -8,8 +8,7 @@ domain:
|
|||||||
- dev-ux
|
- dev-ux
|
||||||
scope: app-scoped
|
scope: app-scoped
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0130b"]
|
||||||
- "0130b"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related:
|
related:
|
||||||
- "0130"
|
- "0130"
|
||||||
+1
-1
@@ -16,7 +16,7 @@ related:
|
|||||||
- "0131"
|
- "0131"
|
||||||
created: 2026-05-22
|
created: 2026-05-22
|
||||||
updated: 2026-05-22
|
updated: 2026-05-22
|
||||||
tags: [cpp, imgui, terminal, pty, module]
|
tags: [cpp, imgui, terminal, pty, module, ausente-ready]
|
||||||
flow: ""
|
flow: ""
|
||||||
---
|
---
|
||||||
|
|
||||||
+1
-2
@@ -7,8 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0072a"]
|
||||||
- "0072a"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-2
@@ -7,8 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0072b"]
|
||||||
- "0072b"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-3
@@ -7,9 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0072a", "0072b"]
|
||||||
- "0072a"
|
|
||||||
- "0072b"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-3
@@ -7,9 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: alta
|
priority: alta
|
||||||
depends:
|
depends: ["0072a", "0072d"]
|
||||||
- "0072a"
|
|
||||||
- "0072d"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-2
@@ -7,8 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0072e"]
|
||||||
- "0072e"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-3
@@ -7,9 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0072b", "0072c"]
|
||||||
- "0072b"
|
|
||||||
- "0072c"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-3
@@ -7,9 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: multi-app
|
scope: multi-app
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0072b", "0072c"]
|
||||||
- "0072b"
|
|
||||||
- "0072c"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
+1
-3
@@ -7,9 +7,7 @@ domain:
|
|||||||
- gamedev
|
- gamedev
|
||||||
scope: app-scoped
|
scope: app-scoped
|
||||||
priority: media
|
priority: media
|
||||||
depends:
|
depends: ["0072b", "0072c"]
|
||||||
- "0072b"
|
|
||||||
- "0072c"
|
|
||||||
blocks: []
|
blocks: []
|
||||||
related: []
|
related: []
|
||||||
created: 2026-05-10
|
created: 2026-05-10
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user