god-code 0.9.2__tar.gz → 1.0.0rc1__tar.gz

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.
Files changed (261) hide show
  1. {god_code-0.9.2 → god_code-1.0.0rc1}/.gitignore +1 -0
  2. god_code-1.0.0rc1/.gitleaks.toml +30 -0
  3. god_code-1.0.0rc1/CHANGELOG.md +125 -0
  4. {god_code-0.9.2 → god_code-1.0.0rc1}/PKG-INFO +1 -1
  5. god_code-1.0.0rc1/docs/plans/2026-04-07-god-code-prelaunch-security-audit-report.md +242 -0
  6. god_code-1.0.0rc1/docs/plans/2026-04-07-v1.0.0-ux-upgrade-design.md +687 -0
  7. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/configs.py +22 -2
  8. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/commands.py +101 -6
  9. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/streaming.py +4 -0
  10. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/types.py +28 -0
  11. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/config.py +1 -1
  12. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/engine.py +43 -2
  13. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/display.py +127 -30
  14. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/input_handler.py +9 -3
  15. {god_code-0.9.2 → god_code-1.0.0rc1}/pyproject.toml +1 -1
  16. god_code-1.0.0rc1/scripts/install-hooks.sh +37 -0
  17. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/agents/test_dispatcher.py +28 -0
  18. god_code-1.0.0rc1/tests/llm/test_streaming.py +138 -0
  19. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_config.py +12 -0
  20. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_engine.py +30 -0
  21. god_code-1.0.0rc1/tests/tui/test_display.py +126 -0
  22. god_code-0.9.2/CHANGELOG.md +0 -60
  23. god_code-0.9.2/tests/tui/test_display.py +0 -18
  24. {god_code-0.9.2 → god_code-1.0.0rc1}/.codetape/component-map.json +0 -0
  25. {god_code-0.9.2 → god_code-1.0.0rc1}/.codetape/config.json +0 -0
  26. {god_code-0.9.2 → god_code-1.0.0rc1}/.github/FUNDING.yml +0 -0
  27. {god_code-0.9.2 → god_code-1.0.0rc1}/.github/workflows/docs.yml +0 -0
  28. {god_code-0.9.2 → god_code-1.0.0rc1}/.github/workflows/publish.yml +0 -0
  29. {god_code-0.9.2 → god_code-1.0.0rc1}/AGENTS.md +0 -0
  30. {god_code-0.9.2 → god_code-1.0.0rc1}/CLAUDE.md +0 -0
  31. {god_code-0.9.2 → god_code-1.0.0rc1}/CONTRIBUTING.md +0 -0
  32. {god_code-0.9.2 → god_code-1.0.0rc1}/LICENSE +0 -0
  33. {god_code-0.9.2 → god_code-1.0.0rc1}/PRIVACY.md +0 -0
  34. {god_code-0.9.2 → god_code-1.0.0rc1}/README.md +0 -0
  35. {god_code-0.9.2 → god_code-1.0.0rc1}/SECURITY.md +0 -0
  36. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/cli/ask.md +0 -0
  37. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/cli/chat.md +0 -0
  38. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/empty-project-to-first-verified-change.md +0 -0
  39. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/gameplay-intent-and-enemy-ai-roadmap.md +0 -0
  40. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/getting-started/first-run.md +0 -0
  41. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/getting-started/install.md +0 -0
  42. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/index.md +0 -0
  43. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/mcp/overview.md +0 -0
  44. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-api-backend-design.md +0 -0
  45. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-api-backend-impl.md +0 -0
  46. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-bullet-hell-sprite-qa-demo-polish-backlog.md +0 -0
  47. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-04-demo-ready-upgrade.md +0 -0
  48. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-dogfooding-inventory.md +0 -0
  49. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-v08-design.md +0 -0
  50. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-v08-impl.md +0 -0
  51. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-05-work-status.md +0 -0
  52. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-06-auto-flow-impl.md +0 -0
  53. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-06-interactive-ux-redesign.md +0 -0
  54. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-07-god-code-prelaunch-security-audit-design.md +0 -0
  55. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/plans/2026-04-07-god-code-prelaunch-security-audit.md +0 -0
  56. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/providers/byok-and-oauth.md +0 -0
  57. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/tui/menu-and-commands.md +0 -0
  58. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/tui/settings-and-byok.md +0 -0
  59. {god_code-0.9.2 → god_code-1.0.0rc1}/docs/validation/quality-gate.md +0 -0
  60. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/__init__.py +0 -0
  61. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/addons/god_code_bridge/god_code_bridge.gd +0 -0
  62. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/addons/god_code_bridge/plugin.cfg +0 -0
  63. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/__init__.py +0 -0
  64. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/dispatcher.py +0 -0
  65. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/agents/results.py +0 -0
  66. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/__init__.py +0 -0
  67. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/__main__.py +0 -0
  68. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/engine_wiring.py +0 -0
  69. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/helpers.py +0 -0
  70. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/cli/menus.py +0 -0
  71. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/entrypoint.py +0 -0
  72. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/__init__.py +0 -0
  73. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/audio_scaffolder.py +0 -0
  74. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/collision_planner.py +0 -0
  75. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/consistency_checker.py +0 -0
  76. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/dependency_graph.py +0 -0
  77. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/gdscript_linter.py +0 -0
  78. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/impact_analysis.py +0 -0
  79. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/pattern_advisor.py +0 -0
  80. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/project.py +0 -0
  81. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/resource_validator.py +0 -0
  82. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/scene_parser.py +0 -0
  83. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/scene_writer.py +0 -0
  84. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/tscn_validator.py +0 -0
  85. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/ui_layout_advisor.py +0 -0
  86. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/godot/variant_codec.py +0 -0
  87. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/__init__.py +0 -0
  88. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/__init__.py +0 -0
  89. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/anthropic.py +0 -0
  90. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/base.py +0 -0
  91. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/adapters/openai.py +0 -0
  92. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/client.py +0 -0
  93. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/redact.py +0 -0
  94. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/llm/vision.py +0 -0
  95. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/mcp_server.py +0 -0
  96. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/__init__.py +0 -0
  97. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/assembler.py +0 -0
  98. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/build_discipline.py +0 -0
  99. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/genre_templates.py +0 -0
  100. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/godot_playbook.py +0 -0
  101. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/image_templates.py +0 -0
  102. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/knowledge_selector.py +0 -0
  103. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/skill_library.py +0 -0
  104. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/skill_selector.py +0 -0
  105. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/system.py +0 -0
  106. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/prompts/vision_templates.py +0 -0
  107. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/py.typed +0 -0
  108. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/__init__.py +0 -0
  109. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/auth.py +0 -0
  110. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/context_health.py +0 -0
  111. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/context_manager.py +0 -0
  112. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/design_memory.py +0 -0
  113. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/error_loop.py +0 -0
  114. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/events.py +0 -0
  115. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/execution_plan.py +0 -0
  116. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/gameplay_reviewer.py +0 -0
  117. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/intent_resolver.py +0 -0
  118. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/live_client.py +0 -0
  119. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/modes.py +0 -0
  120. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/oauth.py +0 -0
  121. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/playtest_harness.py +0 -0
  122. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/polish_rubric.py +0 -0
  123. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/providers.py +0 -0
  124. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/quality_gate.py +0 -0
  125. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/reviewer.py +0 -0
  126. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/runtime_bridge.py +0 -0
  127. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_pattern_readability.json +0 -0
  128. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_phase_transition.json +0 -0
  129. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/bullet_hell_wave_progression.json +0 -0
  130. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_boss_transition.json +0 -0
  131. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_combat_feedback.json +0 -0
  132. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_ui_readability.json +0 -0
  133. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/demo_wave_pacing.json +0 -0
  134. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/hud_feedback.json +0 -0
  135. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/platformer_enemy_gap_jump.json +0 -0
  136. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/platformer_enemy_patrol_response.json +0 -0
  137. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/player_movement.json +0 -0
  138. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/scene_transition.json +0 -0
  139. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/topdown_shooter_flank_resolution.json +0 -0
  140. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/scenario_specs/topdown_shooter_pressure.json +0 -0
  141. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/session.py +0 -0
  142. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/validation_checks.py +0 -0
  143. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/runtime/visual_regression.py +0 -0
  144. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/__init__.py +0 -0
  145. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/classifier.py +0 -0
  146. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/hooks.py +0 -0
  147. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/policies.py +0 -0
  148. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/protected_paths.py +0 -0
  149. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/security/tool_pipeline.py +0 -0
  150. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/testing/__init__.py +0 -0
  151. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/testing/scenario_runner.py +0 -0
  152. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/__init__.py +0 -0
  153. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/analysis_tools.py +0 -0
  154. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/base.py +0 -0
  155. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/editor_bridge.py +0 -0
  156. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/file_ops.py +0 -0
  157. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/git.py +0 -0
  158. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/godot_cli.py +0 -0
  159. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/image_gen.py +0 -0
  160. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/list_dir.py +0 -0
  161. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/memory_tool.py +0 -0
  162. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/registry.py +0 -0
  163. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/runtime_harness.py +0 -0
  164. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/scene_tools.py +0 -0
  165. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/screenshot.py +0 -0
  166. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/script_tools.py +0 -0
  167. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/search.py +0 -0
  168. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/shell.py +0 -0
  169. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/sprite_pipeline.py +0 -0
  170. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/sprite_qa.py +0 -0
  171. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/vision_analysis.py +0 -0
  172. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/vision_scoring.py +0 -0
  173. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tools/web_search.py +0 -0
  174. {god_code-0.9.2 → god_code-1.0.0rc1}/godot_agent/tui/__init__.py +0 -0
  175. {god_code-0.9.2 → god_code-1.0.0rc1}/mkdocs.yml +0 -0
  176. {god_code-0.9.2 → god_code-1.0.0rc1}/scripts/vision_model_comparison.py +0 -0
  177. {god_code-0.9.2 → god_code-1.0.0rc1}/skills/god-code-setup/SKILL.md +0 -0
  178. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/__init__.py +0 -0
  179. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/agents/test_playtest_analyst.py +0 -0
  180. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli/__init__.py +0 -0
  181. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli/test_setup_bridge.py +0 -0
  182. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/cli_test_utils.py +0 -0
  183. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_planner_worker_reviewer_flow.py +0 -0
  184. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_policy_enforcement.py +0 -0
  185. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/e2e/test_scenario_runner.py +0 -0
  186. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/fuzz/test_input_sequences.py +0 -0
  187. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/__init__.py +0 -0
  188. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_audio_scaffolder.py +0 -0
  189. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_collision_planner.py +0 -0
  190. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_consistency.py +0 -0
  191. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_dependency_graph.py +0 -0
  192. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_impact_analysis.py +0 -0
  193. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_linter.py +0 -0
  194. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_pattern_advisor.py +0 -0
  195. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_project.py +0 -0
  196. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_resource_validator.py +0 -0
  197. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_scene_parser.py +0 -0
  198. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_scene_writer.py +0 -0
  199. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_tscn_validator.py +0 -0
  200. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_ui_layout_advisor.py +0 -0
  201. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/godot/test_variant_codec.py +0 -0
  202. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/__init__.py +0 -0
  203. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_adapters.py +0 -0
  204. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_client.py +0 -0
  205. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/llm/test_vision.py +0 -0
  206. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/__init__.py +0 -0
  207. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_genre_templates.py +0 -0
  208. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_knowledge_selector.py +0 -0
  209. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_prompt_assembler.py +0 -0
  210. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_skill_selector.py +0 -0
  211. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_system_prompt.py +0 -0
  212. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/prompts/test_vision_templates.py +0 -0
  213. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/__init__.py +0 -0
  214. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_context_health.py +0 -0
  215. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_context_manager.py +0 -0
  216. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_design_memory.py +0 -0
  217. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_error_loop.py +0 -0
  218. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_execution_plan.py +0 -0
  219. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_gameplay_reviewer.py +0 -0
  220. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_intent_resolver.py +0 -0
  221. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_live_client.py +0 -0
  222. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_mode_restrictions.py +0 -0
  223. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_multi_agent_flow.py +0 -0
  224. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_playtest_harness.py +0 -0
  225. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_quality_gate.py +0 -0
  226. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_reviewer.py +0 -0
  227. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_runtime_bridge.py +0 -0
  228. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_session.py +0 -0
  229. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_validation_checks.py +0 -0
  230. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/runtime/test_visual_regression.py +0 -0
  231. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_classifier.py +0 -0
  232. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_hooks.py +0 -0
  233. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_permissions.py +0 -0
  234. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/security/test_tool_pipeline.py +0 -0
  235. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_auto_flow.py +0 -0
  236. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_cli_config_flow.py +0 -0
  237. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_cli_interactive_flows.py +0 -0
  238. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_e2e.py +0 -0
  239. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_package_compatibility.py +0 -0
  240. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/test_runtime_switch_commands.py +0 -0
  241. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/__init__.py +0 -0
  242. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_analysis_tools.py +0 -0
  243. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_editor_bridge.py +0 -0
  244. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_file_ops.py +0 -0
  245. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_git.py +0 -0
  246. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_godot_cli.py +0 -0
  247. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_list_dir.py +0 -0
  248. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_memory_tool.py +0 -0
  249. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_registry.py +0 -0
  250. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_runtime_harness.py +0 -0
  251. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_scene_tools.py +0 -0
  252. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_screenshot_tool.py +0 -0
  253. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_script_tools.py +0 -0
  254. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_search.py +0 -0
  255. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_shell.py +0 -0
  256. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_sprite_qa.py +0 -0
  257. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_vision_analysis.py +0 -0
  258. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tools/test_vision_scoring.py +0 -0
  259. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/__init__.py +0 -0
  260. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/test_input_handler.py +0 -0
  261. {god_code-0.9.2 → god_code-1.0.0rc1}/tests/tui/test_plan_display.py +0 -0
