Repository navigation
Add catalog-native FlowBlind Research Teammate - #163
Merged
ryansok merged 6 commits intoOct 15, 2026
Merged
Conversation
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
✅ Automated Check Results — All checks passedAll structural, schema, content, documentation, and secret scan checks passed. This PR is ready for human review. The maintainers have been automatically requested.
|
faranm-stack
added a commit
to faranm-stack/discovery
that referenced
this pull request
Sep 24, 2026
Run expanded offline checks against the unchanged microsoft#163 source SHA 7bc7e6a, verifying all 399 original package blobs. Build both original tool Dockerfiles. Exercise synthetic public calculation controls and regression cases, actual emitted JSON schemas, metadata bounds, failure/recovery behavior, original image entry points with read-only inputs, and bounded private pinned-solver conformance cases. Save all actual inputs, outputs, logs, receipts and harness identities for 14 days. Failed or blocked required checks make the final gate fail; no assertions are weakened. Disposable GitHub-hosted runner; 15-minute job; non-root network-disabled test containers; no secrets, Azure deployment, live private activation, model/Studio claims, upstream changes or published feedback. Existing baseline and three-line test-fix runs remain separate evidence. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
@microsoft-github-policy-service agree company="Microsoft" |
Rename the tools to flowblind-prepare and flowblind-run-verify to stay within Discovery's 24-character limit, name each compute node worker, and tell the model to mount inputs at /mnt/input. Publish outputs by renaming a synced temporary file instead of hard linking, because Studio's /output rejects link() with EPERM. A rejected rename now reports output-storage-unsupported instead of a publication conflict. Fix Pearson for constant fields (variance-zero) and very large values, accept recorded null optional context and frame-resolution wall-shear reasons in the output schemas, publish the real vector metadata limits, mark provenance and license as required in the README, accept everyday comparison phrasing in the router, and report mixed-direction speed envelopes in the private method as unbounded. Await the nested scenario-coverage tests. Drop FROM --platform so ACR Tasks can build the images, document Studio's agent-level approval, and follow the stricter catalog tool schema and tag taxonomy. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
POL-015 rejects .mjs and .lock files under agents/. Rename the FlowBlind v2 launchers, verifier, bundled runtime, retained v1 and hidden-flow closures, and portable tests to .js, and ship the hash-pinned Python requirements as requirements.lock.txt (same bytes). The package root package.json already declares "type": "module"; each Dockerfile now writes /app/package.json with "type": "module" so Node loads /app/runtime/*.js as ES modules. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The run tool, agent instructions, and README now say that both the selected data folder and the promoted preparation output use mountPath /mnt/input, and that the flowblind-preparation-<sha256> folder name is never appended to mountPath. In a local Discovery app run, a model appended it and the run tool refused the doubly nested folder. The README also records which chat models were tested: GPT-5.6 Sol with medium reasoning followed the contract; automatic selection on a Copilot Free plan chose MAI-Code-1.1-Flash, which wrote an unsupported conclusion. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ields Discovery Studio rejects two inputMounts at the same path, so the run step now reads the dataset from /mnt/input and the unchanged promoted preparation output from /mnt/preparation. If nothing is mounted there, the run still accepts the preparation next to candidate.csv under /mnt/input. The run tool, agent instructions, and README describe the two mounts. Prepare refusals for incomplete metadata now name each missing or empty required field, and non-text vector metadata refusals name the field. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
8 of 17 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds the reusable catalog-native
flowblind-research-teammate-v2@2.0.0package under
agents/flowblind-research-teammate-v2/.The public surface contains exactly two tools and actions:
flowblind-prepare→prepare-study, confirmation Disabledflowblind-run-verify→run-and-verify-study, confirmation EnabledRegional agreement and vector/time readiness are the only advertised methods.
The retained hidden-flow method is supported privately, and its bytes are
intentionally bundled in both images, but no hidden action, tool, or mapping is
advertised. This is a routing and access boundary, not secrecy. Private
activation requires the exact separately approved and allowlisted overlay plus
V2-LIVE-004; public demos keep it disabled.Type of change
agents/<name>/)starter-kits/<name>/)docs/schemas/**).github/**)Related issue / tracking
n/a
Schema impact
breaking-changelabel and link the rollout plan belowValidation checklist
README.md, schemas) is updated to match the change..auto-registry/**(it is generated post-merge)..DS_Store,.env,*.swp,.idea/,.vs/, etc.).Reviewer notes (optional)
Changes from the Discovery Studio review
flowblind-prepare(17) andflowblind-run-verify(20),within Discovery's 24-character limit. Each tool uses one compute node named
worker.hard links are used, so Studio's
/output(which rejectslink()withEPERM) can store results. A rejected rename now reportsoutput-storage-unsupportedinstead ofconcurrent-publication-conflict.inputMountsatmountPath: /mnt/inputfor the selected data.candidate values across spatial regions"). The v2 router and the retained
regional runtime now share one vocabulary, so they cannot disagree.
FROM --platformand pin thelinux/amd64basemanifests, so
az acr build --platform linux/amd64works.because Studio does not apply per-tool
confirmation.variance-zerofor constant fields and stays exact for verylarge values. Ordinary data keeps bit-identical values.
frame-resolution reason for
wallShear, and the real vector metadata limits(
quantity/license256 andvectorMeaning/provenance2048 characters)in the published input contract.
provenanceandlicense(and the vectortimeUnitandsamplingKind) as required.direction as unbounded instead of an inconsistent failure.
(single
type, typed enums, noexclusiveMinimum, taxonomy tags)..js, and the hidden-flow Pythonrequirements ship as
requirements.lock.txt, so the package passes thesource allowlist (
POL-015) from Community agent and starter-kit security scans and PR gates #132. The package rootpackage.jsonandan
/app/package.jsonwritten by each Dockerfile declare"type": "module".Changes from the Studio re-test
inputMountsat the same path (Duplicate mount path detected: '/mnt/input'), so the run step now takes the dataset atmountPath: /mnt/inputand the unchanged promoted preparation output atmountPath: /mnt/preparation. When nothing is mounted at/mnt/preparation, the run still accepts the preparation folder next tocandidate.csvunder/mnt/input, for hosts that merge attachments; apreparation in both places is refused. The run tool, agent text, and README
describe the two mounts, and the run image sets
FLOWBLIND_PREPARATION_ROOT=/mnt/preparation.required field, for example
Missing required scientist metadata: provenance., and non-text vector metadata refusals name the field.Unexpected keys are reported without being echoed.
Changes from a local Discovery app run
with medium reasoning followed the contract, while automatic selection on a
Copilot Free plan chose MAI-Code-1.1-Flash, which wrote an unsupported
conclusion without a tool result.
Publisher and submission identity
metadata.yamlintentionally retains Microsoftpublisher.party: 1p,discovery-catalog@microsoft.com, and the public Microsoft Discovery supportURL. Please explicitly confirm the 1P classification and support ownership.
The PR is submitted from the personal GitHub account
LizaMalininasolelybecause the Microsoft EMU account cannot create the required public fork. The
transport account does not change the proposed Microsoft publisher identity.
Public and private routing boundary
The catalog declarations expose only the two public tools/actions listed
above. The retained finite-basis hidden-flow closure is present in both images
for a separately governed private route, but it is absent from public tool
registration and agent routing. Image inspection can reveal those bytes, so
the boundary is access control and routing, not secrecy.
Execution path
Thanks for re-testing in Studio. Preparation now works there. For the run,
pass two
inputMounts: the dataset folder atmountPath: /mnt/inputand thepromoted prepare output at
mountPath: /mnt/preparation. The run then reads/mnt/input/candidate.csvand/mnt/preparation/flowblind-preparation-<sha256>/. That Studio run is theremaining live check.
Reviewed identities
2a66fc1d3e4043bfd22095da9855a7eb3986897a25310d35680da408b9377429c9c47fe670baa82fe3575c4532fa5209757a44aaa4aabd20867f65ca09c35b5745ab453c5a1c0ffded90f88cf4fb803e8830d4e5495afed52fbe37bc7b7a8955d8a1cb03b7cd0e983eaa788105e34bd50d730ed58d1c00b42fddfae8sha256:9396b6f72dae4180642685e5d493354e05e2345ea77ac9d80e245da1d1f1105e,run
sha256:9f94b83f69dcf510722a40210b7386b2ecc276a618c972267213a5435690e5aaThe committed
tool.yamlfiles keep the schema-standard versioned ACR tags.Local validation
.github/scripts/validate_pr.pyagainst currentmain(6d2b6e3) for thepackage: passes with no findings; spellcheck clean.
.github/tests: 625passed, both on pristine
mainand with the package.preparation mount, the merged fallback, a preparation in both places, and
refusals that name each missing required field.
review/pr-163-validation-930555e,unchanged: all 22 public probes pass, including
DOC-regionalandDOC-vector; the hidden runtime cases pass, withPR163-HID-DIRECT-CERTIFICATE-INJECTIONblocked as designed; and all 77schema cases validate.
/mnt/input, the prepare output at/mnt/preparation,and
link()/linkat()blocked by seccomp (EPERM, as in Studio), theimages complete prepare and run for WeatherBench2 HRES vs ERA5, VISC'11 PIV
vs CFD, Purdue BT CFD vector time series, and a synthetic control. Results
match the previously recorded values exactly. The Docker smoke test uses
the same two-mount layout.
agent with this package's instructions ran both tools through a local test
host that, like Studio, rejects two mounts at the same path. "Compare…"
wording routed to regional agreement. On its first run call the agent
mounted the data at
/mnt/inputand the prepare output at/mnt/preparation, and the run produced the recorded WeatherBench2 values.