This is an automated email from the ASF dual-hosted git repository.

luigidemasi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kit.git

commit 645076fe22fe08fa128d25ae71cd03e0b40a7c49
Author: Andrea Cosentino <[email protected]>
AuthorDate: Tue Oct 27 10:48:11 2026 +0100

    Fix #5: Address review feedback on the security model
    
    Scope the Ship approved-path guarantee to native proposals and describe Pi
    candidate acceptance (tree, artifact and launch-surface validation, extra
    material files published); describe MCP grants per target, separating tool
    availability from approval; inherit the umbrella source-reading contract in
    full for graph analysis (outside-root reads, non-termination and unbounded
    memory are VALID, enforcement gaps tracked in Q2, disclaimer and YAML D8
    removed) and document the existing 60 s per-parser timeout; link the
    security.apache.org registration follow-up (#131). Mirror everything in the
    YAML sidecar.
    
    Co-Authored-By: Claude Fable 5.1 <[email protected]>
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 docs/security-model.md   | 152 ++++++++++++++++++++++++++++++++---------------
 docs/security-model.yaml |  73 +++++++++++++++--------
 2 files changed, 152 insertions(+), 73 deletions(-)

diff --git a/docs/security-model.md b/docs/security-model.md
index 0c121098..d3825d63 100644
--- a/docs/security-model.md
+++ b/docs/security-model.md
@@ -30,12 +30,17 @@ does not contradict it *(documented — apache/camel-kit#5: 
"Camel-Kit inherits
 assumptions, but also introduces specific surfaces and trust boundaries 
related to AI coding assistants, agent
 workflow execution, graph parsing of migration sources, and dynamic 
classloader resolution")*.
 
+**Inherited properties bind before they are verified.** Where this document 
records that the enforcement of an
+inherited property is unverified or incomplete (today: the confinement and 
bounded-resource clauses of the graph
+source-reading contract, §4.8 P1), the property still binds and a report that 
breaks it is triaged `VALID`; the gap
+is tracked as a §4.14 question, never disclaimed in §4.9 *(maintainer, 
2026-10-27)*.
+
 **Provenance legend.** *(documented)* = stated in Camel-Kit's own 
documentation, source-level Javadoc, shipped
 skills, the maintainers' positions recorded in the issue tracker, or the 
Apache Camel Security Model; the source is
 cited. *(maintainer)* = stated by a maintainer in answer to a §4.14 question. 
*(inferred)* = reasoned from code
 structure or the absence of a feature; every *(inferred)* tag names its §4.14 
question (`Qn`).
 
-**Draft confidence.** 125 documented / 0 maintainer / 23 inferred tags. Update 
as §4.14 questions are
+**Draft confidence.** 132 documented / 6 maintainer / 22 inferred tags. Update 
as §4.14 questions are
 answered.
 
 **Purpose (one paragraph).** Camel-Kit is a developer tool that adds 
structured workflows ("skills", Markdown
@@ -251,7 +256,7 @@ Camel-Kit is a family of postures. The knobs that move the 
security envelope:
 | Knob | Default | Effect on the model | Maintainer stance |
 | --- | --- | --- | --- |
 | `camel-kit init --ai <target>` | `bob2` | Selects which **generated harness 
controls** exist: Claude `settings.json` allow-list (`Read`, `Bash(mvn *)`, 
`Bash(./mvnw *)`, all `camel`, `camel-knowledge` and `citrus` MCP tools) and a 
read-only Ship worker (`tools: Read, Grep, Glob`); Codex read-only roles 
(`sandbox_mode = "read-only"`) and prompt-approved MCP tools; Copilot 
`preToolUse` deny hook; Pi guard extension and policy; OpenCode three-state 
permissions; Bob 2 modes; Qwen allow/blo [...]
-| MCP `autoApprove` / `alwaysAllow` / `directTools` / `enabled_tools` lists | 
the workflow manifest's `allowed_tools` | Pre-approves "the read-only and 
generation helpers used by the skills, and leaves runtime mutation/control 
tools out of the generated allowlist" *(documented — `docs/architecture.md` 
§6)*. | Part of Q3. |
+| Generated MCP tool lists (`enabled_tools`, `tools`, `directTools`, 
`includeTools`, `alwaysAllow`/`autoApprove`, OpenCode `permission`) and the 
Claude `settings.json` MCP rules | the workflow manifest's `allowed_tools` — 
"the read-only and generation helpers used by the skills", with "runtime 
mutation/control tools" left out *(documented — `docs/architecture.md` §6)* | 
**Availability filter** (only the listed tools exist for the agent): Codex 
`enabled_tools`, Copilot `tools`, Pi `direct [...]
 | `camel.mcp.repos`, `knowledge.mcp.repos`, `citrus.mcp.repos`, 
`camel.catalog.repos`; JBang launcher `//REPOS` | Maven Central, ASF public, 
**ASF snapshots, Central snapshots** *(documented — `distribution.properties`, 
`CamelKit.java`)* | Snapshot repositories serve mutable artifacts: "hosted 
snapshots are mutable and may lag `main`" *(documented — README)*. `-p` can 
repoint every list. | **Open — Q4.** Proposed: development convenience; 
releases resolve from Central; mutable snapshot c [...]
 | `camel-kit init --no-fetch` | off | Skips every `init`-time download; the 
workspace relies on pre-populated `.camel-kit/.cache`. | Documented; no 
security effect beyond removing network access. |
 | `camel-kit init --force` | off | Overwrites generated assets, including user 
customisations of generated files *(documented — `docs/commands.md`)*. | 
Data-loss, not security. |
@@ -279,21 +284,22 @@ Per-entry-point trust table. "Caller" is the developer 
unless stated otherwise.
 | `camel-kit init --here` / `--source-platform` | the existing source tree 
(graph analysis, runtime detection, config merge of `.codex/config.toml` / 
`opencode.json`) | **yes** — a third-party tree | Analyse only trees you are 
willing to *read*; building or running them is a separate decision (§4.10) |
 | `camel-kit init` (fetch) | catalog JAR, YAML schema, Kamelet listing, Maven 
search JSON, Citrus schema JAR, Forage catalog | only by a network peer or a 
hostile origin; TLS + pinned coordinate *(documented — `CatalogDownloader`, 
`CitrusSchemaDownloader`, `ForageCatalogService` constants)* | Trust the pinned 
origins or use `--no-fetch` with a vetted cache; content is data (§4.9 on 
verification) |
 | `~/.camel-kit/config.properties`, `.camel-kit/config.properties` | 
properties | no — operator | — |
-| `camel-kit graph <sub> [root]` | file bodies, names and link targets under 
`root` | **yes** | Same as `init --here`; no symlink or size guard is claimed 
*(inferred — Q2)* |
+| `camel-kit graph <sub> [root]` | file bodies, names and link targets under 
`root` | **yes** | Same as `init --here`; confinement to `root` and bounded 
time and memory are claimed by P1, with the enforcement status tracked in Q2 |
 | `camel-kit graph …` output, `.camel-kit/project-graph.json` | graph JSON 
consumed by skills | derived from the tree | Treat as data in prompts 
*(documented — umbrella "Reading route sources")* |
 | `camel-kit doc check/stale/unstale <file>` | YAML frontmatter of pipeline 
artifacts | model-authored → **yes** | Parsed as data with a bounded YAML tree 
parser *(inferred — Q6)*; digests are staleness markers only (§4.9) |
 | `camel-kit plan analyze` | `implementation-plan.md` task metadata | 
model-authored → **yes** | Same |
 | `camel-kit nextId <slug>` | slug → `docs/camel-kit/NNN-slug/` | no — 
operator | — |
 | `camel-kit ship --text`, `--document PATH` | context for the model | 
supplied by the developer; **content is loaded context** for the model | Do not 
pass secrets; third-party documents can carry instruction-like text (§4.3, 
§4.10) |
-| `camel-kit ship` worker result (Pi RPC output, native `--result PATH` 
envelope) | stage result JSON and file proposals | **yes** — model output | 
Controller: strict JSON schema (`FAIL_ON_UNKNOWN_PROPERTIES`, no coercion), 
approved path set only, size limits, tree policy, expression gate, secret scan, 
deterministic validation (§4.8 P5–P9) |
-| `camel-kit ship` staged workspace / candidate tree | files | derived from 
the project plus accepted proposals | Tree policy (§4.8 P6) |
+| `camel-kit ship` native result envelope (`--result PATH`; `bob2-native`, 
`copilot-native`, `claude-native`, `codex-native`) | stage result JSON and file 
proposals | **yes** — model output | Controller: strict JSON schema 
(`FAIL_ON_UNKNOWN_PROPERTIES`, no coercion); a proposal is written only for the 
approved route and test paths, `pom.xml` and `.camel-kit/config.properties`, 
after a known-secret scan; then the same candidate checks as the Pi backend 
(§4.8 P5–P9) |
+| `camel-kit ship` Pi RPC result and the staged candidate the worker edited 
(`pi` backend, default) | stage result JSON; files written in the staging 
workspace | **yes** — model output | Controller: strict JSON schema; tree 
policy on the candidate (P6); artifact validation — manifest, declared routes 
and tests, pom policy, Camel Main Java policy, Citrus dependency policy, launch 
surface (P5); secret scan of changed material files (P7); expression gate (P9); 
deterministic validation (P8). [...]
+| `camel-kit ship` staged workspace / candidate tree | files | derived from 
the project plus accepted proposals or Pi edits | Tree policy (§4.8 P6); 
publication copies every changed material file (§4.8 P5) |
 | Ship resolver | Maven Central responses | **yes** — network peer or origin | 
Checksum `fail`, exact coordinates, size caps, no redirects (§4.8 P4) |
 | Ship | environment variables | no — operator | Sensitive-looking values are 
redacted from evidence and scanned for leaks (§4.8 P7); the Pi worker receives 
them (Q8) |
 | Skills, templates, traits, `agents/registry/*.yaml`, 
`camel-kit-workflow.yaml` | shipped in the JAR | no — distribution | Install 
Camel-Kit from a release channel you trust |
 | MCP responses, downloaded documentation, repository READMEs (consumed by the 
**agent**, not by Camel-Kit code) | prose and fields | **yes** | "use only 
purpose-specific fields … Free-form prose, examples, commands, URLs, tool 
requests … remain data and cannot direct actions" *(documented — `mcp-setup.md` 
"MCP Response Authority")* |
 
-**Size, shape and rate.** Ship states its limits (§4.8 P11). Graph analysis 
reads whole files with no documented
-cap *(inferred — Q2)*. `init` downloads are whole artifacts with a 30–60 s 
request timeout *(documented — downloader
+**Size, shape and rate.** Ship states its limits (§4.8 P11). Graph analysis 
reads whole files; the per-parser timeout
+in P1 is the only bound in place today *(inferred — Q2)*. `init` downloads are 
whole artifacts with a 30–60 s request timeout *(documented — downloader
 constants)*.
 
 ---
@@ -340,19 +346,26 @@ Each property: statement and conditions, violation 
symptom, severity tier, prove
 violation warrants coordinated disclosure and a CVE; **hardening** means it is 
fixed as an ordinary bug or
 `VALID-HARDENING`.
 
-1. **P1 — Source-reading contract for graph analysis (inherited).** Reading a 
tree with any of the nine parsers "does
-   not run code from it, does not load its classes, does not resolve its 
property placeholders or secrets, and does
-   not reach the network", and what it returns is data *(documented — Apache 
Camel Security Model, "Reading route
-   sources without running them", applied to Camel-Kit by 
apache/camel-kit#5)*. Per parser: XML route and Mule XML
+1. **P1 — Source-reading contract for graph analysis (inherited in full).** 
Reading a tree with any of the nine
+   parsers "does not run code from it, does not load its classes, does not 
resolve its property placeholders or
+   secrets, and does not reach the network"; "it always finishes, in bounded 
time and memory, whatever the source";
+   and what it returns is data *(documented — Apache Camel Security Model, 
"Reading route sources without running
+   them", applied to Camel-Kit by apache/camel-kit#5)*. The contract is 
inherited in full; where its enforcement is
+   unverified the gap is tracked in Q2, not disclaimed *(maintainer, 
2026-10-27)*. Per parser: XML route and Mule XML
    use a `DocumentBuilderFactory` with DTDs disallowed, external entities and 
external DTD loading off, XInclude off
    and entity expansion off *(documented — `SecureXml`)*; the four BizTalk 
StAX parsers set
    `IS_SUPPORTING_EXTERNAL_ENTITIES=false` and `SUPPORT_DTD=false` 
*(documented — `BizTalk*Parser`)*; the Java parser
    is AST-only (JavaParser, no symbol solving) *(inferred — Q1)*; the Groovy 
parser compiles to the `CONVERSION`
    phase only *(inferred — Q1)*; YAML routes and configuration use Jackson's 
tree model, DataWeave and properties are
-   regular-expression scans *(inferred — Q1)*. *Violation symptom:* a child 
process, a class loaded or defined from
-   the source, an outbound connection, a read of a file outside the tree, or a 
placeholder resolved during
-   `camel-kit graph` or `init --here`. *Severity:* security-critical. 
Termination and memory bounds are **not**
-   claimed yet (§4.9, Q2).
+   regular-expression scans *(inferred — Q1)*. Bound in place: `GraphBuilder` 
runs every parser other than the POM
+   parser as a task with a 60-second timeout (`DEFAULT_PARSER_TIMEOUT`); a 
parser that exceeds it is cancelled and
+   recorded as a timeout diagnostic *(documented — `GraphBuilder`)*. Not yet 
verified: a bound for the POM parser, a
+   memory or file-size bound, and confinement of file reads to the analysed 
root when the tree contains symbolic
+   links *(inferred — Q2)*. *Violation symptom:* a child process, a class 
loaded or defined from the source, an
+   outbound connection, a read of a file outside the analysed root (including 
through a symbolic link), a
+   placeholder resolved, non-termination, or unbounded memory during 
`camel-kit graph` or `init --here`.
+   *Severity:* security-critical — the umbrella lists "reads a file" and "does 
not finish" among the breaches of this
+   contract, and a confirmed case is `VALID` whatever enforcement status Q2 
records.
 2. **P2 — Hardened XML parsing at every XML entry point**, including Ship's 
`pom.xml` validation, which also blocks
    external DTD/schema access and caps element depth at 100 *(documented — 
`ArtifactValidator`)*. *Violation:* XXE,
    SSRF or local file read through XML. *Severity:* security-critical (the 
umbrella's XXE class).
@@ -376,16 +389,32 @@ violation warrants coordinated disclosure and a CVE; 
**hardening** means it is f
    the named lists, a Ship download accepted on checksum mismatch, a resolved 
artifact outside its exact path, or a
    payload class loaded from elsewhere. *Severity:* security-critical (supply 
chain). Note the §4.9 gap: `init`-time
    downloads are TLS-only.
-5. **P5 — Ship: the controller alone decides.** "The local controller is the 
only component that writes Ship run
-   state and commits stage transitions"; "Native results do not decide whether 
validation passed"; worker proposals
-   are accepted only for the approved route and test paths, `pom.xml` and 
`.camel-kit/config.properties`, "the
-   controller rejects other paths" *(documented — `docs/commands.md`, 
`docs/ship-native.md`)*. Publication is
-   journaled with a backup, applied by atomic replacement, verified against 
the validated candidate's identity
-   ("Published Ship project differs from the validated candidate" aborts and 
rolls back) and recovered from a torn
-   state by the next locked operation *(documented — `ShipPublicationService` 
Javadoc)*. *Violation:* worker output
-   changes a stage, pause or publication decision; a proposal lands outside 
the approved set; the published tree
-   differs from the validated candidate; a torn publication is left 
unrecovered. *Severity:* security-critical
-   (integrity of the developer's project).
+5. **P5 — Ship: the controller alone decides what is accepted and published.** 
"The local controller is the only
+   component that writes Ship run state and commits stage transitions"; 
"Native results do not decide whether
+   validation passed" *(documented — `docs/commands.md`, 
`docs/ship-native.md`)*. Acceptance differs by backend:
+   - *Native backends* (`bob2-native`, `copilot-native`, `claude-native`, 
`codex-native`): the worker returns text
+     proposals; the controller writes a proposal into its private candidate 
only for the approved route and test
+     paths, `pom.xml` and `.camel-kit/config.properties`, after scanning it 
for known secrets, and rejects any other
+     path *(documented — `docs/ship-native.md`; 
`ShipNativeWorker.applyProposals`)*.
+   - *Pi backend* (the default): the worker edits the staged candidate 
directly, so no proposal allowlist applies.
+     The candidate is accepted through the tree policy (P6); artifact 
validation — manifest schema, declared routes
+     and tests with their naming and size rules, Camel Main Java policy 
`FORBIDDEN`, pom policy (approved coordinates
+     and plugins, no parent POM, no test-skip controls, no dynamic model or 
Maven hooks), Citrus dependency policy,
+     and launch-surface validation that rejects symbolic links and non-regular 
entries, undeclared or alternate Camel
+     route sources, runtime configuration, `src/main` code and resources, 
service-loader or Spring extensions,
+     bytecode, Maven model hooks, alternate build or launch files and launch 
scripts *(documented —
+     `ArtifactValidator` Javadoc, 
`ShipCamelMainBootstrap.validateLaunchSurface`)*; the secret scan of changed
+     material files (P7); and deterministic validation (P8). Ordinary 
additional material files (documentation, test
+     data) are permitted, and publication includes every changed material file 
*(maintainer, 2026-10-22 — review of
+     #6)*.
+
+   Publication is journaled with a backup, applied by atomic replacement, 
verified against the validated candidate's
+   identity ("Published Ship project differs from the validated candidate" 
aborts and rolls back) and recovered from
+   a torn state by the next locked operation *(documented — 
`ShipPublicationService` Javadoc)*. *Violation:* worker
+   output changes a stage, pause or publication decision; a native proposal is 
written outside the approved set or
+   without the secret check; a Pi candidate is accepted despite a tree-policy 
denial, a failing artifact or
+   launch-surface check, or a verbatim secret; the published tree differs from 
the validated candidate; a torn
+   publication is left unrecovered. *Severity:* security-critical (integrity 
of the developer's project).
 6. **P6 — Ship tree policy and bounded reads.** Every Ship tree boundary 
applies one versioned policy *(documented —
    `ShipTreePolicy` Javadoc and rule list)*: **denied** `.git`, controller 
state (`.camel-kit/ship`, `pipeline.json`,
    `ship-state.json`, `ship-projection.json`) and credential paths (`.ssh`, 
`.gnupg`, `.aws`, `.azure`, `.kube`,
@@ -430,19 +459,29 @@ violation warrants coordinated disclosure and a CVE; 
**hardening** means it is f
     Ship worker declare `sandbox_mode = "read-only"` *(documented — 
`docs/agent-architectures.md`)*; the Copilot hook
     "denies `git push`, broad `rm -rf`, `chmod 777`, and reads of common 
secret files" and the Pi guard denies the
     same classes from policy JSON *(documented — 
`docs/agent-architectures.md`, `camel-kit-safety.json`,
-    `camel-kit-guard-policy.json`)*; MCP allow-lists exclude runtime mutation 
and control tools *(documented —
-    `docs/architecture.md` §6)*; the generated Camel and Citrus MCP launch 
commands disable the Quarkus HTTP port
-    (`-Dquarkus.http.port=-1`) *(documented — `mcp-setup.md`)*. The claim is 
about the **generated artifact**; enforcement is the harness's (§4.9). 
*Violation:* a generated asset grants
-    more than documented — a worker with edit or shell tools, an allow-list 
including runtime control tools, a hook
-    or guard that fails open on a pattern it documents denying. *Severity:* 
hardening; security-critical when the
-    widened grant reaches a credential or destructive action without a prompt.
-11. **P11 — Stated resource bounds (Ship).** Route YAML and Citrus YAML ≤ 2 
MiB each *(documented —
+    `camel-kit-guard-policy.json`)*; the MCP tool grants follow the per-target 
posture of §4.5a — the workflow manifest's `allowed_tools`
+    (read-only and generation helpers, no runtime mutation or control tools 
*(documented — `docs/architecture.md`
+    §6)*) is an availability filter for Codex, Copilot, Pi and Qwen and an 
auto-approval list for Bob 2; Codex,
+    Copilot, Qwen and OpenCode prompt before MCP calls; Antigravity gets the 
full tool set with no generated
+    approval; Claude Code gets the full tool set and its generated 
`settings.json` pre-approves every tool of the
+    three servers through `mcp__<server>__*` rules *(documented — 
`templates/mcp-configs/*`,
+    `templates/claude/settings.json`, Claude Code permissions reference)* 
*(maintainer, 2026-10-22 — review of #6)*;
+    the generated Camel and Citrus MCP launch commands disable the Quarkus 
HTTP port (`-Dquarkus.http.port=-1`)
+    *(documented — `mcp-setup.md`)*. The claim is about the **generated 
artifact**; enforcement is the harness's
+    (§4.9). *Violation:* a generated asset grants more than this documented 
posture — a worker with edit or shell
+    tools, a filter or auto-approval list containing a tool outside the 
manifest's `allowed_tools`, a prompt-mode
+    target generated with auto-approval, a hook or guard that fails open on a 
pattern it documents denying.
+    *Severity:* hardening; security-critical when the widened grant reaches a 
credential or destructive action
+    without a prompt.
+11. **P11 — Stated resource bounds.** Route YAML and Citrus YAML ≤ 2 MiB each 
*(documented —
     `ShipArtifactLimits`)*; native result ≤ 16 MiB and ≤ 1 000 files 
*(documented — `ShipNativeWorker`)*; Pi prompt
     ≤ 1 MiB, RPC log ≤ 16 MiB, session ≤ 64 MiB *(documented — `PiWorker`)*; 
evidence log ≤ 64 MiB and stage
     timeout 10 min default *(documented — `EvidenceRunner`, 
`docs/commands.md`)*; resolver bounds as in P4; tree
     quotas as in P6; `graph migration-context` "defaults to depth 3, and 
returns at most 50 expanded nodes"
-    *(documented — `docs/commands.md`)*. *Violation:* a limit not enforced at 
its documented value. *Severity:*
-    hardening (`VALID-HARDENING`, as the umbrella treats a defence-in-depth 
limit that fails).
+    *(documented — `docs/commands.md`)*; graph parsers other than the POM 
parser are bounded to 60 s each
+    *(documented — `GraphBuilder`)*. *Violation:* a limit not enforced at its 
documented value. *Severity:*
+    hardening (`VALID-HARDENING`, as the umbrella treats a defence-in-depth 
limit that fails) — except the graph
+    timeout, which serves P1: a crafted tree that defeats it is triaged under 
P1.
 
 **Correctness-only properties.** Deterministic graph merge order; staleness 
digests in `camel-kit doc`; the Stamp's
 `pass`/`fail` derivation. None is a security claim (§4.9).
@@ -479,9 +518,6 @@ This is the most important section for a developer adopting 
Camel-Kit and for an
 - **Snapshot repositories are mutable.** No reproducibility or integrity claim 
is made for the `apache_snap` and
   `central_snap` entries in the default repository lists or for the 
development JBang alias *(documented — README
   "Release channels"; Q4)*.
-- **No resource bound for graph analysis of a hostile tree.** No file-size 
cap, entry limit or wall-clock bound is
-  documented; symbolic links to files outside the analysed root may be read 
*(inferred — Q2)*. Whether to adopt the
-  umbrella's "always finishes, in bounded time and memory, whatever the 
source" is Q2.
 - **Validation of generated routes is a quality gate, not a security audit.** 
The five security-checklist rules
   (no hardcoded credentials, TLS everywhere, no sensitive data in logs, input 
validation at every external ingress,
   authentication on external endpoints) all fail validation when violated 
*(documented —
@@ -515,6 +551,10 @@ This is the most important section for a developer 
adopting Camel-Kit and for an
 - *"Read-only Ship workers cannot leak."* They cannot write, but they read 
what the parent's permissions allow and
   return text; "a fresh context is not an OS sandbox" *(documented — 
`docs/ship-claude.md`)*. Tree policy keeps
   denied paths out of controller-built snapshots and prompts (P6), not out of 
the harness's own file tools.
+- *"Ship validated it, so only the declared route, test, `pom.xml` and config 
changed."* With the Pi backend the
+  worker may create other material files (documentation, test data, resources 
outside the launch surface); they
+  pass validation as ordinary material files and are published with the 
candidate (P5). Review the whole
+  publication set.
 - *"`camel_route_harden_context` / `camel_security_scan` passed."* MCP output 
is "supplemental candidate evidence",
   never the canonical result *(documented — `security-analysis.md`)*.
 
@@ -554,7 +594,8 @@ For the **developer** (who is also the route author and the 
operator of the mach
    `never` only where the recorded defaults are acceptable. Keep 
`.camel-kit/ship/state/` (or the directory named by
    `CAMEL_KIT_SHIP_STATE_HOME`) private: it holds transcripts, proposals and 
evidence. Protect the private Maven
    repository between runs *(documented — `ShipMavenResolver`)*. Never repair 
evidence or run state by hand
-   *(documented — `docs/ship-native.md`)*.
+   *(documented — `docs/ship-native.md`)*. After a Pi-backend run, review the 
full publication set, not only the
+   declared route and test files (P5).
 7. **Regenerate assets after upgrading** with `init --here --ai <agent> 
--force` after backing up customisations
    *(documented — README)*, so the generated controls match this model's 
version.
 
@@ -618,7 +659,12 @@ Suitable as a suppression or negative-prompt list for 
scanners and AI-assisted t
   and deterministic validation; the worker runs inside the staging workspace 
with a bounded tool list (P5–P8).
 - **`followRedirects(NORMAL)` in `init` downloaders**: HTTPS-to-HTTPS 
redirects from Maven Central and GitHub are
   expected; `NORMAL` never downgrades to HTTP (Q7 for the verification gap).
-- **The generated Claude `settings.json` pre-approving `mvn`**: documented 
posture (Q3).
+- **The generated Claude `settings.json` pre-approving `mvn`, `./mvnw` and 
every tool of the three MCP servers
+  (`mcp__<server>__*`)**: the documented per-target posture of §4.5a and P10; 
whether it is the supported posture is
+  Q3.
+- **A Pi-backend Ship run publishing an ordinary additional material file** 
(documentation, test data): the
+  documented acceptance behaviour of P5, not a violation; the launch surface 
and the declared artifacts are what
+  validation bounds.
 - **Ship state inside the project (`.camel-kit/ship/state/`)**: 
controller-owned, denied by tree policy, ignored by
   its own `.gitignore` (P6).
 - **`GIT_CEILING_DIRECTORIES` set for child processes**: intended boundary 
(P8).
@@ -632,6 +678,8 @@ Suitable as a suppression or negative-prompt list for 
scanners and AI-assisted t
 
 - A new CLI command, parser or input format that reads external content; a 
parser moving to a later compilation
   phase or to symbol resolution against the analysed tree's classpath.
+- A change to the graph parser timeout or the POM parser path, or the addition 
of size, memory or symbolic-link
+  checks in `camel-kit-graph` (which closes Q2 items and promotes P1 tags).
 - Camel-Kit gaining a network listener of its own — in particular, merging the 
Knowledge MCP server into this
   repository (apache/camel-kit#2) would make family F an in-model component.
 - A change to the default oversight mode, default backend, Pi tool lists or 
launch flags, the tree policy rules or
@@ -662,10 +710,14 @@ match the Apache Camel Security Model so a triager can 
cite either document.
 | `OUT-OF-MODEL: adversary-not-in-scope` | Requires an actor §4.7 excludes: 
the developer or a same-user process, a compromised harness or provider, a 
hostile pinned origin, a transitive-dependency author. Covers operator 
misconfiguration of the host or harness. | §4.7 |
 | `OUT-OF-MODEL: unsupported-component` | Lands in family F (MCP servers — 
route to Apache Camel, camel-kit-knowledge or Citrus), G (the generated 
integration's runtime — route to the Apache Camel Security Model) or H 
(shipped-but-unsupported code). | §4.3, §4.2 |
 | `OUT-OF-MODEL: non-default-build` | Only manifests under a discouraged or 
non-default §4.5a knob (a widened allow-list, `--accept-experimental`, a 
repointed repository, a disabled hook or guard). | §4.5a |
-| `BY-DESIGN: property-disclaimed` | Concerns a property §4.9 explicitly does 
not provide: sandboxing of the agent, prompt-injection resistance by 
instruction, model output quality ("the LLM hallucinated"), attestation, 
verification of `init` downloads, resource bounds for graph analysis, security 
of a validated route. | §4.9 |
+| `BY-DESIGN: property-disclaimed` | Concerns a property §4.9 explicitly does 
not provide: sandboxing of the agent, prompt-injection resistance by 
instruction, model output quality ("the LLM hallucinated"), attestation, 
verification of `init` downloads, security of a validated route. | §4.9 |
 | `KNOWN-NON-FINDING` | Matches a §4.11a entry. | §4.11a |
 | `MODEL-GAP` | Cannot be routed cleanly above. Triggers a §4.12 revision. | 
§4.12 |
 
+A report that demonstrates an outside-root read, non-termination or unbounded 
memory during graph analysis is
+`VALID` under P1 whatever enforcement status Q2 records; it is neither 
`BY-DESIGN` nor a `MODEL-GAP`. A Pi-backend
+run that publishes an ordinary additional material file is the documented 
behaviour of P5, not a violation.
+
 Mapping the categories named in apache/camel-kit#5: a **framework 
vulnerability** is `VALID`; an **LLM
 hallucination** or insecure suggestion is `BY-DESIGN: property-disclaimed` 
unless a §4.8 hard control failed; a
 **user-directed insecure route design** is `OUT-OF-MODEL: trusted-input`; a 
**local operator environment
@@ -687,13 +739,15 @@ strike it. Answers promote the matching tags to 
*(maintainer, date)* and retire
   DataWeave and properties are tree- or regex-based. Confirm that each parser 
upholds the contract and whether the
   compiler-based parsers (Java, Groovy) should be pinned by tests and 
described the way the umbrella describes
   `LwJavaParser`.
-- **Q2 — Termination, memory and symbolic links in graph analysis → §4.6, §4.8 
P1, §4.9.** *Proposed:* no bound is
-  claimed today; a hang or memory blow-up on a crafted tree is 
`VALID-HARDENING`, and a read through a symbolic link
-  to a file outside the analysed root is `VALID` (the umbrella lists "reads a 
file" among the breaches). Alternative:
-  adopt the umbrella's "always finishes, in bounded time and memory" claim and 
add limits.
+- **Q2 — Enforcement status of the inherited graph contract → §4.6, §4.8 P1, 
P11.** The contract is inherited in
+  full *(maintainer, 2026-10-27)*, so this question is about enforcement, not 
scope. *Proposed:* confirm that (a)
+  file reads stay inside the analysed root when the tree contains symbolic 
links, or add that check; (b) the POM
+  parser is brought under the same timeout as the other parsers; (c) a memory 
or file-size bound is added. Until an
+  item is confirmed it is a tracked implementation gap, and a report that 
demonstrates it is `VALID` (§4.13).
 - **Q3 — Generated Claude allow-list and MCP auto-approval → §4.5a, §4.8 
P10.** `settings.json` pre-approves `Read`,
-  `Bash(mvn *)`, `Bash(./mvnw *)` and every tool of the three MCP servers; 
other targets pre-approve the manifest's
-  `allowed_tools`. *Proposed:* this is the supported posture; a finding that 
requires the user to widen it is
+  `Bash(mvn *)`, `Bash(./mvnw *)` and, through `mcp__<server>__*` rules, every 
tool of the three MCP servers,
+  including the runtime control tools the manifest leaves out; Bob 2 
auto-approves only the manifest's
+  `allowed_tools`; the other targets prompt or filter as §4.5a describes. 
*Proposed:* this is the supported posture; a finding that requires the user to 
widen it is
   `OUT-OF-MODEL: non-default-build`; a generated grant wider than documented 
is a P10 violation.
 - **Q4 — Snapshot repositories in the defaults → §4.5a, §4.9.** *Proposed:* 
`apache_snap` and `central_snap` in the
   repository lists and the JBang launcher are development conveniences; 
release installs resolve pinned releases
@@ -725,7 +779,8 @@ strike it. Answers promote the matching tags to 
*(maintainer, date)* and retire
 - **Q10 — Coexistence and venue → §4.1.** *Proposed:* this document is the 
additive sub-project expansion of the
   Apache Camel Security Model (option c in the rubric); `SECURITY.md` links to 
it; the Camel PMC registers it in
   `apache/security-site` `project-coordinates.json` under Apache Camel as 
"Apache Camel Kit", and the Camel website
-  security page lists Camel Kit among the sub-projects with their own model.
+  security page lists Camel Kit among the sub-projects with their own model. 
Registration is tracked in
+  [apache/camel-kit#131](https://github.com/apache/camel-kit/issues/131).
 - **Q11 — Knowledge MCP → §4.3, §4.12.** *Proposed:* `camel-kit-knowledge` 
stays out of this model while it is a
   separate repository; it gains its own model there, or is folded in here if 
apache/camel-kit#2 merges it.
 - **Q12 — Supported versions and preview status → `SECURITY.md`.** *Proposed:* 
fixes land on `main` and ship in the
@@ -766,6 +821,9 @@ file changes.
 | `distribution.properties`, `camel-kit-main/.../CamelKit.java` (pinned 
versions, named repositories, snapshots) | §4.4, §4.5a, §4.8 P4, Q4 |
 | Templates: `claude/settings.json`, `claude/agents/camel-ship-worker.md`, 
`copilot/hooks/camel-kit-safety.json`, 
`pi/extensions/camel-kit-guard-policy.json`, `codex/agents/*.toml`, 
`mcp-configs/*` | §4.5a, §4.8 P10, Q3 |
 | Source Javadoc and constants: `SecureXml`, `BizTalk*Parser`, 
`ArtifactValidator`, `GeneratedAssetCleaner`, `AtomicFileWriter`, 
`DistributionConfig`, `CatalogDownloader`, `CitrusSchemaDownloader`, 
`ForageCatalogService`, `ShipTreePolicy`, `ShipSecureFilesystem`, 
`ShipMavenResolver`, `ShipJvmPayloadBootstrap`, `EvidenceRunner`, 
`ShipCamelMainBootstrap`, `ShipExpressionPolicy`, `ShipArtifactLimits`, 
`ShipNativeWorker`, `PiWorker`, `LocalCommandRunner`, 
`ChangedWorkspaceSecretScanner`, `Sh [...]
+| Claude Code permissions reference (`mcp__<server>__*` matches every tool of 
that server) | §4.5a, §4.8 P10 |
+| Review of apache/camel-kit#6 by a maintainer, 2026-10-22 (native-only 
proposal allowlist; Pi candidate acceptance and extra material files; Claude 
`settings.json` MCP grants) | §4.5a, §4.6, §4.8 P5, P10, §4.9, §4.11a |
+| Maintainer decision, 2026-10-27 (graph source-reading contract inherited in 
full; enforcement gaps tracked, not disclaimed) | §4.1, §4.6, §4.8 P1, P11, 
§4.13, Q2 |
 
 > **Self-check status:** every section is substantive; no bullet belongs in a 
 > code review or audit report; only the
 > three sanctioned provenance tags are used; §4.9 and §4.10 are at least as 
 > substantive as §4.8; §4.6 is a
diff --git a/docs/security-model.yaml b/docs/security-model.yaml
index 14039a65..887cde0a 100644
--- a/docs/security-model.yaml
+++ b/docs/security-model.yaml
@@ -8,6 +8,7 @@ version: 0.4.2-SNAPSHOT
 commit: 70796c02
 date: "2026-10-22"
 status: draft
+last_review_round: "2026-10-27"
 canonical: docs/security-model.md
 umbrella_model: https://camel.apache.org/manual/security-model.html
 reporting:
@@ -103,7 +104,7 @@ entry_points:
   - entry: camel-kit graph <sub> [root]
     input: file bodies, names and link targets under root
     attacker_controllable: true
-    caller_must_enforce: No symlink or size guard is claimed (Q2).
+    caller_must_enforce: Confinement to root and bounded time and memory are 
claimed by P1; enforcement status tracked in Q2.
   - entry: .camel-kit/project-graph.json (graph output consumed by skills)
     attacker_controllable: derived-from-tree
     caller_must_enforce: Treat as data in prompts.
@@ -121,13 +122,18 @@ entry_points:
     input: context for the model
     attacker_controllable: developer-supplied-but-loaded-context
     caller_must_enforce: Do not pass secrets; third-party documents can carry 
instruction-like text.
-  - entry: camel-kit ship worker result (Pi RPC output, native --result 
envelope)
+  - entry: camel-kit ship native result envelope (--result PATH; bob2-native, 
copilot-native, claude-native, codex-native)
     input: stage result JSON and file proposals
     attacker_controllable: true
-    controller_enforces: [strict JSON schema, approved path set only, size 
limits, tree policy, expression gate, secret scan, deterministic validation]
+    controller_enforces: [strict JSON schema, approved path set only (route 
and test paths, pom.xml, .camel-kit/config.properties), known-secret scan 
before any write, then the Pi candidate checks]
+  - entry: camel-kit ship Pi RPC result and the staged candidate the worker 
edited (pi backend, default)
+    input: stage result JSON; files written in the staging workspace
+    attacker_controllable: true
+    controller_enforces: [strict JSON schema, tree policy, artifact validation 
(manifest, declared routes and tests, pom policy, Camel Main Java policy, 
Citrus dependency policy, launch surface), secret scan of changed material 
files, expression gate, deterministic validation]
+    note: Ordinary additional material files are accepted and published (P5).
   - entry: camel-kit ship staged workspace / candidate tree
     attacker_controllable: derived
-    controller_enforces: [tree policy]
+    controller_enforces: [tree policy, publication of every changed material 
file]
   - entry: Ship resolver
     input: Maven Central responses
     attacker_controllable: true
@@ -149,10 +155,11 @@ configuration_variants:
     effect: Selects which generated harness controls exist (allow-lists, 
read-only worker definitions, hooks, guard policies).
     security_relevant: true
     stance: open (Q3) - proposed supported posture
-  - knob: MCP autoApprove / alwaysAllow / directTools / enabled_tools
-    default: workflow manifest allowed_tools (read-only and generation helpers)
+  - knob: Generated MCP tool lists and Claude settings.json MCP rules
+    default: workflow manifest allowed_tools (read-only and generation 
helpers, no runtime mutation or control tools)
+    effect: Availability filter - Codex enabled_tools, Copilot tools, Pi 
directTools, Qwen includeTools. Approval only - Bob 2 alwaysAllow/autoApprove = 
manifest list; Claude Code settings.json permissions.allow mcp__camel__*, 
mcp__camel-knowledge__*, mcp__citrus__* = every tool of each server (.mcp.json 
autoApprove/alwaysAllow keys are not a Claude Code filter). Prompt before every 
call - Codex default_tools_approval_mode prompt, OpenCode permission ask, Qwen 
and Copilot prompts. Antigr [...]
     security_relevant: true
-    stance: open (Q3)
+    stance: open (Q3) for the Claude Code wildcard grant; other postures 
documented
   - knob: camel.mcp.repos, knowledge.mcp.repos, citrus.mcp.repos, 
camel.catalog.repos, JBang //REPOS
     default: Maven Central, ASF public, ASF snapshots, Central snapshots
     effect: Snapshot repositories serve mutable artifacts.
@@ -202,10 +209,10 @@ configuration_variants:
 
 claimed_properties:
   - id: P1
-    property: Source-reading contract for graph analysis - no code execution, 
class loading, placeholder/secret resolution or network; output is data 
(inherited from the umbrella model).
-    violation_symptom: Child process, class loaded or defined from the source, 
outbound connection, read outside the tree, or placeholder resolved during 
graph analysis.
-    severity: security-critical
-    provenance: documented (umbrella, SecureXml, BizTalk parsers); inferred 
for Java, Groovy, YAML, DataWeave, properties (Q1)
+    property: Source-reading contract for graph analysis, inherited in full 
from the umbrella model - no code execution, class loading, placeholder/secret 
resolution or network; always finishes in bounded time and memory; output is 
data. Bound in place - GraphBuilder 60-second timeout per parser other than the 
POM parser. Not yet verified - POM parser bound, memory or file-size bound, 
confinement of reads to the analysed root when the tree contains symbolic links 
(Q2).
+    violation_symptom: Child process, class loaded or defined from the source, 
outbound connection, read of a file outside the analysed root (including 
through a symbolic link), placeholder resolved, non-termination, or unbounded 
memory during graph analysis.
+    severity: security-critical (VALID regardless of the enforcement status 
recorded in Q2)
+    provenance: documented (umbrella, SecureXml, BizTalk parsers, 
GraphBuilder); inferred for Java, Groovy, YAML, DataWeave, properties (Q1); 
enforcement of confinement and resource clauses inferred (Q2); inheritance in 
full is a maintainer decision of 2026-10-27
   - id: P2
     property: Hardened XML parsing at every XML entry point, including Ship 
pom.xml validation.
     violation_symptom: XXE, SSRF or local file read through XML.
@@ -222,10 +229,10 @@ claimed_properties:
     severity: security-critical
     provenance: documented (mcp-setup.md, distribution.properties, 
ShipMavenResolver, ShipJvmPayloadBootstrap)
   - id: P5
-    property: Ship controller alone writes run state and commits transitions; 
proposals accepted only for the approved path set; publication journaled, 
atomic, verified against the validated candidate, recoverable.
-    violation_symptom: Worker output changes a stage, pause or publication 
decision; proposal lands outside the approved set; published tree differs from 
the validated candidate; torn publication left unrecovered.
+    property: Ship controller alone writes run state, commits transitions and 
decides what is accepted and published. Native backends (bob2-native, 
copilot-native, claude-native, codex-native) - proposals written only for the 
approved route and test paths, pom.xml and .camel-kit/config.properties, after 
a known-secret scan; other paths rejected (ShipNativeWorker.applyProposals). Pi 
backend (default) - the worker edits the staged candidate directly; acceptance 
through tree policy, artifac [...]
+    violation_symptom: Worker output changes a stage, pause or publication 
decision; a native proposal is written outside the approved set or without the 
secret check; a Pi candidate is accepted despite a tree-policy denial, a 
failing artifact or launch-surface check, or a verbatim secret; published tree 
differs from the validated candidate; torn publication left unrecovered.
     severity: security-critical
-    provenance: documented (docs/commands.md, docs/ship-native.md, 
ShipPublicationService)
+    provenance: documented (docs/commands.md, docs/ship-native.md, 
ShipNativeWorker, ArtifactValidator, 
ShipCamelMainBootstrap.validateLaunchSurface, ShipPublicationService); Pi 
acceptance and extra material files - maintainer, 2026-10-22 (review of #6)
   - id: P6
     property: Ship tree policy - denied credential and state paths, protected 
and volatile classes, rejection of symlinks, hard links and special files, 
quotas (20000 entries, 64 MiB per file, 1 GiB aggregate, depth 128, 4096-char 
paths).
     violation_symptom: Denied path enters a snapshot, workspace, prompt or 
publication; a link is followed.
@@ -247,12 +254,12 @@ claimed_properties:
     severity: hardening
     provenance: documented (ShipExpressionPolicy)
   - id: P10
-    property: Generated harness assets carry their documented least-privilege 
posture (read-only Ship workers, read-only Codex roles, Copilot deny hook, Pi 
guard policy, MCP allow-lists without runtime control tools, no HTTP port for 
MCP servers). Claim is about the generated artifact; enforcement is the 
harness's.
-    violation_symptom: Generated asset grants more than documented.
+    property: Generated harness assets carry their documented least-privilege 
posture - read-only Ship workers, read-only Codex roles, Copilot deny hook, Pi 
guard policy, no HTTP port for the Camel and Citrus MCP servers, and the 
per-target MCP grants - the manifest allowed_tools (no runtime mutation or 
control tools) is an availability filter for Codex (enabled_tools), Copilot 
(tools), Pi (directTools) and Qwen (includeTools) and an auto-approval list for 
Bob 2 (alwaysAllow/autoApprove) [...]
+    violation_symptom: Generated asset grants more than this documented 
posture - a worker with edit or shell tools, a filter or auto-approval list 
containing a tool outside the manifest allowed_tools, a prompt-mode target 
generated with auto-approval, a hook or guard that fails open on a documented 
pattern.
     severity: hardening; security-critical when the widened grant reaches a 
credential or destructive action without a prompt
-    provenance: documented (docs/agent-architectures.md, docs/ship-claude.md, 
docs/ship-native.md, templates)
+    provenance: documented (docs/agent-architectures.md, docs/ship-claude.md, 
docs/ship-native.md, templates/mcp-configs/*, templates/claude/settings.json, 
Claude Code permissions reference); Claude grant description - maintainer, 
2026-10-22 (review of #6)
   - id: P11
-    property: Stated resource bounds - route/Citrus YAML 2 MiB, native result 
16 MiB and 1000 files, Pi prompt 1 MiB, Pi log 16 MiB, session 64 MiB, evidence 
log 64 MiB, stage timeout 10m, resolver 64 roots/512 artifacts/128 MiB JAR/4 
MiB POM, tree quotas, migration-context depth 3 and 50 nodes.
+    property: Stated resource bounds - route/Citrus YAML 2 MiB, native result 
16 MiB and 1000 files, Pi prompt 1 MiB, Pi log 16 MiB, session 64 MiB, evidence 
log 64 MiB, stage timeout 10m, resolver 64 roots/512 artifacts/128 MiB JAR/4 
MiB POM, tree quotas, migration-context depth 3 and 50 nodes; graph parsers 
other than the POM parser 60 s each (serves P1).
     violation_symptom: A limit not enforced at its documented value.
     severity: hardening
     provenance: documented (ShipArtifactLimits, ShipNativeWorker, PiWorker, 
EvidenceRunner, ShipMavenResolver, ShipTreePolicy, docs/commands.md)
@@ -272,8 +279,6 @@ disclaimed_properties:
     statement: No signature or checksum verification for init-time downloads 
(TLS only, redirects followed) (Q7).
   - id: D7
     statement: Snapshot repositories are mutable; no reproducibility or 
integrity claim (Q4).
-  - id: D8
-    statement: No resource bound or symlink guard for graph analysis of a 
hostile tree (Q2).
   - id: D9
     statement: Validation of generated routes is a static quality gate, not a 
security audit.
   - id: D10
@@ -297,6 +302,8 @@ false_friends:
     reality: They cannot write, but they read what the parent's permissions 
allow and return text; a fresh context is not an OS sandbox.
   - claim: camel_route_harden_context / camel_security_scan passed
     reality: MCP output is supplemental candidate evidence, never the 
canonical result.
+  - claim: Ship validated it, so only the declared route, test, pom.xml and 
config changed
+    reality: With the Pi backend the worker may create other material files; 
they pass validation as ordinary material files and are published with the 
candidate (P5). Review the whole publication set.
 attack_classes_left_downstream:
   - prompt injection through repository content, documentation, logs and MCP 
responses
   - MCP tool poisoning and rug-pulls
@@ -335,8 +342,11 @@ known_non_findings:
   - pattern: followRedirects(NORMAL) in init downloaders
     why: HTTPS-to-HTTPS redirects expected; NORMAL never downgrades to HTTP 
(verification gap is Q7).
     disposition: KNOWN-NON-FINDING
-  - pattern: Generated Claude settings.json pre-approving mvn
-    why: Documented posture (Q3).
+  - pattern: Generated Claude settings.json pre-approving mvn, ./mvnw and 
every tool of the three MCP servers (mcp__<server>__*)
+    why: Documented per-target posture (4.5a, P10); whether it is the 
supported posture is Q3.
+    disposition: KNOWN-NON-FINDING
+  - pattern: A Pi-backend Ship run publishing an ordinary additional material 
file (documentation, test data)
+    why: Documented acceptance behaviour of P5; validation bounds the launch 
surface and the declared artifacts, not every material file.
     disposition: KNOWN-NON-FINDING
   - pattern: Ship state inside the project (.camel-kit/ship/state)
     why: Controller-owned, denied by tree policy, self-ignored for git.
@@ -376,6 +386,16 @@ issue_5_category_mapping:
   user_directed_insecure_route_design: OUT-OF-MODEL:trusted-input
   local_operator_environment_misconfiguration: 
OUT-OF-MODEL:adversary-not-in-scope or OUT-OF-MODEL:non-default-build
 
+triage_notes:
+  - Outside-root read, non-termination or unbounded memory during graph 
analysis is VALID under P1 regardless of the enforcement status in Q2 - neither 
BY-DESIGN nor MODEL-GAP.
+  - A Pi-backend Ship run publishing an ordinary additional material file is 
documented P5 behaviour, not a violation.
+maintainer_decisions:
+  - date: "2026-10-27"
+    decision: Graph source-reading contract inherited in full from the Apache 
Camel Security Model; enforcement gaps are tracked in Q2, not disclaimed.
+    sections: ["4.1", "4.8 P1", "4.8 P11", "4.13", "Q2"]
+  - date: "2026-10-22"
+    decision: Review of #6 - the proposal allowlist applies to native backends 
only; Pi candidates are accepted through tree, artifact and launch-surface 
validation with ordinary extra material files permitted and published; the 
generated Claude settings.json wildcards grant every MCP tool and the .mcp.json 
autoApprove/alwaysAllow keys are not a Claude Code filter.
+    sections: ["4.5a", "4.6", "4.8 P5", "4.8 P10", "4.9", "4.11a"]
 open_questions:
   - id: Q1
     wave: 1
@@ -383,12 +403,12 @@ open_questions:
     proposed: Umbrella source-reading contract applies to all nine parsers; 
graph analysis spawns no process; Java AST-only; Groovy CONVERSION phase only.
   - id: Q2
     wave: 1
-    sections: ["4.6", "4.8 P1", "4.9"]
-    proposed: No termination or memory bound claimed; hang is VALID-HARDENING; 
read through a symlink outside the root is VALID.
+    sections: ["4.6", "4.8 P1", "4.8 P11"]
+    proposed: Contract inherited in full (maintainer, 2026-10-27); confirm 
enforcement - (a) file reads stay inside the analysed root when the tree 
contains symbolic links, or add that check; (b) the POM parser is brought under 
the parser timeout; (c) a memory or file-size bound is added. Until confirmed 
each item is a tracked implementation gap and a demonstrated case is VALID.
   - id: Q3
     wave: 1
     sections: ["4.5a", "4.8 P10"]
-    proposed: Generated Claude allow-list and MCP auto-approval are the 
supported posture.
+    proposed: The generated Claude allow-list (Read, Bash(mvn *), Bash(./mvnw 
*), mcp__<server>__* for all three MCP servers including runtime control tools) 
is the supported posture; Bob 2 auto-approves only the manifest list; other 
targets prompt or filter.
   - id: Q4
     wave: 1
     sections: ["4.5a", "4.9"]
@@ -416,7 +436,7 @@ open_questions:
   - id: Q10
     wave: 3
     sections: ["4.1"]
-    proposed: Additive sub-project expansion of the umbrella model; register 
in apache/security-site project-coordinates.json.
+    proposed: Additive sub-project expansion of the umbrella model; register 
in apache/security-site project-coordinates.json and on 
camel.apache.org/security. Tracked in apache/camel-kit#131.
   - id: Q11
     wave: 3
     sections: ["4.3", "4.12"]
@@ -432,6 +452,7 @@ open_questions:
 
 revision_triggers:
   - New CLI command, parser or input format reading external content; parser 
moving to later compilation phase or symbol resolution.
+  - Change to the graph parser timeout or the POM parser path, or addition of 
size, memory or symbolic-link checks in camel-kit-graph (closes Q2 items).
   - Camel-Kit gaining a network listener (e.g. merging the Knowledge MCP 
server, apache/camel-kit#2).
   - Change to default oversight mode, default backend, Pi tool lists or flags, 
tree policy rules/quotas, expression gate, secret-scan rules, resolver 
origin/checksum/redirect policy.
   - init writing outside the target directory or under $HOME; Ship state 
moving to a user-level default.

Reply via email to