@amaster.ai/employee-runtime-connector 0.1.1-beta.130 → 0.1.1-beta.132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/README.md +10 -2
  2. package/dist/amaster-runtime-daemon/capability-registry.mjs +66 -0
  3. package/dist/amaster-runtime-daemon.mjs +128 -14
  4. package/dist/amaster-runtime.mjs +15 -22
  5. package/dist/templates/.mirrorx-preset-templates.json +30 -30
  6. package/dist/templates//344/274/201/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277V0.1 /345/211/257/346/234/254.md" +16 -16
  7. package/dist/templates//344/275/216/347/251/272/347/273/217/346/265/216/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  8. package/dist/templates//345/205/203/345/256/207/345/256/231/344/270/216/346/225/260/345/255/227/345/206/205/345/256/271/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +12 -10
  9. package/dist/templates//345/206/234/344/270/232/344/270/216/351/243/237/345/223/201/346/267/261/345/212/240/345/267/245/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  10. package/dist/templates//345/214/273/347/226/227/345/201/245/345/272/267/344/270/216/347/224/237/345/221/275/347/247/221/345/255/246/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  11. package/dist/templates//345/220/210/346/210/220/347/224/237/347/211/251/345/255/246/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +12 -10
  12. package/dist/templates//345/225/206/344/270/232/350/210/252/345/244/251/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +12 -10
  13. package/dist/templates//345/273/272/347/255/221/344/270/216/346/210/277/345/234/260/344/272/247/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  14. package/dist/templates//346/226/207/346/227/205/344/270/216/346/226/207/344/275/223/346/225/231/350/202/262/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  15. package/dist/templates//346/266/210/350/264/271/344/270/216/351/233/266/345/224/256/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  16. package/dist/templates//347/211/251/346/265/201/344/270/216/344/276/233/345/272/224/351/223/276/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  17. package/dist/templates//347/247/221/346/212/200/344/270/216/344/272/222/350/201/224/347/275/221/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  18. package/dist/templates//350/203/275/346/272/220/344/270/216/347/216/257/344/277/235/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  19. package/dist/templates//351/207/221/350/236/215/344/270/216/344/270/223/344/270/232/346/234/215/345/212/241/350/241/214/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  20. package/dist/templates//351/253/230/347/253/257/344/270/216/345/205/210/350/277/233/345/210/266/351/200/240/344/270/232/346/210/230/347/225/245/350/247/204/345/210/222/346/250/241/346/235/277.md +16 -16
  21. package/package.json +1 -1
package/README.md CHANGED
@@ -12,8 +12,7 @@ For production images, install an exact version and invoke the package bin:
12
12
 
13
13
  ```sh
14
14
  npm install --omit=dev --prefix /opt/pi-cli-runtime @amaster.ai/employee-runtime-connector@0.1.0
15
- /opt/pi-cli-runtime/node_modules/.bin/amaster-runtime setup https://employee.example.com \
16
- --capabilities remote_registration,heartbeat,executor_discovery,workspace_binding,run_wakeup,context_envelope_v1,managed_project_instructions_v1,final_model_context_attestation_v1,runtime_actions_v2,run_exit_live_path_closure_v1,model_call,model_call_output_contract_v1,run_cancel,run_terminate,logs_cost_workspace_status
15
+ /opt/pi-cli-runtime/node_modules/.bin/amaster-runtime setup https://employee.example.com
17
16
  /opt/pi-cli-runtime/node_modules/.bin/amaster-runtime daemon start --foreground
18
17
  ```
19
18
 
@@ -21,6 +20,15 @@ Do not use `latest`, `^`, or `~` in a runtime image. The image tag and connector
21
20
 
22
21
  Immutable images should pin an exact package version as their baseline. The current connector does not download or replace runtime code while running; package upgrades and rollbacks belong to the image build and rollout.
23
22
 
23
+ Connector capability declaration is automatic. The exact package build declares
24
+ what it implements, and runtime readiness removes dynamic capabilities when their
25
+ executor or supporting runtime is unavailable. Operators restrict what the Server
26
+ accepts with `AMASTER_RUNTIME_CONNECTOR_CAPABILITY_ALLOWLIST`; users do not need to
27
+ configure a connector-local capability list. Historical `AMASTER_CAPABILITIES` and
28
+ `--capabilities` inputs remain accepted for rollback compatibility in this release,
29
+ but are ignored and reported as deprecated. They cannot add, remove, or authorize a
30
+ capability.
31
+
24
32
  The publish workflow verifies that npm records the publishing commit as the package `gitHead`, then updates the repository deployment pin. Remote deployment accepts that package only when its `gitHead` is an ancestor of the target source commit and the connector runtime build inputs are unchanged between them. Those inputs are the package path plus `packages/shared/src/source-acquisition-compatibility.json`, which is copied into the published package and bundled into the daemon. If another workspace source becomes a runtime build input, expand the provenance scope and tests before release. After restart, deployment also verifies the package CLI version inside the container. Do not update the deployment pin manually to bypass either provenance check.
25
33
 
26
34
  ## Package Contents
