Commit Graph

589 Commits

Author SHA1 Message Date
Viktor Hofer 462550345b Remove nuget-restore-failure skills and test (#113)
That one isn't useful. The LLM is already smart enough.
2026-02-24 21:55:54 +01:00
Jan Krivanek 1e2df36e2d Add test for binlog creation skill (#109)
* Add test for binlog creation skill

* Fix regex pattern for binlog generation assertions

* Reflect PR comments

* Improve test cases
2026-02-24 17:13:28 +01:00
Jan Krivanek 3e07557cac Add tests for binlog-failure-analysis skill (#107)
* Add tests for binlog-failure-analysis skill

* Add support for using MCP within eval tests

* Update the skill and testcase - to better target the usage

* Change maxLevels default value from 4 to 2
2026-02-24 17:12:54 +01:00
Jan Krivanek 2f4d35e72c [Infra] Indicate not activated skills in dashboard (#105)
* Indicate not activated skills in dashboard

* Reflect PR commnets
2026-02-24 14:12:00 +01:00
Viktor Hofer bfcbe4d05b Add --verdict-warn-only option to skill-validator for non-fatal skill failures (#111)
* Add --warn-only option to skill-validator for non-fatal skill failures

This avoids the continue-on-error setting the yml which sometimes hides real issues.

* Change default runs from 1 to 2 in evaluation.yml

Updated the number of runs to 2 for better testing balance.

* Rename --warn-only to --threshold-warn-only and fail on execution errors

- Rename --warn-only to --threshold-warn-only to clarify it only applies
  to threshold-based verdict failures, not execution errors.
- Track rejected evaluation promises and return exit code 1 for execution
  errors even in --threshold-warn-only mode.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove redundant --strict option, clarify --threshold-warn-only

--strict only implied --require-evals, which already exists as its own
flag. Remove --strict to avoid confusion about its interaction with
--threshold-warn-only. Update --threshold-warn-only help text to clarify
it only suppresses threshold failures, not runtime/config errors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Only post PR comment when evaluate matrix succeeds

When a new push triggers cancel-in-progress, the evaluate matrix jobs
get cancelled but comment-on-pr still ran due to always(). This caused
partial/stale results to be posted. Require evaluate to succeed before
posting the PR comment.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add --verdict-warn-only flag with failureKind tracking

--verdict-warn-only treats verdict failures (threshold, completion
regression, skill not activated) as warnings (exit 0), while execution
errors and --require-evals missing_eval failures remain fatal.

Add failureKind field to SkillVerdict to categorize failure reasons.
Remove --strict (redundant with --require-evals).
Update README and evaluation.yml with documentation.
Allow comment-on-pr to run on evaluate failure (skip only on cancel).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 14:08:31 +01:00
Viktor Hofer e4ea5b6225 Refine parameter description in generate-benchmark-data.ps1 and add s… (#110)
* Refine parameter description in generate-benchmark-data.ps1 and add safeDirName function to sanitize skill names in reporter.ts

* refactor: make safeDirName a true sanitizer instead of a throwing validator

- Slugify skill names for directory use instead of hard-failing on
  unexpected characters from SKILL.md frontmatter display names.
- Use path.basename() for robust single-segment check instead of
  string.includes('..') which false-positives on names like 'foo..bar'.
- Throw on genuinely invalid names (empty, '.', '..', or all-special-chars).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 12:57:52 +01:00
Viktor Hofer 3c8499de55 Fix empty benches arrays in benchmark data generation (#108)
* Fix empty benches arrays in benchmark data generation

The json reporter lost per-skill verdict.json generation during a
refactor (b461016), causing generate-benchmark-data.ps1 to find no
verdict files and produce empty benches arrays.

Fix by:
- Restoring verdict.json generation in the json reporter
- Updating generate-benchmark-data.ps1 to read verdicts directly from
  results.json instead of scanning for per-skill verdict.json files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Simplify generate-benchmark-data to accept ResultsFile path directly

Replace ResultsDir parameter with ResultsFile since the script only
needs the results.json path. Update evaluation.yml caller accordingly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update eng/dashboard/generate-benchmark-data.ps1

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-24 12:38:21 +01:00
Jan Krivanek 3aecf50011 Run all evaluations when infrastructure files change (#104)
When a PR modifies files under .github/workflows/ or
eng/skill-validator/, all component evaluations are triggered since
these infra changes can affect any evaluation result. To prevent
quota issues, infra-triggered evaluations use 1 run instead of the
default.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 11:59:19 +01:00
Viktor Hofer f9cf1d6d12 Fix extractJson picking up non-JSON brace groups (e.g., C# code) (#100)
* Fix extractJson picking up non-JSON brace groups (e.g., C# code)

extractJson now validates each brace-matched candidate with JSON.parse
before returning it. If the candidate isn't valid JSON (even after
escape sanitization), it skips to the next brace group. This prevents
C# code snippets or other non-JSON content from being mistakenly
extracted as the judge's JSON response.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add test for skipping brace groups with invalid escapes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 09:22:55 +01:00
Viktor Hofer b0a2daf850 Fix merge conflict in CONTRIBUTING.md (#101)
These updates were already merged but accidentally reverted later.
2026-02-24 09:21:42 +01:00
Viktor Hofer c30f061a31 Fix benchmark generation: match timestamp dirs instead of run-* (#102)
The skill-validator reporter creates timestamped subdirectories
(YYYYMMDD-HHMMSS format), not run-* directories. The benchmark
step was looking for run-* and never finding results. Also sort
descending to pick the latest run when multiple exist.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 09:19:14 +01:00
Jan Krivanek 2e3619585b [Infra] Add activated skills info (#98)
* Set config dir to work dir for skills isolation

* Add skills activation info

* Reflected PR comments

* Fix after merge
2026-02-24 08:47:35 +01:00
Viktor Hofer ac6209e666 [Infra] Fix JSON parse error from invalid LLM escape sequences in pairwise judge (#99)
* Fix JSON parse error from invalid LLM escape sequences in pairwise judge

Wrap JSON.parse in try/catch and retry after stripping invalid escape
sequences (e.g., \' or \a) that LLMs sometimes produce in reasoning text.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Address PR feedback: improve error context and add parser tests

- Preserve original error and direction in all failure paths
- Only attempt escape sanitization when invalid escapes are detected
- Include JSON snippet in error messages for debugging
- Export parsePairwiseResponse for direct testing
- Add 7 tests covering valid JSON, invalid escapes, malformed JSON,
  missing JSON, and direction reversal

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Extract shared LLM JSON parsing into llm-json.ts

- Create llm-json.ts with extractJson() and parseLlmJson() helpers
- Refactor judge.ts and pairwise-judge.ts to use shared helpers
- Remove duplicated extractOutermostJson and escape-sanitization logic
- Add 11 tests for the shared module (extractJson + parseLlmJson)
- Add 8 tests for judge.ts parseJudgeResponse

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-23 23:18:14 +01:00
Jan Krivanek 0c1288d985 Add tokens alternation (#96)
Co-authored-by: Viktor Hofer <viktor.hofer@microsoft.com>
2026-02-23 22:05:49 +01:00
Viktor Hofer ae222c23a4 [Infra] Improve evaluation workflow (#97)
* feat: update build-validator job and README for Node.js version requirement

- Update an existing comment if it exists with the total summary
- Build the skill-validator just once and upload
- Clean-up when passing CLI args to skill-validator

* Update .github/workflows/evaluation.yml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Prune dev dependencies before uploading validator artifact

Reduces artifact size by removing devDependencies (typescript, vitest, etc.)
from node_modules/ since the evaluate job only needs the built dist/.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Updates

* Consolidate step summary into comment-on-pr job

Move GITHUB_STEP_SUMMARY writing from per-matrix Generate Summary step
into the existing Consolidate summaries step in comment-on-pr job.
This produces a single unified summary instead of fragmented per-component
summaries. The job now runs for all event types, with the PR comment
step scoped to pull_request events only.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refactor reporters to use --results-dir for file output

- Remove --no-save-results option and saveRunResults function
- Reporters no longer accept inline paths (e.g., json:path)
- Add --results-dir option: when specified, file reporters (json, junit,
  markdown) write to that directory; when omitted, they write to console
- Enhance markdown reporter with per-scenario judge reports including
  rubric scores, reasoning, and agent output
- Update workflow, README, and CONTRIBUTING docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Default --results-dir to .skill-validator-results and enable json/markdown reporters by default

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix unresolved matrix expression in skipped evaluate job name

Replace if: has_entries with if: !cancelled() && !failure() so the job
proceeds with an empty matrix, creating zero instances instead of a
skipped job with unresolved expressions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update required nodejs version in CONTRIBUTING doc

* Address PR feedback: fix timeout message, improve reporter output handling

- Use effective timeout value in error message to avoid 'undefineds'
- Only create resultsDir when file-based reporters are selected
- Write results into timestamped subdirectory (yyyyMMdd-HHmmss) to avoid stale output
- Use scenario-level improvementScore for markdown verdict icons
- Update workflow to find summary.md in timestamped subdirs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update bin-obj clash skill

* Fix PR comment step: use gh api instead of gh pr comment

gh pr comment requires a git repo checkout, but comment-on-pr job
only downloads artifacts. Switch to gh api for creating comments.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Touch one more skill

* Address PR feedback: remove dead code, fix formatting, improve workflow

- Remove dead validation check in cli.ts (resultsDir always has default)
- Fix missing spaces in variable declarations in reporter.ts
- Quote command substitution in consolidation script
- Use explicit needs.build-validator.result == 'success' condition
- Strip duplicate headers when consolidating multi-component summaries

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Replace markdown concatenation with consolidate subcommand

Instead of fragile bash string manipulation to combine per-component
summary.md files (which caused duplicate headers, empty tables, and
repeated model lines), add a 'consolidate' subcommand that reads
results.json files and generates a single clean markdown summary.

The subcommand takes explicit file paths as arguments — the caller
controls exactly which files to merge. Runner-specific concerns
(comment markers, run URLs) stay in the workflow script.

- Extract generateMarkdownSummary() from reportMarkdown() in reporter.ts
- Add 'skill-validator consolidate' subcommand in cli.ts
- Update workflow to use the new subcommand
- Document consolidate in README.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-23 21:07:41 +01:00
Viktor Hofer 5700505f89 [Infra] Updates to eval pipeline and instructions (#82)
* Update to eval pipeline and instructions

* Update RUNS to 5 for main but 3 for PRs
2026-02-23 18:52:20 +01:00
Viktor Hofer 6c1f75f983 feat: add support for parallel scenarios in skill evaluation (#84)
Mimics the parallel skills option.
2026-02-23 18:52:11 +01:00
Viktor Hofer 8e7d8fd6a3 [Infra] Add run label to distinguish output (#94)
* [Infra] Add run label to distinguish output

* Remove run label from pairwise judge error logging
2026-02-23 18:51:07 +01:00
Viktor Hofer b982d3d9b0 [Infra] Add verbose logging for work directory in runAgent (#93)
Log the work directory and skill type when verbose mode is enabled.
2026-02-23 18:34:02 +01:00
Aditya Mandaleeka 4169402e18 Scope PR evaluation to only changed skills (#76) 2026-02-23 09:05:04 -08:00
leslierichardson95 86dc027673 Revert "Added C# MCP Server development skills (#36)" (#74)
This reverts commit edd8877442.
2026-02-21 08:26:36 -08:00
leslierichardson95 edd8877442 Added C# MCP Server development skills (#36)
* Added C# MCP Server development skills

* Initial plan

* Fix CI validation: rename reference/ to references/, remove cross-skill file links, add references dir to parent skill

Co-authored-by: leslierichardson95 <7150306+leslierichardson95@users.noreply.github.com>

* Add inputs table, Native AOT section, common pitfalls, and additional resources

* Add JWT Bearer authentication and CORS configuration examples

* Add Claude Desktop config examples and manual JSON-RPC testing sections

* Add MCP protocol validation checklist

* Add guidelines for using .NET User Secrets and appsettings.Development.json for local development

* Update skills/mcp-csharp-skills/mcp-csharp-publish/references/nuget_publishing.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update skills/mcp-csharp-skills/mcp-csharp-publish/SKILL.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: leslierichardson95 <7150306+leslierichardson95@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-20 15:10:00 -08:00
Aaron R Robinson 5e0845eb1d Merge pull request #54 from AaronRobinsonMSFT/interop_skill
Add .NET P/Invoke skill
2026-02-20 14:01:38 -08:00
Aaron R Robinson bb16c56d83 docs: enhance SKILL.md with detailed guidance on reference files for type mapping and diagnostics 2026-02-20 13:59:46 -08:00
Aaron R Robinson 092217cb61 docs: update SKILL.md and diagnostics.md for .NET 8+ compatibility and clarify agent behavior 2026-02-20 11:44:12 -08:00
Aaron R Robinson 34ccf1cc8e docs: clarify marshaling requirement for C99 bool type in type mapping 2026-02-20 11:09:43 -08:00
Aaron R Robinson e8d1517137 docs: update type mappings for size_t and improve eval scenarios for .NET 8+ 2026-02-20 11:07:58 -08:00
Viktor Hofer bc3f767ab5 Re-enable cron and set to every two hours (#71) 2026-02-20 18:13:00 +01:00
Viktor Hofer 7c8cc3e4ef Add copy_test_files support and clean up test metadata (#69)
* Add copy_test_files support and clean up test metadata

- Add copy_test_files option to eval.yaml setup schema for opt-in
  auto-copy of test fixture files into agent working directory
- Update all msbuild eval.yaml files to enable copy_test_files
- Remove unused README.md, expected-output.md, and eval-test-prompt.txt
  from test directories
- Document setup options in README.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix copy_test_files to place files at workDir root

Use readdir + per-entry cp instead of cp(dir, dir) which would
nest files under a subdirectory. Addresses PR review feedback.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Reduce parallel skill count to 3 due to quota issues

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 18:10:34 +01:00
Viktor Hofer a8e3ce9d2a Enhance CONTRIBUTING.md with skill test guidelines (#70)
Added guidelines for writing skill tests and running tests locally.
2026-02-20 18:05:39 +01:00
Viktor Hofer 0d700bdfb8 Add parallel runs support to skill-validator (#68)
* Add parallel runs support to skill-validator

- Add --parallel-runs flag (default: 8) to control max concurrent runs
- Refactor run loop to use p-limit for controlled parallelism
- All runs within a scenario now execute concurrently (up to limit)
- Significantly reduces validation time with multiple runs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add parallel runs support to skill-validator

- Add --parallel-runs flag (default: 1) to control max concurrent runs
- Refactor run loop to use p-limit for controlled parallelism
- All runs within a scenario now execute concurrently (up to limit)
- Add workflow input and env variable (default: 3) for CI
- Add input validation for runs and parallelRuns (clamp to >= 1)
- Show spinner progress for both sequential and parallel modes
- Remove unused imports and variables

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Improve description

* Add DEFAULT_RUNS env variable to workflow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add parallel skills, coordinated spinner, and allSettled

- Add --parallel-skills flag to evaluate multiple skills concurrently
- Use single coordinated spinner shared across all parallel skills
- Prefix output with [skill] or [skill/scenario] for disambiguation
  (scenario omitted when eval has only one scenario)
- Use Promise.allSettled so one skill failure doesn't discard others
- Per-scenario runLimit so parallel-runs is scoped per scenario
- Add workflow input and env variable for parallel-skills (default: 3)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Temporarily use Token 2

* Allow skill-validator step to fail without blocking the job

Results are still uploaded and published to the dashboard even when
skills fail validation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove test changes

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 17:34:32 +01:00
Viktor Hofer fa4d72352e Add judge model input to evaluation workflow (#67) 2026-02-20 14:41:51 +01:00
Viktor Hofer 0b85b5c33d Only evaluate changed components in PRs (#66)
* Only evaluate changed components in PRs

Update evaluation workflow to detect which components have changed
in pull requests and only run evaluations for those, similar to
how validate-skills and validate-agents workflows work.

- Add change detection using git diff for PRs
- Add has_components output to skip evaluation when nothing changed
- Add no-changes job to report when no components were modified
- Push/schedule/workflow_dispatch still evaluate all components

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update validate-skills.yml

* Add validate-agents.yml to workflow paths

* Update workflow to trigger on changes to itself

* Update skill-validator.yml

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 14:31:03 +01:00
Viktor Hofer 7f77fdf29c Reduce quota in evaluation workflow (#65)
Temporarily use an older model and only run a test 3 times instead of 5
2026-02-20 14:17:01 +01:00
Viktor Hofer d3b4cd68e4 Enhance README with new plugin and workflow sections (#62)
* Enhance README with new plugin and workflow sections

Added new sections for distribution templates, agentic workflows, and Copilot extension in the README.

* Add MIT License to the project

* Add LICENSE file

* Update README.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-20 11:23:20 +01:00
Viktor Hofer eeae0af120 Add dashboard badge (#61) 2026-02-20 11:12:22 +01:00
Viktor Hofer df1ce04667 Merge pull request #60 from dotnet/DisableCron
Disable cron for now
2026-02-20 11:05:32 +01:00
Viktor Hofer b628195b95 Merge pull request #42 from dotnet/dotnet-msbuild
Add dotnet-msbuild component with skills, agents, and tests
2026-02-20 11:02:50 +01:00
Viktor Hofer 5625ec6dee Align test directories with skill names and support placeholder evals
- Rename 12 test directories to match their corresponding skill names
  (e.g. bin-obj-clash -> check-bin-obj-clash, build-errors-cs -> common-build-errors)
- Allow empty scenarios in eval.yaml schema for placeholder tests
- Add skip logic in CLI for skills with empty scenarios
- Create placeholder eval.yaml (scenarios: []) for 8 skills without tests
- Restore --strict --require-evals in evaluation workflow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 10:51:57 +01:00
Viktor Hofer 1b0df79b0c Update src/dotnet-msbuild/copilot-extension/app.yml
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-20 10:33:39 +01:00
Viktor Hofer a3519d9c21 Add eval.yaml tests for dotnet-msbuild and ignore skill-validator dist
Convert all 13 dotnet-msbuild test scenarios from the old
expected-output.md format to skill-validator eval.yaml format.
Each test has assertions and rubric criteria derived from the
original evaluation checklists. Includes a negative test for
domain-check (MSBuild skills should not activate for npm).

Also add eng/skill-validator/dist/ to .gitignore.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 10:30:59 +01:00
Viktor Hofer ad23394552 Add discover+matrix to evaluation workflow for multi-component support
Replace hardcoded src/dotnet paths with a discover job that finds all
components under src/ with skills/ and tests/ directories. Each
component is evaluated in parallel via matrix strategy. Artifacts and
benchmark data are now generated per-component.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 10:17:27 +01:00
Viktor Hofer 11bf689e82 Inline skill-validator into eng/skill-validator
Move skill-validator sources and tests from the external
adityamandaleeka/skill-validator repository into eng/skill-validator/.
Update evaluation.yml to build and run from the local copy instead of
checking out the external repo. Add skill-validator.yml CI pipeline
for building and testing the validator itself.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 10:03:31 +01:00
Viktor Hofer b5b62cef2d Add plugin to marketplace and formatting 2026-02-20 09:46:02 +01:00
Viktor Hofer e3b9ad2868 Merge branch 'main' into dotnet-msbuild 2026-02-20 09:42:07 +01:00
Aditya Mandaleeka 527d2d5b13 fix: force array output in components.json for dashboard (#59) 2026-02-19 21:40:49 -08:00
Aditya Mandaleeka 6869be2da5 Add git remote origin when initializing gh-pages branch. (#57) 2026-02-19 21:26:14 -08:00
Aditya Mandaleeka 5d78f1d9ed Update skill-validator version. (#56) 2026-02-19 21:11:24 -08:00
Aditya Mandaleeka f82d6a0f02 Include hidden files for uploading results. (#55)
* Add debug step to investigate missing results artifacts

* Fix artifact upload: include hidden files for .skill-validator-results

* Update skill validator commit.
2026-02-19 20:19:49 -08:00
Aaron R Robinson 17b8d4bd44 Add eval and move to correct structure. 2026-02-19 19:37:27 -08:00