Skip to content

Compile status

Check on a compile or link job by its job_id, the id returned by log10x_compile or log10x_compile_link.

The response reports where the job stands (running, completed, incomplete, failed, or timed out) and what it has produced:

  • the symbol units so far
  • the linked .10x.tar file and its size
  • the elapsed time
  • the engine exit code
  • a credential-redacted tail of the engine log

The point of the tool is to keep the Compiler app legible at 100k to 500k files. A run that size writes a log hundreds of thousands of lines long, so the two diagnostics that matter are lifted to the top of the response instead of being left buried in it:

  • scan_health reports how many files failed to parse during the scan phase, broken down by language, with a few examples that name the file and the reason it would not parse.
  • link_report reports how many units were merged during linking and how many were excluded, plus a count of symbols by type (class, enum, log, exec).

Both fields appear only when the compiler-10x image includes the engine diagnostics change. On an older image the response falls back to unit counts and the log tail, and still succeeds.

The engine stops a scan on its own caps and still exits 0, so the captured log is checked for its loss markers and a run that carries one is reported as job_status: "incomplete" with data.status: "partial". The markers, each with a count and the first matching line, are in loss_markers:

kind Engine log line Meaning
scan_operation_timeout scan operation timeout: <ms> The whole-scan cap (scanOperationTimeout) was hit; the scan stopped with files unscanned.
unit_timeout symbol scan timed out, file dropped: <file> The per-file cap (scanUnitTimeout, default 30s) dropped a file; it has no unit.
traverse_aborted traverse aborted for <operation> / traverser aborted: <file> The tree walk stopped before visiting every file.
process_output_not_drained process output not fully read: <command> A scan subprocess ended with output unread; its units may be missing.
antlr_parse_timeout timeout exceeded: <ms>ms An ANTLR parse gave up on a file; it failed to scan.

An incomplete run keeps its units and library, so a re-run with a larger timeout_ms (which raises the whole-scan cap) or narrower sources reuses every file already scanned.

A zero-byte unit (empty_unit_count) is a unit file the engine created and then wrote nothing into: every symbol in the file was filtered out, the file was skipped as a duplicate of one already scanned, or its scan was dropped.

Polling is safe to repeat. The first poll after the job finishes records the exit code and releases the container. Later polls keep working, and the compiled library is never removed.

Example

You

status on compile-7c2f

Log10x

Compile job compile-7c2f done, 4,812 units → /tmp/log10x-mcp-compile/out/payments.10x.tar (38.6 MB), 19 files failed to scan.

Scan health: 19 files failed (top: java 11, go 6, python 2). Example: vendor/legacy/Parser.java, unsupported syntax near token 'sealed'.

Link report: linked 4,812 unit files (37 excluded by folder/name filters); symbols by type: class 18,204, log 9,661, exec 4,113, enum 1,290.

More to ask

  • "is compile-7c2f done yet?"
  • "which files failed to scan on that job?"
  • "did the engine stop early on that job?"
  • "show me the last 200 log lines for the failed link"

Prerequisites

Runs at the CLI tier, with no Kubernetes, deployed app, or Log10x account required. The tool reads the on-disk job record written by log10x_compile or log10x_compile_link, so a job_id from one of those calls is the only input it needs.

The per-language scan failures and the symbol-type counts need a compiler-10x image that carries the engine diagnostics change. An older image returns the unit counts and the log tail without them.

Schema and samples

Input example

Poll a job_id handed back by a long first compile, asking for a deeper log tail to diagnose a failure.

{
  "job_id": "compile-7c2f",
  "log_lines": 200
}
Input schema