@@ -0,0 +1,66 @@
1
+ export const BUILD_SUPPORTED_CAPABILITIES = Object.freeze([
2
+ "remote_registration",
3
+ "heartbeat",
4
+ "executor_discovery",
5
+ "workspace_binding",
6
+ "run_wakeup",
7
+ "context_envelope_v1",
8
+ "managed_project_instructions_v1",
9
+ "final_model_context_attestation_v1",
10
+ "runtime_actions_v2",
11
+ "run_exit_live_path_closure_v1",
12
+ "model_call",
13
+ "model_call_output_contract_v1",
14
+ "run_cancel",
15
+ "run_terminate",
16
+ "logs_cost_workspace_status",
17
+ "source_acquisition_v1",
18
+ "headed_browser_auth",
19
+ ]);
20
+
21
+ const DYNAMIC_READINESS = Object.freeze({
22
+ final_model_context_attestation_v1: {
23
+ reasonCode: "managed_pi_executor_required",
24
+ ready: (input) => input.runnerKind === "cloud_managed"
25
+ && input.executors.some((executor) => executor.kind === "pi"),
26
+ },
27
+ source_acquisition_v1: {
28
+ reasonCode: "source_acquisition_not_ready",
29
+ ready: (input) => input.sourceAcquisition?.ready === true,
30
+ },
31
+ headed_browser_auth: {
32
+ reasonCode: "headed_browser_runtime_not_ready",
33
+ ready: (input) => input.browserSessionBroker?.ready === true,
34
+ },
35
+ });
36
+
37
+ function uniqueStrings(values) {
38
+ return Array.from(new Set((Array.isArray(values) ? values : [])
39
+ .map((value) => String(value ?? "").trim())
40
+ .filter(Boolean)));
41
+ }
42
+
43
+ export function buildRuntimeCapabilityReport(input) {
44
+ const legacyConfiguredCapabilities = uniqueStrings(input.legacyConfiguredCapabilities);
45
+ const runtimeUnavailable = [];
46
+ const advertised = BUILD_SUPPORTED_CAPABILITIES.filter((capability) => {
47
+ const readiness = DYNAMIC_READINESS[capability];
48
+ if (!readiness || readiness.ready(input)) return true;
49
+ runtimeUnavailable.push({ capability, reasonCode: readiness.reasonCode });
50
+ return false;
51
+ });
52
+ const buildSet = new Set(BUILD_SUPPORTED_CAPABILITIES);
53
+ const legacySet = new Set(legacyConfiguredCapabilities);
54
+ return {
55
+ schemaVersion: "mirrorx.connector-capability-report/v1",
56
+ source: "build_attested",
57
+ buildSupported: [...BUILD_SUPPORTED_CAPABILITIES],
58
+ runtimeUnavailable,
59
+ advertised,
60
+ deprecatedCapabilityOverridePresent: legacyConfiguredCapabilities.length > 0,
61
+ legacyMissingFromBuildTruth: legacyConfiguredCapabilities.length > 0
62
+ ? BUILD_SUPPORTED_CAPABILITIES.filter((capability) => !legacySet.has(capability))
63
+ : [],
64
+ legacyUnsupportedClaims: legacyConfiguredCapabilities.filter((capability) => !buildSet.has(capability)),
65
+ };
66
+ }
@@ -4666,6 +4666,52 @@ var AMASTER_RUNTIME_CONNECTOR_CAPABILITIES = [
4666
4666
  "headed_browser_auth",
4667
4667
  "browser_auth_relay_outbound_e0"
4668
4668
  ];
4669
+ var TERMINAL_BUSINESS_RECONCILIATION_VERSION = "mirrorx.terminal-business-reconciliation/v1";
4670
+ var terminalBusinessReconciliationAuthoritySnapshotSchema = external_exports.object({
4671
+ outcomeId: external_exports.string().uuid().nullable(),
4672
+ outcomeRevision: external_exports.number().int().positive().nullable(),
4673
+ businessRevision: external_exports.number().int().positive().nullable(),
4674
+ manifestId: external_exports.string().uuid().nullable(),
4675
+ manifestRevision: external_exports.number().int().positive().nullable()
4676
+ }).strict();
4677
+ var terminalBusinessReconciliationSchema = external_exports.discriminatedUnion("outcome", [
4678
+ external_exports.object({
4679
+ outcome: external_exports.literal("finalized"),
4680
+ issueStatus: external_exports.literal("done"),
4681
+ acceptanceId: external_exports.string().uuid()
4682
+ }).strict(),
4683
+ external_exports.object({
4684
+ outcome: external_exports.literal("review_pending"),
4685
+ interactionId: external_exports.string().uuid()
4686
+ }).strict(),
4687
+ external_exports.object({
4688
+ outcome: external_exports.literal("live_path_owned"),
4689
+ owner: external_exports.string().trim().min(1),
4690
+ reasonCode: external_exports.string().trim().min(1)
4691
+ }).strict(),
4692
+ external_exports.object({
4693
+ outcome: external_exports.literal("recoverable_missing_disposition"),
4694
+ reasonCode: external_exports.string().trim().min(1)
4695
+ }).strict(),
4696
+ external_exports.object({
4697
+ outcome: external_exports.literal("blocked_by_gate"),
4698
+ owner: external_exports.string().trim().min(1),
4699
+ reasonCode: external_exports.string().trim().min(1)
4700
+ }).strict(),
4701
+ external_exports.object({
4702
+ outcome: external_exports.literal("missing_authority"),
4703
+ reasonCode: external_exports.string().trim().min(1)
4704
+ }).strict()
4705
+ ]);
4706
+ var terminalBusinessReconciliationEnvelopeSchema = external_exports.object({
4707
+ schemaVersion: external_exports.literal(TERMINAL_BUSINESS_RECONCILIATION_VERSION),
4708
+ decisionKey: external_exports.string().regex(/^sha256:[a-f0-9]{64}$/),
4709
+ commandId: external_exports.string().uuid(),
4710
+ runId: external_exports.string().uuid(),
4711
+ executionEpoch: external_exports.number().int().positive(),
4712
+ authoritySnapshot: terminalBusinessReconciliationAuthoritySnapshotSchema,
4713
+ decision: terminalBusinessReconciliationSchema
4714
+ }).strict();
4669
4715
  var MIRRORX_RUNTIME_CONTEXT_ENVELOPE_VERSION = "mirrorx.context-envelope.v1";
