From f26e72a01cecd32a4fcacc3d5feba24dd14ae942 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 17:02:16 +0900 Subject: [PATCH 01/14] docs: add cross-agent protocol for operating the GitHub Project (roadmap SoT) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Any LLM agent (Claude, Codex, Grok, Gemini) manages roadmap/work state by directly operating org Project #1 (naruon Platform Roadmap) via `gh`/GraphQL — read (item-list), create (item-create), update status (item-edit), with binding conventions (read-before-write, one-phase-at-a-time, In-Progress collision avoidance, no stopgap productionization). Replaces private-memory tracking; the live Project is the shared durable source of truth. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/agent-github-project-protocol.md | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/agent-github-project-protocol.md diff --git a/docs/agent-github-project-protocol.md b/docs/agent-github-project-protocol.md new file mode 100644 index 000000000..dadc4448b --- /dev/null +++ b/docs/agent-github-project-protocol.md @@ -0,0 +1,71 @@ +# Agent Protocol — Operating the CWL GitHub Project (read / create / update) + +**Any LLM agent (Claude, Codex, Grok, Gemini, …) manages roadmap/work state by DIRECTLY operating the org GitHub Project — not a private memory, not a static file.** GitHub Projects (v2) is the shared, durable, cross-agent source of truth; every agent reads AND writes it with the `gh` CLI (or the GraphQL API). This document is the binding convention for how. + +## The Project + +| key | value | +|---|---| +| Title | naruon Platform Roadmap | +| Owner | `ContextualWisdomLab` (org) | +| Number | `1` | +| URL | https://github.com/orgs/ContextualWisdomLab/projects/1 | +| Project node id | `PVT_kwDOEZWuYc4BczHJ` | +| Full product spec | `ContextualWisdomLab/naruon` → `docs/planning/naruon-platform-plan.md` (PR #974) | + +### Fields (ids are stable; re-discover with `field-list` if a field is added) +| field | id | type | options (name:id) | +|---|---|---|---| +| Status | `PVTSSF_lADOEZWuYc4BczHJzhXZRaw` | single-select | `Todo:f75ad846` · `In Progress:47fc9ee4` · `Done:98236657` | +| Title | `PVTF_lADOEZWuYc4BczHJzhXZRao` | text | — | + +## Auth (once) +Needs a token with the `project` scope. `gh auth refresh -s project,read:project` (or a PAT with `project`). Codex/Grok/Gemini invoke the same `gh` binary. + +## READ (always do this first — don't guess state) +```bash +# all items with their fields (status, title, linked content) as JSON +gh project item-list 1 --owner ContextualWisdomLab --format json --limit 100 +# field definitions + option ids (run if ids above look stale) +gh project field-list 1 --owner ContextualWisdomLab --format json +# a single project's metadata (node id, url) +gh project view 1 --owner ContextualWisdomLab --format json +``` + +## CREATE a work item +```bash +gh project item-create 1 --owner ContextualWisdomLab \ + --title "" \ + --body "" +# to add an EXISTING issue/PR instead of a draft: +gh project item-add 1 --owner ContextualWisdomLab --url +``` + +## UPDATE status (the core operation) +```bash +# item id comes from item-list; field/option ids from the tables above +gh project item-edit \ + --id \ + --project-id PVT_kwDOEZWuYc4BczHJ \ + --field-id PVTSSF_lADOEZWuYc4BczHJzhXZRaw \ + --single-select-option-id # Todo | In Progress | Done +# edit a text field (e.g. Title): +gh project item-edit --id --project-id PVT_kwDOEZWuYc4BczHJ \ + --field-id PVTF_lADOEZWuYc4BczHJzhXZRao --text "" +``` +GraphQL equivalent (if `gh project` is unavailable): `updateProjectV2ItemFieldValue` mutation with the same project/item/field ids. + +## LINK a PR/issue to an item +Add the PR/issue as its own item with `item-add`, or reference the item in the PR body. The "Linked pull requests" field auto-populates for added PRs. + +## Conventions (binding) +1. **Read before write.** Always `item-list` first; never assume an item's current status. +2. **Status semantics.** `Todo` = not started / ready. `In Progress` = an agent is actively working it (set it when you start, so other agents don't collide). `Done` = merged/verified. (There is no "Blocked" option yet — prefix a blocked item's title with `BLOCKER:` and keep it `Todo`, or an admin can add a `Blocked` option to the Status field.) +3. **One phase at a time.** Phases P0→P5 are ordered; do NOT move multiple phases to `In Progress` and fan out parallel PRs. Take one phase as a coherent, verified increment on the previous phase's merged foundation. (This is a standing correction — see the roadmap discipline.) +4. **Don't productionize stopgaps.** Build the real target behind a stable extractor/plugin seam; current deterministic extraction / `to_tsvector` FTS / half-built multi-account model are scaffolding, not things to cement. +5. **Decisions & blockers stay visible** as items until resolved; append resolution to the item body and set `Done`. +6. **Collision avoidance (multi-agent).** Before starting an item, set it `In Progress` and put your agent name + timestamp in a body note; if it's already `In Progress` by another agent, pick a different item. +7. **The Project is the truth**, the naruon spec doc is the detail, and (eventually) naruon's own KG dogfoods this. Keep the Project current; do not maintain a competing private list. + +## Why (not a static mirror) +Other agents CAN read the Project directly via `gh`/GraphQL — so the right move is a shared operating convention on the LIVE project, not a static markdown copy that goes stale. This file is the convention; the data lives in Project #1. From 078f058c1d263682eabf4478b498211386a2f632 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 17:57:43 +0900 Subject: [PATCH 02/14] docs: codify cross-repo reference convention (owner/repo#num or full URL) A verbal "I'll use owner/repo#num going forward" is not a rule until codified where every agent reads it. Binding convention: cross-repo issue/PR references must be `owner/repo#num` or a full URL (never plain "naruon PR #974", which does not link and breaks traceability). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/agent-github-project-protocol.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/agent-github-project-protocol.md b/docs/agent-github-project-protocol.md index dadc4448b..f69aa68f2 100644 --- a/docs/agent-github-project-protocol.md +++ b/docs/agent-github-project-protocol.md @@ -69,3 +69,11 @@ Add the PR/issue as its own item with `item-add`, or reference the item in the P ## Why (not a static mirror) Other agents CAN read the Project directly via `gh`/GraphQL — so the right move is a shared operating convention on the LIVE project, not a static markdown copy that goes stale. This file is the convention; the data lives in Project #1. + +## Cross-repo references (BINDING) + +When referencing an issue or PR that lives in ANOTHER repository, ALWAYS use a linkable form so GitHub creates a real cross-reference (and it shows in the target's timeline): +- `owner/repo#num` — e.g. `ContextualWisdomLab/naruon#974` +- or a full URL — e.g. `https://github.com/ContextualWisdomLab/naruon/pull/974` + +NEVER write plain text like `naruon PR #974` — it does NOT link and breaks traceability. A bare `#num` only links within the SAME repo. This applies to issue/PR bodies, comments, commit messages, and Project item bodies. (Same-repo references may use `#num`.) From e70f71ddfcb6d3eda82d84071c9baccd94785e79 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:16:45 +0900 Subject: [PATCH 03/14] docs: add CWL master context brief (context-reset reconstruction) A single durable, agent-readable brief so any agent with a fresh context (Claude/Codex/Grok/Gemini) can reconstruct and continue the whole program without the originating conversation: mission, naruon-as-platform + a-la-carte plugins, ecosystem component roles + product names, personas + killer demo, the cross-cutting disciplines (CP-1..5/G6/SEAM: no-ask dense-KG, ecological-fallacy multi-membership norm groups, commitment-status, privacy minimal-disclosure bridge, language-agnostic FTS), the AI SOC (no-VT, source-agnostic), engineering conventions, roadmap P0-P5, the Project-#1 traceability model, and current state (blocker B1, pending decisions, built PRs). Private assistant memory is not the source of truth; this repo is. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 80 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/CWL-MASTER-CONTEXT.md diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md new file mode 100644 index 000000000..8a872a75a --- /dev/null +++ b/docs/CWL-MASTER-CONTEXT.md @@ -0,0 +1,80 @@ +# CWL Master Context — read this first (context-reset reconstruction brief) + +> Purpose: a single, durable, agent-readable brief so ANY agent (Claude with a fresh context, Codex, Grok, Gemini) can reconstruct and continue this work WITHOUT the originating conversation. Private assistant memory is NOT the source of truth — this repo is. Keep this file current. +> +> Durable sources of truth (in priority order): (1) **GitHub Project #1** "naruon Platform Roadmap" https://github.com/orgs/ContextualWisdomLab/projects/1 — live work/roadmap; (2) **naruon `docs/planning/naruon-platform-plan.md`** (PR ContextualWisdomLab/naruon#974) — full IA/User-Stories/Use-Cases/Architecture spec; (3) **`docs/agent-github-project-protocol.md`** (this repo, PR #363) — how agents operate the Project + cross-repo-ref convention; (4) this file. + +## 1. Mission (Contextual Wisdom Lab / 맥락지혜 연구실) +Turn scattered enterprise context into **judgment-ready structure, then action**. The problem isn't lack of information — it's that the *context to judge is scattered* ("정보 부족이 아니라 판단할 맥락이 흩어져 있다 / 구슬이 서 말이어도 꿰어야 보배"). **Synthesis, not summary.** DIKW as checkpoints: records → contextualize → judgment point → action. Reduce human cognitive load ("사람이 덜 소모"). Judgment stays with the human. + +## 2. naruon = the PLATFORM (one platform, many à-la-carte plugins) +`naruon` is an email-first workspace (FastAPI backend + Next.js frontend + a thin WebSocket connector proxying IMAP/SMTP/CalDAV/WebDAV from customer premises) whose core is a **dense two-tier knowledge graph** over Postgres + pgvector. It is a **TRUE plugin platform** ("진정한 plugin처럼 계속 붙일 수 있는"): plugin manifest/contract, extension points (ingest sources, DOM/analysis processors, KG enrichers, work-item types, UI panels, agents, scheduling), plugin registry, versioned API, isolated execution for untrusted plugins (noema quarantine sandbox). **À-la-carte / opt-in**: each capability is a plugin a user enables by need; nothing mandatory; different users run different combos. Every imported component is **standalone AND submodule** ("따로, 또 같이"). + +## 3. Ecosystem components (product names + roles) +Product renames (repo slug → product name; domains purchased): `cwl-idp`→**keyverse** (keyverse.io), `waf-ids-ai-soc`→**wardnet** (wardnet.io), `cwl-editor`→**inkspan** (inkspan.io). Other domains: cloud-erd.app (pg-erd-cloud), naruon.net / naruon.io (naruon). +- **naruon** — the platform (email/PIM/KG). Verticals + capabilities plug in. +- **bandscope** (BandScope) — a **vertical**: local-first desktop rehearsal app for MUSICIANS (Tauri+React+Python). Its users also use naruon for email → they plug into the platform. (NOT a naruon fork.) +- **wardnet** (was waf-ids-ai-soc) — WAF / IDS / **AI SOC** / software LB / APIM. +- **keyverse** (was cwl-idp) — central passwordless IdP: OIDC/OAuth2.1/FIDO2/SCIM/SAML(ADFS)/LDAP; eliminate passwords; federates external IdPs (incl. the employer ADFS via feelanet-adfs) + account linking / cross-IdP user merge. Built on **Keycloak (Apache-2.0)** — ZITADEL was removed (AGPL-3.0, not permissible). NO admin-console operation — config-as-code / Admin REST API only. +- **inkspan** (was cwl-editor) — commercial-grade Markdown + HTML WYSIWYG editor (TipTap/ProseMirror, MIT) with base64-inline images (LLM-readable) + a standalone base64 converter + bundled offline OFL fonts (Noto Sans KO/EN/JA/ZH/VI for air-gapped use). Feature: compose email in Markdown → HTML on send. +- **clearfolio** — document viewer (à-la-carte plugin). +- **pg-erd-cloud** (cloud-erd.app) — ERD tool for developers / data architects. +- **contextual-orchestrator** — LLM **token-cost optimizer + performance + upstream load balancer + routing hub** (LiteLLM-plus). Multi-dimensional cost review (account/service/upstream_api/model/team/group/company). Controls BATCH routing → **pg-llm-batch**. +- **pg-llm-batch** — standalone Apache-2.0 batch engine (Rust pg_tiktoken token counting + Postgres batch submit/poll/retrieve), extracted from `xtrmLLMBatchPython` (which stays PRIVATE forever — its history has live keys + employer-confidential Hyosung-ITX data; rotate those keys). The orchestrator controls its routing. +- **codec-carver** — STT / omni-modal speech+video codec (audio/video conversion for LLM input); speaker diarization + consented voiceprint; feeds auto meeting minutes. +- **fast-mlsirm** — LLM-as-a-Judge output **calibration** + measurement/evaluation-item quality; incorporate `aFIPC` Fixed-Item Parameter Calibration + `kaefa`-style item-fit optimal-model search (R IRT/psychometrics). GPU = GPGPU in the Rust core (wgpu, single numpy|rust backend axis). +- **semantic-data-portal (SDP)** — the higher **ontology / catalog / governance plane** ABOVE the doc KG (Apache AGE + pgvector). naruon owns the doc KG (content_graph + project_graph in Postgres); SDP is not that store. +- **noema** — agent runtime (Pydantic-AI / Codex-Python): a GitHub Review Agent in CI + a do-anything agent inside naruon + the **lightweight quarantine sandbox**. +- **newsdom-api** — PDF → DOM recognition sidecar (generalized beyond JP newspapers). naruon parses non-PDF formats (html/md/plaintext) into its content_graph. +- **scopeweave** — issue/WBS **management** + ITSM Service Request (two-layer: requester ticket ↔ team issues). Consumes issues naruon extracts from email/conversation/ITSR. (Dev-CODE issues stay in GitHub/GitLab — integrate, don't rebuild GitHub.) +- **appguardrail** — app security guardrails; collects org security/CI failures + Strix findings as issues. +- Forks (fix UPSTREAM via a very detailed PR in the upstream's language): argos, vooster (+v2), and R pkgs. `xtrmLLMBatchPython` PRIVATE. + +## 4. Personas + killer demo +- **P1** = the org lead (the user): data architect + data Product Manager + data expert + **AI System Architect**, in an AI business team → needs legal/regulatory (법령) review; uses cloud-erd.app. Expects rigor on data modeling/ERD/schema. +- **P2** = his girlfriend (KILLER demo): works in a **Digital Trust / security team on personal-data-protection (개인정보보호)** AND plays in **N amateur workplace bands** → heavy BandScope + naruon user. She forgets her schedule and double-books band rehearsals over prior commitments (incl. dates) → naruon aggregates calendars + extracts commitments to the KG + detects conflicts + reminds, privacy-preserving. Proves platform+verticals AND security/privacy as first-class. + +## 5. Cross-cutting disciplines (ACCEPTANCE CRITERIA, bind every feature) +- **CP-1 DIKW spine**: KG is the product, inbox is an ingest edge; synthesis over summary; reduce cognitive load. +- **CP-2 No-ask / dense-KG auto-resolution**: NEVER ask the user a disambiguation question (asking re-imposes the scattered-context load the product removes). A dense, multi-dimensional KG holds the evidence to auto-resolve (e.g. hotel location vs event venue, host=partner vs colleague, commitment status, travel time). Surface the RESOLVED connection + recommended action + evidence + calibrated confidence; the human **corrects by exception**, never answers a question. Even "pick an option" is a residue of asking. Irreversible/external actions (send/book/approve) still terminate at a human approve/hold, delivered as a correction surface. Connecting context IS the mission — never gate it behind a permission question; KG DENSITY replaces the question. +- **CP-3 Ecological-fallacy discipline**: infer at the correct level of analysis; group/norm-group rates are PRIORS updated by individual content to a POSTERIOR; never impute group→individual (or reverse). One person belongs to **N simultaneous OVERLAPPING norm/reference groups** (multi-MEMBERSHIP graph, not a tree); norms are group-relative; resolve the active norm-group(s) before acting. Honest calibrated confidence. +- **CP-4 Commitment-status weighting**: every commitment has status {confirmed | tentative | desired} + RSVP direction {organizer | attendee}. Conflict detection is STATUS-WEIGHTED (confirmed > tentative > desired). A desired item (an RSVP I'm sending) over a confirmed slot (a paid booking) = conflict the confirmed side wins; NEVER silently break a confirmed commitment. e-Approval (전자결재: leave/travel/expense) outcomes are first-class KG events linked to the events they enable (anticipatory coordination). Worked examples in naruon#974 §6 (UC-01..05). +- **CP-5 Privacy: default-segregated + consent minimal-disclosure bridge**: contexts (personal / work→{former employer, current employer} / per-project / per-band) segregated by default, classified by CONTENT not account. A private fact affects another context ONLY via its necessary CONSEQUENCE (e.g. "unavailable Tue–Thu") — NEVER the private reason (e.g. "hospitalized"). NOT a hard wall — a consent-gated, revocable, audited, minimal-disclosure BRIDGE; user controls disclosure level. Multi-account binding (N email accounts → one identity), content-based classification. Email-to-self (from==to) = personal storage/notes → KG reference nodes, not interpersonal communication. +- **G6 Language-agnostic**: extraction/resolution/search consistent across EN/KO/JA/ZH/VI via LLM extraction + multilingual embeddings + cross-lingual structured topic modeling (STM). NO dependency on morphological analyzers (Kiwi/Nori) — they cause performance cliffs (refs 1week.tistory.com/119-122). **FTS language resolution**: naruon's current `to_tsvector` FTS is language-DEPENDENT and fails CJK (tokenizer cliff) — DROP per-language configs; use dense multilingual embeddings (primary) + language-agnostic sparse (pg_trgm/pg_bigm char n-grams, PostgreSQL-licensed, AND/OR learned-sparse SPLADE-style as pgvector sparsevec) fused via RRF; unaccent+NFC for Vietnamese. +- **SEAM Don't productionize stopgaps**: naruon's current deterministic extraction, to_tsvector FTS, and half-built multi-account model are SCAFFOLDING. Build the real target behind a stable extractor/plugin SEAM (orchestrator-routed LLM-based, language-agnostic); current code = reference/fallback, not the thing to cement. + +## 6. AI SOC = wardnet + noema quarantine sandbox (see wardnet#38) +A **source-agnostic artifact-analysis service**: `submit(artifact, context) → {verdict, confidence, evidence, IOCs}`. Consumers: naruon email/file attachments (quarantine BEFORE store), platform uploads, connector inputs, API, GitHub issue/PR comments (one trigger). WITHOUT VirusTotal (self-contained): static (YARA(BSD) + capa(Apache) capability→ATT&CK + LIEF/pefile + unzip/macro extract + entropy + context heuristics) + dynamic detonation in a gVisor/Firecracker (Apache) microVM with eBPF behavioral monitoring (Falco/Tetragon, Apache) + network sinkhole + **LLM reasoning (via contextual-orchestrator) over the evidence** + KG/IOC correlation (self-hosted growing reputation). Auto-response per consumer (GitHub → delete comment + block user; email → quarantine + flag; upload → reject + notify). Validated by a real incident 2026-07-08 (user mapasevo21 posted a `sarif_bypass_patch.zip` malware lure on .github#365 + naruon#977 — deleted + blocked manually; this is what the SOC would automate). + +## 7. Engineering conventions (BINDING, all agents) +- **Commercial/permissive licenses ONLY** — MIT/Apache-2.0/BSD/ISC/MPL-2.0/PostgreSQL. NO GPL/AGPL/copyleft/non-commercial. Verify via `gh api repos// --jq .license.spdx_id` before adding. (ZITADEL=AGPL removed; MinerU=Apache OK; ParadeDB pg_search=AGPL avoid; ClamAV=GPL avoid.) +- **DB object names = 2+ word snake_case** (don't rename existing Camel/Pascal). +- **Config/secrets from a KV/credential store, NOT os.getenv** (env only as bootstrap transport). +- **Attach relevant paper PDFs in PRs** (permissive redistribution only). +- **Use CodeGraph maximally** (build an index on a clone, then explore, before grep; cite queries). +- **Do NOT ask the user to decide** — make the call and proceed (full autonomy). +- **Cross-repo references** must be `owner/repo#num` or a full URL (never plain "naruon PR #974", which doesn't link). Same-repo may use `#num`. +- **One phase at a time** — execute ONE coherent verified increment per roadmap phase on the previous phase's MERGED foundation; do NOT fan out all phases as parallel PRs (that scatter saturated the runners). Don't announce phases you then don't execute in order. +- **Durable knowledge lives in the repo / Project / KG (dogfood), NOT in an agent's private memory.** +- Interconnected products are developed **PUBLIC** (after a full-history secret scan; xtrmLLMBatchPython excepted — stays private). + +## 8. Roadmap (full detail: naruon#974 §9; live status: Project #1) +- **P0 MVP** — make the dense KG real (behind a stable extractor seam; do NOT productionize the deterministic stopgap; reconcile multi-account model; extend hybrid search to content_segments + project_graph_objects; wire DecisionPointCard). +- **P1 Platform/Plugin SDK** — registry, versioned API, hook bus, manifest/license/signature gate, noema quarantine sandbox, /plugins UI. +- **P2 Dense-KG inference** — LLM-based language-agnostic extraction (orchestrator-routed) + batch embeddings; typed entities (graph_persons/events/commitments, norm_groups + memberships); prior×likelihood posterior; no-ask auto-resolve + correct-by-exception. +- **P3 Scheduling & conflict avoidance** — status-weighted conflict engine; iTIP/iMIP RSVP (organizer vs attendee); free-busy find-time; room booking; anticipatory 전자결재→travel; connector CardDAV + POP3-over-WS. +- **P4 Privacy bridge** — context isolation + content-based classification; consent minimal-disclosure bridge. +- **P5 Verticals** — BandScope, pg-erd-cloud, scopeweave, Inkspan, codec-carver (audio minutes+voiceprint), legal/contract, code-integration — all à-la-carte plugins on the P1 SDK. +- Cross-cutting: OpenTelemetry error tracking across naruon + the connector (self-hosted-runner-style Email/CalDAV/WebDAV/CardDAV proxy); AI-authored Office docs (python-docx/openpyxl/python-pptx); real-time collab (TipTap+Yjs); naruon email signatures; KG-mediated email style correction; project wiki (KG); requirements/RFI/RFP, WBS/estimation, planned-vs-actual gap (early/on-time/delayed/not-performed/skip), Phase/Activity/Task/Duty (=Job/Work/Task/Duty), Waterfall↔Agile (scopeweave). + +## 9. How work is tracked (dogfood the traceability) +GitHub **Project #1** is the shared source of truth. Structure: real **Issues** (roadmap/backlog, in owning repos, custom fields Phase P0–P5/Ops/Decision + Component) and real **PRs** (delivered work, native Repository). Native workflows are ON (item added→Todo, PR merged→Done, item closed→Done). Chain: roadmap **Issue** → agent sets In Progress on pickup → implementing **PR** `Closes #N` → merge → auto Done. Operate the Project per `docs/agent-github-project-protocol.md`. Group by Phase / Component / Repository. + +## 10. Current state (2026-07-08) +- Renames done (keyverse/wardnet/inkspan). Planning spec = naruon#974. Project #1 populated (68 issues + 60 PRs). Protocol = .github#363. +- **BLOCKER B1**: org GitHub Actions effectively HALTED (~86 queued, ~0 in_progress org-wide) — likely the Actions monthly SPENDING CAP. Blocks ALL PR checks/merges + the Cloudflare DNS run (nameservers). Fix (org-admin): raise the Actions spending limit OR add a self-hosted runner. Nothing merges until then. +- **Decisions pending**: (D1) Code Security enablement vs the CodeQL-only code_scanning ruleset (osv/trivy/scorecard SARIF upload) — a private repo needs GHAS seats; reconcile or make those checks non-required. (D2) trivy `limit-severities-for-sarif: true` (gate only CRITICAL/HIGH) — held pending the user's strict-security preference. +- **Built this session, PR-open, awaiting merge (B1)**: see Project #1 PRs (contextual-orchestrator cost/routing #46 + naruon#973; pg-llm-batch; keyverse Keycloak; inkspan; SBOM #361; opencode auto-retry #360; Strix neutral #349 + emit #358; appguardrail collector #254; auto-rebase #357; noema #359/naruon#970; PDF-DOM naruon#965/newsdom#300; SDP #11; fast-mlsirm GPGPU #109; scopeweave #284/naruon#971; fuzzing 10 PRs (found+fixed 2 real naruon bugs); Cloudflare DNS/Pages #362; this protocol #363; planning #974). Human step: report the mapasevo21 malware file (github user-attachments) to GitHub Abuse; rotate the xtrmLLMBatchPython-leaked keys; the org-admin runner/decisions above. + +--- +*Keep this current. Update Project #1 as the live tracker; this file is the narrative brief a fresh agent reads to reconstruct the whole picture.* From 20ebe7f166b1f8958f398007b031303818b61bb8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:20:21 +0900 Subject: [PATCH 04/14] docs: add inter-component UML to master context; make AGENTS.md the entry point - Append the inter-component architecture UML (mermaid) to CWL-MASTER-CONTEXT.md. - AGENTS.md (the file agents auto-load via the CLAUDE.md/GEMINI.md symlinks) now points to the master context + Project #1 + naruon#974 + the project protocol, so a fresh-context agent auto-discovers the durable source of truth instead of a stray docs file. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- AGENTS.md | 4 ++ docs/CWL-MASTER-CONTEXT.md | 94 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..688b33035 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,4 @@ +# AGENTS.md — ContextualWisdomLab .github + + +> **Agents: read the master context FIRST.** Before any work, read [`docs/CWL-MASTER-CONTEXT.md`](docs/CWL-MASTER-CONTEXT.md) (mission · naruon-as-platform + inter-component UML · cross-cutting disciplines · conventions · roadmap · current state), the live **GitHub Project #1** (work/roadmap source of truth), the full spec **ContextualWisdomLab/naruon#974**, and operate the Project per [`docs/agent-github-project-protocol.md`](docs/agent-github-project-protocol.md). The repo/Project — not any private agent memory — is the source of truth. diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 8a872a75a..3d3ca6009 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -78,3 +78,97 @@ GitHub **Project #1** is the shared source of truth. Structure: real **Issues** --- *Keep this current. Update Project #1 as the live tracker; this file is the narrative brief a fresh agent reads to reconstruct the whole picture.* + +## Inter-component architecture (UML) + +Component / interaction diagram of how the ecosystem connects. `naruon` is the platform core; à-la-carte plugins + verticals attach; `contextual-orchestrator` is the LLM plane; `keyverse` is auth; `wardnet` is the edge + AI SOC. + +```mermaid +flowchart TB + P1["👤 P1 — data / AI System Architect (org lead)"] + P2["👤 P2 — Digital-Trust musician (killer demo)"] + + subgraph EDGE["Edge & security"] + WARD["wardnet — WAF / IDS / AI SOC / LB / APIM"] + end + subgraph IDENT["Identity (passwordless)"] + KEY["keyverse — IdP: OIDC/OAuth2.1/FIDO2/SCIM/SAML/LDAP (Keycloak)"] + ADFS[("feelanet-adfs / external ADFS · LDAP")] + end + + subgraph PLATFORM["naruon PLATFORM"] + NAR["naruon — email/PIM + KG (content_graph + project_graph)"] + CONN["connector — self-hosted Email/CalDAV/WebDAV/CardDAV proxy"] + end + + subgraph LLM["LLM plane"] + ORCH["contextual-orchestrator — cost/routing/LB gateway"] + BATCH["pg-llm-batch — batch engine (Rust pg_tiktoken)"] + UP[("upstream LLM providers")] + FM["fast-mlsirm — LLM-as-Judge calibration (aFIPC/kaefa)"] + end + + subgraph DATA["Knowledge / data"] + SDP["semantic-data-portal — ontology/catalog plane"] + NEWS["newsdom-api — PDF → DOM"] + PG[("Postgres + pgvector + Apache AGE")] + end + + subgraph PLUGINS["À-la-carte plugins & verticals (opt-in)"] + INK["inkspan — Markdown/HTML editor (+base64, OFL fonts)"] + CLR["clearfolio — document viewer"] + ERD["pg-erd-cloud — ERD tool"] + SCOPE["scopeweave — issues / WBS / ITSM"] + CODEC["codec-carver — STT / audio→minutes (+voiceprint)"] + BAND["bandscope — musicians' rehearsal vertical"] + NOEMA["noema — agent runtime + quarantine sandbox"] + end + + subgraph INFRA["Infra / governance"] + CF[("Cloudflare — Pages/Workers/DNS")] + GH[(".github — governance + Project #1")] + end + + P1 --> WARD + P2 --> WARD + WARD --> NAR + P1 -. "auth" .-> KEY + P2 -. "auth" .-> KEY + NAR -. "authn/z (OIDC)" .-> KEY + KEY -. "federates in" .-> ADFS + + CONN -->|"ingest mail/cal/files"| NAR + NEWS -->|"PDF DOM"| NAR + NAR --> PG + NAR --> SDP + SDP --> PG + + NAR -->|"LLM: extract / embed / reason"| ORCH + NOEMA --> ORCH + WARD -->|"SOC: LLM reasoning on evidence"| ORCH + ORCH --> UP + ORCH -->|"batch routing"| BATCH + BATCH --> PG + FM -. "calibrates judge outputs" .-> ORCH + + NAR --> INK + NAR --> CLR + NAR --> ERD + NAR -->|"extracted issues → manage"| SCOPE + CODEC -->|"diarize + minutes"| NAR + NAR --> NOEMA + WARD -->|"quarantine detonation"| NOEMA + BAND -->|"musicians also use email"| NAR + BAND -. "rehearsal app" .-> P2 + + NAR -. "OpenTelemetry" .-> GH + CONN -. "OpenTelemetry" .-> GH + NAR --> CF + + classDef core fill:#1f6feb,stroke:#0b3d91,color:#fff; + classDef plane fill:#6e40c9,stroke:#3d1f7a,color:#fff; + class NAR core; + class ORCH,KEY,WARD plane; +``` + +**Reading it:** users hit `wardnet` (edge/SOC) → `naruon` (platform); everything authenticates via `keyverse` (which federates external ADFS/LDAP). `naruon` ingests via the `connector` + `newsdom-api`, builds the KG in Postgres, uses `semantic-data-portal` for the ontology plane, and routes ALL LLM work through `contextual-orchestrator` (which load-balances upstreams and routes batch to `pg-llm-batch`). `noema` is the shared agent runtime + quarantine sandbox (used by naruon, the GitHub review agent, and wardnet's AI SOC). Plugins/verticals (`inkspan`, `clearfolio`, `pg-erd-cloud`, `scopeweave`, `codec-carver`, `bandscope`) attach à-la-carte; `fast-mlsirm` calibrates LLM-as-Judge quality. Hosting = Cloudflare; governance + Project #1 live in `.github`. From a8a1523d41687828dce2d41ef43efade1abbe561 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:21:18 +0900 Subject: [PATCH 05/14] docs: add persona org hierarchy (company/team/team-lead) to master context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each persona sits in company -> team -> under a team lead; this is structural, not flavor: the norm-groups (CP-3 multi-membership), approval chains (CP-4 전자결재 via team lead), team scheduling (RSVP/conflict), and the privacy minimal-disclosure bridge (CP-5, disclose consequence to the team lead, not the reason) all route through it. KG models Person/Company/Team/Role/Band(+leader)/ NormGroup with member_of/reports_to/leads/tenure edges. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 3d3ca6009..74c60323f 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -34,6 +34,12 @@ Product renames (repo slug → product name; domains purchased): `cwl-idp`→**k - **P1** = the org lead (the user): data architect + data Product Manager + data expert + **AI System Architect**, in an AI business team → needs legal/regulatory (법령) review; uses cloud-erd.app. Expects rigor on data modeling/ERD/schema. - **P2** = his girlfriend (KILLER demo): works in a **Digital Trust / security team on personal-data-protection (개인정보보호)** AND plays in **N amateur workplace bands** → heavy BandScope + naruon user. She forgets her schedule and double-books band rehearsals over prior commitments (incl. dates) → naruon aggregates calendars + extracts commitments to the KG + detects conflicts + reminds, privacy-preserving. Proves platform+verticals AND security/privacy as first-class. +**Org hierarchy (structural, not flavor — the norm-groups, approval chains, scheduling, and privacy bridge all route through it):** each persona sits in **company → team → under a team lead (팀장)**. +- P1: AI System Architect in an **AI business team (AI사업팀)** at his employer; reports to his team lead; needs legal/regulatory review. +- P2: in a **Digital Trust / security team (보안팀, 개인정보보호)** at her employer; reports to her team lead; ALSO a member of **N bands, each with its own band leader** (each band = a distinct norm-group with a lead). +These give concrete instances of: **norm-groups** (company, team, band×N — CP-3 multi-membership); **approval chains** (leave/travel 전자결재 flows through the team lead → CP-4 anticipatory coordination); **scheduling** (team meetings called by the team lead → RSVP/conflict); **privacy bridge** (a personal fact discloses only its *consequence* — "unavailable" — to the team lead/team, never the reason → CP-5); and **org-affiliation over time** (current vs former employer → content-based classification, CP-5). So the KG models **Person, Company/Org, Team, Role {team_lead | member}, Band(+leader), NormGroup**, with edges member_of / reports_to / leads / active-tenure. + + ## 5. Cross-cutting disciplines (ACCEPTANCE CRITERIA, bind every feature) - **CP-1 DIKW spine**: KG is the product, inbox is an ingest edge; synthesis over summary; reduce cognitive load. - **CP-2 No-ask / dense-KG auto-resolution**: NEVER ask the user a disambiguation question (asking re-imposes the scattered-context load the product removes). A dense, multi-dimensional KG holds the evidence to auto-resolve (e.g. hotel location vs event venue, host=partner vs colleague, commitment status, travel time). Surface the RESOLVED connection + recommended action + evidence + calibrated confidence; the human **corrects by exception**, never answers a question. Even "pick an option" is a residue of asking. Irreversible/external actions (send/book/approve) still terminate at a human approve/hold, delivered as a correction surface. Connecting context IS the mission — never gate it behind a permission question; KG DENSITY replaces the question. From e5f7a7df45a47b8de4d6d9ad0f952b17ff1d2e78 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:40:45 +0900 Subject: [PATCH 06/14] docs: sharpen P2 as N+1 distinct norm-groups (work team lead vs band leaders) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P2 belongs to N+1 overlapping norm-groups each with its own separate leader: one work security team (her 팀장) plus N bands (each its own band leader). Work team lead != band leaders — different groups, different authorities; she answers to a different leader per context. Concrete CP-3 multi-membership. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 74c60323f..a8433e93d 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -36,7 +36,7 @@ Product renames (repo slug → product name; domains purchased): `cwl-idp`→**k **Org hierarchy (structural, not flavor — the norm-groups, approval chains, scheduling, and privacy bridge all route through it):** each persona sits in **company → team → under a team lead (팀장)**. - P1: AI System Architect in an **AI business team (AI사업팀)** at his employer; reports to his team lead; needs legal/regulatory review. -- P2: in a **Digital Trust / security team (보안팀, 개인정보보호)** at her employer; reports to her team lead; ALSO a member of **N bands, each with its own band leader** (each band = a distinct norm-group with a lead). +- P2: belongs to **N+1 distinct, overlapping norm-groups, each with its OWN separate leader** — (1) her **work security team (Digital Trust / 보안팀, 개인정보보호)** led by her **work team lead (팀장)**, AND (2) **N bands, each led by its own band leader**. The work team lead and the band leaders are DIFFERENT groups / different authorities — she answers to a different leader in each context. This is the concrete case of CP-3 multi-membership: resolve *which* group + whose norms apply per interaction before acting. These give concrete instances of: **norm-groups** (company, team, band×N — CP-3 multi-membership); **approval chains** (leave/travel 전자결재 flows through the team lead → CP-4 anticipatory coordination); **scheduling** (team meetings called by the team lead → RSVP/conflict); **privacy bridge** (a personal fact discloses only its *consequence* — "unavailable" — to the team lead/team, never the reason → CP-5); and **org-affiliation over time** (current vs former employer → content-based classification, CP-5). So the KG models **Person, Company/Org, Team, Role {team_lead | member}, Band(+leader), NormGroup**, with edges member_of / reports_to / leads / active-tenure. From 463a70a2142502ed1691364ff8a5221c82c10645 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:41:40 +0900 Subject: [PATCH 07/14] docs: model relationships as first-class (reified) KG entities Relationships (membership: member_of/reports_to/leads; interpersonal: partner/ colleague/former-colleague/band-mate/manager) are first-class reified entities, not bare edges, because each carries type/participants/valid_from-to(tenure)/ evidence(source_segment_uids)/calibrated confidence/norm-group context/ disclosure_level. Reify because relationships are inferred (CP-3 posterior), temporal (current vs former), policy-bearing (CP-5 per-relationship disclosure), and referenceable. Same for Event<->Event and Commitment links. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index a8433e93d..7111d79e4 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -37,7 +37,11 @@ Product renames (repo slug → product name; domains purchased): `cwl-idp`→**k **Org hierarchy (structural, not flavor — the norm-groups, approval chains, scheduling, and privacy bridge all route through it):** each persona sits in **company → team → under a team lead (팀장)**. - P1: AI System Architect in an **AI business team (AI사업팀)** at his employer; reports to his team lead; needs legal/regulatory review. - P2: belongs to **N+1 distinct, overlapping norm-groups, each with its OWN separate leader** — (1) her **work security team (Digital Trust / 보안팀, 개인정보보호)** led by her **work team lead (팀장)**, AND (2) **N bands, each led by its own band leader**. The work team lead and the band leaders are DIFFERENT groups / different authorities — she answers to a different leader in each context. This is the concrete case of CP-3 multi-membership: resolve *which* group + whose norms apply per interaction before acting. -These give concrete instances of: **norm-groups** (company, team, band×N — CP-3 multi-membership); **approval chains** (leave/travel 전자결재 flows through the team lead → CP-4 anticipatory coordination); **scheduling** (team meetings called by the team lead → RSVP/conflict); **privacy bridge** (a personal fact discloses only its *consequence* — "unavailable" — to the team lead/team, never the reason → CP-5); and **org-affiliation over time** (current vs former employer → content-based classification, CP-5). So the KG models **Person, Company/Org, Team, Role {team_lead | member}, Band(+leader), NormGroup**, with edges member_of / reports_to / leads / active-tenure. +These give concrete instances of: **norm-groups** (company, team, band×N — CP-3 multi-membership); **approval chains** (leave/travel 전자결재 flows through the team lead → CP-4 anticipatory coordination); **scheduling** (team meetings called by the team lead → RSVP/conflict); **privacy bridge** (a personal fact discloses only its *consequence* — "unavailable" — to the team lead/team, never the reason → CP-5); and **org-affiliation over time** (current vs former employer → content-based classification, CP-5). So the KG models **Person, Company/Org, Team, Role {team_lead | member}, Band(+leader), NormGroup** — AND, crucially, **RELATIONSHIPS ARE FIRST-CLASS (REIFIED) ENTITIES**, not bare edges, because a relationship carries attributes, evidence, confidence, temporal validity, disclosure policy, and norm-context: +- **`membership`** (person→group: member_of / reports_to / leads) — role, **valid_from/to tenure window**, authority (e.g. a team lead's approval power). +- **`interpersonal_relation`** (person↔person: partner, colleague, **former**-colleague, band-mate, manager) — closeness, **disclosure policy**, context. +- every relationship node carries: `type` · `participants` · **`valid_from/to`** (temporal → current vs former employer) · **`evidence` (source_segment_uids)** · **calibrated `confidence`** · **`norm_group` context** · **`disclosure_level`**. +Reify because relationships are INFERRED (individual-evidence-based posterior → CP-3 ecological-fallacy-safe), CHANGE over time (tenure ends → former), carry a PER-RELATIONSHIP disclosure policy (CP-5: partner sees more, team lead sees only the consequence), and can be REFERENCED by other relationships/claims. Same reification applies to Event↔Event relations (enables/conflicts/unrelated) and Commitment links. ## 5. Cross-cutting disciplines (ACCEPTANCE CRITERIA, bind every feature) From 585ca6cc937f6f5d1c66d6540b0815d5f873312d Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:42:20 +0900 Subject: [PATCH 08/14] docs: model multi-level recursive org hierarchy (team lead's team lead, ...) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reports_to is transitive (member -> team lead -> their team lead -> ... -> exec), queried as a variable-length path; Org/Team entities nest (Company > Division > Department > Team). Drives approval escalation (전자결재 up the chain by threshold), level-dependent authority, and bounded disclosure propagation (CP-5: a consequence climbs only as far as policy allows, never silently higher). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 7111d79e4..6ecbdecb4 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -41,7 +41,7 @@ These give concrete instances of: **norm-groups** (company, team, band×N — CP - **`membership`** (person→group: member_of / reports_to / leads) — role, **valid_from/to tenure window**, authority (e.g. a team lead's approval power). - **`interpersonal_relation`** (person↔person: partner, colleague, **former**-colleague, band-mate, manager) — closeness, **disclosure policy**, context. - every relationship node carries: `type` · `participants` · **`valid_from/to`** (temporal → current vs former employer) · **`evidence` (source_segment_uids)** · **calibrated `confidence`** · **`norm_group` context** · **`disclosure_level`**. -Reify because relationships are INFERRED (individual-evidence-based posterior → CP-3 ecological-fallacy-safe), CHANGE over time (tenure ends → former), carry a PER-RELATIONSHIP disclosure policy (CP-5: partner sees more, team lead sees only the consequence), and can be REFERENCED by other relationships/claims. Same reification applies to Event↔Event relations (enables/conflicts/unrelated) and Commitment links. +Reify because relationships are INFERRED (individual-evidence-based posterior → CP-3 ecological-fallacy-safe), CHANGE over time (tenure ends → former), carry a PER-RELATIONSHIP disclosure policy (CP-5: partner sees more, team lead sees only the consequence), and can be REFERENCED by other relationships/claims. Same reification applies to Event↔Event relations (enables/conflicts/unrelated) and Commitment links. **Org hierarchy is MULTI-LEVEL / recursive** (there is a team lead's team lead, and above): `reports_to` is **transitive** — a person's management chain is arbitrary depth (member → team lead → their team lead → … → dept head → exec), queried as a variable-length path (Apache AGE openCypher). **Org/Team entities NEST** (Company ⊃ Division ⊃ Department ⊃ Team — a containment hierarchy). This drives: **approval escalation** (전자결재 climbs the reports_to chain by amount/type threshold), **level-dependent authority**, and **bounded disclosure propagation** (CP-5: a personal fact's *consequence* reaches the immediate lead only as far up the chain as policy allows — it must NOT silently leak further up). ## 5. Cross-cutting disciplines (ACCEPTANCE CRITERIA, bind every feature) From 7193aecf7b2cca8147c0f20225a72ab2f3634957 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:43:11 +0900 Subject: [PATCH 09/14] docs: overlapping norm-groups + group-local (invertible) authority A workplace band means norm-groups share members (a colleague is also a band-mate/ band leader). Authority (leads/reports_to) is per-norm-group, NOT a global person ranking, and can invert across groups (your work-junior leads you in the band). Norm resolution selects the active group per interaction and applies THAT group's authority/norms/disclosure; disclosure must not leak across overlapping contexts via a shared member. Modeled by one relationship entity per norm-group. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 6ecbdecb4..224e1af88 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -41,7 +41,7 @@ These give concrete instances of: **norm-groups** (company, team, band×N — CP - **`membership`** (person→group: member_of / reports_to / leads) — role, **valid_from/to tenure window**, authority (e.g. a team lead's approval power). - **`interpersonal_relation`** (person↔person: partner, colleague, **former**-colleague, band-mate, manager) — closeness, **disclosure policy**, context. - every relationship node carries: `type` · `participants` · **`valid_from/to`** (temporal → current vs former employer) · **`evidence` (source_segment_uids)** · **calibrated `confidence`** · **`norm_group` context** · **`disclosure_level`**. -Reify because relationships are INFERRED (individual-evidence-based posterior → CP-3 ecological-fallacy-safe), CHANGE over time (tenure ends → former), carry a PER-RELATIONSHIP disclosure policy (CP-5: partner sees more, team lead sees only the consequence), and can be REFERENCED by other relationships/claims. Same reification applies to Event↔Event relations (enables/conflicts/unrelated) and Commitment links. **Org hierarchy is MULTI-LEVEL / recursive** (there is a team lead's team lead, and above): `reports_to` is **transitive** — a person's management chain is arbitrary depth (member → team lead → their team lead → … → dept head → exec), queried as a variable-length path (Apache AGE openCypher). **Org/Team entities NEST** (Company ⊃ Division ⊃ Department ⊃ Team — a containment hierarchy). This drives: **approval escalation** (전자결재 climbs the reports_to chain by amount/type threshold), **level-dependent authority**, and **bounded disclosure propagation** (CP-5: a personal fact's *consequence* reaches the immediate lead only as far up the chain as policy allows — it must NOT silently leak further up). +Reify because relationships are INFERRED (individual-evidence-based posterior → CP-3 ecological-fallacy-safe), CHANGE over time (tenure ends → former), carry a PER-RELATIONSHIP disclosure policy (CP-5: partner sees more, team lead sees only the consequence), and can be REFERENCED by other relationships/claims. Same reification applies to Event↔Event relations (enables/conflicts/unrelated) and Commitment links. **Org hierarchy is MULTI-LEVEL / recursive** (there is a team lead's team lead, and above): `reports_to` is **transitive** — a person's management chain is arbitrary depth (member → team lead → their team lead → … → dept head → exec), queried as a variable-length path (Apache AGE openCypher). **Org/Team entities NEST** (Company ⊃ Division ⊃ Department ⊃ Team — a containment hierarchy). This drives: **approval escalation** (전자결재 climbs the reports_to chain by amount/type threshold), **level-dependent authority**, and **bounded disclosure propagation** (CP-5: a personal fact's *consequence* reaches the immediate lead only as far up the chain as policy allows — it must NOT silently leak further up). **Norm-groups OVERLAP in membership, and authority is GROUP-LOCAL (can INVERT)**: a **workplace/company band (직장인 밴드)** means the same people are colleagues AND band-mates — a related-team (유관 팀) colleague may be your **band leader**. So `leads`/`reports_to`/authority is a property of the **per-norm-group relationship, NOT a global person-to-person ranking** — the same pair can have OPPOSITE authority in different groups (your work-junior leads you in the band). Therefore norm resolution must **select the ACTIVE group per interaction and apply THAT group's authority + norms + disclosure**, never a global ranking; and **disclosure must respect every overlapping context** (a fact from the band context must not leak to the work context via a shared member). The reified relationship model captures this naturally: one person-pair has **multiple relationship entities, one per norm-group**, each with its own authority direction, norm context, and disclosure policy. ## 5. Cross-cutting disciplines (ACCEPTANCE CRITERIA, bind every feature) From 96f24f33ca241b09490432f8b9b8fd026e95f864 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:46:47 +0900 Subject: [PATCH 10/14] =?UTF-8?q?docs:=20=C2=A75b=20deeper=20model=20?= =?UTF-8?q?=E2=80=94=20the=20hard=20problems=20(agent-drilled)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the non-obvious complications the naive person/group/edge model misses: identity resolution (cross-lingual/multi-account, foundational), Role/Position as first-class (authority on the role), delegation/acting-roles (대결·전결), relationship lifecycle transitions re-resolving authority+disclosure, norm conflict across simultaneously-active groups, tie strength + decay, emergent vs formal groups, privacy mosaic/aggregation, consent as scoped/revocable/ purpose-bound entity, reflexivity (system actions are first-class KG events), cross-org/external parties, and contradiction/provenance-conflict handling. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 224e1af88..5f5711239 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -53,6 +53,34 @@ Reify because relationships are INFERRED (individual-evidence-based posterior - **G6 Language-agnostic**: extraction/resolution/search consistent across EN/KO/JA/ZH/VI via LLM extraction + multilingual embeddings + cross-lingual structured topic modeling (STM). NO dependency on morphological analyzers (Kiwi/Nori) — they cause performance cliffs (refs 1week.tistory.com/119-122). **FTS language resolution**: naruon's current `to_tsvector` FTS is language-DEPENDENT and fails CJK (tokenizer cliff) — DROP per-language configs; use dense multilingual embeddings (primary) + language-agnostic sparse (pg_trgm/pg_bigm char n-grams, PostgreSQL-licensed, AND/OR learned-sparse SPLADE-style as pgvector sparsevec) fused via RRF; unaccent+NFC for Vietnamese. - **SEAM Don't productionize stopgaps**: naruon's current deterministic extraction, to_tsvector FTS, and half-built multi-account model are SCAFFOLDING. Build the real target behind a stable extractor/plugin SEAM (orchestrator-routed LLM-based, language-agnostic); current code = reference/fallback, not the thing to cement. +## 5b. Deeper model — the hard problems (agent-drilled; extends §5 disciplines) + +These are the non-obvious complications the naive person→group→edge model misses. Each names the problem + the KG/design implication + the discipline it extends. + +1. **Identity resolution across sources / languages / aliases (FOUNDATIONAL).** One Person surfaces as many email addresses, name variants, per-org identities, and across scripts (김철수 = Chulsoo Kim = "CS"). Unless these resolve to ONE Person entity, the entire relationship + norm graph fragments and every downstream inference is wrong. Requires cross-lingual, cross-account entity resolution (embeddings + deterministic signals + evidence) with calibrated confidence; **merge/split are REVERSIBLE ops, never hard-merge on weak evidence** (CP-3). Extends G6 + multi-account. + +2. **Role / Position as a first-class entity — authority attaches to the ROLE, not the person.** Approvals route to "the team-lead role," which different Persons occupy over time; when the holder changes, `reports_to`/authority re-point automatically. Model **Position ← occupied_by(temporal) → Person**; approval/authority hang off the Position. + +3. **Delegation / acting-roles (대결·전결).** Authority is temporarily delegatable: a lead on leave delegates approval to an acting lead for a window. A **Delegation** relation (from_role, to_person, scope, valid_window) reroutes approvals during that period. Standard in 전자결재; must not misroute to the absent holder. + +4. **Relationship lifecycle transitions RE-RESOLVE authority + disclosure.** Relationships aren't static: a colleague is promoted (becomes your lead → authority direction FLIPS), a band disbands, a partner becomes an ex (disclosure policy flips), a colleague becomes a *former* colleague (context reclassifies). Each transition is an **event** that triggers re-evaluation; **stale relationships must stop applying old norms** (e.g. an ex must not retain partner-level disclosure). + +5. **Norm conflict when ONE interaction implicates MULTIPLE active groups at once.** A message to someone who is BOTH your work colleague AND your band leader has no single "active group." Resolve the **active frame** from channel/topic/thread cues (work-deadline email → work norms; setlist message → band norms). When genuinely ambiguous, represent multi-frame uncertainty and default to the **most-restrictive disclosure** — never silently assume one hat. + +6. **Tie strength + decay weight everything.** Relationship strength is continuous (interaction frequency/recency) and **decays** (a colleague silent for 2 years). It weights disclosure defaults, **scheduling priority** (a close prior commitment outranks a distant one — extends CP-4), and who-to-loop-in. Recompute on interaction; don't treat presence of an edge as constant strength. + +7. **Emergent / implicit groups vs formal groups.** Beyond formal org/band membership, the recurring participants of a thread / a project's actual collaborators form a **de-facto group** with its own norms. Detect emergent groups from interaction patterns (co-occurrence, reply graphs), not just the org chart; ad-hoc task forces / a thread's cc-list are real norm-groups. + +8. **Privacy MOSAIC / aggregation (the Digital-Trust deep point).** Minimal-disclosure PER event is insufficient: an observer who sees the PATTERN of consequences ("unavailable Tue–Thu" + "declined the offsite" + "left early Monday") can INFER the private reason (hospitalization). The bridge must reason over the **aggregate** of what has been disclosed to an audience over time (differential-privacy-like), not each disclosure in isolation. Extends CP-5. + +9. **Consent as a first-class, scoped, revocable, purpose-bound, auditable entity.** Consent to disclose to the team lead ≠ to their lead; ≠ for a different purpose; is revocable and time-bound. Model **Consent(subject, data_class, audience_scope, purpose, expiry, granted/revoked events)**. Purpose limitation + revocation are legal requirements (개인정보보호) — extends CP-5 and the legal/regulatory feature. + +10. **Reflexivity — the system's OWN inferences + actions are first-class KG events.** Every auto-resolution, auto-RSVP, auto-moderation (AI SOC), draft, and disclosure is recorded as an event with **provenance (evidence, confidence, responsible extractor)** and is ONE gesture to correct; corrections update the extractor/edge confidence, closing the **correct-by-exception** loop (extends CP-2). The KG is self-describing about what the AI did and why — required for audit + the human staying in charge of judgment. + +11. **Cross-org / external parties.** Relationships extend past the company: customers, vendors, partners, venues, the external employer ADFS. External relationships carry **different trust + disclosure defaults**; classification must place them (personal / current-employer / former-employer / external-vendor / customer) — extends CP-5 + keyverse federation. + +12. **Contradiction & provenance-conflict handling.** Sources disagree (one email says X reports to A, a later one implies B). The KG must hold **competing claims with evidence + recency + source-trust**, resolve to a posterior (not overwrite), and surface the contradiction rather than silently picking one — CP-3 honesty. Never collapse conflicting evidence into false certainty. + ## 6. AI SOC = wardnet + noema quarantine sandbox (see wardnet#38) A **source-agnostic artifact-analysis service**: `submit(artifact, context) → {verdict, confidence, evidence, IOCs}`. Consumers: naruon email/file attachments (quarantine BEFORE store), platform uploads, connector inputs, API, GitHub issue/PR comments (one trigger). WITHOUT VirusTotal (self-contained): static (YARA(BSD) + capa(Apache) capability→ATT&CK + LIEF/pefile + unzip/macro extract + entropy + context heuristics) + dynamic detonation in a gVisor/Firecracker (Apache) microVM with eBPF behavioral monitoring (Falco/Tetragon, Apache) + network sinkhole + **LLM reasoning (via contextual-orchestrator) over the evidence** + KG/IOC correlation (self-hosted growing reputation). Auto-response per consumer (GitHub → delete comment + block user; email → quarantine + flag; upload → reject + notify). Validated by a real incident 2026-07-08 (user mapasevo21 posted a `sarif_bypass_patch.zip` malware lure on .github#365 + naruon#977 — deleted + blocked manually; this is what the SOC would automate). From c89100effd6630e531e8d0b11e603263159e2b75 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:51:07 +0900 Subject: [PATCH 11/14] =?UTF-8?q?docs:=20scope=20boundary=20=E2=80=94=20na?= =?UTF-8?q?ruon=20is=20an=20email=20workspace=20(observe=20&=20surface,=20?= =?UTF-8?q?not=20groupware)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit naruon observes/synthesizes/surfaces judgment-ready structure; it does NOT own or execute org workflows (approval routing, recusal, escalation, HR). The relationship/ authority/norm/COI model is for CONTEXT UNDERSTANDING + SURFACING, not enforcement. For a manager-partner COI it surfaces a judgment flag, it does not auto-recuse/route; the 전자결재 system does that, naruon integrates/observes. Don't drill into groupware. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 5f5711239..b573043a0 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -7,6 +7,9 @@ ## 1. Mission (Contextual Wisdom Lab / 맥락지혜 연구실) Turn scattered enterprise context into **judgment-ready structure, then action**. The problem isn't lack of information — it's that the *context to judge is scattered* ("정보 부족이 아니라 판단할 맥락이 흩어져 있다 / 구슬이 서 말이어도 꿰어야 보배"). **Synthesis, not summary.** DIKW as checkpoints: records → contextualize → judgment point → action. Reduce human cognitive load ("사람이 덜 소모"). Judgment stays with the human. +## 1b. SCOPE BOUNDARY — naruon is an EMAIL WORKSPACE (observe & surface, do NOT own/execute org workflows) +naruon is fundamentally an **email workspace** that connects scattered context → judgment → action. It is **NOT groupware / HRIS / an approval-workflow (전자결재) / ERP engine.** It **OBSERVES, SYNTHESIZES, and SURFACES** judgment-ready structure to the human — it does **NOT own or execute** org processes (approval routing, recusal, escalation, HR actions, evaluations). The whole relationship / org-hierarchy / authority / norm-group / COI model (§4, §5, §5b) exists for **CONTEXT UNDERSTANDING + SURFACING**, NOT for enforcement. Example: for an in-company couple on a direct reporting line, naruon may NOTICE the multiplex tie and, when relevant, SURFACE a judgment-support flag ("this touches your partner / a possible conflict of interest") — it does NOT auto-recuse or route the approval; the actual approval/recusal lives in the external 전자결재 system, which naruon integrates with / observes but does not replace. When drilling the model, do not drift into groupware/workflow-owning features. Judgment (and org action) stays with the human + their existing systems. + ## 2. naruon = the PLATFORM (one platform, many à-la-carte plugins) `naruon` is an email-first workspace (FastAPI backend + Next.js frontend + a thin WebSocket connector proxying IMAP/SMTP/CalDAV/WebDAV from customer premises) whose core is a **dense two-tier knowledge graph** over Postgres + pgvector. It is a **TRUE plugin platform** ("진정한 plugin처럼 계속 붙일 수 있는"): plugin manifest/contract, extension points (ingest sources, DOM/analysis processors, KG enrichers, work-item types, UI panels, agents, scheduling), plugin registry, versioned API, isolated execution for untrusted plugins (noema quarantine sandbox). **À-la-carte / opt-in**: each capability is a plugin a user enables by need; nothing mandatory; different users run different combos. Every imported component is **standalone AND submodule** ("따로, 또 같이"). From c429cf0f85265e25b2e1763c7e70ecbd177a180b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:53:49 +0900 Subject: [PATCH 12/14] =?UTF-8?q?docs:=20anchor=20=C2=A70=20origin/core-jo?= =?UTF-8?q?bs=20(find=20emails=20+=20track=20changing=20schedules)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ground the whole brief in naruon's actual genesis (can't find emails; email schedules keep changing → hard to track) and the authoritative product spec (docs/architecture/naruon-product-spec.md): naruon is a Web Client + AI Workspace relay proxy (data sovereignty), NOT an email host or groupware. The deep relationship/norm-group/KG model serves ONLY the two core jobs + "what a sender means to the user"; do not drill it into a social-network research artifact. Re-read the naruon product spec/plans before theorizing. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index b573043a0..1652764cc 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -4,6 +4,12 @@ > > Durable sources of truth (in priority order): (1) **GitHub Project #1** "naruon Platform Roadmap" https://github.com/orgs/ContextualWisdomLab/projects/1 — live work/roadmap; (2) **naruon `docs/planning/naruon-platform-plan.md`** (PR ContextualWisdomLab/naruon#974) — full IA/User-Stories/Use-Cases/Architecture spec; (3) **`docs/agent-github-project-protocol.md`** (this repo, PR #363) — how agents operate the Project + cross-repo-ref convention; (4) this file. +## 0. Origin / core job-to-be-done (READ THIS — everything serves it) +naruon's genesis (the user's own words): **"I can't find my emails, and the schedules that arrive by email keep changing so they're hard to track."** So the two founding jobs are: +1. **FIND emails** — retrieval/context: Context Search + hybrid search + the **DAG sender ontology** ("what this sender means to me" → find + prioritize). +2. **TRACK ever-CHANGING email-borne schedules** — a meeting proposed then moved across replies/ical updates: extract the **current schedule truth** ("it's now Fri 3pm") + keep the **change history** + surface the current state + conflicts. +GROUNDING (authoritative source = naruon `docs/architecture/naruon-product-spec.md`, the North Star spec): naruon is a **Web Client + AI Workspace / relay proxy** to customer-owned data (self-hosted runner in the customer VPC; **data sovereignty** — stores only metadata + AI-extracted intent + task state), NOT an email host and NOT groupware. Core features from the spec: Thread Consolidation, DAG Sender Ontology, Self-Sent Knowledge Indexing, Ticket-based Tasks (2-way linked to threads+events), Reply Tracking, CalDAV/WebDAV writeback; 10 GNB menus (Home/Mail/Calendar/Tasks/Projects/Context Search/Data/AI Hub/Security/Settings). **The deep relationship / norm-group / KG model (§4, §5, §5b) EXISTS ONLY TO SERVE these two jobs + "what a sender means to the user" — keep it in that service, within the email-workspace scope (§1b); do NOT drill it into a social-network research artifact or groupware.** When in doubt, re-read the naruon product spec + plans (docs/architecture/naruon-product-spec.md, docs/plans/*north-star*, docs/engineering/domain-model-realignment.md) before theorizing. + ## 1. Mission (Contextual Wisdom Lab / 맥락지혜 연구실) Turn scattered enterprise context into **judgment-ready structure, then action**. The problem isn't lack of information — it's that the *context to judge is scattered* ("정보 부족이 아니라 판단할 맥락이 흩어져 있다 / 구슬이 서 말이어도 꿰어야 보배"). **Synthesis, not summary.** DIKW as checkpoints: records → contextualize → judgment point → action. Reduce human cognitive load ("사람이 덜 소모"). Judgment stays with the human. From 9c5f7e136227d47dc61f6e3c3ee47f1f8a52dd5e Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:55:33 +0900 Subject: [PATCH 13/14] =?UTF-8?q?docs:=20=C2=A75c=20multiplex/dual-relatio?= =?UTF-8?q?nship=20research,=20re-scoped=20to=20observe=20&=20surface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Literature-grounded (Higgins 2021 CC-BY segmented multiplexity; Merton role-set; Kahn role conflict; Jaskiewicz nepotism; Pierce/Aguinis workplace romance; Levin dormant-ties decay!=0; Kram mentor phases). Taxonomy T1-T11 (temporal axis), reified per-(pair,domain) relationship with dormant-retained residuals, per-frame authority composition. RE-SCOPED per §1b: naruon OBSERVES the multiplex context and SURFACES it as a find/track/judgment signal (DAG sender ontology, heads-up flags) — it does NOT recuse/route/enforce COI (that's groupware / 전자결재, out of scope). Serves the §0 origin jobs (find emails, track changing schedules) + sender-meaning only. CC-BY papers listed for attachment. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 1652764cc..2cbd1a900 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -90,6 +90,13 @@ These are the non-obvious complications the naive person→group→edge model mi 12. **Contradiction & provenance-conflict handling.** Sources disagree (one email says X reports to A, a later one implies B). The KG must hold **competing claims with evidence + recency + source-trust**, resolve to a posterior (not overwrite), and surface the contradiction rather than silently picking one — CP-3 honesty. Never collapse conflicting evidence into false certainty. +## 5c. Multiplex / dual relationships — RESEARCH-GROUNDED, re-scoped to OBSERVE & SURFACE +Literature-grounded (see papers below). A dyad can hold MULTIPLE relationship types at once, across domains — reify one relationship entity per (pair, domain), never a single averaged tie (Higgins et al. 2021: *segmented multiplexity* = domain-restricted exchange). Key frames: **role-set / role conflict** (Merton 1957; Kahn et al. 1964), **nepotism is not uniformly bad** (entitlement vs reciprocal — Jaskiewicz 2013), **workplace-romance risk rises with power differential** (Pierce/Byrne/Aguinis 1996), **dormant ties keep NONZERO residual** (Levin/Walter/Murnighan 2011; Kram 1983 mentor phases → redefinition). +**Taxonomy (temporal axis: C=both active, H=one historical/dormant):** T1 parent⊕boss (C) · T2 in-company couple on a DIRECT reporting line (C) · T3 couple-peers (C) · T4 friend⊕manager (C) · T5 mentor⊕manager (C) · T6 co-founder⊕sibling (C) · T7 in-law⊕colleague (C) · T8 ex-partner⊕colleague (H) · T9 former-tutor⊕peer (H) · T10 former-boss⊕peer (H) · T11 band-leader⊕org-junior = authority INVERSION (C). +**KG representation:** one reified `Relationship(a→b, type, domain_context, role_a/role_b, authority{scope,direction,weight}, norm_context, disclosure_policy, valid_from/to, phase, status∈{active,dormant,ended}, residual{authority,trust,obligation}=decay(t)+floor(>0))` per (pair,domain); NormGroup precedence; Frame selects which relationship's authority is legitimate; authority COMPOSES per-frame (never sums); DORMANT edges retained (decay≠0) and INCLUDED in queries so masked authority gradients (T9/T10) aren't invisible to the org chart. +**RE-SCOPE (CRITICAL, per §1b — naruon is an email workspace, NOT groupware):** the research's enforcement framing (auto-recuse / route approvals around a manager / execute COI mitigation) is OUT OF SCOPE. naruon only **OBSERVES the multiplex context and SURFACES it as a judgment/find/track signal** — e.g. it uses "what this sender means to me (incl. multiplex + dormant ties)" to FIND + PRIORITIZE emails (the DAG sender ontology) and to TRACK/interpret schedule changes, and it may SURFACE a heads-up flag ("this touches your partner / a former mentor") for the human. It does NOT recuse, route, or enforce; real approvals/COI remedies live in the external 전자결재/HR systems naruon observes. The multiplex model serves the two origin jobs (§0: find emails, track changing schedules) + sender-meaning, nothing more. +**Attachable papers (CC BY 4.0, redistributable):** Higgins, Crepalde & Fernandes (2021) PLOS ONE 16(9):e0257527 (segmented multiplexity); Frontiers in Psychology (2021) 12:690074 (ambivalent leader-follower). Green-OA (link, don't redistribute): Levin et al. 2011 Organization Science (dormant ties); Pierce/Byrne/Aguinis 1996 JOB (workplace-romance power differential). Cite-only (copyright): Verbrugge 1979, Merton 1957, Kahn 1964, Kram 1983, Jaskiewicz 2013. + ## 6. AI SOC = wardnet + noema quarantine sandbox (see wardnet#38) A **source-agnostic artifact-analysis service**: `submit(artifact, context) → {verdict, confidence, evidence, IOCs}`. Consumers: naruon email/file attachments (quarantine BEFORE store), platform uploads, connector inputs, API, GitHub issue/PR comments (one trigger). WITHOUT VirusTotal (self-contained): static (YARA(BSD) + capa(Apache) capability→ATT&CK + LIEF/pefile + unzip/macro extract + entropy + context heuristics) + dynamic detonation in a gVisor/Firecracker (Apache) microVM with eBPF behavioral monitoring (Falco/Tetragon, Apache) + network sinkhole + **LLM reasoning (via contextual-orchestrator) over the evidence** + KG/IOC correlation (self-hosted growing reputation). Auto-response per consumer (GitHub → delete comment + block user; email → quarantine + flag; upload → reject + notify). Validated by a real incident 2026-07-08 (user mapasevo21 posted a `sarif_bypass_patch.zip` malware lure on .github#365 + naruon#977 — deleted + blocked manually; this is what the SOC would automate). From b15c4af3a3d8feea3cafc2289d29fb49cd41f639 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Wed, 8 Jul 2026 18:56:51 +0900 Subject: [PATCH 14/14] =?UTF-8?q?docs:=20correct=20=C2=A75c=20=E2=80=94=20?= =?UTF-8?q?the=20social=20graph=20is=20CORE=20in=20the=20KG=20(only=20enfo?= =?UTF-8?q?rcement=20is=20out)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Over-corrected earlier: "naruon doesn't run org workflows" does NOT mean drop the social network. The relationship/social-network graph is core and lives in the KG (already: project_graph participant type + DAG sender ontology). It is the foundation for find/prioritize/track AND for the real pains the user named — too many projects, broken schedule mgmt, un-estimable WBS, mysterious Job/Work/Task/ Duty — via person<->person + person<->event + dependency modeling that enables schedule mgmt, WBS/inter-event dependency estimation, and work decomposition (with scopeweave). Only EXECUTING org actions (recuse/route/전자결재) is out of scope: naruon models+reasons+surfaces, external systems act. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01RTAMs4bpSZS77Xe3RQjv9P --- docs/CWL-MASTER-CONTEXT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CWL-MASTER-CONTEXT.md b/docs/CWL-MASTER-CONTEXT.md index 2cbd1a900..bd5e6c0c4 100644 --- a/docs/CWL-MASTER-CONTEXT.md +++ b/docs/CWL-MASTER-CONTEXT.md @@ -94,7 +94,7 @@ These are the non-obvious complications the naive person→group→edge model mi Literature-grounded (see papers below). A dyad can hold MULTIPLE relationship types at once, across domains — reify one relationship entity per (pair, domain), never a single averaged tie (Higgins et al. 2021: *segmented multiplexity* = domain-restricted exchange). Key frames: **role-set / role conflict** (Merton 1957; Kahn et al. 1964), **nepotism is not uniformly bad** (entitlement vs reciprocal — Jaskiewicz 2013), **workplace-romance risk rises with power differential** (Pierce/Byrne/Aguinis 1996), **dormant ties keep NONZERO residual** (Levin/Walter/Murnighan 2011; Kram 1983 mentor phases → redefinition). **Taxonomy (temporal axis: C=both active, H=one historical/dormant):** T1 parent⊕boss (C) · T2 in-company couple on a DIRECT reporting line (C) · T3 couple-peers (C) · T4 friend⊕manager (C) · T5 mentor⊕manager (C) · T6 co-founder⊕sibling (C) · T7 in-law⊕colleague (C) · T8 ex-partner⊕colleague (H) · T9 former-tutor⊕peer (H) · T10 former-boss⊕peer (H) · T11 band-leader⊕org-junior = authority INVERSION (C). **KG representation:** one reified `Relationship(a→b, type, domain_context, role_a/role_b, authority{scope,direction,weight}, norm_context, disclosure_policy, valid_from/to, phase, status∈{active,dormant,ended}, residual{authority,trust,obligation}=decay(t)+floor(>0))` per (pair,domain); NormGroup precedence; Frame selects which relationship's authority is legitimate; authority COMPOSES per-frame (never sums); DORMANT edges retained (decay≠0) and INCLUDED in queries so masked authority gradients (T9/T10) aren't invisible to the org chart. -**RE-SCOPE (CRITICAL, per §1b — naruon is an email workspace, NOT groupware):** the research's enforcement framing (auto-recuse / route approvals around a manager / execute COI mitigation) is OUT OF SCOPE. naruon only **OBSERVES the multiplex context and SURFACES it as a judgment/find/track signal** — e.g. it uses "what this sender means to me (incl. multiplex + dormant ties)" to FIND + PRIORITIZE emails (the DAG sender ontology) and to TRACK/interpret schedule changes, and it may SURFACE a heads-up flag ("this touches your partner / a former mentor") for the human. It does NOT recuse, route, or enforce; real approvals/COI remedies live in the external 전자결재/HR systems naruon observes. The multiplex model serves the two origin jobs (§0: find emails, track changing schedules) + sender-meaning, nothing more. +**SCOPE — the SOCIAL GRAPH belongs IN the KG (core); only ENFORCEMENT is out (per §1b).** Do NOT confuse "naruon doesn't run org workflows" with "drop the social network" — the relationship / social-network graph is CORE and lives fully in the KG (it already does: naruon `project_graph_objects` has a `participant` type + the DAG Sender Ontology + domain-model-realignment). The social graph is the FOUNDATION for the origin jobs AND the real pains: it powers FIND + PRIORITIZE (DAG sender ontology — "what this sender means to me"), schedule TRACKING (who a changing meeting is with + priority), and — critically — the project pains the user named: **too many projects, schedule management that doesn't work, WBS that can't be estimated, Job/Work/Task/Duty that is a mystery.** The person↔person + person↔event + dependency graph is exactly what makes schedule management, **WBS / inter-event dependency ESTIMATION**, and work decomposition (Job/Work/Task/Duty) possible (with scopeweave). The ONLY out-of-scope part is naruon EXECUTING org actions (auto-recuse, route approvals, run 전자결재/HR): naruon **models + reasons + surfaces**, the external systems ACT. So: full social-graph modeling + inference + estimation-support + surfacing = IN; workflow enforcement = OUT. **Attachable papers (CC BY 4.0, redistributable):** Higgins, Crepalde & Fernandes (2021) PLOS ONE 16(9):e0257527 (segmented multiplexity); Frontiers in Psychology (2021) 12:690074 (ambivalent leader-follower). Green-OA (link, don't redistribute): Levin et al. 2011 Organization Science (dormant ties); Pierce/Byrne/Aguinis 1996 JOB (workplace-romance power differential). Cite-only (copyright): Verbrugge 1979, Merton 1957, Kahn 1964, Kram 1983, Jaskiewicz 2013. ## 6. AI SOC = wardnet + noema quarantine sandbox (see wardnet#38)