ontoref/reflection/modes/draft-application.ncl
Jesús Pérez 472952e29b
Some checks failed
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (nightly) (push) Has been cancelled
Rust CI / Check + Test + Lint (stable) (push) Has been cancelled
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
feat: domain extension system, VCS abstraction, personal/provisioning domains, web subpages
Domain extension system (ADR-012): bash-layer dispatch activates repo_kind-conditional CLI
  domains. install.nu copies domains/ tree; short_alias wrappers generated (personal, prov).
  ore help and describe capabilities domain-aware.

  personal domain (PersonalOntology): career skills/talks/publications/positioning, CFP
  pipeline (Watching→Delivered), opportunities lifecycle, content pipeline, Sessionize
  integration. Daemon pages: /career, /personal.

  provisioning domain (DevWorkspace/Mixed): FSM state, next transitions, connections graph,
  gates, workspace card, capabilities, backlog. Daemon page: /provisioning.

  VCS abstraction layer (ADR-013): reflection/modules/vcs.nu — uniform jj/git API via
  filesystem detection (.jj/ vs .git/). opmode.nu and git-event.nu migrated off ^git.
  reflection/bin/jjw.nu — jj + ontoref + Radicle agent workspace lifecycle. jjw-ncl-merge.nu
  registered as jj merge tool for .ontology/ NCL conflicts. init-repo.nu for new_project mode.
  jj/rad not in ontoref requirements — belong in orchestration project manifests.

  'Framework RepoKind: ontology/schemas/manifest.ncl gains 'Framework variant; ontoref
  self-identifies as framework — no domain activates for the protocol itself.

  Web presence: personal.html and provisioning.html domain subpages. index.html gains
  "Project Types — Domain Extensions" section with type cards and subpage links. Nav
  compacted (Arch/Prov labels, solid backdrop-filter background).

  on+re: vcs-abstraction (adrs: adr-013) and agent-workspace-orchestration Practice nodes;
  21 manifest capabilities; state.ncl catalysts updated.
2026-04-07 23:08:29 +01:00

76 lines
4.1 KiB
Text

let d = import "../defaults.ncl" in
d.make_mode String {
id = "draft-application",
trigger = "Draft a job, grant, or collaboration application anchored in the personal ontology — projects, practices, and active tensions as evidence of fit",
preconditions = [
".ontology/core.ncl and .ontology/personal.ncl export without errors",
"A target Opportunity node exists in personal.ncl with kind in ['Job, 'Grant, 'Collaboration] and status in ['Watching, 'Evaluating, 'Active]",
"Opportunity has at least one entry in linked_nodes or fit_signals",
],
steps = [
{
id = "resolve_opportunity",
action = "Load the target Opportunity node: kind, name, fit_signals, linked_nodes, deadline, note. The fit_signals declare what the opportunity cares about — they drive node selection in subsequent steps.",
cmd = "nickel export .ontology/personal.ncl | from json | get opportunities",
actor = 'Agent,
on_error = { strategy = 'Stop },
},
{
id = "check_gate_alignment",
action = "Compare the Opportunity's fit_signals against signals accepted by active membranes in gate.ncl. 'OpportunityAlignment and 'IdentityReinforcement are the canonical fit signals. If neither active membrane accepts them, flag: this opportunity may not be the right entry point.",
cmd = "nickel export .ontology/gate.ncl | from json | get membranes | where { |m| $m.active }",
actor = 'Both,
depends_on = [{ step = "resolve_opportunity" }],
on_error = { strategy = 'Continue },
note = "Gate check is advisory. Proceeding despite mismatch is valid but should be explicit.",
},
{
id = "select_narrative_nodes",
action = "From core.ncl, select nodes that best answer the opportunity's implicit questions: (1) What have you built? → Project nodes with artifact_paths. (2) Why does it matter? → Tension nodes showing what problem you are navigating. (3) How do you work? → Practice nodes. (4) What do you believe? → Axiom nodes with invariant = true.",
actor = 'Both,
depends_on = [
{ step = "resolve_opportunity" },
{ step = "check_gate_alignment" },
],
on_error = { strategy = 'Stop },
},
{
id = "resolve_career_trajectory",
action = "From state.ncl career dimension, extract current_state → desired_state trajectory and its active blockers/catalysts. This becomes the 'why now' and 'where I am going' section of the application.",
cmd = "nickel export .ontology/state.ncl | from json | get dimensions | where { |d| $d.id == \"career\" }",
actor = 'Agent,
depends_on = [{ step = "select_narrative_nodes" }],
on_error = { strategy = 'Continue },
},
{
id = "render_draft",
action = "Write the application: opening (why this opportunity from gate alignment check), evidence section (project nodes + artifact_paths as proof), methodology (practices), trajectory (career state), closing (what changes if accepted). Keep each section traceable to a node.",
actor = 'Agent,
depends_on = [{ step = "resolve_career_trajectory" }],
on_error = { strategy = 'Stop },
},
{
id = "review",
action = "Human reviews for: honest representation (does each claim link to real work?), alignment (does it answer what the opportunity actually asks?), coherence (does the narrative arc hold from opening to closing?). Revise or reject.",
actor = 'Human,
depends_on = [{ step = "render_draft" }],
on_error = { strategy = 'Stop },
},
{
id = "update_status",
action = "Update Opportunity status in .ontology/personal.ncl: 'Active if submitting, 'Closed if rejecting. Add a note with the decision rationale — this becomes institutional memory for future fit evaluations.",
actor = 'Human,
depends_on = [{ step = "review" }],
on_error = { strategy = 'Continue },
},
],
postconditions = [
"Application draft exists and is traceable to ontology nodes",
"Gate alignment check is documented regardless of outcome",
"Opportunity status updated with decision rationale in note field",
],
}