4670
4716
  var mirrorxEffectiveInstructionsSchema = external_exports.object({
4671
4717
  schemaVersion: external_exports.literal("mirrorx.project-instructions.v1"),
@@ -24080,7 +24126,9 @@ function agentInstructionDeliveryAudit(bundle, delivery) {
24080
24126
  import { existsSync as existsSync8, mkdirSync as mkdirSync6, readFileSync as readFileSync10, renameSync as renameSync7, rmSync as rmSync6, writeFileSync as writeFileSync8 } from "node:fs";
24081
24127
  import { homedir as homedir2, hostname } from "node:os";
24082
24128
  import { dirname as dirname7, join as join9 } from "node:path";
24083
- var CAPABILITIES = [
24129
+
24130
+ // src/amaster-runtime-daemon/capability-registry.mjs
24131
+ var BUILD_SUPPORTED_CAPABILITIES = Object.freeze([
24084
24132
  "remote_registration",
24085
24133
  "heartbeat",
24086
24134
  "executor_discovery",
@@ -24096,8 +24144,50 @@ var CAPABILITIES = [
24096
24144
  "run_cancel",
24097
24145
  "run_terminate",
24098
24146
  "logs_cost_workspace_status",
24099
- "source_acquisition_v1"
24100
- ];
24147
+ "source_acquisition_v1",
24148
+ "headed_browser_auth"
24149
+ ]);
24150
+ var DYNAMIC_READINESS = Object.freeze({
24151
+ final_model_context_attestation_v1: {
24152
+ reasonCode: "managed_pi_executor_required",
24153
+ ready: (input) => input.runnerKind === "cloud_managed" && input.executors.some((executor) => executor.kind === "pi")
24154
+ },
24155
+ source_acquisition_v1: {
24156
+ reasonCode: "source_acquisition_not_ready",
24157
+ ready: (input) => input.sourceAcquisition?.ready === true
24158
+ },
24159
+ headed_browser_auth: {
24160
+ reasonCode: "headed_browser_runtime_not_ready",
24161
+ ready: (input) => input.browserSessionBroker?.ready === true
24162
+ }
24163
+ });
24164
+ function uniqueStrings2(values) {
24165
+ return Array.from(new Set((Array.isArray(values) ? values : []).map((value) => String(value ?? "").trim()).filter(Boolean)));
24166
+ }
24167
+ function buildRuntimeCapabilityReport(input) {
24168
+ const legacyConfiguredCapabilities = uniqueStrings2(input.legacyConfiguredCapabilities);
24169
+ const runtimeUnavailable = [];
24170
+ const advertised = BUILD_SUPPORTED_CAPABILITIES.filter((capability) => {
24171
+ const readiness = DYNAMIC_READINESS[capability];
24172
+ if (!readiness || readiness.ready(input)) return true;
24173
+ runtimeUnavailable.push({ capability, reasonCode: readiness.reasonCode });
24174
+ return false;
24175
+ });
24176
+ const buildSet = new Set(BUILD_SUPPORTED_CAPABILITIES);
24177
+ const legacySet = new Set(legacyConfiguredCapabilities);
24178
+ return {
24179
+ schemaVersion: "mirrorx.connector-capability-report/v1",
24180
+ source: "build_attested",
24181
+ buildSupported: [...BUILD_SUPPORTED_CAPABILITIES],
24182
+ runtimeUnavailable,
24183
+ advertised,
24184
+ deprecatedCapabilityOverridePresent: legacyConfiguredCapabilities.length > 0,
24185
+ legacyMissingFromBuildTruth: legacyConfiguredCapabilities.length > 0 ? BUILD_SUPPORTED_CAPABILITIES.filter((capability) => !legacySet.has(capability)) : [],
24186
+ legacyUnsupportedClaims: legacyConfiguredCapabilities.filter((capability) => !buildSet.has(capability))
24187
+ };
24188
+ }
24189
+
24190
+ // src/amaster-runtime-daemon/config-state.mjs
24101
24191
  var RUNNER_KIND_CLOUD_MANAGED = "cloud_managed";
24102
24192
  var RUNNER_KIND_DESKTOP_DELEGATED = "desktop_delegated";
24103
24193
  function readEnum(value, allowed, fallback, label) {
@@ -24279,7 +24369,8 @@ function buildConfig(env = process.env, flags = {}) {
24279
24369
  piExecutorUid,
24280
24370
  piExecutorGid,
24281
24371
  runnerKind,
24282
- capabilities: splitList(flags.capabilities ?? env.AMASTER_CAPABILITIES ?? CAPABILITIES.join(",")),
24372
+ capabilities: [...BUILD_SUPPORTED_CAPABILITIES],
24373
+ legacyConfiguredCapabilities: splitList(flags.capabilities ?? env.AMASTER_CAPABILITIES ?? ""),
24283
24374
  pollIntervalSeconds: Number(flags.pollIntervalSeconds ?? env.AMASTER_POLL_INTERVAL_SECONDS ?? 10),
24284
24375
  maxConcurrentCommands: Math.min(
24285
24376
  parsePositiveInteger(flags.maxConcurrentCommands ?? env.AMASTER_MAX_CONCURRENT_COMMANDS, 1),
@@ -28670,7 +28761,7 @@ function createSourceCompletionStopPolicy({
28670
28761
  }
28671
28762
 
28672
28763
  // src/amaster-runtime-daemon.mjs
28673
- var CONNECTOR_VERSION = "0.1.1-beta.130";
28764
+ var CONNECTOR_VERSION = "0.1.1-beta.132";
28674
28765
  var CONNECTOR_CONTRACT_VERSION = "2026-06-04.v1";
28675
28766
  var SOURCE_ACQUISITION_CAPABILITY2 = source_acquisition_compatibility_default.profileVersion;
28676
28767
  var daemonRequire = createRequire(import.meta.url);
@@ -29333,12 +29424,19 @@ function browserSessionRuntimeStatus(config) {
29333
29424
  return broker ? { ...readiness, ...broker.status() } : readiness;
29334
29425
  }
29335
29426
  function runtimeAdvertisedCapabilities(config, sourceAcquisition, browserSessionBroker) {
29336
- return config.capabilities.filter((capability) => (capability !== "headed_browser_auth" || browserSessionBroker.ready === true) && (capability !== SOURCE_ACQUISITION_CAPABILITY2 || sourceAcquisition.ready === true) && (capability !== "final_model_context_attestation_v1" || config.runnerKind === RUNNER_KIND_CLOUD_MANAGED && config.executors.some((executor) => executor.kind === "pi")));
29427
+ return buildRuntimeCapabilityReport({
29428
+ legacyConfiguredCapabilities: config.legacyConfiguredCapabilities,
29429
+ sourceAcquisition,
29430
+ browserSessionBroker,
29431
+ runnerKind: config.runnerKind,
29432
+ executors: config.executors
29433
+ });
29337
29434
  }
29338
29435
  function buildRegisterPayload(config) {
29339
29436
  const buildCommit = readString(process.env.AMASTER_RUNTIME_BUILD_COMMIT ?? process.env.AMASTER_SOURCE_COMMIT);
29340
29437
  const sourceAcquisition = sourceAcquisitionRuntimeReadiness(config);
29341
29438
  const browserSessionBroker = browserSessionRuntimeReadiness(config);
29439
+ const capabilityReport = runtimeAdvertisedCapabilities(config, sourceAcquisition, browserSessionBroker);
29342
29440
  return {
29343
29441
  ...config.companyId ? { companyId: config.companyId } : {},
29344
29442
  connectorName: config.connectorName,
@@ -29346,7 +29444,7 @@ function buildRegisterPayload(config) {
29346
29444
  workspaceBindings: config.workspaceBindings,
29347
29445
  networkDomains: config.networkDomains,
29348
29446
  executors: config.executors,
29349
- capabilities: runtimeAdvertisedCapabilities(config, sourceAcquisition, browserSessionBroker),
29447
+ capabilities: capabilityReport.advertised,
29350
29448
  contractVersion: CONNECTOR_CONTRACT_VERSION,
29351
29449
  connectorVersion: CONNECTOR_VERSION,
29352
29450
  ...buildCommit ? { buildCommit } : {},
@@ -29359,7 +29457,12 @@ function buildRegisterPayload(config) {
29359
29457
  authMode: config.token ? "bearer_token" : config.authHeader ? "custom_header" : "none",
29360
29458
  platform: process.platform,
29361
29459
  arch: process.arch,
29362
- node: process.version
29460
+ node: process.version,
29461
+ capabilityReport: {
29462
+ ...capabilityReport,
29463
+ connectorVersion: CONNECTOR_VERSION,
29464
+ ...buildCommit ? { connectorDigest: `build:${buildCommit}` } : {}
29465
+ }
29363
29466
  }
29364
29467
  };
29365
29468
  }
@@ -29393,6 +29496,7 @@ function buildHeartbeatPayload(config, options = {}) {
29393
29496
  const executorReadiness = buildExecutorReadiness(config);
29394
29497
  const sourceAcquisition = sourceAcquisitionRuntimeReadiness(config);
29395
29498
  const browserSessionBroker = browserSessionRuntimeStatus(config);
29499
+ const capabilityReport = runtimeAdvertisedCapabilities(config, sourceAcquisition, browserSessionBroker);
29396
29500
  const status = options.status === "offline" ? "offline" : "online";
29397
29501
  const daemonStatus = status === "offline" ? "stopping" : "running";
29398
29502
  return {
@@ -29400,7 +29504,7 @@ function buildHeartbeatPayload(config, options = {}) {
29400
29504
  workspaceBindings: config.workspaceBindings,
29401
29505
  networkDomains: config.networkDomains,
29402
29506
  executors: config.executors,
29403
- capabilities: runtimeAdvertisedCapabilities(config, sourceAcquisition, browserSessionBroker),
29507
+ capabilities: capabilityReport.advertised,
29404
29508
  connectorVersion: CONNECTOR_VERSION,
29405
29509
  ...buildCommit ? { buildCommit } : {},
29406
29510
  contractVersion: CONNECTOR_CONTRACT_VERSION,
@@ -29426,7 +29530,12 @@ function buildHeartbeatPayload(config, options = {}) {
29426
29530
  ...versionDrift.versionDrift || versionDrift.bundleDrift ? versionDrift : {}
29427
29531
  },
29428
29532
  metadata: {
29429
- authMode: config.token ? "bearer_token" : config.authHeader ? "custom_header" : "none"
29533
+ authMode: config.token ? "bearer_token" : config.authHeader ? "custom_header" : "none",
29534
+ capabilityReport: {
29535
+ ...capabilityReport,
29536
+ connectorVersion: CONNECTOR_VERSION,
29537
+ ...buildCommit ? { connectorDigest: `build:${buildCommit}` } : {}
29538
+ }
29430
29539
  }
29431
29540
  };
29432
29541
  }
@@ -29593,7 +29702,6 @@ AMASTER_CONNECTOR_NAME=${quoteShell(config.connectorName)}
29593
29702
  AMASTER_MACHINE_ID=${quoteShell(config.machineId)}
29594
29703
  AMASTER_WORKSPACE_ALLOWLIST=${quoteShell(config.workspaceBindings.join(","))}
29595
29704
  AMASTER_EXECUTORS=${quoteShell(executorEnv)}
29596
- AMASTER_CAPABILITIES=${quoteShell(config.capabilities.join(","))}
29597
29705
  AMASTER_NETWORK_DOMAINS=${quoteShell(config.networkDomains.join(","))}
29598
29706
  AMASTER_DAEMON_STATE_FILE=${quoteShell(join16(homedir3(), ".amaster-employee", "runtime-connector-state.json"))}
29599
29707
  EOF
@@ -34508,6 +34616,7 @@ async function executeRunCommand(config, command) {
34508
34616
  parsed.errorMessage = null;
34509
34617
  }
34510
34618
  if (succeeded && managedMcpProfile && Array.isArray(command.requiredCapabilities) && command.requiredCapabilities.includes("runtime_actions_v2")) {
34619
+ const usesLivePathClosureContract = command.requiredCapabilities.includes("run_exit_live_path_closure_v1");
34511
34620
  const productiveSuccessfulRun = outputTelemetry.meaningfulProgressEventCount > 0 || runtimeArtifacts.length > 0 || mcpToolResults.some((toolResult) => ["succeeded", "approval_required"].includes(readString(toolResult.status)));
34512
34621
  let completionState = createRunCompletionState({
34513
34622
  connectorId: requireConnectorId(config),
@@ -34540,13 +34649,13 @@ async function executeRunCommand(config, command) {
34540
34649
  }
34541
34650
  },
34542
34651
  completionRequest: {
34543
- contractVersion: config.capabilities.includes("run_exit_live_path_closure_v1") ? "amaster.runtime-connector.completion-check.v2" : "amaster.runtime-connector.completion-check.v1",
34652
+ contractVersion: usesLivePathClosureContract ? "amaster.runtime-connector.completion-check.v2" : "amaster.runtime-connector.completion-check.v1",
34544
34653
  leaseId: command.leaseId,
34545
34654
  proposedStatus: "succeeded",
34546
34655
  resultSignals: {
34547
34656
  productiveSuccessfulRun,
34548
34657
  executorTurnCount: terminalTextRepairUsageBreakdown ? 2 : 1,
34549
- ...config.capabilities.includes("run_exit_live_path_closure_v1") ? {
34658
+ ...usesLivePathClosureContract ? {
34550
34659
  closureAttempts: {
34551
34660
  workDisposition: 0,
34552
34661
  livePath: 0,
@@ -34893,7 +35002,7 @@ Commands:
34893
35002
 
34894
35003
  Key env:
34895
35004
  AMASTER_EMPLOYEE_SERVER_URL, AMASTER_CONNECTOR_TOKEN or AMASTER_CONNECTOR_AUTH_HEADER,
34896
- AMASTER_WORKSPACE_ALLOWLIST, AMASTER_EXECUTORS, AMASTER_CAPABILITIES,
35005
+ AMASTER_WORKSPACE_ALLOWLIST, AMASTER_EXECUTORS,
34897
35006
  AMASTER_NETWORK_DOMAINS, AMASTER_CONNECTOR_ID, AMASTER_DAEMON_STATE_FILE,
34898
35007
  AMASTER_MAX_CONCURRENT_COMMANDS, AMASTER_EXECUTOR_MAX_RSS_MB (default 0, disabled),
34899
35008
  AMASTER_RUNTIME_ORPHAN_REAPER_INTERVAL_SECONDS (default 300, set 0 to disable),
@@ -34903,6 +35012,11 @@ Key env:
34903
35012
  async function main() {
34904
35013
  const { command, flags } = parseArgs(process.argv.slice(2));
34905
35014
  const config = buildConfig(process.env, flags);
35015
+ if (config.legacyConfiguredCapabilities.length > 0) {
35016
+ process.stderr.write(
35017
+ "Warning: AMASTER_CAPABILITIES/--capabilities is deprecated and ignored; use the Server capability allowlist for operator restrictions.\n"
35018
+ );
35019
+ }
34906
35020
  switch (command) {
34907
35021
  case "config-template":
34908
35022
  printInstall(config);
@@ -5,26 +5,9 @@ import { randomUUID } from "node:crypto";
5
5
  import { basename, dirname, join, resolve } from "node:path";
6
6
  import { homedir, hostname } from "node:os";
7
7
  import { fileURLToPath } from "node:url";
8
+ import { BUILD_SUPPORTED_CAPABILITIES } from "./amaster-runtime-daemon/capability-registry.mjs";
8
9
 
9
- const CONNECTOR_VERSION = "0.1.1-beta.130";
10
-
11
- const CAPABILITIES = [
12
- "remote_registration",
13
- "heartbeat",
14
- "executor_discovery",
15
- "workspace_binding",
16
- "run_wakeup",
17
- "context_envelope_v1", "managed_project_instructions_v1",
18
- "final_model_context_attestation_v1",
19
- "runtime_actions_v2",
20
- "run_exit_live_path_closure_v1",
21
- "model_call",
22
- "model_call_output_contract_v1",
23
- "run_cancel",
24
- "run_terminate",
25
- "logs_cost_workspace_status",
26
- "source_acquisition_v1",
27
- ];
10
+ const CONNECTOR_VERSION = "0.1.1-beta.132";
28
11
 
29
12
  const CONFIG_KEY_MAP = new Map([
30
13
  ["server_url", "AMASTER_EMPLOYEE_SERVER_URL"],
@@ -257,7 +240,6 @@ function withDefaults(config) {
257
240
  AMASTER_CONNECTOR_NAME: `${hostname()}-amaster`,
258
241
  AMASTER_MACHINE_ID: defaultMachineId(),
259
242
  AMASTER_WORKSPACE_ALLOWLIST: runtimeWorkspacesRoot,
260
- AMASTER_CAPABILITIES: CAPABILITIES.join(","),
261
243
  AMASTER_NETWORK_DOMAINS: "self-host",
262
244
  AMASTER_DAEMON_STATE_FILE: join(configDir, "runtime-connector-state.json"),
263
245
  AMASTER_RUNTIME_WORKSPACES_ROOT: runtimeWorkspacesRoot,
@@ -463,7 +445,8 @@ function printConfig(config) {
463
445
  ["runner_kind", merged.AMASTER_RUNTIME_RUNNER_KIND || "cloud_managed"],
464
446
  ["heartbeat_log_mode", merged.AMASTER_HEARTBEAT_LOG_MODE || "(compact)"],
465
447
  ["network_domains", merged.AMASTER_NETWORK_DOMAINS],
466
- ["capabilities", merged.AMASTER_CAPABILITIES],
448
+ ["capability_source", `connector build (${BUILD_SUPPORTED_CAPABILITIES.length}) + runtime readiness`],
449
+ ["legacy_capabilities", merged.AMASTER_CAPABILITIES ? "(deprecated; ignored)" : "(none)"],
467
450
  ["state_file", merged.AMASTER_DAEMON_STATE_FILE],
468
451
  ["env_file", envFile],
469
452
  ];
@@ -498,7 +481,12 @@ function commandSetup(argv) {
498
481
  config.AMASTER_MACHINE_ID = flags.machine_id || defaultConfig.AMASTER_MACHINE_ID;
499
482
  config.AMASTER_RUNTIME_WORKSPACES_ROOT = flags.runtime_workspaces_root || defaultConfig.AMASTER_RUNTIME_WORKSPACES_ROOT;
500
483
  config.AMASTER_WORKSPACE_ALLOWLIST = flags.workspace_allowlist || flags.workspace || defaultConfig.AMASTER_WORKSPACE_ALLOWLIST;
501
- config.AMASTER_CAPABILITIES = flags.capabilities || defaultConfig.AMASTER_CAPABILITIES;
484
+ if (flags.capabilities) {
485
+ config.AMASTER_CAPABILITIES = flags.capabilities;
486
+ process.stderr.write(
487
+ "Warning: --capabilities is deprecated and ignored; restrict accepted capabilities with the Server allowlist.\n",
488
+ );
489
+ }
502
490
  config.AMASTER_NETWORK_DOMAINS = flags.network_domains || defaultConfig.AMASTER_NETWORK_DOMAINS;
503
491
  config.AMASTER_DAEMON_STATE_FILE = flags.state_file || defaultConfig.AMASTER_DAEMON_STATE_FILE;
504
492
  if (flags.executors) config.AMASTER_EXECUTORS = flags.executors;
@@ -528,6 +516,11 @@ function commandConfig(argv) {
528
516
  const envKey = envKeyFor(key);
529
517
  const value = valueParts.join(" ").trim();
530
518
  config[envKey] = envKey === "AMASTER_EMPLOYEE_SERVER_URL" ? normalizeServerUrl(value) : value;
519
+ if (envKey === "AMASTER_CAPABILITIES") {
520
+ process.stderr.write(
521
+ "Warning: connector-local capabilities are deprecated and ignored; restrict accepted capabilities with the Server allowlist.\n",
522
+ );
523
+ }
531
524
  writeConfig(config);
532
525
  process.stdout.write(`${normalizeKey(key)} updated\n`);
533
526
  }
@@ -3,78 +3,78 @@
3
3
  "files": [
4
4
  {
5
5
  "name": "企业战略规划模板V0.1 副本.md",
6
- "bytes": 18105,
7
- "sha256": "8ac447cd94a16d6b400b9e0e0129abe7b96f68598a74c838ce13caaa2899b5e4"
6
+ "bytes": 19657,
7
+ "sha256": "fe288555abb00c3b0cf9410d3f34deec082655afbfe8d915e9ebe7246c1ff504"
8
8
  },
9
9
  {
10
10
  "name": "低空经济行业战略规划模板.md",
11
- "bytes": 22446,
12
- "sha256": "34d92fa06125ec8b89a0f2d822dd5ee46b973b5af3f975ca4fb85f8bfa29cf72"
11
+ "bytes": 23980,
12
+ "sha256": "27ed70d7cd7dd5a4b131e5e2c2aec089df38b13076942fe0d6ea2a684feb1344"
13
13
  },
14
14
  {
15
15
  "name": "元宇宙与数字内容行业战略规划模板.md",
16
- "bytes": 17933,
17
- "sha256": "972ebdf0905bf39d25d5fdea83710697f12e0420bb290b860959e0d24bed72c6"
16
+ "bytes": 19417,
17
+ "sha256": "658634f7f422a965812690ae2d11343be92a5f4cbac38632261452a14a4fd260"
18
18
  },
19
19
  {
20
20
  "name": "农业与食品深加工行业战略规划模板.md",
21
- "bytes": 22443,
22
- "sha256": "eabb6ce6547eeea4a8ebb731b5b75d4b446ad29426ce606a41587f7ad2e2cefd"
21
+ "bytes": 23970,
22
+ "sha256": "1f03400e4380e7b1d98b40bdeec59fae73af59bc4500b9488341708692035dad"
23
23
  },
24
24
  {
25
25
  "name": "医疗健康与生命科学行业战略规划模板.md",
26
- "bytes": 22289,
27
- "sha256": "4cb22a46407f99800f0c5a90fcc5706b9d08f747f9f7647b793a372dcdfcf538"
26
+ "bytes": 23822,
27
+ "sha256": "a239128a4dd217c5d8cd01102a202dd2039835b74b2a2ef730a912b6adfbdd5c"
28
28
  },
29
29
  {
30
30
  "name": "合成生物学行业战略规划模板.md",
31
- "bytes": 17722,
32
- "sha256": "ba1a6a4569917ab6df512fe48d0605f3931840c08a3323dd75ce28806092cd64"
31
+ "bytes": 19206,
32
+ "sha256": "2c06b7a7d61e6591e9fb90be2e5444422c5d0f460a42f600de4250b3239b79cd"
33
33
  },
34
34
  {
35
35
  "name": "商业航天行业战略规划模板.md",
36
- "bytes": 25210,
37
- "sha256": "ed5003a2dcce45a67fc54a5d5a1fbc5c0bea3ac7ff440e40264f0b2db1095e1f"
36
+ "bytes": 26694,
37
+ "sha256": "8d6289c464d7f83473a62117f620332780e41114a2ae62ac6474dc5ccb45db2b"
38
38
  },
39
39
  {
40
40
  "name": "建筑与房地产行业战略规划模板.md",
41
- "bytes": 22161,
42
- "sha256": "0aaa7922dfb5bcbe7e5b8392ae59e668c425b26e2bb04305f23eb13eab4d79fb"
41
+ "bytes": 23677,
42
+ "sha256": "faa9e80c0a3f5e20b5fa33f4c5b2d8196d34528074b3ef2b35631dc697cfd96c"
43
43
  },
44
44
  {
45
45
  "name": "文旅与文体教育行业战略规划模板.md",
46
- "bytes": 22150,
47
- "sha256": "28e00150570562ff90205e4617009c4f23c268d4da821708d0c5fbdce521d59b"
46
+ "bytes": 23681,
47
+ "sha256": "15332066fb2f48bc521a0a244dc8a541c5888f9475c4d2877c94627ddd454a1b"
48
48
  },
49
49
  {
50
50
  "name": "消费与零售行业战略规划模板.md",
51
- "bytes": 20733,
52
- "sha256": "f8371d140448851f39959481e9e5eb666963921ef270d3f238a7d4630980495e"
51
+ "bytes": 22282,
52
+ "sha256": "cc47581d7cc76c6ed6afbe9b5c45df2a2e2d4d13b98857f0dd902217ca7c9ad1"
53
53
  },
54
54
  {
55
55
  "name": "物流与供应链行业战略规划模板.md",
56
- "bytes": 22115,
57
- "sha256": "772cdbaf93318e7f0c42a97c3ba47d6f0810e49b085a19d24bb6ac27f65348c3"
56
+ "bytes": 23624,
57
+ "sha256": "1497043d2c8204c13c26e55149fdd6fe6fe94832e9f0e4706baa8aec81137326"
58
58
  },
59
59
  {
60
60
  "name": "科技与互联网行业战略规划模板.md",
61
- "bytes": 18118,
62
- "sha256": "b26d36e45360017a266ecb81bf50726b1c17ac00797adbc99305dafb799759d8"
61
+ "bytes": 19709,
62
+ "sha256": "0d2ef39367e5a4e95c908ca38447db3cb1747374b6a3175719d5d9a1b816b48f"
63
63
  },
64
64
  {
65
65
  "name": "能源与环保行业战略规划模板.md",
66
- "bytes": 21641,
67
- "sha256": "77b9182c3dbc0d33e2e21dee9ca6e053281b225c116bf144fa2b1964d6725c1b"
66
+ "bytes": 23184,
67
+ "sha256": "cf5bbaf542f42fc5c2ee387413fa9068d5f2be6cdc330718b0760be9bac911d9"
68
68
  },
69
69
  {
70
70
  "name": "金融与专业服务行业战略规划模板.md",
71
- "bytes": 20963,
72
- "sha256": "46c7b7e7b82145384d9a4051299b6c4c146bf84763864a39783a193bfdc51e6c"
71
+ "bytes": 22528,
72
+ "sha256": "7f2f90f5de809bcf8743a848b06c77edec28365dd315488776273478ca72662b"
73
73
  },
74
74
  {
75
75
  "name": "高端与先进制造业战略规划模板.md",
76
- "bytes": 20629,
77
- "sha256": "52cd770ac15fae04a4653b53f5e85b3f46aff6fb635f58682e297e67d6c32047"
76
+ "bytes": 22181,
77
+ "sha256": "7adc0b8ebb90cb65b2ac6a5188928b50fb4f51c8f5d776e7250910567e548aeb"
78
78
  }
79
79
  ]
80
80
  }
@@ -11,19 +11,19 @@
11
11
  - **核心特点**:业务与合规深度融合,而非 “两张皮”;所有举措均可拆解为可执行、可考核、可复盘的具体任务;覆盖从战略顶层设计到落地管控的全流程。
12
12
 
13
13
  <mirrorx_template_guidance>
14
- <completion>章节齐全只代表结构对齐;完成稿必须形成可供管理层判断、取舍和执行的实质内容。通用判断、模板复述、只有表格字段而缺少公司证据的内容,不计为实质完成;仅当所有保留章节均达到本元素的相应验收标准,才算完成。</completion>
14
+ <completion>章节齐全只代表结构对齐;完成稿必须形成可供管理层判断、取舍和执行的实质内容。通用判断、模板复述、只有表格字段而缺少公司证据的内容,不计为实质完成;仅当所有保留章节均达到本元素的相应验收标准,才算完成。按公司规模、业务阶段、监管强度和本次决策裁剪,资本运作、系统建设、组织扩张和专项合规仅在存在实质需求时展开。</completion>
15
15
  <continuation>若一次写入无法完成全文,继续在同一文件从下一未完成章节写到全部完成;不得上传中间稿,也不得让后半部分退化为提纲、通用填表或“待建立”事项。</continuation>
16
- <analysis>每个核心判断形成“事实与来源 → 分析 → 战略含义 → 决策”闭环;分析章节不得只罗列事实或套用框架,必须明确本章支持的决策。任务数、运行次数和人员数量只能证明内部运行状态,不得直接证明市场需求、商业能力或竞争优势。事实注明来源、口径与时间,缺少可验证证据时转入数据缺口。</analysis>
17
- <strategy_choice>说明所选方向、备选方案、选择依据、关键取舍和明确不做事项,并指出选择成立所依赖的假设;备选方案使用一致维度比较预期收益、成本、资源占用、周期、依赖、风险和退出条件。</strategy_choice>
18
- <targets>每个核心指标包含指标定义、当前基线、目标值、目标期限、责任主体和数据来源;收入、增长、客户和预算等重大目标写明计算公式与关键假设,并用基准或保守情景校验,不得只凭行业规模或经验客单价反推。基线未知时定义盘点动作与审定节点。</targets>
19
- <initiatives>每项重大举措包含核心目标、基线或现状差距、动作包、责任主体、资源与依赖、里程碑、KPI、验收标准、风险与应对;动作包写清连续执行步骤与实际产出,前一动作的产出作为下一动作的输入,并写明继续、调整或停止的触发条件。</initiatives>
20
- <implementation_and_risk>重大项目写明前置依赖、资源投入、阶段 Gate 和失败处置;预算与资源配置写明可用总量、优先级和资源不足时的取舍。重大风险使用可观察的触发阈值,并写明预防动作、应急动作和责任主体;复盘机制写明输入数据、决策人、可作出的调整和复盘频率。</implementation_and_risk>
16
+ <analysis>每个核心判断形成“事实与来源 → 分析 → 战略含义 → 决策”闭环;分析框架只展开有可靠输入且会改变战略判断的部分,每个框架必须产出其支持的决策、取舍或资源调整,否则压缩为简要判断。任务数、运行次数和人员数量只能证明内部运行状态,不得直接证明市场需求、商业能力或竞争优势。事实注明来源、口径与时间,缺少可验证证据时转入数据缺口。</analysis>
17
+ <strategy_choice>说明所选方向、备选方案、选择依据、关键取舍和明确不做事项,并指出选择成立所依赖的假设;备选方案使用一致维度比较预期收益、成本、资源占用、周期、依赖、风险和退出条件。对承担增长或现金贡献的核心业务,写明目标客户与需求、产品或服务、定价依据、获客路径、单位交付成本或产能、毛利或现金贡献、回款周期和验证证据;缺失项转入数据缺口。</strategy_choice>
18
+ <targets>战略目标和重大举措使用“衡量指标与成功标准”:按事项选用经营结果、关键结果、里程碑、质量阈值或阶段 Gate;每个可量化指标包含定义、当前基线、目标值或验收阈值、期限和数据来源。收入、增长、客户和预算等重大目标写明计算公式与关键假设,并用基准或保守情景校验,不得只凭行业规模或经验客单价反推。足以改变某项目标、预算或扩张结论的收入、客户、定价、交付产能、成本或现金流基线未知时,该决策单元使用条件化表达,并写明数据闭环任务与下一阶段验证方案;其余章节仍按模板完整编制,基线审定后再固化受影响的目标、预算或扩张承诺。需要汇总时使用“战略衡量体系”,按核心结果、业务结果、领先指标和风险护栏组织。</targets>
19
+ <initiatives>每项重大举措围绕实际事项与业务需求,包含核心目标、基线或现状差距、关键任务、所需输入、实际产出、资源与依赖、里程碑、衡量指标与成功标准、风险与应对;关键任务写清连续执行步骤,前一任务的产出作为下一任务的输入,并写明继续、调整或停止的触发条件。分别表述实际产出、阶段验收和最终业务结果;报告、台账、模板或系统上线属于实际产出,阶段验收可使用里程碑、质量阈值或 Gate,最终业务结果使用可观察的经营变化或风险降低。</initiatives>
20
+ <implementation_and_risk>重大项目写明前置依赖、资源投入、阶段 Gate 和失败处置;优先级清单按可投入资源与实际执行能力排序,并写明并行上限、关键路径、暂不启动事项和资源不足时的取舍。重大风险使用可观察的触发阈值,并写明预防动作和应急动作;复盘机制写明输入数据、可作出的调整和复盘频率。</implementation_and_risk>
21
21
  <length>执行摘要约 600–900 个中文字符且不超过一页;其他章节以完成决策单元为准,不用固定字数填充篇幅。</length>
22
- <data_gaps>关键事实无法从范围内来源获得时,增加“关键数据缺口闭环表”,字段包括缺口、影响的判断或决策、补齐动作、责任主体和审定节点。</data_gaps>
22
+ <data_gaps>关键事实无法从范围内来源获得时,增加“关键数据缺口闭环表”,字段包括缺口、影响的判断或决策、所需数据或输入、补齐动作和审定节点。</data_gaps>
23
23
  <report_metadata>交付稿在标题下依次给出报告日期、研究对象、研究范围、数据截止日期、规划周期和版本六个紧凑字段,然后直接进入执行摘要;作者或编制方仅在任务明确提供时增加。</report_metadata>
24
- <evidence_presentation>正文事实使用来源、日期、口径、引用和措辞强度表达证据边界;无法可靠支持且影响决策的内容转入关键数据缺口或省略。交付稿遵循共享 Clean deliverables 契约。</evidence_presentation>
24
+ <evidence_presentation>正文事实使用来源、日期、口径、引用和措辞强度表达证据边界;引用通过脚注或“主要来源 / 参考资料”呈现。无法可靠支持且影响决策的内容转入关键数据缺口或省略。交付稿遵循共享 Clean deliverables 契约。</evidence_presentation>
25
25
  <document_status>足以改变战略选择的关键输入尚未闭环时,文档标记为“战略初稿 / 待决策版”,不得标记为“正式版”或“决策就绪”;大纲完整、系统运行正常或任务执行成功,均不能替代关键商业输入闭环。</document_status>
26
- <delivery_cleanup>逐章确认所有保留章节均已完成,附件只列实际随稿交付的内容;应用本元素的全部验收标准后,删除整个 mirrorx_template_guidance 元素,再执行最终校验与上传;交付物不得保留本元素。</delivery_cleanup>
26
+ <delivery_cleanup>逐章确认所有保留章节均已完成;应用本元素的全部验收标准后,删除整个 mirrorx_template_guidance 元素,再执行最终校验与上传;交付物不得保留本元素。</delivery_cleanup>
27
27
  </mirrorx_template_guidance>
28
28
 
29
29
  ---
@@ -51,7 +51,7 @@
51
51
 
52
52
  3. **总体目标**:【期末核心经营指标:营收、净利润、市场份额、合规零重大事故、资本节点等】
53
53
 
54
- 4. **关键战略路径**:【3\-5 条贯穿周期的核心战略举措】
54
+ 4. **核心战略路径**:【支撑核心选择并进入资源配置与执行计划的最小必要路径集】
55
55
 
56
56
  5. **核心资源需求**:【资金、核心人才、关键资质、技术投入、合规建设投入等概览】
57
57
 
@@ -217,7 +217,7 @@
217
217
 
218
218
  ### 6\.3 核心战略主题
219
219
 
220
- 提炼 3\-5 个贯穿规划周期的核心战略主题,作为所有工作的总纲。 示例:
220
+ 提炼能够贯穿规划周期并进入资源配置的最小必要战略主题集;以下仅为可选示例:
221
221
 
222
222
  1. 【产品创新与技术引领】
223
223
 
@@ -233,7 +233,7 @@
233
233
 
234
234
  ## 七、核心战略举措
235
235
 
236
- > 每项举措均需明确:**核心目标、关键动作、责任主体、时间节点、衡量标准**,确保可落地、可考核。
236
+ > 每项举措围绕实际事项与业务需求,明确:**核心目标、现状差距、关键任务、所需输入与依赖、实际产出、时间节点、衡量指标与成功标准、调整 / 停止条件**。
237
237
  >
238
238
  >
239
239
 
@@ -267,7 +267,7 @@
267
267
 
268
268
  - 精益运营与降本增效:核心流程优化、人均效能提升目标
269
269
 
270
- ### 7\.4 组织与人才战略
270
+ ### 7\.4 组织能力与资源配置战略
271
271
 
272
272
  - 组织架构优化方向:适配战略的组织形态调整、权责划分
273
273
 
@@ -329,7 +329,7 @@
329
329
 
330
330
  表格
331
331
 
332
- ### 8\.2 重大战略项目清单(Top 10)
332
+ ### 8\.2 重大战略项目优先级清单
333
333
 
334
334
  筛选支撑战略落地的核心项目,作为资源倾斜与重点管控对象。
335
335
 
@@ -357,7 +357,7 @@
357
357
 
358
358
  表格
359
359
 
360
- ### 9\.3 核心人力资源配置计划
360
+ ### 9\.3 关键能力与资源配置计划
361
361
 
362
362
  表格
363
363
 
@@ -395,7 +395,7 @@
395
395
 
396
396
  ### 11\.2 考核与激励机制
397
397
 
398
- - 战略目标逐层分解:公司目标→部门目标→个人目标,与 KPI/OKR 全面挂钩
398
+ - 战略目标拆解为可执行事项与阶段结果,并与衡量指标、成功标准和复盘节点关联
399
399
 
400
400
  - 合规指标一票否决:发生重大合规事故,取消对应部门与负责人年度评优资格
401
401