nx_project.nx
buildroot/runtime/nx_project.nx
about
nx_project.nx -- NISHI PROJECT: the team + contractor project layer for nishifamily.com/project.
Operator 2026-07-09: "get beyond microsoft project and leantime ... work with my team and contractors".
COMPOSES the existing substrate rather than re-implementing it: tasks/deps/completions live in the
nx_vizsla_plan record plane (tsk:/don: records; plan field == project id). This organ adds the layer
the projectmgmt census measured ABSENT:
prj: PROJECT meta (pid, owner, title)
mem: MEMBERSHIP with roles (owner|team|contractor) + data-driven capacity (cap = minutes, or -)
fail-closed ROLE-SCOPED VIEW: owner/team see all tasks; contractor sees ONLY own tasks; a
non-member is DENIED (deny by default -- access is granted by a record, never assumed)
WORKLOAD rollup: per-member open effort vs recorded capacity (over-flag only when cap is data)
Task state derives from the plan records: DONE (don: exists) / BLOCKED (a dep lacks don:) / READY.
Records (load <file> <prefix> [segid], additive + CID-idempotent):
PROJ <pid> <owner> <title>
MEMBER <pid> <person> <role> <cap|->
Commands (pj_cli; built via the _hdl_build wrapper; ARGLESS = selftest gate incl a fork of the
REAL blessed nx_vizsla_plan.elf as the independent tsk:/don: writer -- cross-organ compose proof):
load <file> <prefix> [segid] | view <prefix> <pid> <person> | workload <prefix> <pid>
expect_exit: 0 license_tier: ORIGINAL
dependencies 3 imports · 2 importers
imports: nx_syscalls.nxnx_canon_cid.nxnx_seg_store.nx
imported by: nx_project_gate.nxnx_project_serve.nx
structs
| none |
consts
| 22 | const K_MAGIC_1970: i64 = 1970 |
| 23 | const K_MAGIC_146097: i64 = 146097 |
| 24 | const K_MAGIC_719468: i64 = 719468 |
| 25 | const K_MAGIC_2048: i64 = 2048 |
| 26 | const K_MAGIC_1024: i64 = 1024 |
| 27 | const K_MAGIC_65536: i64 = 65536 |
| 28 | const K_MAGIC_146096: i64 = 146096 |
| 29 | const K_MAGIC_1460: i64 = 1460 |
| 30 | const K_MAGIC_36524: i64 = 36524 |
functions
| 32 | func pj_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } |
| 33 | func pj_p(s: *u8) -> i64 { sys_write(1, s, pj_slen(s)); return 0 } called by 16: pj_pathfailpj_cmd_loadpj_gatherpj_cmd_levelpj_cmd_riskpj_cmd_evm+10 calls 2: sys_writepj_slen |
| 35 | func pj_eq(a: *u8, b: *u8) -> i64 |
| 46 | func pj_cmpgt(a: *u8, b: *u8) -> i64 called by 1: pj_gather |
| 60 | func pj_dup(s: *u8) -> *u8 |
| 68 | func pj_atoi(s: *u8) -> i64 |
| 79 | func pj_digits(s: *u8) -> i64 |
| 91 | func pj_isws(c: i64) -> i64 |
| 98 | func pj_tok(b: *u8, off: i64, lend: i64, dst: *u8, cap: i64) -> i64 |
| 120 | func pj_cat(dst: *u8, off: i64, s: *u8) -> i64 |
| 126 | func pj_catn(dst: *u8, off: i64, v: i64) -> i64 |
| 139 | func pj_kmemeq(b: *u8, off: i64, n: i64, s: *u8) -> i64 |
| 149 | func pj_field(rec: *u8, rl: i64, want: *u8, out: *u8, cap: i64) -> i64 |
| 176 | func pj_iskind(b: *u8, koff: i64, kl: i64, pfx: *u8) -> i64 |
| 181 | func pj_find(list: *i64, n: i64, s: *u8) -> i64 |
| 191 | func pj_datedays(s: *u8) -> i64 called by 8: pj_cmd_loadpj_gatherpj_cmd_levelpj_cmd_riskpj_html_buildpj_cmd_template+2 calls 1: sys_mmap |
| 232 | func pj_contains(b: *u8, sz: i64, s: *u8) -> i64 |
| 248 | func pj_wfile(path: *u8, s: *u8) -> i64 called by 4: pj_cmd_templatepj_cmd_snapshotpj_selftestpsv_selftest calls 4: sys_openat_wrsys_writepj_slensys_close |
| 256 | func pj_starts(s: *u8, pfx: *u8) -> i64 |
| 266 | func pj_pathok(s: *u8) -> i64 |
| 277 | func pj_pathfail() -> i64 |
| 283 | func pj_put(keys: *i64, vals: *i64, nf: i64, kp: *u8, st: *i64) -> i64 |
| 316 | func pj_cmd_load(argc: i64, argv: *i64) -> i64 called by 3: pj_selftestpj_clipsv_selftest calls 18: pj_ppj_pathokpj_pathfailpj_atoisys_now_ussys_mmap+12 |
| 638 | func pj_st_new() -> *i64 |
| 683 | func pj_gather(prefix: *u8, pid: *u8, st: *i64) -> i64 called by 17: pj_viewpj_open_minpj_overpj_visiblepj_task_statepj_cmd_level+11 calls 14: sys_mmapss_manifest_dynpj_catss_readallss_r32pj_iskind+8 |
| 952 | func pj_depsok(dep: *u8, dt: *i64, nd: i64) -> i64 |
| 977 | func pj_state(st: *i64, idx: i64) -> i64 called by 9: pj_viewpj_open_minpj_task_statepj_chain_minpj_cmd_levelpj_cmd_risk+3 calls 2: pj_findpj_depsok |
| 988 | func pj_roleof(st: *i64, person: *u8) -> i64 |
| 997 | func pj_statename(v: i64) -> i64 |
| 1005 | func pj_view(prefix: *u8, pid: *u8, person: *u8, out: *i64) -> i64 |
| 1087 | func pj_open_min(prefix: *u8, pid: *u8, person: *u8) -> i64 |
| 1106 | func pj_over(prefix: *u8, pid: *u8, person: *u8) -> i64 |
| 1121 | func pj_visible(prefix: *u8, pid: *u8, person: *u8, tid: *u8) -> i64 |
| 1138 | func pj_task_state(prefix: *u8, pid: *u8, tid: *u8) -> i64 |
| 1149 | func pj_chain_min(st: *i64, idx: i64, depth: i64) -> i64 |
| 1192 | func pj_cmd_level(prefix: *u8, pid: *u8, out: *i64, aply: *u8) -> i64 |
| 1364 | func pj_cmd_risk(prefix: *u8, pid: *u8, today: *u8, out: *i64) -> i64 |
| 1455 | func pj_cmd_evm(prefix: *u8, pid: *u8, out: *i64) -> i64 |
| 1517 | func pj_head(hb: *u8, o0: i64, title: *u8) -> i64 |
| 1531 | func pj_foot(hb: *u8, o0: i64) -> i64 |
| 1538 | func pj_html_build(prefix: *u8, pid: *u8, person: *u8, today: *u8, hb: *u8) -> i64 |
| 1839 | func pj_html(prefix: *u8, pid: *u8, person: *u8, today: *u8, outpath: *u8) -> i64 |
| 1861 | func pj_civil(z0: i64, out: *i64) -> i64 |
| 1882 | func pj_fmtdate(days: i64, out: *u8) -> i64 |
| 1900 | func pj_cmd_timesheet(prefix: *u8, pid: *u8, out: *i64) -> i64 |
| 1957 | func pj_cmd_notes(prefix: *u8, pid: *u8, tid: *u8, out: *i64) -> i64 |
| 2003 | func pj_cmd_template(argc: i64, argv: *i64) -> i64 |
| 2120 | func pj_cmd_snapshot(prefix: *u8, pid: *u8, snapdate: *u8, outfile: *u8) -> i64 |
| 2166 | func pj_cmd_baseline(prefix: *u8, pid: *u8, out: *i64) -> i64 |
| 2221 | func pj_cmd_burndown(prefix: *u8, pid: *u8, out: *i64) -> i64 |
| 2301 | func pj_cmd_workload(prefix: *u8, pid: *u8) -> i64 |
| 2383 | func pj_run(elf: *u8, args: *i64, outpath: *u8) -> i64 called by 2: pj_selftestpsv_selftest calls 7: sys_forksys_openat_wrsys_dup3sys_mmapsys_execvesys_exit+1 |
| 2413 | func pj_check(idx: i64, ok: i64, name: *u8) -> i64 |
| 2425 | func pj_selftest() -> i64 |
| 2961 | func pj_usage() -> i64 |
| 2966 | func pj_cli(argc: i64, argv: *i64) -> i64 |