project-loop-harness 0.2.1__tar.gz → 0.2.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.
- {project_loop_harness-0.2.1/src/project_loop_harness.egg-info → project_loop_harness-0.2.2}/PKG-INFO +1 -1
- project_loop_harness-0.2.2/agent-tasks/0092-idempotent-status-transitions.md +78 -0
- project_loop_harness-0.2.2/agent-tasks/0093-evidence-add-command.md +95 -0
- project_loop_harness-0.2.2/agent-tasks/0094-job-completion-evidence.md +71 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/agent-adapter-contract.md +7 -1
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/data-model.md +36 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/distribution.md +1 -1
- project_loop_harness-0.2.2/docs/evidence-entry-paths-design.md +119 -0
- project_loop_harness-0.2.2/docs/feedback/2026-07-06-ax1-moc1-agent-feedback.md +55 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/golden-path.md +8 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/pyproject.toml +1 -1
- project_loop_harness-0.2.2/src/pcl/__init__.py +1 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/cli.py +60 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/commands.py +16 -10
- project_loop_harness-0.2.2/src/pcl/evidence.py +224 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/init_project.py +1 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/lifecycle.py +76 -12
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/stories.py +18 -10
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/tasks.py +11 -5
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/validators.py +146 -3
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflows.py +1 -1
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2/src/project_loop_harness.egg-info}/PKG-INFO +1 -1
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/project_loop_harness.egg-info/SOURCES.txt +6 -0
- project_loop_harness-0.2.2/tests/test_evidence_add.py +394 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_features.py +89 -4
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_lifecycle.py +268 -1
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_stories.py +120 -1
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_tasks.py +118 -0
- project_loop_harness-0.2.1/src/pcl/__init__.py +0 -1
- project_loop_harness-0.2.1/src/pcl/evidence.py +0 -25
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/LICENSE +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/MANIFEST.in +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/Makefile +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/README.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0001-hardening-cli.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0002-db-migrations.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0003-workflow-runner.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0004-dashboard-renderer.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0005-agent-integration.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0006-codex-plugin.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0007-mcp-server.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0008-loop-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0009-defect-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0010-reporting-evidence.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0011-validation-invariants.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0012-audit-log-integrity.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0013-validation-diagnostics.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0014-escalation-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0015-decision-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0016-escalation-decision-linkage.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0017-next-action-guided-loop.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0018-readme-golden-path.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0019-recovery-playbook.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0020-example-project-refresh.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0021-agent-adapter-contract.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0022-agent-output-validation.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0023-codex-exec-adapter-hardening.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0024-claude-manual-adapter-hardening.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0025-generic-shell-adapter.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0026-agent-job-evidence-ingestion.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0027-dashboard-data-contract.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0028-dashboard-evidence-navigation.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0029-dashboard-risk-and-blockers.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0030-distribution-readiness.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0031-workflow-proposal-mode.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0032-workflow-proposal-review.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0033-workflow-verifier.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0034-limited-execution-sandbox.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0035-automatic-workflow-executor.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0036-executor-dogfood-workflow.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0037-executor-retry-resume.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0038-story-test-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0039-workflow-yaml-rule-expressions.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0040-test-case-evidence-validation.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0041-feature-inspection-commands.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0042-report-coverage-context.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0043-feature-report.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0044-complete-csv-export.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0045-filtered-job-inspection.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0046-feature-status-lifecycle.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0047-feature-coverage-next-action.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0048-migration-status-command.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0049-render-json-artifact-paths.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0050-codex-plugin-package-inventory.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0051-mcp-render-artifact-paths.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0052-lifecycle-failure-job-cleanup.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0053-prompt-job-json-handoff.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0054-human-queue-linkage-cli.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0055-workflow-proposal-list-filter.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0056-sandbox-noop-execution-guard.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0057-executor-no-executable-step-guard.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0058-dogfood-usability-hardening.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0059-checkpoint-review-guidance.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0060-pypi-trusted-publishing.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0061-context-pack-v1.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0062-task-backlog-entity.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0063-structured-verification-rubric.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0064-task-loop-integration.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0065-dashboard-human-decisions.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0066-agent-registry-lease.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0067-context-pack-improvements.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0068-trust-hardening.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0069-explainable-code-context-v0.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0070-human-decision-cockpit.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0071-dogfood-impact-precision.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0072-sensitive-omission.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0073-code-context-module-split.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0074-search-snapshot-consistency.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0075-diff-source-modes.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0076-schema-version-integrity.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0077-index-output-budget-and-impact-noise.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0078-context-pack-code-context-bridge.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0079-receipt-human-summary.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0080-retrieval-eval-gate.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0081-diff-modes-completion.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0082-receipt-relevance-and-age.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0083-required-section-invariant.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0084-source-commands-honesty.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0085-distribution-source-completeness.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0086-command-surface-alignment.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0087-verification-suggestion-ids.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0088-verification-feedback.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0089-dogfood-fixture-propose.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0090-eval-baseline-record-compare.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/agent-tasks/0091-refresh-command-scope-fidelity.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/adoption-guide.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/adr/0001-hybrid-state.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/adr/0002-cli-is-the-runtime.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/adr/0003-static-workflows-before-dynamic-workflows.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/agent-output-template.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/agent-roles.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/architecture.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/code-context.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/context-pack.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/dashboard-data-contract.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/dashboard-design.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/implementation-plan.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/plh_v0_1_11_review_agenda.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/plh_v0_1_12_review_agenda.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/pypi-publishing.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/recovery-playbook.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/safety-permissions.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/v0.2.0-plan.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/verification-feedback-design.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/verification-feedback.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/verification-rubric.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/docs/workflow-contract.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/scripts/run_advisory_retrieval_eval.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/scripts/verify_sdist_contracts.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/setup.cfg +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/__main__.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/agents.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/checkpoints.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/__init__.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/diff.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/eval.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/impact.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/receipts.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/scan.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/search.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/store.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/summary.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/symbols.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_context/test_hints.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/code_index.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/context.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/migrations/001_initial.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/migrations/002_tasks.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/migrations/003_agent_registry.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/migrations/004_code_index.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/migrations/005_verification_feedback.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db/schema.sql +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/db.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/decisions.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/dispatch.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/errors.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/escalations.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/events.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/exporters.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/guards.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/ids.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/links.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/locales.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/mcp_server.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/migrations.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/paths.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/receipt_show.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/registry.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/renderer.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/reports.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/resources.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/rubric.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/dashboard/dashboard.html +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/project/AGENTS.block.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/project/CLAUDE.block.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/project/gitignore.fragment +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/project/pcl.yaml +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/skills/project-control-loop/SKILL.md +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/workflows/defect_repair.yaml +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/workflows/executor_smoke.yaml +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/workflows/feature_coverage.yaml +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/templates/workflows/regression_loop.yaml +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/timeutil.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/token_estimation.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/update_check.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/verification_feedback.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/verifications.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_executor.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_proposal_validation.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_proposals.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_sandbox.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_verifier.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/pcl/workflow_yaml.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/project_loop_harness.egg-info/dependency_links.txt +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/project_loop_harness.egg-info/entry_points.txt +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/project_loop_harness.egg-info/requires.txt +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/src/project_loop_harness.egg-info/top_level.txt +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/code_context_summary_v0.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/context_receipt_v0.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/context_receipt_v0_legacy_string_suggestions.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/retrieval_adversarial_v0.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/retrieval_real_history_v0.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/fixtures/retrieval_v0.json +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_advisory_retrieval_eval_script.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_agent_adapter_contract.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_agent_output_validation.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_agents.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_audit_log_integrity.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_checkpoints.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_claude_manual_adapter.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_cli_init.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_code_context_summary.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_code_index.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_codex_exec_adapter.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_codex_plugin.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_context.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_dashboard.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_dashboard_data_contract.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_decisions.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_defects.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_dispatch.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_distribution.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_escalations.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_examples.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_generic_shell_adapter.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_golden_path.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_mcp_server.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_migrations.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_next_actions.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_pypi_publishing.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_receipt_show.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_recovery_playbook.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_registry.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_reports.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_rubric.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_update_check.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_validation.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_validation_diagnostics.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_verification_feedback.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_workflow_executor.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_workflow_proposals.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_workflow_sandbox.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_workflow_verifier.py +0 -0
- {project_loop_harness-0.2.1 → project_loop_harness-0.2.2}/tests/test_workflows.py +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Task 0092: Idempotent Same-State Transitions (v0.2.2, F1)
|
|
2
|
+
|
|
3
|
+
Source: first external-project agent dogfood feedback
|
|
4
|
+
(`docs/feedback/2026-07-06-ax1-moc1-agent-feedback.md`, item F1).
|
|
5
|
+
`pcl feature status F-0001 --status passing` exits 2 when the feature
|
|
6
|
+
is already passing. For scripting agents a same-state request is a
|
|
7
|
+
satisfied postcondition, not an input error; exit 2 forces every
|
|
8
|
+
caller to pre-read state or wrap errors. No migration, no new
|
|
9
|
+
dependency.
|
|
10
|
+
|
|
11
|
+
## Behavior change (all four sites)
|
|
12
|
+
|
|
13
|
+
Same-state transition requests become successful no-ops:
|
|
14
|
+
|
|
15
|
+
- `pcl feature status <id> --status <current>` (`commands.py`
|
|
16
|
+
`set_feature_status`)
|
|
17
|
+
- `pcl goal complete` / goal lifecycle same-state (`lifecycle.py`,
|
|
18
|
+
the "Goal ... is already ..." site)
|
|
19
|
+
- `pcl test <verb>` when the test case is already in the requested
|
|
20
|
+
terminal state (`stories.py`, the "Test case ... is already ..."
|
|
21
|
+
site)
|
|
22
|
+
- `pcl task status <id> <current>` (`tasks.py`, the "Task ... is
|
|
23
|
+
already ..." site)
|
|
24
|
+
|
|
25
|
+
No-op semantics (identical across all four):
|
|
26
|
+
|
|
27
|
+
- Exit code 0; JSON gains `"changed": false` plus the current status.
|
|
28
|
+
- NOTHING is recorded: no status update, no inline evidence row, no
|
|
29
|
+
event append. A no-op that logs is not a no-op — repeated agent
|
|
30
|
+
retries must not inflate the audit trail.
|
|
31
|
+
- Human-readable output states plainly that the entity was already in
|
|
32
|
+
the requested state (e.g. `Feature F-0001 already passing; no
|
|
33
|
+
change recorded.`).
|
|
34
|
+
- Supplied `--evidence` / `--reason` text on a no-op is NOT recorded;
|
|
35
|
+
the response must make that explicit (e.g.
|
|
36
|
+
`"evidence_recorded": false`) so callers do not believe evidence
|
|
37
|
+
was attached. Attaching fresh evidence to an already-terminal state
|
|
38
|
+
(re-verification) is out of scope here and belongs to the evidence
|
|
39
|
+
entry-path design.
|
|
40
|
+
|
|
41
|
+
Changed transitions additionally gain `"changed": true` (additive
|
|
42
|
+
JSON field; existing fields untouched).
|
|
43
|
+
|
|
44
|
+
## What must NOT change
|
|
45
|
+
|
|
46
|
+
- Invalid TARGET states and disallowed transitions (e.g. rubric or
|
|
47
|
+
guard violations, unknown entities) keep their existing typed
|
|
48
|
+
errors and exit codes. Only the exact same-state case becomes a
|
|
49
|
+
no-op.
|
|
50
|
+
- Evidence-backed terminal-state validation invariants are untouched
|
|
51
|
+
(a no-op changes nothing, so nothing new to validate).
|
|
52
|
+
- No behavior change for transitions that DO change state, other
|
|
53
|
+
than the additive `changed` field.
|
|
54
|
+
|
|
55
|
+
## Acceptance Criteria
|
|
56
|
+
|
|
57
|
+
- For each of the four commands: same-state call → exit 0,
|
|
58
|
+
`changed: false`, row count of events/evidence unchanged (assert
|
|
59
|
+
counts before/after), status unchanged, and repeated invocation is
|
|
60
|
+
stable (call twice more, same result).
|
|
61
|
+
- Same-state call with `--evidence "..."` → `evidence_recorded:
|
|
62
|
+
false` in JSON and no evidence row.
|
|
63
|
+
- Changed-state calls still record exactly as before and now carry
|
|
64
|
+
`changed: true`.
|
|
65
|
+
- Unknown entity / invalid target status still typed errors (regression
|
|
66
|
+
tests kept).
|
|
67
|
+
- Docs: `docs/golden-path.md` or command docs note the idempotent
|
|
68
|
+
semantics in one short paragraph.
|
|
69
|
+
- `ruff check .` passes; full `python3 -m pytest` passes; `pcl init`
|
|
70
|
+
smoke against a temp dir passes.
|
|
71
|
+
|
|
72
|
+
## Do Not
|
|
73
|
+
|
|
74
|
+
- Do not make disallowed transitions succeed.
|
|
75
|
+
- Do not append events or evidence on no-ops.
|
|
76
|
+
- Do not add a `--force` re-record path (that is evidence-path design
|
|
77
|
+
territory).
|
|
78
|
+
- Do not touch schema or raw SQL outside the existing service layer.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Task 0093: `pcl evidence add` + Adhoc Bundles (v0.2.2, F2/F6)
|
|
2
|
+
|
|
3
|
+
Design source: `docs/evidence-entry-paths-design.md`
|
|
4
|
+
(**APPROVED 2026-07-07**, Parts 1-2 and the approval record). Where
|
|
5
|
+
this spec and the design doc disagree, the design doc wins. No
|
|
6
|
+
migration, no new runtime dependency; schema stays v5.
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
Operators and agents produce reviewable artifacts outside the job
|
|
11
|
+
loop (test output, screenshots, visual-check reports) and PLH has no
|
|
12
|
+
honest way to accept them as evidence. Add the missing primitive.
|
|
13
|
+
|
|
14
|
+
## Scope
|
|
15
|
+
|
|
16
|
+
### 1. `pcl evidence add`
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pcl evidence add --file work/reports/pytest-out.txt \
|
|
20
|
+
--summary "pytest run for suggestion E-0017/VS-01" \
|
|
21
|
+
--command "python3 -m pytest tests/test_context.py" --json
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `--file` is required and repeatable; every path must exist and be
|
|
25
|
+
readable at record time (missing/unreadable → typed error, nothing
|
|
26
|
+
recorded). `--summary` required. `--command` optional — it is the
|
|
27
|
+
CALLER'S claim of how the artifact was produced; PLH stores it
|
|
28
|
+
verbatim and never runs or verifies it (docs and help must say
|
|
29
|
+
this).
|
|
30
|
+
- One file → evidence `type = 'adhoc_artifact'` (approved). Two or
|
|
31
|
+
more files → `type = 'adhoc_bundle'` (approved).
|
|
32
|
+
- In both cases PLH writes a small manifest JSON under
|
|
33
|
+
`.project-loop/evidence/adhoc/` recording, per member: relative
|
|
34
|
+
path, size_bytes, sha256 — pinned AT RECORD TIME. Members are
|
|
35
|
+
referenced in place, NOT copied (approved; a `--copy` mode is a
|
|
36
|
+
possible later addition, do not add it now).
|
|
37
|
+
- The evidence row's `path` points at the manifest; `command` and
|
|
38
|
+
`summary` come from the flags. One evidence row per invocation, one
|
|
39
|
+
standard event via `append_event` (SQLite + JSONL both — never a
|
|
40
|
+
side-channel writer; see agent-tasks/0089 clarification).
|
|
41
|
+
- Manifest contract name: `adhoc-evidence/v0` with a
|
|
42
|
+
`contract_version` field. Deterministic member ordering (input
|
|
43
|
+
order preserved; duplicates by path → typed error).
|
|
44
|
+
- JSON output returns the evidence id, type, manifest path, and the
|
|
45
|
+
member list with hashes.
|
|
46
|
+
|
|
47
|
+
### 2. Strict validation integration
|
|
48
|
+
|
|
49
|
+
- `pcl validate --strict` verifies for adhoc evidence rows that the
|
|
50
|
+
manifest file exists and parses; missing/corrupt manifest is an
|
|
51
|
+
ERROR (state integrity).
|
|
52
|
+
- Member hash drift (file changed or deleted since recording) is a
|
|
53
|
+
WARNING, not an error (approved): drift is the working tree moving
|
|
54
|
+
on; the pinned hash remains the recorded claim. Warning text must
|
|
55
|
+
name the evidence id, member path, and which aspect drifted
|
|
56
|
+
(missing vs hash mismatch).
|
|
57
|
+
|
|
58
|
+
### 3. Documentation
|
|
59
|
+
|
|
60
|
+
- New section in `docs/data-model.md` or `docs/golden-path.md`:
|
|
61
|
+
the adhoc evidence flow, the claim/pointer epistemic boundary, and
|
|
62
|
+
the worked example ending in
|
|
63
|
+
`pcl verification feedback ... --evidence E-00xx`.
|
|
64
|
+
- `docs/evidence-entry-paths-design.md` stays the design record; do
|
|
65
|
+
not duplicate it wholesale.
|
|
66
|
+
|
|
67
|
+
## Acceptance Criteria
|
|
68
|
+
|
|
69
|
+
- Single file → `adhoc_artifact`; multiple files → `adhoc_bundle`;
|
|
70
|
+
manifest carries per-member path/size/sha256; JSON output matches.
|
|
71
|
+
- Determinism: same files, same flags → identical manifest content
|
|
72
|
+
except created_at/evidence id.
|
|
73
|
+
- Missing file, unreadable file, duplicate path → distinct typed
|
|
74
|
+
errors, no evidence row, no event, no manifest file left behind.
|
|
75
|
+
- `validate --strict`: green after add; deleting a member → WARNING
|
|
76
|
+
(still ok); editing a member → WARNING naming the hash mismatch;
|
|
77
|
+
deleting the MANIFEST → ERROR.
|
|
78
|
+
- End-to-end test: `evidence add` → `verification feedback
|
|
79
|
+
--status executed --evidence <new id>` succeeds (closes the M2
|
|
80
|
+
dogfood gap).
|
|
81
|
+
- Events mirrored in SQLite and JSONL; strict audit integrity stays
|
|
82
|
+
green (regression test).
|
|
83
|
+
- `ruff check .` passes; full `python3 -m pytest` passes; `pcl init`
|
|
84
|
+
smoke against a temp dir passes.
|
|
85
|
+
|
|
86
|
+
## Do Not
|
|
87
|
+
|
|
88
|
+
- Do not copy member files or add `--copy` yet.
|
|
89
|
+
- Do not execute `--command` or capture output (`--capture` is out of
|
|
90
|
+
scope by design).
|
|
91
|
+
- Do not add an M:N evidence link table or any migration.
|
|
92
|
+
- Do not use "verified"/"safe" language for adhoc evidence — it is a
|
|
93
|
+
recorded claim with pinned hashes.
|
|
94
|
+
- Do not touch `verification feedback` flags (`--output-file` is
|
|
95
|
+
formally superseded, not implemented).
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Task 0094: Job Completion Evidence Linkage (v0.2.2, F3)
|
|
2
|
+
|
|
3
|
+
Design source: `docs/evidence-entry-paths-design.md`
|
|
4
|
+
(**APPROVED 2026-07-07**, Part 3). Depends on 0093 being merged (its
|
|
5
|
+
adhoc evidence rows are natural inputs here, and both touch cli.py /
|
|
6
|
+
validators tests). No migration; schema stays v5.
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
In the ax1-moc1 dogfood run, `pcl jobs list --json` showed empty
|
|
11
|
+
evidence for jobs whose `output_path` files existed, and there was no
|
|
12
|
+
way to attach evidence when completing a job. Close both gaps using
|
|
13
|
+
the EXISTING `latest_evidence_id` pointer on agent jobs.
|
|
14
|
+
|
|
15
|
+
## Scope
|
|
16
|
+
|
|
17
|
+
### 1. `pcl jobs complete <job-id> --evidence E-00xx`
|
|
18
|
+
|
|
19
|
+
- Optional repeatable? NO — single `--evidence` flag (the
|
|
20
|
+
one-pointer model matches `latest_evidence_id`; multiple artifacts
|
|
21
|
+
are one adhoc bundle from 0093).
|
|
22
|
+
- The referenced evidence row must exist → typed error otherwise,
|
|
23
|
+
nothing changed.
|
|
24
|
+
- Sets `latest_evidence_id` on the job as part of the existing
|
|
25
|
+
completion flow; completion event payload gains the evidence id.
|
|
26
|
+
All existing completion semantics (summary, status transition,
|
|
27
|
+
guards) unchanged.
|
|
28
|
+
|
|
29
|
+
### 2. Jobs-list evidence visibility audit (the ax1-moc1 symptom)
|
|
30
|
+
|
|
31
|
+
- Reproduce first: in the ax1-moc1 run, jobs completed through the
|
|
32
|
+
normal flow showed `evidence: []`/empty in `pcl jobs list --json`
|
|
33
|
+
even though `output_path` existed and ingest had run. Find out
|
|
34
|
+
why (linkage never set? read path not surfacing it? ingest path
|
|
35
|
+
only sets it on certain flows?) and fix the actual cause — do not
|
|
36
|
+
paper over it in the list renderer.
|
|
37
|
+
- After the fix: a job whose output was ingested surfaces its
|
|
38
|
+
evidence reference in `jobs read` / `jobs list --json` and
|
|
39
|
+
dashboard-data.
|
|
40
|
+
|
|
41
|
+
### 3. Documentation
|
|
42
|
+
|
|
43
|
+
- `docs/golden-path.md` / agent adapter docs: one short paragraph —
|
|
44
|
+
complete a job with `--evidence` when the artifact is already
|
|
45
|
+
recorded (0093 flow), otherwise ingest output as before.
|
|
46
|
+
|
|
47
|
+
## Acceptance Criteria
|
|
48
|
+
|
|
49
|
+
- `jobs complete --evidence E-00xx` sets `latest_evidence_id`,
|
|
50
|
+
appends the completion event with the evidence id, and the linkage
|
|
51
|
+
appears in `jobs read --json`, `jobs list --json`, and
|
|
52
|
+
dashboard-data.
|
|
53
|
+
- Unknown evidence id → typed error; job stays incomplete and
|
|
54
|
+
unchanged.
|
|
55
|
+
- Root-cause test for the visibility bug: a test that reproduces the
|
|
56
|
+
original empty-evidence symptom path and asserts it is fixed
|
|
57
|
+
(write the test against the actual discovered cause, and explain
|
|
58
|
+
the cause in the task report).
|
|
59
|
+
- Existing completion without `--evidence` behaves exactly as
|
|
60
|
+
before.
|
|
61
|
+
- `ruff check .` passes; full `python3 -m pytest` passes; `pcl init`
|
|
62
|
+
smoke against a temp dir passes; strict validate/audit integrity
|
|
63
|
+
regression stays green.
|
|
64
|
+
|
|
65
|
+
## Do Not
|
|
66
|
+
|
|
67
|
+
- Do not add repeatable `--evidence` or an M:N link table.
|
|
68
|
+
- Do not auto-create evidence from `output_path` without ingest —
|
|
69
|
+
linkage requires a real evidence row.
|
|
70
|
+
- Do not change ingest contracts (`agent-output/v1`) or job state
|
|
71
|
+
machine semantics.
|
|
@@ -78,6 +78,12 @@ The expected output path is deterministic:
|
|
|
78
78
|
|
|
79
79
|
The ingest path must be the project-scoped `.project-loop/evidence/agent-runs/<job_id>/output.md`. Files from another directory, even if they contain an `agent-runs/<job_id>` segment, are rejected. Ingest is also a guarded state transition: cancelled or failed jobs cannot be revived by late output, and inactive workflow runs cannot accept new agent output.
|
|
80
80
|
|
|
81
|
+
If a job artifact has already been recorded with `pcl evidence add`, complete
|
|
82
|
+
the job with `pcl jobs complete <job-id> --evidence E-00xx` to link that
|
|
83
|
+
existing evidence row. Otherwise, keep using `pcl ingest-agent-run` for raw
|
|
84
|
+
agent output so PLH validates `agent-output/v1`, creates the evidence row, and
|
|
85
|
+
marks the job passed in one guarded transition.
|
|
86
|
+
|
|
81
87
|
After ingest, `pcl jobs read J-0001 --json` and `pcl jobs list --json` expose the derived evidence linkage:
|
|
82
88
|
|
|
83
89
|
```json
|
|
@@ -88,7 +94,7 @@ After ingest, `pcl jobs read J-0001 --json` and `pcl jobs list --json` expose th
|
|
|
88
94
|
}
|
|
89
95
|
```
|
|
90
96
|
|
|
91
|
-
The linkage is derived from `agent_output_ingested` events and `evidence` rows, not from a mutable `agent_jobs.evidence_id` column. Repeated ingests can therefore preserve multiple evidence ids while the latest evidence remains easy to find from job surfaces and the dashboard.
|
|
97
|
+
The linkage is derived from `agent_output_ingested` events, evidence-bearing `agent_job_completed` events, and `evidence` rows, not from a mutable `agent_jobs.evidence_id` column. Repeated ingests can therefore preserve multiple evidence ids while the latest evidence remains easy to find from job surfaces and the dashboard.
|
|
92
98
|
|
|
93
99
|
## Minimal Output File
|
|
94
100
|
|
|
@@ -171,6 +171,42 @@ under `.project-loop/evidence/context-receipts/` and registers it through the
|
|
|
171
171
|
existing `evidence` table with type `context_receipt`, plus an append-only
|
|
172
172
|
event.
|
|
173
173
|
|
|
174
|
+
## Adhoc Evidence Manifests
|
|
175
|
+
|
|
176
|
+
`pcl evidence add` records existing local files that were produced outside the
|
|
177
|
+
agent-job ingest path. One `--file` creates evidence type `adhoc_artifact`; two
|
|
178
|
+
or more `--file` flags create `adhoc_bundle`.
|
|
179
|
+
|
|
180
|
+
The command writes an `adhoc-evidence/v0` manifest under
|
|
181
|
+
`.project-loop/evidence/adhoc/` and stores one `evidence` row whose `path`
|
|
182
|
+
points at that manifest. Manifest members are referenced in place and pinned at
|
|
183
|
+
record time with only:
|
|
184
|
+
|
|
185
|
+
- relative `path`;
|
|
186
|
+
- `size_bytes`;
|
|
187
|
+
- `sha256`.
|
|
188
|
+
|
|
189
|
+
Member files are not copied and their contents are never embedded in the
|
|
190
|
+
manifest. The optional `--command` value is the caller's claim about how the
|
|
191
|
+
artifact was produced. PLH stores it verbatim on the evidence row; it does not
|
|
192
|
+
run the command or verify that the command produced the files.
|
|
193
|
+
|
|
194
|
+
Strict validation treats a missing or corrupt adhoc manifest as a state
|
|
195
|
+
integrity error. If a referenced member file is later deleted or edited, strict
|
|
196
|
+
validation reports a warning naming the evidence id, member path, and drift kind
|
|
197
|
+
while keeping the recorded hash as the pinned claim.
|
|
198
|
+
|
|
199
|
+
Worked example:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
pcl evidence add \
|
|
203
|
+
--file work/reports/pytest-out.txt \
|
|
204
|
+
--summary "pytest run for suggestion E-0017/VS-01" \
|
|
205
|
+
--command "python3 -m pytest tests/test_context.py" \
|
|
206
|
+
--json
|
|
207
|
+
pcl verification feedback --suggestion E-0017/VS-01 --status executed --result passed --evidence E-00xx
|
|
208
|
+
```
|
|
209
|
+
|
|
174
210
|
## Verification Feedback
|
|
175
211
|
|
|
176
212
|
Schema version 5 adds `verification_feedback`, an append-only event table for
|
|
@@ -134,7 +134,7 @@ jobs:
|
|
|
134
134
|
- uses: actions/setup-python@v5
|
|
135
135
|
with:
|
|
136
136
|
python-version: "3.11"
|
|
137
|
-
- uses: owner/project-loop-harness/.github/actions/project-loop-validate@v0.2.
|
|
137
|
+
- uses: owner/project-loop-harness/.github/actions/project-loop-validate@v0.2.2
|
|
138
138
|
with:
|
|
139
139
|
root: "."
|
|
140
140
|
strict: "true"
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# v0.2.2 Design: Evidence Entry Paths
|
|
2
|
+
|
|
3
|
+
Status: **APPROVED 2026-07-07 (human approval).** Decisions: (1) two
|
|
4
|
+
evidence types `adhoc_artifact` / `adhoc_bundle`; (2) bundle-member
|
|
5
|
+
hash drift is a WARNING in `pcl validate --strict`, not an error;
|
|
6
|
+
(3) the `verification feedback --output-file` idea is formally
|
|
7
|
+
superseded by `pcl evidence add`. No migration; everything stays on
|
|
8
|
+
schema v5. Implementation: task 0093 then 0094.
|
|
9
|
+
|
|
10
|
+
Sources: v0.2.0 plan M2 dogfood finding (ad-hoc executed feedback has
|
|
11
|
+
no evidence path) and ax1-moc1 external-project agent feedback items
|
|
12
|
+
F2 (single-string `--evidence`), F3 (job completion evidence), F6
|
|
13
|
+
(evidence bundle for screenshot + viewport + visual-check). These are
|
|
14
|
+
four surfaces of ONE gap: **operators and agents produce reviewable
|
|
15
|
+
artifacts outside the job loop, and PLH has no honest way to accept
|
|
16
|
+
them as evidence.**
|
|
17
|
+
|
|
18
|
+
## Design principles (unchanged)
|
|
19
|
+
|
|
20
|
+
- Evidence rows are claims with pointers: PLH records that an
|
|
21
|
+
artifact existed with a given hash at record time. It never claims
|
|
22
|
+
the artifact is correct or that PLH observed its production.
|
|
23
|
+
- CLI-only mutation; every insert goes through the service layer and
|
|
24
|
+
appends a standard event (SQLite + JSONL via `append_event`).
|
|
25
|
+
- No fabrication: PLH never generates artifact content on the
|
|
26
|
+
caller's behalf.
|
|
27
|
+
|
|
28
|
+
## Part 1: `pcl evidence add` (the missing primitive)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pcl evidence add --file work/reports/pytest-out.txt \
|
|
32
|
+
--summary "pytest run for suggestion E-0017/VS-01" \
|
|
33
|
+
--command "python3 -m pytest tests/test_context.py" --json
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
- Requires at least one existing, readable `--file`; records path,
|
|
37
|
+
size, and sha256 AT RECORD TIME into a small manifest artifact
|
|
38
|
+
under `.project-loop/evidence/adhoc/`, creates one evidence row
|
|
39
|
+
pointing at that manifest, and appends one event.
|
|
40
|
+
- Evidence `type` is `adhoc_artifact` — the epistemic marker that
|
|
41
|
+
this entered outside the job/workflow loop. Reports, dashboards,
|
|
42
|
+
and strict validation treat it as normal evidence; the type makes
|
|
43
|
+
provenance visible, not second-class.
|
|
44
|
+
- `--command` is the CALLER'S statement of how the artifact was
|
|
45
|
+
produced. PLH stores it verbatim as a claim; it does not run or
|
|
46
|
+
verify it (same discipline as `verification_feedback.executed`).
|
|
47
|
+
- This closes the M2 dogfood gap directly:
|
|
48
|
+
`pcl evidence add --file out.txt ...` → `E-00xx` →
|
|
49
|
+
`pcl verification feedback --suggestion 'E-0017/VS-01'
|
|
50
|
+
--status executed --result passed --evidence E-00xx`.
|
|
51
|
+
- The earlier `--output-file` idea on `verification feedback` is
|
|
52
|
+
SUPERSEDED by this: one general primitive instead of a per-command
|
|
53
|
+
attachment flag.
|
|
54
|
+
|
|
55
|
+
## Part 2: bundles — multiple files, ONE evidence row (F2 + F6)
|
|
56
|
+
|
|
57
|
+
`--file` is repeatable. Two or more files produce a single evidence
|
|
58
|
+
row of type `adhoc_bundle` whose manifest lists every member with
|
|
59
|
+
path, size, and sha256:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pcl evidence add \
|
|
63
|
+
--file work/reports/rendered-desktop.png \
|
|
64
|
+
--file work/reports/rendered-mobile.png \
|
|
65
|
+
--file work/reports/visual-check.json \
|
|
66
|
+
--summary "visual QA bundle for TC-0002"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- Members are referenced in place and pinned by hash — NOT copied.
|
|
70
|
+
If a member later changes on disk, the manifest hash makes the
|
|
71
|
+
drift detectable (`pcl validate --strict` may warn; blocking is a
|
|
72
|
+
later decision). A `--copy` durability mode can come later if
|
|
73
|
+
dogfood demands it.
|
|
74
|
+
- This resolves F2 WITHOUT a schema change: `test_cases.evidence_id`
|
|
75
|
+
and `defects.evidence_id` stay single-column. Instead of repeatable
|
|
76
|
+
`--evidence` flags and an M:N link table (migration 006), the
|
|
77
|
+
answer is "make one bundle, link its one ID". An M:N table is
|
|
78
|
+
reconsidered only if dogfood shows bundles insufficient.
|
|
79
|
+
|
|
80
|
+
## Part 3: job completion evidence (F3)
|
|
81
|
+
|
|
82
|
+
- `pcl jobs complete <job-id> --evidence E-00xx` sets the job's
|
|
83
|
+
existing `latest_evidence_id` pointer (no schema change) so
|
|
84
|
+
`pcl jobs list --json` stops showing empty evidence for jobs whose
|
|
85
|
+
outputs exist.
|
|
86
|
+
- Independently: when a job output file exists at `output_path` and
|
|
87
|
+
was ingested, the ingest path already creates evidence — audit why
|
|
88
|
+
`jobs list --json` showed empty evidence in the ax1-moc1 run and
|
|
89
|
+
fix the linkage/read path as part of this work.
|
|
90
|
+
|
|
91
|
+
## Explicitly out of scope
|
|
92
|
+
|
|
93
|
+
- Auto-execution or output capture by PLH (`--capture -- <cmd>`):
|
|
94
|
+
recording is manual; PLH does not run the caller's commands.
|
|
95
|
+
- M:N evidence link tables (migration) — bundles first.
|
|
96
|
+
- Re-recording evidence onto already-terminal test states (F1's
|
|
97
|
+
no-op rule stands; re-verification flow is a later design).
|
|
98
|
+
- Content inspection/validation of member files beyond hashing.
|
|
99
|
+
|
|
100
|
+
## Sequencing (proposed)
|
|
101
|
+
|
|
102
|
+
1. **0093**: `pcl evidence add` + bundle manifest + adhoc types +
|
|
103
|
+
strict-validate integration (manifest members exist; hash drift
|
|
104
|
+
warning).
|
|
105
|
+
2. **0094**: `pcl jobs complete --evidence` + the jobs-list evidence
|
|
106
|
+
visibility audit/fix.
|
|
107
|
+
|
|
108
|
+
Both are additive CLI + artifact work on schema v5.
|
|
109
|
+
|
|
110
|
+
## Approval record (2026-07-07)
|
|
111
|
+
|
|
112
|
+
1. Two evidence types confirmed: `adhoc_artifact` (single file) /
|
|
113
|
+
`adhoc_bundle` (multiple files) — cheap to read in lists.
|
|
114
|
+
2. Bundle-member hash drift in `--strict` is a WARNING. Rationale:
|
|
115
|
+
drift is a fact about the working tree moving on, not a state
|
|
116
|
+
integrity violation; the pinned hash in the manifest remains the
|
|
117
|
+
recorded claim.
|
|
118
|
+
3. `verification feedback --output-file` is superseded by
|
|
119
|
+
`pcl evidence add` and will not be implemented.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Dogfood Feedback: ax1-moc1 (external project, agent operator)
|
|
2
|
+
|
|
3
|
+
Source: cockpit task `ae7cd335` (codex / gpt-5.5 xhigh, YOLO mode),
|
|
4
|
+
project `~/Dev/ax1-moc1`, 2026-07-06. The agent implemented a
|
|
5
|
+
responsive LP from 10 reference comps end-to-end under PLH
|
|
6
|
+
(`project-control-loop` skill + pcl 0.2.x), completed in ~21 minutes
|
|
7
|
+
with TC-0001..3 passing, F-0001 passing, US-0001 approved, J-0001..3
|
|
8
|
+
passed, `pcl validate --strict` green, and stopped correctly at the
|
|
9
|
+
human verification gate. Feedback below was then given by the agent
|
|
10
|
+
on request. This is the first recorded end-to-end PLH run by a
|
|
11
|
+
non-PLH-developer operator on a non-PLH project.
|
|
12
|
+
|
|
13
|
+
## What worked (agent's words, condensed)
|
|
14
|
+
|
|
15
|
+
- `pcl next` was excellent: it surfaced the next job, the pending
|
|
16
|
+
human verification, and `requires_human: true`, which prevented
|
|
17
|
+
the agent from self-approving.
|
|
18
|
+
- `pcl test pass --evidence` drew the "implementation is done" line
|
|
19
|
+
well; binding rendered screenshots + visual-check JSON as evidence
|
|
20
|
+
fits web/design work.
|
|
21
|
+
- Keeping dashboard HTML out of machine state was validated in
|
|
22
|
+
practice — CLI/JSON/reports sufficed.
|
|
23
|
+
- The validate/render ritual felt like healthy hygiene, not busywork.
|
|
24
|
+
|
|
25
|
+
## Friction points (verbatim intent, each mapped to a candidate task)
|
|
26
|
+
|
|
27
|
+
| # | Feedback | Candidate response | Size |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| F1 | `pcl feature status F-0001 --status passing` exits 2 on "already passing" — hostile to agents; idempotent transitions should exit 0 + `changed: false` | Idempotent same-state lifecycle transitions across feature/test/story/task/goal commands (no state-change event on no-op) | S |
|
|
30
|
+
| F2 | `--evidence` is a single string; multiple artifacts had to be `;`-joined | Repeatable `--evidence` (and/or JSON array) on evidence-accepting commands | S |
|
|
31
|
+
| F3 | `jobs list --json` shows empty evidence despite `output_path`; wanted `pcl jobs complete --evidence` | Evidence linkage for job completion | S–M |
|
|
32
|
+
| F4 | `feature_coverage` still queues mapper/story_writer/test_designer jobs when stories/tests already exist; agent had to write "already satisfied" reports to close them | Existing-coverage detection → mark such jobs satisfied/no-op | M |
|
|
33
|
+
| F5 | At the human gate, `pcl next` should also say "agent stops HERE" and provide ready-to-send approval-request text for the user | Human-gate handoff text in `pcl next` (Japanese-first; Milestone 13 adjacency) | M |
|
|
34
|
+
| F6 | Wants an evidence bundle type for screenshot + viewport + visual-check report | Evidence bundle design (fold into F2/F3 design) | M |
|
|
35
|
+
| F7 | **Top ask**: a `pcl finish`-style closeout command — check test/job/story states, validate, render, generate the run report, and summarize remaining human gates in one step; "closing out PCL correctly" carried more cognitive load than the implementation itself | Closeout/finish command design (builds on checkpoint 0059 concepts) | M–L |
|
|
36
|
+
|
|
37
|
+
## Cross-links to open design questions
|
|
38
|
+
|
|
39
|
+
- F2/F3/F6 intersect the open `--output-file` question (ad-hoc
|
|
40
|
+
executed-feedback evidence path from the v0.2.0 plan's M2 dogfood
|
|
41
|
+
findings): all four are the same underlying gap — evidence entry
|
|
42
|
+
ergonomics for operators outside the job loop. They should be
|
|
43
|
+
designed together, not piecemeal.
|
|
44
|
+
- F5 feeds the Judgment pillar (Milestone 13 human decision UI) and
|
|
45
|
+
the standing wish that escalations reach humans in readable
|
|
46
|
+
Japanese.
|
|
47
|
+
- F1 is a pure agent-ergonomics fix with no contract risk and is the
|
|
48
|
+
cheapest credibility win.
|
|
49
|
+
|
|
50
|
+
## Explicitly NOT conceded
|
|
51
|
+
|
|
52
|
+
The agent suggested nothing that weakens the epistemic boundaries:
|
|
53
|
+
the human verification gate itself was praised, not contested. No
|
|
54
|
+
item above requires auto-approval, auto-execution, or go/no-go
|
|
55
|
+
verdicts, and none touches the semantic promotion gate.
|
|
@@ -54,6 +54,12 @@ pcl jobs complete --root /tmp/pcl-demo J-0003 --summary "Designed test cases"
|
|
|
54
54
|
pcl next --root /tmp/pcl-demo --explain
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
When a job artifact is already recorded as evidence, link it during completion
|
|
58
|
+
with `pcl jobs complete <job-id> --evidence E-00xx`. If the artifact is a raw
|
|
59
|
+
agent output file at `.project-loop/evidence/agent-runs/<job_id>/output.md`,
|
|
60
|
+
prefer `pcl ingest-agent-run` so PLH validates `agent-output/v1` and records
|
|
61
|
+
the evidence row before marking the job passed.
|
|
62
|
+
|
|
57
63
|
Expected checkpoint:
|
|
58
64
|
|
|
59
65
|
- all jobs are terminal and passed;
|
|
@@ -93,6 +99,8 @@ Review:
|
|
|
93
99
|
|
|
94
100
|
If validation fails or the generated artifacts do not match state, follow [recovery-playbook.md](recovery-playbook.md) before continuing.
|
|
95
101
|
|
|
102
|
+
Status transitions are idempotent for exact same-state requests: repeating a goal, feature, test case, or task status command for the current status exits 0, returns `changed: false` in JSON, and records no new evidence or audit event.
|
|
103
|
+
|
|
96
104
|
## Executor Smoke Path
|
|
97
105
|
|
|
98
106
|
Freshly initialized projects include a command-only workflow for dogfooding the
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.2"
|