@@ -14,3 +14,4 @@ auth.json
14
14
  .codetape/drift.json
15
15
  site/
16
16
  .audit/
17
+ .worktrees/
@@ -0,0 +1,30 @@
1
+ # Gitleaks config for god-code
2
+ #
3
+ # Purpose: local pre-commit regression prevention against accidental
4
+ # secret commits. Extends gitleaks default ruleset, plus allowlists
5
+ # for known false positives (docs with example tokens, tests of the
6
+ # secret-masking utility).
7
+ #
8
+ # See https://github.com/gitleaks/gitleaks for config reference.
9
+
10
+ [extend]
11
+ useDefault = true
12
+
13
+ [allowlist]
14
+ description = "god-code global allowlist"
15
+
16
+ paths = [
17
+ # Audit artifacts (local only, gitignored)
18
+ '''\.audit/''',
19
+
20
+ # Design docs may contain example API keys in code blocks
21
+ # (e.g. "backend_api_key=gc_live_testkey123" as documentation).
22
+ # Reviewers must still visually scan any new docs/plans/ additions.
23
+ '''docs/plans/.*\.md''',
24
+
25
+ # Tests for the secret-masking utility. These files exist to verify
26
+ # that secret-shaped strings are properly masked for display, so
27
+ # they intentionally contain fake-but-realistic token literals.
28
+ # If you add NEW files that test masking, extend this list.
29
+ '''tests/test_runtime_switch_commands\.py''',
30
+ ]
@@ -0,0 +1,125 @@
1
+ # Changelog
2
+
3
+ All notable changes to God Code will be documented in this file.
4
+
5
+ ## [1.0.0rc1] — 2026-04-07
6
+
7
+ **v1.0 is the first release where god-code is comfortable to use day-to-day without needing to know its quirks.** This is a coordinated UX overhaul. No new features, no breaking API changes — every change makes the existing tool feel less broken in everyday use.
8
+
9
+ This release closes 27 of 28 UX issues identified in the v1.0 audit (see `docs/plans/2026-04-07-v1.0.0-ux-upgrade-design.md`). The 28th was already fixed in v0.9.2.
10
+
11
+ ### Headline fixes
12
+
13
+ - **Streaming "thinking" indicator** — gpt-5.4 with `reasoning_effort=high` has a 30-60s silent reasoning phase before any token streams. Previously you saw an empty cyan panel and assumed god-code was frozen. Now you see a `thinking…` spinner that animates until the first token arrives. (A1)
14
+ - **`max_tokens` default raised from 16384 → 65536** — long technical reports were silently truncated mid-section because the cap was way below gpt-5.4's 128K output capability. Override with `/set max_tokens 16384` if you prefer the old conservative limit. (B1)
15
+ - **Token count works in backend mode** — `_stream_via_backend` was missing `stream_options.include_usage`, so backend-mode users (anyone with `backend_url` + `gc_live_*`) saw `0 tokens / $0.00` after every turn. Now matches direct-mode behaviour. (B5)
16
+ - **Real Ctrl+C cleanup** — cancelled turns no longer leave their partial messages polluting the next turn's context. New `engine.rollback_current_turn()` drops everything appended since the most recent `submit()` began. (C2)
17
+ - **Tool progress spinner** — long-running tools (validation, sprite generation, screenshot — typically 10-60s) now show an auto-animating spinner via `rich.console.status` instead of going silent between `tool: started` and `tool: ok`. (A2)
18
+ - **Planner agent stops claiming "I'm in PLAN mode"** — the planner sub-agent system prompt was triggering an LLM hallucination where the model would announce "我目前是 PLAN 模式" / "I am in plan mode" in its response, confusing users into thinking the CLI was stuck in plan interaction mode. Prompt rewritten to explicitly disavow that wording and clarify the planner is a sub-agent inside god-code. (F1)
19
+
20
+ ### Fixed (full list — 27 issues across 11 commits)
21
+
22
+ - **A1** Streaming thinking spinner (`tui/display.py`)
23
+ - **A2** Tool execution status spinner
24
+ - **A3** Blank line between successive streamed turns
25
+ - **A4** Planner sub-agent output bracketed with `Rule` separators
26
+ - **A5** Autosave success/failure events + activity log entries
27
+ - **B1** `max_tokens` default 16384 → 65536
28
+ - **B2 / G2** `tool_result_truncated` event when tool output is silently capped
29
+ - **B3** API error detail bumped 200 → 500 chars with `[…truncated]` marker
30
+ - **B4** Tool args truncated at 100 chars to prevent terminal overflow
31
+ - **B5** Backend streaming now sends `stream_options.include_usage`
32
+ - **C1** Diff read failures emit `diff_failed` event instead of `except: pass`
33
+ - **C2** `rollback_current_turn()` cleans message state after Ctrl+C
34
+ - **C4** Version check offline state surfaced as dim activity line
35
+ - **C5** `is_known_model_pricing()` helper; usage line shows `~$unknown` for unknown models
36
+ - **C6** `/resume <invalid_id>` now actionable error
37
+ - **D1** `god-code setup` confirmation prompt before overwriting existing config
38
+ - **D2** Loud yellow warning when Godot binary auto-detection fails
39
+ - **D3** Welcome panel reduced to 4 essential fields
40
+ - **D4** Multiline continuation prompt cancel hint
41
+ - **E1** `/help` table reorganized into 6 sections
42
+ - **E2** Activity log slice mismatch (10 vs 8) fixed
43
+ - **E4** Mode embedded in input prompt with mode-specific colour
44
+ - **F1** Planner prompt rewrite — disavows "PLAN mode" wording
45
+ - **F2** Planner prompt enforces structured output format
46
+ - **G3** New events: `session_autosaved`, `session_autosave_failed`, `diff_failed`, `version_check_offline`, `turn_cancelled`
47
+ - **H2** Tab-completion hint added to welcome banner
48
+
49
+ ### Test count
50
+
51
+ 665 → 681 (+16 regression tests across 5 test files)
52
+
53
+ ### Known scope notes
54
+
55
+ - **C2 partial implementation** — `rollback_current_turn()` cleans up message state but the full `asyncio.create_task` cancellation pattern (true task termination of in-flight HTTP streams and subprocess tools) is deferred to v1.0.1. The existing CLI flow tests depend on the simpler synchronous-await pattern. In practice CPython's signal handling unwinds the await stack on Ctrl+C correctly, so the user-visible behaviour is fixed even without true task termination.
56
+ - **A2 layer 2 deferred** — universal spinner (Layer 1) ships in v1.0.0; per-tool `tool_progress` events for finer-grained reporting (Layer 2) deferred since they require per-tool instrumentation.
57
+ - **Subprocess termination on cancel deferred** — if a tool has already spawned a subprocess (Godot validation, sprite generation), cancelling the Python coroutine doesn't kill the subprocess. v1.0.1 will add per-tool subprocess registration + termination.
58
+
59
+ ### What changed since v0.6.1 (the last PyPI release before v0.9.2)
60
+
61
+ > **PyPI was stuck at v0.6.1 from early April 2026 until v0.9.2 in this same release cycle.** Anyone who installed god-code via `pipx install god-code` between v0.6.1 and v0.9.2 was on a version that predates everything below. v1.0.0rc1 is the first PyPI release that includes all v0.7 / v0.8 / v0.9 / v1.0 work.
62
+
63
+ - **v0.7** — Demo-ready foundation: genre detection (`runtime/intent_resolver.py`), sprite QA pipeline (`tools/sprite_qa.py`), polish rubric, scenario engine (`testing/scenario_runner.py`)
64
+ - **v0.8** — Vision iteration loop (screenshot → analyze → fix → score), live runtime bridge to Godot 4.4 over TCP 9394, backend dual-path LLM client, platform API key auth (`gc_live_*`), CLI package split, ImageChops perf, ValidationSuite
65
+ - **v0.9** — Pre-launch security audit (shell hardening, session paths, MCP path containment, log redaction), OpenAI strict-mode pydantic compatibility, hatch wheel cleanup
66
+ - **v0.9.1** — `assistant_preview` extraction guard against empty LLM responses (was crashing the planner pass)
67
+ - **v0.9.2** — `AgentDispatcher` propagates streaming callbacks to sub-engines (planner pass now streams to TUI instead of blocking 60-120s)
68
+ - **v1.0.0rc1** — this release; the full 27-fix UX overhaul above
69
+
70
+ ## [Unreleased]
71
+
72
+ ### Security
73
+ - **run_shell hardened** against credential exfiltration: subprocess environment is now filtered to drop any variable whose name contains KEY/TOKEN/SECRET/PASSWORD/PASSWD/CREDENTIAL/AUTH/PRIVATE/CERT, and `env`, `printenv`, `set`, `export`, and reads of `.config/god-code`, `.codex/auth`, `.aws/credentials`, `.ssh/id_*`, `.ssh/authorized_keys`, `.netrc`, `.npmrc`, `.pypirc` are now blocked at all safety levels.
74
+ - **Session files** (`~/.agent_sessions/*.json`) are now `chmod 0o600` on write so tool outputs captured in conversation history are not world-readable.
75
+ - **Atomic secure writes** for `~/.config/god-code/config.json` and `~/.config/god-code/auth.json`: files are created via `tempfile` + `os.fchmod(0o600)` + `os.replace`, eliminating the TOCTOU window where an earlier `write_text` produced a briefly 0o644 file.
76
+ - **MCP server path containment**: every `file_path` argument to MCP tools is validated against the active project root with `Path.relative_to`, and a `.gd/.tscn/.tres/.cfg/.gdshader/.json/.md/.txt/.import` extension allowlist, preventing a misbehaving MCP client from reading or writing arbitrary files such as `~/.config/god-code/config.json`.
77
+ - **Prefix confusion fix** in `file_ops._validate_path`: `startswith` replaced with `Path.relative_to`, so a project rooted at `/proj/my-game` no longer accidentally permits access to `/proj/my-game-secrets/`.
78
+ - **Log redaction** (`godot_agent/llm/redact.py`): a new `redact_secrets` helper masks Bearer tokens, `sk-*` keys, `gc_live_*` keys, and JWT triples in any error string before it is handed to `log.error`/`log.warning`. Applied to backend, streaming, and computer-use error paths in `llm/client.py` and `llm/streaming.py`.
79
+
80
+ ### Added
81
+ - Workspace-style chat TUI with session snapshot, recent activity, and live streaming panels
82
+ - Interaction modes (`apply`, `plan`, `explain`, `review`, `fix`) with mode-aware tool availability
83
+ - Autosaved session metadata with `/sessions`, `/resume`, `/new`, and project-aware restore flow
84
+ - Gameplay intent resolver with persistent profile storage in design memory
85
+ - `/intent` commands and TUI intent panel for confirming genre/combat/enemy direction
86
+ - Genre-aware internal skills: `bullet_hell`, `topdown_shooter`, `platformer_enemy`, `tower_defense`, `stealth_guard`
87
+ - Profile-aware playtest selection and report context
88
+ - MkDocs documentation site skeleton with getting-started, TUI, validation, provider, and MCP guides
89
+
90
+ ### Changed
91
+ - Unified `ask` and `chat` rendering pipeline, including tool progress and validation feedback
92
+ - Improved post-tool validation visibility and tool result summaries in interactive sessions
93
+ - Session persistence now preserves assistant tool calls and richer metadata for restore
94
+ - Prompt assembly, skill routing, planner/reviewer/playtest flows, and workspace state now consume shared gameplay intent
95
+
96
+ ## [0.1.0] - 2026-04-02
97
+
98
+ ### Added
99
+ - CLI with `ask`, `chat`, `info`, `login`, `logout`, `status` commands
100
+ - 10 tools: read_file, write_file, edit_file, list_dir, grep, glob, git, run_shell, run_godot, screenshot_scene
101
+ - OpenAI-compatible API client with streaming and vision support
102
+ - OAuth login via Codex CLI refresh token
103
+ - Godot project parser (project.godot, autoloads, resolution)
104
+ - .tscn scene parser, writer, and format validator with auto-fix
105
+ - GDScript linter (naming, ordering, type annotations, anti-patterns)
106
+ - Collision layer planner (standard 8-layer scheme)
107
+ - Cross-file consistency checker (collision, signals, resource paths, groups)
108
+ - Project dependency graph builder
109
+ - Design pattern advisor (object pool, component, state machine)
110
+ - Godot Playbook knowledge system (17 sections, context-aware injection)
111
+ - Build discipline rules (incremental build-and-verify)
112
+ - Error detection loop with Godot output parsing and fix suggestions
113
+ - Conversation context compaction for long sessions
114
+ - Path containment security (file ops restricted to project root)
115
+ - Shell command sandboxing (dangerous pattern blocking)
116
+ - API retry with exponential backoff (429 rate limits)
117
+ - Content filter graceful handling (400 errors)
118
+ - Session persistence to JSON
119
+
120
+ ### Security
121
+ - File operations restricted to project root directory
122
+ - Shell commands blocked for dangerous patterns (rm -rf /, sudo, etc.)
123
+ - Git argument parsing via shlex.split()
124
+ - OAuth tokens stored with 600 permissions
125
+ - API key/token masked in status output
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: god-code
3
- Version: 0.9.2
3
+ Version: 1.0.0rc1
4
4
  Summary: AI coding agent specialized for Godot game development
