: Evaluation lifecycle (grounded generation → review → run → analyze) - #267
Conversation
Add dispatcher-based evaluation creation, catalogue-grounded generation, deterministic CSV export, and folder-scoped quality validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Persist review markers through setup and scoped push, reconcile local and deployed state, and safely promote workspace sets before cleanup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add deployed-set discovery, connected Copilot Studio profile selection, asynchronous run execution, history retrieval, and evidence-based result analysis. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Return explicit reasons for pending reviews and locally completed reviews that have not been pushed, while keeping blocked sets unavailable for execution. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Require structured test-set selection, offer makers self-edit or SME feedback paths, and clarify that reviewer recommendations return official edits and execution ownership to the maker. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Limit reviewer actions to inspection and written recommendations while keeping all source edits, validation, push, and execution with the maker. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Refresh the configured agent and rebuild its baseline before listing review work, using the existing checkpointed refresh flow so reviewers do not need a separate pull step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the original test case identifier as the display fallback when local component metadata is unavailable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Preserve explicit review-block messages, require synchronized review completion, validate runtime configuration, clean collision-safe exports, and keep Python 3.11 compatibility. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Redirect the run command from the monorepo root and document generation, review, push, execution, history, and results behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep PPAPI and Power Apps connection discovery on the same account, reject ambiguous profiles, and include required agent tool bindings in evaluation run requests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add an opt-in TEST-ring utility that clones an evaluation payload with fresh component IDs, resolves the signed-in profile and tool bindings, starts PPAPI, and reports request identifiers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When the signed-in account has multiple connected profiles, select its most recently updated profile instead of treating the selection as ambiguous. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the MinimalBot evaluation POC back behind the dedicated setup pull request while retaining the signed-in profile and tool connection fixes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Dawn Jeong (daeunJe0ng)
left a comment
There was a problem hiding this comment.
[copilot-review] Automated review pass. Verdict: Approve with nits — no blocking issues; one Should-fix (prompt-injection hardening) and one Question.
Design: Correct layer. Dataverse-backed maker-eval lifecycle (sets stored as Copilot Studio type-19 bot-components via /setup); does not conflict with runtime Dataverse removal, and the MinimalBot POC revert (12ec360) keeps it on the standard path.
Security (deep read):
- Should-fix: the topic-grounded
createflow feeds untrusted customer topic fields (modelDescription,triggerQueries,SendActivity) into generation with no "data, not instructions" guard, unlikegenerate(inline comment on create/SKILL.md). - Clear:
generategrounds only in the kit-shipped catalogue; durable writes gated (runPOST, description PATCH undererrors == 0, POST excluded from retry); auth change is in-memory username only and preserves the CWE-209 no-echo pattern; path traversal blocked inevaluation_promotion._paths; CSV formula-injection guarded.
Correctness: push.py publishes review descriptions only after full success (no review_completed over stale YAML); promotion/cleanup payload-equality guards; connection selection fails closed on ambiguous MCS profiles. One Question on _case_passed (inline).
Docs: all 4 new maker-evaluation Learn URLs resolve 200; catalogue URLs spot-checked 200; no fabricated links.
Tests: 9 PR suites 101 passed. Full scripts+flightcheck 1474 passed, 10 failed — the 10 (test_installer_launch.py, test_installer_maker_profile.py) fail identically on base 28af0c3, so pre-existing and unrelated. Caveat: all offline/mocked; the 4 API shapes and run result parsing are unverified against a live tenant — recommend capturing one real get-maker-evaluation-test-run payload before GA.
|
[copilot-review] Follow-up review of the full PR at Thanks for addressing both earlier comments. I confirmed the topic-content guard is present and empty/missing metrics no longer count as PASS. I am not reopening those findings. Purpose and approach Blocking: use current remote review state when deciding whether a set can run. Should-fix: preserve the selected agent through refresh and push. Should-fix: publish a new set’s review marker only after its cases upload successfully. Should-fix: preserve conversational cases in previews and counts. Test coverage and security Verification: nine focused suites passed all 102 tests. Running |
|
Thanks for the thorough follow-up review, Dawn Jeong (@daeunJe0ng). I've addressed all five findings. Summary below. Blocking — use current remote review state when deciding whether a set can run ( evaluation_runs.py ) Should-fix — preserve the selected agent through refresh and push ( evaluation_review.py ) Should-fix — publish a new set's review marker only after its cases upload successfully ( push.py ) Note: I did not add an end-to-end push test here — the push suite is helper-level only, with no push() network harness. The fix reuses the already-contracted deferral path and the covered _review_description_for_create helper. Happy to add a full harness if you'd prefer. Should-fix — preserve conversational cases in previews and counts ( evaluation_csv.py , evaluation_review.py , evaluation_runs.py ) Test coverage — include the lifecycle suites in CI ( .github/workflows/ci.yml ) Verification • tests/scripts (minus the two ignored installer files): 360 passed No live-tenant execution was performed; the API shapes and run-result parsing remain offline/mocked, consistent with the earlier caveat. |
Dawn Jeong (daeunJe0ng)
left a comment
There was a problem hiding this comment.
[copilot-review] Thanks, Apurva. I reviewed the full PR at d5dea9f, the latest fixes, and all comments. Approving the merge with the follow-ups below. This supersedes my earlier recommendation to hold the merge.
Confirmed fixed: active-agent targeting, deferring new-parent review markers until content succeeds, conversational case counts, lifecycle test coverage in continuous integration, and both originally reported remote/local review-state cases. The topic-content guard and no-metrics fixes remain intact.
Non-blocking follow-ups
- Push retry safety, highest priority: In
push.py:2131–2154, if parent/child creation succeeds but the deferred description PATCH fails, the successful component IDs are not saved. Retrying then creates duplicate records. Please preserve recoverable IDs without incorrectly advancing the entire baseline, and add a description-only-failure/retry test. Fix before broad customer rollout. - Conversational CSV content: In
evaluation_csv.py:154–161, text is read from the outer item, but the existing creation instructions put it underactivity.text. That documented shape exports blank question/response cells. Please support the documented nesting and use it in the regression fixture before relying on conversational CSV export/import. The YAML itself remains intact. - Review-state deletion edge case: In
evaluation_runs.py:496–510, absent localreview.jsonplus a completed baseline can still allow a run while the remote marker isreview_requested. Please keep the remote request blocking through that transition and cover the run command as well as discovery. I am downgrading this from merge-blocking: it is a workflow edge case, not a demonstrated authorization bypass.
Verification: 106 focused tests passed. Broader scripts/FlightCheck tests produced 1,479 passes and the same 10 installer failures reproduced on the previous head and base. Separate offline probes reproduced the three follow-ups above. No high-confidence exploitable security vulnerability was established; no live tenant or end-to-end Copilot validation was performed.
These follow-ups do not hold this merge, but the approval does not mean the affected paths have been validated for customer release.
Summary
Adds an end-to-end evaluation lifecycle to the ESS Maker Kit: grounded test-set
generation, a maker/reviewer review-and-promotion workflow, running evaluation
test sets against a Dataverse-backed agent, and analyzing/exporting results.
Everything is additive to the existing kit — no changes to the auth app
registration or credentials.
What's included
New capabilities
own topics, with an ESS catalogue reference for domain coverage.
feedback-only reviewer workflow, automatic refresh of review sets, and
promotion of approved sets.
(per-case pass/fail, failure-pattern classification, suggested actions).
New scripts (
solutions/ess-maker-skills/scripts/)evaluation_runs.py— run test sets, list runs, fetch results/analysis.evaluation_review.py— reviewer routing and feedback workflow.evaluation_promotion.py— promote approved test sets.evaluation_csv.py— results/quality CSV export.evaluate_evals.py,push.py,setup.py,fetch_and_setup.py,and the Power Platform clients (
powerplatform_client.py,pp_admin_client.py).New / updated skills & prompts
evaluations/create,generate(+ess-catalogue.md),review,run,update,validate, and adispatcher.create,evaluate,menu,review,run,update.Tests
New test suites covering the lifecycle:
test_evaluation_runs.py,test_evaluation_review.py,test_evaluation_review_routing.py,test_evaluation_promotion.py,test_evaluation_csv.py,test_evaluate_evals.py,test_setup_evaluations.py,test_fetch_and_setup.py,test_push_scope.py.Scope / non-goals
/setupflow). The MinimalBot / Dataverse-free POC was explored on this branch and
reverted (
12ec360); it is not part of this PR.