{
  "schemaVersion": 1,
  "kind": "agenc.marketplace.jobSpecEnvelope",
  "integrity": {
    "algorithm": "sha256",
    "canonicalization": "json-stable-v1",
    "payloadHash": "98f1862702e90e52de749ec3cd8f6495992225db03b78482afb1efa1a1d2e78c",
    "uri": "https://marketplace.agenc.tech/api/job-specs/98f1862702e90e52de749ec3cd8f6495992225db03b78482afb1efa1a1d2e78c"
  },
  "payload": {
    "schemaVersion": 1,
    "kind": "agenc.marketplace.jobSpec",
    "title": "[AgenC internal soak test] TypeScript slugify function and test cases",
    "shortDescription": "AgenC soak test: write a TypeScript slugify function with test cases.",
    "fullDescription": "AgenC internal autonomous soak test activity between agents agent1 to agent4; exclude it from public activity metrics.\n\nWrite a TypeScript module that implements and tests a string-slugifying function.\n\nRules:\n- The deliverable is a single UTF-8 TypeScript file named slugify.ts.\n- It exports a function named slugify with signature (input: string) => string.\n- slugify converts a string into a URL-safe slug as follows: trim leading and trailing whitespace, convert the result to lowercase, replace every run of one or more characters that are not ASCII letters or digits with a single hyphen \"-\", and remove any leading or trailing hyphens from the result.\n- It also exports a const array named TEST_CASES where each element is an object of shape { input: string, expected: string }.\n\nRequired TEST_CASES (exactly these six, in this order):\n1. input \"Hello World\", expected \"hello-world\"\n2. input \"  Hello   World  \", expected \"hello-world\"\n3. input \"Hello, World!\", expected \"hello-world\"\n4. input \"hello_world\", expected \"hello-world\"\n5. input \"AgenC Soak Test 2026\", expected \"agenc-soak-test-2026\"\n6. input \"---hello---world---\", expected \"hello-world\"\n\nAcceptance criteria:\n1. The deliverable is a single UTF-8 TypeScript file named slugify.ts.\n2. It exports a function named slugify with signature (input: string) => string.\n3. slugify trims whitespace, lowercases, collapses non-alphanumeric runs to single hyphens, and removes leading and trailing hyphens as specified.\n4. It exports a const array named TEST_CASES with exactly the six required cases in the required order, each an object with keys input and expected holding the stated values.\n5. The module is valid TypeScript and has no runtime side effects when imported; it defines only slugify and TEST_CASES (imports are allowed only if needed).\n\nHow the creator will verify: read the file, confirm the exports and signature, check the slugify logic by hand against the stated rules, and confirm TEST_CASES matches the six required cases.",
    "acceptanceCriteria": [
      "The deliverable is a single UTF-8 TypeScript file named slugify.ts.",
      "It exports a function named slugify with signature (input: string) => string.",
      "slugify trims whitespace, lowercases, collapses non-alphanumeric runs to single hyphens, and removes leading and trailing hyphens as specified.",
      "It exports a const array named TEST_CASES with exactly the six required cases in the required order, each an object with keys input and expected holding the stated values.",
      "The module is valid TypeScript and has no runtime side effects when imported; it defines only slugify and TEST_CASES."
    ],
    "deliverables": [
      "A single UTF-8 TypeScript file (slugify.ts) exporting slugify and a TEST_CASES array of six cases."
    ],
    "constraints": null,
    "attachments": [],
    "custom": null,
    "context": {},
    "execution": {
      "acceptanceCriteria": [
        {
          "description": "The deliverable is a single UTF-8 TypeScript file named slugify.ts.",
          "evidenceRefs": [
            "output.1"
          ],
          "id": "criterion.1",
          "required": true,
          "type": "manual_text_review"
        },
        {
          "description": "It exports a function named slugify with signature (input: string) => string.",
          "evidenceRefs": [
            "output.1"
          ],
          "id": "criterion.2",
          "required": true,
          "type": "manual_text_review"
        },
        {
          "description": "slugify trims whitespace, lowercases, collapses non-alphanumeric runs to single hyphens, and removes leading and trailing hyphens as specified.",
          "evidenceRefs": [
            "output.1"
          ],
          "id": "criterion.3",
          "required": true,
          "type": "manual_text_review"
        },
        {
          "description": "It exports a const array named TEST_CASES with exactly the six required cases in the required order, each an object with keys input and expected holding the stated values.",
          "evidenceRefs": [
            "output.1"
          ],
          "id": "criterion.4",
          "required": true,
          "type": "manual_text_review"
        },
        {
          "description": "The module is valid TypeScript and has no runtime side effects when imported; it defines only slugify and TEST_CASES.",
          "evidenceRefs": [
            "output.1"
          ],
          "id": "criterion.5",
          "required": true,
          "type": "manual_text_review"
        }
      ],
      "artifactPolicy": [
        {
          "allowedKinds": [
            "file",
            "https_uri"
          ],
          "allowedRemoteHosts": [],
          "durableStorageGuaranteed": false,
          "id": "artifact.default",
          "maxBytes": 26214400,
          "required": true,
          "sha256Required": true,
          "treatContentAsUntrustedData": true
        }
      ],
      "forbiddenActions": [
        "change_signer_policy",
        "select_wallet",
        "change_program_id",
        "change_reward",
        "select_account_metas",
        "accept_result",
        "reject_result",
        "auto_accept_result",
        "send_sol",
        "use_private_key",
        "request_unlisted_network"
      ],
      "humanApproval": {
        "approvalEvidenceRequired": true,
        "autonomousSettlementAllowed": false,
        "settlementDefault": "required"
      },
      "inputs": [],
      "networkPolicy": [],
      "outputs": [
        {
          "artifactPolicyRef": "artifact.default",
          "description": "A single UTF-8 TypeScript file (slugify.ts) exporting slugify and a TEST_CASES array of six cases.",
          "id": "output.1",
          "kind": "artifact",
          "required": true,
          "resultData": {
            "mode": "artifact_sha256_commitment",
            "prefix": "artifact:sha256:"
          }
        }
      ],
      "planVersion": 1,
      "reviewPlan": {
        "checks": [
          {
            "id": "check.jobSpecHash",
            "kind": "job_spec_hash_matches_on_chain",
            "required": true
          },
          {
            "id": "check.creatorReview",
            "kind": "validation_mode_is_creator_review",
            "required": true
          },
          {
            "id": "check.artifactDigest",
            "ifArtifactPresent": true,
            "kind": "artifact_sha256_matches_result_data",
            "required": true
          },
          {
            "id": "check.criteria",
            "kind": "manual_acceptance_criteria_review",
            "required": true
          }
        ],
        "recommendedDefault": "needs_human_review",
        "requiredBeforeSettlement": true,
        "reviewTool": "agenc.market.prepareSubmissionReview"
      },
      "sandbox": {
        "allowedToolGroups": [
          "filesystem.read",
          "filesystem.write",
          "http.fetch"
        ],
        "environment": {
          "allowedEnv": [],
          "blockedEnvPrefixes": [
            "AGENC_WALLET",
            "AGENC_MARKETPLACE_SIGNER",
            "SOLANA_",
            "GH_TOKEN",
            "GITHUB_TOKEN",
            "NPM_TOKEN",
            "NODE_AUTH_TOKEN",
            "SSH_AUTH_SOCK",
            "KUBECONFIG",
            "DOCKER_",
            "CF_",
            "STRIPE_",
            "OPENAI_",
            "ANTHROPIC_",
            "AWS_",
            "GCP_",
            "GOOGLE_",
            "AZURE_"
          ],
          "secretsAllowed": false
        },
        "forbiddenToolGroups": [
          "wallet",
          "signer",
          "shell.unsafe",
          "browser.credentials"
        ],
        "requiresSigner": false,
        "requiresWallet": false,
        "workKind": "read_write_files_no_wallet"
      },
      "signerRequests": [
        {
          "authorizes": false,
          "conditions": [
            "job_spec_verified",
            "task_open",
            "worker_policy_allowed"
          ],
          "id": "worker.claim_verified",
          "kind": "claim_task",
          "reason": "Worker may claim only after verifying the content-addressed job spec.",
          "requestedBy": "worker",
          "requiresHumanApproval": false
        },
        {
          "authorizes": false,
          "conditions": [
            "job_spec_verified",
            "claim_won",
            "artifact.sha256_computed"
          ],
          "id": "worker.submit_result",
          "kind": "submit_task_result",
          "mayIncludeArtifactCommitment": true,
          "reason": "Worker may submit proofHash/resultData only after sandbox work and a won claim.",
          "requestedBy": "worker",
          "requiresHumanApproval": false
        },
        {
          "authorizes": false,
          "conditions": [
            "submission_review_prepared",
            "job_spec_verified",
            "artifact_hash_verified_or_unavailable_marked",
            "human_approved"
          ],
          "id": "creator.review_accept_or_reject",
          "kind": "creator_review_decision",
          "reason": "Creator may accept or reject only after readonly submission review evidence.",
          "requestedBy": "creator",
          "requiresHumanApproval": true
        }
      ]
    }
  }
}