5
5
  Project-URL: Homepage, https://github.com/888wing/god-code
6
6
  Project-URL: Repository, https://github.com/888wing/god-code
@@ -0,0 +1,242 @@
1
+ # God Code Pre-launch Security Audit Report
2
+
3
+ **Date completed:** 2026-04-07
4
+ **Auditor:** Claude (Opus 4.6) with user-in-loop decisions
5
+ **Design doc:** [`2026-04-07-god-code-prelaunch-security-audit-design.md`](./2026-04-07-god-code-prelaunch-security-audit-design.md) (`95aef4f`)
6
+ **Plan doc:** [`2026-04-07-god-code-prelaunch-security-audit.md`](./2026-04-07-god-code-prelaunch-security-audit.md) (`b4a4f87`)
7
+
8
+ ## Summary
9
+
10
+ **Launch decision: READY.**
11
+
12
+ Three-track audit of `god-code`, `god-code-api`, and `god-code-site` found **zero active security risks**. All three repositories and their published/deployed artifacts are clean of secrets, the backend does not store user content, and the landing page has no tracking or analytics. Pre-launch hardening is complete.
13
+
14
+ **Findings statistics:**
15
+
16
+ | Severity | Count | Status |
17
+ |----------|-------|--------|
18
+ | 🔴 Active leak | 0 | — |
19
+ | 🟠 Serious risk | 0 | — |
20
+ | 🟡 Hygiene | 1 | Corrected (see Audit Correction below) |
21
+ | ℹ️ Informational | 2 | Documented, out of security scope |
22
+
23
+ ## Scope
24
+
25
+ Three audit tracks per the design document:
26
+
27
+ - **Track A** — Secrets in repos and published artifacts
28
+ - **Track B** — Deployment secrets and runtime log hygiene
29
+ - **Track C** — User data handling (CLI, backend, waitlist)
30
+
31
+ The following were explicitly out of scope and deferred to post-launch hardening:
32
+
33
+ - CLI local storage upgrade to OS Keychain
34
+ - OAuth device flow between CLI and godcode.dev
35
+ - Website self-serve key issuance
36
+ - CI integration of `gitleaks` (GitHub Actions)
37
+ - Dependency vulnerability scanning (`pip-audit`, `npm audit`)
38
+ - Rate limiting on `/v1/admin/keys`
39
+ - Responsible disclosure program beyond email contact
40
+
41
+ ## Track A — Repo and published artifact secrets
42
+
43
+ ### A.1 Full-history secret scans (gitleaks)
44
+
45
+ | Repo | Commits scanned | Raw findings | Actionable |
46
+ |------|-----------------|--------------|------------|
47
+ | `god-code` | 110 | 3 | 0 |
48
+ | `god-code-api` | 25 | 1 | 0 |
49
+ | `god-code-site` | 2 | 0 | 0 |
50
+
51
+ All 4 raw findings triaged to false positive:
52
+
53
+ 1. `god-code/docs/plans/2026-04-05-v08-impl.md:761` — `gc_live_testkey123` (design doc example)
54
+ 2. `god-code/docs/plans/2026-04-05-v08-impl.md:809` — `gc_live_xxx` (curl example)
55
+ 3. `god-code/tests/test_runtime_switch_commands.py:108` — `sk-1234567890` (test fixture for the secret-masking function `_format_setting_display_value`)
56
+ 4. `god-code-api/tests/util/redact.test.ts:11,16,22,44` — fake JWT/Bearer/sk-/gc_live_ tokens (test fixtures for the `redactSecrets()` utility)
57
+
58
+ All 4 are intentional test fixtures or documentation examples for security-utility code paths. They cannot be removed without breaking the tests that validate the masking/redaction features. They are allowlisted in the per-repo `.gitleaks.toml` files added in Phase 7.
59
+
60
+ ### A.2 PyPI wheel inspection
61
+
62
+ - **Published version audited:** 0.6.1 (users currently install this via `pipx install god-code`)
63
+ - **Local repo version at audit time:** 0.9.1 (not yet on PyPI)
64
+ - **Files in 0.6.1 wheel:** 91 (86 under `godot_agent/` package + 5 dist-info)
65
+ - **Sensitive file scan (config.json / auth.json / .env / .key / .pem / agent_sessions / .codetape):** 0 matches
66
+ - **Decision:** Pass. Belt-and-suspenders exclude list added to `pyproject.toml` for future releases (commit `f34b716`).
67
+
68
+ ### A.3 Test fixture credential scan
69
+
70
+ - `god-code/tests/`: 0 matches
71
+ - `god-code-api/tests/`: 3 matches (all in `redact.test.ts`, same false-positive pattern as A.1)
72
+ - `god-code-site`: no tests directory
73
+
74
+ ### A.4 Environment template files
75
+
76
+ - All 3 repos: **0 `.env.example` / template files found**. Cleanest possible outcome — no risk of a template accidentally containing real values.
77
+
78
+ **Track A verdict:** PASS
79
+
80
+ ## Track B — Deployment secrets and log hygiene
81
+
82
+ ### B.1 god-code-api secret inventory
83
+
84
+ Deployed secrets (per `wrangler secret list`, post-correction):
85
+
86
+ | Secret | Referenced in source | Status |
87
+ |--------|---------------------|--------|
88
+ | `ADMIN_SECRET` | Yes (admin auth) | OK |
89
+ | `OPENAI_API_KEY` | Yes (provider pool) | OK |
90
+ | `SCORING_API_KEY` | No direct reference | **Reserved** — planned scoring feature (see Audit Correction) |
91
+
92
+ Source-referenced but not currently deployed (functional gap, not security issue):
93
+
94
+ - `ANTHROPIC_API_KEY` — declared in provider pool, not deployed
95
+ - `GEMINI_API_KEY` — declared in provider pool, not deployed
96
+ - `XAI_API_KEY` — declared in provider pool, not deployed
97
+
98
+ Impact: platform-mode callers selecting Claude/Gemini/xAI will receive upstream 401/403 until these are deployed. **Not a security issue** (missing keys = less to leak). Deploy before launch only if the landing page promises those providers in platform mode.
99
+
100
+ ### B.2 Workers log hygiene
101
+
102
+ - **`console.*` calls in `src/`:** **0**
103
+ - **`redactSecrets()` utility wired into error paths:** Yes, 4 call sites (lines 305, 338, 358, 369 of `src/index.ts`)
104
+ - **Live `wrangler tail` review:** Not performed. Justification: source audit already confirms zero application logs possible; tail would only capture Cloudflare platform logs outside our control.
105
+
106
+ ### B.3 god-code-site Pages env vars
107
+
108
+ - **`import.meta.env.*` references in `src/`:** 0
109
+ - **`process.env.*` references in `src/`:** 0
110
+ - **Secrets embedded in built `dist/`:** 0
111
+ - **Source file count in `src/`:** 1 (`src/pages/index.astro`)
112
+
113
+ Pages dashboard env vars were not inspected via CLI (not possible for CF Pages via wrangler). Not a blocker because source has zero env-var ingestion points.
114
+
115
+ **Track B verdict:** PASS
116
+
117
+ ## Track C — User data handling
118
+
119
+ ### C.1 D1 schema — content storage check
120
+
121
+ - **Tables defined in schema/:** 5 (`route_decisions`, `quality_alerts`, `quality_scores`, `api_keys`, `usage_log`)
122
+ - **Tables with actual `INSERT INTO` statements in `src/`:** 2 (`api_keys`, `usage_log`)
123
+ - **Tables that store user content:** **0**
124
+
125
+ `api_keys` stores key hashes (not plaintext). `usage_log` stores token counts and metadata (not content). The other three tables are orphan — defined in schema but not written to by current code (informational finding, not security).
126
+
127
+ ### C.2 CLI session upload audit
128
+
129
+ - **Network calls in `godot_agent/runtime/session.py`:** 0
130
+ - **`chmod 0o600` on session files:** Yes, already present (pre-existing hardening in v0.9)
131
+ - **What `godot_agent/llm/client.py` sends upstream:** Current-turn messages only. Never reads or uploads the saved session file.
132
+
133
+ ### C.3 Waitlist PII minimization
134
+
135
+ - **Before:** KV entries stored `{email, joined_at, source: referer}`. `referer` could contain tracking parameters and campaign IDs.
136
+ - **After:** KV entries store `{email, joined_at}` only.
137
+ - **Implementation:** `src/index.ts` waitlist handler edited to remove `referer` field (commit `4cfcb21`). 152/152 tests pass. Deployed to production.
138
+ - **Historical data cleanup:** No-op. KV was empty at audit time (pre-launch, no real signups yet).
139
+ - **Retention policy:** Until public launch concludes, then purged. Purge procedure documented in `god-code-api/docs/DEPLOYMENT.md`.
140
+
141
+ ### C.4 Data flow table
142
+
143
+ Produced in `.audit/data-flow-table.md` and embedded into `god-code/PRIVACY.md`. Covers every data point from CLI to backend to provider, including what is stored where and for how long.
144
+
145
+ **Track C verdict:** PASS
146
+
147
+ ## Audit Correction — Finding B1 methodology flaw
148
+
149
+ **What happened**
150
+
151
+ During Phase 3.1, `SCORING_API_KEY` was flagged as an "orphan secret" and a recommendation to delete was made to the user. The recommendation was based on a grep that found zero references to the secret name across `src/`, `tests/`, `wrangler.toml`, and `docs/`. The user approved deletion. After deletion, the user noted that `SCORING_API_KEY` was in fact **reserved for a planned scoring feature** that is not yet wired up in the main branch. The user immediately re-set the secret via `wrangler secret put`. No production code path depended on it during the ~2-minute window of absence, so there was no outage.
152
+
153
+ **Root cause**
154
+
155
+ The audit equated "zero references in current source" with "orphan, safe to delete". These are not the same. A secret with no source references can also mean:
156
+
157
+ - A feature that is planned but not yet implemented
158
+ - A feature that is implemented in a branch or PR but not yet merged
159
+ - A dependency injection pattern where the secret is passed via a different identifier
160
+ - A debugging secret held in reserve for emergency access
161
+
162
+ **Correction applied**
163
+
164
+ - `SCORING_API_KEY` restored by the user
165
+ - `god-code-api/docs/DEPLOYMENT.md` updated to mark the secret as "Reserved for the scoring feature (planned). Do not delete." (commit `f39c65c`)
166
+ - `.audit/track-b-secrets.md` updated with the full incident record and methodology correction
167
+
168
+ **Methodology improvement for future audits**
169
+
170
+ Before recommending deletion of any secret, the auditor must answer all three of the following with "no":
171
+
172
+ 1. Is the secret referenced in the current source tree?
173
+ 2. Is the secret referenced in any open branch, PR, or design document describing a planned feature?
174
+ 3. Does the feature owner confirm that the secret is not reserved for planned work?
175
+
176
+ Only if all three answers are "no" should a secret be flagged for deletion. The default posture should be **conservative retention** — it is cheaper to keep an unused secret than to accidentally remove a reserved one.
177
+
178
+ ## Remediation actions applied
179
+
180
+ | Repo | Commit | What |
181
+ |------|--------|------|
182
+ | god-code | `f34b716` | Added hatch wheel exclude list to `pyproject.toml` |
183
+ | god-code-api | `4cfcb21` | Removed `referer` field from waitlist handler |
184
+ | god-code-api | (user) | `wrangler deploy` for the waitlist handler change |
185
+ | god-code-api | `f39c65c` | Corrected `SCORING_API_KEY` classification in `DEPLOYMENT.md` |
186
+
187
+ No git history was rewritten (per design policy: revoke only).
188
+
189
+ ## Documentation published
190
+
191
+ | Repo | Artifact | Commit |
192
+ |------|----------|--------|
193
+ | god-code | `SECURITY.md` | `19a7335` |
194
+ | god-code | `PRIVACY.md` | `fd2baab` |
195
+ | god-code-api | `SECURITY.md` | `36a7f03` |
196
+ | god-code-api | `docs/DEPLOYMENT.md` | `c48ddc1` (+ `f39c65c` correction) |
197
+ | god-code-site | `SECURITY.md` | `5dd48b2` |
198
+ | god-code-site | `PRIVACY.md` | `a69a01c` |
199
+ | god-code-site | `docs/DEPLOYMENT.md` | `364e9ed` |
200
+
201
+ ## Local regression prevention installed
202
+
203
+ | Repo | `.gitleaks.toml` | `scripts/install-hooks.sh` | Commit |
204
+ |------|------------------|---------------------------|--------|
205
+ | god-code | Yes | Yes | `5589622` |
206
+ | god-code-api | Yes | Yes | `b094e81` |
207
+ | god-code-site | Yes | Yes | `1824ba8` |
208
+
209
+ Each repo's pre-commit hook scans staged changes with `gitleaks protect --staged --config .gitleaks.toml`. Verified live on the initial commit that installed it — zero findings. Any future contributor running `./scripts/install-hooks.sh` after cloning gets the same protection.
210
+
211
+ ## Non-goals (deferred to post-launch hardening sprint)
212
+
213
+ - **CLI Keychain storage** — `~/.config/god-code/config.json` remains plain JSON with `chmod 0o600`. Adequate for Level A+B threat model but not Level C (local malware).
214
+ - **OAuth device flow** — replace manual copy-paste key entry with a device-flow authentication between CLI and godcode.dev.
215
+ - **Website self-serve key issuance** — landing page currently only has waitlist, no signup/dashboard for creating `gc_live_*` keys.
216
+ - **CI `gitleaks` integration** — add GitHub Actions workflow to all 3 repos for regression prevention beyond local pre-commit hooks.
217
+ - **Dependency vulnerability scanning** — `pip-audit` for god-code, `npm audit` for god-code-api and god-code-site.
218
+ - **Rate limiting** — `/v1/admin/keys` and other public endpoints currently have no explicit rate limiting beyond Cloudflare's platform defaults.
219
+ - **SCORING_API_KEY full wire-up** — the scoring feature that reserves this secret still needs to be implemented end-to-end.
220
+ - **Missing platform pool keys** — deploy `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `XAI_API_KEY` if the landing page advertises Claude/Gemini/xAI in platform mode.
221
+
222
+ ## Success criteria (from design doc)
223
+
224
+ | Criterion | Met? |
225
+ |-----------|------|
226
+ | Gitleaks full-history scan zero actionable findings | ✅ |
227
+ | PyPI wheel audited, no sensitive files | ✅ |
228
+ | `pyproject.toml` has explicit exclude list, local build clean | ✅ |
229
+ | `wrangler secret list` inspected | ✅ |
230
+ | 3 × SECURITY.md published | ✅ |
231
+ | 2 × PRIVACY.md published with data-flow table | ✅ |
232
+ | 2 × DEPLOYMENT.md published | ✅ |
233
+ | Waitlist PII decision made and applied | ✅ |
234
+ | Local `.gitleaks.toml` + pre-commit hook in all 3 repos | ✅ |
235
+
236
+ All 9 success criteria met.
237
+
238
+ ## Final verdict
239
+
240
+ **Pre-launch security audit complete. Launch-ready from a security and privacy standpoint.**
241
+
242
+ Remaining work is product / marketing / release logistics, not security. The audit's posture is **conservative**: zero active risks were found, but the audit explicitly notes what is out of scope so the next security review knows where to dig deeper.