drydock-cli 3.0.170__tar.gz → 3.1.2__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 (190) hide show
  1. {drydock_cli-3.0.170/drydock_cli.egg-info → drydock_cli-3.1.2}/PKG-INFO +1 -1
  2. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/agent.py +10 -0
  3. drydock_cli-3.1.2/drydock/builtin_skills/fiar-assess.md +33 -0
  4. drydock_cli-3.1.2/drydock/builtin_skills/fiar-cap.md +26 -0
  5. drydock_cli-3.1.2/drydock/builtin_skills/fiar-evidence.md +33 -0
  6. drydock_cli-3.1.2/drydock/builtin_skills/fiar-readiness.md +28 -0
  7. drydock_cli-3.1.2/drydock/fiar.py +528 -0
  8. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/loop_detect.py +91 -3
  9. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/providers.py +101 -1
  10. drydock_cli-3.1.2/drydock/suggest.py +125 -0
  11. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tools/__init__.py +282 -7
  12. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/app.py +41 -10
  13. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/widgets.py +7 -0
  14. {drydock_cli-3.0.170 → drydock_cli-3.1.2/drydock_cli.egg-info}/PKG-INFO +1 -1
  15. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/SOURCES.txt +6 -0
  16. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/pyproject.toml +1 -1
  17. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_degenerate_argument.py +20 -0
  18. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_dispatch.py +26 -0
  19. drydock_cli-3.1.2/tests/test_fiar.py +211 -0
  20. drydock_cli-3.1.2/tests/test_loop_detect.py +194 -0
  21. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_mcp.py +5 -2
  22. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_skills.py +5 -1
  23. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stig.py +9 -0
  24. drydock_cli-3.1.2/tests/test_suggest.py +73 -0
  25. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_coercion.py +21 -1
  26. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_coercion_more.py +11 -0
  27. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_parsing.py +35 -0
  28. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_trajectory.py +33 -0
  29. drydock_cli-3.0.170/drydock/suggest.py +0 -30
  30. drydock_cli-3.0.170/tests/test_loop_detect.py +0 -101
  31. drydock_cli-3.0.170/tests/test_suggest.py +0 -30
  32. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/LICENSE +0 -0
  33. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/NOTICE +0 -0
  34. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/README.md +0 -0
  35. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/__init__.py +0 -0
  36. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/__main__.py +0 -0
  37. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/advisor.py +0 -0
  38. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/bash_safety.py +0 -0
  39. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/budget.py +0 -0
  40. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/__init__.py +0 -0
  41. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-data.md +0 -0
  42. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-debug.md +0 -0
  43. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-finetune.md +0 -0
  44. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-metrics.md +0 -0
  45. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-rl.md +0 -0
  46. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-train.md +0 -0
  47. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/nist-ai-rmf.md +0 -0
  48. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/nist-csf.md +0 -0
  49. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-categorize.md +0 -0
  50. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-control.md +0 -0
  51. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-poam.md +0 -0
  52. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-review.md +0 -0
  53. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/stig-assess.md +0 -0
  54. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/stig-remediate.md +0 -0
  55. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/cci.py +0 -0
  56. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/cli.py +0 -0
  57. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/compaction.py +0 -0
  58. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/config.py +0 -0
  59. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/detect.py +0 -0
  60. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/events.py +0 -0
  61. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/extract.py +0 -0
  62. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/gittools.py +0 -0
  63. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/graphrag.py +0 -0
  64. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/guards.py +0 -0
  65. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/mcp.py +0 -0
  66. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/phases.py +0 -0
  67. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/poam.py +0 -0
  68. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/progress.py +0 -0
  69. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/recipes.py +0 -0
  70. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/recovery.py +0 -0
  71. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/resume.py +0 -0
  72. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/rmf.py +0 -0
  73. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/rmf_graph.py +0 -0
  74. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/skills.py +0 -0
  75. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/stig.py +0 -0
  76. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/subagents.py +0 -0
  77. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/task_state.py +0 -0
  78. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_policy.py +0 -0
  79. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_registry.py +0 -0
  80. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_result.py +0 -0
  81. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_select.py +0 -0
  82. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_validate.py +0 -0
  83. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/trajectory.py +0 -0
  84. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/__init__.py +0 -0
  85. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/approval.py +0 -0
  86. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/messages.py +0 -0
  87. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tuning.py +0 -0
  88. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/verification.py +0 -0
  89. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/web.py +0 -0
  90. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/dependency_links.txt +0 -0
  91. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/entry_points.txt +0 -0
  92. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/requires.txt +0 -0
  93. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/top_level.txt +0 -0
  94. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/setup.cfg +0 -0
  95. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_advisor.py +0 -0
  96. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_approval.py +0 -0
  97. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_back_command.py +0 -0
  98. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_background.py +0 -0
  99. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_binary_output.py +0 -0
  100. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_crossplatform.py +0 -0
  101. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_output_bounding.py +0 -0
  102. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_process_group.py +0 -0
  103. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_safety.py +0 -0
  104. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_sanitize.py +0 -0
  105. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_shell.py +0 -0
  106. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_stdin.py +0 -0
  107. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_stop_partial.py +0 -0
  108. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_timeout_network.py +0 -0
  109. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_timeout_param.py +0 -0
  110. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_budget.py +0 -0
  111. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cci.py +0 -0
  112. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cli_agents.py +0 -0
  113. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_compact_command.py +0 -0
  114. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_compaction.py +0 -0
  115. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_config.py +0 -0
  116. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_config_migration.py +0 -0
  117. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_context_limit_config.py +0 -0
  118. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_context_limit_issue25.py +0 -0
  119. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_criteria_coverage.py +0 -0
  120. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cycling_detection.py +0 -0
  121. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_detect.py +0 -0
  122. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_e2e_connected.py +0 -0
  123. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_edit_replace_all.py +0 -0
  124. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_effort_governor.py +0 -0
  125. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_empty_response.py +0 -0
  126. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_events.py +0 -0
  127. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_extract.py +0 -0
  128. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_failure_loop.py +0 -0
  129. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_first_run_setup.py +0 -0
  130. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_gittools.py +0 -0
  131. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_glob_edit_edges.py +0 -0
  132. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphify_example.py +0 -0
  133. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag.py +0 -0
  134. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag_quoted_path.py +0 -0
  135. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag_sqlite.py +0 -0
  136. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_grep_and_read_robust.py +0 -0
  137. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_guards_and_tools.py +0 -0
  138. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_hallucinated_tools.py +0 -0
  139. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_leaked_tool_call.py +0 -0
  140. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_model_registry.py +0 -0
  141. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_oneshot_unreachable.py +0 -0
  142. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_overthink_interrupt.py +0 -0
  143. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_phases.py +0 -0
  144. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_plan_autocontinue.py +0 -0
  145. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_poam.py +0 -0
  146. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_progress.py +0 -0
  147. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_providers_unreachable.py +0 -0
  148. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_read_index.py +0 -0
  149. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recipes.py +0 -0
  150. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery.py +0 -0
  151. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery_config.py +0 -0
  152. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery_integration.py +0 -0
  153. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_repeated_outcome.py +0 -0
  154. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_repetition_interrupt.py +0 -0
  155. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_events.py +0 -0
  156. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_restore.py +0 -0
  157. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_snapshot.py +0 -0
  158. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf.py +0 -0
  159. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf_graph.py +0 -0
  160. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf_stig_graph.py +0 -0
  161. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rolling_plan.py +0 -0
  162. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_runaway_repetition.py +0 -0
  163. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_screenshot.py +0 -0
  164. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_server_probe.py +0 -0
  165. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_sqlite_events.py +0 -0
  166. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stall_retry.py +0 -0
  167. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stop.py +0 -0
  168. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_streaming_newlines.py +0 -0
  169. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_subagent.py +0 -0
  170. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_subagents.py +0 -0
  171. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_system_prompt_help.py +0 -0
  172. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_task_state.py +0 -0
  173. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_timeline.py +0 -0
  174. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_todo.py +0 -0
  175. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_canonical.py +0 -0
  176. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_policy.py +0 -0
  177. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_result.py +0 -0
  178. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_select.py +0 -0
  179. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_validate.py +0 -0
  180. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tools_undo.py +0 -0
  181. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tui.py +0 -0
  182. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tuning.py +0 -0
  183. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_verification_gate.py +0 -0
  184. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_viewimage.py +0 -0
  185. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_vision_input.py +0 -0
  186. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_web_tools.py +0 -0
  187. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_windows_shell.py +0 -0
  188. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_worker_subagent.py +0 -0
  189. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_write_content_coerce.py +0 -0
  190. {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_xccdf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.0.170
3
+ Version: 3.1.2
4
4
  Summary: Drydock — a local, provider-agnostic terminal coding agent for local LLMs
5
5
  Author: Frank Bobe III
6
6
  License-Expression: Apache-2.0
@@ -236,6 +236,16 @@ def run(
236
236
  run_iteration += 1
237
237
  assistant_turn: AssistantTurn | None = None
238
238
 
239
+ # Keep the trajectory export current EVERY turn, not just at task end:
240
+ # a harness that kills a long task at its cutoff still gets the full
241
+ # transcript, and those hard/long tasks are exactly the ones whose
242
+ # trajectories are worth harvesting (2026-07-20: two verifier-PASSING
243
+ # tbench tasks lost their trajectories to this). record() overwrites
244
+ # and never raises, so the repeat write is safe and idempotent.
245
+ if config.get("trajectory_file") and state.turn_count > 1:
246
+ from drydock import trajectory as _traj
247
+ _traj.record(system_prompt, state, config)
248
+
239
249
  # Compact context if approaching limit
240
250
  maybe_compact(state, config)
241
251
 
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: fiar-assess
3
+ description: Test the next un-tested FIAR control objective against real evidence
4
+ ---
5
+ Test FIAR control objectives in the engagement at: $ARGS
6
+
7
+ Do exactly ONE control per run (loop it — /loop N /fiar-assess <path> — for the
8
+ whole matrix):
9
+
10
+ 1. Call FiarControls with that path and status=not_tested. If none remain, say the
11
+ control matrix is fully tested and STOP without calling other tools.
12
+ 2. Take the FIRST not_tested control. Call FiarControl (path + id) to read its
13
+ control objective, assertions, required Key Supporting Documents (KSDs), and
14
+ test procedure.
15
+ 3. You MUST examine real evidence before deciding — do NOT guess. Follow the test
16
+ procedure: Read the actual KSD the control names (obligating document, receiving
17
+ report, invoice, reconciliation workpaper, SF-50, access-recert listing, …) or
18
+ run its check command (Bash). If the procedure says to sample, state your sample
19
+ size and how many exceptions you found. Reason step by step about whether the
20
+ evidence satisfies the control objective for its assertion(s).
21
+ 4. Call FiarAssess (path + id) with:
22
+ - status = effective ONLY if the evidence clearly shows the control operated;
23
+ deficient if the evidence shows it did not (any un-remediated
24
+ exception makes the control deficient);
25
+ not_applicable if the control does not apply to this entity;
26
+ - evidence = the exact KSDs you examined and what they showed (quote the line);
27
+ - sample_size and exceptions when you tested a sample.
28
+ 5. If you set deficient, immediately call FiarFinding to record the NFR: condition
29
+ (what you observed), criteria (the policy/standard/GAAP requirement), cause
30
+ (root cause), effect (impact on the assertion/balance), recommendation, and a
31
+ severity (deficiency / significant_deficiency / material_weakness).
32
+
33
+ Give a one-line summary: control id, the KSD evidence, and the status you set.
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: fiar-cap
3
+ description: Draft a Corrective Action Plan for the open FIAR findings (NFRs)
4
+ ---
5
+ Draft Corrective Action Plans for the open findings in the FIAR engagement at: $ARGS
6
+
7
+ 1. Call FiarControls (path only) to see the engagement, then read the findings by
8
+ listing deficient controls (FiarControls status=deficient) and, for each, its
9
+ recorded NFR. If there are no findings, say so and STOP.
10
+ 2. Take ONE finding at a time (worst severity first: material_weakness, then
11
+ significant_deficiency, then deficiency). For it, draft a CAP that is specific
12
+ and testable:
13
+ - root_cause: the underlying reason the control failed (people / process /
14
+ system / policy) — go past the symptom in the NFR condition;
15
+ - action: the concrete corrective action that will make the control operate;
16
+ - responsible: the organization / POC who owns it;
17
+ - target_date: a realistic milestone date;
18
+ - milestones: 2–4 dated, verifiable steps (e.g. "update SOP", "train preparers",
19
+ "re-test 25 samples with 0 exceptions").
20
+ 3. The CAP must close the specific assertion gap the NFR identified — tie the final
21
+ milestone to a re-test of the same control with zero exceptions. Note whether the
22
+ fix is a process change, a system change, or an ITGC (access / SoD / change
23
+ management) remediation, since those route to different owners.
24
+
25
+ Present each CAP in the standard structure (finding → root cause → action →
26
+ responsible → milestones), and end with which finding to remediate first and why.
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: fiar-evidence
3
+ description: Trace the full FIAR evidence chain for a control before passing it
4
+ ---
5
+ Substantively test ONE FIAR control by tracing the complete evidence chain, for the
6
+ engagement + control id in: $ARGS
7
+
8
+ A control cannot support a financial-statement assertion on a broken audit trail.
9
+ You MUST trace all eight links before FiarAssess will let you mark it effective:
10
+
11
+ population → sample → source_transaction → authorization → supporting_document
12
+ → system_posting → gl_effect → assertion
13
+
14
+ 1. Call FiarControl (path + id) to read the objective, assertions and KSDs.
15
+ 2. Establish the POPULATION: the recorded universe (a GL detail, a transaction
16
+ register, an APSR listing). State how you know it is complete.
17
+ 3. SELECT a sample from that population and record exactly which item(s).
18
+ 4. For each sampled item, gather and Read the real evidence for each link:
19
+ - source_transaction: the transaction the item represents;
20
+ - authorization: the warranted/authorized approver (warrant, SF-50, delegation);
21
+ - supporting_document: the KSD (contract, receiving report, invoice, recon wp);
22
+ - system_posting: where it posted in the feeder/accounting system;
23
+ - gl_effect: the resulting general-ledger entry;
24
+ - assertion: the FS assertion it ultimately supports.
25
+ 5. Call FiarAssess with status=effective and a `chain` object whose keys are the
26
+ eight links above, each set to the specific evidence you found. If any link is
27
+ missing, FiarAssess will REFUSE and name the gap — go get that evidence, do not
28
+ force the status. If a link genuinely cannot be traced (e.g. no authorization on
29
+ file), the control is DEFICIENT: set status=deficient and record an NFR with
30
+ FiarFinding.
31
+
32
+ Report the item you traced and, link by link, the evidence that supported it (or the
33
+ link that broke the chain).
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: fiar-readiness
3
+ description: Assess audit-readiness posture of a FIAR engagement and report gaps
4
+ ---
5
+ Produce a Discover-phase audit-readiness assessment for the FIAR engagement at: $ARGS
6
+
7
+ 1. Call FiarControls (path only) to see the whole matrix: cycle, Wave, phase, and
8
+ the status counts. If the engagement JSON does not exist yet, tell the operator
9
+ to create one first: `python -m drydock.fiar new <path> <name> <cycle>` (cycles:
10
+ FBWT, P2P, PPE, INV, CIVPAY, REIM, FR, ITGC, or * for all).
11
+ 2. Call FiarControls with status=deficient and status=not_tested to enumerate the
12
+ gaps. For each DEFICIENT control, note the assertion(s) at risk and whether an
13
+ NFR already exists for it.
14
+ 3. Read the current readiness roll-up (the counts show tested vs effective). State,
15
+ in plain terms:
16
+ - percent of applicable controls tested, and of those, percent effective;
17
+ - the assertions (Existence, Completeness, Valuation, Presentation & Disclosure,
18
+ Rights & Obligations) that are NOT yet supported because a control covering
19
+ them is deficient or untested;
20
+ - open findings by severity (material weakness / significant deficiency /
21
+ deficiency) and whether each has a Corrective Action Plan.
22
+ 4. Recommend the highest-value next actions to move toward assertion, prioritizing
23
+ material weaknesses and untested key controls (FBWT reconciliation, three-way
24
+ match, access/SoD ITGCs). Do NOT claim the entity is audit-ready — readiness is
25
+ asserted by management and validated by an independent examination; your job is
26
+ to report the evidenced posture and the gaps.
27
+
28
+ Report a short readiness summary (3–4 sentences) first, then the detail beneath it.