Repository navigation
feat(package): isolate project doctor diagnostics - #479
Conversation
|
@greptileai review Please review the current head for package/extension doctor isolation, SDK contract exposure, and the extension API registrar refactor. |
|
/gemini review Please review the current head for package/extension doctor isolation behavior, test coverage, and SDK/API compatibility. |
|
@coderabbitai full review Please run a full review of the current head, especially the doctor isolation payloads and extension API registrar refactor. |
|
I'll post detailed comments on anything found. ✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 59 minutes. |
|
Important Review skippedNo new commits to review since the last review. ⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughThis PR adds isolated doctor flags and related wiring for package and extension diagnostics, skips global extension discovery when requested, and updates the CLI, SDK contracts, tests, docs, and PM tracking records. It also refactors extension API registration into a class-based registrar. ChangesIsolated doctor diagnostics
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related issues
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics by introducing an --isolated (or --ignore-global) flag for the pm package doctor and pm extension doctor commands. This allows for hermetic smoke tests by excluding global extension registrations from project-scoped diagnostics. The changes include updates to CLI flag parsing, help content, SDK contracts, and the extension loader, along with regression tests to verify the isolation behavior. I have reviewed the implementation and found a potential runtime error in src/cli/commands/extension.ts where override.name is accessed without validation, which is addressed by the provided suggestion.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Greptile SummaryThis PR adds isolated project doctor diagnostics for package and extension workflows. The main changes are:
Confidence Score: 5/5Safe to merge with low risk. The core behavior is narrowly scoped to doctor diagnostics and extension discovery options. The global-scan bypass is explicit and limited to project-scope doctor runs. The changed contracts are reflected in fixtures and tests. No blocking correctness or security issues were identified. No files require special attention.
What T-Rex did
Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant User
participant CLI as pm package/extension doctor
participant Setup as register-setup
participant Doctor as extension.ts doctor action
participant Loader as loadExtensions/discoverExtensions
participant Global as Global extension layer
participant Project as Project extension layer
User->>CLI: doctor --project --isolated/--ignore-global
CLI->>Setup: normalize lifecycle options
Setup->>Doctor: "isolated=true, scope=project"
Doctor->>Loader: "loadExtensions(ignoreGlobalExtensions=true)"
alt isolated project diagnostics
Loader--xGlobal: skip global scan
else normal project diagnostics
Loader->>Global: scan global extensions
end
Loader->>Project: scan project extensions
Loader-->>Doctor: loaded/failed/warnings/policy
Doctor-->>CLI: summary + isolation metadata + remediation
CLI-->>User: JSON/TOON/text doctor output
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant User
participant CLI as pm package/extension doctor
participant Setup as register-setup
participant Doctor as extension.ts doctor action
participant Loader as loadExtensions/discoverExtensions
participant Global as Global extension layer
participant Project as Project extension layer
User->>CLI: doctor --project --isolated/--ignore-global
CLI->>Setup: normalize lifecycle options
Setup->>Doctor: "isolated=true, scope=project"
Doctor->>Loader: "loadExtensions(ignoreGlobalExtensions=true)"
alt isolated project diagnostics
Loader--xGlobal: skip global scan
else normal project diagnostics
Loader->>Global: scan global extensions
end
Loader->>Project: scan project extensions
Loader-->>Doctor: loaded/failed/warnings/policy
Doctor-->>CLI: summary + isolation metadata + remediation
CLI-->>User: JSON/TOON/text doctor output
Reviews (13): Last reviewed commit: "feat(package): isolate project doctor di..." | Re-trigger Greptile |
Greptile SummaryThis PR adds isolated package and extension doctor diagnostics for project-scoped smoke tests. The main changes are:
Confidence Score: 5/5Safe to merge with minimal risk. The runtime change is narrowly scoped to doctor diagnostics, contract surfaces are kept in sync, and tests cover isolated and non-isolated behavior. No files require special attention.
What T-Rex did
Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant User
participant CLI as pm package/extension doctor
participant Run as runExtensionDoctorAction
participant Loader as loadExtensions
participant Activator as activateExtensions
participant Output as doctor summary/remediation
User->>CLI: "doctor --project [--isolated|--ignore-global]"
CLI->>Run: normalized options + vocabulary
Run->>Run: validate doctor scope/detail/trace
Run->>Loader: "ignoreGlobalExtensions = isolated"
alt isolated project doctor
Loader->>Loader: skip global extension layer scan
else non-isolated project doctor
Loader->>Loader: scan global + project extension layers
end
Loader-->>Run: load result + policy/warnings
Run->>Activator: activate loaded extensions
Activator-->>Run: registrations and activation warnings
Run->>Output: build isolation metadata, warning codes, rerun command, PM_GLOBAL_PATH recipe
Output-->>User: doctor diagnostics
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant User
participant CLI as pm package/extension doctor
participant Run as runExtensionDoctorAction
participant Loader as loadExtensions
participant Activator as activateExtensions
participant Output as doctor summary/remediation
User->>CLI: "doctor --project [--isolated|--ignore-global]"
CLI->>Run: normalized options + vocabulary
Run->>Run: validate doctor scope/detail/trace
Run->>Loader: "ignoreGlobalExtensions = isolated"
alt isolated project doctor
Loader->>Loader: skip global extension layer scan
else non-isolated project doctor
Loader->>Loader: scan global + project extension layers
end
Loader-->>Run: load result + policy/warnings
Run->>Activator: activate loaded extensions
Activator-->>Run: registrations and activation warnings
Run->>Output: build isolation metadata, warning codes, rerun command, PM_GLOBAL_PATH recipe
Output-->>User: doctor diagnostics
Reviews (1): Last reviewed commit: "feat(package): isolate project doctor di..." | Re-trigger Greptile |
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics for the doctor command (addressing GH-467). It introduces the --isolated (alias --ignore-global) flag to run diagnostics against project-scope extensions/packages only, preventing global registrations from leaking into hermetic project smoke tests. The extension loader has been updated to skip global scans when requested, and the extension API creation has been refactored into a bound ExtensionApiRegistrar class to ensure destructured API methods remain safe. Additionally, the PR updates shell completions, help content, SDK contracts, MCP schemas, documentation, and adds regression tests. As there are no review comments, no feedback is provided.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
1505e52 to
bc88af7
Compare
|
Review request for updated head bc88af7 after CI contract snapshot fix. @greptileai review |
|
I'll post detailed comments on anything found. ✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 46 minutes. |
There was a problem hiding this comment.
2 issues found and verified against the latest diff
You’re at about 91% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics for the pm CLI, addressing issues where global extension registrations leak into project-scoped diagnostics. It introduces --isolated (and --ignore-global) flags for pm package doctor and pm extension doctor, updates CLI contracts, help content, and documentation, and adds regression tests to verify hermetic behavior. I have reviewed the implementation and identified two type-safety improvements regarding the loadResult parameter type definition in src/cli/commands/extension.ts.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
bc88af7 to
56d84cb
Compare
|
Review request for updated head 56d84cb after Greptile P1 fix and final full coverage. @greptileai review |
|
I'll post detailed comments on anything found. ✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 14 minutes. |
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics (GH-467) by introducing the --isolated (alias --ignore-global) flag to the doctor commands, allowing hermetic project-scoped runs that ignore global registrations. The changes span CLI flag parsing, shell completions, SDK contracts, MCP schemas, documentation, and a refactoring of the extension loader to use a bound ExtensionApiRegistrar class. The review feedback highlights several opportunities in src/core/extensions/loader.ts to improve diagnostic trace output by passing the omitted received and hint arguments (such as the invalid overrides, definitions, or error reasons) to registerCommandTrace calls.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
56d84cb to
1244994
Compare
|
Updated head: 1244994 This repush addresses the fresh review feedback:
Local verification on this exact head:
@greptileai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
# Inspect the ExtensionApiRegistrar class for private field usage
ast-grep outline src/core/extensions/loader.ts --items all --type class --match 'ExtensionApiRegistrar' | head -100
echo "----"
rg -n 'class ExtensionApiRegistrar' -A 30 src/core/extensions/loader.ts
echo "---- private fields ----"
rg -n '#[a-zA-Z]' src/core/extensions/loader.ts | head -60
echo "---- legacy field name test ----"
rg -n 'legacy' -i tests/unit/extensions/*.spec.ts
echo "---- registerCommand validation trace ----"
rg -n 'registerCommand' -A 20 src/core/extensions/loader.ts | head -120Length of output: 20895 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "---- override-name guard ----"
rg -n 'override' -i src/core/extensions/loader.ts | rg -i 'name' | head -40
echo "---- extension_overrides sanitization ----"
rg -n 'extension_overrides' -A 15 src/cli/commands/extension.ts | head -80
echo "---- buildDoctorIsolationHint ----"
rg -n 'buildDoctorIsolationHint|hasGlobalLayerDiagnostics' -A 25 src/cli/commands/extension.ts | head -150
echo "---- isolated flag validation ----"
rg -n 'isolated|ignoreGlobal' -n src/cli/commands/extension.ts | head -60Length of output: 11481 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "---- package.ts isolation wiring ----"
rg -n 'isolated|ignoreGlobal|buildDoctorIsolationHint|buildDoctorIsolationMetadata' src/cli/commands/package.ts | head -60
echo "---- sdk-index.spec.ts doctor flags ----"
rg -n 'isolated' -A5 -B5 tests/unit/sdk/sdk-index.spec.tsLength of output: 719 🏁 Script executed: #!/bin/bash
set -euo pipefail
rg -n 'isolated' -A5 -B5 tests/unit/sdk/sdk-index.spec.tsLength of output: 1414 All checks confirm the fixes described in the update are correctly implemented in this head.
I additionally spot-checked the isolation feature itself:
No issues found — the fixes match what's described in the repush notes and the isolation/registrar work looks solid. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics for pm package doctor and pm extension doctor to support hermetic project-scoped smoke tests. It introduces the --isolated (alias --ignore-global) flag across CLI commands, shell completions, help content, and SDK/MCP schemas, allowing global registrations to be skipped. Additionally, it refactors the extension API creation to use a private-field-based ExtensionApiRegistrar class to prevent internal properties from leaking. The review feedback highlights potential runtime TypeError exceptions in src/cli/commands/extension.ts if the optional policy configuration block is undefined or null, recommending defensive guards to default it to an empty object.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@CHANGELOG.md`:
- Line 7: The CHANGELOG entry includes a private `.agents/pm/...` link, which
should not appear in public docs. Update the changelog bullet to remove the
internal tracker path and replace it with a public issue/PR reference or a
neutral label, keeping the `GH-467` entry and its descriptive text intact.
In `@src/core/extensions/loader.ts`:
- Around line 2031-2040: `registerCommand` currently allows inline `flags`
registration after only the schema capability assertion, so enforce-mode
policies can be bypassed. Update the `definition.flags` branch in `loader.ts` to
also use the same `allowRegistration("schema.flags", ...)` gate used by
`registerFlags()` and the importer/exporter metadata path before pushing into
`#registrationRegistry.flags`, while keeping the existing
`assertExtensionCapability` and normalization logic in place.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: a9cc5b83-b9cf-43a3-b7bb-8751801f9c50
📒 Files selected for processing (26)
.agents/pm/epics/pm-usfg.toon.agents/pm/features/pm-6abs.toon.agents/pm/features/pm-cbwg.toon.agents/pm/features/pm-x6jf.toon.agents/pm/history/pm-6abs.jsonl.agents/pm/history/pm-cbwg.jsonl.agents/pm/history/pm-usfg.jsonl.agents/pm/history/pm-w89s.jsonl.agents/pm/history/pm-x6jf.jsonl.agents/pm/stories/pm-w89s.toonCHANGELOG.mddocs/EXTENSIONS.mddocs/SDK.mdsrc/cli/commands/completion.tssrc/cli/commands/extension.tssrc/cli/help-content.tssrc/cli/register-setup.tssrc/core/extensions/extension-types.tssrc/core/extensions/loader.tssrc/sdk/cli-contracts/flag-contracts.tssrc/sdk/cli-contracts/tool-parameter-tables.tssrc/sdk/cli-contracts/tool-schema.tstests/fixtures/contracts/full.jsontests/unit/extensions/extension-command.spec.tstests/unit/extensions/extension-loader-internal.spec.tstests/unit/sdk/sdk-index.spec.ts
1244994 to
03700d1
Compare
|
Updated head: 03700d1 This repush addresses the fresh CodeRabbit/Gemini feedback:
Local verification on this exact head:
@greptileai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "---- CHANGELOG.md GH-467 link ----"
rg -n 'GH-467|467' CHANGELOG.md | head -20
echo "---- inline registerCommand flags policy gate ----"
rg -n 'registerCommand' -A 40 src/core/extensions/loader.ts | rg -n 'flags|allowRegistration' | head -40
echo "---- schema.flags gate usage ----"
rg -n 'schema.flags' src/core/extensions/loader.ts
echo "---- doctor policy detail rendering null/undefined ----"
rg -n 'buildExtensionPolicyDetails|policy\?\.|policy &&' src/cli/commands/extension.ts | head -40Length of output: 4590
No issues found — the fixes match what's described in the repush notes. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics by introducing the --isolated (alias --ignore-global) flag for the doctor command, resolving GH-467. This ensures hermetic project-scoped diagnostics by ignoring global registrations. The changes span CLI flag parsing, shell completions, help content, SDK contracts, and MCP schemas. Additionally, the extension API registration is refactored into a dedicated ExtensionApiRegistrar class to safely bind methods and protect internal fields. The review feedback correctly identifies a potential issue where partial policy objects could lead to undefined mode or trust_mode values, and suggests using nullish coalescing to fall back to safe defaults.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
03700d1 to
8e4e75e
Compare
|
Follow-up review request for head 8e4e75e. Changes since the prior bot round restore CHANGELOG.md to the package-owned pm-changelog generated link so @greptileai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "---- CHANGELOG.md GH-467 entry ----"
rg -n '467' CHANGELOG.md | head -20
echo "---- changelog:pm:check script ----"
rg -n 'changelog:pm:check' package.json -A2 -B2
echo "---- pm-changelog generated link pattern elsewhere in changelog ----"
rg -n 'pm-changelog|GH-' CHANGELOG.md | head -30Length of output: 7425
This change is isolated to CHANGELOG.md generation and doesn't touch the doctor isolation payloads, SDK contract exposure, or the extension API registrar refactor — all of which were already verified clean in the prior full-review rounds on this PR. No issues found on this head. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension doctor diagnostics (GH-467). It introduces --isolated and --ignore-global flags to allow running doctor diagnostics hermetically, excluding global-scope registrations. The changes include updates to CLI command parsing, SDK contracts, MCP/tool schemas, and extensive regression testing. Additionally, the ExtensionApiRegistrar was refactored to use private fields for improved encapsulation. I have no feedback to provide.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Add project-scoped doctor isolation for package and extension diagnostics so temporary package smoke tests can skip machine-local global extension state. Thread the isolated/ignore-global flag through CLI help, completions, contracts, SDK tool schemas, and doctor metadata while preserving default behavior for existing callers. Harden the extension API registrar follow-up from PR review by keeping registrar internals in ECMAScript private fields, binding the public API methods, and adding regression coverage that extension activators cannot observe legacy internal registry fields. Improve registerCommand validation traces with the offending override/run-handler values and metadata failure reasons, and guard malformed policy override names in doctor policy rendering. Document the lane in pm-6abs with linked files, comments, coverage, static quality, temp-dir dogfood evidence, and review-feedback verification across related pm items pm-usfg, pm-w89s, pm-cbwg, pm-x6jf, and pm-qt5d.
8e4e75e to
1ec1bcf
Compare
|
Follow-up review request for head 1ec1bcf. This repush addresses Gemini partial-policy fallback feedback: @greptileai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "---- buildExtensionPolicyDetails mode/trust_mode defaults ----"
rg -n 'buildExtensionPolicyDetails' -A 60 src/cli/commands/extension.ts | head -120
echo "---- mode / trust_mode default constants ----"
rg -n 'trust_mode|mode\s*:' src/cli/commands/extension.ts | head -40
echo "---- regression tests for mode-only/trust-mode-only ----"
rg -n 'mode-only|trust-mode-only|trust_mode' tests/unit/extensions/extension-command.spec.ts | head -40Length of output: 7179 🏁 Script executed: #!/bin/bash
set -euo pipefail
sed -n '480,560p' tests/unit/extensions/extension-command.spec.tsLength of output: 2910 Verified. This matches the described fix precisely.
This is isolated to the policy-detail rendering helper and doesn't touch the doctor isolation payloads, SDK contract exposure, or the registrar refactor — all previously verified clean on earlier heads of this PR. No issues found on this head. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Code Review
This pull request implements isolated package and extension diagnostics (GH-467) by introducing the --isolated (alias --ignore-global) flag to the doctor commands. This allows running hermetic project-scoped diagnostics without global extension registrations leaking in. The changes span CLI options, shell completions, help content, SDK contracts, and MCP schemas. Additionally, the extension loader is refactored to use a private-field-backed ExtensionApiRegistrar class to safely bind registration methods and hide internal fields from extension activators, and inline command flag registrations are now subject to schema.flags policy enforcement. Comprehensive unit and integration tests have been added to verify the isolation behavior, private field encapsulation, and policy enforcement. I have no feedback to provide as there are no review comments.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Summary
Verification
Notes
Summary by cubic
Adds
--isolated/--ignore-globaltopm package|extension doctorso project diagnostics ignore global registrations, enabling hermetic smoke tests and closing GH-467. Also hardens the extension registrar and policy rendering for safer activation and clearer diagnostics.New Features
pm package|extension doctor --project --isolated(alias--ignore-global) skips global registrations; doctor output shows isolation metadata and rerun hints.docs/SDK.mddocument isolation andPM_GLOBAL_PATH; SDK flag contracts, tool schema, and parameter tables include the flags; CLI threads the option to the loader viaignoreGlobalExtensions.Refactors
registerCommandvalidation traces and guarded malformed policy override names.schema.flagspolicy for inline flag registrations.Written for commit 1ec1bcf. Summary will update on new commits.