[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XG6ADMB0PYPS6QYPFV1ZA8":3,"skill-same:01M6XG6ADMB0PYPS6QYPFV1ZA8":75},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6XG6ADMB0PYPS6QYPFV1ZA8","guidewire-core-workflow-a",null,"Execute Guidewire primary workflow: Policy lifecycle management in PolicyCenter.\nUse when implementing quoting, binding, issuing, endorsing, or renewing policies.\nTrigger with phrases like \"policycenter workflow\", \"create policy\",\n\"bind submission\", \"issue policy\", \"policy endorsement\", \"quote insurance\".","FDU-INS\u002FInsurance-Skills","FDU-INS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F167067594?v=4","01M6XEYMRS4CVJMZ834YWE66BV","FDU-Insurance","01M6XEYMXPDA34HFM0ZE6AY78G",82,"MIT","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fguidewire-core-workflow-a\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"workflow","core","guidewire core workflow a","insurance","policy","when","submission","implementing","create policy","with","trigger","io","bind","quote","use","read","curl","Bash","lifecycle","create","2026-11-10 10:12:30",false,"---\nname: guidewire-core-workflow-a\ndescription: |\n  Execute Guidewire primary workflow: Policy lifecycle management in PolicyCenter.\n  Use when implementing quoting, binding, issuing, endorsing, or renewing policies.\n  Trigger with phrases like \"policycenter workflow\", \"create policy\",\n  \"bind submission\", \"issue policy\", \"policy endorsement\", \"quote insurance\".\nallowed-tools: Read, Write, Edit, Bash(curl:*), Bash(npm:*), Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\n---\n\n# Guidewire Core Workflow A: Policy Lifecycle\n\n## Overview\n\nMaster the complete policy lifecycle in PolicyCenter: submission creation, quoting, binding, issuance, endorsements, and renewals.\n\n## Prerequisites\n\n- Completed `guidewire-install-auth` and `guidewire-sdk-patterns`\n- Understanding of P&C insurance concepts\n- Valid API credentials with policy admin permissions\n\n## Policy Lifecycle States\n\n```\nSubmission → Quote → Bind → Issue → In-Force → Endorsement\u002FRenewal\u002FCancellation\n    |           |       |      |          |\n    v           v       v      v          v\n [Draft]    [Quoted] [Bound] [Issued] [Active Policy]\n```\n\n## Instructions\n\n### Step 1: Create Account\n\n```typescript\n\u002F\u002F Create an account before policy submission\ninterface CreateAccountRequest {\n  data: {\n    attributes: {\n      accountHolder: {\n        contactSubtype: 'Person';\n        firstName: string;\n        lastName: string;\n        dateOfBirth: string;\n        primaryAddress: {\n          addressLine1: string;\n          city: string;\n          state: { code: string };\n          postalCode: string;\n          country: { code: string };\n        };\n      };\n      producerCodes: Array\u003C{ id: string }>;\n    };\n  };\n}\n\nasync function createAccount(holder: AccountHolderData): Promise\u003CAccount> {\n  const request: CreateAccountRequest = {\n    data: {\n      attributes: {\n        accountHolder: {\n          contactSubtype: 'Person',\n          firstName: holder.firstName,\n          lastName: holder.lastName,\n          dateOfBirth: holder.dateOfBirth,\n          primaryAddress: {\n            addressLine1: holder.address,\n            city: holder.city,\n            state: { code: holder.state },\n            postalCode: holder.zip,\n            country: { code: 'US' }\n          }\n        },\n        producerCodes: [{ id: holder.producerCodeId }]\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: Account }>(\n    'POST',\n    '\u002Faccount\u002Fv1\u002Faccounts',\n    request\n  );\n\n  return response.data;\n}\n```\n\n### Step 2: Create Submission\n\n```typescript\n\u002F\u002F Create a new policy submission\ninterface CreateSubmissionRequest {\n  data: {\n    attributes: {\n      account: { id: string };\n      baseState: { code: string };\n      effectiveDate: string;\n      product: { code: string };\n      producerCode: { id: string };\n      jobType: { code: 'Submission' };\n    };\n  };\n}\n\nasync function createSubmission(\n  accountId: string,\n  effectiveDate: string,\n  productCode: string = 'PersonalAuto'\n): Promise\u003CSubmission> {\n  const request: CreateSubmissionRequest = {\n    data: {\n      attributes: {\n        account: { id: accountId },\n        baseState: { code: 'CA' },\n        effectiveDate: effectiveDate,\n        product: { code: productCode },\n        producerCode: { id: 'pc:DefaultProducerCode' },\n        jobType: { code: 'Submission' }\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    '\u002Fjob\u002Fv1\u002Fsubmissions',\n    request\n  );\n\n  console.log(`Created submission: ${response.data.jobNumber}`);\n  return response.data;\n}\n```\n\n### Step 3: Add Policy Lines and Coverages\n\n```typescript\n\u002F\u002F Add Personal Auto line with vehicles and coverages\ninterface VehicleData {\n  vin: string;\n  year: number;\n  make: string;\n  model: string;\n  costNew: number;\n}\n\nasync function addVehicleWithCoverages(\n  submissionId: string,\n  policyPeriodId: string,\n  vehicle: VehicleData\n): Promise\u003Cvoid> {\n  \u002F\u002F Add vehicle\n  const vehicleRequest = {\n    data: {\n      attributes: {\n        vin: vehicle.vin,\n        year: vehicle.year,\n        make: vehicle.make,\n        model: vehicle.model,\n        costNew: { amount: vehicle.costNew, currency: 'usd' },\n        vehicleType: { code: 'PP' } \u002F\u002F Private Passenger\n      }\n    }\n  };\n\n  const vehicleResponse = await client.request(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fvehicles`,\n    vehicleRequest\n  );\n\n  const vehicleId = vehicleResponse.data.id;\n\n  \u002F\u002F Add coverages to vehicle\n  const coverages = [\n    { code: 'PALiabilityCov', limits: { BI: '100000\u002F300000', PD: '50000' } },\n    { code: 'PACollisionCov', deductible: 500 },\n    { code: 'PAComprehensiveCov', deductible: 250 },\n    { code: 'PAMedPayCov', limit: 5000 }\n  ];\n\n  for (const coverage of coverages) {\n    await client.request(\n      'POST',\n      `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fvehicles\u002F${vehicleId}\u002Fcoverages`,\n      {\n        data: {\n          attributes: {\n            patternCode: coverage.code,\n            \u002F\u002F Coverage-specific terms would be set here\n          }\n        }\n      }\n    );\n  }\n}\n```\n\n### Step 4: Add Drivers\n\n```typescript\n\u002F\u002F Add drivers to policy\ninterface DriverData {\n  firstName: string;\n  lastName: string;\n  dateOfBirth: string;\n  licenseNumber: string;\n  licenseState: string;\n}\n\nasync function addDriver(\n  submissionId: string,\n  policyPeriodId: string,\n  driver: DriverData\n): Promise\u003CPolicyDriver> {\n  const request = {\n    data: {\n      attributes: {\n        firstName: driver.firstName,\n        lastName: driver.lastName,\n        dateOfBirth: driver.dateOfBirth,\n        licenseNumber: driver.licenseNumber,\n        licenseState: { code: driver.licenseState },\n        gender: { code: 'M' },\n        maritalStatus: { code: 'S' }\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: PolicyDriver }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fdrivers`,\n    request\n  );\n\n  return response.data;\n}\n```\n\n### Step 5: Quote the Submission\n\n```typescript\n\u002F\u002F Request a quote\nasync function quoteSubmission(submissionId: string): Promise\u003CQuoteResult> {\n  \u002F\u002F Trigger quote calculation\n  const quoteResponse = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fquote`,\n    {}\n  );\n\n  \u002F\u002F Get quote details\n  const submission = quoteResponse.data;\n  const policyPeriod = await client.request\u003C{ data: PolicyPeriod }>(\n    'GET',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${submission.latestPeriod.id}`\n  );\n\n  return {\n    jobNumber: submission.jobNumber,\n    status: submission.status.code,\n    totalPremium: policyPeriod.data.totalPremium,\n    taxes: policyPeriod.data.taxes,\n    effectiveDate: policyPeriod.data.effectiveDate,\n    expirationDate: policyPeriod.data.expirationDate\n  };\n}\n```\n\n### Step 6: Bind the Policy\n\n```typescript\n\u002F\u002F Bind the quoted submission\nasync function bindSubmission(submissionId: string): Promise\u003CBoundPolicy> {\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fbind`,\n    {}\n  );\n\n  if (response.data.status.code !== 'Bound') {\n    throw new Error(`Bind failed: ${response.data.status.name}`);\n  }\n\n  return {\n    jobNumber: response.data.jobNumber,\n    policyNumber: response.data.policy.policyNumber,\n    status: 'Bound'\n  };\n}\n```\n\n### Step 7: Issue the Policy\n\n```typescript\n\u002F\u002F Issue bound policy (often automatic)\nasync function issuePolicy(submissionId: string): Promise\u003CIssuedPolicy> {\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fissue`,\n    {}\n  );\n\n  return {\n    policyNumber: response.data.policy.policyNumber,\n    status: 'Issued',\n    effectiveDate: response.data.latestPeriod.effectiveDate\n  };\n}\n```\n\n## Gosu Implementation\n\n```gosu\n\u002F\u002F Complete policy submission workflow in Gosu\npackage gw.custom.submission\n\nuses gw.api.productmodel.Product\nuses gw.api.util.Logger\nuses gw.transaction.Transaction\n\nclass SubmissionWorkflow {\n  private static final var LOG = Logger.forCategory(\"SubmissionWorkflow\")\n\n  static function createAndQuoteSubmission(\n    account : Account,\n    product : Product,\n    effectiveDate : Date\n  ) : Submission {\n\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var account = bundle.add(account)\n\n      \u002F\u002F Create submission\n      var submission = new Submission(bundle)\n      submission.Account = account\n      submission.Product = product\n      submission.EffectiveDate = effectiveDate\n      submission.ProducerCodeOfRecord = account.ProducerCodes.first()\n\n      \u002F\u002F Initialize policy period\n      submission.initializePeriod()\n      var period = submission.LatestPeriod\n\n      \u002F\u002F Add line of business\n      if (product.Code == \"PersonalAuto\") {\n        initializePersonalAutoLine(period)\n      }\n\n      LOG.info(\"Created submission: ${submission.JobNumber}\")\n      return submission\n    })\n  }\n\n  private static function initializePersonalAutoLine(period : PolicyPeriod) {\n    var paLine = new PersonalAutoLine(period.Bundle)\n    paLine.PolicyPeriod = period\n\n    \u002F\u002F Set state-specific coverages\n    paLine.initializeCoverages()\n  }\n\n  static function quoteSubmission(submission : Submission) : PolicyPeriod {\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var sub = bundle.add(submission)\n\n      \u002F\u002F Validate before quoting\n      var validationResult = sub.LatestPeriod.validateForQuote()\n      if (validationResult.hasErrors()) {\n        throw new ValidationException(validationResult.AllMessages.join(\", \"))\n      }\n\n      \u002F\u002F Request quote\n      sub.requestQuote()\n\n      \u002F\u002F Wait for async rating if needed\n      if (sub.LatestPeriod.Status == PolicyPeriodStatus.TC_QUOTING) {\n        sub.LatestPeriod.awaitQuoteComplete()\n      }\n\n      LOG.info(\"Quoted submission ${sub.JobNumber}: ${sub.LatestPeriod.TotalPremiumRPT}\")\n      return sub.LatestPeriod\n    })\n  }\n\n  static function bindAndIssue(submission : Submission) : Policy {\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var sub = bundle.add(submission)\n\n      \u002F\u002F Bind\n      sub.requestBind()\n      if (!sub.LatestPeriod.canIssue()) {\n        throw new IllegalStateException(\"Cannot issue: ${sub.LatestPeriod.Status}\")\n      }\n\n      \u002F\u002F Issue\n      sub.requestIssue()\n\n      LOG.info(\"Issued policy: ${sub.Policy.PolicyNumber}\")\n      return sub.Policy\n    })\n  }\n}\n```\n\n## Output\n\n- Created account with account holder details\n- Submission with unique job number\n- Quote with premium breakdown\n- Bound and issued policy with policy number\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `Validation failed` | Missing required data | Check all required fields |\n| `Cannot quote` | Invalid policy configuration | Review coverages and limits |\n| `Cannot bind` | Outstanding issues | Resolve all validation errors |\n| `UW hold` | Requires underwriting approval | Process UW referrals |\n| `Rating error` | Rating engine failure | Check rate tables and factors |\n\n## Common Validation Issues\n\n```typescript\n\u002F\u002F Handle validation errors\ninterface ValidationError {\n  field: string;\n  message: string;\n  code: string;\n}\n\nfunction handleValidationErrors(errors: ValidationError[]): void {\n  const grouped = errors.reduce((acc, err) => {\n    acc[err.field] = acc[err.field] || [];\n    acc[err.field].push(err.message);\n    return acc;\n  }, {} as Record\u003Cstring, string[]>);\n\n  console.log('Validation Errors:');\n  Object.entries(grouped).forEach(([field, messages]) => {\n    console.log(`  ${field}:`);\n    messages.forEach(msg => console.log(`    - ${msg}`));\n  });\n}\n```\n\n## Resources\n\n- [PolicyCenter Cloud API](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002Fpc\u002F202503\u002Fapiref\u002F)\n- [Submission Workflow Guide](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002Fpc\u002F202503\u002Fcloudapica\u002F)\n- [Policy Lifecycle Documentation](https:\u002F\u002Fdocs.guidewire.com\u002Feducation\u002F)\n\n## Next Steps\n\nFor claims processing workflow, see `guidewire-core-workflow-b`.\n","# Guidewire Core Workflow A: Policy Lifecycle\n\n## Overview\n\nMaster the complete policy lifecycle in PolicyCenter: submission creation, quoting, binding, issuance, endorsements, and renewals.\n\n## Prerequisites\n\n- Completed `guidewire-install-auth` and `guidewire-sdk-patterns`\n- Understanding of P&C insurance concepts\n- Valid API credentials with policy admin permissions\n\n## Policy Lifecycle States\n\n```\nSubmission → Quote → Bind → Issue → In-Force → Endorsement\u002FRenewal\u002FCancellation\n    |           |       |      |          |\n    v           v       v      v          v\n [Draft]    [Quoted] [Bound] [Issued] [Active Policy]\n```\n\n## Instructions\n\n### Step 1: Create Account\n\n```typescript\n\u002F\u002F Create an account before policy submission\ninterface CreateAccountRequest {\n  data: {\n    attributes: {\n      accountHolder: {\n        contactSubtype: 'Person';\n        firstName: string;\n        lastName: string;\n        dateOfBirth: string;\n        primaryAddress: {\n          addressLine1: string;\n          city: string;\n          state: { code: string };\n          postalCode: string;\n          country: { code: string };\n        };\n      };\n      producerCodes: Array\u003C{ id: string }>;\n    };\n  };\n}\n\nasync function createAccount(holder: AccountHolderData): Promise\u003CAccount> {\n  const request: CreateAccountRequest = {\n    data: {\n      attributes: {\n        accountHolder: {\n          contactSubtype: 'Person',\n          firstName: holder.firstName,\n          lastName: holder.lastName,\n          dateOfBirth: holder.dateOfBirth,\n          primaryAddress: {\n            addressLine1: holder.address,\n            city: holder.city,\n            state: { code: holder.state },\n            postalCode: holder.zip,\n            country: { code: 'US' }\n          }\n        },\n        producerCodes: [{ id: holder.producerCodeId }]\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: Account }>(\n    'POST',\n    '\u002Faccount\u002Fv1\u002Faccounts',\n    request\n  );\n\n  return response.data;\n}\n```\n\n### Step 2: Create Submission\n\n```typescript\n\u002F\u002F Create a new policy submission\ninterface CreateSubmissionRequest {\n  data: {\n    attributes: {\n      account: { id: string };\n      baseState: { code: string };\n      effectiveDate: string;\n      product: { code: string };\n      producerCode: { id: string };\n      jobType: { code: 'Submission' };\n    };\n  };\n}\n\nasync function createSubmission(\n  accountId: string,\n  effectiveDate: string,\n  productCode: string = 'PersonalAuto'\n): Promise\u003CSubmission> {\n  const request: CreateSubmissionRequest = {\n    data: {\n      attributes: {\n        account: { id: accountId },\n        baseState: { code: 'CA' },\n        effectiveDate: effectiveDate,\n        product: { code: productCode },\n        producerCode: { id: 'pc:DefaultProducerCode' },\n        jobType: { code: 'Submission' }\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    '\u002Fjob\u002Fv1\u002Fsubmissions',\n    request\n  );\n\n  console.log(`Created submission: ${response.data.jobNumber}`);\n  return response.data;\n}\n```\n\n### Step 3: Add Policy Lines and Coverages\n\n```typescript\n\u002F\u002F Add Personal Auto line with vehicles and coverages\ninterface VehicleData {\n  vin: string;\n  year: number;\n  make: string;\n  model: string;\n  costNew: number;\n}\n\nasync function addVehicleWithCoverages(\n  submissionId: string,\n  policyPeriodId: string,\n  vehicle: VehicleData\n): Promise\u003Cvoid> {\n  \u002F\u002F Add vehicle\n  const vehicleRequest = {\n    data: {\n      attributes: {\n        vin: vehicle.vin,\n        year: vehicle.year,\n        make: vehicle.make,\n        model: vehicle.model,\n        costNew: { amount: vehicle.costNew, currency: 'usd' },\n        vehicleType: { code: 'PP' } \u002F\u002F Private Passenger\n      }\n    }\n  };\n\n  const vehicleResponse = await client.request(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fvehicles`,\n    vehicleRequest\n  );\n\n  const vehicleId = vehicleResponse.data.id;\n\n  \u002F\u002F Add coverages to vehicle\n  const coverages = [\n    { code: 'PALiabilityCov', limits: { BI: '100000\u002F300000', PD: '50000' } },\n    { code: 'PACollisionCov', deductible: 500 },\n    { code: 'PAComprehensiveCov', deductible: 250 },\n    { code: 'PAMedPayCov', limit: 5000 }\n  ];\n\n  for (const coverage of coverages) {\n    await client.request(\n      'POST',\n      `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fvehicles\u002F${vehicleId}\u002Fcoverages`,\n      {\n        data: {\n          attributes: {\n            patternCode: coverage.code,\n            \u002F\u002F Coverage-specific terms would be set here\n          }\n        }\n      }\n    );\n  }\n}\n```\n\n### Step 4: Add Drivers\n\n```typescript\n\u002F\u002F Add drivers to policy\ninterface DriverData {\n  firstName: string;\n  lastName: string;\n  dateOfBirth: string;\n  licenseNumber: string;\n  licenseState: string;\n}\n\nasync function addDriver(\n  submissionId: string,\n  policyPeriodId: string,\n  driver: DriverData\n): Promise\u003CPolicyDriver> {\n  const request = {\n    data: {\n      attributes: {\n        firstName: driver.firstName,\n        lastName: driver.lastName,\n        dateOfBirth: driver.dateOfBirth,\n        licenseNumber: driver.licenseNumber,\n        licenseState: { code: driver.licenseState },\n        gender: { code: 'M' },\n        maritalStatus: { code: 'S' }\n      }\n    }\n  };\n\n  const response = await client.request\u003C{ data: PolicyDriver }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${policyPeriodId}\u002Fdrivers`,\n    request\n  );\n\n  return response.data;\n}\n```\n\n### Step 5: Quote the Submission\n\n```typescript\n\u002F\u002F Request a quote\nasync function quoteSubmission(submissionId: string): Promise\u003CQuoteResult> {\n  \u002F\u002F Trigger quote calculation\n  const quoteResponse = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fquote`,\n    {}\n  );\n\n  \u002F\u002F Get quote details\n  const submission = quoteResponse.data;\n  const policyPeriod = await client.request\u003C{ data: PolicyPeriod }>(\n    'GET',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fpolicy-periods\u002F${submission.latestPeriod.id}`\n  );\n\n  return {\n    jobNumber: submission.jobNumber,\n    status: submission.status.code,\n    totalPremium: policyPeriod.data.totalPremium,\n    taxes: policyPeriod.data.taxes,\n    effectiveDate: policyPeriod.data.effectiveDate,\n    expirationDate: policyPeriod.data.expirationDate\n  };\n}\n```\n\n### Step 6: Bind the Policy\n\n```typescript\n\u002F\u002F Bind the quoted submission\nasync function bindSubmission(submissionId: string): Promise\u003CBoundPolicy> {\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fbind`,\n    {}\n  );\n\n  if (response.data.status.code !== 'Bound') {\n    throw new Error(`Bind failed: ${response.data.status.name}`);\n  }\n\n  return {\n    jobNumber: response.data.jobNumber,\n    policyNumber: response.data.policy.policyNumber,\n    status: 'Bound'\n  };\n}\n```\n\n### Step 7: Issue the Policy\n\n```typescript\n\u002F\u002F Issue bound policy (often automatic)\nasync function issuePolicy(submissionId: string): Promise\u003CIssuedPolicy> {\n  const response = await client.request\u003C{ data: Submission }>(\n    'POST',\n    `\u002Fjob\u002Fv1\u002Fsubmissions\u002F${submissionId}\u002Fissue`,\n    {}\n  );\n\n  return {\n    policyNumber: response.data.policy.policyNumber,\n    status: 'Issued',\n    effectiveDate: response.data.latestPeriod.effectiveDate\n  };\n}\n```\n\n## Gosu Implementation\n\n```gosu\n\u002F\u002F Complete policy submission workflow in Gosu\npackage gw.custom.submission\n\nuses gw.api.productmodel.Product\nuses gw.api.util.Logger\nuses gw.transaction.Transaction\n\nclass SubmissionWorkflow {\n  private static final var LOG = Logger.forCategory(\"SubmissionWorkflow\")\n\n  static function createAndQuoteSubmission(\n    account : Account,\n    product : Product,\n    effectiveDate : Date\n  ) : Submission {\n\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var account = bundle.add(account)\n\n      \u002F\u002F Create submission\n      var submission = new Submission(bundle)\n      submission.Account = account\n      submission.Product = product\n      submission.EffectiveDate = effectiveDate\n      submission.ProducerCodeOfRecord = account.ProducerCodes.first()\n\n      \u002F\u002F Initialize policy period\n      submission.initializePeriod()\n      var period = submission.LatestPeriod\n\n      \u002F\u002F Add line of business\n      if (product.Code == \"PersonalAuto\") {\n        initializePersonalAutoLine(period)\n      }\n\n      LOG.info(\"Created submission: ${submission.JobNumber}\")\n      return submission\n    })\n  }\n\n  private static function initializePersonalAutoLine(period : PolicyPeriod) {\n    var paLine = new PersonalAutoLine(period.Bundle)\n    paLine.PolicyPeriod = period\n\n    \u002F\u002F Set state-specific coverages\n    paLine.initializeCoverages()\n  }\n\n  static function quoteSubmission(submission : Submission) : PolicyPeriod {\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var sub = bundle.add(submission)\n\n      \u002F\u002F Validate before quoting\n      var validationResult = sub.LatestPeriod.validateForQuote()\n      if (validationResult.hasErrors()) {\n        throw new ValidationException(validationResult.AllMessages.join(\", \"))\n      }\n\n      \u002F\u002F Request quote\n      sub.requestQuote()\n\n      \u002F\u002F Wait for async rating if needed\n      if (sub.LatestPeriod.Status == PolicyPeriodStatus.TC_QUOTING) {\n        sub.LatestPeriod.awaitQuoteComplete()\n      }\n\n      LOG.info(\"Quoted submission ${sub.JobNumber}: ${sub.LatestPeriod.TotalPremiumRPT}\")\n      return sub.LatestPeriod\n    })\n  }\n\n  static function bindAndIssue(submission : Submission) : Policy {\n    return Transaction.runWithNewBundle(\\bundle -> {\n      var sub = bundle.add(submission)\n\n      \u002F\u002F Bind\n      sub.requestBind()\n      if (!sub.LatestPeriod.canIssue()) {\n        throw new IllegalStateException(\"Cannot issue: ${sub.LatestPeriod.Status}\")\n      }\n\n      \u002F\u002F Issue\n      sub.requestIssue()\n\n      LOG.info(\"Issued policy: ${sub.Policy.PolicyNumber}\")\n      return sub.Policy\n    })\n  }\n}\n```\n\n## Output\n\n- Created account with account holder details\n- Submission with unique job number\n- Quote with premium breakdown\n- Bound and issued policy with policy number\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `Validation failed` | Missing required data | Check all required fields |\n| `Cannot quote` | Invalid policy configuration | Review coverages and limits |\n| `Cannot bind` | Outstanding issues | Resolve all validation errors |\n| `UW hold` | Requires underwriting approval | Process UW referrals |\n| `Rating error` | Rating engine failure | Check rate tables and factors |\n\n## Common Validation Issues\n\n```typescript\n\u002F\u002F Handle validation errors\ninterface ValidationError {\n  field: string;\n  message: string;\n  code: string;\n}\n\nfunction handleValidationErrors(errors: ValidationError[]): void {\n  const grouped = errors.reduce((acc, err) => {\n    acc[err.field] = acc[err.field] || [];\n    acc[err.field].push(err.message);\n    return acc;\n  }, {} as Record\u003Cstring, string[]>);\n\n  console.log('Validation Errors:');\n  Object.entries(grouped).forEach(([field, messages]) => {\n    console.log(`  ${field}:`);\n    messages.forEach(msg => console.log(`    - ${msg}`));\n  });\n}\n```\n\n## Resources\n\n- [PolicyCenter Cloud API](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002Fpc\u002F202503\u002Fapiref\u002F)\n- [Submission Workflow Guide](https:\u002F\u002Fdocs.guidewire.com\u002Fcloud\u002Fpc\u002F202503\u002Fcloudapica\u002F)\n- [Policy Lifecycle Documentation](https:\u002F\u002Fdocs.guidewire.com\u002Feducation\u002F)\n\n## Next Steps\n\nFor claims processing workflow, see `guidewire-core-workflow-b`.\n",{"name":5,"author":49,"license":15,"version":50,"description":51,"allowed-tools":52},"Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Execute Guidewire primary workflow: Policy lifecycle management in PolicyCenter.\nUse when implementing quoting, binding, issuing, endorsing, or renewing policies.\nTrigger with phrases like \"policycenter workflow\", \"create policy\",\n\"bind submission\", \"issue policy\", \"policy endorsement\", \"quote insurance\".\n","Read, Write, Edit, Bash(curl:*), Bash(npm:*), Grep","main","b22eca2e974f918ce591c5b2bd829fb7510e0191","Skills\u002Fguidewire-core-workflow-a",18,"https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills","https:\u002F\u002Fgithub.com\u002FFDU-INS","Fudan University Department of Risk Management and Insurance","2026-07-12 12:54:34",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add FDU-INS\u002FInsurance-Skills --skill guidewire-core-workflow-a",{"tool":67,"command":68},"bunx","bunx skills add FDU-INS\u002FInsurance-Skills --skill guidewire-core-workflow-a",{"tool":70,"command":71},"pnpm","pnpm dlx skills add FDU-INS\u002FInsurance-Skills --skill guidewire-core-workflow-a","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fguidewire-core-workflow-a\u002FSKILL.md",true,[],[76,105,129,158,180,213],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":88,"publishedAt":44},"01M713QW6EGEG0YAD75440GSD0","로인장 (Roinjiang)","Activates when the user needs legal advice, contract review, insurance law consultation, startup legal support, or any legal\u002Fregulatory matter. She is a top-tier in-house lawyer with absolute loyalty to the CEO, specializing in insurance law, financial consumer protection, privacy, contracts, labor law, family law, civil and criminal matters.","Apache-2.0","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002F로인장 (Roinjiang)\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[78,89,27,90,91,92,29,93,94,33,95,96,97,98,99,100,101,102,103,104],"insurance law","civil","contract","family","review","loyalty","top","contract review","ceo","support","advice","consultation","regulatory","privacy","protection","startup",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":44},"01M713QRN8VFMA9VKS6R4DJ2WS","zocdoc-doctor-finder","Use when a user needs to find a doctor, dentist, specialist, therapist, or healthcare provider — especially when they mention insurance, in-network, availability, location, appointments, or booking. Also use for browsing provider reviews, comparing doctors by specialty, or checking if a provider takes their insurance.","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fzocdoc-doctor-finder\u002FSKILL.md",[],[112,113,114,115,27,116,117,29,118,119,120,121,122,123,124,125,126,127,38,128],"zocdoc doctor finder","doctor","healthcare","reviews","browser automation","access","browsing","browser","booking","network","therapist","computer","availability","for","provider","tool","automation",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":44},"01M713QKGV3FTX7EEYWKDM8ENZ","zenmux-context","Answers any question about ZenMux by reading the latest official documentation. Use this skill whenever the user asks about ZenMux product features, API usage, configuration, integration, pricing, models, providers, routing, fallback, streaming, multimodal, structured output, tool calling, reasoning, prompt caching, image generation, video generation, web search, long context, observability, logs, cost tracking, usage analytics, insurance, subscription, pay-as-you-go, invoices, best practices for tools like Claude Code, Cursor, Cline, CodeX, Gemini CLI, opencode, Cherry Studio, Obsidian, Sider, Open-WebUI, Dify, Neovate, GitHub Copilot, OpenClaw, CC-Switch, Immersive Translate, Studio Chat, architecture, benchmarks, FAQ, contact, privacy, terms of service, compliance, or any other ZenMux-related topic. Also trigger when the user writes in Chinese about ZenMux: 文档, 使用指南, 快速开始, API 参考, 最佳实践, 模型路由, 供应商路由, 订阅, 按量计费, 可观测性, 帮助, 常见问题, 接入指南, 配置. Trigger on phrases like \"how to use ZenMux\", \"ZenMux docs\", \"ZenMux API\", \"ZenMux integration\", \"ZenMux 怎么用\", \"ZenMux 接入\", \"ZenMux 配置\". Even if the user doesn't say \"ZenMux\" explicitly but asks about LLM API aggregation, model routing, provider fallback in a context where ZenMux is the project being worked on, this skill should activate.","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fzenmux-context\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[139,140,141,142,27,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157],"context","zenmux context","Video","chinese","project","web search","translate","search","open","question","pay","image","you","activate","architecture","logs","streaming","cherry studio","how",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":44},"01M713QHWTBG634BCBV7NBJME1","workers-comp-guide","Guide workers compensation compliance and claims management.\nTRIGGERS - Use when user needs help with workers-comp-guide related tasks.","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fworkers-comp-guide\u002FSKILL.md",[],[165,166,167,168,169,27,170,171,38,29,172,33,173,174,175,176,177,178,179],"workers","comp","workers comp","workers comp guide","guide","triggers","workers-comp","tasks","claims management","claims","compliance","help","compensation","management","user",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":195,"publishedAt":44},"01M713QF45VMV1685AFNF1GPMA","weekly-kpi-report","Generate McKinsey-style board presentation PPTs from weekly auto insurance data. Automatically calculates 16+ KPIs, creates executive-level slides with actionable insights, and supports week-over-week comparisons. Use when user uploads insurance cost data (Excel\u002FCSV) and requests board report, weekly presentation, executive briefing, or mentions keywords like 董事会汇报, 周报PPT, 经营分析演示, McKinsey-style reports.","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fweekly-kpi-report\u002FSKILL.md",[186,189,192],{"categoryNo":187,"categoryName":188,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":190,"categoryName":191,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":193,"categoryName":194,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000034","行政与办公人员",[196,197,198,199,200,27,201,202,203,204,29,205,206,207,208,209,210,211,38,212],"weekly","weekly kpi report","kpi","report","xlsx","actionable","insights","briefing","auto","board report","reports","generate","演示","data","presentation","slides","uploads",{"skillNo":214,"name":215,"nameZh":6,"description":216,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":80,"licenseFileUrl":6,"sourceHtmlUrl":217,"categories":218,"keywords":222,"publishedAt":44},"01M713QA9WJDHMNVTTY1ENRKVB","wealth-advisory","Wealth management and financial planning for HNW and UHNW clients. Activate when the user\nmentions wealth management, financial planning, retirement, estate planning, tax planning,\nGRAT, IDGT, trust, asset allocation, withdrawal rate, Monte Carlo simulation, goals-based\ninvesting, tax-loss harvesting, Roth conversion, insurance, annuity, mortgage strategy,\nconcentrated stock, family office, direct indexing, 529 plan, charitable giving, donor-advised\nfund, private foundation, or asks about personal finance strategy, inheritance, long-term\nfinancial planning, or UHNW advisory.","https:\u002F\u002Fgithub.com\u002FFDU-INS\u002FInsurance-Skills\u002Fblob\u002Fmain\u002FSkills\u002Fwealth-advisory\u002FSKILL.md",[219],{"categoryNo":220,"categoryName":221,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000040","财务",[223,224,27,225,226,29,152,227,228,229,230,231,232,233,234,235,236,237,238,239],"wealth advisory","advisory","stock","inheritance","conversion","indexing","plan","simulation","personal finance","rate","allocation","asset","direct","personal","investing","trust","planning"]