Project Graph Human Edge
Purpose
Confirm, reject, or manually enter Project Graph edges under human control. This is the only Project Graph maintenance skill allowed to write confirmed edges and cross-ref pins.
Use it when the user says to accept or reject a proposal, manually register a cross-project relation, confirm an auto-edge result, or write a known edge and pin it for navigation.
Initialization Gate
Run after resolving the current project root and before reading proposals or writing confirmed graph state.
wiki_required: true
on_missing_wiki: route project-init
direct_invocation_missing_wiki: dispatch-project-init
- When directly invoked and no parent router is active, treat the bootstrap handoff as an internal routing message, not a terminal user-facing response.
- Unless an explicit no-write constraint or root-confidence check requires confirmation, continue through
project-init in the same turn, consume its return handoff, and resume only at a supported next gate.
pending_primary_stage: project-graph-human-edge
- Preserve the user's requested proposal or manual edge action as
pending_intent.
- If
<project_root>/.llm-wiki/ is absent, stop and return a Context Handoff to project-init; resume only after the router receives initialization readiness and a supported next gate.
- Do not create a partial
.llm-wiki/, edge, proposal update, candidate update, cross-ref pin, or log inside this child as a substitute for initialization.
On the missing-wiki branch, emit this minimal handoff:
bootstrap_handoff:
project_root: <resolved project root>
pending_intent: <preserved proposal or manual edge request>
pending_primary_stage: project-graph-human-edge
requested_stage_or_bridge: project-init
bootstrap_mode: automatic-minimal
current_gate: Initialization Gate
Required Reads
Read only as much as needed for the requested edge action:
../references/project-graph.md
../references/cross-project-refs.md
.llm-wiki/project-graph/edges.md
.llm-wiki/project-graph/candidates.md
.llm-wiki/project-graph/proposals.md, when accepting or rejecting a proposal
.llm-wiki/cross-refs/index.md
.llm-wiki/log.md, when checking prior skip reasons or appending results
- source/config/wiki evidence files when manually entering an edge without an existing proposal
Allowed Writes
Current project only:
.llm-wiki/project-graph/edges.md
.llm-wiki/project-graph/proposals.md
.llm-wiki/project-graph/candidates.md
.llm-wiki/cross-refs/index.md
.llm-wiki/log.md
Forbidden Writes
- remote project wiki, source, config, Briefs, registry, or graph files
- Base Graph catalog, overview, decisions, or other tracked Base files unless the user explicitly invokes a Base Graph skill from the Base Graph context
- machine-local registry files unless the user explicitly asks for resolver configuration and the cross-project reference contract allows it
Accept Proposal Flow
- Resolve the proposal id and read linked candidate/edge/pin state.
- Re-check fingerprint uniqueness in
edges.md and proposal uniqueness among unresolved proposals.
- Confirm that project ids and anchors are logical, repo-relative, and not absolute local paths.
- If accepting an auto-edge proposal, write or upsert the confirmed edge row with
source=auto.
- Copy accepted
verification_status, verification_evidence, contract_summary, anchors, and last_verified according to project-graph.md; after acceptance these become confirmed facts in edges.md.
- Set proposal
human_status=accepted and record a human note when supplied.
- If a source candidate exists, set candidate
status=promoted and edge_id=<confirmed edge id>.
- Upsert one
cross-refs/index.md row using proposed cross-ref fields unless the human instruction explicitly says to skip the pin.
- If the human skips the pin, append the skip reason to
.llm-wiki/log.md.
- Append a log entry with edge id, proposal id, candidate id, verification status, and cross-ref action.
Reject Proposal Flow
- Resolve the proposal id and linked candidate.
- Set proposal
human_status=rejected and record the human reason.
- Do not write
edges.md.
- Do not write
cross-refs/index.md.
- If a linked candidate is
proposed, set it to rejected or blocked according to the human reason and keep edge_id empty.
- Append a log entry with proposal id, candidate id, and reason.
Manual Edge Entry Flow
- Require human-supplied or source-verified
type, from_project, from_anchor, to_project, to_anchor, and contract_summary.
- Verify source evidence when the user requests
source-verified or when the edge will drive fix/develop decisions.
- Generate the edge fingerprint from the canonical direction in
project-graph.md.
- Write or update
edges.md with source=manual.
- Upsert a
cross-refs/index.md pin by default unless the user explicitly says to skip it.
- Create a manual candidate only if the human asks to preserve the discovery trail; otherwise direct manual edge registration does not need a candidate.
- Append a log entry with edge id, verification status, cross-ref action, and any skipped pin reason.
Validation
Before reporting success, check:
- edge ids and fingerprints are unique
- accepted proposals resolve to confirmed edges
- promoted candidates resolve to confirmed edges
- rejected or blocked candidates keep
edge_id empty
- cross-ref pins reference existing edge ids
- every confirmed edge has a cross-ref pin unless a log entry records an explicit skip
- no committed graph row contains an absolute local path
- remote project files were not written
Output
Report:
- action: accepted, rejected, or manual edge written
- confirmed
edge_id, when any
proposal_id and candidate_id, when any
- cross-ref id or explicit skip reason
- changed files
- validation result
1---2name: project-graph-human-edge3description: Use when a human confirms, rejects, or manually enters Project Graph edges and cross-ref pins, including Chinese prompts like 人工登记 edge, human-edge, 确认 proposal, 手动登记跨项目关系, or 接受/拒绝 edge proposal.4---56# Project Graph Human Edge78## Purpose910Confirm, reject, or manually enter Project Graph edges under human control. This is the only Project Graph maintenance skill allowed to write confirmed edges and cross-ref pins.1112Use it when the user says to accept or reject a proposal, manually register a cross-project relation, confirm an auto-edge result, or write a known edge and pin it for navigation.1314## Initialization Gate1516Run after resolving the current project root and before reading proposals or writing confirmed graph state.1718- `wiki_required: true`19- `on_missing_wiki: route project-init`20- `direct_invocation_missing_wiki: dispatch-project-init`21- When directly invoked and no parent router is active, treat the bootstrap handoff as an internal routing message, not a terminal user-facing response.22- Unless an explicit no-write constraint or root-confidence check requires confirmation, continue through `project-init` in the same turn, consume its return handoff, and resume only at a supported next gate.23- `pending_primary_stage: project-graph-human-edge`24- Preserve the user's requested proposal or manual edge action as `pending_intent`.25- If `<project_root>/.llm-wiki/` is absent, stop and return a Context Handoff to `project-init`; resume only after the router receives initialization readiness and a supported next gate.26- Do not create a partial `.llm-wiki/`, edge, proposal update, candidate update, cross-ref pin, or log inside this child as a substitute for initialization.2728On the missing-wiki branch, emit this minimal handoff:2930```text31bootstrap_handoff:32 project_root: <resolved project root>33 pending_intent: <preserved proposal or manual edge request>34 pending_primary_stage: project-graph-human-edge35 requested_stage_or_bridge: project-init36 bootstrap_mode: automatic-minimal37 current_gate: Initialization Gate38```3940## Required Reads4142Read only as much as needed for the requested edge action:4344- `../references/project-graph.md`45- `../references/cross-project-refs.md`46- `.llm-wiki/project-graph/edges.md`47- `.llm-wiki/project-graph/candidates.md`48- `.llm-wiki/project-graph/proposals.md`, when accepting or rejecting a proposal49- `.llm-wiki/cross-refs/index.md`50- `.llm-wiki/log.md`, when checking prior skip reasons or appending results51- source/config/wiki evidence files when manually entering an edge without an existing proposal5253## Allowed Writes5455Current project only:5657- `.llm-wiki/project-graph/edges.md`58- `.llm-wiki/project-graph/proposals.md`59- `.llm-wiki/project-graph/candidates.md`60- `.llm-wiki/cross-refs/index.md`61- `.llm-wiki/log.md`6263## Forbidden Writes6465- remote project wiki, source, config, Briefs, registry, or graph files66- Base Graph catalog, overview, decisions, or other tracked Base files unless the user explicitly invokes a Base Graph skill from the Base Graph context67- machine-local registry files unless the user explicitly asks for resolver configuration and the cross-project reference contract allows it6869## Accept Proposal Flow70711. Resolve the proposal id and read linked candidate/edge/pin state.722. Re-check fingerprint uniqueness in `edges.md` and proposal uniqueness among unresolved proposals.733. Confirm that project ids and anchors are logical, repo-relative, and not absolute local paths.744. If accepting an auto-edge proposal, write or upsert the confirmed edge row with `source=auto`.755. Copy accepted `verification_status`, `verification_evidence`, `contract_summary`, anchors, and `last_verified` according to `project-graph.md`; after acceptance these become confirmed facts in `edges.md`.766. Set proposal `human_status=accepted` and record a human note when supplied.777. If a source candidate exists, set candidate `status=promoted` and `edge_id=<confirmed edge id>`.788. Upsert one `cross-refs/index.md` row using proposed cross-ref fields unless the human instruction explicitly says to skip the pin.799. If the human skips the pin, append the skip reason to `.llm-wiki/log.md`.8010. Append a log entry with edge id, proposal id, candidate id, verification status, and cross-ref action.8182## Reject Proposal Flow83841. Resolve the proposal id and linked candidate.852. Set proposal `human_status=rejected` and record the human reason.863. Do not write `edges.md`.874. Do not write `cross-refs/index.md`.885. If a linked candidate is `proposed`, set it to `rejected` or `blocked` according to the human reason and keep `edge_id` empty.896. Append a log entry with proposal id, candidate id, and reason.9091## Manual Edge Entry Flow92931. Require human-supplied or source-verified `type`, `from_project`, `from_anchor`, `to_project`, `to_anchor`, and `contract_summary`.942. Verify source evidence when the user requests `source-verified` or when the edge will drive fix/develop decisions.953. Generate the edge fingerprint from the canonical direction in `project-graph.md`.964. Write or update `edges.md` with `source=manual`.975. Upsert a `cross-refs/index.md` pin by default unless the user explicitly says to skip it.986. Create a manual candidate only if the human asks to preserve the discovery trail; otherwise direct manual edge registration does not need a candidate.997. Append a log entry with edge id, verification status, cross-ref action, and any skipped pin reason.100101## Validation102103Before reporting success, check:104105- edge ids and fingerprints are unique106- accepted proposals resolve to confirmed edges107- promoted candidates resolve to confirmed edges108- rejected or blocked candidates keep `edge_id` empty109- cross-ref pins reference existing edge ids110- every confirmed edge has a cross-ref pin unless a log entry records an explicit skip111- no committed graph row contains an absolute local path112- remote project files were not written113114## Output115116Report:117118- action: accepted, rejected, or manual edge written119- confirmed `edge_id`, when any120- `proposal_id` and `candidate_id`, when any121- cross-ref id or explicit skip reason122- changed files123- validation result