Review policy & safety
The rules every listed plugin follows, what maintainers check before marking a plugin verified, and how to report a plugin.
In PKU harness, the agent acts for a student with that student's campus identity. Plugins add to what the agent can do, so every plugin, official or community, has to meet the same rules. This page lists those rules, explains what the "verified" badge means, and tells you how to report a plugin. The rules come from the plugins repository's CONTRIBUTING.md.
Rules
Never ask for campus passwords
Credentials stay on the student's phone. A plugin must not ask for, collect or pass on the
student's password, one-time passcodes (OTP) or session cookies. This applies to its tools, its
UI and its docs. A PLUGIN.md that needs a campus service declares it in campus. The app then
makes those requests with the user's session, and the plugin never sees the credentials. Remote
MCP (Model Context Protocol) servers get no campus session at all.
- Describe each tool clearly. Tools are how both the user and the agent use a plugin. Give
each tool a clear Chinese
title, and if you like a shortsummary(at most 80 characters) that tells users what it does. Write adescriptionthat tells the model when and how to use it. Validate the input; an MCP server does this with JSON Schema. - Declare each tool's effect honestly. A
readtool must not change anything. A tool that changes state iswrite, one that spends money ismoney, and one that posts publicly ispublic. On an MCP server, setreadOnlyHint: trueonly on read-only tools; the app treats every other tool aswrite. Students choose for each effect whether the agent may act directly or must ask first. A wrong effect therefore lets the agent skip a confirmation, and we treat it as a security bug. - Return data, not instructions. Tool results reach the model as data. Don't put prompts,
hidden instructions or text like "ignore previous instructions" in results. If a tool returns
text written by other people, such as forum posts, notices or emails, mark it with
untrusted: true, and never pass that text on as if it were instructions. - Declare everything the plugin accesses. In
PLUGIN.md, list every campus service (campus), public host (network) and host ability (abilities) the plugin needs, and give every tool its realeffect. This list is the permission sheet that students accept. The app refuses anything that isn't declared. - Disclose cloud use. If the plugin uses PKU harness Cloud, the manifest's
cloudblock must say in plain words what data leaves the device. A plugin that collects data without saying so is removed. - Describe the plugin's reach accurately.
scopeslists the hosts your server talks to, andrequireslists what the phone must provide. Don't depend on a shell or a filesystem on the phone. - Credit protocol sources. If you port a campus protocol from pkucli, cite the source file.
Automatic checks and verification
Every listed plugin has passed the scanner (what it checks). Passing the scanner shows that the manifest is well-formed. It doesn't show that the plugin is safe.
The Verified badge means that a maintainer has also done the following:
- read the
PLUGIN.md, its tool files and its Markdown instructions, and confirmed that the declarations match what the steps do. This covers campus services, hosts, abilities, effects and the cloud disclosure. The maintainer also checked that the instructions and results contain no text that reads like a prompt; - confirmed that the public endpoint runs that source, or that the plugin is self-hosted;
- checked the rules above, especially the ones about credentials and prompt injection.
Marking a plugin verified (for maintainers)
Verification is recorded per repository in data/sources.json:
{
"sources": [
{ "repo": "alice/campus-tools", "addedAt": "2026-11-02", "verified": ["canteen-menu"] }
]
}To verify a plugin, add its id to verified in a pull request. bun scripts/marketplace.ts check fails if a verified id no longer exists in the repository. Continuous integration (CI) runs
this check on every change to data/ and once a week.
If a verified plugin later changes a lot, review it again. When in doubt, remove its id. Official
plugins are verified through registry.json in pku-harness-plugins instead.
The optional sources[].path field limits a repository entry to one sub-folder. The submit flow
sets it when someone submits a folder URL.
Reporting a plugin
Open an issue in pkuinfo/pkuharness-website.
Include the plugin's handle (owner/repo/id) and what you observed. For a security vulnerability
in the app or in an official plugin, follow the
security policy instead.
Publishing
Submit a repository, publish many plugins from one repository, update a listing by pushing, and remove a listing.
SDK reference
Where to get `@pku-harness/sdk` and what each module exports. The SDK holds the plugin types (definePlugin, tools, providers, HostServices, HostUI, capabilities), the plugin language interpreter and pure helpers for recurrence, schedules, timetables and formatting.