Agent-facing JSON Schema (the canonical shape the MCP server publishes via tools/list):

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The job id returned by log10x_compile (data.payload.job_id)."
    },
    "log_lines": {
      "type": "integer",
      "minimum": 0,
      "maximum": 400,
      "default": 40,
      "description": "How many trailing engine-log lines to include in data.payload.log_tail (credential-redacted). 0 to omit. Raise it when diagnosing a failed or incomplete run."
    },
    "view": {
      "type": "string",
      "const": "summary",
      "default": "summary",
      "description": "summary returns the typed envelope (data.payload.job_status, .loss_markers, .diagnostics, .output, .log_tail)."
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Source: src/tools/compile-status.ts.

Output example

Representative envelope (no captured fixture). A completed compile on a compiler-10x image that carries the engine diagnostics change, so scan_health and link_report are populated. Long arrays and the log tail are trimmed for readability.

Headline (the 1-line agent-facing answer):

Compile job compile-7c2f done: 4812 units → /tmp/log10x-mcp-compile/out/payments.10x.tar (38.6 MB), 19 files failed to scan.

{
  "schema_version": "1.0",
  "schema_epoch": "2026-05-25",
  "tool": "log10x_compile_status",
  "generated_at": "2026-06-15T16:04:11.730Z",
  "view": "summary",
  "status": "success",
  "summary": {
    "headline": "Compile job `compile-7c2f` done: 4812 units → /tmp/log10x-mcp-compile/out/payments.10x.tar (38.6 MB), 19 files failed to scan."
  },
  "data": {
    "status": "success",
    "decisions": {
      "threshold_used": null,
      "threshold_basis": "default"
    },
    "source_disclosure": {},
    "scope": {
      "window": "payments_compile",
      "window_basis": "explicit",
      "candidates_count": 4812,
      "candidates_usable": 1
    },
    "payload": {
      "job_id": "compile-7c2f",
      "job_status": "completed",
      "mode": "docker",
      "image": "log10x/compiler-10x:1.1.136@sha256:ffcd9890935804b06fcb1791994dfbb32cdb270f3e35fc423ede78ced2097b1f",
      "compiler": "docker:log10x/compiler-10x:1.1.136@sha256:ffcd9890935804b06fcb1791994dfbb32cdb270f3e35fc423ede78ced2097b1f",
      "exit_code": 0,
      "elapsed_ms": 184220,
      "timed_out": false,
      "loss_markers": [],
      "sources": "local /src/payments + github acme/payments-api",
      "output": {
        "folder": "/tmp/log10x-mcp-compile/out/payments",
        "unit_count": 4812,
        "empty_unit_count": 31,
        "library_files": [
          { "path": "/tmp/log10x-mcp-compile/out/payments.10x.tar", "bytes": 40478720 }
        ]
      },
      "diagnostics": {
        "results_available": true,
        "phases": [
          {
            "operation": "scan",
            "status": "ok",
            "traversed_files": 21044,
            "scanned_files": 4843,
            "output_files": 4812,
            "warns": 19,
            "errors": 0
          },
          {
            "operation": "link",
            "status": "ok",
            "traversed_files": 4812,
            "scanned_files": 0,
            "output_files": 1,
            "warns": 0,
            "errors": 0
          }
        ],
        "scan_health": {
          "files_failed": 19,
          "failed_by_language": { "java": 11, "go": 6, "python": 2 },
          "failure_samples": [
            {
              "name": "vendor/legacy/Parser.java",
              "language": "java",
              "reason": "unsupported syntax near token 'sealed'"
            }
          ]
        },
        "link_report": {
          "merged_files": 4812,
          "skipped_files": 0,
          "excluded_by_folder": 24,
          "excluded_by_file_name": 13,
          "merged_repos_count": 2,
          "non_merged_repos_count": 0,
          "symbols_by_type": {
            "class": 18204,
            "log": 9661,
            "exec": 4113,
            "enum": 1290
          },
          "symbols_excluded_by_type": 502
        }
      },
      "log_tail": [
        "INFO  ScanObserver - report phase complete: 4812 units written",
        "INFO  Linker - merged 4812 units into payments.10x.tar (38.6 MB)"
      ]
    },
    "human_summary": "Compile job compile-7c2f completed via docker in 3m04s: 4812 symbol units, linked to /tmp/log10x-mcp-compile/out/payments.10x.tar (38.6 MB). 31 units are zero bytes: the engine created the unit file and wrote nothing into it, because every symbol in the file was filtered out (the default symbolTypes keep package/class/enum/log/text/exec), the file was skipped as a duplicate of one already scanned, or its scan was dropped. 19 files failed to scan (top: java 11, go 6, python 2). Example: vendor/legacy/Parser.java, unsupported syntax near token 'sealed'. Linked 4812 unit files (37 excluded by folder/name filters); symbols by type: class 18204, log 9661, exec 4113, enum 1290."
  },
  "actions": [
    {
      "tool": "log10x_validate",
      "args": { "extra_args": [["symbolPaths", "/tmp/log10x-mcp-compile/out/payments"]] },
      "reason": "smoke-test the compiled library against a few sample event lines (supply input_lines)"
    }
  ],
  "truncated": false,
  "warnings": []
}

On an older compiler-10x image, diagnostics.results_available is false, scan_health and link_report are null, and the response carries the unit counts plus log_tail alone.

A run the engine stopped early comes back as incomplete:

Compile job compile-7c2f exited cleanly but stopped early (scan operation timeout x1, unit timeout x2): 3104 units written. The library is missing symbols; see data.payload.loss_markers.

with data.status: "partial", job_status: "incomplete", and

"loss_markers": [
  {
    "kind": "scan_operation_timeout",
    "count": 1,
    "sample": "ERROR FileSymbolScanOperation scan operation timeout: 600000 for com.log10x.eng.scanner.operations.FileSymbolScanOperation: {...} after: 10m"
  },
  {
    "kind": "unit_timeout",
    "count": 2,
    "sample": "WARN symbol scan timed out, file dropped: vendor/legacy/Generated.java"
  }
]

The actions[] entry then points at a re-run with timeout_ms doubled.

Output schema

The payload block inside the chassis envelope:

interface CompileStatusPayload {
  job_id: string;
  // incomplete: a clean exit whose log carries an engine loss marker.
  job_status: 'running' | 'completed' | 'incomplete' | 'failed' | 'timed_out';
  mode: 'docker' | 'local';
  image: string | null;
  // The identity the output folder is keyed on: `docker:<image ref>` or `local:<engine version>`.
  compiler: string | null;
  exit_code: number | null;
  elapsed_ms: number;
  timed_out: boolean;
  // Engine loss markers found in the log; non-empty on an `incomplete` run.
  loss_markers: Array<{
    kind: 'scan_operation_timeout' | 'unit_timeout' | 'traverse_aborted' | 'process_output_not_drained' | 'antlr_parse_timeout';
    count: number;
    sample: string;
  }>;
  sources: string;
  output: {
    folder: string;
    unit_count: number;
    empty_unit_count: number;
    library_files: Array<{ path: string; bytes: number }>;
  };
  diagnostics: {
    results_available: boolean;
    phases: Array<{
      operation: string | null;
      status: string | null;
      traversed_files: number | null;
      scanned_files: number | null;
      output_files: number | null;
      warns: number | null;
      errors: number | null;
    }>;
    // Populated only on a compiler-10x image that carries the engine
    // diagnostics change; null otherwise (graceful degradation).
    scan_health: {
      files_failed: number;
      failed_by_language: Record<string, number>;
      failure_samples: Array<{ name: string; language: string; reason: string }>;
    } | null;
    link_report: {
      merged_files: number;
      skipped_files: number;
      excluded_by_folder: number;
      excluded_by_file_name: number;
      merged_repos_count: number;
      non_merged_repos_count: number;
      symbols_by_type: Record<string, number>;
      symbols_excluded_by_type: number;
    } | null;
  };
  log_tail: string[];
}

Envelope-level fields the agent should also read: summary.headline (1-line answer), status (success / partial / no_signal / error; partial on an incomplete run), data.human_summary (the quotable plain-English summary), and actions[] (next-call chain hints as {tool, args, reason}; a completed compile chains to log10x_validate to smoke-test the library, an incomplete one to a re-run with a larger timeout_ms).