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.
- {drydock_cli-3.0.170/drydock_cli.egg-info → drydock_cli-3.1.2}/PKG-INFO +1 -1
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/agent.py +10 -0
- drydock_cli-3.1.2/drydock/builtin_skills/fiar-assess.md +33 -0
- drydock_cli-3.1.2/drydock/builtin_skills/fiar-cap.md +26 -0
- drydock_cli-3.1.2/drydock/builtin_skills/fiar-evidence.md +33 -0
- drydock_cli-3.1.2/drydock/builtin_skills/fiar-readiness.md +28 -0
- drydock_cli-3.1.2/drydock/fiar.py +528 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/loop_detect.py +91 -3
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/providers.py +101 -1
- drydock_cli-3.1.2/drydock/suggest.py +125 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tools/__init__.py +282 -7
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/app.py +41 -10
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/widgets.py +7 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/SOURCES.txt +6 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/pyproject.toml +1 -1
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_degenerate_argument.py +20 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_dispatch.py +26 -0
- drydock_cli-3.1.2/tests/test_fiar.py +211 -0
- drydock_cli-3.1.2/tests/test_loop_detect.py +194 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_mcp.py +5 -2
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_skills.py +5 -1
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stig.py +9 -0
- drydock_cli-3.1.2/tests/test_suggest.py +73 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_coercion.py +21 -1
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_coercion_more.py +11 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_arg_parsing.py +35 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_trajectory.py +33 -0
- drydock_cli-3.0.170/drydock/suggest.py +0 -30
- drydock_cli-3.0.170/tests/test_loop_detect.py +0 -101
- drydock_cli-3.0.170/tests/test_suggest.py +0 -30
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/LICENSE +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/NOTICE +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/README.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/budget.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/nist-ai-rmf.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/nist-csf.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/cci.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/cli.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/config.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/detect.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/events.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/extract.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/graphrag.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/guards.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/phases.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/poam.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/progress.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/recipes.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/recovery.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/resume.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/skills.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/stig.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/subagents.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/task_state.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_policy.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_result.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_select.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tool_validate.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/trajectory.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/verification.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock/web.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/setup.cfg +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_budget.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_config.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_context_limit_issue25.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_criteria_coverage.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_cycling_detection.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_effort_governor.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_events.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_graphrag_sqlite.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_model_registry.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_phases.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_progress.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recipes.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery_config.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_recovery_integration.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_repeated_outcome.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_events.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_restore.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_resume_snapshot.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_rolling_plan.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_screenshot.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_sqlite_events.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_subagents.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_task_state.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_timeline.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_canonical.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_policy.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_result.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_select.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tool_validate.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_verification_gate.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_worker_subagent.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.170 → drydock_cli-3.1.2}/tests/test_xccdf.py +0 -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.
|