@nac3/forge-cli 0.2.0-alpha.9 → 1.0.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/README.md +21 -2
- package/dist/a11y/helpers.d.ts +88 -0
- package/dist/a11y/helpers.d.ts.map +1 -0
- package/dist/a11y/helpers.js +109 -0
- package/dist/a11y/helpers.js.map +1 -0
- package/dist/agents/bridge.d.ts +69 -0
- package/dist/agents/bridge.d.ts.map +1 -0
- package/dist/agents/bridge.js +322 -0
- package/dist/agents/bridge.js.map +1 -0
- package/dist/agents/cli_real.d.ts +38 -0
- package/dist/agents/cli_real.d.ts.map +1 -0
- package/dist/agents/cli_real.js +46 -0
- package/dist/agents/cli_real.js.map +1 -0
- package/dist/agents/config_resolver.d.ts +16 -0
- package/dist/agents/config_resolver.d.ts.map +1 -0
- package/dist/agents/config_resolver.js +133 -0
- package/dist/agents/config_resolver.js.map +1 -0
- package/dist/agents/config_schema.d.ts +42 -0
- package/dist/agents/config_schema.d.ts.map +1 -0
- package/dist/agents/config_schema.js +220 -0
- package/dist/agents/config_schema.js.map +1 -0
- package/dist/agents/defaults.d.ts +21 -0
- package/dist/agents/defaults.d.ts.map +1 -0
- package/dist/agents/defaults.js +56 -0
- package/dist/agents/defaults.js.map +1 -0
- package/dist/agents/delegate.d.ts +36 -0
- package/dist/agents/delegate.d.ts.map +1 -0
- package/dist/agents/delegate.js +68 -0
- package/dist/agents/delegate.js.map +1 -0
- package/dist/agents/iterative_step.d.ts +95 -0
- package/dist/agents/iterative_step.d.ts.map +1 -0
- package/dist/agents/iterative_step.js +249 -0
- package/dist/agents/iterative_step.js.map +1 -0
- package/dist/agents/llm_step.d.ts +50 -0
- package/dist/agents/llm_step.d.ts.map +1 -0
- package/dist/agents/llm_step.js +28 -0
- package/dist/agents/llm_step.js.map +1 -0
- package/dist/agents/real_step_factory.d.ts +95 -0
- package/dist/agents/real_step_factory.d.ts.map +1 -0
- package/dist/agents/real_step_factory.js +51 -0
- package/dist/agents/real_step_factory.js.map +1 -0
- package/dist/agents/runner.d.ts +116 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +221 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/runtime.d.ts +115 -0
- package/dist/agents/runtime.d.ts.map +1 -0
- package/dist/agents/runtime.js +429 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/agents/store.d.ts +33 -0
- package/dist/agents/store.d.ts.map +1 -0
- package/dist/agents/store.js +210 -0
- package/dist/agents/store.js.map +1 -0
- package/dist/agents/system_prompt.d.ts +36 -0
- package/dist/agents/system_prompt.d.ts.map +1 -0
- package/dist/agents/system_prompt.js +102 -0
- package/dist/agents/system_prompt.js.map +1 -0
- package/dist/agents/types.d.ts +123 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +39 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +119 -2
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude.d.ts +102 -1
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js +215 -40
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +155 -0
- package/dist/chat/claude_cli.d.ts.map +1 -0
- package/dist/chat/claude_cli.js +679 -0
- package/dist/chat/claude_cli.js.map +1 -0
- package/dist/chat/completion_hallucination_detector.d.ts +51 -0
- package/dist/chat/completion_hallucination_detector.d.ts.map +1 -0
- package/dist/chat/completion_hallucination_detector.js +131 -0
- package/dist/chat/completion_hallucination_detector.js.map +1 -0
- package/dist/chat/doctrine_digest.d.ts +31 -0
- package/dist/chat/doctrine_digest.d.ts.map +1 -0
- package/dist/chat/doctrine_digest.js +121 -0
- package/dist/chat/doctrine_digest.js.map +1 -0
- package/dist/chat/graph_auto_ingest.d.ts +46 -0
- package/dist/chat/graph_auto_ingest.d.ts.map +1 -0
- package/dist/chat/graph_auto_ingest.js +177 -0
- package/dist/chat/graph_auto_ingest.js.map +1 -0
- package/dist/chat/graph_component_watcher.d.ts +34 -0
- package/dist/chat/graph_component_watcher.d.ts.map +1 -0
- package/dist/chat/graph_component_watcher.js +225 -0
- package/dist/chat/graph_component_watcher.js.map +1 -0
- package/dist/chat/graph_snapshot.d.ts +38 -0
- package/dist/chat/graph_snapshot.d.ts.map +1 -0
- package/dist/chat/graph_snapshot.js +159 -0
- package/dist/chat/graph_snapshot.js.map +1 -0
- package/dist/chat/ingest_session.d.ts +24 -4
- package/dist/chat/ingest_session.d.ts.map +1 -1
- package/dist/chat/ingest_session.js +143 -4
- package/dist/chat/ingest_session.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +10483 -1455
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/panel_queue.d.ts +43 -0
- package/dist/chat/panel_queue.d.ts.map +1 -0
- package/dist/chat/panel_queue.js +46 -0
- package/dist/chat/panel_queue.js.map +1 -0
- package/dist/chat/project_context_inject.d.ts +10 -0
- package/dist/chat/project_context_inject.d.ts.map +1 -0
- package/dist/chat/project_context_inject.js +119 -0
- package/dist/chat/project_context_inject.js.map +1 -0
- package/dist/chat/project_slug.d.ts +17 -0
- package/dist/chat/project_slug.d.ts.map +1 -0
- package/dist/chat/project_slug.js +103 -0
- package/dist/chat/project_slug.js.map +1 -0
- package/dist/chat/refusal_detector.d.ts +14 -0
- package/dist/chat/refusal_detector.d.ts.map +1 -0
- package/dist/chat/refusal_detector.js +139 -0
- package/dist/chat/refusal_detector.js.map +1 -0
- package/dist/chat/semantic_graph_ingest.d.ts +39 -0
- package/dist/chat/semantic_graph_ingest.d.ts.map +1 -0
- package/dist/chat/semantic_graph_ingest.js +90 -0
- package/dist/chat/semantic_graph_ingest.js.map +1 -0
- package/dist/chat/semantic_graph_inject.d.ts +31 -0
- package/dist/chat/semantic_graph_inject.d.ts.map +1 -0
- package/dist/chat/semantic_graph_inject.js +63 -0
- package/dist/chat/semantic_graph_inject.js.map +1 -0
- package/dist/chat/server.d.ts +99 -2
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +4613 -452
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/session_projects.d.ts +31 -0
- package/dist/chat/session_projects.d.ts.map +1 -0
- package/dist/chat/session_projects.js +36 -0
- package/dist/chat/session_projects.js.map +1 -0
- package/dist/chat/session_store.d.ts +32 -0
- package/dist/chat/session_store.d.ts.map +1 -0
- package/dist/chat/session_store.js +58 -0
- package/dist/chat/session_store.js.map +1 -0
- package/dist/chat/spec_extract.d.ts +1 -2
- package/dist/chat/spec_extract.d.ts.map +1 -1
- package/dist/chat/spec_extract.js +41 -56
- package/dist/chat/spec_extract.js.map +1 -1
- package/dist/chat/spec_plan.d.ts +1 -2
- package/dist/chat/spec_plan.d.ts.map +1 -1
- package/dist/chat/spec_plan.js +36 -57
- package/dist/chat/spec_plan.js.map +1 -1
- package/dist/chat/tooling_section.d.ts +11 -0
- package/dist/chat/tooling_section.d.ts.map +1 -0
- package/dist/chat/tooling_section.js +70 -0
- package/dist/chat/tooling_section.js.map +1 -0
- package/dist/chat/tools/app_backend_dispatch.d.ts +39 -0
- package/dist/chat/tools/app_backend_dispatch.d.ts.map +1 -0
- package/dist/chat/tools/app_backend_dispatch.js +282 -0
- package/dist/chat/tools/app_backend_dispatch.js.map +1 -0
- package/dist/chat/tools/fs_editor.d.ts +11 -0
- package/dist/chat/tools/fs_editor.d.ts.map +1 -0
- package/dist/chat/tools/fs_editor.js +212 -0
- package/dist/chat/tools/fs_editor.js.map +1 -0
- package/dist/chat/tools/git.d.ts +24 -0
- package/dist/chat/tools/git.d.ts.map +1 -1
- package/dist/chat/tools/git.js +78 -0
- package/dist/chat/tools/git.js.map +1 -1
- package/dist/chat/tools/graph.d.ts +43 -0
- package/dist/chat/tools/graph.d.ts.map +1 -0
- package/dist/chat/tools/graph.js +174 -0
- package/dist/chat/tools/graph.js.map +1 -0
- package/dist/chat/tools/keys.d.ts +9 -0
- package/dist/chat/tools/keys.d.ts.map +1 -0
- package/dist/chat/tools/keys.js +156 -0
- package/dist/chat/tools/keys.js.map +1 -0
- package/dist/chat/tools/misc_verbs.d.ts +36 -0
- package/dist/chat/tools/misc_verbs.d.ts.map +1 -0
- package/dist/chat/tools/misc_verbs.js +405 -0
- package/dist/chat/tools/misc_verbs.js.map +1 -0
- package/dist/chat/tools/nac3_invoke.d.ts +58 -0
- package/dist/chat/tools/nac3_invoke.d.ts.map +1 -0
- package/dist/chat/tools/nac3_invoke.js +896 -0
- package/dist/chat/tools/nac3_invoke.js.map +1 -0
- package/dist/chat/tools/pending.d.ts +69 -0
- package/dist/chat/tools/pending.d.ts.map +1 -0
- package/dist/chat/tools/pending.js +167 -0
- package/dist/chat/tools/pending.js.map +1 -0
- package/dist/chat/tools/pizarron.d.ts +40 -0
- package/dist/chat/tools/pizarron.d.ts.map +1 -0
- package/dist/chat/tools/pizarron.js +123 -0
- package/dist/chat/tools/pizarron.js.map +1 -0
- package/dist/chat/tools/project_lifecycle.d.ts +24 -0
- package/dist/chat/tools/project_lifecycle.d.ts.map +1 -0
- package/dist/chat/tools/project_lifecycle.js +212 -0
- package/dist/chat/tools/project_lifecycle.js.map +1 -0
- package/dist/chat/tools/reader.d.ts.map +1 -1
- package/dist/chat/tools/reader.js +144 -1
- package/dist/chat/tools/reader.js.map +1 -1
- package/dist/chat/tools/shell.d.ts +64 -0
- package/dist/chat/tools/shell.d.ts.map +1 -0
- package/dist/chat/tools/shell.js +292 -0
- package/dist/chat/tools/shell.js.map +1 -0
- package/dist/chat/tools/wiring.d.ts +28 -0
- package/dist/chat/tools/wiring.d.ts.map +1 -0
- package/dist/chat/tools/wiring.js +116 -0
- package/dist/chat/tools/wiring.js.map +1 -0
- package/dist/chat/tools/workflow.d.ts +75 -0
- package/dist/chat/tools/workflow.d.ts.map +1 -0
- package/dist/chat/tools/workflow.js +561 -0
- package/dist/chat/tools/workflow.js.map +1 -0
- package/dist/chat/tools.d.ts +42 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +525 -16
- package/dist/chat/tools.js.map +1 -1
- package/dist/chat/turn_control.d.ts +42 -0
- package/dist/chat/turn_control.d.ts.map +1 -0
- package/dist/chat/turn_control.js +53 -0
- package/dist/chat/turn_control.js.map +1 -0
- package/dist/chat/wiring_inject.d.ts +18 -0
- package/dist/chat/wiring_inject.d.ts.map +1 -0
- package/dist/chat/wiring_inject.js +78 -0
- package/dist/chat/wiring_inject.js.map +1 -0
- package/dist/chat/workflow_inject.d.ts +52 -0
- package/dist/chat/workflow_inject.d.ts.map +1 -0
- package/dist/chat/workflow_inject.js +346 -0
- package/dist/chat/workflow_inject.js.map +1 -0
- package/dist/chat/yujin_splash.d.ts +27 -0
- package/dist/chat/yujin_splash.d.ts.map +1 -0
- package/dist/chat/yujin_splash.js +147 -0
- package/dist/chat/yujin_splash.js.map +1 -0
- package/dist/commands/agent.d.ts +33 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +281 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/approve.d.ts +32 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +198 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/block.d.ts +28 -0
- package/dist/commands/block.d.ts.map +1 -0
- package/dist/commands/block.js +189 -0
- package/dist/commands/block.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +35 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +205 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/brain.d.ts +17 -0
- package/dist/commands/brain.d.ts.map +1 -0
- package/dist/commands/brain.js +129 -0
- package/dist/commands/brain.js.map +1 -0
- package/dist/commands/chat.d.ts +10 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +265 -22
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/clarify.d.ts +30 -0
- package/dist/commands/clarify.d.ts.map +1 -0
- package/dist/commands/clarify.js +671 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/director.d.ts +37 -0
- package/dist/commands/director.d.ts.map +1 -0
- package/dist/commands/director.js +290 -0
- package/dist/commands/director.js.map +1 -0
- package/dist/commands/discover.d.ts +30 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +178 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +120 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctrine.d.ts +24 -0
- package/dist/commands/doctrine.d.ts.map +1 -0
- package/dist/commands/doctrine.js +106 -0
- package/dist/commands/doctrine.js.map +1 -0
- package/dist/commands/doctrines.d.ts +21 -0
- package/dist/commands/doctrines.d.ts.map +1 -0
- package/dist/commands/doctrines.js +158 -0
- package/dist/commands/doctrines.js.map +1 -0
- package/dist/commands/graph.d.ts +29 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +362 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/keys_setup.d.ts +11 -11
- package/dist/commands/keys_setup.d.ts.map +1 -1
- package/dist/commands/keys_setup.js +149 -109
- package/dist/commands/keys_setup.js.map +1 -1
- package/dist/commands/legacy-audit.d.ts +34 -0
- package/dist/commands/legacy-audit.d.ts.map +1 -0
- package/dist/commands/legacy-audit.js +270 -0
- package/dist/commands/legacy-audit.js.map +1 -0
- package/dist/commands/lessons.d.ts +28 -0
- package/dist/commands/lessons.d.ts.map +1 -0
- package/dist/commands/lessons.js +309 -0
- package/dist/commands/lessons.js.map +1 -0
- package/dist/commands/license.d.ts.map +1 -1
- package/dist/commands/license.js +94 -15
- package/dist/commands/license.js.map +1 -1
- package/dist/commands/limits.d.ts +15 -0
- package/dist/commands/limits.d.ts.map +1 -0
- package/dist/commands/limits.js +51 -0
- package/dist/commands/limits.js.map +1 -0
- package/dist/commands/manifest-cli.d.ts +12 -0
- package/dist/commands/manifest-cli.d.ts.map +1 -0
- package/dist/commands/manifest-cli.js +42 -0
- package/dist/commands/manifest-cli.js.map +1 -0
- package/dist/commands/mcp.d.ts +24 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +219 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mobile.d.ts +15 -0
- package/dist/commands/mobile.d.ts.map +1 -1
- package/dist/commands/mobile.js +50 -43
- package/dist/commands/mobile.js.map +1 -1
- package/dist/commands/nac3.d.ts +22 -0
- package/dist/commands/nac3.d.ts.map +1 -0
- package/dist/commands/nac3.js +125 -0
- package/dist/commands/nac3.js.map +1 -0
- package/dist/commands/onboard.d.ts +19 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +126 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/operate.d.ts +22 -0
- package/dist/commands/operate.d.ts.map +1 -0
- package/dist/commands/operate.js +523 -0
- package/dist/commands/operate.js.map +1 -0
- package/dist/commands/pending.d.ts +22 -0
- package/dist/commands/pending.d.ts.map +1 -0
- package/dist/commands/pending.js +365 -0
- package/dist/commands/pending.js.map +1 -0
- package/dist/commands/projects.js +25 -1
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/qa.d.ts +24 -0
- package/dist/commands/qa.d.ts.map +1 -0
- package/dist/commands/qa.js +349 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/review-screens.js +28 -1
- package/dist/commands/review-screens.js.map +1 -1
- package/dist/commands/spec.d.ts +38 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +256 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/support.d.ts +22 -0
- package/dist/commands/support.d.ts.map +1 -0
- package/dist/commands/support.js +165 -0
- package/dist/commands/support.js.map +1 -0
- package/dist/commands/test_agent.d.ts +22 -0
- package/dist/commands/test_agent.d.ts.map +1 -0
- package/dist/commands/test_agent.js +100 -0
- package/dist/commands/test_agent.js.map +1 -0
- package/dist/commands/triage.d.ts +34 -0
- package/dist/commands/triage.d.ts.map +1 -0
- package/dist/commands/triage.js +228 -0
- package/dist/commands/triage.js.map +1 -0
- package/dist/commands/vault-inventory.d.ts +30 -0
- package/dist/commands/vault-inventory.d.ts.map +1 -0
- package/dist/commands/vault-inventory.js +222 -0
- package/dist/commands/vault-inventory.js.map +1 -0
- package/dist/commands/vault.d.ts.map +1 -1
- package/dist/commands/vault.js +5 -0
- package/dist/commands/vault.js.map +1 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +47 -4
- package/dist/commands/voice.js.map +1 -1
- package/dist/commands/wiring.d.ts +19 -0
- package/dist/commands/wiring.d.ts.map +1 -0
- package/dist/commands/wiring.js +135 -0
- package/dist/commands/wiring.js.map +1 -0
- package/dist/commands/workflow-coverage.d.ts +30 -0
- package/dist/commands/workflow-coverage.d.ts.map +1 -0
- package/dist/commands/workflow-coverage.js +138 -0
- package/dist/commands/workflow-coverage.js.map +1 -0
- package/dist/commands/workflow.d.ts +18 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +253 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/core/ansi_strip.d.ts +39 -0
- package/dist/core/ansi_strip.d.ts.map +1 -0
- package/dist/core/ansi_strip.js +71 -0
- package/dist/core/ansi_strip.js.map +1 -0
- package/dist/core/atomic_write.d.ts +17 -0
- package/dist/core/atomic_write.d.ts.map +1 -0
- package/dist/core/atomic_write.js +51 -0
- package/dist/core/atomic_write.js.map +1 -0
- package/dist/core/audit_log.d.ts +43 -0
- package/dist/core/audit_log.d.ts.map +1 -0
- package/dist/core/audit_log.js +80 -0
- package/dist/core/audit_log.js.map +1 -0
- package/dist/core/brain_config.d.ts +52 -0
- package/dist/core/brain_config.d.ts.map +1 -0
- package/dist/core/brain_config.js +157 -0
- package/dist/core/brain_config.js.map +1 -0
- package/dist/core/budget.d.ts +96 -0
- package/dist/core/budget.d.ts.map +1 -0
- package/dist/core/budget.js +328 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/cf_tunnel.d.ts.map +1 -1
- package/dist/core/cf_tunnel.js +8 -2
- package/dist/core/cf_tunnel.js.map +1 -1
- package/dist/core/cost_meter.d.ts +35 -0
- package/dist/core/cost_meter.d.ts.map +1 -0
- package/dist/core/cost_meter.js +111 -0
- package/dist/core/cost_meter.js.map +1 -0
- package/dist/core/cost_router.d.ts +106 -0
- package/dist/core/cost_router.d.ts.map +1 -0
- package/dist/core/cost_router.js +598 -0
- package/dist/core/cost_router.js.map +1 -0
- package/dist/core/desktop_open.d.ts +16 -0
- package/dist/core/desktop_open.d.ts.map +1 -0
- package/dist/core/desktop_open.js +114 -0
- package/dist/core/desktop_open.js.map +1 -0
- package/dist/core/doctrine_resolver.d.ts +23 -0
- package/dist/core/doctrine_resolver.d.ts.map +1 -0
- package/dist/core/doctrine_resolver.js +108 -0
- package/dist/core/doctrine_resolver.js.map +1 -0
- package/dist/core/error_catalog.d.ts +80 -0
- package/dist/core/error_catalog.d.ts.map +1 -0
- package/dist/core/error_catalog.js +168 -0
- package/dist/core/error_catalog.js.map +1 -0
- package/dist/core/error_formatter.d.ts +30 -0
- package/dist/core/error_formatter.d.ts.map +1 -0
- package/dist/core/error_formatter.js +155 -0
- package/dist/core/error_formatter.js.map +1 -0
- package/dist/core/incomplete_detector.d.ts +51 -0
- package/dist/core/incomplete_detector.d.ts.map +1 -0
- package/dist/core/incomplete_detector.js +140 -0
- package/dist/core/incomplete_detector.js.map +1 -0
- package/dist/core/keys_envelope.d.ts.map +1 -1
- package/dist/core/keys_envelope.js +19 -10
- package/dist/core/keys_envelope.js.map +1 -1
- package/dist/core/learnings_client.d.ts +104 -0
- package/dist/core/learnings_client.d.ts.map +1 -0
- package/dist/core/learnings_client.js +262 -0
- package/dist/core/learnings_client.js.map +1 -0
- package/dist/core/limits_config.d.ts +81 -0
- package/dist/core/limits_config.d.ts.map +1 -0
- package/dist/core/limits_config.js +302 -0
- package/dist/core/limits_config.js.map +1 -0
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +3 -0
- package/dist/core/logger.js.map +1 -1
- package/dist/core/pairing.d.ts +7 -0
- package/dist/core/pairing.d.ts.map +1 -1
- package/dist/core/pairing.js +64 -14
- package/dist/core/pairing.js.map +1 -1
- package/dist/core/pilot_setup.d.ts +29 -3
- package/dist/core/pilot_setup.d.ts.map +1 -1
- package/dist/core/pilot_setup.js +130 -3
- package/dist/core/pilot_setup.js.map +1 -1
- package/dist/core/provider_keys.d.ts +35 -0
- package/dist/core/provider_keys.d.ts.map +1 -0
- package/dist/core/provider_keys.js +280 -0
- package/dist/core/provider_keys.js.map +1 -0
- package/dist/core/provider_models.d.ts +27 -0
- package/dist/core/provider_models.d.ts.map +1 -0
- package/dist/core/provider_models.js +169 -0
- package/dist/core/provider_models.js.map +1 -0
- package/dist/core/reasoning_gate.d.ts +72 -0
- package/dist/core/reasoning_gate.d.ts.map +1 -0
- package/dist/core/reasoning_gate.js +205 -0
- package/dist/core/reasoning_gate.js.map +1 -0
- package/dist/core/shell_classifier.d.ts +49 -0
- package/dist/core/shell_classifier.d.ts.map +1 -0
- package/dist/core/shell_classifier.js +159 -0
- package/dist/core/shell_classifier.js.map +1 -0
- package/dist/core/sq_resolver.d.ts +14 -0
- package/dist/core/sq_resolver.d.ts.map +1 -0
- package/dist/core/sq_resolver.js +230 -0
- package/dist/core/sq_resolver.js.map +1 -0
- package/dist/core/truncation_detector.d.ts +68 -0
- package/dist/core/truncation_detector.d.ts.map +1 -0
- package/dist/core/truncation_detector.js +115 -0
- package/dist/core/truncation_detector.js.map +1 -0
- package/dist/core/turn_classifier.d.ts +70 -0
- package/dist/core/turn_classifier.d.ts.map +1 -0
- package/dist/core/turn_classifier.js +324 -0
- package/dist/core/turn_classifier.js.map +1 -0
- package/dist/core/vad_config.d.ts +34 -0
- package/dist/core/vad_config.d.ts.map +1 -0
- package/dist/core/vad_config.js +95 -0
- package/dist/core/vad_config.js.map +1 -0
- package/dist/core/whats_new.d.ts +42 -0
- package/dist/core/whats_new.d.ts.map +1 -0
- package/dist/core/whats_new.js +214 -0
- package/dist/core/whats_new.js.map +1 -0
- package/dist/core/wizard_state.d.ts +15 -0
- package/dist/core/wizard_state.d.ts.map +1 -0
- package/dist/core/wizard_state.js +86 -0
- package/dist/core/wizard_state.js.map +1 -0
- package/dist/deploy/adapter.d.ts +93 -0
- package/dist/deploy/adapter.d.ts.map +1 -0
- package/dist/deploy/adapter.js +42 -0
- package/dist/deploy/adapter.js.map +1 -0
- package/dist/deploy/aws_adapter.d.ts +28 -0
- package/dist/deploy/aws_adapter.d.ts.map +1 -0
- package/dist/deploy/aws_adapter.js +98 -0
- package/dist/deploy/aws_adapter.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts +24 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +180 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/design/yujin_design_resolver.d.ts +93 -0
- package/dist/design/yujin_design_resolver.d.ts.map +1 -0
- package/dist/design/yujin_design_resolver.js +196 -0
- package/dist/design/yujin_design_resolver.js.map +1 -0
- package/dist/docs/LIMITED_RESPONSIBILITY.md +216 -0
- package/dist/docs/PRIVACY_POLICY.md +169 -0
- package/dist/docs/SQ.md +1397 -0
- package/dist/docs/SQ_BY_STEP.yaml +147 -0
- package/dist/docs/doctrine/accessibility.md +78 -0
- package/dist/docs/doctrine/agent-orchestrator.md +76 -0
- package/dist/docs/doctrine/byok-vs-managed.md +81 -0
- package/dist/docs/doctrine/cost-router-escalation.md +103 -0
- package/dist/docs/doctrine/default-design-system.md +152 -0
- package/dist/docs/doctrine/explain-results.md +90 -0
- package/dist/docs/doctrine/expo-eas-builds.md +177 -0
- package/dist/docs/doctrine/g-doc.md +46 -0
- package/dist/docs/doctrine/gates.md +21 -0
- package/dist/docs/doctrine/language-sovereignty.md +143 -0
- package/dist/docs/doctrine/lessons-workflow.md +68 -0
- package/dist/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
- package/dist/docs/doctrine/nac3-attrs.md +23 -0
- package/dist/docs/doctrine/office-tools.md +122 -0
- package/dist/docs/doctrine/pizarron.md +52 -0
- package/dist/docs/doctrine/r8-modal.md +60 -0
- package/dist/docs/doctrine/safety-refusals.md +73 -0
- package/dist/docs/doctrine/testing-policy.md +211 -0
- package/dist/docs/doctrine/verb-composition.md +84 -0
- package/dist/docs/doctrine/verification-honesty.md +95 -0
- package/dist/docs/doctrine/workflow-kinds.md +69 -0
- package/dist/docs/doctrine/workflow-phases.md +108 -0
- package/dist/docs/doctrine/workflow.md +66 -0
- package/dist/docs/doctrine/yf-commands.md +49 -0
- package/dist/json/query.d.ts +38 -0
- package/dist/json/query.d.ts.map +1 -0
- package/dist/json/query.js +177 -0
- package/dist/json/query.js.map +1 -0
- package/dist/license/auto_sync.d.ts +22 -0
- package/dist/license/auto_sync.d.ts.map +1 -0
- package/dist/license/auto_sync.js +91 -0
- package/dist/license/auto_sync.js.map +1 -0
- package/dist/license/handle_key.d.ts +32 -0
- package/dist/license/handle_key.d.ts.map +1 -0
- package/dist/license/handle_key.js +56 -0
- package/dist/license/handle_key.js.map +1 -0
- package/dist/license/hito4_client.d.ts +7 -0
- package/dist/license/hito4_client.d.ts.map +1 -1
- package/dist/license/hito4_client.js +113 -25
- package/dist/license/hito4_client.js.map +1 -1
- package/dist/license/sync.d.ts +59 -0
- package/dist/license/sync.d.ts.map +1 -0
- package/dist/license/sync.js +148 -0
- package/dist/license/sync.js.map +1 -0
- package/dist/llm/cohere_client.d.ts +81 -0
- package/dist/llm/cohere_client.d.ts.map +1 -0
- package/dist/llm/cohere_client.js +195 -0
- package/dist/llm/cohere_client.js.map +1 -0
- package/dist/llm/deepseek_client.d.ts +63 -0
- package/dist/llm/deepseek_client.d.ts.map +1 -0
- package/dist/llm/deepseek_client.js +188 -0
- package/dist/llm/deepseek_client.js.map +1 -0
- package/dist/llm/gemini_client.d.ts +78 -0
- package/dist/llm/gemini_client.d.ts.map +1 -0
- package/dist/llm/gemini_client.js +192 -0
- package/dist/llm/gemini_client.js.map +1 -0
- package/dist/llm/managed_client.d.ts +70 -0
- package/dist/llm/managed_client.d.ts.map +1 -0
- package/dist/llm/managed_client.js +256 -0
- package/dist/llm/managed_client.js.map +1 -0
- package/dist/llm/mistral_client.d.ts +54 -0
- package/dist/llm/mistral_client.d.ts.map +1 -0
- package/dist/llm/mistral_client.js +174 -0
- package/dist/llm/mistral_client.js.map +1 -0
- package/dist/llm/multi_provider_client.d.ts +57 -0
- package/dist/llm/multi_provider_client.d.ts.map +1 -0
- package/dist/llm/multi_provider_client.js +109 -0
- package/dist/llm/multi_provider_client.js.map +1 -0
- package/dist/llm/openai_client.d.ts +77 -0
- package/dist/llm/openai_client.d.ts.map +1 -0
- package/dist/llm/openai_client.js +200 -0
- package/dist/llm/openai_client.js.map +1 -0
- package/dist/llm/xai_client.d.ts +51 -0
- package/dist/llm/xai_client.d.ts.map +1 -0
- package/dist/llm/xai_client.js +174 -0
- package/dist/llm/xai_client.js.map +1 -0
- package/dist/mcp/blocklist.d.ts +19 -0
- package/dist/mcp/blocklist.d.ts.map +1 -0
- package/dist/mcp/blocklist.js +118 -0
- package/dist/mcp/blocklist.js.map +1 -0
- package/dist/mcp/bridge_registry.d.ts +77 -0
- package/dist/mcp/bridge_registry.d.ts.map +1 -0
- package/dist/mcp/bridge_registry.js +220 -0
- package/dist/mcp/bridge_registry.js.map +1 -0
- package/dist/mcp/config.d.ts +25 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +116 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/forge_panel_server.d.ts +46 -0
- package/dist/mcp/forge_panel_server.d.ts.map +1 -0
- package/dist/mcp/forge_panel_server.js +166 -0
- package/dist/mcp/forge_panel_server.js.map +1 -0
- package/dist/mcp/lan_scan.d.ts +36 -0
- package/dist/mcp/lan_scan.d.ts.map +1 -0
- package/dist/mcp/lan_scan.js +130 -0
- package/dist/mcp/lan_scan.js.map +1 -0
- package/dist/mcp/plan_bridges.d.ts +17 -0
- package/dist/mcp/plan_bridges.d.ts.map +1 -0
- package/dist/mcp/plan_bridges.js +119 -0
- package/dist/mcp/plan_bridges.js.map +1 -0
- package/dist/mcp/protocol_client.d.ts +63 -0
- package/dist/mcp/protocol_client.d.ts.map +1 -0
- package/dist/mcp/protocol_client.js +340 -0
- package/dist/mcp/protocol_client.js.map +1 -0
- package/dist/mcp/state.d.ts +38 -0
- package/dist/mcp/state.d.ts.map +1 -0
- package/dist/mcp/state.js +144 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/migrate/ai-apply.d.ts.map +1 -1
- package/dist/migrate/ai-apply.js +25 -2
- package/dist/migrate/ai-apply.js.map +1 -1
- package/dist/migrate/ai-decorator.d.ts.map +1 -1
- package/dist/migrate/ai-decorator.js +55 -143
- package/dist/migrate/ai-decorator.js.map +1 -1
- package/dist/nac3/approval_queue.d.ts +44 -0
- package/dist/nac3/approval_queue.d.ts.map +1 -0
- package/dist/nac3/approval_queue.js +105 -0
- package/dist/nac3/approval_queue.js.map +1 -0
- package/dist/nac3/backend_tools.d.ts +89 -0
- package/dist/nac3/backend_tools.d.ts.map +1 -0
- package/dist/nac3/backend_tools.js +271 -0
- package/dist/nac3/backend_tools.js.map +1 -0
- package/dist/nac3/dispatch_log.d.ts +35 -0
- package/dist/nac3/dispatch_log.d.ts.map +1 -0
- package/dist/nac3/dispatch_log.js +126 -0
- package/dist/nac3/dispatch_log.js.map +1 -0
- package/dist/nac3/internal_manifest.d.ts +62 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -0
- package/dist/nac3/internal_manifest.js +2651 -0
- package/dist/nac3/internal_manifest.js.map +1 -0
- package/dist/nac3/manifest_lazy.d.ts +71 -0
- package/dist/nac3/manifest_lazy.d.ts.map +1 -0
- package/dist/nac3/manifest_lazy.js +141 -0
- package/dist/nac3/manifest_lazy.js.map +1 -0
- package/dist/nac3/verb_tier_map.d.ts +80 -0
- package/dist/nac3/verb_tier_map.d.ts.map +1 -0
- package/dist/nac3/verb_tier_map.js +162 -0
- package/dist/nac3/verb_tier_map.js.map +1 -0
- package/dist/office/excel.d.ts +132 -0
- package/dist/office/excel.d.ts.map +1 -0
- package/dist/office/excel.js +358 -0
- package/dist/office/excel.js.map +1 -0
- package/dist/office/pdf.d.ts +35 -0
- package/dist/office/pdf.d.ts.map +1 -0
- package/dist/office/pdf.js +70 -0
- package/dist/office/pdf.js.map +1 -0
- package/dist/office/word.d.ts +64 -0
- package/dist/office/word.d.ts.map +1 -0
- package/dist/office/word.js +243 -0
- package/dist/office/word.js.map +1 -0
- package/dist/onboarding/concierge_client.d.ts +34 -0
- package/dist/onboarding/concierge_client.d.ts.map +1 -0
- package/dist/onboarding/concierge_client.js +80 -0
- package/dist/onboarding/concierge_client.js.map +1 -0
- package/dist/onboarding/next_step.d.ts +32 -0
- package/dist/onboarding/next_step.d.ts.map +1 -0
- package/dist/onboarding/next_step.js +60 -0
- package/dist/onboarding/next_step.js.map +1 -0
- package/dist/pending/store.d.ts +79 -0
- package/dist/pending/store.d.ts.map +1 -0
- package/dist/pending/store.js +293 -0
- package/dist/pending/store.js.map +1 -0
- package/dist/pending/types.d.ts +131 -0
- package/dist/pending/types.d.ts.map +1 -0
- package/dist/pending/types.js +60 -0
- package/dist/pending/types.js.map +1 -0
- package/dist/qa/brain_matrix/ab_runner.d.ts +44 -0
- package/dist/qa/brain_matrix/ab_runner.d.ts.map +1 -0
- package/dist/qa/brain_matrix/ab_runner.js +144 -0
- package/dist/qa/brain_matrix/ab_runner.js.map +1 -0
- package/dist/qa/brain_matrix/brains.json +80 -0
- package/dist/qa/brain_matrix/compare.d.ts +27 -0
- package/dist/qa/brain_matrix/compare.d.ts.map +1 -0
- package/dist/qa/brain_matrix/compare.js +122 -0
- package/dist/qa/brain_matrix/compare.js.map +1 -0
- package/dist/qa/brain_matrix/fake_brain.d.ts +36 -0
- package/dist/qa/brain_matrix/fake_brain.d.ts.map +1 -0
- package/dist/qa/brain_matrix/fake_brain.js +27 -0
- package/dist/qa/brain_matrix/fake_brain.js.map +1 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_intent.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_announce_no_speak_default.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_consecutive_announces.json +37 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_action.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_open.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_unlabeled_button.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_with_shortcut.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_agent_director_consults_workflow_before_dispatch.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_analyst_extracts_then_returns.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_announce_min_tool_calls.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_invoke_happy_path.json +65 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_no_invent_without_backend.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_app_schema_fail_recover.json +48 -0
- package/dist/qa/brain_matrix/fixtures/scenario_approval_modal_no_redundancy.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_args_redacted_in_audit.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_consumers_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_audit_log_on_destructive.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_brain_explains_after_invoke.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_byok_on_managed_brain_overflow.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_byok_required_policy.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_coder_consults_nac_spec_before_writing.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_concise_no_loop.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_consult_nac_spec_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_contradiction_rfp_cost.json +38 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_attachment_frontier.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_escalation_explicit.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_cost_router_idle_reset.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_csv_via_excel_read.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_override_shadcn.json +45 -0
- package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_use_card_template.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_destructive_no_text_confirm.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_diff_explains_changes.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_delegates_to_analyst.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_no_self_delegation.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_terminal_done_marker.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_after_unknown_intent.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_a11y.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_agent_orchestrator.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_byok_vs_managed.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_cost_router.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_default_design_system.json +50 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_g_doc.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_gates.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_language_sovereignty.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_lessons_workflow.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_mcp_lifecycle.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_nac3_attrs.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_office.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_pizarron.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_r8_modal.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_testing_policy.json +55 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_workflow_phases.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_yf_commands.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_explain_results.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_safety_refusals.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_verb_composition.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_eco_defers_complex.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_eco_short_query.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_list_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_no_secret_leak.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_env_secret_suppression_en.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_handles_csv_refusal.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_sheet_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_append_then_list.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_list_sheets_first.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_excel_sheet_named.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_explain_voice_yes.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_explains_forge_error.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_focus_after_modal_open.json +29 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_find_with_glob.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_mkdir_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_move_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_read_handles_missing.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_fs_stat_before_read.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_generated_app_nac3_default.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_branch_list_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_diff_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_log_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_pull_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_push_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_show_metadata_only.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_branch_combo.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_git_status_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_github_clone_repo_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_github_create_repo_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_id_format_in_reply.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_idempotent_adenda.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_query_history.json +29 -0
- package/dist/qa/brain_matrix/fixtures/scenario_iterations_tracker_acknowledge.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_handles_malformed.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_parse_intent_en.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_query_extract.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_json_stringify_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_set_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_keys_status_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_not_conducive_spa_python.json +61 -0
- package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_user_picks_python.json +48 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_complex_verb.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_doctrine_only_when_needed.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lazy_simple_verb.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lesson_recall_overrides.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_restart_app_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_run_app_intent_en.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_lifecycle_stop_app_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_long_doctrine_no_truncate.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_manifest_read_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_manual_open_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_bridge_unreachable_graceful.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_disabled_bridge_no_verbs.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_discover_tools_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invariant_1_no_verbs.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_destructive_pauses_for_r8.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_happy_path_writes_pizarron.json +76 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_network_timeout_graceful.json +41 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_two_hop.json +68 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_with_auth_loaded.json +76 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_revoked_token_graceful.json +33 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_intent.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_set_creds_no_token_arg.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_show_tools_before_invoke.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_toggle_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_multi_turn_clarify_then_act.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_attrs_doctrine.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_discover_schemas_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_nac3_required_attr_missing.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_bare_ok_after_destructive.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_global_learnings_no_recall.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_hardcoded_color_use_token.json +47 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_id_leak_in_reply.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_invent_verb.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_loop_after_repeated_fail.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_password_echo.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_all_current.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_npm_outdated_then_explain.json +35 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_read_intent.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_update_cell_picks_right_verb.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_write_required_args.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_overwrite_explicit.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_word_write_intent.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_panel_open_settings_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_panel_send_message_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pdf_read_intent.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_clear_tab_explicit_close.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_chart.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_for_long_table.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_read_tab_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_pizarron_render_not_inline.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_read_file.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_verb_over_shell.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_prefer_native_workflow_state.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_project_init_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_project_set_root_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_promote_lesson_after_correction.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_r8_destructive_shell_exec.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_read_then_parse_order.json +36 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_jump_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_bookmark_set_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_for_long_doc.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_list_docs_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_next_block_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_read_section_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_recap_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_reader_search_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_blanket_chmod_777.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_bypass_approval_modal.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_delete_critical_en.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_disable_vault_encryption.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_drop_database.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_force_push_main_en.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_leak_vault_en.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_modify_node_modules.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_skip_hooks_en.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_delete_critical.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_refuses_to_leak_vault.json +18 -0
- package/dist/qa/brain_matrix/fixtures/scenario_respects_global_learnings.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_respects_workflow_gate_g2.json +39 -0
- package/dist/qa/brain_matrix/fixtures/scenario_revoke_lesson_request.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_scaffolder_destructive_pauses_for_approval.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sq9b_deploy_checks_git_status.json +25 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sq9b_install_checks_node_version.json +25 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sq9b_publish_checks_gh_cli.json +25 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sq_rules_active.json +30 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sumie_icon_pick_from_catalog.json +56 -0
- package/dist/qa/brain_matrix/fixtures/scenario_tester_uses_shell_exec_only.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_text_diff_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_truncated_response_retry.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_unknown_command_clarify.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_compose.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_handles_invalid.json +27 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_intent_en.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_parse_then_inspect_query.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_url_then_stringify_order.json +34 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_just_greets.json +17 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_overrides_proceeds.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_user_revokes_in_middle.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_voice_open_pizarron.json +21 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_outline_extraction.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_overwrite_explicit.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_word_section_count.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_doctrine.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_done_specs.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_intent_capture.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_jump_block.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_phase_v_step_15.json +41 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_run_step_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_set_intent.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_injection.json +32 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_state_recovers_after_clarify.json +25 -0
- package/dist/qa/brain_matrix/fixtures/scenario_workflow_step_1_intake.json +24 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_command_doctrine.json +56 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_doctrine_list_intent.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_yf_qa_compare_intent.json +17 -0
- package/dist/qa/brain_matrix/invariants.d.ts +18 -0
- package/dist/qa/brain_matrix/invariants.d.ts.map +1 -0
- package/dist/qa/brain_matrix/invariants.js +333 -0
- package/dist/qa/brain_matrix/invariants.js.map +1 -0
- package/dist/qa/brain_matrix/report.d.ts +12 -0
- package/dist/qa/brain_matrix/report.d.ts.map +1 -0
- package/dist/qa/brain_matrix/report.js +131 -0
- package/dist/qa/brain_matrix/report.js.map +1 -0
- package/dist/qa/brain_matrix/runner.d.ts +31 -0
- package/dist/qa/brain_matrix/runner.d.ts.map +1 -0
- package/dist/qa/brain_matrix/runner.js +561 -0
- package/dist/qa/brain_matrix/runner.js.map +1 -0
- package/dist/qa/brain_matrix/types.d.ts +180 -0
- package/dist/qa/brain_matrix/types.d.ts.map +1 -0
- package/dist/qa/brain_matrix/types.js +2 -0
- package/dist/qa/brain_matrix/types.js.map +1 -0
- package/dist/qa/brain_matrix/validate_scenario.d.ts +23 -0
- package/dist/qa/brain_matrix/validate_scenario.d.ts.map +1 -0
- package/dist/qa/brain_matrix/validate_scenario.js +128 -0
- package/dist/qa/brain_matrix/validate_scenario.js.map +1 -0
- package/dist/reader/parsers/epub.d.ts.map +1 -1
- package/dist/reader/parsers/epub.js +6 -1
- package/dist/reader/parsers/epub.js.map +1 -1
- package/dist/relay/board_snapshot.d.ts +69 -0
- package/dist/relay/board_snapshot.d.ts.map +1 -0
- package/dist/relay/board_snapshot.js +149 -0
- package/dist/relay/board_snapshot.js.map +1 -0
- package/dist/relay/command_consumer.d.ts +91 -0
- package/dist/relay/command_consumer.d.ts.map +1 -0
- package/dist/relay/command_consumer.js +129 -0
- package/dist/relay/command_consumer.js.map +1 -0
- package/dist/relay/mock_relay.d.ts +34 -0
- package/dist/relay/mock_relay.d.ts.map +1 -0
- package/dist/relay/mock_relay.js +93 -0
- package/dist/relay/mock_relay.js.map +1 -0
- package/dist/relay/relay_client.d.ts +28 -0
- package/dist/relay/relay_client.d.ts.map +1 -0
- package/dist/relay/relay_client.js +80 -0
- package/dist/relay/relay_client.js.map +1 -0
- package/dist/relay/relay_publisher.d.ts +59 -0
- package/dist/relay/relay_publisher.d.ts.map +1 -0
- package/dist/relay/relay_publisher.js +101 -0
- package/dist/relay/relay_publisher.js.map +1 -0
- package/dist/relay/types.d.ts +54 -0
- package/dist/relay/types.d.ts.map +1 -0
- package/dist/relay/types.js +8 -0
- package/dist/relay/types.js.map +1 -0
- package/dist/semantic_graph/ast_extract.d.ts +20 -0
- package/dist/semantic_graph/ast_extract.d.ts.map +1 -0
- package/dist/semantic_graph/ast_extract.js +208 -0
- package/dist/semantic_graph/ast_extract.js.map +1 -0
- package/dist/semantic_graph/derive.d.ts +48 -0
- package/dist/semantic_graph/derive.d.ts.map +1 -0
- package/dist/semantic_graph/derive.js +604 -0
- package/dist/semantic_graph/derive.js.map +1 -0
- package/dist/semantic_graph/llm_claim.d.ts +21 -0
- package/dist/semantic_graph/llm_claim.d.ts.map +1 -0
- package/dist/semantic_graph/llm_claim.js +164 -0
- package/dist/semantic_graph/llm_claim.js.map +1 -0
- package/dist/semantic_graph/npm_enrich.d.ts +49 -0
- package/dist/semantic_graph/npm_enrich.d.ts.map +1 -0
- package/dist/semantic_graph/npm_enrich.js +173 -0
- package/dist/semantic_graph/npm_enrich.js.map +1 -0
- package/dist/semantic_graph/render.d.ts +28 -0
- package/dist/semantic_graph/render.d.ts.map +1 -0
- package/dist/semantic_graph/render.js +70 -0
- package/dist/semantic_graph/render.js.map +1 -0
- package/dist/semantic_graph/store.d.ts +53 -0
- package/dist/semantic_graph/store.d.ts.map +1 -0
- package/dist/semantic_graph/store.js +382 -0
- package/dist/semantic_graph/store.js.map +1 -0
- package/dist/semantic_graph/types.d.ts +59 -0
- package/dist/semantic_graph/types.d.ts.map +1 -0
- package/dist/semantic_graph/types.js +17 -0
- package/dist/semantic_graph/types.js.map +1 -0
- package/dist/support/github_dispatcher.d.ts +36 -0
- package/dist/support/github_dispatcher.d.ts.map +1 -0
- package/dist/support/github_dispatcher.js +320 -0
- package/dist/support/github_dispatcher.js.map +1 -0
- package/dist/support/reports.d.ts +31 -0
- package/dist/support/reports.d.ts.map +1 -0
- package/dist/support/reports.js +162 -0
- package/dist/support/reports.js.map +1 -0
- package/dist/tasks/supervisor.d.ts +88 -0
- package/dist/tasks/supervisor.d.ts.map +1 -0
- package/dist/tasks/supervisor.js +308 -0
- package/dist/tasks/supervisor.js.map +1 -0
- package/dist/tasks/task_type.d.ts +11 -0
- package/dist/tasks/task_type.d.ts.map +1 -0
- package/dist/tasks/task_type.js +21 -0
- package/dist/tasks/task_type.js.map +1 -0
- package/dist/telemetry/usage.d.ts +67 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +208 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/dist/test_agent/gemini_user.d.ts +9 -0
- package/dist/test_agent/gemini_user.d.ts.map +1 -0
- package/dist/test_agent/gemini_user.js +58 -0
- package/dist/test_agent/gemini_user.js.map +1 -0
- package/dist/test_agent/profiles.d.ts +23 -0
- package/dist/test_agent/profiles.d.ts.map +1 -0
- package/dist/test_agent/profiles.js +117 -0
- package/dist/test_agent/profiles.js.map +1 -0
- package/dist/test_agent/runner.d.ts +56 -0
- package/dist/test_agent/runner.d.ts.map +1 -0
- package/dist/test_agent/runner.js +134 -0
- package/dist/test_agent/runner.js.map +1 -0
- package/dist/test_agent/target_http.d.ts +22 -0
- package/dist/test_agent/target_http.d.ts.map +1 -0
- package/dist/test_agent/target_http.js +51 -0
- package/dist/test_agent/target_http.js.map +1 -0
- package/dist/test_agent/types.d.ts +117 -0
- package/dist/test_agent/types.d.ts.map +1 -0
- package/dist/test_agent/types.js +22 -0
- package/dist/test_agent/types.js.map +1 -0
- package/dist/vault/store.d.ts.map +1 -1
- package/dist/vault/store.js +20 -2
- package/dist/vault/store.js.map +1 -1
- package/dist/version.d.ts +3 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -5
- package/dist/version.js.map +1 -1
- package/dist/voice/config.d.ts +12 -0
- package/dist/voice/config.d.ts.map +1 -1
- package/dist/voice/config.js +25 -2
- package/dist/voice/config.js.map +1 -1
- package/dist/voice/providers/google.d.ts +9 -0
- package/dist/voice/providers/google.d.ts.map +1 -1
- package/dist/voice/providers/google.js +158 -30
- package/dist/voice/providers/google.js.map +1 -1
- package/dist/voice/router.d.ts +10 -0
- package/dist/voice/router.d.ts.map +1 -1
- package/dist/voice/router.js +39 -20
- package/dist/voice/router.js.map +1 -1
- package/dist/voice/types.d.ts +5 -2
- package/dist/voice/types.d.ts.map +1 -1
- package/dist/voice/types.js.map +1 -1
- package/dist/wiring/discover.d.ts +14 -0
- package/dist/wiring/discover.d.ts.map +1 -0
- package/dist/wiring/discover.js +383 -0
- package/dist/wiring/discover.js.map +1 -0
- package/dist/wiring/store.d.ts +19 -0
- package/dist/wiring/store.d.ts.map +1 -0
- package/dist/wiring/store.js +182 -0
- package/dist/wiring/store.js.map +1 -0
- package/dist/wiring/types.d.ts +61 -0
- package/dist/wiring/types.d.ts.map +1 -0
- package/dist/wiring/types.js +36 -0
- package/dist/wiring/types.js.map +1 -0
- package/dist/workflow/config.d.ts +43 -0
- package/dist/workflow/config.d.ts.map +1 -0
- package/dist/workflow/config.js +199 -0
- package/dist/workflow/config.js.map +1 -0
- package/dist/workflow/definitions.d.ts +60 -0
- package/dist/workflow/definitions.d.ts.map +1 -0
- package/dist/workflow/definitions.js +178 -0
- package/dist/workflow/definitions.js.map +1 -0
- package/dist/workflow/definitions_client.d.ts +12 -0
- package/dist/workflow/definitions_client.d.ts.map +1 -0
- package/dist/workflow/definitions_client.js +81 -0
- package/dist/workflow/definitions_client.js.map +1 -0
- package/dist/workflow/evolution.d.ts +10 -0
- package/dist/workflow/evolution.d.ts.map +1 -0
- package/dist/workflow/evolution.js +62 -0
- package/dist/workflow/evolution.js.map +1 -0
- package/dist/workflow/graph.d.ts +59 -0
- package/dist/workflow/graph.d.ts.map +1 -0
- package/dist/workflow/graph.js +137 -0
- package/dist/workflow/graph.js.map +1 -0
- package/dist/workflow/instances.d.ts +40 -0
- package/dist/workflow/instances.d.ts.map +1 -0
- package/dist/workflow/instances.js +122 -0
- package/dist/workflow/instances.js.map +1 -0
- package/dist/workflow/multi_view.d.ts +27 -0
- package/dist/workflow/multi_view.d.ts.map +1 -0
- package/dist/workflow/multi_view.js +76 -0
- package/dist/workflow/multi_view.js.map +1 -0
- package/dist/workflow/orchestrator.d.ts +111 -0
- package/dist/workflow/orchestrator.d.ts.map +1 -0
- package/dist/workflow/orchestrator.js +241 -0
- package/dist/workflow/orchestrator.js.map +1 -0
- package/dist/workflow/phase_inference.d.ts +56 -0
- package/dist/workflow/phase_inference.d.ts.map +1 -0
- package/dist/workflow/phase_inference.js +107 -0
- package/dist/workflow/phase_inference.js.map +1 -0
- package/dist/workflow/select.d.ts +28 -0
- package/dist/workflow/select.d.ts.map +1 -0
- package/dist/workflow/select.js +38 -0
- package/dist/workflow/select.js.map +1 -0
- package/dist/workflow/state.d.ts +290 -0
- package/dist/workflow/state.d.ts.map +1 -0
- package/dist/workflow/state.js +213 -0
- package/dist/workflow/state.js.map +1 -0
- package/dist/workflow/view.d.ts +47 -0
- package/dist/workflow/view.d.ts.map +1 -0
- package/dist/workflow/view.js +103 -0
- package/dist/workflow/view.js.map +1 -0
- package/docs/SQ.md +1397 -0
- package/docs/SQ_BY_STEP.yaml +147 -0
- package/docs/doctrine/accessibility.md +78 -0
- package/docs/doctrine/agent-orchestrator.md +76 -0
- package/docs/doctrine/byok-vs-managed.md +81 -0
- package/docs/doctrine/cost-router-escalation.md +103 -0
- package/docs/doctrine/default-design-system.md +152 -0
- package/docs/doctrine/explain-results.md +90 -0
- package/docs/doctrine/expo-eas-builds.md +177 -0
- package/docs/doctrine/g-doc.md +46 -0
- package/docs/doctrine/gates.md +21 -0
- package/docs/doctrine/language-sovereignty.md +143 -0
- package/docs/doctrine/lessons-workflow.md +68 -0
- package/docs/doctrine/mcp-bridge-lifecycle.md +75 -0
- package/docs/doctrine/nac3-attrs.md +23 -0
- package/docs/doctrine/office-tools.md +122 -0
- package/docs/doctrine/pizarron.md +52 -0
- package/docs/doctrine/r8-modal.md +60 -0
- package/docs/doctrine/safety-refusals.md +73 -0
- package/docs/doctrine/testing-policy.md +211 -0
- package/docs/doctrine/verb-composition.md +84 -0
- package/docs/doctrine/verification-honesty.md +95 -0
- package/docs/doctrine/workflow-kinds.md +69 -0
- package/docs/doctrine/workflow-phases.md +108 -0
- package/docs/doctrine/workflow.md +66 -0
- package/docs/doctrine/yf-commands.md +49 -0
- package/package.json +20 -3
- package/src/i18n/catalogs/ar.json +223 -86
- package/src/i18n/catalogs/de.json +223 -86
- package/src/i18n/catalogs/en.json +223 -86
- package/src/i18n/catalogs/es.json +223 -86
- package/src/i18n/catalogs/fr.json +223 -86
- package/src/i18n/catalogs/hi.json +223 -86
- package/src/i18n/catalogs/it.json +223 -86
- package/src/i18n/catalogs/ja.json +223 -86
- package/src/i18n/catalogs/pt.json +223 -86
- package/src/i18n/catalogs/zh.json +223 -86
- package/templates/nextjs-app/README.md +48 -0
- package/templates/nextjs-app/next.config.js +8 -0
- package/templates/nextjs-app/package.json +33 -0
- package/templates/nextjs-app/src/app/globals.css +43 -0
- package/templates/nextjs-app/src/app/layout.tsx +29 -0
- package/templates/nextjs-app/src/app/page.tsx +63 -0
- package/templates/nextjs-app/src/nac/manifest.ts +36 -0
- package/templates/nextjs-app/tsconfig.json +21 -0
- package/templates/nextjs-app/yujin.forge.json +11 -0
- package/templates/sumi-context.template.md +57 -0
package/docs/SQ.md
ADDED
|
@@ -0,0 +1,1397 @@
|
|
|
1
|
+
# Yujin Forge -- Estandares de Calidad (SQ)
|
|
2
|
+
|
|
3
|
+
> **Lectura obligatoria antes de tocar codigo en cualquier
|
|
4
|
+
> proyecto Yujin.** Aplica a Sumi (Claude assistant), a
|
|
5
|
+
> cualquier colaborador humano, y a cualquier herramienta
|
|
6
|
+
> automatizada del pipeline. La violacion de cualquier seccion
|
|
7
|
+
> es bug critico, no preferencia.
|
|
8
|
+
|
|
9
|
+
> Este documento consolida las normas de calidad y entregables
|
|
10
|
+
> de Yujin Forge. Se sintetiza con `PROJECT.md` (gobernanza +
|
|
11
|
+
> topologia). En caso de conflicto, **este documento prevalece
|
|
12
|
+
> sobre cualquier otra preferencia de estilo o conveniencia**.
|
|
13
|
+
|
|
14
|
+
> Ultima revision: 2026-05-25 (post-bug SyntaxError del panel +
|
|
15
|
+
> incorporacion de la regla Pablo-time + agregado de
|
|
16
|
+
> volumetrias + stateless + 4 manuales obligatorios).
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 0. Principios fundamentales
|
|
21
|
+
|
|
22
|
+
### 0.1 El tiempo de Pablo es para juicio, no para reproducir bugs
|
|
23
|
+
|
|
24
|
+
Los humanos tienen tiempo de vida finito. Spending Pablo's
|
|
25
|
+
hours on basic bugs (syntax errors, broken buttons, 404s,
|
|
26
|
+
missing imports, modals que no abren, files que no cargan,
|
|
27
|
+
console errors al cargar) es un debito permanente contra su
|
|
28
|
+
budget de vida. **No es recuperable.**
|
|
29
|
+
|
|
30
|
+
Sumi y CI cazan los bugs basicos ANTES de que Pablo los vea.
|
|
31
|
+
Cuando Pablo evalua, evalua decisiones de **alta complejidad
|
|
32
|
+
funcional**: "esta voz suena bien para el usuario ADIP?",
|
|
33
|
+
"esta extraccion perdio contexto?", "este flujo UX se siente
|
|
34
|
+
intuitivo?", "el aleman lee rigido?". Esas son preguntas que
|
|
35
|
+
solo el puede contestar. Para esas estan las horas de Pablo,
|
|
36
|
+
no para clickear botones que tendrian que andar.
|
|
37
|
+
|
|
38
|
+
**Esta es la regla mas importante del documento.** Todo lo
|
|
39
|
+
demas se deriva de ella.
|
|
40
|
+
|
|
41
|
+
### 0.2 Cero fallback al codigo legacy del mismo sistema
|
|
42
|
+
|
|
43
|
+
Si el codigo primario falla, se ARREGLA. **No** se desvia al
|
|
44
|
+
renderer / handler / rutina obsoleta del mismo sistema. El
|
|
45
|
+
patron `if (newFn) {...} else { legacyFn() }` esta prohibido
|
|
46
|
+
cuando ambas vias pertenecen al mismo codebase.
|
|
47
|
+
|
|
48
|
+
Fallback **legitimo** (NO bloqueado por esta regla):
|
|
49
|
+
- Multi-region failover (us-east-1 → eu-west-1).
|
|
50
|
+
- Multi-provider (SES → SendGrid, Anthropic Claude → Bedrock
|
|
51
|
+
cuando rate-limited).
|
|
52
|
+
- Schema gates idempotentes (table missing → skip silencioso
|
|
53
|
+
con warning + return).
|
|
54
|
+
- Cache miss (APCu vacio → DB query).
|
|
55
|
+
- Locale i18n (es missing → en → first available).
|
|
56
|
+
|
|
57
|
+
Cualquier otro fallback es regression disfrazada.
|
|
58
|
+
|
|
59
|
+
### 0.3 Cero dano silencioso
|
|
60
|
+
|
|
61
|
+
Cuando el sistema no puede satisfacer un request (ambiguo, no
|
|
62
|
+
encontrado, bloqueado, gate fallo), **debe** throw o devolver
|
|
63
|
+
`is_error: true` con un mensaje estructurado nombrando el
|
|
64
|
+
remedio. **NO** debe adivinar + degradar + esperar.
|
|
65
|
+
|
|
66
|
+
### 0.4 Calidad industrial
|
|
67
|
+
|
|
68
|
+
Naming claro. Errores estructurados. Provenance emitida (trace
|
|
69
|
+
en pizarra para chat tools, audit log para acciones en DB).
|
|
70
|
+
Docs sincronizadas. Nada hardcoded que pertenezca a un catalogo.
|
|
71
|
+
Nada que un reviewer pueda llamar atajo.
|
|
72
|
+
|
|
73
|
+
### 0.5 Agnostico por default
|
|
74
|
+
|
|
75
|
+
Los layers del sistema saben de primitivas (formatos de
|
|
76
|
+
documento, providers de voz, tool_use de Claude, file
|
|
77
|
+
scaffolding, schemas de manifest NAC3). Saben **nada** de
|
|
78
|
+
ninguna app especifica. Logica especifica de aplicacion vive
|
|
79
|
+
en templates, manifests, plugins, decorators — nunca en el
|
|
80
|
+
runtime.
|
|
81
|
+
|
|
82
|
+
### 0.6 Definicion de "proyecto Yujin"
|
|
83
|
+
|
|
84
|
+
**Un proyecto Yujin es CUALQUIER codebase tocado por Forge**,
|
|
85
|
+
en cualquiera de estas dos modalidades:
|
|
86
|
+
|
|
87
|
+
1. **Proyectos nuevos** creados por Forge:
|
|
88
|
+
- `yf new <slug>` -- scaffold inicial desde template.
|
|
89
|
+
- `yf migrate ... --ai-silent` que produce un decorated output.
|
|
90
|
+
- Scaffold generado por el spec ingest pipeline
|
|
91
|
+
(bloque 4.5: drag-drop spec -> Claude extract -> plan ->
|
|
92
|
+
approve -> escribir archivos).
|
|
93
|
+
- Cualquier proyecto que arranque su vida desde Forge.
|
|
94
|
+
|
|
95
|
+
2. **Proyectos existentes** modificados por Forge:
|
|
96
|
+
- `yf migrate <existing-repo>` con o sin `--apply`.
|
|
97
|
+
- File edits via chat panel + tool dispatches
|
|
98
|
+
(forge.git_commit, forge.run_app, etc).
|
|
99
|
+
- Decoration que Forge inyecta en una app pre-existente.
|
|
100
|
+
- Cualquier commit que tenga "Co-Authored-By: Forge" o
|
|
101
|
+
equivalente.
|
|
102
|
+
|
|
103
|
+
**No hay opt-out.** Si Forge toco el proyecto, **el proyecto
|
|
104
|
+
es Yujin y queda sujeto a este SQ**.
|
|
105
|
+
|
|
106
|
+
Esto vale tanto para apps propias (CRM Yujin, conduit,
|
|
107
|
+
yujin.app) como para apps de adopters (ADIP, third-party).
|
|
108
|
+
Si quieren que Forge ayude, aceptan el SQ.
|
|
109
|
+
|
|
110
|
+
### 0.7 Componentes obligatorios en TODO proyecto Yujin
|
|
111
|
+
|
|
112
|
+
Todo proyecto Yujin (segun sec 0.6) **debe** incluir:
|
|
113
|
+
|
|
114
|
+
1. **NAC-3 decoration** al nivel apropiado para el target
|
|
115
|
+
(HTML estatico, React app, Vue app, Vanilla JS). Cada
|
|
116
|
+
elemento interactivo carga `data-nac-id` + `data-nac-role`
|
|
117
|
+
+ `data-nac-action` segun el contrato NAC-3.
|
|
118
|
+
|
|
119
|
+
2. **Yujin Pilot embebido -- OBLIGATORIO**, no opcional.
|
|
120
|
+
Pilot es el chat + voice cockpit multi-modelo que drives
|
|
121
|
+
la app desde lenguaje natural. La razon de la
|
|
122
|
+
obligatoriedad:
|
|
123
|
+
|
|
124
|
+
- Sin Pilot, el end-user no tiene como hablarle a la app
|
|
125
|
+
decorada con NAC-3 -- los hooks existen pero nadie los
|
|
126
|
+
invoca.
|
|
127
|
+
- Pilot es lo que convierte "una app decorada" en "una
|
|
128
|
+
app Yujin" desde el punto de vista del usuario final.
|
|
129
|
+
- Pilot impone una experiencia consistente cross-product
|
|
130
|
+
(mismo modal, mismas opciones de provider, misma
|
|
131
|
+
pizarra de trace).
|
|
132
|
+
- Pilot es la unica via reconocida para inyectar la
|
|
133
|
+
dispatcher de NAC-3 disambiguation con el modelo cheap-
|
|
134
|
+
fast (ver memoria `nac3-disambiguation-model-split`).
|
|
135
|
+
|
|
136
|
+
No se acepta "el cliente no quiere Pilot". Si el cliente
|
|
137
|
+
no quiere Pilot, no es proyecto Yujin -- Forge no lo
|
|
138
|
+
toca. Esa conversacion va a Pablo, no al desarrollador
|
|
139
|
+
que arma el proyecto.
|
|
140
|
+
|
|
141
|
+
La inyeccion de Pilot la hace `yf migrate --with-pilot`
|
|
142
|
+
automaticamente, o `yf pilot install <dir>` explicito.
|
|
143
|
+
El test de aceptacion del proyecto verifica que Pilot
|
|
144
|
+
carga + dispatch llega + provider keys persisten
|
|
145
|
+
(cubierto por la suite visual del proyecto, sec 2.2).
|
|
146
|
+
|
|
147
|
+
3. **10 idiomas canonicos NAC3** en strings user-facing
|
|
148
|
+
(ver sec 2.6).
|
|
149
|
+
|
|
150
|
+
4. **Los 4 manuales** del sec 3 (INFRASTRUCTURE,
|
|
151
|
+
ARCHITECTURE, USER_MANUAL, MAINTENANCE_MANUAL).
|
|
152
|
+
|
|
153
|
+
5. **Tests de cobertura visual al 100%** (sec 2.2).
|
|
154
|
+
|
|
155
|
+
6. **Pre-development checklist completo** (sec 4) antes de
|
|
156
|
+
cualquier modificacion.
|
|
157
|
+
|
|
158
|
+
La ausencia de cualquiera de estos 6 componentes es bug
|
|
159
|
+
critico del proyecto, no preferencia. Forge debe negarse a
|
|
160
|
+
shipping un proyecto Yujin con componentes faltantes.
|
|
161
|
+
|
|
162
|
+
### 0.8 Dual mode de comunicacion: didactico vs tecnico
|
|
163
|
+
|
|
164
|
+
Forge expone sus consultas, ronda de clarificacion y
|
|
165
|
+
resultados en **dos modos**, configurables por proyecto y
|
|
166
|
+
cambiables en runtime:
|
|
167
|
+
|
|
168
|
+
**(a) Modo didactico (default para usuarios no-dev):**
|
|
169
|
+
|
|
170
|
+
- Exposicion **minima** de datos tecnicos (no stack traces,
|
|
171
|
+
no nombres de archivos / lineas, no jerga JS / SQL).
|
|
172
|
+
- **Mayor autonomia**: Forge decide los detalles tecnicos
|
|
173
|
+
internos por su cuenta y solo consulta al usuario lo
|
|
174
|
+
estrictamente necesario para entender que quiere lograr.
|
|
175
|
+
- Consultas siempre en lenguaje natural orientado a
|
|
176
|
+
resultados ("cuantos usuarios al mismo tiempo?", no
|
|
177
|
+
"concurrent connections cap?").
|
|
178
|
+
- Mensajes de progreso: "ya generamos el formulario de
|
|
179
|
+
registro", no "wrote `app/register.tsx` (42 lines)".
|
|
180
|
+
- Errores presentados como acciones: "no pude leer este PDF.
|
|
181
|
+
Probemos con otro archivo?", no "ParseError at line 87".
|
|
182
|
+
|
|
183
|
+
**(b) Modo tecnico (para programadores avanzados):**
|
|
184
|
+
|
|
185
|
+
- Exposicion **completa**: archivos tocados, lineas
|
|
186
|
+
modificadas, tool calls disparados, latencias, tokens, etc.
|
|
187
|
+
- **Involucra al usuario** en las decisiones tecnicas:
|
|
188
|
+
"elegimos Postgres o SQLite para este target? Costos vs
|
|
189
|
+
portabilidad..."
|
|
190
|
+
- Surface diffs antes de aplicar; pide confirmacion para
|
|
191
|
+
cambios irreversibles.
|
|
192
|
+
- Stack traces visibles; errores con error_id + request_id.
|
|
193
|
+
- Mensajes de progreso con metadata: "scaffolded
|
|
194
|
+
`app/register.tsx`, 42 lines, 3 components".
|
|
195
|
+
|
|
196
|
+
**Activacion:**
|
|
197
|
+
|
|
198
|
+
1. Per-proyecto: `yujin.forge.json` lleva `"mode":
|
|
199
|
+
"didactico" | "tecnico"`. Default: `"didactico"`.
|
|
200
|
+
2. Runtime via chat: comando `/modo didactico` o
|
|
201
|
+
`/modo tecnico` (alias EN: `/mode didactic`,
|
|
202
|
+
`/mode technical`). Se persiste en `yujin.forge.json`.
|
|
203
|
+
3. Runtime via CLI: `yf chat --mode didactico|tecnico` o
|
|
204
|
+
variable de entorno `YF_MODE=tecnico`.
|
|
205
|
+
|
|
206
|
+
**Contrato:** ambos modos respetan la misma arquitectura
|
|
207
|
+
(stateless, multi-tenant, etc). El cambio de modo afecta
|
|
208
|
+
**solo la capa de presentacion + el nivel de consulta**, no
|
|
209
|
+
los outputs funcionales.
|
|
210
|
+
|
|
211
|
+
**Implementacion (referencia):** el server inyecta `mode` en
|
|
212
|
+
el system prompt del LLM + el panel UI consulta `mode` para
|
|
213
|
+
decidir si renderiza diffs / stack traces / tool latencias.
|
|
214
|
+
Cambiar el modo NO requiere recargar -- el siguiente turno
|
|
215
|
+
ya usa el modo nuevo.
|
|
216
|
+
|
|
217
|
+
### 0.9 Test Playwright -- aprobacion visual explicita
|
|
218
|
+
|
|
219
|
+
El test visual de un proyecto Yujin debe **mostrar todas las
|
|
220
|
+
pantallas aplicativas al usuario** y exigir su OK explicito
|
|
221
|
+
o registro de pedidos de modificacion. No es suficiente que
|
|
222
|
+
los tests pasen verdes en CI; el usuario tiene que **ver**
|
|
223
|
+
cada pantalla.
|
|
224
|
+
|
|
225
|
+
Flujo obligatorio:
|
|
226
|
+
|
|
227
|
+
1. La suite Playwright captura screenshot de **cada pantalla
|
|
228
|
+
aplicativa** del proyecto (entry, hub, list views, detail
|
|
229
|
+
views, modals, forms, error states) bajo
|
|
230
|
+
`tests/visual/evidence/<scenario>/<lang>/<browser>.png`.
|
|
231
|
+
|
|
232
|
+
2. Forge expone un comando `yf review-screens` que renderiza
|
|
233
|
+
una galeria local con todas las screenshots organizadas
|
|
234
|
+
por flow + idioma + breakpoint. El usuario navega y marca
|
|
235
|
+
cada una con:
|
|
236
|
+
- **OK explicito** (verde) - se promueve a baseline.
|
|
237
|
+
- **Pedido de modificacion** (rojo) - se registra el
|
|
238
|
+
comentario; Forge abre un issue / task para el ajuste.
|
|
239
|
+
- **No revisado** (amarillo) - bloquea release.
|
|
240
|
+
|
|
241
|
+
3. **Gate**: no hay release si quedan screenshots "no
|
|
242
|
+
revisadas" o "pedido de modificacion sin resolver".
|
|
243
|
+
|
|
244
|
+
4. La galeria opera en ambos modos (sec 0.8): didactico
|
|
245
|
+
muestra solo la imagen + boton OK / pedir cambio; tecnico
|
|
246
|
+
incluye selector breakpoint + lang + browser + diff vs
|
|
247
|
+
baseline.
|
|
248
|
+
|
|
249
|
+
Esto vive como capa SOBRE la regresion visual (sec 6) -- la
|
|
250
|
+
regresion garantiza que no hay drift entre runs; este punto
|
|
251
|
+
garantiza que el usuario aprobo la version actual al menos
|
|
252
|
+
una vez.
|
|
253
|
+
|
|
254
|
+
### 0.10 Consulta de target: desktop+mobile vs mobile-pure
|
|
255
|
+
|
|
256
|
+
En el pre-development checklist (sec 4), Forge **debe**
|
|
257
|
+
preguntar al usuario:
|
|
258
|
+
|
|
259
|
+
- **Target**: ¿la app es desktop compatible con mobile
|
|
260
|
+
(responsive web) o **solo mobile** (RN/PWA mobile-only)?
|
|
261
|
+
- **Set de funcionalidades por target**: si la respuesta es
|
|
262
|
+
"ambos", consultar que features estan solo en desktop, solo
|
|
263
|
+
en mobile, o cross. Esto es input al `spec.plan` -- afecta
|
|
264
|
+
scaffolding, layout patterns, voice loop strategy, ingest
|
|
265
|
+
flows, etc.
|
|
266
|
+
|
|
267
|
+
La respuesta queda escrita en `yujin.forge.json`:
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"target": "responsive" | "mobile-only" | "desktop-only",
|
|
272
|
+
"feature_split": {
|
|
273
|
+
"desktop_only": ["bulk-edit", "csv-export"],
|
|
274
|
+
"mobile_only": ["geolocation", "camera-ingest"],
|
|
275
|
+
"shared": ["..."]
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Esta consulta es **obligatoria** porque cambia:
|
|
281
|
+
|
|
282
|
+
- El template scaffold (web/Expo/PWA).
|
|
283
|
+
- Los componentes NAC3 disponibles (algunos primitives no
|
|
284
|
+
tienen contraparte mobile sin refactor).
|
|
285
|
+
- Las queries de spec.extract (un "lista de clientes" en
|
|
286
|
+
desktop tiene paginacion + bulk; en mobile es scroll
|
|
287
|
+
infinito + swipe).
|
|
288
|
+
- Los manuales (USER_MANUAL adapta screenshots y flujos por
|
|
289
|
+
target).
|
|
290
|
+
- La estrategia de voice loop (mobile prefiere on-device
|
|
291
|
+
STT por latencia / privacy).
|
|
292
|
+
|
|
293
|
+
Mode-didactico (sec 0.8) presenta la pregunta como:
|
|
294
|
+
"¿queres que la gente la use en su computadora, en su
|
|
295
|
+
celular, o en los dos?"
|
|
296
|
+
|
|
297
|
+
Mode-tecnico la presenta como: "target: responsive (web
|
|
298
|
+
desktop + mobile breakpoints) vs mobile-only (Expo RN
|
|
299
|
+
single-target) vs desktop-only (Electron / web only). Feature
|
|
300
|
+
split JSON?"
|
|
301
|
+
|
|
302
|
+
### 0.11 Autonomia operacional via vault de credenciales
|
|
303
|
+
|
|
304
|
+
Forge debe poder ejecutar el ciclo completo
|
|
305
|
+
**analisis -> desarrollo -> commit -> push -> publish ->
|
|
306
|
+
ejecucion** sin exponer claves al usuario ni a los logs.
|
|
307
|
+
|
|
308
|
+
Esto requiere:
|
|
309
|
+
|
|
310
|
+
1. **Mecanismo unificado de ingreso de credenciales al
|
|
311
|
+
vault.** Slots tipados, ABM completo, encrypted at rest
|
|
312
|
+
(AES-256-GCM), con UI en chat y CLI:
|
|
313
|
+
|
|
314
|
+
- **Repositorios git**: GitHub PAT (`github_token`),
|
|
315
|
+
GitLab token (`gitlab_token`), Bitbucket app password
|
|
316
|
+
(`bitbucket_token`), generic ssh key (`ssh_key`).
|
|
317
|
+
- **Registries**: npm (`npm_token`), pypi
|
|
318
|
+
(`pypi_token`), maven (`maven_token`),
|
|
319
|
+
docker (`docker_token`), homebrew (`homebrew_token`).
|
|
320
|
+
- **AI providers**: Anthropic (`anthropic`), OpenAI
|
|
321
|
+
(`openai`), Google (`google_voice`), ElevenLabs
|
|
322
|
+
(`elevenlabs`), Whisper API si separado.
|
|
323
|
+
- **Cloud**: AWS access key + secret (`aws_access_key_id`,
|
|
324
|
+
`aws_secret_access_key`), GCP service account JSON
|
|
325
|
+
(`gcp_service_account`), Azure SP
|
|
326
|
+
(`azure_service_principal`).
|
|
327
|
+
- **App-specific** (apps relacionadas al proyecto):
|
|
328
|
+
Slack bot (`slack_bot_token`), Discord
|
|
329
|
+
(`discord_bot_token`), Twilio (`twilio_*`), Stripe
|
|
330
|
+
(`stripe_*`), Sendgrid (`sendgrid_*`), Mailgun
|
|
331
|
+
(`mailgun_*`), Linear (`linear_token`), Notion
|
|
332
|
+
(`notion_token`), Figma (`figma_token`).
|
|
333
|
+
- **Custom**: cualquier slot definido por el proyecto en
|
|
334
|
+
`yujin.forge.json::vault_slots[]`.
|
|
335
|
+
|
|
336
|
+
2. **API contract**:
|
|
337
|
+
|
|
338
|
+
- `POST /api/vault/keys { name, value, kind?, expiry? }`
|
|
339
|
+
- `kind` = `repo | registry | ai | cloud | app | custom`
|
|
340
|
+
- `expiry` opcional, dispara rotacion alert.
|
|
341
|
+
- `GET /api/vault/keys` -> lista slots con
|
|
342
|
+
`value_preview: '****abcd'`, NUNCA el raw.
|
|
343
|
+
- `DELETE /api/vault/keys/{name}`.
|
|
344
|
+
- `POST /api/vault/test/{name}` -> prueba la credencial
|
|
345
|
+
contra el servicio (e.g. para `github_token`, hace
|
|
346
|
+
`GET https://api.github.com/user` y devuelve si
|
|
347
|
+
responde 200).
|
|
348
|
+
|
|
349
|
+
3. **Inyeccion sin exposicion al usuario**:
|
|
350
|
+
|
|
351
|
+
Forge consume credenciales **server-side only**. Reglas:
|
|
352
|
+
|
|
353
|
+
- Comandos shell ejecutados por Forge **nunca** ven la
|
|
354
|
+
credencial en el comando (ni en logs ni en history del
|
|
355
|
+
shell). Se inyectan via `env: { GITHUB_TOKEN: ... }` en
|
|
356
|
+
el `spawn()`, no como argv.
|
|
357
|
+
- Tool calls de Claude **nunca** reciben el valor raw.
|
|
358
|
+
Reciben referencias (`{ vault_ref: "github_token" }`).
|
|
359
|
+
El servidor resuelve la ref al momento de invocar la
|
|
360
|
+
API externa.
|
|
361
|
+
- Mensajes al usuario en chat **redactan** secretos
|
|
362
|
+
pegados accidentalmente. Si un texto contiene un
|
|
363
|
+
pattern de token conocido (`ghp_*`, `sk-ant-*`, etc),
|
|
364
|
+
se reemplaza por `****redacted****` antes de mostrar.
|
|
365
|
+
- Logs server-side aplican la misma redaccion.
|
|
366
|
+
|
|
367
|
+
4. **Lifecycle completo autonomo (escenarios soportados):**
|
|
368
|
+
|
|
369
|
+
- **Inicializar repo nuevo**: GitHub repo create + first
|
|
370
|
+
commit + push, usando `github_token` del vault.
|
|
371
|
+
- **Commit + push**: cualquier momento, usando
|
|
372
|
+
`github_token` (no SSH key del user que pueda no estar).
|
|
373
|
+
- **Publicar a npm**: `npm publish --tag X` con
|
|
374
|
+
`npm_token` inyectado via `NPM_TOKEN` env.
|
|
375
|
+
- **Publicar imagen Docker**: `docker push` con
|
|
376
|
+
`docker_token`.
|
|
377
|
+
- **Ejecutar la app en el cloud**: deploy a AWS / GCP /
|
|
378
|
+
Azure con la credencial cloud correspondiente.
|
|
379
|
+
- **Llamar APIs externas durante runtime**: cualquier
|
|
380
|
+
tool call que requiera un secret lo resuelve via
|
|
381
|
+
vault sin pasar por el modelo Claude.
|
|
382
|
+
|
|
383
|
+
5. **Audit trail**:
|
|
384
|
+
|
|
385
|
+
Cada uso de una credencial genera una linea en
|
|
386
|
+
`vault.audit.log` (encrypted, append-only) con:
|
|
387
|
+
`{ ts, slot_name, op, request_id, success }`. El
|
|
388
|
+
contenido del valor NO se loggea. La intencion es que el
|
|
389
|
+
user pueda auditar **que credenciales se usaron y cuando**
|
|
390
|
+
sin exponer el valor.
|
|
391
|
+
|
|
392
|
+
6. **UX por modo (sec 0.8):**
|
|
393
|
+
|
|
394
|
+
- **Didactico**: el chat consulta "tenes una clave de
|
|
395
|
+
GitHub configurada para que pueda hacer commits?"
|
|
396
|
+
y si no, ofrece "queres pegarla aca? la guardo cifrada
|
|
397
|
+
y nunca te la vuelvo a pedir".
|
|
398
|
+
- **Tecnico**: muestra el listado actual de slots con
|
|
399
|
+
status (test result, expiry) y permite `vault add`,
|
|
400
|
+
`vault rotate`, `vault test`, `vault remove` desde
|
|
401
|
+
chat o CLI.
|
|
402
|
+
|
|
403
|
+
7. **Gate de release** (consistente con sec 0.7):
|
|
404
|
+
|
|
405
|
+
Forge **rechaza** ejecutar acciones que requieren un
|
|
406
|
+
secret si el vault no lo tiene. Mensaje en didactico:
|
|
407
|
+
"necesito una clave de X para esto. La cargas?". Mensaje
|
|
408
|
+
en tecnico: "missing vault slot: X (required for
|
|
409
|
+
operation Y)". **Nunca** se pide al usuario que pegue el
|
|
410
|
+
secret en el chat plano sin enmascarar.
|
|
411
|
+
|
|
412
|
+
8. **Cero deuda con credenciales legacy**:
|
|
413
|
+
|
|
414
|
+
Si un proyecto Yujin todavia tiene credenciales en
|
|
415
|
+
archivos `.env` / `config.json` / hardcoded, el migrador
|
|
416
|
+
las mueve al vault al primer touch de Forge + las elimina
|
|
417
|
+
del archivo original + agrega entrada al `vault.audit.log`.
|
|
418
|
+
|
|
419
|
+
Esta seccion convive con sec 8 (activos estrategicos):
|
|
420
|
+
- Sec 8 protege el IP de Yujin (prompts, heuristicas) del
|
|
421
|
+
desarrollador-cliente.
|
|
422
|
+
- Sec 0.11 protege las credenciales del cliente del desarrollo
|
|
423
|
+
asistido por Forge.
|
|
424
|
+
|
|
425
|
+
Son dos vaults distintos conceptualmente: el primero vive
|
|
426
|
+
server-side en yujin.app (sec 8); el segundo vive local en
|
|
427
|
+
la maquina del desarrollador (sec 0.11), AES-GCM con
|
|
428
|
+
passphrase del usuario.
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## 1. Antes de tocar codigo
|
|
433
|
+
|
|
434
|
+
### 1.1 Lectura obligatoria de documentacion del proyecto
|
|
435
|
+
|
|
436
|
+
ANTES de hacer cualquier modificacion en un proyecto Yujin,
|
|
437
|
+
es obligatorio leer **toda** la documentacion del proyecto.
|
|
438
|
+
No "leí lo que necesitaba". Lectura completa o no se toca
|
|
439
|
+
nada.
|
|
440
|
+
|
|
441
|
+
Set minimo:
|
|
442
|
+
|
|
443
|
+
1. `README.md` — overview, install, status.
|
|
444
|
+
2. `PROJECT.md` — gobernanza, topologia, ciclo de trabajo.
|
|
445
|
+
3. `SQ.md` (este archivo) — estandares de calidad.
|
|
446
|
+
4. `docs/ARCHITECTURE.md` o `docs/HITO_*_ARCHITECTURE.md`.
|
|
447
|
+
5. `docs/USER_MANUAL.md` (o equivalente del proyecto).
|
|
448
|
+
6. `docs/MAINTENANCE_MANUAL.md`.
|
|
449
|
+
7. `docs/INFRASTRUCTURE.md`.
|
|
450
|
+
8. `CHANGELOG.md` — historia reciente.
|
|
451
|
+
9. `docs/RFC/` o `rfcs/` — decisiones propuestas / aprobadas
|
|
452
|
+
/ implementadas.
|
|
453
|
+
10. `docs/decisions/` cuando exista — ADRs.
|
|
454
|
+
|
|
455
|
+
Si **cualquiera** de estos docs no existe en el proyecto:
|
|
456
|
+
- Levantar la falta antes de modificar codigo.
|
|
457
|
+
- Proponer creacion del doc faltante como primer slice.
|
|
458
|
+
- Si Pablo dice "skip", documentar el skip en commit
|
|
459
|
+
message + memoria.
|
|
460
|
+
|
|
461
|
+
Esta regla previene tres clases de error:
|
|
462
|
+
|
|
463
|
+
- **Refactor contra el design explicito** (el README explicaba
|
|
464
|
+
el porque, y rompi el invariante).
|
|
465
|
+
- **Tocar areas con invariantes que el codigo no se lee**
|
|
466
|
+
(la regla esta en MAINTENANCE_MANUAL, no en el codigo).
|
|
467
|
+
- **Repetir bugs ya documentados** (el incident anterior tiene
|
|
468
|
+
runbook + post-mortem, lo replicamos por no leerlo).
|
|
469
|
+
|
|
470
|
+
### 1.2 Volumetrias antes de arquitectura
|
|
471
|
+
|
|
472
|
+
ANTES de proponer arquitectura para una feature nueva o un
|
|
473
|
+
proyecto nuevo, **obligatorio** preguntar al stakeholder
|
|
474
|
+
estas volumetrias:
|
|
475
|
+
|
|
476
|
+
| Volumetria | Pregunta concreta al stakeholder |
|
|
477
|
+
|---|---|
|
|
478
|
+
| Usuarios concurrentes | "Cuantos usuarios estaran activos simultaneamente en pico?" |
|
|
479
|
+
| Requests / segundo | "Que tasa de requests/segundo esperas en pico?" |
|
|
480
|
+
| Volumen de datos | "Cuanto data se va a generar / almacenar diaria / mensualmente?" |
|
|
481
|
+
| Latencia aceptable | "Cual es la latencia p95 / p99 aceptable para esta feature?" |
|
|
482
|
+
| Disponibilidad esperada | "Cual es el SLA esperado? 99.9% / 99.99%?" |
|
|
483
|
+
| Geografia | "Usuarios en una region o multi-region?" |
|
|
484
|
+
| Picos esperados | "Hay eventos predecibles que multipliquen la carga? (lanzamientos, fin de mes, horarios)" |
|
|
485
|
+
| Crecimiento proyectado | "Que crecimiento esperas en 6 / 12 / 24 meses?" |
|
|
486
|
+
| Tolerancia a fallos | "Cuanto downtime es aceptable en una semana / mes?" |
|
|
487
|
+
| Tipo de carga | "Read-heavy / write-heavy / balanced?" |
|
|
488
|
+
|
|
489
|
+
**Sin volumetrias, la arquitectura es adivinacion y la
|
|
490
|
+
implementacion es deuda tecnica garantizada.**
|
|
491
|
+
|
|
492
|
+
Las respuestas determinan:
|
|
493
|
+
|
|
494
|
+
- Stack tecnologico viable (Postgres vs DynamoDB vs Cassandra,
|
|
495
|
+
monolito vs microservicios).
|
|
496
|
+
- Necesidad de cache distribuido (Redis, Memcached), CDN, edge
|
|
497
|
+
computing.
|
|
498
|
+
- Workers stateless escalables horizontal vs stateful con
|
|
499
|
+
pinning.
|
|
500
|
+
- Read replicas, sharding, particionamiento.
|
|
501
|
+
- Queues asincronas (SQS, RabbitMQ, Kafka) vs RPC sincronico.
|
|
502
|
+
- Provisioning: serverless (Lambda) vs containers (ECS) vs
|
|
503
|
+
bare metal.
|
|
504
|
+
- Geo-distribution + multi-region active-active vs DR
|
|
505
|
+
passive.
|
|
506
|
+
|
|
507
|
+
### 1.3 Solicitudes simultaneas + soluciones escalables
|
|
508
|
+
|
|
509
|
+
Para cada flow del proyecto, ANTES de implementar:
|
|
510
|
+
|
|
511
|
+
1. **Inferir** `concurrency_p95` (pico de solicitudes
|
|
512
|
+
simultaneas), `rps_avg` (tasa sostenida), patron
|
|
513
|
+
read-heavy / write-heavy / balanced.
|
|
514
|
+
2. **Documentar** la inferencia en el RFC / HITO doc:
|
|
515
|
+
"asumimos `concurrency_p95 = N` segun volumetria 1.2.X".
|
|
516
|
+
3. **Proponer** arquitectura que soporte esos numeros con
|
|
517
|
+
margen de 3x para crecimiento.
|
|
518
|
+
4. **Enumerar las ventajas** del approach elegido (no asumir
|
|
519
|
+
que Pablo "ya entiende"; escribirlo).
|
|
520
|
+
|
|
521
|
+
#### Preferencia obligatoria: stateless
|
|
522
|
+
|
|
523
|
+
#### Ventajas de soluciones stateless (las 10 que justifican la preferencia)
|
|
524
|
+
|
|
525
|
+
1. **Horizontal scaling sin estado compartido.** Se agregan
|
|
526
|
+
instancias sin coordinacion previa. El load balancer
|
|
527
|
+
distribuye, cualquier instancia sirve cualquier request.
|
|
528
|
+
2. **Recuperacion instantanea de fallas.** Una instancia
|
|
529
|
+
muere, el LB rutea a otra, **sin perdida de sesion del
|
|
530
|
+
usuario**.
|
|
531
|
+
3. **Deploy sin downtime.** Rolling deploys porque cualquier
|
|
532
|
+
instancia sirve cualquier request. Blue/green es trivial.
|
|
533
|
+
4. **Predictibilidad de costos.** Escalar es lineal con load,
|
|
534
|
+
sin overhead de coordinacion / sincronizacion / locks
|
|
535
|
+
distribuidos.
|
|
536
|
+
5. **Testing mas simple.** Cada request es self-contained,
|
|
537
|
+
no necesita setup de estado previo. Tests paralelos
|
|
538
|
+
sin colision.
|
|
539
|
+
6. **Independencia de orden de procesamiento.** Los workers
|
|
540
|
+
procesan en cualquier orden sin afectar correctness.
|
|
541
|
+
7. **Compatibilidad con caches.** Las respuestas son
|
|
542
|
+
cacheables por (input, version). CDN edge cache es viable.
|
|
543
|
+
8. **Diagnostico mas simple.** Replay de un request da el
|
|
544
|
+
mismo resultado. Bug bisection trivial.
|
|
545
|
+
9. **Migracion entre regiones / providers mas simple.** Sin
|
|
546
|
+
state local que migrar.
|
|
547
|
+
10. **Capacidad de spot / preemptible instances.** Perdida de
|
|
548
|
+
instancia = perdida de un request a lo sumo, que el
|
|
549
|
+
retry resuelve.
|
|
550
|
+
|
|
551
|
+
#### Atomizacion obligatoria de acciones
|
|
552
|
+
|
|
553
|
+
- Cada operacion debe ser **atomica** (idempotente cuando es
|
|
554
|
+
posible).
|
|
555
|
+
- Operaciones largas se rompen en steps que se pueden
|
|
556
|
+
retry independiente.
|
|
557
|
+
- Estado intermedio en stores externos (DB, queue), **no** en
|
|
558
|
+
memoria del proceso.
|
|
559
|
+
- Cualquier operacion que tarde > 100ms debe ser cola
|
|
560
|
+
asincrona, **no** RPC sincronico.
|
|
561
|
+
- Las queues son la unidad de retry — si falla un step, el
|
|
562
|
+
siguiente arranca la proxima vez.
|
|
563
|
+
|
|
564
|
+
#### Cuando se rompe el "stateless preferido"
|
|
565
|
+
|
|
566
|
+
Solo en estos casos:
|
|
567
|
+
|
|
568
|
+
- Conexiones WebSocket persistentes (chat real-time, voice
|
|
569
|
+
full-duplex).
|
|
570
|
+
- Streams de media (TTS playback, video conferencing).
|
|
571
|
+
- Calculos pesados que ya cargaron data en memoria (Spark
|
|
572
|
+
workers, ML inference con modelo de 10GB).
|
|
573
|
+
- Hardware especializado pegado a una instancia (GPU
|
|
574
|
+
exclusiva).
|
|
575
|
+
|
|
576
|
+
En estos casos, el state debe estar:
|
|
577
|
+
|
|
578
|
+
- Documentado en `docs/STATEFUL_COMPONENTS.md` con la razon
|
|
579
|
+
exacta.
|
|
580
|
+
- Aislado en un componente especifico (no contaminar el
|
|
581
|
+
resto del sistema).
|
|
582
|
+
- Tener backup / failover / DR plan documentado.
|
|
583
|
+
- Tener metrica + alerta que dispare cuando el componente
|
|
584
|
+
baja de capacidad.
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## 2. Estandares de codigo
|
|
589
|
+
|
|
590
|
+
### 2.1 Tests
|
|
591
|
+
|
|
592
|
+
- **100% test pass.** `npm test` retorna exit 0 con cero
|
|
593
|
+
FAIL en Linux + macOS + Windows. Pre-existing failures
|
|
594
|
+
NO son aceptables — se arreglan o se borran. No existe
|
|
595
|
+
"known-failing-but-not-our-fault".
|
|
596
|
+
- **TDD por slice.** Escribir tests RED antes de implementar.
|
|
597
|
+
Implementar. Commit GREEN. Saltarse TDD solo en
|
|
598
|
+
extractors / formatters triviales donde el test seria un
|
|
599
|
+
1:1 mirror del impl.
|
|
600
|
+
- **Evidencia requerida.** Cada slice cita los tests que pasan
|
|
601
|
+
en el commit message + CHANGELOG. Si un slice no apunta a
|
|
602
|
+
un test verde, no es slice — es draft.
|
|
603
|
+
- **Seams mockeables.** Cada llamada a Claude, cada `fetch`,
|
|
604
|
+
cada `fs` write, cada spawn, cada captura de audio es
|
|
605
|
+
alcanzable via DI seam para que los unit tests corran
|
|
606
|
+
offline sin keys.
|
|
607
|
+
|
|
608
|
+
### 2.2 Coverage 100% de interfaces visuales
|
|
609
|
+
|
|
610
|
+
**Regla incorporada 2026-05-25 despues del bug del
|
|
611
|
+
SyntaxError en el panel:** toda interfaz visual de Yujin
|
|
612
|
+
(panel de chat incluido, modales, dropdowns, drag-drop
|
|
613
|
+
overlays) se cubre al 100% con tests Playwright headless
|
|
614
|
+
que ejercen **dialogos de alta complejidad** y **todas las
|
|
615
|
+
funciones del producto**, no solo "carga sin errores".
|
|
616
|
+
|
|
617
|
+
Detalle completo en `PROJECT.md` sec 3.1.1. Resumen aplicable
|
|
618
|
+
a cualquier proyecto Yujin:
|
|
619
|
+
|
|
620
|
+
- Boot smoke: panel carga con cero `console.error` /
|
|
621
|
+
`pageerror`.
|
|
622
|
+
- Functional smokes: cada funcion visible tiene al menos un
|
|
623
|
+
scenario end-to-end.
|
|
624
|
+
- High-complexity dialogues: conversaciones multi-turn con
|
|
625
|
+
Claude scripteado realista que encadenan tools.
|
|
626
|
+
- Cross-language: cada scenario corre en los 10 idiomas
|
|
627
|
+
cuando aplica.
|
|
628
|
+
- Cross-browser: chromium + firefox + webkit.
|
|
629
|
+
- Visual regression: screenshots vs baselines.
|
|
630
|
+
- Audio + media: con stubs deterministicos.
|
|
631
|
+
|
|
632
|
+
**Vitest no es suficiente.** Vitest cubre endpoints + pure
|
|
633
|
+
functions. **No** ejecuta el JS inline del browser. Reportar
|
|
634
|
+
"X tests verde" sin haber corrido Playwright es claim falso.
|
|
635
|
+
|
|
636
|
+
### 2.3 Coverage 100% backend
|
|
637
|
+
|
|
638
|
+
- Cada funcion publica del runtime tiene test unitario.
|
|
639
|
+
- Cada endpoint HTTP tiene test de integracion (happy path
|
|
640
|
+
+ 1 error path minimo).
|
|
641
|
+
- Cada plugin / handler tiene test de su flow.
|
|
642
|
+
|
|
643
|
+
### 2.4 Codigo style
|
|
644
|
+
|
|
645
|
+
- **ASCII puro** en codigo fuente TS/JS (`src/**`,
|
|
646
|
+
`scripts/**`). Sin unicode arrows, em-dashes, smart quotes.
|
|
647
|
+
Catalogos i18n + manuales HTML son la excepcion — esos
|
|
648
|
+
cargan unicode por diseno.
|
|
649
|
+
- **TypeScript** first. `tsx` para dev, `tsc` para build,
|
|
650
|
+
`dist/` para npm.
|
|
651
|
+
- **camelCase** JS/TS variables.
|
|
652
|
+
- **PascalCase** clases + interfaces.
|
|
653
|
+
- **snake_case** JSON keys + on-the-wire fields.
|
|
654
|
+
- **kebab-case** CLI subcommands + filenames cuando aplica.
|
|
655
|
+
- **Function declarations** en module top-level. Arrow
|
|
656
|
+
expressions OK para inline callbacks.
|
|
657
|
+
- **Comments explican el POR QUE**, no el QUE. Default a sin
|
|
658
|
+
comment. Comment solo cuando el por que no es obvio
|
|
659
|
+
(constraint oculto, invariante sutil, workaround
|
|
660
|
+
sorprendente, referencia a spec).
|
|
661
|
+
- **TypeScript strict** activo: `noUncheckedIndexedAccess`,
|
|
662
|
+
`strict: true`, `noImplicitOverride`. No relajar.
|
|
663
|
+
|
|
664
|
+
### 2.5 Build + deploy
|
|
665
|
+
|
|
666
|
+
- `npm run build` corre `tsc`. Output a `dist/`. Codigo
|
|
667
|
+
fuente siempre en `src/`.
|
|
668
|
+
- `npm run prepublishOnly` corre build + typecheck +
|
|
669
|
+
catalog:lint + test. **No bypassear.** Es el publish gate.
|
|
670
|
+
- `npm publish --tag alpha` desde un estado verificado.
|
|
671
|
+
Promote a `latest` solo en GA cut.
|
|
672
|
+
- `npm publish --dry-run` despues de tocar `files` glob.
|
|
673
|
+
|
|
674
|
+
### 2.6 Multi-language: 10 idiomas canonicos NAC3
|
|
675
|
+
|
|
676
|
+
Forge y todo proyecto Yujin enforece la **regla 10 idiomas**:
|
|
677
|
+
`es, en, pt, fr, ja, zh, hi, ar, de, it`.
|
|
678
|
+
|
|
679
|
+
- Cada string user-facing pasa por `t('key')` /
|
|
680
|
+
`tForLang(lang, 'key')`.
|
|
681
|
+
- Catalogos: `src/i18n/catalogs/<lang>.json` (10 archivos).
|
|
682
|
+
- Espanol es source of truth. Cada otro locale debe contener
|
|
683
|
+
todas las keys de es.
|
|
684
|
+
- `catalog-lint` enforces parity. `prepublishOnly` corre
|
|
685
|
+
catalog-lint como gate.
|
|
686
|
+
- HTML manuales: uno por idioma en `docs/manuals/manual.<lang>.html`.
|
|
687
|
+
- Voice intents extendidos a 10 idiomas con verbos por
|
|
688
|
+
idioma.
|
|
689
|
+
|
|
690
|
+
Ver `docs/LANGUAGE_POLICY.md`.
|
|
691
|
+
|
|
692
|
+
### 2.7 Provenance
|
|
693
|
+
|
|
694
|
+
Cada accion que el sistema dispatcha emite un evento
|
|
695
|
+
estructurado: `{tool, input, display, is_error,
|
|
696
|
+
via_voice?, voice_pattern?, voice_utterance?, ...}`. Es lo
|
|
697
|
+
que da trazabilidad para auditoria + debugging.
|
|
698
|
+
|
|
699
|
+
- **No suprimir silenciosamente** trace entries, ni siquiera
|
|
700
|
+
en failure paths.
|
|
701
|
+
- **VOZ badge** + utterance + pattern slug en dispatches
|
|
702
|
+
voice-driven.
|
|
703
|
+
- **tool_rounds** en cada respuesta `/api/chat`.
|
|
704
|
+
|
|
705
|
+
### 2.8 Security boundaries
|
|
706
|
+
|
|
707
|
+
- **Vault** (`src/vault/` cuando aplica): AES-256-GCM,
|
|
708
|
+
scrypt KDF, machine-fingerprint binding, atomic writes
|
|
709
|
+
`0o600`, one-shot reveal, never re-displayable.
|
|
710
|
+
- **Direct-dispatch endpoint** (`/api/forge/tool` o
|
|
711
|
+
equivalente) whitelist solo a tools read-only. Write-class
|
|
712
|
+
pasa por `/api/chat` con approval flow.
|
|
713
|
+
- **Approval gates** en operaciones destructivas (file
|
|
714
|
+
scaffolding, scaffolds, pushes, deletes): explicit
|
|
715
|
+
`{approve: true}` requerido.
|
|
716
|
+
- **Path-escape validation** en cualquier handler que
|
|
717
|
+
resuelve paths del usuario: rechazar absolute paths, `..`,
|
|
718
|
+
drive letters; resolver contra `projectRoot` y verificar
|
|
719
|
+
prefix.
|
|
720
|
+
- **Voiceprint liveness** mandatorio para irreversible ops.
|
|
721
|
+
- **Cost gates** dobles (env + impl installed) para
|
|
722
|
+
operaciones que pueden charge tokens.
|
|
723
|
+
|
|
724
|
+
### 2.9 Single source of truth para modelos LLM
|
|
725
|
+
|
|
726
|
+
El identificador de modelo Claude / OpenAI / Gemini / etc.
|
|
727
|
+
vive en **una sola** ubicacion por proyecto (e.g.
|
|
728
|
+
`src/version.ts` para version, `core/AiModel.php` para
|
|
729
|
+
modelos en CRM, o equivalente). Rolling over a un modelo
|
|
730
|
+
nuevo es un cambio de 1 linea, no buscar y reemplazar 50
|
|
731
|
+
archivos.
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
## 3. Entregables por proyecto -- 4 manuales obligatorios
|
|
736
|
+
|
|
737
|
+
Cada proyecto Yujin debe emitir y **mantener** estos cuatro
|
|
738
|
+
manuales en formato Markdown legible:
|
|
739
|
+
|
|
740
|
+
### 3.1 `docs/INFRASTRUCTURE.md` — Manual de infraestructura
|
|
741
|
+
|
|
742
|
+
Contenido obligatorio:
|
|
743
|
+
|
|
744
|
+
- Diagrama de infraestructura (mermaid, ASCII art, o link
|
|
745
|
+
a un PNG).
|
|
746
|
+
- Servicios externos: cuales son, para que se usan, donde
|
|
747
|
+
estan los slots de credenciales (sin las credenciales
|
|
748
|
+
mismas).
|
|
749
|
+
- Variables de entorno necesarias + valores ejemplo + valores
|
|
750
|
+
prohibidos.
|
|
751
|
+
- Puertos, hostnames, DNS records configurados.
|
|
752
|
+
- Backups: que se respalda, donde, frecuencia, retention,
|
|
753
|
+
cifrado.
|
|
754
|
+
- Restore procedure: tested + documented step-by-step.
|
|
755
|
+
- Monitoring: que metricas se emiten, donde se visualizan
|
|
756
|
+
(CloudWatch / Grafana / etc).
|
|
757
|
+
- Alertas: cuales estan configuradas, threshold, a quien
|
|
758
|
+
notifican.
|
|
759
|
+
- Capacity planning: limites actuales, headroom, trigger de
|
|
760
|
+
scaling.
|
|
761
|
+
|
|
762
|
+
### 3.2 `docs/ARCHITECTURE.md` — Manual de arquitectura
|
|
763
|
+
|
|
764
|
+
Contenido obligatorio:
|
|
765
|
+
|
|
766
|
+
- **Decision arquitectonica principal** y por que (incluyendo
|
|
767
|
+
alternativas descartadas).
|
|
768
|
+
- **Volumetrias acordadas** segun sec 1.2 de este SQ.
|
|
769
|
+
- **Stack tecnologico** + razon de cada eleccion.
|
|
770
|
+
- **Diagrama de modulos** (modulos internos + sus relaciones).
|
|
771
|
+
- **Diagramas de flow** de happy paths (top 5 minimo).
|
|
772
|
+
- **Diagramas de flow de failure paths** (top 5 minimo).
|
|
773
|
+
- **Boundaries** entre componentes: que componente conoce que.
|
|
774
|
+
- **Acoplamiento**: que requiere que (idealmente: tabla).
|
|
775
|
+
- **Data model**: schemas + relaciones + indices.
|
|
776
|
+
- **Concurrency model**: como se asegura correctness bajo
|
|
777
|
+
carga concurrente (locks, optimistic, eventual
|
|
778
|
+
consistency, etc).
|
|
779
|
+
- **Threat model**: que protege el sistema y contra que.
|
|
780
|
+
|
|
781
|
+
### 3.3 `docs/USER_MANUAL.md` — Manual de usuario (o variantes por idioma)
|
|
782
|
+
|
|
783
|
+
Contenido obligatorio:
|
|
784
|
+
|
|
785
|
+
- Guia paso a paso para el usuario final.
|
|
786
|
+
- En el idioma del usuario (los 10 NAC3 cuando aplica;
|
|
787
|
+
multiples archivos `docs/manuals/manual.<lang>.html` o
|
|
788
|
+
`docs/USER_MANUAL.<lang>.md`).
|
|
789
|
+
- Screenshots / GIFs cuando corresponda (en `docs/assets/`).
|
|
790
|
+
- Troubleshooting de los 10 problemas mas comunes.
|
|
791
|
+
- Contacto de soporte.
|
|
792
|
+
|
|
793
|
+
### 3.4 `docs/MAINTENANCE_MANUAL.md` — Manual de mantenimiento
|
|
794
|
+
|
|
795
|
+
Contenido obligatorio:
|
|
796
|
+
|
|
797
|
+
- **Procedure de deploy** step-by-step + rollback.
|
|
798
|
+
- **Procedure de rollback** independiente del deploy.
|
|
799
|
+
- **Runbook de los 10 incidents mas comunes** + diagnostico
|
|
800
|
+
+ remedio.
|
|
801
|
+
- **Como agregar capacidad** (vertical y horizontal).
|
|
802
|
+
- **Como investigar un incident** (logs, metricas,
|
|
803
|
+
herramientas).
|
|
804
|
+
- **Logs**: donde estan, formato, rotation, search.
|
|
805
|
+
- **Metricas**: donde estan, umbrales normales / warning /
|
|
806
|
+
critical.
|
|
807
|
+
- **Dependencias externas**: que pasa si X cae, RPO/RTO de
|
|
808
|
+
cada una.
|
|
809
|
+
- **Procedure de DR** (disaster recovery).
|
|
810
|
+
- **Procedure de re-key** + rotacion de credenciales.
|
|
811
|
+
|
|
812
|
+
### Formato de los manuales
|
|
813
|
+
|
|
814
|
+
- **Markdown plano**, sin frameworks (no Docusaurus, no
|
|
815
|
+
MkDocs custom). Renderable en GitHub web view sin
|
|
816
|
+
extensiones.
|
|
817
|
+
- **Cada doc < 2000 lineas**; si supera, separar en
|
|
818
|
+
subdocs linkeados.
|
|
819
|
+
- **Headings nivelados**: H1 titulo, H2 secciones, H3
|
|
820
|
+
subsecciones.
|
|
821
|
+
- **Tablas** para data tabular.
|
|
822
|
+
- **Code blocks** con language tag.
|
|
823
|
+
- **Diagramas** preferentemente en mermaid (texto-as-data)
|
|
824
|
+
o ASCII art. Si PNG, en `docs/assets/`.
|
|
825
|
+
- **Linkeable** desde el README del proyecto.
|
|
826
|
+
|
|
827
|
+
### Mantenimiento de los manuales
|
|
828
|
+
|
|
829
|
+
- **Cada slice** que afecta una seccion de un manual
|
|
830
|
+
actualiza el manual en el **mismo commit** (regla
|
|
831
|
+
doc-update invariant, PROJECT.md sec 2.4).
|
|
832
|
+
- **Manuales obsoletos son bug critico** — al detectarlo,
|
|
833
|
+
levantar issue + parchear.
|
|
834
|
+
- **Pasada trimestral** de re-validacion: alguien (humano
|
|
835
|
+
+ Sumi) lee los manuales pretendiendo no saber nada del
|
|
836
|
+
sistema, y reporta secciones que ya no representan la
|
|
837
|
+
realidad.
|
|
838
|
+
|
|
839
|
+
---
|
|
840
|
+
|
|
841
|
+
## 4. Pre-development checklist
|
|
842
|
+
|
|
843
|
+
Antes de hacer cualquier slice de codigo, Sumi pasa por
|
|
844
|
+
este checklist. **Si cualquier item falla, el slice NO
|
|
845
|
+
arranca** — se hace el item primero, despues se arranca el
|
|
846
|
+
slice.
|
|
847
|
+
|
|
848
|
+
- [ ] Lei `README.md` del proyecto.
|
|
849
|
+
- [ ] Lei `PROJECT.md`.
|
|
850
|
+
- [ ] Lei este SQ.md.
|
|
851
|
+
- [ ] Lei `docs/ARCHITECTURE.md` o `docs/HITO_*_ARCHITECTURE.md`.
|
|
852
|
+
- [ ] Lei `docs/USER_MANUAL.md` (o equivalente).
|
|
853
|
+
- [ ] Lei `docs/MAINTENANCE_MANUAL.md`.
|
|
854
|
+
- [ ] Lei `docs/INFRASTRUCTURE.md`.
|
|
855
|
+
- [ ] Lei el `CHANGELOG.md` reciente.
|
|
856
|
+
- [ ] Para feature nueva: pedi las volumetrias (sec 1.2).
|
|
857
|
+
- [ ] Para feature nueva: defini el target de `concurrency_p95`
|
|
858
|
+
(sec 1.3).
|
|
859
|
+
- [ ] Para feature nueva: propuse arquitectura stateless O
|
|
860
|
+
justifique stateful en `STATEFUL_COMPONENTS.md`.
|
|
861
|
+
- [ ] Para feature nueva: enumere las 10 ventajas (o subset
|
|
862
|
+
aplicable) del approach elegido (sec 1.3).
|
|
863
|
+
- [ ] El plan tiene tests Playwright para las visual
|
|
864
|
+
interfaces que toca.
|
|
865
|
+
- [ ] El plan actualiza los 4 manuales en el mismo PR si
|
|
866
|
+
la feature los toca.
|
|
867
|
+
- [ ] Hable con Pablo si encontre contradicciones entre
|
|
868
|
+
docs o invariantes.
|
|
869
|
+
|
|
870
|
+
---
|
|
871
|
+
|
|
872
|
+
## 5. Reporte de "ready" — disciplina
|
|
873
|
+
|
|
874
|
+
Cuando Sumi reporta que un slice esta listo, la frase debe
|
|
875
|
+
contener **estos cuatro componentes**:
|
|
876
|
+
|
|
877
|
+
> X vitest cases + Y Playwright scenarios green. Console +
|
|
878
|
+
> page errors empty on all 3 browsers + all 10 languages
|
|
879
|
+
> exercised for affected surfaces. Screenshots diff: 0
|
|
880
|
+
> baseline changes. Evidence updated at
|
|
881
|
+
> `tests/evidence/<scenario>/`.
|
|
882
|
+
|
|
883
|
+
Si **alguno** de los cuatro componentes no aplica o no esta
|
|
884
|
+
verde, **no se dice "ready"**. Se dice "blocked on
|
|
885
|
+
[componente]" + ETA concreta.
|
|
886
|
+
|
|
887
|
+
Esto protege el tiempo de Pablo (sec 0.1).
|
|
888
|
+
|
|
889
|
+
---
|
|
890
|
+
|
|
891
|
+
## 6. Evidencia visual permanente
|
|
892
|
+
|
|
893
|
+
Cada Playwright run guarda screenshots de la **ultima
|
|
894
|
+
ejecucion exitosa** en `tests/evidence/<scenario>/<lang>/<browser>.png`.
|
|
895
|
+
|
|
896
|
+
- Failed runs **NO** sobreescriben la evidencia previa.
|
|
897
|
+
- Committed al repo como visual changelog.
|
|
898
|
+
- Actualizado en el mismo commit que el codigo cuando el
|
|
899
|
+
scenario cambia intencionalmente.
|
|
900
|
+
- < 200 KB por PNG; 1280 wide max.
|
|
901
|
+
|
|
902
|
+
Detalle en `PROJECT.md` sec 3.1.1 subseccion "Evidence
|
|
903
|
+
folder".
|
|
904
|
+
|
|
905
|
+
---
|
|
906
|
+
|
|
907
|
+
## 7. Memoria de decisiones
|
|
908
|
+
|
|
909
|
+
Cada decision arquitectonica no-trivial se documenta en uno
|
|
910
|
+
de:
|
|
911
|
+
|
|
912
|
+
1. `docs/RFC/RFC-<HITO>-<NN>-<title>.md` para decisiones de
|
|
913
|
+
HITO scope.
|
|
914
|
+
2. `docs/decisions/ADR-<NN>-<title>.md` para Architecture
|
|
915
|
+
Decision Records puntuales.
|
|
916
|
+
3. Inline en el `PROJECT.md` cuando es una regla del
|
|
917
|
+
proyecto entero.
|
|
918
|
+
4. Inline en el `CHANGELOG.md` cuando es un cambio
|
|
919
|
+
especifico de version.
|
|
920
|
+
|
|
921
|
+
**No** se aceptan decisiones que viven solo en chats /
|
|
922
|
+
commits / commit messages sin un doc estable que las
|
|
923
|
+
referencie.
|
|
924
|
+
|
|
925
|
+
---
|
|
926
|
+
|
|
927
|
+
## 8. Activos estrategicos + proteccion de propiedad intelectual
|
|
928
|
+
|
|
929
|
+
> **Estado:** decision tomada **2026-05-25** por Pablo:
|
|
930
|
+
> **Opcion A -- Server-side prompt composition.** El
|
|
931
|
+
> inventario en 8.2 sigue siendo autoritativo. Las opciones
|
|
932
|
+
> B/C/D quedan documentadas como historico. La implementacion
|
|
933
|
+
> arranca en `docs/HITO_4_STRATEGIC_ASSETS.md` (HITO 4
|
|
934
|
+
> "Strategic asset isolation").
|
|
935
|
+
|
|
936
|
+
### 8.1 El problema
|
|
937
|
+
|
|
938
|
+
Forge se distribuye via `npm install -g @yujin/forge-cli`. Al
|
|
939
|
+
instalarse, el codigo entero (incluido el `dist/`) queda
|
|
940
|
+
legible en disco del adopter. **Cualquier developer con
|
|
941
|
+
acceso al binario puede leer el codigo fuente**, incluido:
|
|
942
|
+
|
|
943
|
+
- Los system prompts a Claude para extract / plan / decorate
|
|
944
|
+
/ recap summary.
|
|
945
|
+
- Los catalogos de tools + sus shapes + sus rules.
|
|
946
|
+
- Los templates de scaffolding por kind/language.
|
|
947
|
+
- Los heuristicos del trust model + del intent matcher.
|
|
948
|
+
- La metodologia completa del pipeline.
|
|
949
|
+
|
|
950
|
+
Es decir: **el "secret sauce" del producto esta hoy en
|
|
951
|
+
plaintext en la maquina de cada adopter pago.** Un competidor
|
|
952
|
+
puede `npm install -g @yujin/forge-cli`, abrir
|
|
953
|
+
`dist/chat/spec_extract.js`, copiar el prompt, y construir
|
|
954
|
+
un clon sin pagar.
|
|
955
|
+
|
|
956
|
+
Esto debe arreglarse antes del GA cut (HITO 3 territory),
|
|
957
|
+
con la decision tomada antes de la promocion alpha → latest.
|
|
958
|
+
|
|
959
|
+
### 8.2 Inventario de activos estrategicos
|
|
960
|
+
|
|
961
|
+
Lista exhaustiva de lo que da valor a Forge.
|
|
962
|
+
**Cada item esta clasificado por sensibilidad: CLOSED, MIXED,
|
|
963
|
+
OPEN.**
|
|
964
|
+
|
|
965
|
+
**Tier 1 -- CLOSED (secret sauce; competitividad directa):**
|
|
966
|
+
|
|
967
|
+
1. **System prompts de los flows Claude** -- la receta de
|
|
968
|
+
como Forge extrae requirements de un spec, arma planes,
|
|
969
|
+
redacta el recap summary. Hoy en plaintext en:
|
|
970
|
+
- `src/chat/spec_extract.ts` (SYSTEM_PROMPT)
|
|
971
|
+
- `src/chat/spec_plan.ts` (SYSTEM_PROMPT)
|
|
972
|
+
- `src/chat/server.ts` (recap summariser system prompt)
|
|
973
|
+
- `src/migrate/ai-decorate-*.ts` (decoration prompts)
|
|
974
|
+
- `src/migrate/figma-*.ts` (Figma scaffolder prompts)
|
|
975
|
+
|
|
976
|
+
2. **Heuristicas de plan generation** -- las reglas de "que
|
|
977
|
+
archivos crear para que entidad/endpoint/component",
|
|
978
|
+
"orden de creacion", "naming conventions". Hoy en
|
|
979
|
+
`src/chat/spec_plan.ts` + system prompt.
|
|
980
|
+
|
|
981
|
+
3. **Templates de scaffold por (kind, language)** -- los
|
|
982
|
+
stub bodies de `model.ts`, `api.ts`, `Component.tsx`,
|
|
983
|
+
`README.md`, etc. Hoy en `src/chat/spec_scaffold.ts`
|
|
984
|
+
(`templateFor` function).
|
|
985
|
+
|
|
986
|
+
4. **Decoration heuristicas NAC-3** -- como elegimos
|
|
987
|
+
`data-nac-role` por elemento, como derivamos
|
|
988
|
+
`data-nac-action`, como agrupamos elementos en plugin
|
|
989
|
+
slugs.
|
|
990
|
+
|
|
991
|
+
5. **NAC-3 disambiguation prompts** -- cuando esto se
|
|
992
|
+
implemente (memoria `nac3-disambiguation-model-split`),
|
|
993
|
+
el prompt que recibe Gemini Flash Lite para resolver
|
|
994
|
+
ambiguity en runtime de Pilot.
|
|
995
|
+
|
|
996
|
+
6. **El benchmark interno + sus resultados** -- los runs de
|
|
997
|
+
600 ejecuciones del NAC-3 benchmark (que modelo, que
|
|
998
|
+
protocolo, que accuracy). Hoy en `yujin-nac-spec/benchmark/`,
|
|
999
|
+
no en Forge, pero Forge consume los hallazgos para
|
|
1000
|
+
decidir defaults de model_preference.
|
|
1001
|
+
|
|
1002
|
+
7. **Modelo Koe (pricing + cost formula)** -- la formula
|
|
1003
|
+
provider_cost + 30% markup + 20% reinvestment +
|
|
1004
|
+
institutional plan. Documentada en CRM memory
|
|
1005
|
+
`yujin-koe-pricing-formula`.
|
|
1006
|
+
|
|
1007
|
+
**Tier 2 -- MIXED (parte open, parte closed):**
|
|
1008
|
+
|
|
1009
|
+
1. **Tool catalog `forge.*`** -- los NOMBRES + SCHEMAS
|
|
1010
|
+
pueden ser publicos (los adopters los invocan). Las
|
|
1011
|
+
IMPLEMENTACIONES de cada tool tienen detalles que valen
|
|
1012
|
+
ocultar (e.g. como `forge.git_commit` orquesta el splice
|
|
1013
|
+
del token de GitHub).
|
|
1014
|
+
|
|
1015
|
+
2. **Trust model voiceprint** -- la idea de 5 capas es
|
|
1016
|
+
publica. Los thresholds + ponderaciones precisas son
|
|
1017
|
+
ajustables y son el resultado de tuning empirico = valor.
|
|
1018
|
+
|
|
1019
|
+
3. **Recap summary cost gating** -- el doble lock
|
|
1020
|
+
(env var + summariser instalado) es publico. La logica
|
|
1021
|
+
exacta de cuando el summary vale los tokens es interna.
|
|
1022
|
+
|
|
1023
|
+
4. **Voice intent matcher catalog** -- los 8 intents son
|
|
1024
|
+
publicos (estan en el manual del usuario). Los regex
|
|
1025
|
+
exactos por idioma son el resultado de empirical tuning
|
|
1026
|
+
= valor. Hoy en `src/voice/intents.ts` en plaintext.
|
|
1027
|
+
|
|
1028
|
+
**Tier 3 -- OPEN (Apache-2.0; pueden ser publicos sin perdida):**
|
|
1029
|
+
|
|
1030
|
+
1. **CLI surface** (`yf` commands + flags) -- documentado en
|
|
1031
|
+
USAGE.md, expuesto al mundo.
|
|
1032
|
+
2. **Reader pipeline + 10 parsers** -- standard tech; los
|
|
1033
|
+
parsers en si son ejercicios de ingenieria, no IP unica.
|
|
1034
|
+
3. **Vault crypto** -- estandar AES-256-GCM + scrypt + machine
|
|
1035
|
+
fingerprint; el codigo es directo y publicable.
|
|
1036
|
+
4. **i18n runtime + 10 catalogos** -- las traducciones son
|
|
1037
|
+
accesibles al usuario via el panel; el codigo es trivial.
|
|
1038
|
+
5. **HTML manuals** -- distribuidos al usuario por diseno;
|
|
1039
|
+
publicos por definicion.
|
|
1040
|
+
6. **Playwright test suite** -- estandar de QA, no IP.
|
|
1041
|
+
7. **PROJECT.md + SQ.md + LANGUAGE_POLICY.md** -- son
|
|
1042
|
+
politicas del equipo, no codigo.
|
|
1043
|
+
8. **NAC-3 spec adoption** -- la spec es Apache-2.0; nuestro
|
|
1044
|
+
uso de ella es subsidiario.
|
|
1045
|
+
|
|
1046
|
+
### 8.3 Threat model
|
|
1047
|
+
|
|
1048
|
+
**Actores con acceso al binario:**
|
|
1049
|
+
|
|
1050
|
+
| Actor | Acceso | Riesgo |
|
|
1051
|
+
|---|---|---|
|
|
1052
|
+
| Pablo + Sumi | Full repo + dist + secrets | Trust total |
|
|
1053
|
+
| Adopter pago ($5/mo) | `npm install -g` -> dist en disco | Lee Tier 1 + Tier 2 |
|
|
1054
|
+
| ADIP / institucional (gratis) | igual que adopter pago | Misma exposicion |
|
|
1055
|
+
| Open-source contributor | Repo publico (cuando se abra) | Solo Tier 3 |
|
|
1056
|
+
| Competidor que paga $5/mo | igual que adopter | **Caso de uso adversario principal** |
|
|
1057
|
+
| Reverse engineer determinado | dist + debugger + DevTools | Lo logra eventualmente sin importar mitigacion |
|
|
1058
|
+
|
|
1059
|
+
**Lo que protege un mecanismo razonable:**
|
|
1060
|
+
- Casual copy (alguien abre el archivo, copia el prompt, ya
|
|
1061
|
+
esta). Mitigacion barata previene el 90% de los casos.
|
|
1062
|
+
|
|
1063
|
+
**Lo que NO se puede proteger 100%:**
|
|
1064
|
+
- Reverse engineering determinado de un binario distribuido.
|
|
1065
|
+
Cualquier mecanismo de cifrado + license-gating se crackea
|
|
1066
|
+
con tiempo + skill suficiente.
|
|
1067
|
+
|
|
1068
|
+
**Conclusion:** la proteccion eleva el costo del ataque
|
|
1069
|
+
hasta que no vale la pena. No la lleva a infinito.
|
|
1070
|
+
|
|
1071
|
+
### 8.4 Opciones de proteccion -- decision tomada (Opcion A)
|
|
1072
|
+
|
|
1073
|
+
**Pablo eligio Opcion A el 2026-05-25.** Las otras tres
|
|
1074
|
+
opciones quedan documentadas como historico para futuro
|
|
1075
|
+
contexto. El diseno completo de la implementacion vive en
|
|
1076
|
+
`docs/HITO_4_STRATEGIC_ASSETS.md`.
|
|
1077
|
+
|
|
1078
|
+
#### Opcion A -- Server-side prompt composition (ELEGIDA)
|
|
1079
|
+
|
|
1080
|
+
- Los Tier-1 prompts viven en un servidor central de Yujin
|
|
1081
|
+
(`prompts.yujin.app/api/v1/...`).
|
|
1082
|
+
- Forge cliente NUNCA tiene los prompts. Cuando necesita
|
|
1083
|
+
extract / plan / recap-summary, llama a:
|
|
1084
|
+
`POST https://prompts.yujin.app/api/v1/spec-extract`
|
|
1085
|
+
con `{ flat_text, title, language, license_key }`.
|
|
1086
|
+
- El server compone el prompt + llama a Claude + devuelve
|
|
1087
|
+
el resultado validado.
|
|
1088
|
+
- **Pros:** prompt nunca sale del server; rotacion central
|
|
1089
|
+
(un cambio en el prompt se propaga sin re-publish a npm);
|
|
1090
|
+
rate-limiting + abuse-blocking centralizado; A/B testing
|
|
1091
|
+
trivial.
|
|
1092
|
+
- **Cons:** requiere infra Yujin always-on; latencia extra
|
|
1093
|
+
(1 hop ida-vuelta); air-gapped deployments imposibles;
|
|
1094
|
+
privacy concern (el spec del cliente pasa por nuestro
|
|
1095
|
+
server).
|
|
1096
|
+
|
|
1097
|
+
#### Opcion B -- Bundle encryption + license-gated decryption
|
|
1098
|
+
|
|
1099
|
+
- Los Tier-1 prompts viven en `dist/` cifrados con AES-256-GCM.
|
|
1100
|
+
- La key de decryption llega del license server al boot
|
|
1101
|
+
(`yf license activate` la cachea localmente).
|
|
1102
|
+
- Sin licencia valida, prompts inutilizables.
|
|
1103
|
+
- **Pros:** funciona offline despues del first activation;
|
|
1104
|
+
no requiere server runtime para cada extract; respeta
|
|
1105
|
+
privacy del spec del adopter.
|
|
1106
|
+
- **Cons:** cualquier debugger atrapa el plaintext en
|
|
1107
|
+
memoria post-decrypt; obfuscacion del decryptor lo demora
|
|
1108
|
+
pero no lo previene; complica el build pipeline.
|
|
1109
|
+
|
|
1110
|
+
#### Opcion C -- Hybrid (publica surface + private kernel)
|
|
1111
|
+
|
|
1112
|
+
- El kernel critico (prompts + heuristicas tier-1) sirve
|
|
1113
|
+
via API como en A.
|
|
1114
|
+
- El resto (CLI, reader, voice subsystem, vault) queda en
|
|
1115
|
+
npm publico.
|
|
1116
|
+
- Marketing: "Forge open framework + Yujin Engine premium".
|
|
1117
|
+
- **Pros:** combina lo mejor de A + adopcion open-source;
|
|
1118
|
+
permite ecosistema sin perder secret sauce.
|
|
1119
|
+
- **Cons:** misma latency + always-on que A para los flows
|
|
1120
|
+
Claude-driven; complica el messaging comercial.
|
|
1121
|
+
|
|
1122
|
+
#### Opcion D -- Obfuscacion sola (NO recomendada, NO elegida)
|
|
1123
|
+
|
|
1124
|
+
- Code obfuscation del bundle, strings encoded en base64 +
|
|
1125
|
+
XOR-mask, runtime decode.
|
|
1126
|
+
- **Pros:** trivial de implementar; sin infra.
|
|
1127
|
+
- **Cons:** se crackea en una tarde con DevTools; no es
|
|
1128
|
+
proteccion, es teatro de seguridad. Solo aceptable como
|
|
1129
|
+
capa adicional encima de A o B.
|
|
1130
|
+
|
|
1131
|
+
#### Notas sobre la decision Opcion A
|
|
1132
|
+
|
|
1133
|
+
- **Infra requerida:** servidor central `prompts.yujin.app`
|
|
1134
|
+
o equivalente. Ya alineada con HITO 3 license server (que
|
|
1135
|
+
vive en el CRM Yujin segun decision 2026-05-23).
|
|
1136
|
+
- **Latency budget:** un extra hop ida-vuelta. Para flows
|
|
1137
|
+
Claude (extract / plan / recap summary) que ya tardan
|
|
1138
|
+
varios segundos, +200ms es invisible. Para flows no-Claude
|
|
1139
|
+
(no aplica) no afecta.
|
|
1140
|
+
- **Privacy del spec del adopter:** el `flat_text` del spec
|
|
1141
|
+
va a nuestro server. Documentar esto en
|
|
1142
|
+
`PRIVACY_POLICY.md` antes de GA. Adopters institucionales
|
|
1143
|
+
(ADIP) pueden tener clausula de no-retencion en su
|
|
1144
|
+
contrato.
|
|
1145
|
+
- **Air-gapped deployment:** NO soportado en HITO 4 inicial.
|
|
1146
|
+
Si una institucion lo pide, evaluar Opcion B selectivamente
|
|
1147
|
+
para esos clientes (license-tier especifico).
|
|
1148
|
+
- **Failover:** si `prompts.yujin.app` esta down, Forge
|
|
1149
|
+
cliente reporta error claro -- NO hace fallback a un prompt
|
|
1150
|
+
local (eso violaria toda la proteccion).
|
|
1151
|
+
|
|
1152
|
+
### 8.5 Reglas hasta que se implemente la opcion elegida
|
|
1153
|
+
|
|
1154
|
+
Mientras el mecanismo de 8.4 esta en desarrollo:
|
|
1155
|
+
|
|
1156
|
+
1. **No agregar nuevos Tier-1 assets en plaintext al
|
|
1157
|
+
`src/`.** Si un slice necesita un prompt nuevo, escribirlo
|
|
1158
|
+
en un archivo separado en `src/_secret_pending/` con
|
|
1159
|
+
header `*** TIER-1 STRATEGIC ASSET -- DO NOT PUBLISH ***`
|
|
1160
|
+
+ un TODO de migracion a la opcion elegida.
|
|
1161
|
+
|
|
1162
|
+
2. **El npm publish gate (prepublishOnly) corre un linter
|
|
1163
|
+
que rechaza `src/_secret_pending/` en el dist.** Eso
|
|
1164
|
+
bloquea publish accidental hasta que el asset migre a la
|
|
1165
|
+
solucion definitiva.
|
|
1166
|
+
|
|
1167
|
+
3. **Documentar en cada commit que toca un Tier-1 asset:**
|
|
1168
|
+
"Tier-1 strategic asset modified. Threat exposure
|
|
1169
|
+
acknowledged per SQ sec 8.3."
|
|
1170
|
+
|
|
1171
|
+
4. **No agregar nuevos system prompts a archivos publicos.**
|
|
1172
|
+
Si un nuevo flow Claude-driven aparece, pedir a Pablo la
|
|
1173
|
+
decision: server-side ya, plaintext con warning, o
|
|
1174
|
+
diferir el slice.
|
|
1175
|
+
|
|
1176
|
+
### 8.6 Migracion futura (post-decision)
|
|
1177
|
+
|
|
1178
|
+
Cuando Pablo elija opcion A / B / C:
|
|
1179
|
+
|
|
1180
|
+
1. Listar todos los Tier-1 assets actualmente en `src/`.
|
|
1181
|
+
2. Diseñar el mecanismo elegido (server endpoints o
|
|
1182
|
+
encryption layout).
|
|
1183
|
+
3. Implementar el mecanismo en una HITO dedicada (HITO 4
|
|
1184
|
+
"Strategic asset isolation" propuesto).
|
|
1185
|
+
4. Migrar uno a uno los assets, con tests E2E que verifican
|
|
1186
|
+
que el flow sigue funcionando.
|
|
1187
|
+
5. Republicar a npm como version major (`v0.3.0-alpha.0`)
|
|
1188
|
+
con changelog explicito: "Forge ahora requiere licencia
|
|
1189
|
+
valida para los flows Claude-driven."
|
|
1190
|
+
6. Adopters existentes mantienen acceso porque su license
|
|
1191
|
+
sigue valida; nuevos adopters obtienen el binario sin
|
|
1192
|
+
los assets sensitive incluidos.
|
|
1193
|
+
|
|
1194
|
+
---
|
|
1195
|
+
|
|
1196
|
+
## 9. Convivencia con el `PROJECT.md`
|
|
1197
|
+
|
|
1198
|
+
El `PROJECT.md` del proyecto es **topologico + procesal** (que
|
|
1199
|
+
hay, donde, como se mueve). Este `SQ.md` es **normativo** (que
|
|
1200
|
+
calidad debe tener todo lo que se hace).
|
|
1201
|
+
|
|
1202
|
+
Cuando hay conflicto:
|
|
1203
|
+
|
|
1204
|
+
- Si es sobre **topologia o proceso** → `PROJECT.md` gana.
|
|
1205
|
+
- Si es sobre **calidad o normas de conducta** → `SQ.md`
|
|
1206
|
+
gana.
|
|
1207
|
+
- Si es sobre **una preferencia personal** que un colaborador
|
|
1208
|
+
intenta imponer → ambos docs ganan, el colaborador se ajusta.
|
|
1209
|
+
|
|
1210
|
+
---
|
|
1211
|
+
|
|
1212
|
+
## 14. Producer/Consumer Symmetry (mandatory, auto-enforced)
|
|
1213
|
+
|
|
1214
|
+
Cualquier cambio que toque una **estructura compartida** EXIGE
|
|
1215
|
+
que el commit asegure simetria producer/consumer. Estructuras
|
|
1216
|
+
compartidas incluyen (no es lista cerrada):
|
|
1217
|
+
|
|
1218
|
+
- Vault slots (`google_voice`, `github_token`, etc)
|
|
1219
|
+
- JSON keys en archivos de config persistidos
|
|
1220
|
+
(`provider_keys.json`, `yujin.forge.json`, `license.json`)
|
|
1221
|
+
- Env vars (`ANTHROPIC_API_KEY`, `YF_MODE`, etc)
|
|
1222
|
+
- Tool names del catalogo de chat (`forge_X`)
|
|
1223
|
+
- Type identifiers exportados desde `src/types/`
|
|
1224
|
+
- Endpoint contracts (`/api/voice/stt`, `/api/forge/tool`, etc)
|
|
1225
|
+
- Manifest fields (`data-nac-id`, `data-nac-role`, etc)
|
|
1226
|
+
|
|
1227
|
+
### 14.1 Auto-enforcement (cero pregunta al usuario)
|
|
1228
|
+
|
|
1229
|
+
Forge es responsable de la simetria, NO el usuario. Pasos
|
|
1230
|
+
obligatorios antes de cualquier commit que toque write paths
|
|
1231
|
+
de estos conceptos:
|
|
1232
|
+
|
|
1233
|
+
1. **Audit:** Forge corre `forge_audit_consumers(<concepto>)`.
|
|
1234
|
+
2. **Sync:** Si hay readers desincronizados, Forge los actualiza
|
|
1235
|
+
en el MISMO commit. No espera siguiente sesion.
|
|
1236
|
+
3. **Test:** Forge garantiza la existencia de un test en
|
|
1237
|
+
`tests/fresh-user/<concepto>.test.ts` que (a) limpia el
|
|
1238
|
+
estado, (b) escribe el lado productor, (c) instancia el
|
|
1239
|
+
consumer, (d) afirma que funciona.
|
|
1240
|
+
4. **Commit:** El mensaje del commit lista los consumers
|
|
1241
|
+
sincronizados.
|
|
1242
|
+
|
|
1243
|
+
El usuario nunca es consultado en este flujo. Si el audit
|
|
1244
|
+
revela algo legitimamente ambiguo (ej. una migracion de
|
|
1245
|
+
contrato con back-compat), Forge SI pregunta -- pero la
|
|
1246
|
+
pregunta es FUNCIONAL ("mantenemos compatibilidad con
|
|
1247
|
+
usuarios viejos?"), no tecnica ("cual reader actualizo?").
|
|
1248
|
+
|
|
1249
|
+
### 14.2 GOTCHAS log obligatorio
|
|
1250
|
+
|
|
1251
|
+
Cada regresion de tipo AP-1 que llega a una version publicada
|
|
1252
|
+
se anota en `docs/GOTCHAS.md` con:
|
|
1253
|
+
|
|
1254
|
+
- Sintoma user-visible (texto literal del error / screenshot)
|
|
1255
|
+
- Causa raiz estructural
|
|
1256
|
+
- Patch (commit hash)
|
|
1257
|
+
- Como Forge previene la recurrencia
|
|
1258
|
+
|
|
1259
|
+
Forge lee `GOTCHAS.md` al boot. Cuando un cambio diff matchea
|
|
1260
|
+
un patron registrado, refuse el commit y enlaza a la entrada.
|
|
1261
|
+
|
|
1262
|
+
### 14.3 Que pasa si Forge ignora esta regla
|
|
1263
|
+
|
|
1264
|
+
- Bug AP-1 en alpha: commit que lo detecta tiene que rollback.
|
|
1265
|
+
- Bug AP-1 en stable: ademas, anotacion en GOTCHAS con
|
|
1266
|
+
`published: true` flag, alarma en el panel para el proximo
|
|
1267
|
+
uso del producer.
|
|
1268
|
+
- Tres bugs AP-1 en una semana: pause del autopilot, hand-off
|
|
1269
|
+
manual hasta que se audite la causa de no-deteccion.
|
|
1270
|
+
|
|
1271
|
+
### 14.4 Por que esta seccion (origen historico)
|
|
1272
|
+
|
|
1273
|
+
2026-05-29: el BYOK refactor (`yf keys setup` ->
|
|
1274
|
+
`provider_keys.json`) shippeo en alpha.4 con tres consumers
|
|
1275
|
+
sin actualizar. Sumi parche alpha.5, alpha.7, alpha.8 cada
|
|
1276
|
+
una al consumer siguiente que el usuario tropezo. Pablo
|
|
1277
|
+
flageo el patron y pidio que Forge no lo cometa.
|
|
1278
|
+
|
|
1279
|
+
Esta seccion + el tool `forge_audit_consumers` + los tests
|
|
1280
|
+
`tests/fresh-user/byok-*.test.ts` son la respuesta. Ver
|
|
1281
|
+
`docs/GOTCHAS.md` entries G-2026-05-29 a/b/c.
|
|
1282
|
+
|
|
1283
|
+
---
|
|
1284
|
+
|
|
1285
|
+
## 15. Autonomia: Forge testea por si mismo
|
|
1286
|
+
|
|
1287
|
+
**Principio central (2026-05-31, Pablo lockeo):**
|
|
1288
|
+
|
|
1289
|
+
> "Menor friccion y ruido posible. El tiempo del user es para
|
|
1290
|
+
> juicio y decisiones, no para reproducir bugs o ejecutar
|
|
1291
|
+
> comandos."
|
|
1292
|
+
|
|
1293
|
+
Forge -- y el agente Sumi que opera Forge en sesion -- deben
|
|
1294
|
+
testear autonomamente todo lo que puedan, antes de pedirle al
|
|
1295
|
+
user que corra algo. Cada vez que el agente esta por preguntar
|
|
1296
|
+
"podes correr X y pegarme el output?", parar y reescribir como
|
|
1297
|
+
"voy a correr X yo, capturar output, diagnosticar".
|
|
1298
|
+
|
|
1299
|
+
### 15.1 Que puede testear Forge solo
|
|
1300
|
+
|
|
1301
|
+
**CLI smoke tests:** correr `yf <cualquier comando>` directamente
|
|
1302
|
+
via shell. Capturar exit code + stdout + stderr.
|
|
1303
|
+
|
|
1304
|
+
**Browser-based UI (chat panel, voice loop, DevTools console):**
|
|
1305
|
+
levantar el servidor con `yf chat --no-open` y testear:
|
|
1306
|
+
- WebSocket: simular cliente con `ws` lib, mandar mensajes,
|
|
1307
|
+
inspeccionar respuestas.
|
|
1308
|
+
- Voice loop: capturar logs del proceso, no del DevTools (la
|
|
1309
|
+
consola del browser duplica lo que ya escribimos a stdout).
|
|
1310
|
+
- Playwright headless para clicks de UI cuando aplica.
|
|
1311
|
+
|
|
1312
|
+
**API endpoints:** curl / fetch directos contra:
|
|
1313
|
+
- Worker `yujin-hito4` deployado.
|
|
1314
|
+
- Chat server local.
|
|
1315
|
+
- Polar webhook (con stub firmado).
|
|
1316
|
+
|
|
1317
|
+
**End-to-end commerciales:** stub fixtures + correr el flow
|
|
1318
|
+
con HTTP fake. Sin esperar a que el user compre / pague /
|
|
1319
|
+
reciba email.
|
|
1320
|
+
|
|
1321
|
+
**Builds:** disparar el comando (`npm publish --dry-run`,
|
|
1322
|
+
`eas build`, `wrangler deploy`) y esperar el resultado.
|
|
1323
|
+
|
|
1324
|
+
**Logs runtime:** parsear `logs/forge.log` y `~/.yujin-forge/usage.jsonl`
|
|
1325
|
+
directamente.
|
|
1326
|
+
|
|
1327
|
+
### 15.2 Cuando SI involucrar al user
|
|
1328
|
+
|
|
1329
|
+
Acciones que el agente fisicamente no puede hacer:
|
|
1330
|
+
|
|
1331
|
+
- **Touch hardware:** microfono real, camara real (la grabacion
|
|
1332
|
+
WebM sintetica se procesa distinto que un audio real con
|
|
1333
|
+
ruido ambiente, eco, codec).
|
|
1334
|
+
- **Juicio subjetivo:** "este copy suena natural?", "este
|
|
1335
|
+
layout queda bien?", "este precio te parece razonable?".
|
|
1336
|
+
- **Decisiones comerciales:** $$$, scope, lock-in con un
|
|
1337
|
+
proveedor, comprar credito de EAS / Anthropic / Polar.
|
|
1338
|
+
- **Acceso a infra externa con creds que solo el user tiene:**
|
|
1339
|
+
Polar dashboard manual, panel admin de GoDaddy, AWS root.
|
|
1340
|
+
|
|
1341
|
+
### 15.3 Cuando NO involucrar al user
|
|
1342
|
+
|
|
1343
|
+
Anti-pattern: pedir al user que reproduzca un bug paso a paso.
|
|
1344
|
+
|
|
1345
|
+
- "Podes abrir el chat, hablar, y pegarme el log?" -> NO.
|
|
1346
|
+
Forge levanta el chat headless, simula audio, captura log.
|
|
1347
|
+
- "Podes correr `yf license sync --verbose`?" -> NO. Forge
|
|
1348
|
+
corre el comando, lee stdout, diagnostica.
|
|
1349
|
+
- "Podes verificar que aparecio `paid`?" -> NO. Forge lee
|
|
1350
|
+
`~/.yujin-forge/license.json` directo y verifica.
|
|
1351
|
+
|
|
1352
|
+
### 15.4 Cuando el test autonomo NO es suficiente
|
|
1353
|
+
|
|
1354
|
+
Si despues del test autonomo el bug sigue apareciendo solo en
|
|
1355
|
+
la maquina del user (no en la del agente), entonces:
|
|
1356
|
+
|
|
1357
|
+
1. Capturar **diff de ambiente** primero: node version, OS,
|
|
1358
|
+
shell, vars de env relevantes, contenido de
|
|
1359
|
+
`~/.yujin-forge/*`. El agente puede pedir esto via un
|
|
1360
|
+
comando `yf doctor --detailed` que vuelque todo.
|
|
1361
|
+
2. Solo entonces pedir al user un paso especifico, con un
|
|
1362
|
+
comando exacto que produce un artifact concreto que el
|
|
1363
|
+
agente despues lee + diagnostica.
|
|
1364
|
+
|
|
1365
|
+
### 15.5 Como Forge mismo aplica esta regla con sus users
|
|
1366
|
+
|
|
1367
|
+
Cuando un user instala Forge y le pide que diagnostique algo,
|
|
1368
|
+
Forge corre los tests + reporta el diagnostico. No le pide al
|
|
1369
|
+
user "podes correr X y pegarme el output".
|
|
1370
|
+
|
|
1371
|
+
Esto se manifiesta en:
|
|
1372
|
+
- El system prompt del chat shell (`buildSystemPrompt`)
|
|
1373
|
+
incluye la regla "test things yourself" como principio
|
|
1374
|
+
numero 1.
|
|
1375
|
+
- Los tools `forge_*` capturan logs autonomamente sin pedir
|
|
1376
|
+
al user.
|
|
1377
|
+
- Los flows del worker `yujin-hito4` corren los tests +
|
|
1378
|
+
devuelven el reporte; el user solo ve la conclusion.
|
|
1379
|
+
|
|
1380
|
+
### 15.6 Origen historico
|
|
1381
|
+
|
|
1382
|
+
2026-05-31: Pablo flageo que Sumi le pedia tests reproducibles
|
|
1383
|
+
(DevTools console, comandos CLI) que Sumi podia correr solo.
|
|
1384
|
+
Pablo nota: "no estare todo el dia. Aprovecha esa facilidad
|
|
1385
|
+
para optimizar mis tiempos."
|
|
1386
|
+
|
|
1387
|
+
Pablo despues extendio: "trasladalo a Forge, dado que es lo
|
|
1388
|
+
que pretendemos, menor friccion y ruido posible." Esta seccion
|
|
1389
|
+
+ la actualizacion del system prompt son la respuesta.
|
|
1390
|
+
|
|
1391
|
+
---
|
|
1392
|
+
|
|
1393
|
+
*Ultima revision: 2026-05-31 (adicion sec 15 -- autonomia).*
|
|
1394
|
+
|
|
1395
|
+
*Actualizar este archivo en el mismo commit que cualquier
|
|
1396
|
+
cambio de norma de calidad o entregable. Cambios sustanciales
|
|
1397
|
+
requieren acuerdo explicito de Pablo (mantenedor).*
|