Working With Policies
This guide provides instructions for interacting with and managing the Cloudaware Compliance Engine v2 policy repository. Adhere strictly to these guidelines to ensure consistency and proper functioning of the automation toolchain.
1. Task Execution Protocol
For every user request, you MUST follow this protocol to ensure transparency, reproducibility, and clear communication. This is your primary operational loop.
-
Create a Task Directory: Upon receiving a new task, immediately create a dedicated directory for it within the
tmpdirectory. Name the directory descriptively (e.g.,tmp/task-add-s3-encryption-policy). -
Initialize
readme.mdLog: Inside the new task directory, create areadme.mdfile. This file will serve as your plan, log, and report for the user. -
Formulate and Document the Plan: Before taking any action, formulate a step-by-step plan to address the user's request. Write this plan at the top of the
readme.md. -
Log Every Action: As you execute each step, meticulously log your actions in the
readme.mdunder a "Log" or "Execution Details" section. For each action, you must record:- A brief description of the action's purpose.
- The full command you are executing (e.g.,
repo-manager policies test ...,write_file ...). - The complete output from the command.
- Links to any files created or modified.
-
Update the Plan: After completing a step, update the plan section of the
readme.mdto reflect your progress (e.g., by marking items as complete). -
Inform the User: Keep the user informed by referencing the
readme.mdfile. When you have completed the task, notify the user that a detailed log of all actions is available in the task directory. This log is crucial for the user to understand your work and potentially automate the task later.
Example readme.md Structure
# Task: Add a New Policy for S3 Bucket Encryption
**Status:** In Progress
## Plan
- [ ] 0. Prepare repository (cleanup and import types)
- [ ] 1. Research similar existing policies
- [ ] 2. Read relevant guides documentation
- [ ] 3. Create the policy directory structure
- [ ] 4. Create the `policy.yaml` file
- [ ] 5. Create the `description.md` and `remediation.md` files
- [ ] 6. Implement the logic in `wip.logic.yaml` (WITHOUT testData section)
- [ ] 7. Run capture-test-data command to generate test-data.json
- [ ] 8. Add testData section to wip.logic.yaml
- [ ] 9. Modify captured test-data.json to cover all scenarios
- [ ] 10. Run tests and verify the logic
- [ ] 11. Rename `wip.logic.yaml` to `prod.logic.yaml`
- [ ] 12. Ask user if they want documentation generated (optional)
## Execution Log
### Step 1: Research Similar Policies
I am searching for existing S3 bucket policies to understand the structure...
**Command:**
`ls /ce/ca/aws/s3/`
**Output:**
...
---
*... (log continues for each step) ...*
2. Core Concepts
The repository stores compliance policies as declarative YAML files.
- Policy: A rule or idea to test against a cloud environment. It is a declarative description, not code. It is defined in a
policy.yamlfile. - Logic: The implementation of a policy's idea. It contains the instructions for how to validate objects. It is defined in a
{name}.logic.yamlfile. A policy can have multiple logic files (e.g.,prod.logic.yaml,wip.logic.yaml). - Folder: A logical container for organizing policies, defined by a
folder.yamlfile. - Section: A component of a compliance framework (e.g., NIST, CIS), defined by a
section.yamlfile. - Type: Represents a Cloudaware CMDB SObject type (e.g.,
CA10__CaAwsInstance__c). Its directory containstype.json(schema) and*.extracts.yamlfiles. - Extract: A reusable, validated piece of information extracted from an input object. Extracts are defined in
types/{type}/{name}.extracts.yamland are used in logic files to abstract away direct field access. Always preferEXTRACToverFIELDin production logic. - Entity ID: The unique identifier for any entity (Policy, Folder, Section, etc.) is its absolute Linux-style path from the repository root. For example, the ID for a policy in
/ce/ca/aws/ec2/my-policy/policy.yamlis/ce/ca/aws/ec2/my-policy.
3. Repository Structure
ce: Root directory for all policies.ce/ca: Cloudaware's public policies.ce/unit-test: Unit tests for Compliance Engine operations. This is the most up-to-date reference for how operations work, including all edge cases. Consult this directory when implementing complex logic.
frameworks: Contains compliance framework definitions. Each subdirectory is a framework.types: Contains CMDB SObject type definitions and associatedextracts.yamlfiles.guides: IMPORTANT: Contains comprehensive documentation. Read relevant guides BEFORE implementing policies.schema: Contains JSON schemas for IDE validation.flags: Contains auto-generated lists of policies for maintenance (e.g., policies without tests).
4. Naming and File Conventions
Strict adherence is mandatory.
- Directory Names: Use
lowercase-with-hyphens. - Descriptor Files:
- Folders require
folder.yaml. - Policies require
policy.yaml. - Framework sections require
section.yaml.
- Folders require
- Logic Files:
prod.logic.yaml: Production logic. This is executed by the engine.wip.logic.yaml: Work-in-progress.unit-test.logic.yaml: Unit tests.example.logic.yaml: Examples.
- Documentation Files:
description.md: Detailed technical specification of the policy (Rationale, Impact, Audit).remediation.md: Step-by-step guidance to fix non-compliance.internal.md: Developer notes.todo.md: Implementation tasks.
- Test Data:
test-data.json: Contains JSON objects for testing a logic file. It is referenced in thetestDataproperty of the logic YAML.
5. Common Workflows
Workflow: Creating a New Policy
IMPORTANT: Always start by preparing the repository, then research similar existing policies and read relevant guides.
Step 0: Prepare Repository
Before starting work on a new policy, ensure the repository is in a clean, working state:
# Clean up any problematic files that might break parsing
repo-manager cleanup
# Restore type descriptors that were removed by cleanup
repo-manager types import -p REFERENCED
This removes any files that could cause parsing errors and restores all type definitions referenced in the repository, putting it in a clean working state.
Step 1: Research and Learn
-
Find Similar Policies: Search for existing policies similar to what you're creating.
# Example: Find instance-related policies
ls -la /ce/ca/aws/ec2/
# Example: Find policies using specific operations
grep -r "RELATED_LIST_COUNT" /ce/ca/ --include="*.logic.yaml" -
Examine a Similar Policy: Read at least one similar policy completely:
- The
policy.yamlfile for metadata structure - The
prod.logic.yamlfile for logic patterns - The
test-data.jsonfile for test data format - The
description.mdandremediation.mdfor documentation style
- The
-
Read Relevant Guides: Based on your task, read the appropriate guides:
- For logic operations:
guides/developer/operations/index.md - For specific operations (e.g., RELATED_LIST_COUNT):
guides/developer/operations/related-list-count.md - For type system:
guides/developer/type-system/index.md - For object relationships:
guides/developer/object-relationships/index.md
- For logic operations:
-
Check Unit Tests for Edge Cases: If implementing complex logic, check
ce/unit-test/for unit tests of the operations you're using. These tests show all edge cases and are the most up-to-date reference. -
Find Available Extracts: Check what extracts are already available for your input type:
# Example: Check available extracts for EC2 instances
cat /types/CA10__CaAwsInstance__c/object.extracts.yaml
Step 2: Understand Relationships (if needed)
If your policy needs to check related objects (e.g., volumes attached to instances):
-
Find the Relationship Name: Search the type definition:
# Example: Find volume relationships in instance type
grep -i "volume" /types/CA10__CaAwsInstance__c/type.json -
Understand the Foreign Key: Related objects need a foreign key field. Check the child type:
# Example: Find how volumes reference instances
grep -i "attachmentInstance" /types/CA10__CaAwsVolume__c/type.json -
Read Related List Operations Guide:
cat /guides/developer/operations/related-list-count.md
Step 3: Determine Policy Categories
Valid categories are: PERFORMANCE, RELIABILITY, COST, SECURITY
Do not use any other categories (e.g., "BEST_PRACTICES" is invalid).
Step 4: Create Policy Structure
-
Identify Path: Determine the correct path for the new policy under
ce. For example:ce/ca/aws/ec2/new-instance-policy. -
Create Folders: Ensure all parent directories exist and each contains a
folder.yamlfile withnames.contextualandnames.fullproperties. -
Create Policy Directory: Create the final directory for your policy.
-
Create
policy.yaml: Create the main descriptor file. Populatenames,description,type, and validcategories. -
Create Documentation: Create
description.mdandremediation.mdwith detailed content based on similar policies.
Step 5: Implement Logic
-
Create
wip.logic.yaml(WITHOUT testData section):- Define
inputType(the CMDB object to check) - Use
importExtractsto reference the object's extracts file - Define
conditionssequentially. Each condition has:check: The logical teststatus: One ofDISAPPEARED,INAPPLICABLE,COMPLIANT,INCOMPLIANT,UNDETERMINEDcurrentStateMessage: Description of the current stateremediationMessage: How to fix (for INCOMPLIANT status)
- Define the
otherwiseblock as a fallback - IMPORTANT: Do NOT add a
testDatasection yet - add it only after you have captured actual test data
- Define
-
For Related Lists:
- Add a
relatedListssection after the main conditions - Specify the
relationshipName(e.g.,CA10__AWS_EBS_Volumes__r) - Import the related object's extracts
- Define conditions for the related objects
- Use
RELATED_LIST_COUNT,RELATED_LIST_HAS, orRELATED_LIST_HAS_NOin your main conditions
- Add a
Step 6: Create Test Data
IMPORTANT: Always use the capture-test-data command to generate test data. Never write test-data.json manually.
Workflow:
-
Capture Test Data (no testData section needed in logic.yaml yet):
repo-manager policies capture-test-data /path/to/wip.logic.yamlThis command does everything in one step:
- Generates the SQL query and saves it to
.generated/capture_test_data.sql - Executes the query against BigQuery
- Saves the results directly to
test-data.json
- Generates the SQL query and saves it to
-
Add testData section to wip.logic.yaml: Now that you have actual test data, add the testData reference to your
wip.logic.yamlfile:testData:
- file: "test-data.json"Place this after
inputTypeand before or afterimportExtracts. -
Examine the Test Data: Open
test-data.jsonto see what data was captured. The format will be obvious from the results. -
Modify Test Data to cover all scenarios:
- Edit the captured data to ensure coverage of all conditions (INAPPLICABLE, INCOMPLIANT, COMPLIANT)
- Add or modify test cases to cover edge cases (0 items, exactly at limit, over limit)
- Update
expectedResultfor each test case with the correct status and conditionIndex - You may need to capture more data or create additional test cases by duplicating and modifying existing entries
- The captured data will have the correct structure for all fields automatically
Step 7: Test and Debug
-
Run Tests:
repo-manager policies test /path/to/wip.logic.yaml -
Fix Common Issues:
- Invalid category: Check that categories are from the valid list (PERFORMANCE, RELIABILITY, COST, SECURITY)
- Wrong conditionIndex: Update expectedResult to match actual
- Test data issues: Check the captured data format matches what similar policies use
-
Review Test Results: The output shows which tests passed/failed. The
.test-results.yamlfile contains detailed results. -
Iterate: Fix issues and re-run tests until all pass.
Step 8: Finalize
-
Rename Logic File: Once all tests pass:
mv /path/to/policy/wip.logic.yaml /path/to/policy/prod.logic.yaml
mv /path/to/policy/wip.test-results.yaml /path/to/policy/prod.test-results.yaml -
Verify Production Tests:
repo-manager policies test /path/to/policy/prod.logic.yaml -
Ask User About Documentation Generation: Documentation generation is optional and can be time-consuming. Ask the user: "Would you like me to generate repository documentation? This updates cross-references but may take some time."
If yes:
repo-manager docs generateNote: This may fail if there are unrelated repository issues. Failure is not critical for the policy itself.
Workflow: Testing a Policy
-
Run Tests:
- Execute
repo-manager policies test /path/to/your/prod.logic.yamlfor a single policy orrepo-manager policies test allfor all policies. - This command validates the logic against
test-data.jsonand creates a.test-results.yamlfile.
- Execute
-
Review Results: Check the output for failures. Look for:
- Status mismatches (expected INCOMPLIANT but got COMPLIANT)
- ConditionIndex mismatches (wrong condition was triggered)
- ConditionText mismatches (actual logic differs from expected)
-
Common Test Failures and Fixes:
- "FAIL conditionIndex": Your test expected a different condition to match. Update the expectedResult or fix the logic order.
- "FAIL status": The logic returned a different status. Check your conditions and test data values.
- "Can't deserialize" errors: Invalid category name or wrong data type in YAML.
- Other errors: Check similar policies' test-data.json format and consult unit tests in
ce/unit-test/.
Workflow: Debugging a Policy
-
Generate Debug Query:
- Run
repo-manager policies generate DEBUG path/to/your/logic.yaml. - This creates a
debug.sqlfile in a.generateddirectory.
- Run
-
Execute Query: Run the generated SQL queries against BigQuery to inspect how the logic evaluates against real data. This helps understand which objects match which conditions.
Workflow: Managing Documentation
- Before Committing: Always run
repo-manager docs generateto create/update the*.gen.mdfiles which provide cross-references between entities. - Before Pulling Changes: Run
repo-manager docs cleanupto remove all generated files to avoid merge conflicts. - To Fix Parsing Errors or Repository Issues: Prepare the repository:
repo-manager cleanup(comprehensive cleanup)repo-manager types import -p REFERENCED(restore type definitions)repo-manager policies test all(verify everything works)repo-manager docs generate(regenerate documentation if needed)
6. repo-manager CLI Tool
repo-manager is the primary tool for managing this repository.
Configuration and Behavior
- Configuration: The tool uses authentication profiles stored in a
profiles.jsonfile. This file is typically located in a.cadirectory in the repository root or your home directory. The agent must have a valid and active profile to communicate with the Cloudaware API. - Auto-Update: The tool auto-updates periodically. You can force an update with
--auto-updateor suppress it with--no-auto-update.
Command Reference
The following are the most critical commands for an AI agent.
docs - Documentation Management
repo-manager docs generate: Generates/updates all*.gen.mdand other documentation files. These files contain crucial cross-links between entities. Run this after making changes and before committing.--watch: Use to keep documentation updated in real-time during development sessions.
repo-manager docs cleanup: Removes all generated documentation files. Run this before pulling changes from a remote repository to avoid merge conflicts.
policies - Policy Management
repo-manager policies capture-test-data <id>: Captures test data for a policy in one step.<id>: The absolute path ID of the policy or logic file (e.g.,ce/ca/aws/ec2/instance-detailed-monitoring/wip.logic.yaml).- This command automatically generates the SQL query, executes it against BigQuery, and saves results to test-data.json.
-oor--output-file: Optional path to the output file (default:POLICY_DIR/test-data.json).
repo-manager policies generate <kind> <id>: Generates a BigQuery script for a policy.<id>: The absolute path ID of the policy or logic file (e.g.,ce/ca/aws/ec2/instance-detailed-monitoring/prod.logic.yaml).<kind>: The type of script to generate. Valid values are:DEBUG: For debugging the policy against live data.CAPTURE_TEST_DATA: Generates a SQL query to capture real data from BigQuery for creating test-data.json. Note: prefer usingrepo-manager policies capture-test-datainstead, which executes the query automatically.TESTS: To generate a script for running tests fromtest-data.json.
repo-manager policies test <id>: Runs tests for policies.<id>: The ID of a specific policy/logic file, or'all'to test every policy in the repository, or'unit-tests'for all unit tests.
types - CMDB Type Management
repo-manager types import: Imports or updates SObject definitions from Salesforce into thetypesdirectory. This also updates the master list intypes/types.json. Use this if a policy requires a new object type or field that is not yet present.-t <api_name>or--type <api_name>: Specify a single type to import. Can be used multiple times.-p <preset_name>or--preset <preset_name>: Import a group of types. Can be used multiple times.REFERENCED: All types referenced in the repository (recommended for preparing repository)CLOUDAWARE: All Cloudaware types
repo-manager types delete: Removes imported type data from thetypesdirectory.
cleanup - Repository Cleanup
repo-manager cleanup: Performs a comprehensive cleanup of the repository, removing generated files and potentially problematic files. More extensive thandocs cleanup. Note: This will delete type JSON descriptors, which must be restored withrepo-manager types import -p REFERENCED.
schema - Schema Management
repo-manager schema update: Updates the JSON schema files in theschemadirectory. This ensures IDEs and validation tools have the latest information for autocompletion and correctness checks.
auth - Authentication
- The agent's environment should be pre-configured with an active authorization profile. The primary commands for this are
repo-manager auth addandrepo-manager auth activate. You will likely not need to use these, but be aware that API communication depends on a valid profile.
7. Quick Reference: Common Tasks
Finding Relationship Names
# Find relationships in a type (e.g., volumes on instances)
grep -i "relationshipName" types/CA10__CaAwsInstance__c/type.json | grep -i "volume"
# Or search for the child object name
grep "CA10__CaAwsVolume__c" types/CA10__CaAwsInstance__c/type.json
Understanding Complex Operations
For complex operations or edge cases:
# Check unit tests for the operation you're using
ls ce/unit-test/
cat ce/unit-test/some-operation/prod.logic.yaml
cat ce/unit-test/some-operation/test-data.json
Unit tests are the most up-to-date reference for how operations behave.
Valid Policy Categories
Only these values are allowed in policy.yaml:
PERFORMANCERELIABILITYCOSTSECURITY
Capturing Test Data
Always use the capture-test-data command to capture test data in one step:
# Step 1: Capture test data (wip.logic.yaml should NOT have testData section yet)
repo-manager policies capture-test-data path/to/wip.logic.yaml
# This command automatically:
# - Generates the SQL query to .generated/capture_test_data.sql
# - Executes it against BigQuery
# - Saves results to test-data.json
# Step 2: Add testData section to wip.logic.yaml now that you have actual test data
# Add this to wip.logic.yaml:
# testData:
# - file: "test-data.json"
# Step 3: Edit test-data.json to add expectedResult for each test case
8. Answering Data-Related Questions
As an AI agent, one of your key roles is to help users retrieve data from their Cloudaware CMDB. When a user asks a question about their cloud resources, you should generate and then execute a BigQuery query to get the answer.
The environment has bq command properly configured. Use bq query for executing BigQuery SQL queries.
Scenario 1: General Data Queries
For ad-hoc questions not directly related to an existing compliance policy.
-
Analyze the User's Question: Determine the resources, properties, and conditions in the user's request.
-
Find CMDB API Names: Find the precise API names for the object and its fields by searching locally available type information in the
typesdirectory.-
Hint: Cloudaware CMDB names often mirror the original cloud provider's names. Use variations of the user's terms in your search.
-
Search Strategy: To find a candidate object API name, you must search the master list of types in
types/types.json. To find the API names for specific fields, you must search the object's definition file (e.g.,types/CA10__CaAwsVpc__c/type.json). -
IMPORTANT: Both
types.jsonand the individualtype.jsonfiles can be very large. Do NOT read them into your context. You MUST use thejqcommand-line tool to query them directly.-
Example: To find an object's API name in
types.jsonby its label:jq '.[] | select(.label | ascii_downcase | contains("VPC" | ascii_downcase)) | .apiName' types/types.json -
Example: To find the API name of the "disappearance time" field in a
type.jsonfile:jq '.fields[] | select(.label | ascii_downcase | contains("Deleted From" | ascii_downcase)) | .apiName' types/CA10__CaAwsVpc__c/type.json
-
-
If
types.jsonor a specifictype.jsonfile is missing, runrepo-manager types import -p REFERENCEDto download them first.
-
-
Construct and Save SOQL Query: Using the correct API names, formulate a SOQL query. Save this query to a
.soqlfile inside your current task directory.-
IMPORTANT (Excluding Deleted Objects): By default, you MUST exclude objects that have been deleted from the cloud unless the user explicitly asks for them. Use the
jqcommand as shown above to find the correct API name for the "disappearance time" field, and then use that field name in yourWHEREclause (e.g.,WHERE ... AND CA10__disappearanceTime__c = null). -
IMPORTANT (Aggregations): Do not use aggregation functions (
COUNT,SUM, etc.) orGROUP BYin the SOQL query. The converter does not support them. You will add aggregation in a later step. -
Example SOQL to get raw data for a later COUNT:
SELECT Name, CA10__isDefault__c
FROM CA10__CaAwsVpc__c
WHERE CA10__isDefault__c = true AND CA10__disappearanceTime__c = null
-
-
Convert to BigQuery SQL: Use
repo-managerto convert your SOQL query. Name the output file to indicate it is the initial, unmodified BigQuery query (e.g.,my-query.initial.bqsql).repo-manager soql convert -i tmp/task-name/my-query.soql -o tmp/task-name/my-query.initial.bqsql -
Modify BigQuery SQL for Aggregation:
- Read the generated
my-query.initial.bqsqlfile. - Modify the SQL to add the necessary aggregation functions (
COUNT,GROUP BY, etc.) to satisfy the user's request. - Save the new, final query to a separate file (e.g.,
my-query.final.bqsql). This provides a clear audit trail for the user.
- Read the generated
-
Execute the Final BigQuery Query:
- Ask the user for their preferred output format. Suggest "CSV" (for spreadsheets) or "JSON" (for programmatic use).
- Execute the final query using
bq query, adding the appropriate format flag and redirecting the output to a file in the task directory.- For CSV:
bq query --format=csv --use_legacy_sql=false < tmp/task-name/my-query.final.bqsql > tmp/task-name/results.csv - For JSON:
bq query --format=json --use_legacy_sql=false < tmp/task-name/my-query.final.bqsql > tmp/task-name/results.json
- For CSV:
- Inform the user that the results have been saved to the specified file (e.g.,
tmp/task-name/results.csv) in their chosen format.
Scenario 2: Policy-Related Data Queries
For questions about which objects are compliant or non-compliant with a specific policy.
-
Identify the Policy: From the user's request, determine the relevant policy ID (e.g.,
/ce/ca/aws/ec2/instance-detailed-monitoring). -
Generate Debug Script: Use the
repo-manager policies generate DEBUGcommand with the policy's logic file path.repo-manager policies generate DEBUG ce/ca/aws/ec2/instance-detailed-monitoring/prod.logic.yaml -
Execute the Debug Query:
- The command creates a
debug.sqlfile in a.generateddirectory. - Ask the user for their preferred output format for the query results (e.g., CSV or JSON).
- Execute the debug query using
bq query, adding the format flag and redirecting the output to a file in your task directory.- For CSV:
bq query --format=csv --use_legacy_sql=false < ce/ca/aws/ec2/instance-detailed-monitoring/.generated/debug.sql > tmp/task-name/debug-results.csv - For JSON:
bq query --format=json --use_legacy_sql=false < ce/ca/aws/ec2/instance-detailed-monitoring/.generated/debug.sql > tmp/task-name/debug-results.json
- For CSV:
- Inform the user that the results of the debug query have been saved to the specified file.
- The command creates a
9. Reference Documentation
IMPORTANT: Always consult the guides directory BEFORE implementing policies.
Depending on the task, you must read the relevant documentation in the guides directory:
Policy Development
- Policy Development Guide - Comprehensive guide to developing policies
- Repository Structure - Understanding the repository layout
- Naming Conventions - Required naming patterns for files and directories
- Logic Files - How to write policy logic implementations
- Extracts - Reusable data extraction rules
- Related Lists - Working with related objects
- Test Data - Creating and using test data for policies
Operations
- Operations Reference - Complete list of available operations
- Data Access Operations - FIELD and EXTRACT operations
- Comparison Operations - IS_EQUAL, IS_EMPTY, etc.
- Logical Operations - AND, OR, NOT operations
- Numerical Comparison - GREATER_THAN, LESS_THAN, etc.
- Collection Operations - Working with lists and sets
- JSON Operations - Parsing and querying JSON data
- Related List Operations - RELATED_LIST_HAS, RELATED_LIST_COUNT, etc.
Type System
- Type System Guide - Understanding Compliance Engine data types
- Text Type - Case-insensitive string handling
- Bytes Type - Case-sensitive string handling
- Collection Types - Lists and Sets behavior
Object Relationships
- Object Relationships - Understanding how objects are connected
- Lookup Validation - IS_EMPTY_LOOKUP and NOT_EMPTY_LOOKUP operations
Repository Management
- repo-manager CLI Reference - Complete command reference
- Documentation Generation - How to generate and maintain documentation
10. Learning Resources (in order of priority)
- Similar existing policies: The repository contains hundreds of working policies - use them as your primary reference
- Unit tests (
ce/unit-test/): Most up-to-date examples of how operations work, including edge cases - Guides (
guides/developer/): Comprehensive documentation for operations, type system, and concepts - Captured test data: Use CAPTURE_TEST_DATA to see actual data structure
When implementing a policy:
- Find 2-3 similar policies and study them completely
- Check unit tests for any complex operations you're using
- Use CAPTURE_TEST_DATA to get real test data structure
- Test iteratively and fix one issue at a time
- Log everything in the task readme for future reference
11. Environment Assumptions
The agent environment is assumed to have:
- bq CLI: Properly configured for BigQuery access
- repo-manager: Installed and authenticated with Cloudaware API
- No need to manually specify project IDs or configure authentication